Desmistificando técnicas de ransomware usando assemblies.Net: 5 técnicas principais
Ransomware attacks thrive on evading detection and then encrypting data on a system. In the analysis after a ransomware attack, we often read about how the attack used a combination of different types of files together with a variety of techniques.
Então, o que tudo isso realmente significa? Nesta série, detalharemos tudo usando a estrutura do software.Net para mostrar como esses recursos do ransomware são possíveis.
In my previous three-part series on Malware Payloads and Beacons, the focus was on the Metasploit Penetration Testing Framework. We used its ready-made meterpreter malware payload to show various attacker techniques. The first article examined how malicious communications start, the attacker’s infrastructure, and forensic analysis of an attack. The second article looked at categories and types of payloads together with some in-memory manipulation techniques. The final part of that series focused on evasion and mitigation techniques.
Nesta série, criaremos nossos próprios arquivos de carga útil individuais (também conhecidos como assemblies) aproveitando a estrutura do software.Net, mas com foco no ransomware. Começaremos dividindo os recursos de ransomware e malware em exemplos de técnicas individuais para entender como eles funcionam sozinhos. Em última análise, algumas dessas técnicas individuais são combinadas em uma única carga útil de ransomware malicioso, com efeitos muitas vezes devastadores.
Técnica 1: Downloaders, droppers e loaders
Começamos analisando como o ransomware ou o malware podem se conectar a uma rede infectada. Essa é a capacidade de se conectar a um sistema remoto, baixar cargas adicionais, colocá-las no sistema comprometido e executá-lo (ou seja, carregá-lo na memória).
Abaixo está um exemplo de um aplicativo de linha de comando (console) .Net que:
- Atua como um downloader baixando outro aplicativo executável remoto (putty.exe) da Internet
- Coloca o aplicativo baixado em uma pasta temporária no disco do computador
- Renomeia o aplicativo para putty_new.exe
- Executa automaticamente o aplicativo baixado no computador para que ele seja carregado na memória

Quando o teste de carga útil é usado, o que significa ter vários arquivos maliciosos fazendo coisas diferentes, o Stager (pequena carga útil inicial) pode se tornar o downloader e também, vagamente, o dropper do Stage (carga útil principal maior). Também pode ser o carregador do palco. As técnicas empregadas dependerão da avaliação do risco de detecção pelo agente da ameaça, também conhecida como considerações de segurança operacional.
Um downloader é responsável por retirar uma carga útil de uma fonte remota, como um servidor web ou servidor FTP. Isso geralmente é feito pela Internet. Portanto, um downloader exigirá que alguma conexão de rede seja tentada para acessar a fonte remota.
A dropper, on the other hand, is primarily responsible for delivering or dropping a payload onto a victim system. Therefore, a downloader can also be a dropper, but a dropper may not necessarily be a downloader because a dropper may already have the malicious payload embedded in it as portable executable (PE) files or DLLs. These file types will be discussed later. Droppers are commonly used in attacks; popular examples being the Solarwinds and Kaseya supply chain attacks. Both involved the use of compromised supplier agent software used as droppers for malicious payloads. The latter being used by the REvil ransomware group.
Um carregador é responsável por configurar o sistema da vítima para executar outra carga maliciosa, especialmente no caso de cargas úteis somente de memória. Aqui, configurar significa garantir a alocação de espaço de memória necessária, geralmente injetando uma DLL no espaço de memória de outro processo e, em seguida, configurando as permissões de memória corretas. Em seguida, o carregador inicia a carga útil ou executa os threads necessários.․
Técnica 2: EXE carregando um arquivo DLL
As cargas de ransomware podem estar na forma de um arquivo EXE ou DLL. A seguir, veremos como um arquivo executável do Windows, também conhecido como arquivo EXE, pode carregar o que é conhecido como arquivo DLL (biblioteca de vínculo dinâmico) para aproveitar o código que ele contém.

EXE e DLL são dois tipos de assemblies do.Net que contêm instruções de código de programação de computador e informações associadas (metadados). Essas instruções e metadados são reunidos em um único arquivo resultante — montagem EXE ou DLL.Net. Esses dois tipos de arquivos permitem que o código de programação do computador seja executado (EXE) em um sistema Windows ou armazenado como um arquivo de biblioteca (DLL), que pode então ser “emprestado” e lido por outros arquivos. No caso de uma DLL, esse processo é muito parecido com o modo como várias pessoas podem pegar o mesmo livro emprestado de uma biblioteca em momentos diferentes para ler seu conteúdo. Na segunda parte desta série, exploraremos esses dois conjuntos com mais detalhes em relação ao .Net. estrutura de software.
Por enquanto, aqui está um exemplo muito simples para demonstrar o uso desses dois tipos de assemblies.Net — um executável (EXE) que executa seu próprio código e depois carrega e lê o código externo de um arquivo DLL. O executável então passa alguma entrada para o código DLL carregado. Finalmente, a DLL usa a entrada recebida do EXE para exibir uma mensagem de volta para o usuário que executa o aplicativo. Abaixo está o código em ação:

