
Biblioteca Crystal Palace para fazer proxy de chamadas da API Nt via Threadpool. Atualizada para call gadgets.
Esta é uma generalização do https://github.com/AlmondOffSec/LibTPLoadLib para fazer proxy de APIs com um número arbitrário (11 no máximo, na verdade, mas suficiente) de argumentos. Fornecido como uma biblioteca compartilhada do Crystal Palace. API tornada compatível com o LibTP do @rasta-mouse para fácil troca usando arquivos spec. Hooks são fornecidos para exibir os recursos mais recentes do Crystal Palace.
AVISO ⚠️ : Este projeto não é utilizável como está. Não estou fornecendo um módulo no qual encontrar um gadget call. Você terá que encontrar o seu. Leia o post do blog para mais informações.
Nota : Devido à capacidade de passar 11 argumentos (7 dos quais serão colocados na pilha), o gadget call deve residir dentro de uma função com um stack frame grande o suficiente. Procure por um add rsp de pelo menos 0x68.
AVISO ⚠️ : Devido ao funcionamento interno desta técnica, não é possível recuperar o valor de retorno da função encapsulada. Encapsular NTAPIs geralmente é mais utilizável, já que o valor de retorno é "apenas" o NTSTATUS. Isso torna difícil saber se a função realmente teve sucesso 🙃.
Encontre um gadget que funcione em um módulo disponível no alvo. Em src/tp_gadget.c, ajuste o nome na chamada LoadLibraryA e na função GetCallGadgetAddress para que ela recupere seu endereço. Ajuste o stub de assembly se necessário (valor de sub rsp, registrador que o gadget chamará).
Compile o projeto: make. A saída é a biblioteca compartilhada do Crystal Palace libtp_gadget.x64.zip.
Compile o COFF de exemplo (que apenas carregará wininet.dll e então alocará localmente e executará o shellcode): make -C example_print. A saída será um arquivo COFF example_print.x64.o.
Crie um arquivo spec do Crystal Palace instruindo o linker a usar nossos hooks no DFR: Use o arquivo spec Simple PIC do Tradecraft Garden e adicione as seguintes linhas entre mergelib "../libtcg.x64.zip" e export:
mergelib "../libtp_gadget.x64.zip"
attach "KERNEL32$LoadLibraryA" "H_LoadLibraryA"
optout "ProxyNtApi" "H_LoadLibraryA"
attach "NTDLL$NtOpenProcess" "H_NtOpenProcess"
attach "NTDLL$NtAllocateVirtualMemory" "H_NtAllocateVirtualMemory"
attach "NTDLL$NtWriteVirtualMemory" "H_NtWriteVirtualMemory"
attach "NTDLL$NtProtectVirtualMemory" "H_NtProtectVirtualMemory"
attach "NTDLL$NtFreeVirtualMemory" "H_NtFreeVirtualMemory"
attach "NTDLL$NtClose" "H_NtClose"
attach "NTDLL$NtCreateThreadEx" "H_NtCreateThreadEx"
attach "NTDLL$NtOpenThread" "H_NtOpenThread"
attach "NTDLL$NtSuspendThread" "H_NtSuspendThread"
attach "NTDLL$NtResumeThread" "H_NtResumeThread"
attach "NTDLL$NtGetContextThread" "H_NtGetContextThread"
attach "NTDLL$NtSetContextThread" "H_NtSetContextThread"
attach "NTDLL$NtWaitForSingleObject" "H_NtWaitForSingleObject"
Vincule tudo usando o Crystal Palace para gerar shellcode PIC: path/to/crystalpalace/link simplepic_modified/loader.spec example_print/example_print.x64.o out.bin.
Execute o shellcode usando qualquer loader.