DESMANTELANDO BLACKENERGY, PARTE 2 – “A MARCA”

[post-views]
Março 01, 2016 · 9 min de leitura
DESMANTELANDO BLACKENERGY, PARTE 2 – “A MARCA”

Eu não vou fazer um discurso sobre o que é uma estrutura BlackEnergy, já que muito foi escrito sobre isso e sem a minha participação, no entanto, quero me referir às informações deste revisão em particular:

O grupo de cibercriminosos por trás do BlackEnergy, a família de malwares existente desde 2007 e que ressurgiu em 2014, também estava ativo no ano de 2015. Recentemente, a ESET descobriu que o Trojan BlackEnergy foi utilizado como uma porta dos fundos para entregar um componente destrutivo KillDisk visando a destruição de arquivos nos discos rígidos em ataques contra empresas de mídia de notícias ucranianas e contra a indústria de energia elétrica…

Pessoal, conheçam o Flashplayer!

Durante a investigação do ataque à nossa infraestrutura, detectamos várias amostras de malware, entre elas Flashplayerapp.exe (https://www.virustotal.com/ru/file/c787166ad731131c811d1a63080ac871ec11f10bcd77b9a1e665f1c9bbaa9a54/analysis/)Brevemente, o flashplayerapp extrai main_light.dll em seu próprio espaço de memória e transfere o controle para ele. Esta biblioteca é uma versão leve do BlackEnergy utilizada para comunicação C&C para baixar a carga principal com funcionalidade dependendo dos objetivos perseguidos pelo atacante. Ele cria um arquivo: C:UsersuserAppdataAdobecache.datblackenerfy-shtamp_2Enquanto criptografado, este arquivo contém várias informações, incluindo a versão do build (como 2015lstb), endereço do comando e controle a partir do qual pode-se recuperar várias cargas (como hxxps://188.40.8.72/l7vogLG/BVZ99/rt170v/solocVI/eegL7p.php) etc. Enquanto eu examinava esta amostra, mudei o foco do C&C, pois uma parte específica do código chamou minha atenção, sendo um sinal óbvio do uso de uma técnica chamada permutação de código. Deixe-me traduzir uma citação desta fonte http://hacks.clan.su/publ/11-1-0-481:

… A permutação é a transformação de um código já completo. Os maiores avanços nesta técnica até hoje foram feitos por Z0MBiE. No entanto, mesmo as versões mais antigas do motor creditavam alguém chamado Lord_ASD. Os próximos avanços nesta técnica após ele foram feitos por Vecna e SBVC. Então, o que é uma permutação? O algoritmo central para motores de permutação é a desmontagem do código seguida de sua mutação e remontagem. Vamos dar uma olhada no algoritmo mais simples usado em motor de permutação:
Todas as instruções de código são desmontadas por comprimento, saltos condicionais e incondicionais são marcados.
Instruções são substituídas por sinônimos e instruções de lixo são inseridas no meio. Todos os saltos são recalculados.
Este tipo de polimorfismo é mais promissor por causa das seguintes razões:
Flexibilidade (não facilidade) da codificação do motor
Alto nível de mutações
Necessidade de emulação de todas as instruções
Embora este tipo de polimorfismo seja conhecido há um bom tempo, ele não se tornou popular devido à dificuldade de implementação…
Assim, é assim que o fragmento de código parecia (as instruções adicionadas pelo motor de permutação estão destacadas em vermelho e não afetam a funcionalidade de forma alguma, apenas tornam o código mais difícil de entender):blackenerfy-shtamp_3Ao remover as strings desnecessárias, obtemos um mecanismo que processa todos os nomes de funções em kernel32.dllblackenerfy-shtamp_4transformando-os (os nomes) em alguma forma de hash que depois os compara com algum valor:blackenerfy-shtamp_5Vamos recriar este mecanismo usando C como exemplo. Como resultado, recebemos uma utilidade que pode produzir para nós um ‘dicionário’ que contém nomes de todas as funções na biblioteca kernel32.dll e valores de hash desses nomes. Vamos tentar buscar os valores de hash que obtivemos durante a análise reversa do código em nosso novo ‘dicionário’. Primeiro, buscamos pelo valor do registrador EAX (0x5147F60F) e depois comparamos com o valor de referência:blackenerfy-shtamp_6Nossa teoria está funcionando: nossa amostra processou o nome da primeira função, criou o hash e agora está comparando-o com o valor de referência contido no buffer (0xC8AC8026). Procuramos esse valor e eis que… encontramos a função LoadLibraryA!blackenerfy-shtamp_7Para pular outro exemplo de parede de texto, mencionarei apenas que nossa ‘amostra’ usa a mesma abordagem para procurar outra função chamada GetProcAdress.blackenerfy-shtamp_8Usando essas duas funções, nossa ‘amostra’ pode carregar outras bibliotecas e extrair os endereços das funções que necessita.

Os traços deixados pelo Motor

A técnica de tornar a análise de código estática difícil via chamada de função baseada em algum valor de hash em vez de seu nome não é nova. No entanto, ela me levou ao seguinte pensamento: independentemente de como o código malicioso é processado, sabemos o algoritmo de hashing dos nomes das funções e, assim, podemos procurar com confiança por essas duas funções (LoadLibraryA e GetProcAdress) no código. Portanto, comecei a procurá-los na internet para saber se alguém já havia usado o mesmo motor do nosso exemplo antes e, para minha surpresa, encontrei algo:0xC8AC8026) para ver se alguém usou o mesmo motor do nosso exemplo antes e para minha surpresa, encontrei algo:Este hash é mencionado pela primeira vez durante 2006 (o artigo só pode ser encontrado no archive.org): https://web.archive.org/web/20060614030412/http://osix.net/modules/article/?id=789

