
Implementação RunPE com múltiplas técnicas de evasão (2)
Página inicial da Maldev Academy
[!NOTE] Embora este repositório possa ser usado para executar outros binários, o foco principal foi em executar o executável mimikatz.exe. Isso é para fins de demonstração e teste, pois o mimikatz.exe é uma ferramenta bem conhecida de pós-exploração.
Esteganografia: ocultação de payloads PE em arquivos PNG/JPG/JPEG/BMP/GIF usando a Transformada Discreta de Wavelet (DWT) com Modulação por Índice de Quantização (QIM) e Códigos de Correção de Erros (ECC). Vale ressaltar que o Algoritmo de Correção de Erros Reed-Solomon implementado pelo loader de PE é baseado no SRI-CSL/jel.
Utilizando a GPU para Evasão de Scanners de Memória: usando a biblioteca D3d11, a implementação move o payload PE injetado para a memória da GPU quando ela está ociosa, ocultando-o dos scanners de memória.
Spoofing de Pilha de Thread: Baseado em Cobalt-Strike/CallStackMasker, o código procura uma pilha de thread adequada e mascara a thread que executa o payload PE sempre que o payload está na memória da GPU.
Adulteração de Syscalls: Maldev-Academy/TrapFlagForSyscalling é usado para invocar syscalls adulteradas com base na Trap Flag.
Lida com DLLs de API Set usando ajkhoury/ApiSet.
Carrega as DLLs de payload necessárias em uma sequência aleatória para ajudar contra notificações de carregamento de imagem baseadas em sequência (se houver).
Usa AES-NI do Intel.AES-NI para criptografar as seções do payload PE antes de transferi-las para a memória da GPU e descriptografá-las após recuperá-las de lá.
Conta números primos por um período especificado como método para atrasar a execução. Essa técnica não é executada por padrão.
Remove os hooks de DLLs carregadas do diretório \knownDlls\ sem usar permissões de memória RWX. Essa técnica não é executada por padrão, pois alguns EDRs conseguiam detectar a lógica.
Se não estiver usando a técnica de adulteração de syscalls mencionada anteriormente, a implementação usará o HellsHall. Além disso, na rotina de remoção de hooks de DLL, a implementação utiliza win32u.dll para executar a instrução syscall, pois a seção de texto da ntdll.dll estará RW, o que nos impede de saltar para uma instrução syscall ali.
Sobrescreve o VEH do EDR C que é usado para lidar com exceções STATUS_GUARD_PAGE_VIOLATION, pois este fornecedor foi encontrado usando permissões para acionar exceções ao acessar DLLs falsas:
RunPeFile é o principal arquivo binário que executará o EXE fornecido a partir do(s) arquivo(s) PNG armazenado(s) em sua seção de recursos. Algumas notas ao compilar RunPeFile:
RunPeFile executará o mimikatz.exe.FileConstructor.py para atualizar o payload entregue pelo RunPeFile.O script FileConstructor.py é o script principal usado para gerar arquivos PNG contendo o payload EXE codificado via DWT. Esses PNGs são colocados no diretório EncodedPngs, de onde o projeto RunPeFile atualizado os incorpora na seção de recursos do binário compilado. Cada EXE é dividido em várias partes, e cada parte é incorporada em sua própria imagem PNG. Como resultado, você verá vários arquivos PNG que exibem todos a mesma imagem. Essa divisão é necessária porque o método de esteganografia (baseado em DWT combinado com correção de erros Reed–Solomon) normalmente não consegue encaixar um payload EXE inteiro em uma única imagem (dependendo do tamanho/pixels do PNG, bem como do tamanho do payload). Este script depende da constante NUM_SPLIT_PARTS para determinar em quantas partes o EXE de entrada será dividido.
O FileConstructor.py lida com os arquivos de projeto do Visual Studio do RunPeFile, bem como com a lógica de divisão em partes. Ele chama o script DwtStegPeFileToPng.py para fazer a incorporação real do payload.
Exemplos de chamada do FileConstructor.py:
# Adds the embedded PNG(s) to the 'RunPeFile\RunPeFile.vcxproj' project by dafault:
python.exe .\FileConstructor.py --pe mimikatz.exe --png memes\cat.png
# Adds the embedded PNG(s) to the 'XYZ\XYZ.vcxproj' project:
python.exe .\FileConstructor.py --pe mimikatz.exe --png memes\cat.png --project XYZ\XYZ.vcxproj
O script DwtStegPeFileToPng.py é o script principal que implementa o algoritmo DWT para codificar um determinado arquivo em um PNG especificado. É um script independente e pode ser usado em outros cenários, mas neste repositório ele é chamado apenas por meio do script FileConstructor.py. Abaixo está como DwtStegPeFileToPng.py pode ser chamado:
usage: DwtStegPeFileToPng.py [-h] (--encode | --decode) --png PNG --output OUTPUT [--file FILE] [-v]
DWT-based steganography tool for hiding files in PNG images
options:
-h, --help show this help message and exit
--encode Encode/embed a file
--decode Decode/extract a file
--png PNG PNG image file
--output OUTPUT Output file path
--file FILE File to embed (required for --encode)
-v, --verbose Verbose output
O projeto ExtractPePayloadFromPng é uma ferramenta independente para extrair payloads de arquivos PNG. Ela pode lidar com imagens únicas ou, quando recebe o PNG contendo a primeira parte de um arquivo PE dividido, reconstrói o payload completo a partir de todos os PNGs relacionados. Por exemplo, chamando ExtractPePayloadFromPng.exe assim:
.\ExtractPePayloadFromPng.exe --i ..\..\EncodedPngs\mimikatz_part01.png --o mimikatz.exe
Extrairá o binário completo do mimikatz.exe dos arquivos PNG localizados no diretório EncodedPngs.
[!NOTE] Alguns EDRs exigiram ajustes adicionais no código para um bypass bem-sucedido. Alguns recursos foram habilitados ou desabilitados dependendo do fornecedor de segurança encontrado.
Fazendo bypass do Pesieve versão 0.4.1.1 com o seguinte comando:
.\pe-sieve64.exe /data 4 /refl /iat 3 /obfusc 3 /shellc 4 /threads /pid XXXX
https://github.com/user-attachments/assets/47f5c3b9-e3c3-4be9-a063-2f3998071a57
PAGE_GUARD
O código é refatorado a partir de mannyfreddy no módulo Introdução à Manipulação de Vectored Handlers.
Busca manualmente payloads da seção de recursos, evitando APIs como FindResourceW e LoadResource.