Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
donut — x86、x64、またはAMD64+x86の位置独立型シェルコードを生成し、.NETアセンブリ、PEファイル、およびその他のWindowsペイロードをメモリから読み込んでパラメータ付きで実行します。 | Kitploit
ツール/GitHubGitHub/thewover/donut
メモリフォレンジックペイロード生成エクスプロイトIDS/IPS回避シェルコードポストエクスプロイトペネトレーションテストレッドチーミングペイロード開発
GitHubthewover/donut

donut

x86、x64、またはAMD64+x86の位置独立型シェルコードを生成し、.NETアセンブリ、PEファイル、およびその他のWindowsペイロードをメモリから読み込んでパラメータ付きで実行します。

4.7k7531年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
リポジトリを見る

Issues Contributors Stars Forks License Chat Github All Releases Twitter URL

Alt text

現在のバージョン: v1.1

目次

  1. はじめに
  2. 動作の仕組み
  3. ビルド
  4. 使用方法
  5. サブプロジェクト
  6. Donutを使った開発
  7. 質問と議論
  8. 免責事項

1. はじめに

Donut は、VBScript、JScript、EXE、DLL ファイル、および dotNET アセンブリのメモリ内実行を可能にする、位置独立コードです。Donut によって作成されたモジュールは、HTTP サーバーからステージングするか、ローダー自体に直接埋め込むことができます。モジュールはオプションで、Chaskey ブロック暗号と128ビットのランダム生成キーを使用して暗号化されます。ファイルがメモリにロードされ実行された後、元の参照は消去され、メモリスキャナーを妨害します。ジェネレーターとローダーは以下の機能をサポートしています。

  • aPLib および LZNT1、Xpress、Xpress Huffman(RtlCompressBuffer 経由)による入力ファイルの圧縮。
  • API ハッシュと文字列生成のためのエントロピーの使用。
  • ファイルの128ビット対称暗号化。
  • ネイティブ PE ヘッダーの上書き。
  • MEM_IMAGE メモリへのネイティブ PE の格納。
  • Antimalware Scan Interface (AMSI) および Windows Lockdown Policy (WLDP) のパッチ適用。
  • Event Tracing for Windows (ETW) のパッチ適用。
  • EXE ファイルのコマンドラインのパッチ適用。
  • ホストプロセスの終了を回避するための終了関連 API のパッチ適用。
  • 複数の出力形式: C、Ruby、Python、PowerShell、Base64、C#、16進数、UUID 文字列。

Linux および Windows 向けの動的ライブラリと静的ライブラリがあり、独自のプロジェクトに統合できます。また、Python モジュールもあり、詳細は Python 拡張のビルドと使用 をご覧ください。

2. 動作の仕組み

Donut には、サポートされている各ファイルタイプ用の個別のローダーが含まれています。dotNET EXE/DLL アセンブリの場合、Donut はアンマネージ CLR ホスティング API を使用して Common Language Runtime をロードします。CLR がホストプロセスにロードされると、新しいアプリケーションドメインが作成され、使い捨ての AppDomain でアセンブリを実行できるようにします。AppDomain の準備ができると、dotNET アセンブリは AppDomain.Load_3 メソッドを介してロードされます。最後に、ユーザーが指定した EXE のエントリポイントまたは DLL のパブリックメソッドが、追加のパラメーターとともに呼び出されます。アンマネージ CLR ホスティング API のドキュメントについては、MSDN (https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/hosting/clr-hosting-interfaces) を参照してください。CLR ホストのスタンドアロンの例については、こちらのコード を参照してください。

VBScript および JScript ファイルは、IActiveScript インターフェースを使用して実行されます。Windows Script Host (wscript/cscript) が提供する一部のメソッドの最小限のサポートもあります。スタンドアロンの例については、こちらのコード を参照してください。詳細な説明については、JavaScript、VBScript、JScript、XSL のメモリ内実行 をお読みください。

