DNS のキャッシュについてもう少し

年末を迎えての備忘録モードです。 前回の記事に関連して BIND 9 の主にキャッシュ関連についてメモしておきます。 この辺はしょっちゅう触っているわけではないので、書いておかないとすぐ忘れてしまうのです。

  • 実際の DNS 環境ではキャッシュサーバでキャッシュされるし、DNS クライアントでもキャッシュされ、多段のキャッシュが起こっている。 このように多段でキャッシュが行われる環境でも、キャッシュサーバはオリジナルの TTL を返すのではなく経過時間だけ減らした TTL を DNS クライアントに返すので、コンテンツサーバ (=ゾーンを管理するサーバ) で設定した TTL よりキャッシュの存在期間が延びることはない。
  • SOA レコードの TTL はネガティブキャッシュの生存期間となる
  • bind を使用したキャッシュサーバにおいて TTL の制御に以下のオプションを使うことができる。

    max-cache-ttl
    max-ncache-ttl
    

    これらは TTL を伸ばすものではなく、それを超えた TTL が返って来たときに設定されたその値に縮めるもの。 特に SOA の TTL は、昔と意味が変わっているので、メンテナンスされず不適切に大きな値のままのものがあるかも知れず、この設定は重要。

  • セキュリティ上の理由よりキャッシュサーバとコンテンツサーバは分けるべき。

    1. コンテンツサーバ上でキャッシュ汚染が生じないようにするため。
    2. 外部向けコンテンツサーバは公開しなければならないが、公開されたキャッシュは DDoS 攻撃 に用いられてしまうから。
  • キャッシュをダンプするには "rndc dumpdb"。rndc は最初に "rndc-confgen -a" を実行しないと使えないかも。

参考までに先の記事でも紹介した「DNS & BIND クックブック」の関連する項を挙げておきます。

レシピ 3.2  ネームサーバが rndc と協調動作するように設定する
レシピ 3.20 キャッシュを抑制する
レシピ 3.21 メモリ使用量を制限する
レシピ 5.3  キャッシュの中身を見る

DNS の「プロパゲーション期間」の説明がアバウト過ぎる件について

DNS にはキャッシュの仕組みが組み込まれているので、レコードを変更してもキャッシュには古い情報が残っていてそちらが参照されてしまう場合があります。この新旧の情報が混在してしまう期間を「プロパゲーション期間」と呼ぶことを最近知りました。 ただし、この「プロパゲーション」という言葉を使って説明している文章を見かけたら眉に唾をつけた方が良いようです。 言葉がわからなかったので Web 検索してみたのですが、こちらのブログ記事に共感してしまいました。「通常プロパゲーション期間は1~2週間です」とはどういうことかと。

Web サーバの移転 (IP アドレスの異なる旧サーバから新サーバに切り替えること) を考えて見ましょう。

サーバ移転により変更が必要となってくる DNS レコードは A レコード、PTR レコードです。 実際のところ、新アドレスの PTR レコードと旧アドレスの PTR レコードは同時期に並存可能で、あらかじめ新アドレスのレコードを登録し、しばらく経ってから旧アドレスのレコードを削除すれば良いだけです。なのでプロパゲーションが問題になるのは A レコードの書き換えということになります。

A レコードの変更手順を確認しましょう。

  1. あらかじめ変更する A レコードの TTL を短く (ここでは 600 秒=10分とする) しておく。 この作業をいつまでに行う必要があるかは既 TTL の値による。例えば変更前の TTL が 86,400 秒ならば少なくとも 2. のアドレス変更の1日前までにこの作業をしなければならない。
  2. サーバを切り替えるために A レコードの IP アドレスを変更する。
  3. 新サーバの安定稼動を確認して TTL を元の値 (86,400 等) に戻す。切り戻しを考えなければ、これを 2. のアドレス変更と同時に行っても良い。

