対象サーバで実行中のサービスに対してコマンドを実行し、その応答メッセージ(バナー)からソフトウェアの種類やバージョンを推測する。これにより、対象サーバ上のどの個所が脆弱なのかを知ることができる。
バナー情報を調べるには、先に説明したdig(DNS)やtelnet(DNS以外のほか全般)といったコマンドを用いるとよい。以下は、前述の検出した待機ポートに対してバナーチェックを行った結果である。
telnetでポートにアクセスした際に何の応答もなかった場合は、[Enter]キーを何度か押したり、適当な文字列を入力してみるとよい。場合によっては何らかの応答メッセージを得られるかもしれない。
もちろん不正な文字列などを入力した場合は、不審な痕跡としてサーバ側のログに残ったり、IDSで検知される可能性がある。
22/tcpは通常であればSSHサービスだろう。telnetでアクセスしてみる。
% telnet 対象サーバ 22 |
% telnet 192.168.0.10 22
|
バナー情報からOpenSSHバージョン3.1p1を使用していることが分かる。[Enter]キーを押すとSSHコネクションが切断される。
25/tcpは通常であればSMTPサービスだろう。telnetでアクセスしてみる。
% telnet 対象サーバ 25 |
% telnet 192.168.0.10 25 |
バナー情報からSendmailバージョン8.11.6を使用していることが分かる。また、SendmailのようなSMTPソフトウェアの中には、上記のようにHELPコマンドを実行することで、ソフトウェアのバージョン情報を知ることができる場合もある。なお、quitコマンドの実行はSMTPコネクションの終了を意味する。
53/tcp、53/udpは通常であればDNSサービスだろう。DNSの場合はdigコマンドを使用する。対象DNSソフトウェアがBINDであれば、bindゾーンのCHAOSクラスにversionを問い合わせると、BINDのバージョンが返ってくる場合がある。ただし、この手法が有効なのは、BINDバージョン
4.9.5以上からだ。
% dig @対象ネームサーバ chaos txt version.bind. |
% dig @192.168.0.10 chaos txt version.bind.
|
バナー情報の「ANSWER SECTION」からBIND 9.2.0を使用していると推測できる。
80/tcpは通常であればHTTPサービスだろう。telnetコマンドでアクセスしてみる。telnetによるHTTPコネクション確立後、「HEAD/HTTP/1.0[Enter][Enter]」を実行する。ヘッダ入力の終わりを示すために[Enter]キーを2回押すことが重要。
% telnet 対象サーバ 80 |
% telnet 192.168.0.10 80
|
HTTPサーバの場合、Server:にバージョン情報が含まれる。この対象サーバはApache1.3.23 を使用しており、mod_ssl2.8.7、OpenSSL0.9.6b、DAV1.0.3、PHP4.1.2、mod_perl1.26といったソフトウェア(モジュール)も併用しているようだ。また、使用しているOSはRed Hat Linuxであることも読み取れる。
443/tcpは、通常であればSSL(TLS)で暗号化された通信を行うHTTPサービス(HTTPS)だろう。この場合、OpenSSL付属のopensslコマンドを使うとよい。opensslによりHTTPSコネクションを確立した後は、通常のHTTPサーバと同様のコマンド(HEAD/HTTP/1.0[Enter][Enter])を実行すればよい。
% openssl s_client -connect 対象サーバ:ポート
-state |
% openssl s_client -connect 192.168.0.10:443
-state
|
以上のバナーチェックの結果を踏まえると、対象サーバの構成は以下のとおりとなる。
待機ポート | サービス名 | 使用ソフトウェア | |
---|---|---|---|
22/tcp | ssh | OpenSSH_3.1p1 | |
25/tcp | smtp | Sendmail 8.11.6 | |
53/tcp | domain | BIND 9.2.0 | |
80/tcp | http | Apache/1.3.23(mod_ssl/2.8.7、OpenSSL/0.9.6b、 DAV/1.0.3、PHP/4.1.2、mod_perl/1.26) | |
443/tcp | https | Apache/1.3.23(mod_ssl/2.8.7、OpenSSL/0.9.6b、DAV/1.0.3、PHP/4.1.2、mod_perl/1.26) | |
今回は行わなかったが、まれにBINDのような特殊な問い合わせ方法でしかバナーを得られない場合もある。その一例を以下に示す。
111/tcp、111/udp(sunrpc)
111/tcp、111/udpがオープンしていた場合、rpcinfoコマンドを使用してRPC情報を得ることが可能だ。
% rpcinfo -p 対象サーバ |
% rpcinfo -p 192.168.0.10 |
111/tcp、111/udpでportmapperが、32768/tcp、32768/udpでstatus(NFSなどで用いらるファイル状態監視)が動作していることが分かる。なお、programに表示されている内容は、RPC番号(/etc/rpcファイル参照)を意味している。
161/udp(SNMP)
161/udpがオープンしていた場合は、net-snmp(旧:ucd-snmp)に付属するsnmpwalkコマンドを実行してSNMP MIB情報を入手するとよい。MIBには、対象サーバのシステム情報など有用な情報が含まれている。
バージョン5.xの場合
% snmpwalk -v SNMPバージョン -c コミュニティ名 対象サーバ |
バージョン4.xの場合
% snmpwalk -v SNMPバージョン 対象サーバ コミュニティ名 |
% snmpwalk -v 2c -c public 192.168.0.10 |
上記より、対象サーバはLinux Kernel 2.4.18-3を使用していることが分かる。
2049/tcp、2049/udp(NFS)
2049/tcp、2049/udpがオープンしていた場合、showmountコマンドを使用してNFSのエクスポート情報を得ることが可能だ。
% showmount -e 対象サーバ |
% showmount -e 192.168.0.10 |
上記は、192.168.0.10上の/homeディレクトリを、192.168.0.0/24に対してNFSエクスポート(NFSマウント許可)している。
5680/tcp(Canna)
5680/tcpがオープンしていた場合は、Cannaサービス(日本語仮名漢字変換システム)が起動している可能性が高い。その場合は、Cannaソフトウェア付属のcannastatコマンドを使用してCannaのバージョン情報を調べる。
% cannastat -cs 対象サーバ |
% cannastat -cs 192.168.0.10 |
Cannaバージョン3.5を使用していることが分かる。
一般的に予想される以外のコマンドを実行するとサーバから何らかのエラーメッセージが返ってくる場合があるが、そのエラーメッセージの中には、攻撃者に役立つ情報が隠されていることもある。
存在しないWebページ
対象のWebサーバが出力するエラーメッセージから、Webサーバの種類やバージョン情報を知ることができる。例えばApacheの場合、ページの行末(フッタ)にWebサーバの種類を示すシグネチャが出力される場合がある。その例を画面1に示す。
エラーメールのヘッダ
バナーからメールサーバのバージョンを読み取れなかった場合は、対象メールサーバに対して、存在しないと思われるメールアドレスあてにメールを送信してみるとよい。ほとんどの場合がメールサーバから送信者あてにエラーメールが返信されるだろう。そして、そのエラーメールのヘッダのReceived: には、メールサーバで使用しているソフトウェア名やバージョン情報、さらにはどういった経路でそのメールが配送されたのかを特定することもできる。
以下の例は、192.168.0.10に対して存在しないあて先foo@example.co.jpにメールを送った結果、返信されたエラーメールに記述されたReceived:ヘッダの一部である。
Received: from ns.example.co.jp([192.168.0.10]) |
上記のReceived:ヘッダから読み取れるのは、ns.example.co.jp(192.168.0.10)が 8.11.6(おそらくはSendmail)のMTA(Mail Tranfer Agent)を使用しているということだ。また、ns.example.co.jpにexample.co.jpあてのメールを送ると、いったん内部のpop.example.co.jp(10.0.16.2)に送られるようだ(*2)。
対象サーバが使用するOSをより正確に特定する方法として、対象サーバのTCP/IPにおける通信の振舞の違いにより判断するという手法がある。この手法を用いたツールとしては、ポートスキャンツールのNmapがお勧めだ(*3)。
# nmap -O 対象サーバ |
# nmap -O 192.168.0.10 Nmap
run completed -- 1 IP addresses (1 hosts up) scanned in 162 seconds |
192.168.0.10はLinux Kernel 2.4.0-2.5.20であると推測した。実際のバージョンも 2.4.18-3 であることから、どうやら推測は当たっているようだ。
以上、攻撃者が行うであろう事前調査の手法をいくつか紹介した。今回入手できたた内容をまとめると、対象サーバのサービス構成は、最終的に以下のとおりであると推測される。
待機ポート | サービス名 | 使用ソフトウェア | |
---|---|---|---|
22/tcp | ssh | OpenSSH_3.1p1 | |
25/tcp | smtp | Sendmail 8.11.6 | |
53/tcp | domain | BIND 9.2.0 | |
80/tcp | http | Apache/1.3.23(mod_ssl/2.8.7、OpenSSL/0.9.6b、DAV/1.0.3、PHP/4.1.2、mod_perl/1.26) | |
443/tcp | https | Apache/1.3.23(mod_ssl/2.8.7、OpenSSL/0.9.6b、DAV/1.0.3、PHP/4.1.2、mod_perl/1.26) | |
今回は、攻撃者側から見た「事前調査」を解説した。次回は、攻撃者が利用できる情報をいかにして与えないようにするかといった対策法を紹介する。
主に、不正アクセス監視サービス、セキュリティ検査、セキュリティポリシー策定支援などのサービス提供している。また、セキュリティに関する教育サービスも実施中。
木村 靖(きむら やすし)
セキュリティコンサルタントとして、不正アクセス監視やセキュリティ検査 などに従事している。金融機関、官公庁、大手製造業などへのセキュリティシ ステムの導入、セキュリティ検査などの実績を持つ。
Copyright © ITmedia, Inc. All Rights Reserved.