Metasploit 3.0――ユーザの良心が試されるシステム貫入試験ツール

 Metasploit LLCから先月末、システム貫入試験ツールとして人気の高いMetasploit Framework(MSF)のバージョン3.0がリリースされた。同ツールの記述言語は、バージョン1および2段階では主としてPerlが用いられていたが、バージョン3.0ではRubyをメインとした全面的な再構築が施されている。

 今回のリリースにおける目立った変更は実験的なGUIモジュールの試験採用であるが、真に注目すべきは、同ツールによるエクスプロイト(exploit:侵入手口)の検出と実行を自動処理するdb_autopwnの追加とすべきかもしれない。

 MSFは、コンピュータシステムへの貫入試験を自動実行するために構築されたツールである。そのため同ツールには、Windows、Linux、BSD、Unix、Mac OSの各種リリースという特定のターゲットへの不正進入手段として知られている様々なエクスプロイトが満載されている。ツールの実行プラットフォームとしては、これらオペレーティングシステムの大半を用いることができるが、その他にもタブレット型のNokia N800マシンから実行できたという報告もある。

 MSFのオリジナル開発者はH. D. Moore氏であり、2.0リリースの段階においてMatt Miller氏など開発者数名が参加したとのことだ。そして昨年、これらの開発陣によって「商用的な不正使用を防止し、同プロジェクトの長期的な存続を図る」ことを目的に結成されたのがMetasploit LLCである。Metasploitというソフトウェア本体および、その商標やドメインに関するすべての権利は、このMetasploit LLCが掌握している。またMSFはMetasploit Framework Licenseという独自のライセンス下で提供されており、OSIによる承認を受けておらず、FSFによるフリーソフトウェアライセンスの裁定も得ていない。

 現行の開発バージョン(svnにおけるリビジョン4701)では、MSFには100以上のペイロード(payload)および190種のエクスプロイトが実装されている。ここで言うエクスプロイトが侵入者用の武器だとすれば、ペイロードはそこから発射される弾丸だとでも思えばいいだろう。ペイロードには侵入後にどのような行動を取ればいいのかの指示が収められているからだ。なおmsfconsoleからエクスプロイトおよびペイロードを実行する具体的な手順については、以前に本サイトで掲載した2.6リリースに対するレビュー記事を参照して頂きたい。

db_autoPwnのインストールと使用法

 db_autopwnモジュールを使用するには、データベースのサポート用に若干の追加インストールをしておく必要がある。利用するデータベースマネージャについては、MySQL、Postgres、SQLiteが選択可能だ。私の場合、MSFのインストール先はUbuntu 7.04 Feisty Fawnとし、データベースエンジンはSQLite3を選択した。

 オンライン上ではプラットフォーム別のインストールガイドが用意されている他、Moore氏のMetsploitブログにはdb_autopwnの使用法についての参考情報が紹介されている。私と同様Ubuntu 7.04およびSQLite3という組み合わせで使用する場合、MFSの最新開発バージョンのインストールおよびdb_autopwnモジュールの使用に必要な準備は、基本的に下記の手順に従えばいいはずである。

  1. Subversionをインストールする
  2. svnからMSFをインストールする
  3. Rubyおよび関連パッケージをインストールする
  4. RubyGemsをインストールする
  5. Ruby on Railsをインストール(「gem install rails」を実行)し、すべての質問にYと答える
  6. libgtk2-ruby、libglade2-ruby、sqlite3をインストールする
  7. libsqlite3-ruby1.8、libdbd-sqlite3-ruby1.8をインストールする
  8. Nmapをインストールする

 すべてのインストールが正常に行われると、db系コマンドをmsfconsoleから実行できるようになる。その中には、Nmapを実行してその結果をデータベースに自動登録するコマンドも用意されているが、必要であればNmapを個別に実行させ、スキャン結果を収めたXMLファイルをインポートすることも可能である。同様にNessusスキャンの結果をNBEフォーマットに出力させることもできる。

 次に必要な準備は、データベースの作成である。その際には、svnで作成されるMSFのサブディレクトリに移動してから「sudo ./msfconsole」とコマンドを入力する。msfconsoleのロードが完了すると、下記の2つのコマンドによるデータベースドライバのロードおよび必要なデータベース作成が行えるようになる。

msf> load db_sqlite3
msf> db_create pentest

 ここまでの設定に問題がないかを確認するには、MSF consoleで「help」と入力すればいい。これにより使用可能なコマンドが一覧され、リストの上部にはデータベース関連の全コマンドが表示されるはずである(以下参照)。

Database Backend Commands
=========================

    Command               Description
    -------               -----------
    db_add_host           Add one or more hosts to the database
    db_add_port           Add a port to host
    db_autopwn            Automatically exploit everything
    db_hosts              List all hosts in the database
    db_import_nessus_nbe  Import a Nessus scan result file (NBE)
    db_import_nmap_xml    Import a Nmap scan results file (-oX)
    db_nmap               Executes nmap and records the output automatically
    db_services           List all services in the database
    db_vulns              List all vulnerabilities in the database


