
Un outil d'analyse et de classification de malwares.
Inhale est un outil d'analyse et de classification de malwares capable d'automatiser et de mettre à l'échelle de nombreuses opérations d'analyse statique.
Ceci est la version bêta, destinée aux tests, aux retours et au développement communautaire.
Inhale a commencé comme une série de petits scripts que j'utilisais pour collecter et analyser une grande quantité de malwares provenant de sources diverses. Il existe de nombreux frameworks et outils pour effectuer un travail similaire, mais aucun ne correspondait vraiment à mon flux de travail pour trouver rapidement, classifier et stocker des informations sur un grand nombre de fichiers. Certains nécessitent également des clés API coûteuses et d'autres services payants.
J'ai fini par transformer ces scripts en quelque chose que les gens peuvent rapidement installer et utiliser, que ce soit depuis un serveur de recherche, un ordinateur portable, ou un ordinateur bon marché comme un Raspberry Pi.
Cet outil est conçu pour fonctionner sous Linux avec Python3, ElasticSearch, radare2, yara et binwalk. jq est également nécessaire pour afficher joliment la sortie de la base de données. Voici quelques instructions de base pour l'installation.
Il y a un certain nombre de choses dans le fichier config.yml qui ne sont pas encore configurées, laissez-les tranquilles sauf indication contraire dans cette documentation.
Installer les dépendances
python3 -m pip install -r requirements.txt
Une base de données n'est pas nécessaire pour utiliser Inhale, mais si vous souhaitez en configurer une, suivez ces instructions et définissez l'option "enable_database" du fichier config.yml sur 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
Vous pouvez également installer manuellement en suivant cette documentation
Vous pouvez également mettre en place une pile ELK complète à des fins de visualisation et d'analyse de données. Ce n'est pas nécessaire pour utiliser cet outil.
Il est important d'installer radare2 depuis le dépôt, et non depuis votre gestionnaire de paquets. Les versions du gestionnaire de paquets ne comportent pas toutes les fonctionnalités nécessaires pour 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
Si vous obtenez des erreurs concernant les objets partagés, essayez ceci pour résoudre le problème.
sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf'
sudo ldconfig
Il est probablement préférable d'installer simplement binwalk depuis le dépôt.
git clone https://github.com/ReFirmLabs/binwalk
cd binwalk
sudo python3 setup.py install
Plus d'informations sur l'installation de fonctionnalités supplémentaires pour binwalk se trouvent ici.
Il s'agit d'une bibliothèque qui hache les sections des fichiers ELF pour l'analyse des familles de malwares. telfhash dépend de tlsh, donc les instructions pour installer les deux sont les suivantes :
Configuration de tlsh
git clone https://github.com/trendmicro/tlsh
cd tlsh
./make.sh
cd py_ext/
python3 ./setup.py build
sudo python3 ./setup.py install
Configuration de telfhash
git clone https://github.com/trendmicro/telfhash
cd telfhash
sudo python3 setup.py install
Si vous souhaitez utiliser un serveur web pour héberger la sortie d'inhale et la partager, définissez les variables dans config.yml avec les chemins appropriés et assurez-vous que les répertoires existent !
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
Pour utiliser la sortie HTML, exécutez inhale comme ceci :
python3 inhale.py [all your args here] --html
Spécifiez le fichier que vous analysez par type :
-f INFILE Analyser un seul fichier
-d DIRECTORY Analyser un répertoire de fichiers
-u URLFILE Analyser un fichier distant (url)
-r RDIRECTORY Analyser un répertoire distant (url)
-l URLLIST Analyser une liste d'URL dans un fichier texte
Autres options :
-t TAGS Ajouter des balises supplémentaires à la sortie.
-b Désactiver les signatures binwalk
-y YARARULES Spécifier des règles Yara personnalisées
-o OUTDIR Stocker les fichiers analysés dans un répertoire de sortie spécifique (par défaut : ./files/<date>/)
-i Afficher uniquement les informations, ne pas ajouter les fichiers à la base de données
--html Enregistrer la sortie au format HTML dans le répertoire web.
L'exécution de inhale.py effectuera toutes les analyses sur un fichier/répertoire/URL donné et les affichera dans votre terminal.
Afficher les informations sur /bin/ls, sans l'ajouter à la base de données
python3 inhale.py -f /bin/ls -i
Ajouter le répertoire 'malwarez' à la base de données
python3 inhale.py -d malwarez/
Télécharger ce fichier et l'ajouter à la base de données
python3 inhale.py -u https://thugcrowd.com/chal/skull
Télécharger tout le contenu de ce répertoire distant, et tout étiqueter comme "phishing" :
python3 inhale.py -r http://someurl.com/opendir/ -t phishing
ASTUCE : Utilisez cette recherche de hashtag Twitter pour trouver des répertoires ouverts intéressants pouvant contenir des malwares. Utilisez à vos propres risques.
Vous pouvez passer vos propres règles yara avec -y, c'est un énorme travail en cours et presque tout ce qui se trouve dans "YaraRules" provient de https://github.com/kevthehermit/PasteHunter/tree/master/YaraRules. Merci à @KevTheHermit
Utilisez db.sh pour interroger (bientôt un joli script)
db.sh *something* | jq .
Voici le modèle de données actuellement utilisé pour la base de données elasticsearch. Tous ces champs ne seront pas utilisés pour chaque fichier donné. Les balises r2_* sont généralement réservées aux binaires d'une certaine sorte.
Il y a quelques problèmes connus avec ce projet (principalement liés aux versions des gestionnaires de paquets), et je vais suivre ici tout ce qui a une solution.
Si vous obtenez une erreur comme celle-ci :
elasticsearch.exceptions.RequestError: RequestError(400, 'illegal_argument_exception', 'Limit of total fields [1000] in index [inhaled] has been exceeded')
Vous avez peut-être une version plus ancienne d'elasticSearch. Vous pouvez mettre à niveau ou augmenter la limite de champs avec cette commande one-liner.
curl -XPUT 'localhost:9200/inhaled/_settings' -H 'Content-Type: application/json' -d'{ "index" : { "mapping" : { "total_fields" : { "limit" : "100000" }}}}'
Les PRs sont les bienvenues ! Si vous souhaitez donner un retour spécifique, vous pouvez également m'envoyer un message direct @netspooky sur Twitter.
Je tiens à remercier tous ceux qui m'ont aidé à tester cet outil. Je tiens également à remercier Plazmaz pour avoir effectué un premier nettoyage du code pour le rendre un peu plus propre.
Salutations à : hermit, plazmaz, nux, x0, dustyfresh, aneilan, sshell, readme, dnz, notdan, rqu, specters, nullcookies, ThugCrowd, et tous ceux impliqués avec ThreatLand et la TC Safari Zone.
| Nom | Description |
|---|
| filename | Le chemin complet du binaire |
| file_ext | L'extension du fichier |
| filesize | La taille du fichier |
| filetype | Type de fichier basé sur la valeur magique. Pas aussi fiable que les signatures binwalk. |
| md5 | Le hash MD5 du fichier |
| sha1 | Le hash SHA1 du fichier |
| sha256 | Le hash SHA256 du fichier |
| added | La date d'ajout du fichier |
| r2_arch | Architecture du fichier binaire |
| r2_baddr | L'adresse de base du binaire |
| r2_binsz | La taille du code programme |
| r2_bits | Bits de l'architecture - 8/16/32/64 etc. |
| r2_canary | Indique si les canaris de pile sont activés |
| r2_class | Classe du binaire |
| r2_compiled | La date de compilation du binaire |
| r2_dbg_file | Le fichier de débogage du binaire |
| r2_intrp | L'interpréteur appelé par le binaire s'il est lié dynamiquement |
| r2_lang | Le langage du code source |
| r2_lsyms | Indique s'il y a des symboles de débogage |
| r2_machine | Le type de machine, généralement le CPU pour lequel le binaire est conçu |
| r2_os | Le système d'exploitation sur lequel la machine est censée fonctionner |
| r2_pic | Indique s'il y a du code à position indépendante |
| r2_relocs | Indique s'il y a des relocalisations |
| r2_rpath | Le chemin de recherche d'exécution - le cas échéant |
| r2_stripped | Indique si le binaire est dépouillé |
| r2_subsys | Le sous-système du binaire |
| r2_format | Le format binaire |
| r2_iorw | Indique si des appels ioctl sont présents |
| r2_type | Le type de binaire, qu'il s'agisse d'un exécutable, d'un objet partagé, etc. |
| yara | Contient une liste de correspondances yara |
| binwalk | Contient une liste de signatures binwalk et leurs emplacements dans le binaire |
| tags | Toutes les balises définies par l'utilisateur passées avec l'option -t. |
| url | L'URL d'origine si le fichier a été téléchargé à distance |
| urls | Toutes les URL extraites du binaire |