chkrootkitの設定

投稿者: | 2010年8月10日
Pocket

対象サーバについて

製品名 OpenBlockS 600
OS(kernel ver) Debian lenny(2.6.29)
CPU 600MHz(AMCC PowerPC 405EX)
メモリ 1GB(DDR2 SDRAM)
ストレージ 8GB(Compact Flash)

インストールと初期状態確認

# aptitude install chkrootkit

試しに一度、chkrootkitコマンドを実行してみます。

# chkrootkit
ROOTDIR is `/'
Checking `amd'...                                           not found
Checking `basename'...                                      not infected
Checking `biff'...                                          not found
Checking `chfn'...                                          not infected
Checking `chsh'...                                          not infected

...

# chkrootkit | grep INFECTED
# 

INFECTEDが出た場合、rootkitが見つかった可能性があります。

not infected は発見されなかったこと、not found はコマンドが無いこと、not testedはチェックできなかったことを意味します。

上記結果はINFECTEDが無かったので問題無しと言えます。

次にquiet mode(問題となった項目のみ表示されるモード)で実施してみます。

# /usr/sbin/chkrootkit -q

The following suspicious files and directories were found:
/lib/init/rw/.ramfs

eth0: PACKET SNIFFER(/usr/sbin/dhcpd3[2565])

/lib/init/rw/.ramfsという疑わしいファイルがあると怒らましたが、これはバグのようなので問題無しとします。

また、eth0: PACKET SNIFFER(/usr/sbin/dhcpd3[2565])はDHCPを使っていると出るようです。

DHCPを止めたら消えましたので、上記と同じく問題無しとします。

インストール後に自動設定されたcronの確認

確認するファイル1:/etc/cron.daily/chkrootkit

#!/bin/sh -e

CHKROOTKIT=/usr/sbin/chkrootkit
CF=/etc/chkrootkit.conf
LOG_DIR=/var/cache/chkrootkit

# /usr/sbin/chkrootkitが実行可能で無ければ終了
if [ ! -x $CHKROOTKIT ]; then
  exit 0
fi

# /etc/chkrootkit.confを読み込む
if [ -f $CF ]; then
    . $CF
fi

# /etc/chkrootkit.confで定義している$RUN_DAILY="true"なら以降を実施()
if [ "$RUN_DAILY" = "true" ]; then

    # $DIFF_MODE = "true"の場合に実施
    if [ "$DIFF_MODE" = "true" ]; then

        # /usr/sbin/chkrootkit -q > /var/cache/chkrootkit/log.newを実施
        $CHKROOTKIT $RUN_DAILY_OPTS > $LOG_DIR/log.new 2>&1

        # 以下のいずれかの場合にcat /var/cache/chkrootkit/log.newが実施される。
        # 1./var/cache/chkrootkit/log.oldが存在しない
        # 2.log.oldとlog.newが異なる場合、
        if [ ! -f $LOG_DIR/log.old ] \
           || ! diff -q $LOG_DIR/log.old $LOG_DIR/log.new > /dev/null 2>&1; then
            cat $LOG_DIR/log.new
        fi

        # log.newをlog.oldに名前変更
        mv $LOG_DIR/log.new $LOG_DIR/log.old

    # $DIFF_MODE = "false"の場合に実施
    else

        # $DIFF_MODE = falseの場合、/usr/sbin/chkrootkit -q のみ実施して終了
        $CHKROOTKIT $RUN_DAILY_OPTS
    fi
fi

確認するファイル2:/etc/chkrootkit.conf

RUN_DAILY="false"
RUN_DAILY_OPTS="-q"
DIFF_MODE="false"

→初期設定はchkrootkitを実行しないようになっています。

# ls -al /var/cache/chkrootkit/
合計 8
drwxr-xr-x 2 root root 4096 2008-11-27 20:04 .
drwxr-xr-x 9 root root 4096 2009-11-01 17:01 ..

→/etc/cron.daily/chkrootkit実行前は当然何もありません。

# /etc/cron.daily/chkrootkit
# ls -al /var/cache/chkrootkit/
合計 8
drwxr-xr-x 2 root root 4096 2008-11-27 20:04 .
drwxr-xr-x 9 root root 4096 2009-11-01 17:01 ..

→/etc/chkrootkit.confにてRUN_DAILY=falseになっているため実行されません。

RUN_DAILYとDIFF_MODEをtrueに修正します。

編集するファイル:/etc/chkrootkit.conf

RUN_DAILY="true"
RUN_DAILY_OPTS="-q"
DIFF_MODE="true"

→falseからtrueに修正

# /etc/cron.daily/chkrootkit
The following suspicious files and directories were found:
/lib/init/rw/.ramfs

eth0: PACKET SNIFFER(/usr/sbin/dhcpd3[2565])

# ls /var/cache/chkrootkit/
log.old

# less /var/cache/chkrootkit/log.old

The following suspicious files and directories were found:
/lib/init/rw/.ramfs

eth0: PACKET SNIFFER(/usr/sbin/dhcpd3[2565])

→想定通り、quiet modeで実行した結果がlog.oldに保存されています。

また、1回目の実施で、かつ/var/cache/chkrootkit/log.oldが存在しなかったため、catにてログが標準出力に表示されました。

INFECTEDが発見された際にメール送信されるようにcronスクリプトを変更

INFECTEDが発見されたらメールコマンドにてroot宛てにメールするようにcronスクリプトを修正します。

