Jenkins - Hacker Mentor

Summary

En este caso debemos encontrar dos banderas que están ubicadas en la maquina Jenkins. Donde realizaremos un escaneo de puertos con Nmap y sus scripts. Llegando a encontrar un servidor HTTP o web levantado en el puerto 8080. Luego, utilizamos la herramienta wfuzz para descubrir directorios o archivos ocultos en el directorio raíz del servidor web. Llegando a encontrar un formulario para ingresar a la plataforma de la aplicación Jenkins. Luego, utilizamos Burp Suite para realizar un crackeo de contraseñas online en el formulario. Llegando a encontrar unas credenciales validas. Luego, explotamos la vulnerabilidad Comand Injection que presentaba la aplicación Jenkins mediante un panel que se conseguía cuando creabas un proyecto. Llegando obtener acceso a la maquina Jenkins a partir de scripts escritos en PowerShell. Luego, se llego a conseguir las dos banderas, y se presenta varias maneras de generar persistencia mediante el servicio RDP.

Fase Reconocimiento

Para resolver este ejercicio empezaremos con la fase de Reconocimiento Activo con el fin de conocer las direcciones IP y físicas de los nodos activos de nuestra subred.

Primero utilizaremos Nmap para realizar un mapeo o escaneo de nuestro subred con el fin de poder conocer cuales hosts o nodos están activos.Donde le pasare los siguientes parametros:

  • El parametro sn con el fin de solo realizar un mapeo de la subred sin realizar escaneo de los puertos de los nodos que tenga.
  • Debido a que los firewalls que puedan tener los nodos,eliminan o descartan los mensajes ICMP de tipo eco request es mejor utilizar el parametro PP para enviar mensajes Timestamp request ICMP(tipo 13) a los nodos con el fin de recibir un mensaje Timestamp response ICMP(tipo 14) de los nodos activos de nuestra subred.
  • El parametro n para evitar que Nmap haga una resolución DNS con las direcciones ip que va encontrando. De esta manera nuestro escaneo será más rápido y preciso.

Fase Escaneo y Enumeracion

Luego pasaremos a la fase de Escaneo y Enumeración con el fin de poder escanear los puertos del nodo. Además, obtendremos los servicios que se han levantado en los puertos abiertos, las versiones de los servicios, y el sistema operativo de la máquina Kenobi.Para ello utilizaremos Nmap.Donde le pasaremos los siguientes parametros:

  • El parametro sC o script=”default” para utilizar todos los scripts de la categoría default con el fin de realizar un escaneo y detección de los puertos de manera avanzada.
  • Los parametros O y sV con el fin de conocer el sistemas operativos del nodo y las versiones de los servicios levantados.
  • El parametro n para evitar la resolución DNS, y el parametro min-rate para indicarle el número de paquetes por segundo que va utilizar Nmap para el escaneo con el fin de evitar sobrecargar la red con el tráfico generado por Nmap.
  • El parametro p- para realizar un escaneo de los 65535 puertos del nodo y el parametro open con el fin de que nos muestre información solo de los puertos abiertos.

De acuerdo a los resultados de nuestro escaneo, podemos concluir que la dirección ip de la máquina Jenkins viene a ser 192.168.216.129 ya que tiene como OS Windows. Además, observamos que se está corriendo el servicio HTTP en el puerto 8080 mediante el programa servidor Jetty, y se nos muestra un recurso robots.txt, que es utilizado por los desarolladores para prohbiir que ciertas paginas de su sitio o aplicacion web se muestran en los resultados de busqueda de los motores de busqueda.

No encontramos nada de importancia cuando accedemos al recurso a traves del navegador web.

