
Инструментарий, содержащий исследовательские заметки и PoC-код для weaponizing .NET DLR
Набор инструментов с исследовательскими заметками и PoC-кодом для вооружения DLR в .NET
| Script | Description |
|---|---|
Kukulkan | Урезанная версия SILENTTRINITY, C# DLL и EXE со встроенным движком IPY. Канал связи зашифрован и может использоваться с CobaltStrike |
Invoke-JumpScare.ps1 | Выполняет шеллкод с помощью встроенного компилятора Boolang: ничего не касается диска (по крайней мере, насколько я видел), и никаких вызовов csc.exe не делается :) |
Invoke-IronPython.ps1 | Выполняет код IronPython с помощью встроенного движка IPY. Та же концепция, что и Invoke-JumpScare, только с использованием IronPython. |
Invoke-ClearScript.ps1 | Выполняет JScript (или VBScript) с помощью встроенного движка ClearScript |
SharpSnek.cs | C#-код, который встраивает движок IronPython и выполняет встроенный IPY-код. Перехватывает AppDomain.CurrentDomain.AssemblyResolve для разрешения необходимых сборок во время выполнения. |
runBoo.cs | C#-версия Invoke-JumpScare. Выполняет шеллкод с помощью встроенного компилятора Boolang. |
runBooAssemblyResolve.cs | C#-код, который встраивает компилятор Boolang и выполняет встроенный код Boolang. Перехватывает AppDomain.CurrentDomain.AssemblyResolve для разрешения необходимых сборок во время выполнения. |
minidump.boo | Нативный скрипт Boolang для дампа памяти с помощью MiniDumpWriteDump |
shellcode.boo | Нативный скрипт Boolang, который выполняет шеллкод. На данный момент содержит 3 различные техники (QueueUserAPC, CreateThread/WaitForSingleObject, WriteProcessMemory/CreateRemoteThread) |
Invoke-SSharp.ps1 | Выполняет SSharp с помощью встроенного компилятора в PowerShell. Компиляция не вызывает csc.exe |
Invoke-Boolang.ps1 | Выполняет код Boo с помощью встроенного компилятора. Также содержит обходные решения для некоторых багов, которые я обнаружил при встраивании компилятора Boolang в PowerShell. |
Invoke-NeoLua.ps1 |
.NET DLR — это просто нечто: он позволяет вытворять безумные вещи, например встраивать настоящие компиляторы/движки внутрь других .NET-языков (например, PowerShell и C#), оставаясь при этом в памяти и не нарушая OPSEC. В случае с IronPython можно даже получить то, что я называю «инцепция движков»: хотите встроить движок IPY внутрь движка IPY внутри ещё одного движка IPY? (йо, чувак, я слышал, тебе нравятся IPY-движки...).
С точки зрения атакующего это даёт невероятную гибкость и ряд преимуществ, вот некоторые из них:
Готовый доступ к .NET API без какого-либо участия PowerShell. По сути, использование DLR даёт всю мощь PowerShell, только без PowerShell, и на языке, на котором (обычно) проще писать скрипты (например, Python)
Постоянно происходит безумное количество рефлексии/встраивания, а значит, больше возможностей для обхода средств защиты.
Используя DLR, вы всегда обходите AMSI (если правильно подготовите свои пейлоады), не нужно ничего обфусцировать, патчить и т.д..
Всё ваше «зло» может быть написано на языке встроенного движка/компилятора. Если делать это в PowerShell, журналирование ScriptBlock ничего не увидит, поскольку вся магия происходит в DLR.
Обычно все DLR-языки имеют возможность вызова нативных методов либо через сам язык, либо путём динамической компиляции C# (например, Add-Type в PowerShell).
Если использовать первый метод, никаких вызовов csc.exe не делается, и обычно ничего не сбрасывается на диск, поскольку языки генерируют всё необходимое в памяти через IL-код.
Мы можем идти «...так низко и так высоко, как хотим..» (@Op_nomad), и это позволяет нам делать всё то хорошее, что мы все любим (внедрять шеллкод, неуправляемые DLL, загружать PE и т.д..)
Позволяет быстро перенастраивать инструменты и превращать пейлоады в оружие. Ручная компиляция не требуется.
Если вас это заинтересовало, вот ещё несколько инструментов, которые тоже пытаются использовать DLR как оружие:
Честное предупреждение: если вы начнёте читать это, вас затянет в адскую кроличью нору (с настоящими демоническими кроликами).
| Выполняет код Lua с помощью встроенного компилятора в PowerShell. |