chkrootkit CD の作成と使い方

Last Up : 2003/10/17 (森川靖大)  <<  Orginal : 2003/10/05 (森川 靖大)

この文書は、chkrootkit というツールを用い、 ホスト内の rootkit を検出するためのマニュアルである。

[chkrootkit とは?]

( Checkrootkit -- CERTCC-KR [CERT Coordination Center KOREA] からの抜粋)

chkrootkitとはシステムへルートキット (rootkit) が設置されているのかを簡単にチェックできるプログラムで、 一般的にルートキットだけでなく、カーネル基盤のルートキット、 worm までも探知が可能である。

[rootkit (ルートキット) とは?]

( Checkrootkit -- CERTCC-KR [CERT Coordination Center KOREA] からの抜粋)

攻撃者がハッキングに成功した後、 次に侵入しやすくするためバックドア及びトロイの木馬プログラムを設置するがこのようなプログラムをルートキットと言う。

ルートキットに含まれるプログラムとしては ps、ls、netstat、login 等のシステムプログラムがあるが、 このようなルートキットはシステムへ元々あったプログラムと入れ替えられ管理者がシステムを点検しても異常が内容に見せて攻撃者の行動を隠したりする。 例えば ps、lsを入れ替えて攻撃者が実行したプロセスや設置したファイルを確認できないようにするのだ。

最近はこのような一般的なルートキットが管理者によって簡単に探知できるので自分の痕跡をより完璧に隠すためカーネル基盤のルートキットを設置するが、 カーネル基盤のルートキットは現在実行されてあるカーネルに攻撃者が作ったカーネルモジュールを積載してシステム関数の正常的な実行を変える方法である。

以下では、chkrootkit 本体と chkrootkit が必要とするいくつかのプログラムを 1枚の Floppy Disk (または CD) に格納し、 比較的信頼できる rootkit チェック Floppy Disk (CD) を作成する。

そして、その Floppy Disk を用いてチェックを行う。

なお, 手軽な (必要最低限な準備でできる) チェックの方法は広く Web に載っている。 例えば、 Checkrootkit -- CERTCC-KR [CERT Coordination Center KOREA] 等を参照すると良いだろう。



1. 準備

以下のものを準備する。

なお, 上記のマシンは以下の条件を満たしている必要がある。

さらに、以下のものを用意してもらいたい。

以下では Floppy Disk を使うことを仮定する。 CD-R へのデータを保存する具体的な方法はここでは触れないので、 必要な場合は別途情報を集めてもらいたい。

[1.1] クリーンなシステムの必要性

chkrootkit はダウンロードしてコンパイルし、 実行するだけでルートキットのチェックが可能だが、 いくつかのシステムコマンドに依存する。 (また、 chkrootkit をコンパイルする際にもシステム上の gcc に依存する)

よって、それらのコマンドまでが汚染されていると、 チェックの結果そのものが信用できなくなる。 多少面倒ではあるが、 クリーンなシステムコマンドを利用すると rootkit チェックの信頼度が増すだろう。

[1.2] ディスクドライブの必要性

以下ではコンパイルした chkrootkit とシステムコマンドを用意し、 それを外部メディア (FDD or CD-R) に書き出す。 (さらにそのメディアはそれ以上書き込みできなくする)。

結果、そのディスク上のファイルのみで chkrootkit を動かすことができ、さらに汚染されることが無いようにできる。

[1.3] ネットワークの必要性

chkrootkit のソースを、他の PC を経由せずに直接手に入れるため。

[1.4] vfat の必要性

実は vfat でなくてもよい。 Floppy Disk など、ext2 形式でフォーマットして用いた方が、 確実に UNIX 系のマシンから読むことができる。 だが、以下では (後に Windows マシンで Floppy Disk からデータを CD-R に移すことも考えて) vfat を用いる。

2. クリーンなシステムの用意

クリーンなシステムコマンドを取得するうえで一番手っ取り早いのは、 UNIX 系 OS を新規インストールし、 クリーンなシステムを作ることだろう。 (何度かインストール経験のあるマシンにインストールできれば、 時間もより短縮できるだろう)

ただし必ずこの方法でならないわけではない。 インストール後全くネットワークに繋いでいないマシンも、 (自ら以外が絶対に操作していないのであれば) クリーンな可能性が高い。

お勧めするのは前者だが、時間が無ければ 適宜クリーンな可能性が高いマシンを用意して頂きたい。

くれぐれもチェックしようとするマシンで以下の方法を 試さないようにして頂きたい。 そうするぐらいなら上記の手軽にできるチェック方法で さっくりチェックをおこなった方が良い。