アンマネージまたはネイティブの EXE/DLL ファイルは、遅延インポート、TLS、コマンドラインのパッチ適用をサポートするカスタム PE ローダーを使用して実行されます。リロケーション情報があるファイルのみがサポートされています。詳細は DLL のメモリ内実行 をお読みください。

ローダーは、AMSI と WLDP を無効にして、メモリ内で実行される悪意のあるファイルの検出を回避するのに役立ちます。詳細については、レッドチームが .NET 動的コードの AMSI と WLDP をバイパスする方法 をお読みください。また、aPLib または RtlDecompressBuffer API を使用したメモリ内ファイルの解凍もサポートしています。詳細については、データ圧縮 をお読みください。

バージョン 1.0 以降、ETW もバイパスされます。AMSI/WLDP と同様に、これはモジュール式のシステムであり、デフォルトのバイパスを独自のものに交換できます。デフォルトのバイパスは XPN の研究に基づいています。詳細については、.NET の隠蔽 - ETW をお読みください。

デフォルトでは、ローダーはアンマネージ PE の PE ヘッダー(ベースアドレスから `IMAGE_OPTIONAL_HEADER.SizeOfHeaders` まで)を上書きします。デコイモジュールが使用されない場合(モジュールオーバーロード)、PE ヘッダーはゼロ埋めされます。デコイモジュールが使用される場合、デコイモジュールの PE ヘッダーがペイロードモジュールのものを上書きするために使用されます。これは、メモリ内のモジュールの PE ヘッダーをディスク上のファイルと比較する検出を防ぐためです。ユーザーは、すべての PE ヘッダーを元の状態のまま保持するように要求できます。これは、ペイロードモジュールが埋め込み PE リソースを検索する場合など、PE ヘッダーにアクセスする必要があるシナリオで役立ちます。

ジェネレーターの詳細なチュートリアルと、Donut がトレードクラフトにどのように影響するかについては、Donut - .NET アセンブリをシェルコードとしてインジェクトする をお読みください。ローダーの詳細については、.NET アセンブリをメモリからロードする をお読みください。

内部についてさらに詳しく知りたい方は、開発者向けノート を参照してください。

3. ビルド

ビルドには2種類あります。Donut をデバッグしたい場合は、こちらのドキュメント を参照してください。そうでない場合は、リリースビルドについて以下をお読みください。

クローン

Windows コマンドプロンプトまたは Linux ターミナルから、リポジトリをクローンします。

root@kitploit:~
 
  git clone http://github.com/thewover/donut.git

次のステップは、使用するオペレーティングシステムとコンパイラによって異なります。現在、Donut のジェネレーターとローダーテンプレートは、Microsoft Visual Studio 2019 と MinGW-64 の両方で正常にコンパイルできます。独自の C/C++ プロジェクトでライブラリを使用するには、こちらにある例 を参照してください。

Windows

ローダーテンプレート、動的ライブラリ donut.dll、静的ライブラリ donut.lib、ジェネレーター donut.exe を生成するには、x64 の Microsoft Visual Studio 開発者コマンドプロンプトを起動し、Donut リポジトリをクローンしたディレクトリに移動して、以下を入力します。

root@kitploit:~
  nmake -f Makefile.msvc

Windows または Linux で MinGW-64 を使用して同様のことを行うには、Donut リポジトリをクローンしたディレクトリに移動し、以下を入力します。

root@kitploit:~
  make -f Makefile.mingw

Linux

動的ライブラリ donut.so、静的ライブラリ donut.a、ジェネレーター donut を生成するには、Donut リポジトリをクローンしたディレクトリに移動し、単に make と入力します。

Python モジュール

Donut は Python モジュールとしてインストールして使用できます。ソースからインストールするには、Python3 用の pip が必要です。まず、古いバージョンの donut-shellcode がインストールされていないことを確認するために、Linux ターミナルまたは Microsoft Visual Studio コマンドプロンプトで次のコマンドを発行します。