Ahora utilizaremos la herramienta wfuzz, que viene a ser una forma automatizada de descubir CONTENT de un sitio o aplicacion web, para realizar fuerza bruta de directorios con el fin de obtener recursos escondidos en el directorio raiz del servidor web.Ademas, los parametros que le pasare a la herramienta sern:

  • El parametro hc para evitar que nos muestren los recursos que tienen como código de estado el 403 es decir que no podemos acceder al recurso ya que el servidor se niega a proporcionarnos acceso al recurso.
  • El parametro w para proporcionar el diccionario que va contener una lista de posibles nombres de recursos.
  • El parametro c para proporcionarle diferentes colores a nuestros resultados mostrados en pantalla.

Teniendo en cuenta que solo podemos acceder a los recursos cuyo código de estado es 200, ya que los código de estado 302 me indican que el recurso solicitado se encuentra en otra ubicación temporalmente, y el código de estado 404 me indica que el servidor se ha negado a otorgarles acceso al recurso.

Ahora accedere al recurso oops a traves del navegador web.

Llego a obtener una página web que viene a formar parte de la aplicacion web Jenkins, que es utilizado para compilar y probar proyectos de software de manera continua.

Ahora accedere al recurso login a traves del navegador web.

Llego a obtener una página web que presenta un formulario o login para acceder a la plataforma de Jenkins.

Fase Ganar Acceso o Explotacion

Ahora intentaremos un crackeo de contraseña online a traves de fuerza bruta,y utilizando Burp Suite.Para ello voy a utilizar el servidor proxy que viene incluido en BurpSuite con el fin de interceptar una solicitud POST HTTP que haga desde el navegador de BurpSuite, y a través del formulario hacia el servidor Jetty.

Luego debo habilitar la ventana Intercept is on para capturar la solicitud HTTP que haga. De esta manera podrá observar la solicitud HTTP.

Luego dirigimos nuestra solicitud HTTP hacia la ventana Intruder con el fin de realizar el ataque de fuerza bruta.

Debido a que desconocemos el username y el password de un usuario es que realizaremos un ataque Cluster Bomb.Ademas, seleccionamos los parametros que vienen a representar al username y password en el formulario.

Luego, nos dirigiremos a la ventana Payload para cargar dos diccionarios que utilizara el ataque para encontrar un username y password válidos, pero antes voy crear un diccionario personalizado de acuerdo a las paginas web de la aplicacion web.Para ello voy utilizar la herramienta cewl que nos brindara una lista de palabras claves o relevantes de las paginas web de la aplicacion web.

Luego, copiaremos el contenido del archivo Sitioweb1.txt al Sitioweb2.txt sin sobreescribir su contenido con el fin de tener un solo archivo.Ademas, eliminaremos los duplicados y el contenido lo almacenaremos en otro archivo.Además, al ser el objetivo una máquina Windows es sensible a las mayusculas y minusculas. Por esta razón convertiremos todas las palabras que tienen mayúscula a su similar pero con minúscula

Luego, copiaremos el contenido del archivo Sitioweb2u.txt al Sitioweb2m.txt sin sobreescribir su contenido con el fin de tener un solo archivo, y eliminamos duplicados.

Luego, el contenido de este archivo se utilizará como diccionario para realizar el ataque de fuerza bruta en Burpsuite.

Luego, ejecutamos el ataque dando clic al botón Start Attack.

Llegamos a observar que hay dos respuetas HTTP que tienen una longitud distinta a las demás. Esto significa que ambas credenciales pueden ser validas para la autenticacion en el sitio web.

Ahora intentaremos autenticarnos en el formulario de la aplicacion web Jenkins.

Llegamos a autenticarnos exitosamente.

Ahora debemos recordar que Jenkins es utilizada para compilar y probar proyectos de software. Teniendo en cuenta esto vamos a crear un proyecto y probar si podemos compilar comandos en el servidor web remoto.

Nos damos cuenta que si es posible ejecutar comandos de manera remota. Teniendo en cuenta esto vamos a descargar un archivo, que contiene un script en powershell que nos va generar una conexion reverse shell desde la maquina Jenkins hacia nuestra maquina, de la página https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1 con el comando wget.

