
Libreria Crystal Palace per inoltrare le chiamate Nt API tramite il Threadpool. Aggiornata per i call gadgets.
Questa è una generalizzazione di https://github.com/AlmondOffSec/LibTPLoadLib per fare da proxy ad API con un numero arbitrario di argomenti (11 al massimo, ma comunque sufficiente). Fornita come libreria condivisa Crystal Palace. API resa compatibile con la LibTP di @rasta-mouse per un facile passaggio tramite file spec. Sono inclusi hook per mostrare le più recenti funzionalità di Crystal Palace.
ATTENZIONE ⚠️ : Questo progetto non è utilizzabile così com'è. Non fornisco un modulo in cui trovare un gadget call. Dovrai trovarlo da solo. Leggi il post del blog per maggiori informazioni.
Nota : A causa della possibilità di passare 11 argomenti (7 dei quali finiranno sullo stack), il gadget call deve risiedere all'interno di una funzione con uno stack frame sufficientemente ampio. Cerca un add rsp di almeno 0x68.
ATTENZIONE ⚠️ : A causa del funzionamento interno di questa tecnica, non è possibile recuperare il valore di ritorno della funzione proxyata. Fare da proxy alle NTAPI è generalmente più utilizzabile, poiché il loro valore di ritorno è "solo" il NTSTATUS. Rende comunque difficile sapere se la funzione sia effettivamente riuscita 🙃.
Trova un gadget funzionante in un modulo disponibile sul target. In src/tp_gadget.c, modifica il suo nome nella chiamata LoadLibraryA e nella funzione GetCallGadgetAddress per fargli recuperare il suo indirizzo. Se necessario, correggi lo stub assembly (valore sub rsp, registro che il gadget userà per la chiamata).
Compila il progetto: make. L'output è la libreria condivisa Crystal Palace libtp_gadget.x64.zip.
Compila il COFF di esempio (che caricherà semplicemente wininet.dll, poi allocherà ed eseguirà shellcode localmente): make -C example_print. L'output sarà un file COFF example_print.x64.o.
Crea un file spec Crystal Palace che istruisca il linker a usare i nostri hook su DFR: usa il file spec Simple PIC di Tradecraft Garden e aggiungi le seguenti righe tra mergelib "../libtcg.x64.zip" ed 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"
Collega il tutto usando Crystal Palace per creare shellcode PIC: path/to/crystalpalace/link simplepic_modified/loader.spec example_print/example_print.x64.o out.bin.
Esegui lo shellcode con qualsiasi loader.