[!NOTE] 元のリポジトリでは、DeceptIQの創設者である@Rad9800への帰属を省略した誤ったライセンスが使用されていました。彼のTamperingSyscallsリポジトリはMITライセンスの下で公開されています。彼の業績は、コースモジュール(Tampered Syscalls Via Hardware BreakPoints)内で既にクレジットされており、公開されているThird-Party Licenses Pageにも反映されています。
この省略に気付いた後、私たちは直ちに元のリポジトリを修正し、Radにその日のうちに連絡して過失を謝罪しました。意図しない誤りを修正するための最善の努力にもかかわらず、彼は返信せず、それ以上の連絡をブロックしました。その後、5か月後にDMCAの削除通知を受け取り、元のリポジトリは削除されました。
残念ながら、この悪意のあるエスカレーションにより、問題を解決する実際的な手段が残されていませんでした。そのため、正しいライセンスと帰属を設定した上で、リポジトリを再アップロードしました。
この実装は、Maldev Academyコースの最近のアップデートで取り上げられた2つのテクニックを利用しています。
Tampered Syscalls Via Hardware BreakPoints: ユーザーランドフックをバイパスしつつ、呼び出されたシステムコールの引数を同時に偽装するために使用されます。
Ghostly Hollowing: Process HollowingとProcess Ghostingのハイブリッドテクニック。
この実装で呼び出されるすべてのシステムコールは、TAMPER_SYSCALLマクロを通じて呼び出されます。このマクロはStoreTamperedSyscallParms関数を呼び出して、以下を行います:
NtQuerySecurityObjectシステムコールスタブ(いわゆるデコイシステムコール)内のsyscall命令のアドレスを特定し、このアドレスにハードウェアブレークポイントを設定します。TAMPER_SYSCALLマクロを呼び出すと、TAMPER_SYSCALLは呼び出されたシステムコールの最初の4つの引数をNULL値で偽装します。その後、NtQuerySecurityObjectシステムコールを呼び出し、先ほどインストールしたブレークポイントをトリガーします。
発生した例外は、デコイシステムコール(NtQuerySecurityObject)のSSNを実際に呼び出されたシステムコール(例:ZwAllocateVirtualMemoryのSSN)に置き換えることで処理します。次に、偽装された引数を実際の引数に置き換えます。これらの手順は、ExceptionHandlerCallbackRoutine VEH関数内で実行されます。
PEペイロードを取得する: この実装は、ディスクからPEペイロード(mimikatz.exe)を取得します。理想的な状況では、ペイロードを暗号化してリソースセクションに保存する必要があります。
ディスク上に空のファイルを作成する: $env:TMPディレクトリに一時ファイル(.tmp)を作成します。このファイルは後でPEペイロードで上書きされます。
一時ファイルからゴーストセクションを作成する: 削除保留中の.tmpファイルからセクションを作成するためにZwCreateSectionを呼び出し、ファイルハンドルを閉じ、ディスクからファイルを削除することで、ゴーストセクションが作成されます。
リモートプロセスを作成する: CreateProcess WinAPIを使用してリモートプロセスを作成し、ゴーストセクションをそのプロセスにマッピングします。
ImageBaseAddressをパッチする: PEB構造体のImageBaseAddress要素をパッチして、マッピングされたゴーストセクションを指すようにし、スレッドハイジャッキングを介してPEペイロードのエントリポイントを実行します。
hasherezade がGhostly Hollowingとその他の興味深いインジェクションテクニックを公開してくれたことに心から感謝します。