
Uma ferramenta de análise e classificação de malware.
Inhale é uma ferramenta de análise e classificação de malware que é capaz de automatizar e escalar muitas operações de análise estática.
Esta é a versão beta de lançamento, para fins de teste, feedback e desenvolvimento comunitário.
Inhale começou como uma série de pequenos scripts que eu usava ao coletar e analisar uma grande quantidade de malware de diversas fontes. Existem muitas estruturas e ferramentas para fazer trabalhos semelhantes, mas nenhuma delas realmente se adequava ao meu fluxo de trabalho de encontrar, classificar e armazenar rapidamente informações sobre um grande número de arquivos. Algumas também exigem caras chaves de API e outros serviços que custam dinheiro.
Acabei transformando esses scripts em algo que as pessoas possam configurar e usar rapidamente, seja executando a partir de um servidor de pesquisa, um laptop, ou um computador de baixo custo como um Raspberry Pi.
Esta ferramenta foi construída para ser executada no Linux usando Python3, ElasticSearch, radare2, yara e binwalk. jq também é necessário para imprimir a saída do banco de dados de forma organizada. Aqui estão algumas instruções básicas para instalação.
Há várias coisas no arquivo config.yml que ainda não estão configuradas, apenas deixe-as como estão, a menos que seja indicado o contrário nesta documentação.
Instalar requisitos
python3 -m pip install -r requirements.txt
Um banco de dados não é necessário para usar o Inhale, mas se você quiser configurar um, basta seguir estas instruções e definir a opção "enable_database" no 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
Você também pode instalar manualmente seguindo esta documentação
Adicionalmente, você pode configurar uma pilha ELK completa para fins de visualização e análise de dados. Não é necessário para usar esta ferramenta.
É importante instalar o radare2 a partir do repositório, e não do seu gerenciador de pacotes. As versões do gerenciador de pacotes não vêm com todos os recursos necessários para o 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 você obtiver algum erro sobre objetos compartilhados, tente isso para corrigir.
sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf'
sudo ldconfig
Provavelmente é melhor simplesmente instalar o binwalk a partir do repositório.
git clone https://github.com/ReFirmLabs/binwalk
cd binwalk
sudo python3 setup.py install
Mais informações sobre a instalação de recursos adicionais para binwalk estão localizadas aqui.
Esta é uma biblioteca que gera hashes de seções de arquivos ELF para análise de famílias de malware. telfhash depende do tlsh, então as instruções para instalar ambos são as seguintes:
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
Se você quiser usar um servidor web para hospedar a saída do inhale para compartilhar, defina as variáveis no config.yml com os caminhos apropriados e certifique-se de que os diretórios existam!
web:
gen_html: False
webdir: "/var/www/html/" # O diretório web real
fqdn: "http://threat.land" # Seu site
in_path: "/var/www/html/inhaled/" # O caminho para a saída do inhale
ex_path: "/var/www/html/exhaled/" # O caminho para a saída do cache de consultas do banco de dados
Para usar a saída html, execute inhale assim:
python3 inhale.py [todos os seus argumentos aqui] --html
Especifique o arquivo que você está extraindo por tipo:
-f INFILE Analisar um único arquivo
-d DIRECTORY Analisar um diretório de arquivos
-u URLFILE Analisar um arquivo remoto (url)
-r RDIRECTORY Analisar um diretório remoto (url)
-l URLLIST Analisar uma lista de URLs em um arquivo de texto
Outras opções:
-t TAGS Adicionar tags adicionais à saída.
-b Desativar assinaturas do binwalk
-y YARARULES Especificar regras Yara personalizadas
-o OUTDIR Armazenar arquivos extraídos em diretório de saída específico (padrão: ./files/<data>/)
-i Apenas imprimir informações, não adicionar arquivos ao banco de dados
--html Salvar saída como html no webdir.
Executar inhale.py realizará toda a análise em um determinado arquivo/diretório/url e a exibirá no seu terminal.
Ver informações em /bin/ls, mas não adicionar ao banco de dados
python3 inhale.py -f /bin/ls -i
Adicionar diretório 'malwarez' ao banco de dados
python3 inhale.py -d malwarez/
Baixar este arquivo e adicionar ao banco de dados
python3 inhale.py -u https://thugcrowd.com/chal/skull
Baixar tudo neste diretório remoto, marcar tudo como "phishing":
python3 inhale.py -r http://someurl.com/opendir/ -t phishing
DICA: Use esta busca de hashtag do Twitter para encontrar diretórios abertos interessantes que possivelmente contêm malware. Use por sua conta e risco.
Você pode passar suas próprias regras yara com -y, isso é um enorme trabalho em andamento e quase tudo em "YaraRules" é de https://github.com/kevthehermit/PasteHunter/tree/master/YaraRules. Um salve @KevTheHermit
Use db.sh para consultar (Em breve será um script bacana)
db.sh *algo* | jq .
O seguinte é o modelo de dados atual usado para o banco de dados elasticsearch. Nem todos esses campos serão usados para cada arquivo. Quaisquer tags r2_* são tipicamente reservadas para binários de algum tipo.
| Nome | Descrição |
|---|---|
| filename | O caminho completo do binário |
| file_ext | A extensão do arquivo |
| filesize | O tamanho do arquivo |
| filetype | Tipo de arquivo com base no valor mágico. Não tão confiável quanto as assinaturas do binwalk. |
| md5 | O hash MD5 do arquivo |
| sha1 | O hash SHA1 do arquivo |
| sha256 | O hash SHA256 do arquivo |
| added | A data em que o arquivo foi adicionado |
| r2_arch | Arquitetura do arquivo binário |
| r2_baddr | O endereço base do binário |
| r2_binsz | O tamanho do código do programa |
| r2_bits | Bits da arquitetura - 8/16/32/64 etc. |
| r2_canary | Se canários de pilha estão habilitados |
| r2_class | Classe do binário |
| r2_compiled | A data em que o binário foi compilado |
| r2_dbg_file | O arquivo de depuração do binário |
| r2_intrp | O interpretador que o binário chama se vinculado dinamicamente |
| r2_lang | A linguagem do código-fonte |
| r2_lsyms | Se há símbolos de depuração |
| r2_machine | O tipo de máquina, geralmente significa a CPU para a qual o binário é |
| r2_os | O sistema operacional para o qual a máquina deve ser executada |
| r2_pic | Se há Código Independente de Posição |
| r2_relocs | Se há realocações |
| r2_rpath | O caminho de pesquisa em tempo de execução - se aplicável |
| r2_stripped | Se o binário está sem símbolos (stripped) |
| r2_subsys | O subsistema do binário |
| r2_format | O formato do binário |
| r2_iorw | Se chamadas ioctl estão presentes |
| r2_type | O tipo do binário, se é um executável, objeto compartilhado etc. |
| yara | Contém uma lista de correspondências yara |
| binwalk | Contém uma lista de assinaturas binwalk e suas localizações no binário |
Existem alguns problemas conhecidos com este projeto (principalmente relacionados a versões de gerenciadores de pacotes), e aqui eu acompanharei qualquer coisa que tenha uma solução.
Se você obtiver um erro como este:
elasticsearch.exceptions.RequestError: RequestError(400, 'illegal_argument_exception', 'Limit of total fields [1000] in index [inhaled] has been exceeded')
Você pode ter uma versão antiga do elasticSearch. Você pode atualizar ou aumentar o limite de campos com este comando de uma linha.
curl -XPUT 'localhost:9200/inhaled/_settings' -H 'Content-Type: application/json' -d'{ "index" : { "mapping" : { "total_fields" : { "limit" : "100000" }}}}'
PRs são bem-vindos! Se você quiser dar feedback específico, pode também me enviar uma DM @netspooky no Twitter.
Gostaria de agradecer a todos que ajudaram a testar esta ferramenta comigo. Gostaria também de agradecer ao Plazmaz por fazer uma varredura inicial do código para deixá-lo um pouco mais organizado.
Saudações para: hermit, plazmaz, nux, x0, dustyfresh, aneilan, sshell, readme, dnz, notdan, rqu, specters, nullcookies, ThugCrowd e todos os envolvidos com ThreatLand e a TC Safari Zone.
| tags | Quaisquer tags definidas pelo usuário passadas com a flag -t. |
| url | A URL de origem se o arquivo foi baixado remotamente |
| urls | Quaisquer URLs que foram extraídas do binário |