root@kitploit:~
  pip3 uninstall donut-shellcode

古いバージョンがインストールされていないことを確認したら、次のコマンドを発行します。

root@kitploit:~
  pip3 install .

また、PyPi リポジトリから Donut を Python モジュールとしてインストールすることもできます。

root@kitploit:~
  pip3 install donut-shellcode

詳細については、Python 拡張のビルドと使用 を参照してください。

Docker

Docker コンテナのビルド。

root@kitploit:~
  docker build -t donut .

Donut の実行。

root@kitploit:~
  docker run -it --rm -v "${PWD}:/workdir" donut -h

サポートツール

Donut には、個別にビルドできる他のいくつかの実行可能ファイルが含まれています。これには、"hash.exe"、"encrypt.exe"、"inject.exe"、"inject_local.exe" が含まれます。最初の2つはシェルコード生成で使用されます。後者の2つは、donut シェルコードのテストを支援するために提供されています。"inject.exe" は、生のバイナリファイル(loader.bin)を PID またはプロセス名でプロセスにインジェクトします。"inject_local.exe" は、生のバイナリファイルを自身のプロセスにインジェクトします。

これらのサポート実行可能ファイルを個別にビルドするには、MSVC makefile を使用できます。たとえば、"inject_local.exe" をビルドして donut シェルコードをテストするには、次のように実行します。

root@kitploit:~
  nmake inject_local -f Makefile.msvc

リリース

Donut の各リリースバージョンには、コンパイルされた実行可能ファイルを含むタグが提供されています。

  • v0.9.3, TBD
  • v0.9.2, Bear Claw
  • v0.9.1, Apple Fritter
  • v0.9.0, 初期リリース

現在、他に2つのジェネレーターが利用可能です。

  • n1xbyte による C# ジェネレーター
  • awgh による Go ジェネレーター

4. 使用方法

以下の表は、コマンドライン版のジェネレーターがサポートするスイッチを示しています。

ペイロードの要件

Donut が正常にロードするために、ペイロードが満たす必要がある特定の要件があります。

.NET アセンブリ

  • エントリポイントメソッドは、引数として文字列のみを受け取るか、引数を受け取らない必要があります。
  • エントリポイントメソッドは、public かつ static としてマークされている必要があります。
  • エントリポイントメソッドを含むクラスは、public としてマークされている必要があります。
  • アセンブリは、混合アセンブリ(マネージコードとネイティブコードの両方を含む)であってはなりません。
  • そのため、アセンブリにアンマネージエクスポートを含めてはいけません。

ネイティブ EXE/DLL

  • Cygwin でビルドされたバイナリはサポートされていません。

Cygwin の実行可能ファイルは、ホストプロセスがディスクから実行されていることを期待する初期化ルーチンを使用します。メモリから実行する場合、ホストプロセスがクラッシュする可能性があります。

アンマネージ DLL

  • ユーザー指定のエントリポイントメソッドは、引数として文字列のみを受け取るか、引数を受け取らない必要があります。例 を用意しています。

5. サブプロジェクト

donut には4つのコンパニオンプロジェクトが用意されています。

6. Donutを使った開発

より多くの種類のペイロードをサポートしたり、機能セットを変更したり、Donut を既存のツールに統合したい場合があります。開発者向けドキュメント を用意しています。追加機能は読者の課題として残されています。提案:

  • 環境キーイングの追加。
  • シェルコードが生成されるたびにローダーを難読化して、Donut をポリモーフィックにする。
  • Donut をお気に入りの RAT/C2 フレームワークのモジュールとして統合する。

7. 質問と議論

Donut に関する質問やコメントがある場合は、BloodHound Gang Slack の #Donut チャンネルに参加してください。

8. 免責事項