色々なサイトで同じスクリプトが出回っておりどのサイトが原本か分かりませんでしたが、私も右に倣えで参考にして作成しました。

修正したファイル:/etc/cron.daily/

#!/bin/sh -e

CHKROOTKIT=/usr/sbin/chkrootkit
CF=/etc/chkrootkit.conf
LOG_DIR=/var/cache/chkrootkit

if [ ! -x $CHKROOTKIT ]; then
  exit 0
fi

if [ -f $CF ]; then
    . $CF
fi

if [ "$RUN_DAILY" = "true" ]; then
    if [ "$DIFF_MODE" = "true" ]; then
        #$CHKROOTKIT $RUN_DAILY_OPTS > $LOG_DIR/log.new 2>&1
        #if [ ! -f $LOG_DIR/log.old ] \
        #   || ! diff -q $LOG_DIR/log.old $LOG_DIR/log.new > /dev/null 2>&1; then
        #    cat $LOG_DIR/log.new
        #fi
        #mv $LOG_DIR/log.new $LOG_DIR/log.old

        

        # /usr/sbin/chkrootkit結果をTMPLOGに保存してlocal5.infoにてsyslogに出力
        TMPLOG=`mktemp`
        $CHKROOTKIT > $TMPLOG 2>&1
        cat $TMPLOG | logger -p local5.info

        # TMPLOGにINFECTEDの文字列があった場合、grep結果をrootにメール送信
        [ ! -z "$(grep INFECTED $TMPLOG)" ] && \
        grep INFECTED $TMPLOG | mail -s "rootkit found in `hostname`" root
        rm -f $TMPLOG
        
    else
        $CHKROOTKIT $RUN_DAILY_OPTS
    fi
fi

→rsyslogにて必要なlocal5.info用の設定は割愛しますが忘れないように。

上記、INFECTEDの箇所を”not found”に変更して実施してみたところ、以下のように、not foundのみgrepされた結果がメールで送られていました。

tail -33 /var/mail/user001

From root@example.jp Sun Nov 01 21:41:16 2009
Return-path: 
Envelope-to: root@example.jp
Delivery-date: Sun, 01 Nov 2009 21:41:16 +0900
Received: from root by www with local (Exim 4.69)
        (envelope-from )
        id 1N4ZkB-0004nj-Nw
        for root@example.jp; Sun, 01 Nov 2009 21:41:16 +0900
To: root@example.jp
Subject: chkrootkit report in www
Message-Id: 
From: root 
Date: Sun, 01 Nov 2009 21:41:15 +0900

Checking `amd'...                                           not found
Checking `biff'...                                          not found
Checking `fingerd'...                                       not found
Checking `gpm'...                                           not found
Checking `hdparm'...                                        not found
Checking `identd'...                                        not found
Checking `lsof'...                                          not found
Checking `mingetty'...                                      not found
Checking `named'...                                         not found
Checking `pop2'...                                          not found
Checking `pop3'...                                          not found
Checking `rlogind'...                                       not found
Checking `rshd'...                                          not found
Checking `slogin'...                                        not found
Checking `sshd'...                                          not found
Checking `timed'...                                         not found
Checking `rexedcs'...                                       not found

INFECTEDに書き直して終了とします。

コマンドの確保

chkrootkitで使用するコマンドが改竄された時のために、正常なコマンドを退避しておきます。

# mkdir cmd

# cp `which awk cut echo egrep find head id ls netstat ps strings sed uname` cmd/

# cp -p /usr/sbin/chkrootkit ./cmd/

# cd cmd/

# ls -al
合計 1044
drwxr-xr-x 2 root root   4096 2009-11-01 23:01 .
drwxr-xr-x 5 root root   4096 2009-11-01 22:55 ..
-rwxr-xr-x 1 root root 117036 2009-11-01 22:55 awk
-rwxr-xr-x 1 root root  78705 2008-11-27 20:03 chkrootkit
-rwxr-xr-x 1 root root  30580 2009-11-01 22:55 cut
-rwxr-xr-x 1 root root  18260 2009-11-01 22:55 echo
-rwxr-xr-x 1 root root 108788 2009-11-01 22:55 egrep
-rwxr-xr-x 1 root root 167352 2009-11-01 22:55 find
-rwxr-xr-x 1 root root  32532 2009-11-01 22:55 head
-rwxr-xr-x 1 root root  26508 2009-11-01 22:55 id
-rwxr-xr-x 1 root root 104776 2009-11-01 22:55 ls
-rwxr-xr-x 1 root root 115592 2009-11-01 22:55 netstat
-rwxr-xr-x 1 root root 102380 2009-11-01 22:55 ps
-rwxr-xr-x 1 root root  47844 2009-11-01 22:55 sed
-rwxr-xr-x 1 root root  33224 2009-11-01 22:55 strings
-rwxr-xr-x 1 root root  18264 2009-11-01 22:55 uname
-rwxr-xr-x 1 root root    946 2009-11-01 22:55 which

# man chkrootkit
       -p dir1:dir2:dirN
              Specify the path for the external commands used by chkrootkit.

# ./chkrootkit -p ~/cmd/
ROOTDIR is `/'
Checking `amd'...                                           not found
Checking `basename'...                                      not infected
Checking `biff'...                                          not found

...

# tar czvf chkrootkit.tar.gz cmd
→chkrootkit.tar.gzをWindowsにダウンロードしておく。

# rm -rf cmd
Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です