エンタープライズ:特集 2003/06/10 15:23:00 更新

rootkitによるハッキングとその防御
第5回 kernel rootkitの概要 (3/4)

トロイの木馬としてのローダブルカーネルモジュール

 では実際に、サンプルとしてトロイの木馬のローダブルカーネルモジュールである「LKM0x82」をロードして、これまで紹介してきたような検出ツールを単純に利用した場合にトロイによる改ざんを発見できるのか確認してみよう。

 ここで紹介しているLKM0x82は、ユーザー権限の引き上げ(rootアクセス)、ディレクトリ、ファイル、プロセス、接続元IPアドレスの隠蔽、そしてトロイの木馬自身の隠蔽(lsmodコマンドでリスト表示されない)が可能になっている。今回取り上げているトロイの木馬は、前述したLKMのサンプルと同じように、「mkdir」や「cd」といった、ごく普通に利用するコマンドを介して実行できるようになっている。今回のテストはRedhat Linux 7.1上で行った。

■LKMのロード

 侵入したと仮定したシステムで、LKMのトロイの木馬をロードする。LKMは実行中のカーネルにロードされ、カーネルの一部となり動作する。今回利用しているトロイの木馬はロードされた時点から、lsmodコマンドではリスト表示されない。このため、lsmodコマンドでは検知することができない。

# lsmod←トロイの木馬をロードする前に現在ロードされているモジュールを表示
Module Size Used by
autofs 11264 1 (autoclean)
sis900 11264 1 (autoclean)
usb-uhci 20720 0 (unused)
usbcore 49664 1 [usb-uhci]

# insmod 0x82-lkm.o←トロイの木馬のモジュールをロード

# lsmod←再度lsmodコマンドでロードされているモジュールを確認、上記と変化はなく、トロイの木馬は表示されていない(隠蔽されている)
Module Size Used by
autofs 11264 1 (autoclean)
sis900 11264 1 (autoclean)
usb-uhci 20720 0 (unused)
usbcore 49664 1 [usb-uhci]

■rootアクセスの取得

 このLKMがロードされた状態では、どのユーザーからでもスーパーユーザーの権限を取得することができるようになる。

 ではまず、一般ユーザーとしてログインしてから、rootアクセスを実現するまでの手順を見てみよう。

$ id←現在のIDを確認
uid=502(hoge) gid=502(hoge) groups=502(hoge)

$ mkdir x82-dir←ユーザー権限の引き上げを行う

$ id←再度IDを確認すると権限が昇格している
uid=0(root) gid=0(root) euid=502(hoge) groups=502(hoge)

■ファイルの隠蔽

 特定のファイルを隠蔽する。lsコマンドやcatコマンドからも、そのファイルの存在を隠蔽する。

 まずはテストファイルを作成して、ファイルの隠蔽を行う。

$ cd /tmp
$ touch tmpfile←サンプルファイルtmpfileを作成
$ ls
tmpfile←ファイルの確認

$ cd x82-file-tmpfile←ファイルの隠蔽を行う
bash: cd: x82: No such file or directory

$ cat tmpfile←tmpfileを開こうとしても、ファイルがないというエラーになる
cat: tmpfile: そのようなファイルやディレクトリはありません

 ここで、トロイの木馬をアンロードしてディレクトリを再確認してみる。

# rmmod 0x82-lkm←トロイの木馬をアンロード
# ls
tmpfile←ファイルは存在している

■プロセスの隠蔽

 さらに、指定したプロセスを隠蔽して、クラッキング行為を分からないようにする。

$ ps←現在のプロセス
PID TTY TIME CMD
1414 pts/0 00:00:00 bash
5718 pts/0 00:00:00 ps

$ cd x82-proc-bash←bashを隠蔽する
bash: cd: x82: No such file or directory

$ ps←再度確認。bashが表示されていないことが分かる
PID TTY TIME CMD
5723 pts/0 00:00:00 ps

■特定のIPアドレスの隠蔽

 特定のIPアドレス(クラッカーのIPアドレス)を隠蔽する。ここではまず、netstatで現在の接続を確認してから、接続されているIPアドレス=192.168.1.5を隠蔽している。IPアドレスはすべてドットに置き換えられる。