当方は、本ソフトウェアまたは技術の誤用について一切の責任を負いません。Donut は、CLR インジェクションとシェルコードを介したメモリ内ロードのデモンストレーションとして提供されており、レッドチームが敵対者をエミュレートし、防御側が分析と緩和策を構築するための基準を提供することを目的としています。これにより、マルウェア作成者や脅威アクターが悪用するリスクは避けられません。しかし、当方は、正味の利益がリスクを上回ると考えています。うまくいっていることを願っています。EDR や AV 製品がシグネチャや行動パターンを介して Donut を検出できる場合、当方はシグネチャや検出方法に対抗するために Donut を更新しません。気分を害されたくない場合は、お問い合わせしないでください。

ツールをダウンロード
スイッチ引数説明
-aarchローダーの対象アーキテクチャ: 1=x86, 2=amd64, 3=x86+amd64(デフォルト)
-blevelAMSI/WLDP バイパスの動作: 1=なし, 2=失敗時に中止, 3=失敗時に継続(デフォルト)
-kheadersPE ヘッダーの保持: 1=上書き(デフォルト), 2=すべて保持
-jdecoyモジュールオーバーロード用のデコイモジュールのパス(オプション)
-cclassクラス名(オプション)。(.NET DLL には必須)名前空間も含めることができます: 例 namespace.class
-dname.NET 用に作成する AppDomain 名。エントロピーが有効な場合、ランダムに生成されます。
-elevelエントロピーレベル: 1=なし, 2=ランダム名を生成, 3=ランダム名を生成 + 対称暗号化を使用(デフォルト)
-fformatファイルに保存されるローダーの出力形式: 1=バイナリ(デフォルト), 2=Base64, 3=C, 4=Ruby, 5=Python, 6=PowerShell, 7=C#, 8=16進数
-mnameDLL のメソッドまたは関数名(オプション)。(.NET DLL にはメソッドが必要)
-nnameHTTP ステージング用のモジュール名。エントロピーが有効な場合、ランダムに生成されます。
-opathDonut がローダーを保存する場所を指定します。デフォルトはカレントディレクトリの "loader.bin" です。
-pparametersDLL メソッド/関数または EXE 用の引用符で囲まれたオプションのパラメーター/コマンドライン。
-rversionCLR ランタイムバージョン。デフォルトでは MetaHeader が使用され、利用できない場合は v4.0.30319 が使用されます。
-sserverDonut モジュールをホストする HTTP サーバーの URL。次の形式で資格情報を指定できます:
root@kitploit:~
https://username:[email protected]/
-tアンマネージ/ネイティブ EXE のエントリポイントをスレッドとして実行し、スレッドが終了するのを待機します。
-wコマンドラインが UNICODE 形式でアンマネージ DLL 関数に渡されます。(デフォルトは ANSI)
-xoptionローダーの終了方法を決定します: 1=スレッドを終了(デフォルト), 2=プロセスを終了, 3=終了またはクリーンアップせずに無期限にブロック
-yaddrローダー用に新しいスレッドを作成し、ホストプロセスの実行可能ファイルからの相対オフセットであるアドレスで実行を継続します。指定された値がオフセットです。このオプションは、donut の実行が完了した後、ホストプロセスの実行を再開したいローダーをサポートします。
-zengine入力ファイルのパック/圧縮: 1=なし, 2=aPLib, 3=LZNT1, 4=Xpress, 5=Xpress Huffman。現在、後の3つは Windows でのみサポートされています。
ツール説明
DemoCreateProcessテスト用のサンプル .NET アセンブリ。それぞれが実行するプログラムを指定する2つのコマンドラインパラメーターを受け取ります。
DonutTestdonut のテストに使用するシンプルな C# シェルコードインジェクター。シェルコードは base64 エンコードされ、文字列としてコピーされる必要があります。
ModuleMonitorDonut や Cobalt Strike の execute-assembly のようなツールが行う CLR インジェクションを検出する概念実証ツール。
ProcessManager攻撃オペレーターがインジェクト先を決定し、防御オペレーターが実行中のプロセス、そのプロパティ、CLR がロードされているかどうかを判断するために使用できるプロセス発見ツール。