[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[port139:00547] rootkit に関するメモβ 2



Port139 伊原です。

今日までに得られた情報を加えてみました。
#最終版では情報いただいた方々のお名前を入れさせてください。


□実行ファイルを変更する rootkit

rootkit とは、ps や ls 、netstat などのコマンド ファイルを悪意のある
ものに置き換え、悪意のあるファイルやプロセス、通信を表示させないとい
った目的を持ったツール群のことを指す。
rootkit は基本的にシステムの実行ファイルを悪意のあるプログラムへ置き
かえるため、これらのファイルのハッシュ値(MD5 が一般的に利用される)が
正常な状態のハッシュ値と同じかどうかを md5sum や RPM コマンドなどを使
い確認することで、rootkit の混入を確認することができる。
システムの正常な状態でのハッシュ値を保存し、現在の状態とを比較する専
用のツールとしては Tripwire などの整合性チェックツールもある。

また、一般的にシステムに対する侵害の有無を確認する際には、システム上
にある実行ファイルが改ざんされていることを想定して、FD や CD-ROM など
に保存された安全と確認できている実行ファイルを利用してシステムの状態
を確認することが推奨されている。
FD や CD-ROM などに置かれた安全なファイルを利用することで、システムの
正確な情報を得ることができ、システムに存在するバックドアなどを検出す
ることができる。
なお、rootkit を検出する為に、chkrootkit などの専用ツールも存在する。

□Loadable Kernel Module(LKM) rootkit

単なる rootkit が ps や ls といったコマンドファイルを置き換えるのに
対して、LKM rootkit は ls や ps といったコマンドファイルの置き換えを
基本的に必要としない。
LKM rootkit はカーネルモードで動作する為、ユーザーモードで実行される
セキュリティ ツールなどからのアクセスをカーネルレベルで横取りすること
で、悪意のあるファイルやプロセス、通信を隠蔽することができる。

例えば、バックドアとして仕掛けられたプログラムのファイルやプロセスを
 ls や ps コマンドでは表示しないといったことが可能になる。
ファイルやプロセスを隠すといった機能は、LKM rootkit 自体のファイルや、
LKM rootkit をロードする為の起動ファイル、ロードされた  LKM rootkit
モジュール自体の存在を隠すことにも利用される。
むろん、netstat や ifconfig の結果から管理者に見られては困る内容を隠
すことも可能となっている。

LKM rootkit は ps や ls といったコマンド ファイルを置き換えないこと
から、単純にシステム上に存在するファイルのハッシュ値を確認することで
は検出することができない。
また、FD や CD-ROM から起動された安全と確認できている ls や ps コマ
ンドなどに対しても悪意のあるファイルやプロセス、通信を隠すことができ
てしまう。

LKM rootkit により悪意のあるファイルやプロセス、通信が隠されてしまう
ことで、システム上にバックドアが存在していたとしても、オンラインでそ
の存在を確認することは難しい。

□LKM rootkit のオンライン状態での検出

オンラインで LKM rootkit を検出する方法としては、kstat や kern_check、
Rkscan、Alamo などのツールを利用することができる。
LKM rootkit は一般的にカーネルのシステムコール テーブルを書き換えるこ
とで様々な機能を実現している。kstat や kern_check ではこのテーブルの
内容が変更されていないかをチェックすることで LKM rootkit がシステム上
に存在していないかを確認するという仕組みを取っている。
LKM rootkit の一つである knark(v0.59) がロードされている RedHat 7.0 上
で kern_check を実行した場合、結果は以下のように表示される。

[root@linux kern_check]# ./kern_check /boot/System.map
WARNING: (kernel) 0xc3848580 != 0xc0108eb8 (map)  [sys_fork]
WARNING: (kernel) 0xc3848864 != 0xc012591c (map)  [sys_read]
WARNING: (kernel) 0xc3848be8 != 0xc0108f14 (map)  [sys_execve]
WARNING: (kernel) 0xc3848638 != 0xc0110738 (map)  [sys_kill]
WARNING: (kernel) 0xc38486bc != 0xc012ea3c (map)  [sys_ioctl]
WARNING: (kernel) 0xc3848ab0 != 0xc01182d8 (map)  [sys_settimeofday]
WARNING: (kernel) 0xc38485dc != 0xc0108ed4 (map)  [sys_clone]
WARNING: (kernel) 0xc3848474 != 0xc012ed98 (map)  [sys_getdents]

ここで WARNING で表示されたシステムコールは、knark によってフックされ
るようになっており、ユーザーモードで実行されるツールではシステムの正確
な状態を確認することができない。

これに対して Alamo では、LKM rootkit が行ったのと同様の方法で、システ
ムコールのテーブル内容の一部を本来の値へ戻すという作業を行う。

knark(v0.59) はロードされると /proc/knark というディレクトリを作成する
が通常はそのディレクトリは隠蔽されるようになっており、ls などのコマンド
からその存在を確認することはできない。

[root@linux knark-0.59]# ls -F /proc
1/     2/     400/   5/    728/  936/     filesystems  meminfo     slabinfo
1025/  3/     401/   530/  745/  946/     fs/          misc        stat
1036/  359/   411/   550/  746/  955/     ide/         modules     swaps
1038/  369/   426/   566/  747/  959/     interrupts   mounts      sys/
1042/  384/   4488/  6/    748/  apm      ioports      mtrr        tty/
1053/  3897/  480/   608/  749/  bus/     kcore        net/        uptime
1057/  3898/  483/   624/  750/  cmdline  kmsg         partitions  version
1059/  3899/  484/   634/  753/  cpuinfo  ksyms        pci
1060/  3924/  491/   644/  927/  devices  loadavg      rtc
1076/  3925/  492/   659/  932/  dma      locks        scsi/
1093/  4/     499/   696/  933/  fb       mdstat       self@

knark(v0.59) がロードされている RedHat 7.0 上で Alamo をロードし、再度
ls コマンドを実行した場合、結果は以下のように表示され、/proc/knark の
存在を確認することができる。

[root@linux alamo]# /sbin/insmod alamo.o
[root@linux alamo]# ls -F /proc/
1/     2/     400/   5/    728/  936/     filesystems  mdstat      self@
1025/  3/     401/   530/  745/  946/     fs/          meminfo     slabinfo
1036/  359/   411/   550/  746/  955/     ide/         misc        stat
1038/  369/   426/   566/  747/  959/     interrupts   modules     swaps
1042/  384/   4494/  6/    748/  apm      ioports      mounts      sys/
1053/  3897/  480/   608/  749/  bus/     kcore        mtrr        tty/
1057/  3898/  483/   624/  750/  cmdline  kmsg         net/        uptime
1059/  3899/  484/   634/  753/  cpuinfo  knark/       partitions  version
1060/  3924/  491/   644/  927/  devices  ksyms        pci
1076/  3925/  492/   659/  932/  dma      loadavg      rtc
1093/  4/     499/   696/  933/  fb       locks        scsi/

Alamo がロードされた状態では、knark のような LKM rootkit がファイルを
隠すことができなくなる為、ls や Tripwire のようなツールを使うことで隠
されていたファイルやディレクトリを容易に発見することができる。
なお、LKM rootkit により隠されたプロセスを検出する為のツールとしては、
Carbonite を利用することができる。

また、別システムで動作する tcpdump や IDS を利用することで、仕掛けら
れたバックドアを検出することができる場合もある。

□ディレクトリへの書き込みをチェックすることで監視する

□LKM rootkit のオフラインでの検出

オンラインでは検出の難しい LKM rootkit でも、それが動作できないオフ
ライン状態でシステムのチェックを行えば、システム上で隠されたファイル
やディレクトリを容易に検出することができる。
またオフラインでシステムをチェックすることで、オンラインでは見逃して
いたファイルへの変更の有無などを確実にチェックすることができる。

□LKM rootkit への事前対策

動的にモジュールをロードする機能を無効にする
モジュールのロードを検出するツールを導入する

□紹介したツールへのリンク

Tripwire http://www.tripwire.org/
chkrootkit http://www.chkrootkit.org/
kstat http://s0ftpj.org/en/site.html
kern_check http://la-samhna.de/library/lkm.html
Rkscan http://www.hsc.fr/ressources/outils/rkscan/index.html.en
Alamo http://www.rackspace.com/alamo/
Carbonite http://www.foundstone.com/rdlabs/proddesc/carbonite.html

□参考 URL

Detecting Loadable Kernel Modules (LKM)
http://members.prestige.net/tmiller12/papers/lkm.htm

"Root Kits" and hiding files/directories/processes after a break-in
http://staff.washington.edu/dittrich/misc/faqs/rootkits.faq

Packetstome にある関連記事
http://packetstormsecurity.org/groups/thc/LKM_HACKING.html
http://packetstormsecurity.org/papers/unix/bsdkern.htm
http://packetstormsecurity.org/groups/thc/slkm-1.0.html

Fighting Rootkit and Similar Trojans: 
Integrity Checkers and Trojan detectors
http://www.softpanorama.org/Security/integrity_checkers.shtml

Linux Loadable Kernel Module(LKM) Hacking 
http://cdz4lj.virtualave.net/trash/lkmhack.html

Loadable Kernel Module (LKM) Rootkits
http://la-samhna.de/library/lkm.html


---
セキュリティスタジアム 2001 ボランティアの募集
http://sec-stadium.hawkeye.ac/

Hideaki Ihara <hideaki@xxxxxxxxxxxxx>
Port139 URL: http://www.port139.co.jp/
PGP PUBLIC KEY: http://www.port139.co.jp/pgp/