
Toolbox mit Forschungsnotizen und PoC-Code zur Waffenfähigmachung von .NETs DLR
Toolbox mit Forschungsnotizen und PoC-Code zur Waffnisierung der .NET-DLR
| Skript | Beschreibung |
|---|---|
Kukulkan | Eine abgespeckte Version von SILENTTRINITY, eine C#-DLL und -EXE, die eine IPY-Engine einbetten. Die Kommunikation ist verschlüsselt und kann mit CobaltStrike verwendet werden. |
Invoke-JumpScare.ps1 | Führt Shellcode mit einem eingebetteten Boolang-Compiler aus, nichts berührt die Festplatte (zumindest soweit ich gesehen habe) und es werden keine Aufrufe an csc.exe getätigt :) |
Invoke-IronPython.ps1 | Führt IronPython-Code mit der eingebetteten IPY-Engine aus. Gleiches Konzept wie Invoke-JumpScare, nur mit IronPython. |
Invoke-ClearScript.ps1 | Führt JScript (oder VBScript) mit der eingebetteten ClearScript-Engine aus. |
SharpSnek.cs | C#-Code, der eine IronPython-Engine einbettet und eingebetteten IPY-Code ausführt. Hängt AppDomain.CurrentDomain.AssemblyResolve ein, um benötigte Assemblies zur Laufzeit aufzulösen. |
runBoo.cs | C#-Version von Invoke-JumpScare. Führt Shellcode mit einem eingebetteten Boolang-Compiler aus. |
runBooAssemblyResolve.cs | C#-Code, der einen Boolang-Compiler einbettet und eingebetteten Boolang-Code ausführt. Hängt AppDomain.CurrentDomain.AssemblyResolve ein, um benötigte Assemblies zur Laufzeit aufzulösen. |
minidump.boo | Natives Boolang-Skript zum Speicherauszug mittels MiniDumpWriteDump. |
shellcode.boo | Natives Boolang-Skript, das Shellcode ausführt. Enthält derzeit 3 verschiedene Techniken (QueueUserAPC, CreateThread/WaitForSingleObject, WriteProcessMemory/CreateRemoteThread). |
Invoke-SSharp.ps1 | Führt SSharp mit einem eingebetteten Compiler in PowerShell aus. Die Kompilierung ruft csc.exe nicht auf. |
Invoke-Boolang.ps1 | Führt Boo-Code mit einem eingebetteten Compiler aus. Bietet auch Workarounds für einige Fehler, die ich entdeckt habe, wenn der Boolang-Compiler in PowerShell eingebettet wird. |
Die .NET-DLR ist einfach nur verrückt – sie erlaubt dir, verrückte Dinge zu tun, wie z.B. Compiler/Engines in andere .NET-Sprachen (z.B. PowerShell & C#) einzubetten, während du trotzdem opsec-sicher bleibst und im Speicher bleibst. Im Fall von IronPython kannst du sogar das haben, was ich 'engine inception' nenne: Willst du eine IPY-Engine in eine IPY-Engine in eine weitere IPY-Engine einbetten? (yo dawg, ich hörte, du magst IPY-Engines...).
Aus offensiver Sicht bietet dies eine unglaubliche Flexibilität und eine Reihe von Vorteilen, um nur einige zu nennen:
Direkter Zugriff auf die .NET-API, ohne über PowerShell zu gehen. Im Wesentlichen erlaubt dir die Nutzung des DLR, die gesamte Leistungsfähigkeit von PowerShell zu haben, nur ohne PowerShell und in einer Sprache, die (normalerweise) einfacher zu scripten ist (z.B. Python).
Ständige Reflection/Einbettung in großem Umfang, was zu mehr Verschleierung führt.
Durch die Nutzung des DLR umgehst du immer AMSI (wenn du deine Payloads richtig instrumentierst), ohne zu verschleiern, Patches anzuwenden usw.
All dein 'Böses' kann in der Sprache deiner eingebetteten Engine/Compiler codiert werden. Wenn du das mit PowerShell tust, sieht ScriptBlock Logging nichts, da die ganze Magie im DLR passiert.
Normalerweise haben alle DLR-Sprachen eine Möglichkeit, native Methoden entweder durch die Sprache selbst oder durch dynamisches Kompilieren von C# (z.B. PowerShells Add-Type) aufzurufen.
Wenn du die erstere Methode wählst, werden keine Aufrufe an csc.exe getätigt und normalerweise wird nichts auf die Festplatte geschrieben, da die Sprachen alles, was benötigt wird, im Speicher über IL-Code generieren.
Wir können so "...niedrig und hoch gehen, wie wir wollen" (@Op_nomad) und das erlaubt uns, all die guten Dinge zu tun, die wir alle lieben (Shellcode injizieren, nicht verwaltete DLLs, PEs laden usw.).
Ermöglicht schnelles Umrüsten und Waffnisieren von Payloads. Manuelle Kompilierung ist nicht erforderlich.
Wenn dich das interessiert, hier sind einige andere Tools, die ebenfalls versuchen, das DLR zu bewaffnen:
Fairer Warnung: Wenn du anfängst, diesen Kram zu lesen, wird es dich in ein höllisches Kaninchenloch schicken (mit echten Dämonenkaninchen).
Invoke-NeoLua.ps1 | Führt Lua-Code mit einem eingebetteten Compiler in PowerShell aus. |