以上の手順で行えば理論的にはアドレス変更から 10分以内に新しい A レコードの値が参照されるようになるはずです。 ただし、厳密には 1. 2. はセカンダリサーバへの反映も考慮する必要があります。通知 (NOTIFY) 機能を使用していれば問題ないですが、そうでなければリフレッシュのタイミングを計算する必要があります。 

実際のところ世の中には TTL を無視するキャッシュが存在するようです。私は実地経験が少ないのでこの辺りは何とも言えないところですが、ブラウザやプロキシサーバ等の実装も関係していそうな気がします。少なくとも私の周囲の DNS キャッシュサーバはまともな動作をしているように見えます。

いずれにせよこのような手順を採れば、プロパゲーション期間が「1~2週間」とはならないはずです。 まあ、業者の立場としては面倒な事前作業やお客さんへの説明をすっ飛ばして、「プロパゲーション期間中なので1~2週間は我慢してください」と言って片付けてしまうのが楽でしょうけれど。バズワードの一種かも。

関連してオライリーの「DNS & BIND クックブック」という本を紹介しておきます。 やりたいことからその実現方法を引けるので超有名なバッタ本 (「DNS & BIND 第4版」) よりも実務的です。 本書の「レシピ 2.16 ホストを移動する」に先の手順が書いてあります。 入門用には勧めませんが、一通り DNS の知識はあるし「DNS & BIND」の旧版も持っているけれど、最新版を買うほど熱心ではない、という人にはちょうど良いと思います。

それは私なのですが…


関連記事
「DNS のキャッシュについてもう少し」

Cygwin 上でのシリアル端末エミュレータと expect

例えばネットワークの変更作業を終えた後にもろもろのステータスを確認するログを取得するときなど、大量の機器に対しお決まりの一連のコマンドを投入したいときがあります。 そんなとき私の周囲の人々は Tera Term のマクロを駆使してコマンドラインインターフェイス上での一連のコマンド実行を自動化するわけですが、 私はいまさら Tera Term のマクロを覚えるよりは手許にある expect のスクリプトをちょっと直して済ませたいと思ってしまうわけです。 マクロの類など使わずに、実行するコマンドを羅列したテキストエディタから端末エミュレータへコピー&ペーストするという手もありますが、 このやり方を取ると一般に機器の応答を待たず一連のテキストをペーストしてしまうので、何かの拍子にペーストしたコマンドがきちんと認識されずエラーが起こるというのはありがちなことです。 そもそもコピペの連続などエンジニアの作業としてはどうなのかという問題 (?) もあります。

さて、expect を使いたい時は Cygwin の expect を使います。ネットワーク越しにアクセスできれば /usr/bin/telnet.exe を使ってログインをした後に機器のコマンド実行をするスクリプトを作って流すことができます。 しかし、もろもろの理由でシリアルケーブルを使ってコマンド実行しなければならない時もあります。 Tera Term ならばネットワーク接続でもシリアル接続でもどちらでも問題ないのですが、expect を使うときは telnet の代わりにシリアル端末エミュレータを使わなければなりません。 「シリアル端末エミュレータ」という言葉はかなりニッチな分野でコレという決定的なソフトが無いように思います。 ですので選択が難しいところですが、私の場合は jerm を使っています。

何故 jerm だったのかは記憶が定かでないのですが、とりあえずコンパイルして使っていて問題がないのでそのまま使い続けています。 ただし、コンパイルにはそれなりにソースを修正しています。 jerm-8095 用のパッチファイルはこちらです。 そのうち blog で取り上げようと思いつつコンパイルをしたのが既に1年以上前になってしまい、詳細は覚えていないのですが、 今その内容を見ると苦労してコンパイルした後が窺えます。 単純にシリアルターミナルエミュレータとして動かすことのみを目的としたパッチファイルですので、他の付加機能がきちんと動くかは試していませんのでご注意ください。 getaddrinfo-1.6.3.tar.gz を利用させていただきましたが、これはパッチファイルの中に含まれています。

