Técnicas de abuso de Win32 e Kernel para pentesters
# Cheatsheet Ofensivo do Win32
Técnicas de abuso do Win32 e do Kernel para pentesters e red-teamers feitas por [@UVision](https://github.com/matthieu-hackwitharts) e [@RistBS](https://twitter.com/RistBs)
**Modo desenvolvedor ativado, aberto a qualquer ajuda :)**
- [Documentação de Binários do Windows](#windows-binary-documentation)
- [Estrutura do PE](#pe-headers)
- [Cabeçalhos do PE ](#pe-headers)
- [Análise do PE ](#parsing-pe)
- [Tabela de Endereços de Exportação (EAT) ](#export-address-table-eat)
- [Resolver endereço de função ](#resolve-function-address)
- [Tabela de Endereços de Importação (IAT) ](#import-address-table-iat)
- [Análise da IAT ](#parsing-iat)
- [Tabela de Consulta de Importação (ILT) ](#import-lookup-table)
- [Habilitar privilégio SeDebug](#enable-sedebug-privilege)
- [Executar algum binário](#execute-some-binary)
- [Execução clássica de shellcode](#classic-shellcode-execution)
- [Execução de DLL ](#dll-execute)
- [Arquivo RAW para PE](#raw-file-to-pe)
- [Técnicas de injeção de código](#code-injection-techniques)
- [Injeção CreateRemoteThread](#createremotethread-injection)
- [Process Hollowing](#process-hollowing)
- [Técnica de Fila APC](#apc-queue-technique)
- [Early Bird](#early-bird)
- [Injeção Reflexiva de DLL](#reflective-dll-injection)
- [Injeção de DLL](#dll-injection)
- [Process Doppelganging](#process-doppelganging)
- [Fibras](#fibers)
- [CreateThreadPoolWait](#createthreadpoolwait)
- [Sequestro de Thread](#thread-hijacking)
- [Injeção de código MapView](#mapview-code-injection)
- [Module Stomping](#module-stomping)
- [Function Stomping](#function-stomping)
- [Técnicas de hooking](#hooking-techniques)
- [Hooking inline](#inline-hooking)
- [Hooking de IAT](#iat-hooking)
- [Técnicas de bypass de RE](#re-bypass-techniques)
- [Ofuscação de chamadas e strings](#call-and-strings-obfuscation)
- [Resolução manual de funções](#manual-function-resolve)
- [Hashing de API do Win32](#win32-api-hashing)
- [Bypass de EDR/Endpoint](#edrendpoint-bypass)
- [Syscall direto ](#direct-syscall)
- [Linguagens de alto nível ](#high-level-languages)
- [Patch de hooking inline](#patch-inline-hooking)
- [Detectar hooks](#detect-hooks)
- [Patch de ETW](#patch-etw)
- [Bypass de sandbox](#sandbox-bypass)
- [Bypass de depuração](#debugging-bypass)
- [Técnica de VirtualProtect](#virtualprotect-technique)
- [Unhook com cópia nova](#fresh-copy-unhook)
- [Hell's Gate](#hells-gate)
- [Heaven's Gate](#heavens-gate)
- [Spoofing de PPID](#ppid-spoofing)
- [Callback de instrumentação de processo](#process-instrumentation-callback)
- [Criptografia de heap](#heap-encryption)
- [Ofuscação de sleep](#sleep-obfuscation)
- [Fundamentos de programação de drivers](#driver-programming-basics)
- [Conceitos gerais](#general-concepts)
- [Tabela de Dispatch de Serviços do Sistema (SSDT)](#system-service-dispatch-table-ssdt)
- [Entrada do driver](#driver-entry)
- [Entrada Saída)](#input-output)
- [Comunicação com o driver](#communicate-with-the-driver)
- [Assinatura de driver (Microsoft)](#driver-signing)
- [Callbacks personalizados (ObRegisterCallbacks)](#custom-callbacks)
- [Programação Ofensiva de Drivers](#offensive-driver-programming)
- [Patch de callback do kernel](#patch-kernel-callback)
- [Patch de processo protegido](#patch-protected-process)
- [Usando a API Win32 para aumentar OPSEC](#using-win32-api-to-increase-opsec)
- [Persistência](#persistence)
- [Tarefas agendadas](#scheduled-tasks)
- [Spoofing de linha de comando](#command-line-spoofing)
- [Diversos](#misc-stuff)
- [Convenção de chamada x64](#x64-calling-convention)
- [Execução indireta](#indirect-execution)
- [Bypass de CFG com SetProcessValidCallTargets](#cfg-bypass-with-setprocessvalidcalltargets)
<br>
- [Técnicas de malware/sofisticadas](#malwaresophisticated-techniques)
- [Caso do Emotet: PPID Spoofing usando WMI](#emotet-ppid-spoofing)
- [Técnica de arquivos ocultos do malware Zeus](#zeus-malware-hidden-files)
- [Técnica de hooking do keyloger SpyEye](#spyeye-keyloger-hooking-technique)
- [Parada de malware mais ridícula (WannaCry)](#wannacry-killswitch)
<br>
# Documentação de Binários do Windows
## Ferramentas úteis e Sites/Livros/Cheatsheet
- 🔹 https://github.com/RistBS/Awesome-RedTeam-Cheatsheet/ (Cheatsheet muito bom)
- 🔹 https://www.ired.team/ (Cheatsheet incrível de red team com ótimas notas sobre injeção de código)
- 🔹 https://undocumented.ntinternals.net/ (Funções NT não documentadas)
- 🔹 https://docs.microsoft.com/en-us/windows/win32/api/ (Documentação oficial da Microsoft)
- 🔹 [Windows Kernel Programming - Pavel Yosifovich](https://www.amazon.fr/Windows-Kernel-Programming-Pavel-Yosifovich/dp/1977593372)
- 🔹 https://research.checkpoint.com/ (Documentos muito interessantes sobre evasão, anti-debug e muito mais)
- 🔹 https://www.vx-underground.org/ (Conteúdo incrível sobre desenvolvimento de malware e engenharia reversa)
## Estrutura do PE
### Cabeçalhos do PE
- `DOS_HEADER` : Primeiro cabeçalho do PE, contém a mensagem do MS DOS ("This programm cannot be run in DOS mode...."), o Cabeçalho MZ (bytes mágicos para identificar o PE) e algum conteúdo de stub.
- `IMAGE_NT_HEADER` : Contém a assinatura do arquivo PE, o Cabeçalho do Arquivo e o Cabeçalho Opcional
- `SECTION_TABLE` : Contém os cabeçalhos das seções
- `SECTIONS` : Não é um cabeçalho, mas é útil saber: estas são as seções do PE
> Detalhes : https://www.researchgate.net/figure/PE-structure-of-normal-executable_fig1_259647266
### Análise do PE
**Análise simples do PE para obter o endereço absoluto da IAT e da ILT:**
- **Obter endereço base** : `GetModuleHandleA(NULL);`
- **PIMAGE_DOS_HEADER** = endereço base, cabeçalho DOS
- **PIMAGE_NT_HEADER** = `BaseAddress+PIMAGE_DOS_HEADER.e_lfnanew` (RVA do NT_HEADER)
- **IMAGE_DATA_DIRECTORY** = `OptionnalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]` de PIMAGE_NT_HEADER
- **IMAGE_IMPORT_DIRECTORY** = `IMAGE_DATA_DIRECTORY.VirtualAddress` (RVA de IMAGE_IMPORT_DIRECTORY)
- **IMAGE_IMPORT_DESCRIPTOR** = `BaseAddress + IMAGE_IMPORT_DIRECTORY.VirtualAddress` (RVA de IMAGE_IMPORT_DESCRIPTOR)
- **Endereço absoluto da IAT** : IMAGE_IMPORT_DESCRIPTOR.FirstThunk (RVA da IAT) + BaseAddress
- **Endereço absoluto da ILT** : IMAGE_IMPORT_DESCRIPTOR.OriginalFirstThunk (RVA da ILT) + BaseAddress
### Tabela de Endereços de Exportação (EAT)
A EAT resolve todas as funções que são exportadas pelo PE e também resolve DLLs. Ela é definida na estrutura IMAGE_EXPORT_DIRECTORY:
``````c
typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD Name; // name of DLL
DWORD Base; // first ordinal number
DWORD NumberOfFunctions; // number of entries in EAT
DWORD NumberOfNames; // number of entries in (1) (2)
DWORD AddressOfFunctions; // RVA EAT and contains also RVA of exported functions
DWORD AddressOfNames; // Pointer array contains address of function names
DWORD AddressOfNameOrdinals; // Pointer array contains address of ordinal number of functions (index in AddressOfFunctions)
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
Observe que a EAT é definida em uma DLL, não em um PE "real" (um PE usará a EAT de uma DLL carregada para resolver ponteiros para funções que deseja usar).