
Caja de herramientas que contiene notas de investigación y código PoC para armar el DLR de .NET
Toolbox que contiene notas de investigación y código PoC para weaponizar el DLR de .NET
| Script | Descripción |
|---|---|
Kukulkan | Una versión reducida de SILENTTRINITY, DLL y EXE en C# que embeben un motor IPY. Las comunicaciones están cifradas y pueden usarse con CobaltStrike |
Invoke-JumpScare.ps1 | Ejecuta shellcode usando un compilador Boolang embebido, nada toca el disco (al menos por lo que he visto) y no se hace ninguna llamada a csc.exe :) |
Invoke-IronPython.ps1 | Ejecuta código IronPython usando el motor IPY embebido. Mismo concepto que Invoke-JumpScare solo que usando IronPython. |
Invoke-ClearScript.ps1 | Ejecuta JScript (o VBScript) usando el motor ClearScript embebido |
SharpSnek.cs | Código C# que embebe un motor IronPython y ejecuta código IPY embebido. Engancha AppDomain.CurrentDomain.AssemblyResolve para resolver los ensamblados necesarios en tiempo de ejecución. |
runBoo.cs | Versión en C# de Invoke-JumpScare. Ejecuta shellcode usando un compilador Boolang embebido. |
runBooAssemblyResolve.cs | Código C# que embebe un compilador Boolang y ejecuta código Boolang embebido. Engancha AppDomain.CurrentDomain.AssemblyResolve para resolver los ensamblados necesarios en tiempo de ejecución. |
minidump.boo | Script Boolang nativo para volcar memoria usando MiniDumpWriteDump |
shellcode.boo | Script Boolang nativo que ejecuta shellcode. Actualmente contiene 3 técnicas diferentes (QueueUserAPC, CreateThread/WaitForSingleObject, WriteProcessMemory/CreateRemoteThread) |
Invoke-SSharp.ps1 | Ejecuta SSharp desde un compilador embebido dentro de PowerShell. La compilación no llama a csc.exe |
Invoke-Boolang.ps1 | Ejecuta código Boo desde un compilador embebido. También proporciona soluciones para algunos bugs que descubrí cuando el compilador Boolang se embebe dentro de PowerShell. |
Invoke-NeoLua.ps1 | Ejecuta código Lua desde un compilador embebido dentro de PowerShell. |
El DLR de .NET está simplemente loco, te permite hacer cosas increíbles como embeber malditos compiladores/motores dentro de otros lenguajes .NET (por ejemplo, PowerShell y C#) mientras sigues siendo Opsec seguro y permaneciendo en memoria. En el caso de IronPython, incluso puedes tener lo que yo llamo 'inception de motores': ¿quieres embeber un motor IPY dentro de un motor IPY dentro de otro motor IPY? (yo dawg, escuché que te gustan los motores IPY...).
Desde una perspectiva ofensiva esto tiene una cantidad increíble de flexibilidad y una serie de ventajas, por nombrar algunas:
Acceso directo a la API de .NET sin pasar por Powershell de ninguna manera. Esencialmente, usar el DLR te permite tener todo el poder de Powershell, solo que sin Powershell y en un lenguaje que (normalmente) es más fácil de scriptear (por ejemplo, Python)
Cantidades locas de reflexión/embedding ocurriendo todo el tiempo, lo que significa más evasión.
Usando el DLR siempre evitas AMSI (si instrumentas tus payloads correctamente), no hay necesidad de ofuscar, parchear cosas, etc.
Todo tu 'mal' puede ser codificado en el lenguaje de tu motor/compilador embebido. Si haces esto con PowerShell, el ScriptBlock Logging no ve nada ya que toda la magia ocurre en el DLR.
Normalmente, todos los lenguajes del DLR tienen una forma de llamar métodos nativos ya sea a través del propio lenguaje o compilando C# dinámicamente (por ejemplo, Add-Type de PowerShell).
Si vas con el primer método no se hacen llamadas a csc.exe y normalmente no se suelta nada al disco ya que los lenguajes generan todo lo necesario en memoria a través de código IL.
Podemos ir tan "...bajo y alto como queramos.." (@Op_nomad) y esto nos permite hacer todas las cosas buenas que todos amamos (inyectar shellcode, DLLs no administradas, cargar PEs, etc.)
Permite re-tooling rápido y weaponización de payloads. No es necesaria compilación manual.
Si estás interesado en esto, aquí hay algunas otras herramientas que también intentan weaponizar el DLR:
Advertencia justa, si empiezas a leer estas cosas te va a llevar por una madriguera de conejo infernal (con conejos demoníacos reales).