Esse aplicativo simples também demonstra a relação entre os conjuntos EXE e DLL.Net. Esse tipo de relacionamento é usado legitimamente por muitos aplicativos e sistemas operacionais (bibliotecas compartilhadas), incluindo o próprio sistema operacional Windows. O Windows empacota grande parte de seu próprio código como DLLs para que ele possa ser compartilhado por diferentes aplicativos.
A imagem abaixo mostra o código de programação do EXE e da DLL no exemplo anterior. O código é escrito usando a linguagem de programação C#, que é uma das linguagens suportadas pelo .Net. Na imagem, as referências do código DLL são destacadas para dar ênfase:

As DLLs são um meio eficaz de escrever um trecho de código uma vez, de forma que possa ser usado várias vezes por diferentes executáveis como uma biblioteca compartilhada ou dinâmica. Como resultado disso, ele também é muito usado por muitas famílias de malware e ransomware. Técnicas como carregamento lateral de DLL e sequestro de DLL são técnicas maliciosas comuns que aproveitam a relação entre esses assemblies.Net. ․
Técnica 3: Reconhecer e lançar binários vivos fora da terra
Continuamos com uma combinação de técnicas importantes: a capacidade de reunir informações úteis sobre um sistema alvo (Discovery) e, ao mesmo tempo, lançar outros binários ou executáveis nesse sistema (Spawning). Na imagem aqui, nosso executável personalizado inicial lança um executável ou binário nativo no sistema Windows de destino, mostrando um ataque Living Off the Land (LoTL).

O exemplo mostra nosso aplicativo C# inicial em execução e, em seguida, coletando algumas informações úteis sobre o sistema de destino, mostradas pelo texto verde na saída. Observe as informações da unidade coletadas. Essas informações podem ser aproveitadas pelo ransomware para direcionar arquivos nessas unidades e, em seguida, serem exfiltradas antes da criptografia para uma demanda de resgate geralmente pesada.
O aplicativo continua lançando um executável externo do sistema — o prompt de comando do Windows (cmd.exe) executável. O aplicativo personalizado então passa alguns comandos do Windows para que o processo Windows cmd.exe seja exibido (mostrado em texto vermelho), neste caso, informações sobre a versão do sistema Windows. Para o benefício deste artigo, o aplicativo C# personalizado exibe a saída das ações que executa, bem como informações sobre o processo iniciado. Essa capacidade de iniciar outros aplicativos externos também é útil para iniciar processos de vítimas para, eventualmente, injetar código malicioso.
․Técnica 4: Codificação de dados
Outra técnica útil é a codificação de dados. Esse é o processo de usar um algoritmo para representar dados de uma forma diferente. Por exemplo, um tipo de codificação, base64, é usado legitimamente em algumas solicitações da Web para transmitir dados de um lado para o outro, como autorização HTTP e autenticação básica em chamadas de API. No entanto, o mesmo exemplo de codificação base64 também pode ajudar a ocultar certos textos e comandos usados por um programa malicioso ou carga útil. Ele pode ser usado para ofuscar partes do código, como URLs de retorno de chamada ou um arquivo. Essa técnica é mostrada abaixo em nosso programa C# autônomo.

Neste exemplo de aplicativo específico, o código usa algum texto que, nesse caso, é a URL “https://listener.malware.bad”, o converte em uma matriz de bytes de computador e, em seguida, executa o algoritmo de codificação base64 nos bytes para convertê-lo no texto ASCII alfanumérico de “Ahr0chm6ly9saxn0zw5lci5tywx3yxjllMjhza==” mostrado na seção de codificadores da tela do aplicativo acima. Esse processo pode ser revertido programaticamente para recuperar o texto original, conforme mostrado na seção do decodificador. Ao fazer isso, o URL fica oculto à vista de todos e não pode ser imediatamente determinado pelo que é — um URL malicioso.
․Técnica 5: Criptografia․
Finalmente, analisamos a criptografia. Criptografar arquivos em um sistema comprometido é o que tornou sinônimo de ransomware. Novamente, esse é um recurso legítimo de proteger dados em repouso que, como a maioria das outras técnicas, passou a ser usado para fins maliciosos em ransomware.
No exemplo abaixo, temos um aplicativo de criptografia C#. Primeiro, ele faz uma cópia do arquivo destinado à criptografia e depois criptografa a cópia, deixando o original intacto.

Aqui, o conteúdo original do arquivo original, Data1.txt, é copiado para outro arquivo, Data1-Encrypted.txt, e então esse novo arquivo é criptografado.

A criptografia é uma das principais técnicas usadas pelo ransomware e forma a base para manter os sistemas comprometidos como resgate. Também pode ser útil para ocultar cargas úteis ou carregadores de malware em trânsito ou em repouso para evitar a detecção.
Leia a parte 2 da série em 22 de maio
O próximo artigo explorará a estrutura de software.Net da Microsoft e a linguagem de programação C# associada como referência para algumas das táticas e técnicas mostradas aqui e como elas são finalmente facilitadas.
Learn more about how Illumio Zero Trust Segmentation can help you contain ransomware breaches.
.png)