SQLite3 Database Commands
=========================

    Command        Description
    -------        -----------
    db_connect     Connect to an existing database ( /path/to/db )
    db_create      Create a brand new database ( /path/to/db )
    db_destroy     Drop an existing database ( /path/to/db )
    db_disconnect  Disconnect from the current database instance

 なおMoore氏による説明では、この段階でdb_autopwnを引数無しで実行させて、具体的にどのような操作ができるかを確認しておくことが推奨されている。これを実行すると、下記の出力が得られるはずだ。

msf> db_autopwn
[*] Usage: db_autopwn [options]
        -h         Display this help text
        -t         Show all matching exploit modules
        -x         Select modules based on vulnerability references
        -p         Select modules based on open ports
        -e         Launch exploits against all matched targets
        -s         Only obtain a single shell per target system (NON-FUNCTIONAL)
        -r         Use a reverse connect shell
        -b         Use a bind shell on a random port
        -I [range] Only exploit hosts inside this range
        -X [range] Always exclude hosts inside this range

 この“とりあえず何ができるかを確認しておく”段階では、showコマンドの確認もしておくといいかもしれない。これにより同フレームワークで認識されたすべてのエクスプロイトとペイロードがリストアップされる他、SQLite3との併用に必要なプラグインやオグジリアリ(auxiliary)扱いのRubyスクリプトなども一覧される。ここで言うオグジリアリであるが、Moore氏はこれを「エクスプロイト以外のすべて」と定義しており、具体的には、検出スクリプト、ファザー(fuzzer)類、DOS(Denial of Service:サービス拒否攻撃)、管理者攻撃などが該当するとのことである。

テストの実行

 私の環境では、Linksysルータも含めて3基のLinuxマシンがLAN接続されている。今回のテストではこの環境でMSF 3.0を動作させてみた。最初に実行したのは、とりあえずの状況確認として、LAN上に存在する全システムのdb_nmapコマンドによる検索である。