Luego, vamos a generar un servidor web local en el puerto 80,y en nuestro directorio actual.Donde está almacenado el archivo con el archivo con el script.

Luego, vamos a introducir el siguiente comando en el panel del proyecto, que creamos anteriormente, con el fin de que descargue el archivo, que contiene el script en powershell, y lo ejecute.

Pero antes de compilar el proyecto, debemos utilizar el comando netcat en nuestra máquina para habilitar el puerto 4444 para que este escuchando las conexiones entrantes.

Luego damos click al botón Construir Ahora para compilar el proyecto.

De esta manera llegamos obtener acceso a la máquina Jenkins.

Otro script en powershell que nos genera una conexión reverse shell se encuentra en la página https://raw.githubusercontent.com/samratashok/nishang/master/Shells/Invoke-PowerShellTcp.ps1.Ademas, vamos a seguir la misma metodología,que con el script anterior,para generar la conexión reverse shell, pero va ver una diferencia en el comando que vamos a introducir en el panel del proyecto.

Luego, compilamos el proyecto y se nos genera una shell en el sistema destino.

Otra manera de ganar acceso vendría a ser a través del módulo exploit/multi/script/web_delivery de Metasploit que va generar un payload, que puede ser un script escrito en python,PHP,PSH,etc que nos generará una conexión reverse shell hacia nuestra máquina, y que va estar almacenada en un servidor web local, que el módulo generara en nuestra máquina.

Prácticamente es lo mismo que los dos métodos mencionados anteriormente pero de una manera automatizada.

Vamos a tener que configurar el payload de acuerdo al tipo de sistema operativo que tiene la víctima, su arquitectura, el shell que se generará en la víctima, el tipo de conexión que queremos generar,y el tipo de payload.

En este caso estableceremos el valor de 2 para el parametro target con el fin de que el script este escrito en powershell ya que la maquina victima se trata de un Windows.Además, establecemos la dirección ip de la máquina atacante, y si queremos podemos establecer otro número de puerto por donde la máquina atacante va estar escuchando la conexión entrante. También podemos establecer otro número de puerto por donde nuestro servidor web va estar escuchando las solicitudes.

Ahora correre el modulo.

Me genera un comando que debemos introducir en el panel del proyecto.

Luego, compilamos el proyecto.

Podemos darnos cuenta que se establece una sesión con la máquina Jenkins.

A través del comando sessions puedo observar todas las sesiones que tengo con la máquina comprometida. Luego con la bandera -i indico el identificador de la sesión para acceder a la sesión.Ademas,vemos que la shell que se generó en el sistema destino viene a ser una Meterpreter por lo que a través del comando hashdump puedo observar los contraseñas de los usuarios locales en la máquina Jenkins en forma de hash NTLM.

A través del comando shell puedo utilizar el comando shell cmd de Windows en la máquina comprometida.

Luego a través del comando dir y el parametro /s indicamos que busque archivos que comiencen con la palabra bandera en todo el disco C.

Luego con el comando type observamos el contenido de ambos archivos.

Fase Persistencia o Mantener acceso

Luego una forma de mantener acceso es decir mantener una sesion en la máquina Jenkins con el fin de tener acceso a la máquina sin la necesidad de tener que realizar un cracking de contraseñas online ni explotar la vulnerabilidad Command Injection, ya que lo más probable es que vaya ser parchado,es habilitando el servicio RDP en la máquina Jenkins. Para ello debemos saber que el protocolo RDP nos va permitir conectarnos a un ordenador remoto y acceder a su escritorio y sus aplicaciones. Además, viene a ser un protocolo cliente-servidor por lo que vamos a requerir un programa servidor RDP la máquina Jenkins. Además, sabemos que Windows tiene un programa servidor RDP por defecto que solo debemos activarlo a través de ciertos comandos de su shell cmd.

Ahora ejecutaremos el siguiente comando en el panel del proyecto, para que modifique el valor del registro, que controla si se permite o no la conexión RDP entrante. Al establecer el valor en “0”, se permite la conexión RDP entrante.

