そのほかのバックドアの事例
先に紹介したバックドアの手法は、あくまで一例にすぎない。攻撃者は、与えられた環境下の中で、さまざまな手法によりバックドアを仕掛けるだろう。ここでは、よく知られている手法を紹介する。
netcatを使う
hobbit氏が作成したnetcatは、対象サーバとTCPまたはUDPでネットワーク接続して、データを読み書きするためのバックエンドツールだ。あるときはポートスキャンツール、またあるときはサービスデーモンとして特定ポートで待機(listen)させることが可能な、とても便利なネットワークツールの1つだ。ここではサービスデーモンとして待機させる方法でバックドアを仕掛ける。
なお、netcatには、UNIX版のほかにWindows版が提供されており、Windows版でもUNIX版と同等のオプションを指定して実行することが可能となっている。
- 例:netcatを使用して、7777/tcpにアクセスすると/bin/shが実行されるようなバックドアを作る
1.netcatを送り込む
まずnetcat 1.10(nc110.tgz)をダウンロードし対象サーバ上に送る必要がある。netcatはバイナリファイルで提供されているので、ftpなどを使って対象サーバにファイル転送すればよい。*3
なお、ftpなどのファイル転送が行えない環境下では、バイナリファイルのサイズがそれほど大きくなければuuencode/uudecodeを用いた転送を行うという方法もある。
uuencode/uudecodeは、ASCII以外のデータ(バイナリファイル)を受渡しするための手段の1つとして、NetNews(インターネット上の電子掲示板)やMIMEを使用しないメール送受信でよく利用されている。
2.netcatのコンパイル (対象サーバの環境)
netcat 1.10をインストールする。デフォルトでは-eオプション(コマンド実行)が無効となっているので、コンパイル時にGAPING_SECURITY_HOLE変数をセットする必要がある。また、Red Hat Linux 7.3の場合、いくつかパッチを適用しないと、netcatは正常にコンパイルされない。そこで、Red Hatが提供するnetcatのRPM版からパッチファイルを抜き出したものを、GAPING_SECURITY_HOLE分と合わせてパッチ(nc110-linux.diff)として適用することにした。
/tmp以下に、nc110.tgzおよびnc110-linux.diffが存在することを前提として説明する。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
/tmp/ncにnetcatのソースコードが展開される。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
実行形式のバイナリファイルncが生成される。
3.netcat(nc)の実行 (対象サーバの環境)
netcatを7777/tcpで待機させる。また、7777/tcpのコネクション要求時に実行されるコマンドは/bin/shとする。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
4.バックドアの確認 (攻撃者の環境)
確認もnetcatを使う。攻撃者の環境より以下を実行する。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
コマンドプロンプトは返ってこないが、対象サーバ上のコマンドは実行できる状態になっている。上記はhostnameとidコマンドの実行した様子を示している。
inetd(xinetd)を使う
inetdは、古くからUNIXで利用されているインターネットスーパーサーバと呼ばれるプログラムだ。その役割は、特定ポートに対するコネクション要求を一手に引き受け、そのポートに応じたサービスデーモンを起動することにある。
しばしば、ftpやtelnetといった頻繁に使用されないデーモンプロセス*4の多くは、このinetd経由で起動される。またxinetdは、inetdの機能拡張版として、本稿の対象サーバであるRed Hat Linux 7.3では、inetdに代わり標準でインストールされている。
逆に sendmail(SMTP)、BIND(DNS)、Apache(HTTP)といった、処理要求の多いサービスに関しては、inetd経由ではなく単独で動作させるのが一般的だ。
- 例:inetd(xinetd)を使用して、8888/tcpにアクセスすると/bin/shが実行されるようなバックドアを作る
1.一時ファイル(/tmp/.inetd.conf)を作る
対象サーバにて、inetd(xinetd)の定義ファイルを作成する。
- inetdの場合
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
- xinetdの場合
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
なお、実行するシェルがbashの場合は、「/bin/sh --noediting -i」とした方がよいだろう。
2.inetd(xinetd)を起動
対象サーバにて、作成した設定ファイル(/tmp/.inetd.conf)を指定して、inetd(xinetd)のデーモンプロセスを起動する。
- inetdの場合
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
- xinetdの場合
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
3.バックドアの確認 (攻撃者の環境)
攻撃者の環境よりnetcatを使用して接続し、対象サーバ上のコマンドを実行できるかどうかを確認する。以下では、バックドアで接続後、対象サーバ上でidコマンドを実行した様子を示している。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
rootkit (adore)
adoreは、Stealth氏が作成したrootkitプログラムの一種で、Linux版とFreeBSD版が存在する。adoreの特徴としては、従来の特定ファイル(プログラム)を改ざんするタイプのものとは異なり、LKM(Loadable Kernel Module)を利用したバックドアプログラムであることが挙げられる。
従来型 rootkit | ls、ps、netstatなどのファイル(コマンド)を直接改ざんし、特定ファイルやプロセスなどを隠ぺい。ほかにはlrkやt0rnがよく知られている。 |
---|---|
LKM型 rootkit | ls、ps、netstatなどのファイル(コマンド)を直接改ざんせずに、カーネルレベルで特定ファイルやプロセスなどを隠ぺい。ほかにはknarkなどがよく知られている。 |
LKMは、最近の多くのUNIXで取り込まれており、必要に応じてさまざまな機能をモジュールとしてカーネルに取り込んだり(ロード)、取り外したり(アンロード)することのできる機能である。ここで紹介するRed Hat Linux 7.3 (kernel 2.4)でもLKMが採用されている。
1.adoreコンパイルの前に
adoreをコンパイルするには、カーネルのソースコード(kernel-source)が必要になる。/usr/src/linux(/usr/src/linux-2.4)が存在しない場合は、現行カーネルに該当するソースコードを事前に準備しておく。
2.adoreのコンパイル
adore 0.42を展開すると、以下のファイル/ディレクトリで構成されることが分かる。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
続いて./configureを実行する。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
ここで指定するパスワードは、adore本体と操作プログラムのava間の認証で用いられる。
Makefileが生成される。また、必要に応じてadore.hをエディタで編集する。ここでは6000/tcp(x11)の通信を隠すために、以下のとおりadore.hを修正した。
・ 変更前
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
・変更後
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
カンマ(,)で区切ることで複数のポートやサービス名を指定できるが、最後は必ずNULLで終了すること。
adore.hを修正したら、makeコマンドを実行してコンパイルする。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
3.adoreモジュールのロード
生成したadore(adore.o)モジュールをカーネルにロードするには、シェルスクリプトのstartadoreを実行する。なお、startadoreでは、以下の3つのコマンドが実行されているだけである。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
insmodでadore.oをロードした後に、insmod cleaner.oでロードしたadore.oを隠ぺいし、隠ぺいに用いたcleaner.oをrmmodでアンロードしている。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
4.確認
startadore実行後、lsmodでロードされているモジュールを確認しても、adore.oは表示されない。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
また、この時点でポート番号6000/tcp(x11)の通信が表示されなくなる。netstat --inet (or netstat -n --inet)で確認してみる。
・ 隠ぺい前
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
・隠ぺい後
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
192.168.0.10 (32785/tcp)から172.16.10.10(6000/tcp)への通信が表示されなくなった。また、adore.oをロードした時点で、adoreをコンパイルしたファイルやディレクトリ(/tmp/adore以下)も隠ぺいされてしまう。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
lsコマンドで/tmp以下を一覧表示してもadoreディレクトリは見当たらないが、隠ぺいされているだけで、実際には存在している。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
5、adoreそのほか
adoreには、avaというadoreを操作するためのプログラムが用意されており、特定ファイルやプロセスの表示を隠ぺいすることができる。以下はそのavaの使用方法だ。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
オプション | 用途 | |
---|---|---|
h | 指定したファイルの隠ぺい | |
u | 指定したファイルの隠ぺいを解除 | |
r | 指定したコマンドをroot権限で実行 | |
R | 指定したプロセスID(PID)を永久的に隠ぺい | |
U | adoreのアンインストール | |
i | 指定したPIDの隠ぺい | |
v | 指定したPIDの隠ぺいを解除 | |
表1 avaのオプション |
例:PID 16863 (emacsのプロセスID)を隠ぺいする
1.実行前の確認
psコマンドで、PID 16863のemacsプロセスが表示されていることを確認。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
2.avaの実行
avaのiオプションでPID 16863のプロセスを隠す。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
3.実行後の確認
実行前と同様にpsコマンドで確認しても、PID 16863のプロセスは表示されなくなった(隠ぺいに成功)。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
4.元に戻す
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
avaのvオプションでプロセスID 16863の隠ぺいを解除すると、psコマンドでemacsプロセスが再び表示されるようになった。
次回は、今回紹介したバックドアへの対処方法と、侵入されてしまった場合の事後調査の方法を説明する。
筆者紹介
主に、不正アクセス監視サービス、セキュリティ検査、セキュリティポリシー策定支援などのサービス提供している。また、セキュリティに関する教育サービスも実施中。
木村 靖(きむら やすし)
セキュリティコンサルタントとして、不正アクセス監視やセキュリティ検査 などに従事している。金融機関、官公庁、大手製造業などへのセキュリティシ ステムの導入、セキュリティ検査などの実績を持つ。
Copyright © ITmedia, Inc. All Rights Reserved.