msf > db_nmap 192.168.1.*
Starting Nmap 4.20 ( http://insecure.org ) at 2007-04-18 15:15 CDT
Interesting ports on 192.168.1.1:
Not shown: 1693 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
23/tcp open  telnet
53/tcp open  domain
80/tcp open  http
MAC Address: 00:0F:66:49:9A:AF (Cisco-Linksys)

Interesting ports on desktop.lan (192.168.1.101):
Not shown: 1695 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
5900/tcp open  vnc

Interesting ports on hamshack.lan (192.168.1.111):
Not shown: 1694 closed ports
PORT    STATE SERVICE
80/tcp  open  http
139/tcp open  netbios-ssn
445/tcp open  microsoft-ds
MAC Address: 00:00:00:00:00:00 (Edimax Technology CO.)

Nmap finished: 256 IP addresses (3 hosts up) scanned in 38.580 seconds


 次に、検出されたこれらのホストがデータベースに登録されていることをdb_hostsコマンドを用いて確認してから、db_servicesコマンドを実行してみた。その結果得られたのが、下記の出力である。

msf > db_services
[*] Service: host=192.168.1.1 port=22 proto=tcp state=up name=ssh
[*] Service: host=192.168.1.1 port=23 proto=tcp state=up name=telnet
[*] Service: host=192.168.1.1 port=53 proto=tcp state=up name=domain
[*] Service: host=192.168.1.1 port=80 proto=tcp state=up name=http
[*] Service: host=192.168.1.101 port=22 proto=tcp state=up name=ssh
[*] Service: host=192.168.1.101 port=5900 proto=tcp state=up name=vnc
[*] Service: host=192.168.1.111 port=80 proto=tcp state=up name=http
[*] Service: host=192.168.1.111 port=139 proto=tcp state=up name=netbios-ssn
[*] Service: host=192.168.1.111 port=445 proto=tcp state=up name=microsoft-ds


 なおデフォルト設定のままdb_autopwnコマンドを実行するとデータベースにあるすべてのホストが攻撃されるので、特定のホストを除外させたければ、あらかじめ該当するものを削除しておくか、先に確認した処理対象の範囲指定オプションを用いて、db_autopwnコマンドの実行時にホストを限定しておく必要がある。

 次に行ったのは、db_autopwnコマンドによる脆弱性のチェックである。その結果、これらに関して実行可能なエクスプロイト用ツールは存在しないことが確認できた。

msf > db_autopwn -t
[*] Analysis completed in 3.79338097572327 seconds (0 vulns / 0 refs)


 自分の環境がセキュリティ的に健全であることを確認できたのは結構なのだが、本稿のレビューを進める関係上、喜んでばかりもいられない。そこで今回はコンソールからinfoコマンドを実行して、いくつかのLinuxエクスプロイトに関する詳細情報を確認し、何か脆弱性に関連したパッケージをインストールできないかをチェックしてみた。使える可能性が高かったのは、linux/proxy/squid_ntlm_authenticateである。

msf > info linux/proxy/squid_ntlm_authenticate

       Name: Squid NTLM Authenticate Overflow
    Version: 4419
   Platform:
 Privileged: No
    License: Metasploit Framework License

Provided by:
  skape

Available targets:
  Id  Name
  --  ----
  0   Linux Bruteforce

Basic options:
  Name   Current Setting  Required  Description
  ----   ---------------  --------  -----------
  RHOST                   yes       The target address
  RPORT                   yes       The target port

Payload information:
  Space: 256

Description:
  This is an exploit for Squid's NTLM authenticate overflow
  (libntlmssp.c). Due to improper bounds checking in ntlm_check_auth,
  it is possible to overflow the 'pass' variable on the stack with
  user controlled data of a user defined length. Props to iDEFENSE for
  the advisory.

References:
  http://www.osvdb.org/6791
  http://www.idefense.com/application/poi/display?id=107
  http://www.securityfocus.com/bid/10500
  http://cve.mitre.org/cgi-bin/cvename.cgi?name=2004-0541
  http://milw0rm.com/metasploit/67


 だが結局のところ、この試みは徒労に終わった。Squidをインストールして実行させても、システムをエクスプロイトすることはできなかったのである。

GUIなどの操作インタフェースについて

クリックで拡大

 MSFではコンソール以外にもコマンドライン形式のインタフェースが利用可能で、簡単なスクリプトの記述および貫入試験の自動実行をすることができるが、その他にWeb形式インタフェースを介した操作も行える。今回これらのインタフェースの操作性をすべて確認する余裕はなかったが、現在開発途上にある実験的なGUI操作については一通り試すことができた。

 GUIでの操作を行うためには、先に「sudo ./msfconsole」を実行したフレームワークのディレクトリに移動して「sudo ./msfgui」を実行しておく必要がある。コマンドの送信直後は空白状態のフレームワークが表示されるだけだが、その後10秒くらい待機すると、ツールにより認識された、エクスプロイト、ペイロード、オグジリアリその他のモジュールに関するドロップダウン形式のメニューが表示される。

 これは実際に操作して確認したのだが、先に挙げたすべての情報はGUI画面でも表示させることはできるものの、その際には必要なアイテムのアイコンをクリックして該当するカテゴリを展開させてから、あらためて対象アイテムを再クリックする必要がある。これにより、選択したアイテムについての全情報がメニューリストの直下にあるペインに表示される。

 更に試行錯誤を繰り返すうちに、選択アイテムを右クリックすることで別のアイコンが表示され、これを再度クリックすることで選択アイテムが実行されるという仕様を突き止めることができた。その一方で、IPアドレス、ポート、ペイロードの引数など、ターゲットに関する情報をどうすれば設定できるかについては、未だ特定できていない。メーリングリストで確認したところによると、何らかの方法でそうした操作ができるのは確かなようである。

補足:msfguiの開発者であるFabrice Mourron氏から、私が遭遇しているトラブルについての助言を得ることができた。同氏がこの問題を検証したところ、Ubuntu 7.04リポジトリに収められていた旧バージョンのlibgtk2-rubyに潜むバグに辿り着いたとのことだ。また同氏は新たに、msfguiでのmsdns_zonenameエクスプロイトを実演するデモムービーも作成してくれた。

ドキュメントおよびサポートの入手法について

 操作マニュアルについては手際よくまとめられた「MSF 3.0 User Guide」がPDFフォーマットで提供されている。また各種APIに関するドキュメント類および「Developer Guide」も同じページから入手できる。これらの情報に目を通しても不明な点がある場合は、同プロジェクトのメーリングリストを購読するか(framework-subscribe@metasploit.comに空メールを送信する)、あるいはメーリングリストのアーカイブを探せばいいだろう。

まとめ

 MSF 3.0のリリースは、セキュリティの自動テストという分野における大きな前進と見なすことができるだろう。それは、db_autopwn機能に代表される従来バージョンからの機能的な格段の進歩を遂げたことだけではなく、実験的に装備されたGUIによる操作性の大幅な向上を評価してのことである。

 MSF 3.0に同梱されているエクスプロイトの大部分については、若干陳腐化している感が否めない。もっとも陳腐化したということは、それだけ対策が進んだことの裏返しであるから、そうした観点からは歓迎すべき事態だと見るべきである。とはいうものの、そうしたエクスプロイトを利用した攻撃への対策が施されていないシステムがインターネット上には数多く残されている訳であり、その攻撃手段としての脅威度が完全に失われていないのも事実である。それほど深い知識を有さないユーザであってもMSF 3.0を使えば、そうした進入路を即座にクラッキングできてしまうのだから。

 ここで少し想像力を働かせてみよう。悪意を持ったクラッカーが対策に不備のあるエクスプロイトを満載したデータベースと危険な攻撃用ペイロードを準備し、適当な犠牲者を求めてサブネットをスキャンすれば、msfconsoleを介したクラッキングなど朝飯前の出来事である。これはあまりゾッとしない現実ではなかろうか? その一方で、セキュリティの専門家がパッチを検証して独自の貫入試験を実行できれば、悪用される前にセキュリティホールの存在を特定することも可能なのだ。

 MSF 3.0は強力なツールであるが、それを悪用するもしないも、すべては使う人間次第である。自分のシステムに侵入されるのがイヤであれば、その前にシステムのセキュリティを検証しておくべきであろう。

NewsForge.com 原文

MSDNの価格