はじめに
Metasploit Framework を使用していると、LHOST(リッスンするローカルホスト)や LPORT(ローカルポート)など、さまざまなモジュールに対して様々なオプションを設定する必要が生じます。各モジュールに対してこれらのオプションを繰り返し設定するのは時間がかかります。Metasploit は、この問題に対処するためにグローバル変数という機能を提供しています。変数をグローバルに設定すると、そのオプションを使用するどのモジュールにも自動的に適用され、ワークフローの効率が大幅に向上します。
この実験(Lab)では、Metasploit コンソール内でグローバル変数を設定、使用、および解除する方法を学びます。
setg コマンドを使用してグローバル LHOST を設定する
このステップでは、Metasploit コンソールを起動し、LHOST のグローバル変数を設定します。setg コマンドは、同じ msfconsole セッション内の異なるモジュール間で永続する変数を設定するために使用されます。
まず、実験(Lab)環境の IP アドレスを見つけましょう。この IP が LHOST の値として使用されます。
hostname -I | awk '{print $1}'
以下のような出力が表示されます(IP アドレスは異なります)。
192.168.3.123
この IP アドレスを覚えておいてください。次に、Metasploit Framework コンソールを起動します。-q フラグは「quiet」モードに使用され、起動時のバナーを抑制します。
msfconsole -q
プロンプトが msf6 > に変わります。次に、LHOST 変数をグローバルに設定しましょう。setg コマンドの後に変数名と、先ほど見つけた IP アドレスを指定します。
注意:
YOUR_IP_ADDRESSは、hostname -Iコマンドで取得した実際の IP アドレスに置き換えてください。
setg LHOST YOUR_IP_ADDRESS
以下のような確認メッセージが表示されるはずです。
LHOST => YOUR_IP_ADDRESS
このコマンドにより、このセッションのグローバルな LHOST 値として IP アドレスが保存されました。これを検証するには、-g フラグ付きの show コマンドを使用します。これにより、グローバルに設定されたすべての変数が表示されます。
show -g
出力にはすべてのグローバル変数がリストされます。
Global
=======
Name Value
---- -----
LHOST YOUR_IP_ADDRESS
新しいエクスプロイトモジュールを選択する
このステップでは、グローバル変数がどのように自動的に適用されるかを確認するために、エクスプロイトモジュールを選択します。最初の例として、汎用ペイロードハンドラである exploit/multi/handler を使用します。このモジュールは、着信接続をリッスンするためによく使用されます。
msfconsole プロンプト内で、use コマンドを使用してモジュールを選択します。
use exploit/multi/handler
コマンドを実行すると、現在選択されているモジュールを反映するようにプロンプトが変更されます。
msf6 exploit(multi/handler) >
これは、現在 exploit/multi/handler モジュールのコンテキストにいることを示しています。ここで設定または表示するオプションは、このモジュールに固有のものですが、関連するグローバル変数も継承されます。
LHOST 値が既に設定されていることを確認する
モジュールがロードされたので、そのオプションを確認して、グローバルな LHOST 変数が適用されているか見てみましょう。
このステップでは、show options コマンドを使用して現在のモジュールの設定を表示します。
msf6 exploit(multi/handler) > プロンプトから、次のコマンドを実行します。
show options
このモジュールのオプションの表が表示されます。LHOST 変数を探してください。その値は、最初のステップでグローバルに設定した IP アドレスに既に設定されていることに気づくでしょう。
Module options (exploit/multi/handler):
Name Current Setting Required Description
---- --------------- -------- -----------
Payload options (generic/shell_reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
LHOST YOUR_IP_ADDRESS yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
0 Wildcard Target
ご覧のとおり、このモジュールでは set LHOST コマンドを使用する必要はありませんでした。グローバル値が自動的に継承されたためです。これがグローバル変数を使用する強力な点です。
unsetg コマンドを使用してグローバル変数を削除する
このステップでは、グローバル変数を削除する方法を学びます。変数をグローバルに適用する必要がなくなった場合は、unsetg コマンドを使用できます。これは、モジュールごとにオプションを設定するように戻したい場合や、セッションの設定をクリーンアップしたい場合に便利です。
Metasploit プロンプトから、unsetg コマンドに続けて削除したい変数の名前を実行します。
unsetg LHOST
このコマンドは、LHOST 変数をグローバルスコープから削除します。確認メッセージが表示されます。
Unsetting LHOST...
これで、同じモジュールに対して再度 show options を実行すると、LHOST の値が空になっていることがわかります。
show options
出力には、LHOST に値が設定されていないことが表示されます。
Module options (exploit/multi/handler):
Name Current Setting Required Description
---- --------------- -------- -----------
Payload options (generic/shell_reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
LHOST yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
0 Wildcard Target
これ以降、このモジュールを使用したい場合は、set コマンドを使用してローカルで LHOST を設定する必要があります。
グローバルオプションとローカルオプションの使用時期について議論する
最終ステップでは、ローカル変数とグローバル変数を設定する際の実際的な違いと、それぞれの使用時期について議論します。これを理解することで、Metasploit でより効果的に作業できるようになります。
ローカル変数 (set を使用)
- スコープ:
setコマンドで設定された変数(例:set RHOSTS 10.10.10.1)は、現在ロードされているモジュールに ローカル です。 - 動作:
useコマンドを使用して新しいモジュールに切り替えると、このローカル変数は破棄されます。新しいモジュールはそのオプションに対して独自のデフォルト値または空の値を持つことになります。 - 使用時期: 単一のターゲットまたはモジュールに固有のオプションには
setを使用します。最も一般的な例はRHOSTS(リモートホスト/ターゲットの IP アドレス)であり、これは使用するエクスプロイトごとにほぼ必ず変更されます。その他の例としては、TARGETURIや特定のUSERNAMEなどがあります。
グローバル変数 (setg を使用)
- スコープ:
setgコマンドで設定された変数(例:setg LHOST 192.168.3.123)は、msfconsoleセッション全体に グローバル です。 - 動作: 変数とその値は、そのオプション名を使用するすべてのモジュールによって自動的に継承されます。モジュールを切り替えても保持されます。
- 使用時期: セッション全体で変更されない可能性が高いオプションには
setgを使用します。攻撃マシン の IP アドレスは通常変更されないため、LHOSTはその完璧な例です。一貫して同じリスニングポートを使用する場合、LPORTもグローバル変数の候補として適しています。
コマンドの概要:
set <VARIABLE> <VALUE>: 現在のモジュールに対してのみ変数を設定します。setg <VARIABLE> <VALUE>: セッション内のすべてのモジュールに対して変数をグローバルに設定します。unset <VARIABLE>: 現在のモジュールでローカル変数をクリアします。unsetg <VARIABLE>: グローバル変数をクリアします。
ターゲット固有のオプションには set を、セッション全体のオプションには setg を戦略的に使用することで、繰り返し行う設定を最小限に抑え、エクスプロイトプロセスにより集中できます。
これで Metasploit コンソールを終了できます。
exit
まとめ
この実験では、Metasploit Framework でグローバル変数を効果的に使用してワークフローを効率化する方法を学びました。setg コマンドを使用してグローバルな LHOST を定義し、それが異なるモジュール間で自動的に設定される様子を観察し、unsetg コマンドを使用してそれを削除する練習をしました。また、ローカル変数 (set) とグローバル変数 (setg) の主な違いを学び、ペネトレーションテスト中に、より効率的な設定の選択を行えるようになりました。この単純な概念を習得することで、複雑なシナリオにおいて大幅な時間を節約し、エラーを減らすことができます。