さて expect を使ったコマンドの実行例です。 とりあえず、サンプルレベルですが、以下が expect スクリプトと実行するネットワーク機器のコマンドファイル (Cisco Catalyst 用) の例です。enable 用パスワードは cisco としています。また、COM2 (=/dev/ttyS1) を利用しています。 見てお分かりのように、シリアル通信を開始してプロンプトを出し enable する手順を、 while 文を用いてプログラム化しています。

docmd.exp

set timeout 2
match_max 100000
if {[llength $argv]>0} {
set filename [lindex $argv 0]
set enablep "cisco"
set fp [open $filename r]
set pid [spawn /usr/local/bin/jerm -r xnrn /dev/ttyS1]
set done ""
while {"$done" == ""} {
expect {
">" {
set timeout -1
send -- "enable\r"
expect "Password: "
send -- "$enablep\r"
}
"#" {
set done 1
}
timeout {
send -- "\r"
}
}
}
while {![eof $fp]} {
set cmd [gets $fp]
send -- "$cmd\r"
expect "#"
}
send -- "exit\r"
exec kill $pid
close $fp
close
}

status.cmd

terminal length 0
show clock
show interface
show route
show logging

この2つを用いて以下のように実行すれば、status.log に実行結果を残すことができます。

expect docmd.exp status.cmd | tee status.log

expect を使うとシェルスクリプトと組み合わせて複数の機器にパラメータを調整しながら telnet でコマンド実行したりということも書きやすいので、 重宝しています。 というかそのような用途に Tera Term のマクロより expect + sh スクリプトを選ぶ私が嗜好が今の時代だと特殊かも知れませんが。 expect についての情報は多くないのですが、Tcl の拡張なので文法は Tcl について調べればオッケーです。


2007. 8. 10 追記
コメント欄にある通り、 jerm 作者の方が、パッチの内容を取り込んだ新バージョンをリリースしてくださいました。 バイナリ版も合わせてリリースされていますので、Cygwin でシリアル通信プログラムを探している方はまず jerm を試してみてはいかがでしょう?

2011. 7. 29 追記
少し前perl の expect モジュールを見つけました。 私のように tcl よりは perl の方が嬉しいという人はチェックしてみてください。

マザーボード上のコネクタを用いた USB ポート増設

家で使っているデスクトップマシンのマザーボードは AOpen AX4SG-UL なのですが、 このボードにはバックパネルに4つの USB ポートがあり、更にマザーボード上に USB ポート2個分のコネクタ×2ヶがあります。 これまではバックパネルの4つのみ使っていたのですが、USB 機器が増えたので使えるポートを増やしたくなりました。

そこでマザーボード上のコネクタを有効利用しようと思い立ち、増設用の USB ポートを買おうと決心したのですが、調べてみるとピン配列に標準がないようで下手をすると間違って互換性のないピン配列のものを買ってしまいそうです。 慎重を期さなければと心に留めつつ、まずは帰宅途中に寄り易いビックカメラで物色したのですが、ちょうど良いものがあったので購入しました。 Groovy の GR-US006 という製品です。

ピン配列

マニュアルを参照するとマザーボードのピン配列は上の図の通りなのですが、これと全く同じ配列のコネクタが2つ使われていて、4つの USB ポートを 3.5 インチベイの中に組み込むことができます。 これを見つけるまでは背面のスロットに挿すものを想定していたのですが、一時的に挿す USB 機器の場合はフロントにポートがある方が使い勝手が良いですね。

ただし、3.5 インチベイの中に4つのポートが並んでいるため、ポートの間隔は必要最低限しかないので注意が必要です。 USB ケーブルを挿すならば問題はありませんが、例えば私の持っている初代 iPod Shuffle を挿すと隣のポートは使えなくなります。 まあ、前後合わせて8つのポートをフルに使うことはないような気がしますが。