[2.1] ディスクドライブを利用可能に

適宜利用可能なディスクドライブを認識できるようにしてもらいたい。 (以下では、既に Floppy Disk Drive が可能であるとして解説する)

[2.2] ネットワークを利用可能に

適宜利用可能なネットワークデバイスを認識できるようにし、 利用可能な IP アドレス (その他のネットワークパラメータ) を設定してネットワーク接続可能にしてもらいたい。 (以下では、既にネットワークには接続可能であるとして解説する)

なお、以下の作業は全てこのクリーン (と思われる) マシン上でおこなう。

3. chkrootkit の最新版ソースを用意

chkrootkit の最新版をダウンロードする。 chkrootkit の本家である以下のサイトからダウンロードする。

chkrootkit -- locally checks for signs of a rootkit

最新版は Latest Source tarball からダウンロードできる。

ダウンロードの手段は ftp でもブラウザ (X を上げるのは面倒で あろうから, lynx や w3m などで) でも構わない。 (言うまでもないか…?)

4. chkrootkit の展開とコンパイル

chkrootkit.tar.gz を手に入れたら、 まずそれを展開する。

$ tar xvfz chkrootkit.tar.gz [Enter]

すると、 chkrootkit-*.** ディレクトリ (*.** は現在最新のバージョンナンバー) が生成されるのでそのディレクトリに移動する。

$ cd chkrootkit-*.** [Enter]

そして、make することでコンパイルが完了する。

$ make sence [Enter]
gcc -DHAVE_LASTLOG_H -o chklastlog chklastlog.c
gcc -DHAVE_LASTLOG_H -o chkwtmp chkwtmp.c
gcc -DHAVE_LASTLOG_H -o ifpromisc ifpromisc.c
gcc -o chkproc chkproc.c
gcc -o chkdirs chkdirs.c
gcc -o check_wtmpx check_wtmpx.c
gcc -static -o strings strings.c

これでコンパイル完了である。 (上記のメッセージ通り。 コンパイルには gcc が利用される)。

5. 必要なコマンドの集積

必要なコマンドは (chkrootkit-0.49 では) 以下のものである。

awk、cut、echo、egrep、find、head、id、ls、 netstat、ps、strings、sed、uname

ほとんどのコマンドは OS インストール時にインストール されていると思うが、 足りないものはインストールをおこなって欲しい。 (ちなみに、Debian 3.0 では strings は binutils パッケージをインストールしなければシステムに組み込まれない)

最新のバージョンの chkrootkit において利用されている システムコマンドは以下のサイトを参照して頂きたい。

chkrootkit -- locally checks for signs of a rootkit
       (FAQ 4. Which commands does chkrootkit use?)

他にも、(先ほどコンパイルしてできた) chkroot (シェルスクリプト) のソースの cmdlist 変数にも必要なコマンドが一覧されている。

これらのコマンドを一ヶ所にまとめておく。 ここでは cmd ディレクトリを作成し、 その中にコマンドを一通りコピーしておく。

$ mkdir cmd [Enter]
$ cp -p `which awk cut echo egrep find head id ls / [Enter]
         netstat ps sed strings uname` ./cmd/
[Enter]

(which コマンドでコマンドの場所一覧を取得し、 それをコピーしている)

6. 外部メディアへコピー

コンパイル済の chkrootkit と システムコマンド集を外部メディア (ここでは Flopy Disk を考える) にコピーする。

なお、大抵のブランク Floppy Disk をデフォルトでマウントすると、 ファイルシステムが msdos 形式になってしまう (この形式だとファイル名が 8 文字以内に制限され、 chkrootkit が正常に動かない) ので、 vfat 形式でマウントする。 (ext2 形式にしたい場合は 下記参照)

$ su [Enter]
# mount -t vfat /dev/fd0 /floppy [Enter]

(ここでは Floppy Disk Drive のデバイスを /dev/fd0 としているが、システムによって違うので適宜変更すること。 dmesg などのメッセージが参考になるだろう。)

マウントが完了したらファイルをコピーする。 (chkrootkit と システムコマンド集はあわせてもせいぜい 1 MB なので、旧来の Floppy Disk にも容易に入る。)

$ su [Enter]
# cp -rp chkrootkit-*.** /floppy/ [Enter]
# cp -rp cmd /floppy/ [Enter]

書き込みが終了したらアンマウントする。 (Floppy Disk であったなら、メディアを取り出した後、 書き込み禁止にする)