blackenerfy-shtamp_9Mais tarde, em 2008, um possível autor do algoritmo faz uma aparição no fórum:https://exelab.ru/f/index.php?action=vthread&forum=6&topic=11845

blackenerfy-shtamp_10Depois disso, em 2009, um artigo de análise sobre shellcode MS08-067 é publicado em blogs.technet.com:  http://blogs.technet.com/b/srd/archive/2009/06/05/shellcode-analysis-via-msec-debugger-extensions.aspx

blackenerfy-shtamp_11Então, em 2013, a revista ‘XAKEP’ (uma das maiores mídias russas em TI e Segurança da Informação) publica um artigo https://xakep.ru/2011/06/23/55780/ onde mencionam exatamente o mesmo algoritmo que cria o mesmo hash (!):blackenerfy-shtamp_12Espere um segundo, a situação que temos aqui é que o mesmo algoritmo que gera os mesmos valores de hash está em uso há mais de 10 anos e ainda assim ninguém notou isso? Caso contrário, para o flashplayerapp.exe (https://www.virustotal.com/ru/file/c787166ad731131c811d1a63080ac871ec11f10bcd77b9a1e665f1c9bbaa9a54/analysis/) sendo o mesmo como aparece agora, seria impossível passar despercebido pelas soluções antivírus enquanto já vivemos no ano de 2016:blackenerfy-shtamp_13Há uma clara ‘marca’ deixada por este motor de permutação concreto que foi usado em nossa amostra analisada e que parece uma assinatura válida para mim. Além disso, é bastante fácil de rastrear diretamente no texto claro:blackenerfy-shtamp_14Bem, temos nossas suposições e a teoria está alinhada, então vamos seguir para a prática e tentar transformar nossas conclusões em uma assinatura/regra Yara:

rule API_Hash

{meta: description = “Hash of LoadLibrary that is {26 80 ac c8} e GetProcAddres {ee ea c0 1f}”

strings:

$a = {26 80 ac c8}

$b = {ee ea c0 1f}

condição: $a e $b

}

A única coisa que resta a fazer agora é testá-la em várias amostras diferentes (por exemplo, de um laboratório antivírus) para descobrir exatamente quanto código malicioso foi compactado por este motor de verdade?
Neste ponto, só posso declarar que foi possível realizar o experimento em uma quantidade muito pequena de amostras em uma das empresas de antivírus, mas os resultados valem a pena! Entre as amostras capturadas, temos:Win32/Spy.Bebloh (trojan bancário) — http://www.virusradar.com/en/Win32_Spy.Bebloh/detailWin32/PSW.Fareit (Trojan para roubar senhas) — http://www.virusradar.com/en/Win32_PSW.Fareit/detailWin32/Rustock (Backdoor) — http://www.virusradar.com/en/Win32_Rustock/detailWin32/TrojanDownloader.Carberp (Dropper que instala Trojan bancário Carberp) — http://www.virusradar.com/en/Win32_TrojanDownloader.Carberp/detailWin32/Kelihos (Remetente de spam) — http://www.virusradar.com/en/Win32_Kelihos/detailEsta lista contém apenas famílias bem conhecidas. Esses dois valores de hash também aparecem em outras famílias de malware, incluindo Ransomware/encriptores de arquivos (Win32/Filecoder.HydraCrypt), um minerador de Bitcoin (CoinMiner.LC), um WinLocker (LockScreen.AQT) e outros.

Até agora, também posso adicionar que esta regra Yara de aparência bastante simples não levou a um único falso positivo até a data, mas os testes foram conduzidos apenas em algumas dezenas de computadores. Portanto, realmente expresso minhas esperanças de que após a publicação desta pesquisa, Você (!) e aqueles que leram até aqui compartilharão seus feedbacks, que serão grandes o suficiente para provar ou desaprovar a precisão desta regra! Claro, usar apenas oito bytes para uma assinatura é excepcionalmente pequeno e a regra provavelmente captará alguns arquivos ‘legítimos’. No entanto, esta regra Yara leve pode viver em uma sandbox como parte de uma lógica de análise mais complexa.

Conclusões

O objetivo deste artigo não é a engenharia reversa do malware BlackEnergy, mas sim destacar o fato de que ferramentas usadas durante a montagem de um ou outro código de malware deixam suas marcas e podem levar ao surgimento de indicadores úteis que podem ser usados para a defesa. E esses indicadores podem permanecer despercebidos por bastante tempo…

Traduzido do original por Andrii Bezverkhyi | CEO SOC Prime

Tabela de Conteúdos

Este artigo foi útil?

Curta e compartilhe com seus colegas.
Junte-se à plataforma Detection as Code da SOC Prime para melhorar a visibilidade das ameaças mais relevantes para o seu negócio. Para ajudá-lo a começar e obter valor imediato, agende uma reunião agora com os especialistas da SOC Prime.