価格は \2,310 でした。 チップの載った PCI バス用増設カードが買えてしまう値段なので気分的にしっくりこないのですが、ケーブル類はそれなりに値が張るので、フロントにポートがつくことを考えればこの程度の出費は仕方ないですよね。

大容量ディスク購入

自宅のメイン PC のハードディスクを大きなものに変えました。 今回もちょっと見ないうちにずいぶんと価格が下がっていました。これまで 80G バイトのものを使っていましたが、 これを今一番値ごろ感のある 320G バイトのもの(日立製:HDT725032VLA360)に変えました。 某家電量販店で \8,860 (ポイント還元 10%) でした。 インターフェイスも IDE (ATA) から Serial ATA に変えました。

これだけ容量があるので増設でなく入れ替えという形にしました。つまり、OS 、アプリケーションを再インストールしなければなりません。 当面はデータの移行のために既存ディスクもつけたままにします。 実際、ソフトウェアをインストールのためのシリアル番号等の入った書面が部屋のどこかに眠ってしまっているため、何度か旧環境を起動して確認しなければなりませんでした。 今回はインターフェイスが異なる2つのディスクが接続された状態なので、BIOS の設定でブートドライブの優先順位を変えることにより起動する Windows XP の新旧を切り替えることができたので楽でした。 こういう機会にセットアップに必要な情報を整理しておかねばなりませんね。

ファイルをコピーしているといくつかのファイルはエラーを起こしてコピーに失敗しました。 それはファイルのアクセス権が設定されているためでした。 ファイルを読めるように設定し直さなければならないのですが、ここで困るのは XP の Home Edition ではファイルのプロパティで「セキュリティ」タブが表示されないことです。 ACL の設定だけならば cacls という OS 標準コマンドがありますが、所有者を変えないと ACL を変えることができません。 セーフモードで起動し直し、するとセキュリティタブが表示されるようになるので、 このメニューを用いて所有者を変更してから Everyone に読み込み権限を与えることで無事コピーすることができました。 セキュリティが重視される昨今の事情では ACL の設定が標準ツールで柔軟にできないのはまずいと思うのですが、 Vista の家庭用版 (バージョンがたくさんでさっぱりわからない…) ではこのあたりどうなっているのでしょう?

xcacls や subinacl という追加コマンドもあるよう なのでこれをインストールしておくのも良いかも知れません。 ちなみにコピーできなかったのは Microsoft Money のファイルと Photoshop Elements のカタログファイルでした。

以下備忘録:

  • Serial ATA と Serial ATA II は互換性があり、Serial ATA のボードに Serial ATA II のディスクを接続したり、その逆も可
  • Serial ATA II には Phase 1 と Phase 2 がある。転送速度は Serial ATA と Serial ATA II Phase 1 が 150Mバイト/s、Serial ATA II Phase 2 が 300Mバイト/s
  • Serial ATA (II) では 10ビットで 1バイトのデータを符号化するので、転送速度はそれぞれ 1.5Gbps、3Gbps と表記されることもある

CISSP 認定証が送られてきました

英文 Resume と Endorsement を電子メールで送って待つこと約 10日。 無事 CISSP の認定証が送られてきました。

CISSP のテストに合格してもこの Resume (職務経歴) と Endorsement (推薦状) を出さなければ認定証が発行されません。本家 ISC2 が処理するのでいずれも英文です。 英文 Resume などめったに書く機会がないのですが、 ISC2 のサイト にあるサンプルを参考に自分の関わったセキュリティ関連の仕事を書きました。 Endorsement の方は先に合格している CISSP からサインをもらった書面をスキャナーで取り込み JPEG ファイルにして送りました。 「監査」対象に選ばれてしまうと大変らしいですが、 無事対象となることもなく送った日 (日本) と同じ日付 (現地) のうちに “ENDORSEMENT PROCESSED” の通知が来ました。 そこには、この後印刷処理にまわして発送すると書いてあり、海外への delivery には 4-6 weeks かかるとも書かれていましたが、Air Mail なのでそれよりずっと到着が早かったです。 届いた封筒には認定証の他、Free の CISSP Lapel Pin のクーポンも入っていました。