「どうせなら、コピーの際に tar などで圧縮すれば良いのに」 という意見もあると思うが、ここでは敢えてそのままコピーした。 それは、書き込み不能なメディア上の実行ファイルを そのまま実行したかったからである。 もしも圧縮をかけると、 一旦展開して HD 上にコピーしてから実行せねばならなくなる。 (すると、手間がかかる上、信頼性が多少なりとも落ちる)。 そのようなステップを省こうというのが意図である。

[6.a] File System を "ext2" にしたい場合

以下のように fdformat コマンドと mkfs コマンドを用いる。

$ su [Enter]
# fdformat /dev/fd0H1440 [Enter]
# mkfs -t ext2 -m 0 /dev/fd0H1440 [Enter]

このようにしておけば、 vfat をサポートしていないマシンでも利用することができるようになる。

・参考 >> ZDNet エンタープライズ: Linux Tips : [フロッピーをext2でフォーマットしたい]

7. テスト

実際に chkrootkit が動くのかをテストする。 先ほどメディアを取り出したのであれば、 再びメディアを挿入し、マウントしておく。

chkrootkit-*.** ディレクトリまで移動し,

$ cd /floppy/chkrootkit-*.** [Enter]

以下のコマンドを入力する。 (-p オプションはシステムコマンドへのパスを指定するためのものである)。 なお、root でなければこのコマンドは実行できないので注意。

$ su [Enter]
# ./chkrootkit -p ../cmd [Enter]
ROOTDIR is `/'
Checking `amd'... not found
Checking `basename'... not infected

                :

Checking `scalper'... not infected
Checking `slapper'... not infected
Checking `z2'... nothing deleted

無事、実行できたようなら chkrootkit メディアの完成である。


8. 実際に使ってみる.

では、このメディアを実際に使って検査してみる。

このメディアを検査したいマシンに挿入し、マウントする。

# mount /floppy [Enter]

もしも mount が改竄されていれば全てはおじゃんである。 …が、逆にいえば, 正常にマウントできなければそれで不正侵入は確実なので目的は達せられるとも言える。 (mount だけを改竄し、Floppy Disk 内の chkrootkit の振舞を制御し、まるで侵入されていないかのように表示させるというのは, 実際問題として難しいであろう)

そして実行する。

$ su [Enter]
# cd /floppy/chkrootkit-*.** [Enter]
# ./chkrootkit -p ../cmd [Enter]
ROOTDIR is `/'
Checking `amd'... not found
Checking `basename'... not infected

                :

Checking `scalper'... not infected
Checking `slapper'... not infected
Checking `z2'... nothing deleted

ここでも、システム上の su コマンドが使用されている。 …が、chrootkit の出力を完全に偽装するように改竄される可能性は低いと思われるので目をつぶる。 (つまり、完全に安全性をチェックすることはできない)。

chkrootkitで点検した時に出るメッセージは以下のとおり。

INFECTED ルートキットで変更された可能性があることを意味する
not infected ルートキットの痕跡が発見されない
not tested 点検ができなかった
not found 点検したcommandがない時

なお、問題があったところだけ表示させるのであれば -q オプションをつけると良いだろう。

# ./chkrootkit -q -p ../cmd [Enter]
Checking `du'... INFECTED
Checking `su'... INFECTED
Checking `lkm'... You have 35 process hidden for ps command
Warning: Possible LKM Trojan installed

(上記の例では、du、su コマンドが改竄された可能性があり、 lkm-rootkit によって 35 のプロセスが ps コマンドの際に表示されないようになっていることが示されている。)

9. 注意

下記の参考資料中でも述べられていることだが、 chkrootkit は (当然ながら) 完全なツールではない。 乗っ取りの際におこなわれる典型的なコマンドの改竄方法や、 既に (広く?) 知られている rootkit の挙動から検出をおこなっているため、 最新の rootkit や新しい発想から生まれた改竄方法には対応しきれない。

最新版の chkrootkit によってチェック可能なコマンドや Worm 等は以下のサイトに載っているので参照のこと。

chkrootkit -- locally checks for signs of a rootkit

しかし、専攻サーバ管理者の平均的なハッキングの技術力と、 費用 対 効果を考えれば、 この chkrootkit はかなり有効なツールと言えるだろう。

使う場面はあまり多くないかも知れないが、 「あれ? もしや? 大丈夫かな?」と思ったら、 とりあえずこのツールを使ってチェックしてみるのをお勧めする。


◆ 参考文献


Copyright © 2003 epcore