
Una herramienta de análisis y clasificación de malware.
Inhale es una herramienta de análisis y clasificación de malware capaz de automatizar y escalar muchas operaciones de análisis estático.
Esta es la versión beta, destinada a pruebas, retroalimentación y desarrollo comunitario.
Inhale comenzó como una serie de pequeños scripts que usaba al recolectar y analizar una gran cantidad de malware de diversas fuentes. Existen muchos frameworks y herramientas para realizar trabajos similares, pero ninguno se ajustaba realmente a mi flujo de trabajo de encontrar, clasificar y almacenar rápidamente información sobre una gran cantidad de archivos. Algunos también requieren costosas claves API y otros servicios que cuestan dinero.
Terminé convirtiendo estos scripts en algo que la gente pueda instalar y usar rápidamente, ya sea desde un servidor de investigación, una laptop o una computadora de bajo costo como una Raspberry Pi.
Esta herramienta está diseñada para ejecutarse en Linux usando Python3, ElasticSearch, radare2, yara y binwalk. También se necesita jq para imprimir de forma ordenada la salida de la base de datos. Aquí hay algunas instrucciones básicas para instalarla.
Hay varias cosas en el archivo config.yml que aún no están configuradas; déjalas como están a menos que se indique lo contrario en esta documentación.
Instalar los requisitos
python3 -m pip install -r requirements.txt
No es obligatorio usar una base de datos para Inhale, pero si deseas configurar una, solo sigue estas instrucciones y establece la opción "enable_database" en config.yml como 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
También puedes instalarlo manualmente siguiendo esta documentación
Además, puedes configurar un stack ELK completo para visualización y análisis de datos. No es necesario para usar esta herramienta.
Es importante instalar radare2 desde el repositorio, no desde el gestor de paquetes. Las versiones del gestor de paquetes no incluyen todas las funcionalidades necesarias para 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 aparecen errores sobre objetos compartidos, prueba esto para solucionarlo.
sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf'
sudo ldconfig
Lo más recomendable es instalar binwalk desde el repositorio.
git clone https://github.com/ReFirmLabs/binwalk
cd binwalk
sudo python3 setup.py install
Hay más información sobre la instalación de funciones adicionales de binwalk aquí.
Esta es una librería que hashea secciones de archivos ELF para el análisis de familias de malware. telfhash depende de tlsh, por lo que las instrucciones para instalar ambos son las siguientes:
Configurar tlsh
git clone https://github.com/trendmicro/tlsh
cd tlsh
./make.sh
cd py_ext/
python3 ./setup.py build
sudo python3 ./setup.py install
Configurar telfhash
git clone https://github.com/trendmicro/telfhash
cd telfhash
sudo python3 setup.py install
Si deseas usar un servidor web para alojar la salida de Inhale y compartirla, establece las variables en config.yml con las rutas adecuadas y asegúrate de que los directorios existan.
web:
gen_html: False
webdir: "/var/www/html/" # El directorio web real
fqdn: "http://threat.land" # Tu sitio web
in_path: "/var/www/html/inhaled/" # La ruta a la salida de Inhale
ex_path: "/var/www/html/exhaled/" # La ruta para la salida en caché de consultas a la base de datos
Para usar la salida HTML, ejecuta Inhale de la siguiente manera:
python3 inhale.py [todos tus argumentos aquí] --html
Especifica el archivo que deseas analizar por tipo:
-f INFILE Analizar un solo archivo
-d DIRECTORY Analizar un directorio de archivos
-u URLFILE Analizar un archivo remoto (url)
-r RDIRECTORY Analizar un directorio remoto (url)
-l URLLIST Analizar una lista de URLs en un archivo de texto
Otras opciones:
-t TAGS Agregar etiquetas adicionales a la salida.
-b Desactivar firmas de binwalk
-y YARARULES Especificar reglas Yara personalizadas
-o OUTDIR Almacenar archivos analizados en un directorio de salida específico (por defecto: ./files/<date>/)
-i Solo mostrar información, no agregar archivos a la base de datos
--html Guardar la salida como HTML en el webdir.
Ejecutar inhale.py realizará todo el análisis sobre un archivo/directorio/url determinado y lo imprimirá en tu terminal.
Ver información sobre /bin/ls, pero sin agregarlo a la base de datos
python3 inhale.py -f /bin/ls -i
Agregar el directorio 'malwarez' a la base de datos
python3 inhale.py -d malwarez/
Descargar este archivo y agregarlo a la base de datos
python3 inhale.py -u https://thugcrowd.com/chal/skull
Descargar todo en este directorio remoto, etiquetarlo todo como "phishing":
python3 inhale.py -r http://someurl.com/opendir/ -t phishing
PROTIP: Usa esta búsqueda de hashtag de Twitter para encontrar directorios abiertos interesantes que posiblemente contengan malware. Úsalo bajo tu propio riesgo.
Puedes pasar tus propias reglas yara con -y. Esto es un gran trabajo en progreso y casi todo en "YaraRules" proviene de https://github.com/kevthehermit/PasteHunter/tree/master/YaraRules. Un saludo a @KevTheHermit
Usa db.sh para consultar (próximamente será un script bonito)
db.sh *algo* | jq .
El siguiente es el modelo de datos actual utilizado para la base de datos elasticsearch. No todos estos campos se usarán para cada archivo. Las etiquetas r2_* suelen reservarse para binarios de algún tipo.
Hay algunos problemas conocidos con este proyecto (principalmente relacionados con versiones de gestores de paquetes), y aquí rastrearé todo aquello que tenga una solución.
Si recibes un error como este:
elasticsearch.exceptions.RequestError: RequestError(400, 'illegal_argument_exception', 'Limit of total fields [1000] in index [inhaled] has been exceeded')
Puede que tengas una versión anterior de ElasticSearch. Puedes actualizar o aumentar el límite de campos con este comando de una línea.
curl -XPUT 'localhost:9200/inhaled/_settings' -H 'Content-Type: application/json' -d'{ "index" : { "mapping" : { "total_fields" : { "limit" : "100000" }}}}'
¡Las PR son bienvenidas! Si deseas dar retroalimentación específica, también puedes enviarme un DM a @netspooky en Twitter.
Me gustaría agradecer a todos los que me ayudaron a probar esta herramienta. También me gustaría agradecer a Plazmaz por hacer una revisión inicial del código para que fuera un poco más ordenado.
Saludos a: hermit, plazmaz, nux, x0, dustyfresh, aneilan, sshell, readme, dnz, notdan, rqu, specters, nullcookies, ThugCrowd, y todos los involucrados con ThreatLand y la Zona Safari de TC.
| Nombre | Descripción |
|---|
| filename | La ruta completa del binario |
| file_ext | La extensión del archivo |
| filesize | El tamaño del archivo |
| filetype | Tipo de archivo según el valor mágico. No es tan fiable como las firmas de binwalk. |
| md5 | El hash MD5 del archivo |
| sha1 | El hash SHA1 del archivo |
| sha256 | El hash SHA256 del archivo |
| added | La fecha en que se agregó el archivo |
| r2_arch | Arquitectura del archivo binario |
| r2_baddr | Dirección base del binario |
| r2_binsz | Tamaño del código del programa |
| r2_bits | Bits de arquitectura - 8/16/32/64, etc. |
| r2_canary | Si los canarios de pila están habilitados |
| r2_class | Clase del binario |
| r2_compiled | Fecha en que se compiló el binario |
| r2_dbg_file | Archivo de depuración del binario |
| r2_intrp | Intérprete que llama el binario si está enlazado dinámicamente |
| r2_lang | Lenguaje del código fuente |
| r2_lsyms | Si hay símbolos de depuración |
| r2_machine | Tipo de máquina, generalmente la CPU para la que es el binario |
| r2_os | SO en el que se supone que debe ejecutarse la máquina |
| r2_pic | Si hay código independiente de posición (PIC) |
| r2_relocs | Si hay reubicaciones |
| r2_rpath | Ruta de búsqueda en tiempo de ejecución - si aplica |
| r2_stripped | Si el binario está "stripped" (sin símbolos) |
| r2_subsys | Subsistema del binario |
| r2_format | Formato del binario |
| r2_iorw | Si hay llamadas ioctl presentes |
| r2_type | Tipo de binario, si es un ejecutable, objeto compartido, etc. |
| yara | Contiene una lista de coincidencias de yara |
| binwalk | Contiene una lista de firmas de binwalk y sus ubicaciones en el binario |
| tags | Cualquier etiqueta definida por el usuario pasada con la bandera -t |
| url | La URL de origen si el archivo se descargó remotamente |
| urls | Cualquier URL que se haya extraído del binario |