$ netstat -an ←netstatで現在の接続を確認
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 192.168.1.17:22         192.168.1.5:3345        ESTABLISHED
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  8      [ ]         DGRAM                    707    /dev/log
unix  2      [ ]         DGRAM                    1732
unix  2      [ ]         DGRAM                    900
unix  2      [ ]         DGRAM                    883
unix  2      [ ]         DGRAM                    816
unix  2      [ ]         DGRAM                    781
unix  2      [ ]         DGRAM                    716
unix  2      [ ]         STREAM     CONNECTED     461
$ cd x82-ip-192.168.1.5←192.168.1.5からの接続を隠蔽
bash: cd: x82: No such file or directory
$ netstat -an←netstatで再度接続を確認、クラッカーのIPアドレスは表示されない
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 192.168.1.17:22         ...........:3345        ESTABLISHED
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  8      [ ]         DGRAM                    707    /dev/log
unix  2      [ ]         DGRAM                    1732
unix  2      [ ]         DGRAM                    900
unix  2      [ ]         DGRAM                    883
unix  2      [ ]         DGRAM                    816
unix  2      [ ]         DGRAM                    781
unix  2      [ ]         DGRAM                    716
unix  2      [ ]         STREAM     CONNECTED     461
$ w←wコマンドで確認
  4:48am  up 11:37,  2 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU  WHAT
root     tty1     -                 3:56am 39:35   0.02s  0.02s  -bash
hoge     pts/0    ...........       3:57am  0.00s  0.07s  0.01s  w
$ last←lastコマンドで確認
hoge     pts/0        ...........      Sat May 10 03:57   still logged in
hoge     pts/0        ...........      Sat May 10 03:56 - 03:56  (00:00)
root     tty1                          Sat May 10 03:56   still logged in
hoge     pts/0        ...........      Sat May 10 03:55 - 03:55  (00:00)
hoge     pts/0        ...........      Sat May 10 03:55 - 03:55  (00:00)
hoge     pts/0        ...........      Sat May 10 03:48 - 03:55  (00:06)
bonzo    pts/0        ...........      Sat May 10 03:47 - 03:48  (00:01)
hoge     pts/1        ...........      Sat May 10 03:43 - 03:46  (00:03)
bonzo    pts/0        ...........      Sat May 10 03:42 - 03:43  (00:01)
hoge     pts/0        ...........      Sat May 10 03:41 - 03:42  (00:00)
hoge     pts/0        ...........      Sat May 10 03:16 - 03:41  (00:24)
hoge     pts/0        ...........      Fri May  9 17:12 - 21:05  (03:52)
$ lastlog←lastlogコマンドで確認
Username         Port     From             Latest
root             tty1                      土  5月 10 03:56:12 +0900 2003
bin                                        **Never logged in**
daemon                                     **Never logged in**
adm                                        **Never logged in**
sync                                       **Never logged in**
shutdown                                   **Never logged in**
halt                                       **Never logged in**
mail                                       **Never logged in**
news                                       **Never logged in**
uucp                                       **Never logged in**
operator                                   **Never logged in**
games                                      **Never logged in**
gopher                                     **Never logged in**
ftp                                        **Never logged in**
nobody                                     **Never logged in**
nscd                                       **Never logged in**
mailnull                                   **Never logged in**
ident                                      **Never logged in**
rpc                                        **Never logged in**
rpcuser                                    **Never logged in**
hoge             pts/0    ...........      土  5月 10 03:57:04 +0900 2003

■モジュールの隠蔽

 最後に、ロードされているLKMを隠蔽する。

# lsmod←現在のモジュールを表示
Module Size Used by
autofs 11264 1 (autoclean)
sis900 11264 1 (autoclean)
usb-uhci 20720 0 (unused)
usbcore 49664 1 [usb-uhci]

# cd x82-mod-sis900←ネットワークカードのモジュールを隠蔽してみる
bash: cd: x82: No such file or directory

# lsmod←隠蔽後のモジュールを表示、ネットワークカードのモジュールはない。ただし、トロイの木馬自身のモジュールが表示されている
Module Size Used by
0x82-lkm 5728 0 (unused)←トロイの木馬のモジュール
autofs 11264 1 (autoclean)
usb-uhci 20720 0 (unused)
usbcore 49664 1 [usb-uhci]

 これで、トロイの木馬のロードおよび隠蔽行為が完了したことになる。

前のページ | 1 2 3 4 | 次のページ

[TTS,ITmedia]