さっそく RSA のセキュリティ・カンファレンスに行って CPE をゲット、と行きたいところですが、最近の仕事の状況を見るとちと難しそうです…

CISSP 認定試験、無事合格

気合を入れるために (自分にとっては) ちょっと贅沢な筆記用具を買って臨んだ CISSP 認定試験だったのですが、無事試験を1発合格することができました。5日間の公式レビューセミナーを受講した他は前日に勉強した程度なのですが、 CISSP の条件となっている4年間のセキュリティ分野での実務経験があれば、この程度の試験対策で合格することは可能だと思います。 私の場合仕事の関係でネットワーク、暗号、アプリケーションセキュリティあたりはそれなりに知識がありました。 逆にそれがないと辛いでしょうね。(実務経験がなくても受験することは可能で合格後は「(ISC)2準会員」として登録されます)

レビューセミナーはその名の通り「レビュー」のためのセミナーで、本来は既に持っている知識をレビューするのが目的なのだそうです。 私の場合セミナーの前は何の準備もしていないので、もちろんこんな広範な知識を持ち合わせてはいませんでした。 範囲が広いのでセミナーはかなりのスピードで進んで行くのですが、それでもモジュールによっては 9:30 開始 21:00 終了というようなことになってしまいます。 泊り込みでもないのに 21:00 までかかる座学のセミナーは初体験でした。

試験時間は6時間に及び 250問の4択マークシートを解答します。 途中自由に休憩を取ることができるのですが、私の場合は休憩を取らず6時間フルに使いました。 時間が足りなくなることはあまりないと思いますが、私は全て見直しすることはできませんでした。 和文、英文併記で問題によっては英文もきちんと読んだ方が良いのですが、そうするとやはり時間がかかります。 英和辞典を持ち込むことはできますが、「辞書を引かなければならないようならば捨てる」と割り切って私は持って行きませんでした。 公式セミナーと試験は同じ回数開催されているようですが、受験者はセミナー受講者の3倍はいたように思います。 独学で受験する人もいるので合格率については何とも言えませんが。

セミナーのモジュールEでの模擬試験のスコアは 83/100 でしたが、本番の試験はこれより難しく感じます。 本番試験後に「完璧だった」と思える人はそれ程多くないのではないかと思いますが、 中には採点されないリサーチ目的の問題も含まれるとのことなので、 「よくわからなかったのはリサーチ問題」と考えたほうが精神衛生上良いと思います。 3/18 に受験して 3/29 深夜に合格通知メールが届きました。 「何とかなったかなあ」という気分ではいたのですが、やはり合格通知が来るまでは不安でした。 落ちたらまた6時間試験を受けるかと思うと憂鬱になります。

この試験の難しさはプライオリティをつけて解答しなければならないものがあることです。 イメージで言うと、「会社経営で最も重要なものは次のうちどれですか?」という問いに、

  1. 従業員
  2. 株主
  3. 取引先
  4. キャッシュフロー

の選択肢が並ぶような感じです。技術的な問題であればすっきり解答することができるでしょうが、 この類の問題は判断が必要なので難しく感じます。どのような観点からプライオリティをつけるのかを理解しておく必要があります。

どんな問題が出たかについては書くことができないのですが、 (ISC)2 の実力診断テストが目安になると思います。 ただし実際の試験は判断が必要な問題が混じってくるのでもう少し難しいでしょう。私は利用しませんでしたが、 CISSP CBKオンライン・セルフアセスメントを利用するのも良いかも知れません。

CISSP には有資格者のコミュニティがあり、日本には日本のコミュニティが存在するのだそうです。 セミナーの講師の方も「合格後またお目にかかる機会があるでしょう」と言っていました。 また、認定継続のために CPE というポイントを積み重ねなければならないのですが、これはそれなりに大変そうです。

