
研究ノート & .NETのDLRを武器化するためのPoCコードを含むツールボックス
研究ノートと.NETのDLRを武器化するための概念実証コードを含むツールボックス
| スクリプト | 説明 |
|---|---|
Kukulkan | SILENTTRINITYのスリム化バージョン。IPYエンジンを埋め込んだC# DLLおよびEXE。通信は暗号化されており、CobaltStrikeで使用可能。 |
Invoke-JumpScare.ps1 | 埋め込まれたBoolangコンパイラを使用してシェルコードを実行します。ディスクには何も書き込まれず(少なくとも私が見た限り)、csc.exeへの呼び出しも行われません :) |
Invoke-IronPython.ps1 | 埋め込まれたIPYエンジンを使用してIronPythonコードを実行します。Invoke-JumpScareと同じコンセプトですが、IronPythonを使用します。 |
Invoke-ClearScript.ps1 | 埋め込まれたClearScriptエンジンを使用してJScript(またはVBScript)を実行します。 |
SharpSnek.cs | IronPythonエンジンを埋め込み、埋め込まれたIPYコードを実行するC#コード。AppDomain.CurrentDomain.AssemblyResolveをフックして、実行時に必要なアセンブリを解決します。 |
runBoo.cs | Invoke-JumpScareのC#バージョン。埋め込まれたBoolangコンパイラを使用してシェルコードを実行します。 |
runBooAssemblyResolve.cs | Boolangコンパイラを埋め込み、埋め込まれたBoolangコードを実行するC#コード。AppDomain.CurrentDomain.AssemblyResolveをフックして、実行時に必要なアセンブリを解決します。 |
minidump.boo | MiniDumpWriteDumpを使用してメモリをダンプするネイティブBoolangスクリプト |
shellcode.boo | シェルコードを実行するネイティブBoolangスクリプト。現在、3つの異なる手法(QueueUserAPC、CreateThread/WaitForSingleObject、WriteProcessMemory/CreateRemoteThread)を含んでいます。 |
Invoke-SSharp.ps1 | PowerShell内の埋め込みコンパイラからSSharpを実行します。コンパイルはcsc.exeを呼び出しません。 |
Invoke-Boolang.ps1 | 埋め込みコンパイラからBooコードを実行します。また、BoolangコンパイラがPowerShell内に埋め込まれたときに発見したいくつかのバグの回避策を提供します。 |
Invoke-NeoLua.ps1 | PowerShell内の埋め込みコンパイラからLuaコードを実行します。 |
.NET DLRは本当に驚異的で、他の.NET言語(PowerShellやC#など)の中にコンパイラ/エンジンを埋め込むような、狂ったようなことを可能にします。しかも、Opsec上安全でメモリ内に留まったままです。 IronPythonの場合、私が「エンジン・インセプション」と呼ぶものさえ可能です。あるIPYエンジンの中に別のIPYエンジン、さらにその中に別のIPYエンジンを埋め込みたいですか?(ねぇ、君はIPYエンジンが好きだって聞いたよ...)
攻撃的な観点から見ると、これは非常に高い柔軟性と多くの利点を持っています。いくつか挙げると:
特別な設定なしで.NET APIにアクセスでき、PowerShellをまったく経由しません。基本的に、DLRを使用すると、PowerShellを使わずに、PowerShellのすべての力を、通常はよりスクリプトが書きやすい言語(例:Python)で利用できます。
常に大量のリフレクション/埋め込みが行われており、それはより高い回避性を意味します。
DLRを使用すると、常にAMSIをバイパスできます(ペイロードを適切に計装すれば)。難読化やパッチ適用などは必要ありません。
あなたの「悪いこと」はすべて、埋め込まれたエンジン/コンパイラの言語でコーディングできます。これをPowerShellを使って行う場合、すべての魔法はDLRで行われるため、ScriptBlock Loggingは何も見ません。
通常、すべてのDLR言語には、言語自体を介するか、動的にC#をコンパイルする(例:PowerShellのAdd-Type)ことでネイティブメソッドを呼び出す方法があります。前者の方法を取ると、csc.exeへの呼び出しは行われず、通常はディスクに何も書き込まれません。なぜなら、言語はILコードを通じて必要なものをすべてメモリ内で生成するからです。これにより、「好きなだけ低くも高くも」 (@Op_nomad) 行くことができ、我々が好むすべての良いこと(シェルコードの注入、アンマネージDLLの読み込み、PEのロードなど)が可能になります。
ペイロードの迅速な再ツール化と武器化が可能です。手動でのコンパイルは不要です。
これに興味があるなら、DLRを武器化しようとしている他のツールもいくつか紹介します:
警告:これを読み始めると、地獄のようなウサギの穴(実際のデーモンウサギがいる)に落ち込むことになります。