Preâmbulo
ICEDID é uma família de malware descobertaem 2017 por pesquisadores do IBM X-force e está associada ao roubo de credenciais de login, informações bancárias e outras informações pessoais. O ICEDID sempre foi uma família predominante, mas alcançou ainda mais crescimento desde a interrupção temporária do EMOTET no início de 2021. O ICEDID foi associado à distribuição de diversas famílias distintas de malware, incluindo DarkVNC e COBALT STRIKE. Relatórios regulares do setor, incluindo publicações de pesquisa como esta, ajudam a mitigar essa ameaça.
O ICEDID é conhecido por empacotar suas cargas usando formatos de arquivo personalizados e um esquema de criptografia personalizado. Seguindo nossa última pesquisa ICEDID que abrange a cadeia de execução da variante GZip.
Neste tutorial, apresentaremos essas ferramentas descompactando um exemplo recente do ICEDID, começando pelo download de uma cópia do binário falso do GZip:
Analisar malware pode ser perigoso para os sistemas e só deve ser tentado por profissionais experientes em um ambiente controlado, como uma máquina virtual isolada ou uma sandbox de análise. O malware pode ser projetado para evitar a detecção e infectar outros sistemas, por isso é importante tomar todas as precauções necessárias e usar ferramentas especializadas para proteger você e seus sistemas.
54d064799115f302a66220b3d0920c1158608a5ba76277666c4ac532b53e855f
Configuração do ambiente
Para este tutorial, estamos usando o Windows 10 e o Python 3.10.
O Elastic Security Labs está lançando um conjunto de ferramentas para automatizar o processo de descompactação e ajudar analistas e a comunidade a responder ao ICEDID.
Script | Descrição | Compatibilidade |
---|---|---|
decrypt_file.py | Descriptografar arquivo criptografado ICEDID | Windows e outros (não testado) |
gzip_variant/extract_gzip.py | Extrair cargas úteis do arquivo GZip falso do ICEDID | Windows e outros (não testado) |
gzip_variant/extract_payload_from_core.py | Extrair e descriptografar cargas úteis do binário central ICEDID reconstruído | Windows e outros (não testado) |
gzip_variant/load_core.py | Carregar e executar binário PE personalizado principal | Somente Windows |
gzip_variant/read_configuration.py | Leia o arquivo de configuração ICEDID contido no GZip falso | Windows e outros (não testado) |
reconstruir_pe.py | Reconstruir um PE a partir do arquivo PE personalizado ICEDID | Windows e outros (não testado) |
Para usar as ferramentas, clone o repositório de lançamento do Elastic Security Lab e instale o módulo nightMARE.
git clone https://github.com/elastic/labs-releases
cd labs-release
pip install .\nightMARE\
Todas as ferramentas neste tutorial usam o módulo nightMARE , esta biblioteca implementa diferentes algoritmos que precisamos para desempacotar as diversas cargas úteis incorporadas no ICEDID. Estamos lançando o nightMARE porque ele é necessário para esta análise do ICEDID, mas fique ligado - mais novidades virão à medida que continuamos a desenvolver e amadurecer esta estrutura.
Descompactando o GZip falso
O GZip falso ICEDID é um arquivo que se disfarça como um arquivo GZip válido, formatado encapsulando os dados reais com um cabeçalho e rodapé GZip.
Os bytes mágicos do GZip aparecem em vermelho.
O cabeçalho GZip é renderizado em verde.
O valor do nome de arquivo fictício é azul.
Após o cabeçalho GZip está a verdadeira estrutura de dados, que descrevemos abaixo.
Usaremos o script labs-releases\tools\icedid\gzip-variant\extract_gzip.py para descompactar esse GZip fraudulento.
usage: extract_gzip.py [--help] input output
positional arguments:
input Input file
output Output directory
options:
-h, --help show this help message and exit
Usaremos extract_gzip.py no exemplo ICEDID vinculado acima e armazenaremos o conteúdo em uma pasta que criamos chamada “ extract ” (você pode usar qualquer pasta de saída existente).
python extract_gzip.py 54d064799115f302a66220b3d0920c1158608a5ba76277666c4ac532b53e855f extract
============================================================
Fake Gzip
============================================================
is_dll: True
core: UponBetter/license.dat (354282 bytes)
stage_2: lake_x32.tmp (292352 bytes)
extract\configuration.bin
extract\license.dat
extract\lake_x32.tmp
Este script retorna três arquivos individuais consistindo de:
- O arquivo de configuração criptografado: configuration.bin
- O binário central criptografado: license.dat
- O carregador de persistência: lake_x32.tmp
Descriptografando os arquivos binários e de configuração do núcleo
A configuração e o binário principal que extraímos são criptografados usando o esquema de criptografia personalizado do ICEDID. Podemos descriptografá-los com o script labs-releases\tools\icedid\decrypt_file.py .
usage: decompress_file.py [--help] input output
positional arguments:
input Input file
output Output file
options:
-h, --help show this help message and exit
Conforme ilustrado aqui (observe que os arquivos descriptografados podem ser gravados em qualquer destino válido):
python .\decrypt_file.py .\extract\license.dat .\extract\license.dat.decrypted
python .\decrypt_file.py .\extract\configuration.bin .\extract\configuration.bin.decrypted
O binário principal e a configuração agora estão prontos para serem processados por ferramentas adicionais. Veja os dados da configuração descriptografada apresentados na captura de tela a seguir:
Lendo a configuração
O formato do arquivo de configuração é apresentado abaixo.
A configuração pode ser lida usando o script labs-releases\tools\icedid\gzip-variant\read_configuration.py .
usage: read_configuration.py [--help] input
positional arguments:
input Input file
options:
-h, --help show this help message and exit
Usaremos o script read_configuration.py para ler o arquivo configuration.bin.decrypted que coletamos na etapa anterior.
python .\gzip-variant\read_configuration.py .\extract\configuration.bin.decrypted
============================================================
Configuration
============================================================
botnet_id: 0x3B7D6BA4
auth_var: 0x00000038
uri: /news/
domains:
alishaskainz.com
villageskaier.com
Esta configuração contém dois domínios C2:
- alishaskainz[.]com
- villageskaier[.]com
Para este exemplo, o URI de beaconing que o ICEDID usa é “ /news/ ”.
Reconstruindo o binário principal para análise estática
O ICEDID usa um formato PE personalizado para ofuscar suas cargas úteis, derrotando assim ferramentas de análise estática ou dinâmica que esperam lidar com um executável normal do Windows. O formato de arquivo PE personalizado é descrito abaixo.
Se quisermos analisar o binário principal, por exemplo com o IDA Pro, precisamos reconstruí-lo em um PE válido. Usamos o script labs-releases\tools\icedid\rebuild_pe.py .
usage: rebuild_pe.py [--help] [-o OFFSET] input output
positional arguments:
input Input file
output Output reconstructed PE
options:
-h, --help show this help message and exit
-o OFFSET, --offset OFFSET
Offset to real data, skip possible garbage
Entretanto, ao tentar usar rebuild_pe.py no binário principal descriptografado, license.dat.decrypted , recebemos a seguinte mensagem de erro:
python .\rebuild_pe.py .\extract\license.dat.decrypted .\extract\core.bin
Traceback (most recent call last):
File "rebuild_pe.py", line 32, in <module>
main()
File "rebuild_pe.py", line 28, in main
custom_pe.CustomPE(data).to_pe().write(args.output)
File "nightmare\malware\icedid\custom_pe.py", line 86, in __init__
raise RuntimeError("Failed to parse custom pe")
RuntimeError: Failed to parse custom pe
A sutileza aqui é que os dados PE personalizados nem sempre começam no início do arquivo. Neste caso, por exemplo, se abrirmos o arquivo em um editor hexadecimal como o HxD, podemos observar uma certa quantidade de bytes de lixo antes dos dados reais.
Sabemos por nossa pesquisa que o tamanho do lixo é de 129 bytes.
Com isso em mente, podemos pular os bytes de lixo e reconstruir o binário principal usando o script rebuild_pe.py usando o parâmetro “-o 129” . Desta vez, felizmente, não recebemos nenhuma mensagem de erro. core.bin será salvo no diretório de saída, extract no nosso exemplo.
python .\rebuild_pe.py .\extract\license.dat.decrypted .\extract\core.bin -o 129
O objeto PE reconstruído não é diretamente executável, mas você pode analisá-lo estaticamente usando o desmontador de sua escolha.
Atribuímos nomes personalizados às seções binárias reconstruídas ( .mare{0,1,2,...} ).
Gostaríamos de dar crédito e agradecer ao Hasherezade pelo trabalho que nos inspirou a criar esta ferramenta.
Executando o binário principal (somente Windows)
O binário principal não pode ser executado sem um carregador personalizado que entenda o formato PE personalizado do ICEDID, bem como o protótipo da função de ponto de entrada.
A partir de nossa pesquisa, sabemos que o ponto de entrada espera uma estrutura que chamamos de estrutura de contexto, que contém os caminhos do carregador de persistência e do núcleo ICEDID com sua configuração criptografada. A estrutura do contexto é descrita abaixo.
Para executar nativamente o binário principal, usamos o script labs-releases\tools\icedid\gzip-variant\load_core.py , mas antes de usá-lo, precisamos criar o arquivo context.json que conterá todas as informações necessárias para que esse script construa essa estrutura.
Para este exemplo, copiamos as informações contidas no gzip falso e usamos o caminho para o arquivo de configuração criptografado. Incluímos um exemplo em gzip_variant/context.json.example.
Observe que os valores “field_0” e “stage_2_export” devem ser encontrados ao reverter a amostra.
Aqui usamos valores de nossa pesquisa anterior como marcadores de posição, mas não temos garantia de que a amostra funcionará 100%. Por exemplo, neste exemplo, não sabemos se a exportação ordinal nº 1 é o ponto de entrada real do carregador de persistência.
Também reproduzimos o comportamento do primeiro estágio criando o diretório UponBetter e movendo o arquivo license.dat para ele.
Executamos o script labs-releases\tools\icedid\gzip_variant\load_core.py usando o binário principal descriptografado : license.dat.decrypted , o arquivo context.json .
AVISO: O binário será carregado/executado nativamente por este script. O Elastic Security Labs não se responsabiliza por nenhum dano ao seu sistema. Execute somente em um ambiente seguro.
usage: load_core.py [--help] [-o OFFSET] core_path ctx_path
positional arguments:
core_path Core custom PE
ctx_path Path to json file defining core's context
options:
-h, --help show this help message and exit
-o OFFSET, --offset OFFSET
Offset to real data, skip possible garbage
Como temos o mesmo problema de bytes de lixo mencionado na seção anterior, usamos o parâmetro “-o 129” para pular os bytes de lixo.
python .\gzip-variant\load_core.py .\extract\license.dat.decrypted .\gzip-variant\context.example.json -o 129
============================================================
Core Loader
============================================================
Base address: 0x180000000
Entrypoint: 0x180001390
Press a key to call entrypoint...
Quando iniciado, o script aguardará a entrada do usuário antes de chamar o ponto de entrada. Podemos facilmente anexar um depurador ao processo Python e definir um ponto de interrupção no ponto de entrada do núcleo ICEDID (neste exemplo, 0x180001390 ).
Uma vez pressionada a tecla, chegamos ao ponto de entrada.
Se deixarmos o binário executar, veremos threads ICEDID sendo criados (indicados na captura de tela a seguir).
Descompactando e reconstruindo cargas úteis do binário central reconstruído
Para extrair qualquer uma das cargas úteis incorporadas no binário principal, usaremos o script labs-releases\tools\icedid\gzip-variant\extract_payloads_from_core.py
usage: extract_payloads_from_core.py [--help] input output
positional arguments:
input Input file
output Output directory
options:
-h, --help show this help message and exit
Usaremos esse script no binário principal reconstruído.
python .\gzip-variant\extract_payloads_from_core.py .\extract\core.bin core_extract
core_extract\browser_hook_payload_0.cpe
core_extract\browser_hook_payload_1.cpe
A partir daqui, geramos dois binários correspondentes às cargas úteis do ICEDID para recursos de interceptação do navegador da web; no entanto, eles ainda estão em seu formato PE personalizado.
Com base em nossa pesquisa, sabemos que browser_hook_payload_0.cpe é a versão x64 do payload do hook do navegador e browser_hook_payload_1.cpe é a versão x86.
Para reconstruí-los, usamos o script rebuild_pe.py novamente, desta vez não há bytes inúteis para pular.
python .\rebuild_pe.py .\core_extract\browser_hook_payload_0.cpe .\core_extract\browser_hook_payload_0.bin
python .\rebuild_pe.py .\core_extract\browser_hook_payload_1.cpe .\core_extract\browser_hook_payload_1.bin
Agora temos dois binários PE ( browser_hook_payload_0.bin e browser_hook_payload_1.bin ) que podemos analisar melhor.
Leitores atentos podem observar que pulamos a descompactação do servidor VNC do binário principal, uma decisão que tomamos intencionalmente. Iremos lançá-lo junto com outras ferramentas em pesquisas futuras, então fique ligado!
Conclusão
Neste tutorial, abordamos a descompactação da variante GZip do ICEDID, começando com a extração do binário GZip falso, seguido pela reconstrução do binário principal e descompactação de suas cargas úteis.
O ICEDID está em constante evolução e continuaremos monitorando as principais mudanças e atualizando nossas ferramentas junto com nossa pesquisa. Sinta-se à vontade para abrir um problema ou nos enviar uma mensagem se algo estiver quebrado ou não funcionar como esperado.
O Elastic Security Labs é uma equipe de pesquisadores e engenheiros de segurança dedicados, focados em interromper adversários por meio da publicação de lógica de detecção detalhada, proteções e pesquisa de ameaças aplicadas.
Siga-nos em @elasticseclabse visite nosso portal de pesquisa para mais recursos e pesquisas.
Referências
Os seguintes itens foram referenciados ao longo da pesquisa acima:
- https://www.elastic.co/pdf/elastic-security-labs-thawing-the-permafrost-of-icedid.pdf
- https://securityintelligence.com/new-banking-trojan-icedid-discovered-by-ibm-x-force-research/
- https://www.justice.gov/opa/pr/emotet-botnet-disrupted-international-cyber-operation
- https://malpedia.caad.fkie.fraunhofer.de/details/win.darkvnc
- https://www.cybereason.com/blog/threat-analysis-report-all-paths-lead-to-cobalt-strike-icedid-emotet-and-qbot
- https://github.com/elastic/labs-releases
- https://github.com/hasherezade/funky_malware_formats/blob/f1cacba4ee347601dceacda04e4de8c699971d29/iced_id_parser/iceid_to_pe.cpp
- https://mh-nexus.de/en/hxd/
- https://hex-rays.com/IDA-pro/