TrollDump
- Inietta una DLL gestita x64 in un processo x64 gestito/non gestito (il processo deve avere GUI perché ne otteniamo l'handle della finestra) usando setwindowshook
- Qui, come TROLL, iniettiamo nella finestra nascosta di taskmgr per fare un dump di lsass non rilevato (vedi la sezione Test Case sotto)
- La DLL injector e la DLL iniettata sono la stessa DLL, quindi non è necessaria alcuna DLL aggiuntiva
- Il livello di integrità del processo target deve essere uguale o inferiore a quello del processo injector
Crediti (aggiornamento/riscrittura del progetto)
Progetto originale: https://github.com/enkomio/ManagedInjector
- codice portato per iniettare in binari a 64 bit ---> il progetto originale consente l'iniezione di DLL solo in binari a 32 bit
- rimossa la logica IPC perché era eccessiva
- creato codice boilerplate per eseguire direttamente il tuo payload nella funzione RunOnRemoteProcess() invece del precedente modo contorto
- il progetto usa ancora DLLExport per far esportare funzioni a una DLL .NET
- Nota: questa non è una dipendenza del progetto, ma più una post-elaborazione. DLLExport modificherà la tua DLL .NET finale per esportare una funzione.
- Puoi fare manualmente l'esportazione della funzione se vuoi https://blog.xpnsec.com/rundll32-your-dotnet/
Compilazione
- Scarica il progetto e compila la soluzione come X64, Release
- Nessuna dipendenza esterna necessaria
Utilizzo
> Requires High Integrity depending on use case
> [System.Reflection.Assembly]::LoadFrom("C:\Users\public\TrollDump.dll")
> [TrollDump.ForFun]::Main("C:\windows\system32\taskmgr.exe")
- In questo POC facciamo un dump di lsass; puoi eseguire qualsiasi "logica di funzione esportata dalla DLL" che vuoi modificando la funzione RunOnRemoteProcess() e ricompilando.
- Come accennato in precedenza, il codice funge da boilerplate per l'iniezione della DLL; ciò che scegli di fare dopo è comodamente scrivibile in codice gestito c#.
Caso di test
- Win 2019 build 17763.737 con le ultime patch di windefender
- sia dllinject che dump di lsass
- Altri AV (senza nome)
- dllinject funziona correttamente
- ovviamente, se il dump di lsass funzioni o meno dipende dal fatto che l'AV consenta a taskmgr di eseguire il dump di lsass
- Non testato su alcun EDR -> sospetto che l'iniezione della DLL dovrebbe comunque funzionare su EDR specifici
OPSEC
- La DLL deve essere su disco, quindi dovrebbe essere offuscata
- La DLL dovrebbe essere usata solo per fare l'iniezione; il payload effettivo non dovrebbe mai essere incorporato nella DLL e dovrebbe essere caricato in modalità riflessa
- Ovviamente, iniettare il CLR in un processo non gestito è sospetto, ma ehi!
- setwindowshook, sebbene sia una tecnica classica, è più spesso associato al keylogging, non al nostro caso d'uso
- Puoi essere super creativo con qualsiasi processo GUI in cui vuoi iniettare (se esegui come system, puoi iniettare anche in dwm.exe)
Lista dei desideri - Il progetto è stato realizzato durante il fine settimana e non ho tempo/intenzione di portare avanti quanto segue:
- Iniettare in un processo senza GUI
- attualmente per setwindowshook usa WH_CALLWNDPROC; puoi modificarlo per usare WH_GETMESSAGE, ma il processo target deve eseguire un message loop (GetMessage())
- se riesci a trovare un binario senza GUI che implementi un message loop (sospetto sia improbabile), allora puoi iniettare anche in binari senza GUI
- è comune per i processi GUI eseguire GetMessage()
- Totalmente riflesso e senza bisogno di essere rilasciato su disco
- In base a setwindowshook, sembra che la DLL debba essere su disco?
- ho provato a usare i delegati c# per passare un puntatore a funzione da eseguire invece della funzione DLL esportata e non ha funzionato (questa è la classica tecnica del keylogger in c# per processi locali, ma stiamo facendo un processo remoto)
- puoi provare integrando altre tecniche, penso sia fattibile
- Taskmgr verrà avviato automaticamente con integrità High anche se il nostro processo corrente è Medium (quindi tecnicamente, se iniettiamo una DLL al suo interno, è un bypass UAC)
- L'iniezione sembra funzionare correttamente secondo i risultati restituiti dalle API WIN
- Tuttavia, taskmgr non riesce a chiamare la funzione esportata
Dichiarazione di non responsabilità
Dovrebbe essere usato solo per scopi educativi!