PM-970C の清掃

我が家のプリンタはエプソンの PM-970C というモデルです。購入してから4年ぐらい経つのですが、紙に黒い筋が入るようになりました。

紙

こうなるとクリーニングシートを使ったところでちっとも綺麗になりません。排紙トレイを上段にして覗いてみると、細いローラー (最後の写真の矢印で示す白いローラー) の下の隙間にインクの染みたホコリが見えたのでまずは竹串で取り始めました。

竹串とプリンタ

そのうち鶴首ピンセットを使い始めました。こちらの方が良く取れます。

ピンセットとプリンタ

これで大分改善されましたが、まだうっすらと残るところがあるので、厚めの紙や2つ折にした紙を使って何度も紙送りさせました。すると紙の端に細かいホコリがつくことがあります。これはどこについていたのだろう…

そんなこんなしているうちに努力の甲斐あって無事に筋が消えました。 今年の年賀状はこうして無事に印刷することができました。それほど頻繁に印刷しないので我が家のプリンタは年賀状を印刷した直後が一番調子が良いです。

HTMLDocument と Numeric character references

Java で HTML を読み込み、その内容を元に別の HTML を出力するちょっとしたプログラムを書こうとしています。こんな時、Java には HTMLEditorKit という便利なクラスがあります。これを使うと HTML を解析して HTMLDocument という HTML の内容を表すドキュメントクラスのインスタンスを生成してくれます。これがどんなに便利かは古い記事ですが、この記事等を読むとわかります。


さて逆に HTMLDocument の内容 HTML として出力しようとする時は HTMLWriter を使うことができます。ところがこれを使って日本語の HTMLDocument を出力しようとすると “&amp#12371;&amp#12398;&amp#12392;&amp#12371;” のような内容で出力されてしまいます。一瞬「また、文字化け??」と思ってしまいましたが、これはれっきとした HTML の書式で“Numeric character references (NCR)”と呼ばれるものだそうです。日本語では数値文字参照というようです。


「うーん、何で EUC や シフト JIS で出してくれないの??」と思い、Web 検索するもこのあたりの情報は乏しいです。仕方がないのでクラスのソースを見てみると、HTMLWriter クラスで思いっきり次のように書かれていました。


