EDRの時代において、レッドチームのオペレーターは既にコンパイルされたペイロードを使い続けることはできません。そのため、マルウェア開発はあらゆるオペレーターにとって重要なスキルになりつつあります。maldevの開始は難しく思えるかもしれませんが、実際には非常に簡単です。このワークショップでは、始めるために必要なすべてを紹介します!
このリポジトリには、Hack in Paris 2022およびX33fcon 2023で開催された/開催予定の「MalDev for Dummies」ワークショップのスライドと付属の演習が含まれています。スライドは対面での発表用に設計されていますが、教材と演習はここで自分のペースで完了できるように利用可能です。学習プロセスは決して急いではいけません!質問や提案がある場合は、このリポジトリへのIssueやプルリクエストを歓迎します。
⚠ 免責事項: マルウェア開発は、攻撃的なセキュリティの分野を発展させ、防御を強化するために、善用されるべきスキルです。もしこのスキルセットを使って許可のない活動を行った場合、あなたはこのワークショップの対象者よりも大きなダミーであり、すぐに立ち去るべきです。
アンチウイルス(AV)やEnterprise Detection and Response(EDR)ツールが刻一刻と成熟する中、レッドチームは常に先を行くことを強いられています。execute-assemblyや未変更のペイロードをディスクにドロップする時代は終わりました。エンゲージメントを1週間以上持続させたいなら、ペイロード作成とマルウェア開発の腕を上げなければなりません。しかし、この分野に足を踏み入れるのは困難に思えるかもしれませんし、適切なリソースを見つけるのは必ずしも簡単ではありません。
このワークショップはこの分野の初心者を対象としており、マルウェア開発者としての最初のステップをガイドします。主に攻撃的な実践者を対象としていますが、防御的な実践者も歓迎し、スキルセットを広げることができます。
ワークショップでは、いくつかの理論を説明した後、ラボ環境をセットアップします。現在のスキルセットと主題に対する習熟度に応じて完了できるさまざまな演習があります。ただし、ワークショップの目的は学習であり、明示的にすべての演習を完了することではありません。マルウェア開発に使用するプログラミング言語は自由に選択できますが、ワークショップ中は主にC#とNimプログラミング言語のサポートが提供されます。
ワークショップでは、独自のマルウェアを構築するために必要な主要なトピックについて説明します。これには以下が含まれます(ただしこれらに限定されません):
マルウェア開発を始めるには、ホストマシンで動作する防御ツールに邪魔されないように、開発用マシンが必要です。私はWindowsでの開発を好みますが、LinuxやMacOSでも問題ありません。お好みのエディタ/IDEをインストールしてください(私はC#以外のほとんどすべてにVS Codeを使用し、C#にはVisual Studioを使用しています)。その後、選択したMalDev言語に必要なツールチェーンをインストールします:
Windows Defenderを無効にするか、適切な除外を追加することを忘れないでください。そうしないと、あなたの努力が隔離されてしまいます!後で、AVなどの防御制御を有効にした別のマシンでテストできます。
ℹ 注: aptなどのパッケージマネージャーや、ChocolateyやWinget(現在は組み込み!)などのソフトウェア管理ツールを使用して、依存関係のインストールと管理を便利で再現可能な方法で自動化できることがよくあります。ただし、パッケージマネージャーのバージョンは実際のものより数バージョン遅れている可能性があることに注意してください!以下は、前述のツールを一度にインストールするコマンドの例です。
choco install -y nim choosenim go rust vscode visualstudio2019community dotnetfx
このワークショップで説明する言語はコンパイル言語です。つまり、コンパイラを使用してソースコードを選択した形式のバイナリ実行可能ファイルに変換します。コンパイルのプロセスは言語ごとに異なります。
C#コード(.csファイル)は、直接(cscユーティリティを使用して)またはVisual Studio自体を介してコンパイルできます。このリポジトリのほとんどのソースコード(ボーナス演習3のソリューションを除く)は、次のようにコンパイルできます。
ℹ 注: 以下のコマンドは「Visual Studio Developer Command Prompt」で実行して、
cscの場所を認識できるようにしてください。お使いのVisual Studioのバージョンに応じて、「x64 Native Tools Command Prompt」を使用することをお勧めします。低レベルの機能に直接アクセスするほとんどのスクリプトでは、/unsafeフラグが必要です。
csc filename.exe
/optimizeフラグを使用してコンパイル時最適化を有効にできます。また、/target:winexeを追加してコンソールウィンドウを非表示にしたり、/target:libraryを使用してDLLとしてコンパイルすることもできます(ただし、コード構造がこれに適していることを確認してください)。
Nimコード(.nimファイル)はnim cコマンドでコンパイルします。このリポジトリのソースコードは次のようにコンパイルできます。
nim c filename.nim
ビルドのサイズを最適化し、デバッグ情報を削除したい場合(opsecにはるかに優れています!)、以下のフラグを追加できます。
nim c -d:release -d:strip --opt:size filename.nim
オプションとして、--app:guiを追加してコンソールウィンドウを非表示にすることもできます。
Golangコード(.goファイル)はgo buildコマンドでコンパイルします。このリポジトリのソースコードは次のようにコンパイルできます。
GOOS=windows go build
ビルドのサイズを最適化し、デバッグ情報を削除したい場合(opsecにはるかに優れています!)、以下のフラグを追加できます。
GOOS=windows go build -ldflags "-s -w"
Rustコード(.rsファイル)はcargoコマンドを介してコンパイルします。Cargoは依存関係の管理とプロジェクトのビルドに使用できます。このリポジトリのソースコードは、プロジェクトフォルダに移動して次のコマンドを実行することでコンパイルできます。
cargo build
ビルドのサイズを最適化し、デバッグ情報を削除したい場合は、次のフラグを追加できます。各Cargo.tomlファイルの[profile.release]セクションも参照して、コンパイル時のopsecオプションを確認してください。
cargo build --release
ほとんどのソリューションは依存関係なしでコンパイルできます。依存関係が必要な場合は、適切なNuGetパッケージにリンクするVisual Studioプロジェクトが提供されています。
ほとんどのNimプログラムは、Windows APIとインターフェースするために「Winim」というライブラリに依存しています。このライブラリは、Nimをインストールした後、Nimbleパッケージマネージャーを使って次のようにインストールできます。
nimble install winim
このリポジトリのソースコードではいくつかの依存関係が使用されています。Goをインストールした後、次のようにインストールできます。
go mod tidy
いくつかの例は、Windows APIを呼び出すためにwindows-sysクレートに依存しています。Cargoを使用しているため、テストビルドまたはリリースビルドをコンパイルすると、パッケージは自動的に管理されます。
ワークショップのスライドでは、始めるために使用できるいくつかのリソースを参照しています。関連するブログやコードスニペットなどの追加リソースは、各演習のREADME.mdファイルにリストされています!