Cyril François

Descompactando o ICEDID

Um tutorial abrangente com ferramentas de código aberto do Elastic Security Labs

14 min de leituraFerramentas
Desempacotando o ICEDID

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.

ScriptDescriçãoCompatibilidade
decrypt_file.pyDescriptografar arquivo criptografado ICEDIDWindows e outros (não testado)
gzip_variant/extract_gzip.pyExtrair cargas úteis do arquivo GZip falso do ICEDIDWindows e outros (não testado)
gzip_variant/extract_payload_from_core.pyExtrair e descriptografar cargas úteis do binário central ICEDID reconstruídoWindows e outros (não testado)
gzip_variant/load_core.pyCarregar e executar binário PE personalizado principalSomente Windows
gzip_variant/read_configuration.pyLeia o arquivo de configuração ICEDID contido no GZip falsoWindows e outros (não testado)
reconstruir_pe.pyReconstruir um PE a partir do arquivo PE personalizado ICEDIDWindows 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:

Compartilhe este artigo