
Uno strumento di analisi e classificazione di malware.
Inhale è uno strumento di analisi e classificazione di malware in grado di automatizzare e scalare molte operazioni di analisi statica.
Questa è la versione beta, a scopo di test, feedback e sviluppo comunitario.
Inhale è nato come una serie di piccoli script che usavo per raccogliere e analizzare grandi quantità di malware da fonti diverse. Esistono molti framework e strumenti per fare lavori simili, ma nessuno si adattava davvero al mio flusso di lavoro per trovare rapidamente, classificare e memorizzare informazioni su un gran numero di file. Alcuni richiedono anche costose chiavi API e altri servizi a pagamento.
Ho finito per trasformare questi script in qualcosa che le persone possono rapidamente configurare e utilizzare, sia che si esegua da un server di ricerca, un laptop o un computer a basso costo come un Raspberry Pi.
Questo strumento è progettato per funzionare su Linux utilizzando Python3, ElasticSearch, radare2, yara e binwalk. jq è anche necessario per stampare in modo leggibile l'output del database. Ecco alcune istruzioni di base per l'installazione.
Ci sono molte cose nel file config.yml che non sono ancora state impostate, lasciale stare a meno che non sia diversamente indicato in questa documentazione.
Installa i requisiti
python3 -m pip install -r requirements.txt
Un database non è necessario per usare Inhale, ma se desideri impostarne uno, segui queste istruzioni e imposta l'opzione "enable_database" in config.yml su True.
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
sudo apt-get update && sudo apt-get install elasticsearch
sudo service elasticsearch start
Puoi anche installare manualmente seguendo questa documentazione
Inoltre puoi impostare un ELK stack completo per scopi di visualizzazione e analisi dei dati. Non è necessario per l'uso di questo strumento.
È importante installare radare2 dal repo, e non dal tuo gestore di pacchetti. Le versioni dei gestori di pacchetti non hanno tutte le funzionalità necessarie per inhale.
git clone https://github.com/radare/radare2
cd radare2
sys/install.sh
sudo apt-get install automake libtool make gcc
wget https://github.com/VirusTotal/yara/archive/v3.10.0.tar.gz
tar xvzf v3.10.0.tar.gz
cd yara-3.10.0/
./bootstrap.sh
./configure
make
sudo make install
Se ricevi errori riguardanti oggetti condivisi, prova questo per risolvere.
sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf'
sudo ldconfig
Probabilmente è meglio installare binwalk semplicemente dal repo.
git clone https://github.com/ReFirmLabs/binwalk
cd binwalk
sudo python3 setup.py install
Maggiori informazioni sull'installazione di funzionalità aggiuntive per binwalk si trovano qui.
Questa è una libreria che calcola l'hash di sezioni di file ELF per l'analisi delle famiglie di malware. telfhash dipende da tlsh, quindi le istruzioni per installarli entrambi sono le seguenti:
Configura tlsh
git clone https://github.com/trendmicro/tlsh
cd tlsh
./make.sh
cd py_ext/
python3 ./setup.py build
sudo python3 ./setup.py install
Configura telfhash
git clone https://github.com/trendmicro/telfhash
cd telfhash
sudo python3 setup.py install
Se vuoi usare un server web per ospitare l'output di inhale da condividere, imposta le variabili in config.yml con i percorsi appropriati e assicurati che le directory esistano!
web:
gen_html: False
webdir: "/var/www/html/" # The actual web directory
fqdn: "http://threat.land" # Your website
in_path: "/var/www/html/inhaled/" # The path to inhale output
ex_path: "/var/www/html/exhaled/" # The path for db query cache output
Per usare l'output html, esegui inhale così:
python3 inhale.py [all your args here] --html
Specifica il file da analizzare in base al tipo:
-f INFILE Analyze a single file
-d DIRECTORY Analyze a directory of files
-u URLFILE Analyze a remote file (url)
-r RDIRECTORY Analyze a remote directory (url)
-l URLLIST Analyze a list of URLs in a text file
Altre opzioni:
-t TAGS Add additional tags to the output.
-b Turn off binwalk signatures
-y YARARULES Specify custom Yara Rules
-o OUTDIR Store scraped files in specific output dir (default: ./files/<date>/)
-i Just print info, don't add files to database
--html Save output as html to the webdir.
Eseguendo inhale.py verrà eseguita tutta l'analisi su un file/directory/url dato e verrà stampata sul terminale.
Visualizza info su /bin/ls, ma non aggiungere al database
python3 inhale.py -f /bin/ls -i
Aggiungi la directory 'malwarez' al database
python3 inhale.py -d malwarez/
Scarica questo file e aggiungilo al database
python3 inhale.py -u https://thugcrowd.com/chal/skull
Scarica tutto in questa directory remota, etichetta tutto come "phishing":
python3 inhale.py -r http://someurl.com/opendir/ -t phishing
SUGGERIMENTO: Usa questa ricerca di hashtag di Twitter per trovare directory aperte interessanti che potrebbero contenere malware. Usa a tuo rischio.
Puoi passare le tue regole yara con -y, questo è un grande lavoro in corso e quasi tutto in "YaraRules" proviene da https://github.com/kevthehermit/PasteHunter/tree/master/YaraRules. Un ringraziamento a @KevTheHermit
Usa db.sh per interrogare (Presto sarà un bel script)
db.sh *something* | jq .
Il seguente è il modello dati attuale utilizzato per il database elasticsearch. Non tutti questi campi saranno utilizzati per ogni file. I tag r2_* sono tipicamente riservati a binari di qualche tipo.
Ci sono alcuni problemi noti con questo progetto (principalmente legati alle versioni dei gestori di pacchetti), e qui terrò traccia di tutto ciò che ha una soluzione.
Se ricevi un errore come questo:
elasticsearch.exceptions.RequestError: RequestError(400, 'illegal_argument_exception', 'Limit of total fields [1000] in index [inhaled] has been exceeded')
Potresti avere una versione obsoleta di elasticSearch. Puoi aggiornare, oppure aumentare il limite dei campi con questa riga.
curl -XPUT 'localhost:9200/inhaled/_settings' -H 'Content-Type: application/json' -d'{ "index" : { "mapping" : { "total_fields" : { "limit" : "100000" }}}}'
Le PR sono benvenute! Se vuoi dare un feedback specifico, puoi anche contattarmi in DM su Twitter @netspooky.
Vorrei ringraziare tutti coloro che mi hanno aiutato a testare questo strumento. Vorrei anche ringraziare Plazmaz per aver fatto una prima pulizia del codice per renderlo un po' più ordinato.
Saluti a: hermit, plazmaz, nux, x0, dustyfresh, aneilan, sshell, readme, dnz, notdan, rqu, specters, nullcookies, ThugCrowd, e tutti i coinvolti con ThreatLand e la TC Safari Zone.
| Name | Descrizione |
|---|
| filename | Il percorso completo del binario |
| file_ext | L'estensione del file |
| filesize | La dimensione del file |
| filetype | Tipo di file basato sul magic number. Non affidabile come le firme di binwalk. |
| md5 | L'hash MD5 del file |
| sha1 | L'hash SHA1 del file |
| sha256 | L'hash SHA256 del file |
| added | La data di aggiunta del file |
| r2_arch | Architettura del file binario |
| r2_baddr | Indirizzo base del binario |
| r2_binsz | Dimensione del codice del programma |
| r2_bits | Bit dell'architettura - 8/16/32/64 ecc. |
| r2_canary | Se i canary dello stack sono abilitati |
| r2_class | Classe del binario |
| r2_compiled | Data di compilazione del binario |
| r2_dbg_file | File di debug del binario |
| r2_intrp | L'interprete chiamato dal binario se collegato dinamicamente |
| r2_lang | Linguaggio del codice sorgente |
| r2_lsyms | Se ci sono simboli di debug |
| r2_machine | Tipo di macchina, di solito la CPU per cui è il binario |
| r2_os | Sistema operativo su cui la macchina dovrebbe funzionare |
| r2_pic | Se c'è codice indipendente dalla posizione (PIC) |
| r2_relocs | Se ci sono rilocazioni |
| r2_rpath | Percorso di ricerca a runtime - se applicabile |
| r2_stripped | Se il binario è stripped |
| r2_subsys | Sottosistema del binario |
| r2_format | Formato del binario |
| r2_iorw | Se sono presenti chiamate ioctl |
| r2_type | Tipo del binario, se è un eseguibile, oggetto condiviso ecc. |
| yara | Contiene una lista di corrispondenze yara |
| binwalk | Contiene una lista di firme binwalk e le loro posizioni nel binario |
| tags | Eventuali tag definiti dall'utente passati con il flag -t. |
| url | URL di origine se il file è stato scaricato da remoto |
| urls | Qualsiasi URL estratto dal binario |