En el caso de que el firewall de Windows esté habilitado en la maquina Jenkins, debe permitir el tráfico entrante en el puerto 3389 (puerto por defecto que utiliza el protocolo RDP). Para ello, ejecutamos el siguiente comando.

Observando la salida del comando, deducimos que el firewall de Windows no está habilitado en la máquina Jenkins.

Luego, para comprobar que el puerto 3389 está abierto en la maquina Jenkings podemos realizar un escaneo del puerto con el comando netcat

Con el resultado obtenido en pantalla respaldamos lo realizado anteriormente.

Luego debemos crear un usuario, que pertenezca al grupo de Administradores, en la máquina Jenkins.Para ello ejecutamos los siguiente comandos en el panel del proyecto.

Luego a través del programa cliente RDP xfreerdp, que viene instalado por defecto en máquinas cuyo sistemas operativos está basado en Linux o Unix, voy a autenticarme con las credenciales creadas anteriormente en la máquina Jenkins.

Ademas, me proporciona una interfaz gráfica del escritorio y sus aplicaciones de la máquina Jenkins.

El inconveniente que tiene el servicio RDP es que solo nos permite tener una sesión RDP activa en una cuenta del ordenador Windows, por lo tanto si otro usuario se llegase autenticar se cerrará la sesión RDP generada anteriormente. Para evitar tener este problema debemos habilitar el servicio multi RDP en la maquina Jenkings, que nos permite tener múltiples sesiones activas al mismo tiempo, y permitirá que varios usuarios puedan autenticarse.

Para habilitar el servicio multi RDP debemos primero instalar la herramienta Mimikatz en la máquina Jenkins. Para obtener el archivo ejecutable de la herramienta clonamos el repositorio https://github.com/ParrotSec/mimikatz.

Luego generamos un servidor web local en la ruta donde están los archivos del repositorio.Ademas, generamos una sesión RDP con la cuenta Eduardo en la máquina Jenkins.

Luego, abriremos una shell cmd como administrador. Ademas, utilizaremos el comando curl para descargar el archivo ejecutable de la herramienta Mimikatz, del servidor web local en la máquina Jenkins.

Luego, me dirijo a la ruta de donde está el archivo ejecutable mimikatz.exe para ejecutar la herramienta.

Luego, digite los siguientes dos comandos:

De esta manera ya habremos habilitado el servicio multi RDP.

Como se puede ver hemos podido establecer dos sesiones simultaneas con la maquina Jenkins.

Otra manera de generar persistencia o mantener acceso, incluso si la máquina Jenkins fuese reiniciada, es a través del comando run persistence que nos proporciona el shell Meterpreter en el sistema comprometido.

Este comando nos va generar un módulo de Metasploit que nos permitirá cargar un payload en una entrada del registro de la maquina Jenkins con el fin de que nuestro payload se ejecute automáticamente cada vez que se inicia el sistema, y nos proporcionará una conexión reverse shell hacia nuestra máquina.

Ahora configuraremos el payload que debe contener el sistema operativo del objetivo,su arquitectura, la shell que generará en cada conexión,el tipo de conexión que se generará, y el tipo de payload que se utilizara.

Luego, tendremos que definir en qué sesión se va correr este módulo.Además, también podemos definir cada cuantos segundos el payload generado se va estar ejecutando a través del parámetro DELAY. Además, también podemos modificar por cual puerto nuestra máquina va estar escuchando las conexiones entrantes a través del parámetro LPORT.

Al ejecutar el módulo, podemos observar la ubicación de donde está almacenada mi payload, que se ejecuta automáticamente cada vez que se inicie el sistema.

Luego, con el comando netcat habilitamos el puerto 332 en nuestra máquina para que escuche las conexiones entrantes.

Por último, para borrar rastros deberíamos eliminar el proyecto, llamado Comandos, que creamos para evitar que el administrador del servidor pueda descubrir que hemos estado ejecutando comandos a través de él.