rootkit を検出する chkrootkit

  Unix

万一、rootkit を仕掛けられたときのために、検出できる仕組みを用意しておく。rootkit を検出するなら chkrootkit だろう。
Solaris では、ソースから最新版を入れるとうまくいかないなぁ。最新版はあきらめて、パッケージから入れよう。

chkrootkit パッケージインストール

$ wget --passive-ftp \
ftp://ftp.sunfreeware.com/pub/freeware/intel/10/chkrootkit-0.45-sol10-intel-local.gz
$ gunzip chkrootkit-0.45-sol10-intel-local.gz
$ sudo /usr/sbin/pkgadd -d ./chkrootkit-0.45-sol10-intel-local

The following packages are available:
1 SMCchkr chkrootkit
(intel) 0.45

Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]: [ENTER]
:(skip)
Installation of <SMCchkr> was successful.

chkrootkit は、スクリプト中に相対パス ./ が含まれているので、実行するには /usr/local/bin に移動する必要がある。

$ cd /usr/local/bin/
$ sudo ./chkrootkit | grep "INFECTED"

何も検出されなくてハッピー♪

chkrootkit ソースインストール

$ cd src/
$ wget --passive-ftp \
ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
$ wget --passive-ftp \
ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.md5

md5sum でソースの整合性をチェック。chkrootkit が偽物だったら元も子もない。

$ md5sum --check chkrootkit.md5

chkrootkit.tar.gz: OK
$ gtar zxf chkrootkit.tar.gz
$ cd chkrootkit-0.46a/
$ make sense

gcc -DHAVE_LASTLOG_H -o chklastlog chklastlog.c
chklastlog.c:86: error: parse error before "struct"
chklastlog.c: In function `main':
chklastlog.c:98: error: storage size of `lastlog_ent' isn't known
chklastlog.c:135: error: `O_RDONLY' undeclared (first use in this function)
chklastlog.c:135: error: (Each undeclared identifier is reported only once
chklastlog.c:135: error: for each function it appears in.)
chklastlog.c:173: error: invalid application of `sizeof' to an incomplete type
chklastlog.c:174: error: invalid application of `sizeof' to an incomplete type
chklastlog.c:176: error: invalid application of `sizeof' to an incomplete type
chklastlog.c: At top level:
chklastlog.c:207: error: parse error before "struct"
*** Error code 1
make: Fatal error: Command failed for target `chklastlog'

デフォルトのままだとコンパイルできねーし。

デフォルトだと Makefile が Linux 用に設定されているようなので、Solaris 用に修正する。
Makefile は、パーミッションが 444 なので、編集用に 644 に変更する。

$ chmod 644 Makefile
$ vi Makefile

--- Makefile.bak
+++ Makefile
@@ -3,18 +3,19 @@
# (C) 1997-2003 Nelson Murilo, Pangeia Informatica, AMS Foundation and others.
#

-CC = gcc
-CFLAGS = -DHAVE_LASTLOG_H
-STATIC = -static
+#CC = gcc
+#CFLAGS = -DHAVE_LASTLOG_H
+#STATIC = -static
+CC = /usr/sfw/bin/gcc

###
### Solaris 2.x
###
# If you have Solaris 2.x, uncomment the next two lines
-#CFLAGS = -DHAVE_LASTLOG_H -DSOLARIS2
-#LDFLAGS=-lsocket
+CFLAGS = -DHAVE_LASTLOG_H -DSOLARIS2
+LDFLAGS=-lsocket
# If you use gcc in Solaris don't uncomment STATIC line below
-#STATIC = -B static
+STATIC = -B static

###
### Mac OS X

コンパイルしなおす。今度はうまくいった。

$ make clean
$ make sense
$ sudo ./chkrootkit

./chkrootkit: _POSIX2_VERSION=199209: is not an identifier

今度は実行できんし。

いいのか悪いのかわからんが、実行できるように chkrootkit を修正する。

$ vi chkrootkit

--- chkrootkit.old
+++ chkrootkit
@@ -18,7 +18,7 @@
unalias dirname > /dev/null 2>&1

# Workaround for recent GNU coreutils
-export _POSIX2_VERSION=199209
+#export _POSIX2_VERSION=199209


# Native commands

今度は実行できる。

$ sudo ./chkrootkit

:(skip)
Checking `asp'... not infected
Checking `bindshell'... not infected
Checking `lkm'... chkproc: not tested
Checking `rexedcs'... not found
Checking `sniffer'... Checking `w55808'... not infected
Checking `wted'... unable to open wtmp-file /var/adm/wtmp
Checking `scalper'... not infected
Checking `slapper'... egrep: syntax error
./chkrootkit: tcp: not found
not infected
Checking `z2'... unable to open wtmp-file wtmp
Checking `chkutmp'... chkutmp: nothing deleted

ツールでの検査時にエラー続発,,,
Solaris 8 くらいから、wtmp は廃止されて、/var/adm/wtmpx になっているので、wtmp 関係のエラーはわからんでもないが、slapper での egrep のエラーは、netstat が原因のようである。面倒なので断念; Sunfreeware.com のパッケージを利用することにする。