if (chars[counter] < ' ' || chars[counter] > 127) {
(中略)
// If the character is outside of ascii, write the
// numeric value.
output(“&#”);
output(String.valueOf((int)chars[counter]));
output(“;”);
}
(JDK 5.0 HTMLWriter クラスの “protected void output(char[], int, int)” のソース抜粋)


ascii でなけりゃ問答無用で NCR だということです。作った人はそれで済む国の人なのでしょう。日本でエディタ等を使って HTML を書くような人はシフト JIS や EUC で出力されないと困りますよね。


今回は EUC で出力したいのでどうしたものかと考えました。 HTMLWriter のサブクラスを作って該当の output 関数のみ override して HTMLWriter.output の丸コピーのチョイ直しという手も考えました。しかしそうすると HTMLWriter クラスの replaceEntities という重要なフラグが private なので参照することができません。本来 HTMLWriter が NCR で出力するかネイティブな文字コードで出力するか動作を選択できるようになっているべきなのでしょう。


そこで今回は使い捨てのプログラムだからと割り切り、出力する Writer の方にサブクラスをつくって”&#数字;” が来たらいつも使っているダブルバイトの文字に直すようにすることにしました。


で書いてみたのが、下のクラスです。このクラスのインスタンスを使って HTMLWriter を生成します。先に参照したソースの部分の output 呼び出し3連発に依存する書き方です。使い捨てなのでいいのです。


public class NCR2NativeWriter extends java.io.OutputStreamWriter {
private int count;
private String tempString; // NCR format string
public NCR2NativeWriter(OutputStream out, String s)
throws java.io.UnsupportedEncodingException {
super(out, s);
count = 0;
}
public void write(char[] cbuf, int off, int len)
throws java.io.IOException {
if (off != 0) {
super  .write  (cbuf, off, len);
return;
}
if (count == 0 && len == 2 && cbuf[0] == ‘&’ && cbuf[1] == ‘#’) {
count = 1;
return;
} else if (count == 1) {
int i = 0;
for (; i < len; i++) {
if (cbuf[i] > ‘9’ || cbuf[i] < '0') {
break;
}
}
if (i >= len) {
tempString = new String(cbuf, 0, len);
count = 2;
return;
} else {
super  .write  (“&#”);
}
} else if (count == 2) {
if (len == 1 && cbuf[0] == ‘;’) {
char c[] = new char[1];
c[0] = (char)new Integer(tempString).intValue();

super  .write  (c, 0, 1);
count = 0;
return;
} else {
super  .write  (“&#”);
super  .write  (tempString);
}
}
super  .write  (cbuf, 0, len);
count = 0;
}
}


Java のまとまったプログラムってほとんど書いたことないのでアレですが、いつか誰か(含自分)の参考になればということで。

Metasploit Framework

仕事で IPS の基本動作確認をすることがありました。ウイルス対策ソフトウェア/機器の動作確認には eicar ウイルスという無害な擬似ウイルスファイルを用いる方法があります。同様に IDS/IPS の動作確認には Tomahawk というテストツールがあり、これを用いると攻撃パターンを再現するという方法でサーバを傷つけることなく IDS/IPS の動作確認をすることができます。


がしかし、Tomahawk を用いるためには再生用の攻撃をキャプチャーしたデータを自分で作らなければなりません。どこかに公開されていないかと Web で探したものの、(多分どこかに存在するのでしょうが)データライブラリはおろか、1つのデータも見つけることができませんでした。


そんな時に見つけたのがこの Metasploit Framework です。何というか、この手のツールってここまで進化しているのですね。


Metasploit Framework は exploit code を用いてその動作をテストをするためのフレームワークです。すごいところは「脆弱性をつくコード (exploit) 」と「脆弱性をついた後に流す実行させたいコード (peyload) 」とが分離されていて、任意の組み合わせで攻撃を仕掛けることができることです。peyload にはわかりやすい例で言えば「コマンドの実行」、「ユーザ作成」等があります。攻撃ツールと言えば私の中ではその脆弱性に特化したCプログラムをゴリゴリ書いて攻撃ツールを作るイメージがあったのですが、Metasploit Framework を用いれば exploit と peyload の組み合わせを選んでパラメータを指定するだけで良くツールとしてかなり洗練されています。


Metasploit Framework には perl で書かれた 2.x と ruby で書かれた 3.x があります。2.x についてはこのブログエントリがとっかかりとして参考になると思います。


私は 2.x を用いただけですが、世の中の主流は 3.x になりつつあるようです。3.x の目玉としてテストの自動化機能 (Automated Exploitation) が実装されています。日本語情報ではこちらを参照すると良いでしょう。


本家の blog 記事を読むと Automated Exploitation には2つの手法があることがわかります。


・ on vulnerbility reference (“-x” オプション)
・ on port (“-p” オプション)


“-p” の方は nmap 等でポートスキャンを行って、脆弱性を持つサービスのデフォルトポートと同じポートが開いているターゲットを見つけて exploit code を流します。デフォルトと違うポートを使っている場合は見つけ出すことができないようです。


“-x” の方は Nessus を使って見つかった脆弱性の CVEBugtraq ID 等の脆弱性識別情報に基づき exploit code を選択して流します。


新しい脆弱性に対しての exploit code は Metasploit Framework で使える module の形で公開されることが多いようで、例えば MILW0RM ではほとんどがそうなっているように見えます。


当然ながらこの手のツールは自分の管理している端末に対してのテスト目的のツールなのですが、便利になったというか何というか...