CentOS 7 rootkit検知ツールインストール

■chkrootkitインストール

[root@server1 ~]# wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz ← chkrootkitダウンロード

[root@server1 ~]# tar zxvf chkrootkit.tar.gz ← chkrootkit展開

[root@server1 ~]# mkdir -p ~/bin && mv chkrootkit-0.50/chkrootkit ~/bin ← chkrootkitを移動

[root@server1 ~]# rm -rf chkrootkit-0.50/ ← chkrootkit展開先ディレクトリを削除

[root@server1 ~]# rm -f chkrootkit.tar.gz ← ダウンロードしたchkrootkitを削除

■chkrootkit確認

[root@server1 ~]# chkrootkit | grep INFECTED ← chkrootkit実行
上記chkrootkit実行結果として"INFECTED"という行が表示されなければ問題なし

■chkrootkit定期自動実行設定

[root@server1 ~]# vi /etc/cron.daily/chkrootkit ← chkrootkit実行スクリプトを毎日自動実行されるディレクトリへ作成
#!/bin/bash

PATH=/usr/bin:/bin:/root/bin

TMPLOG=`mktemp`

# chkrootkit実行
chkrootkit > $TMPLOG

# ログ出力
cat $TMPLOG | logger -t chkrootkit

# SMTPSのbindshell誤検知対応
if [ ! -z "$(grep 465 $TMPLOG)" ] && \
   [ -z $(/usr/sbin/lsof -i:465|grep bindshell) ]; then
        sed -i '/465/d' $TMPLOG
fi

# rootkit検知時のみroot宛メール送信
[ ! -z "$(grep INFECTED $TMPLOG)" ] && \
grep INFECTED $TMPLOG | mail -s "chkrootkit report in `hostname`" root

rm -f $TMPLOG

[root@server1 ~]# chmod 700 /etc/cron.daily/chkrootkit ← chkrootkit実行スクリプトへ実行権限付加

これで毎日定期的にrootkitがインストールされていないかチェックされ、インストールされていた場合はroot宛にメールが届くようになる。また、chkrootkitの実行結果は/var/log/messagesに保存される。

■chkrootkitで使用する安全なコマンドの確保
chkrootkitが使用するコマンド群が既に改竄されていた場合、rootkitを正常に検出できなくなるので、chkrootkitが使用するコマンド群をコピーしておき、必要な場合にはそのコマンド群を使用してchkrootkitを実行する。

chkrootkit使用コマンド退避先ディレクトリ作成
[root@server1 ~]# mkdir chkrootkitcmd 

chkrootkit使用コマンドを退避先ディレクトリへコピー
[root@server1 ~]# cp `which --skip-alias awk cut echo egrep find head id ls netstat ps strings sed ssh uname` chkrootkitcmd/

退避したchkrootkit使用コマンドを使用してchkrootkit実行
[root@server1 ~]# chkrootkit -p /root/chkrootkitcmd|grep INFECTED

chkrootkit使用コマンド退避先ディレクトリ圧縮
[root@server1 ~]# zip -r chkrootkitcmd.zip chkrootkitcmd/

chkrootkit使用コマンド退避先ディレクトリ削除
[root@server1 ~]# rm -rf chkrootkitcmd

mailコマンドでzipファイル添付メールを送信するのに必要なuuencodeコマンドインストール
[root@server1 ~]# yum -y install sharutils

chkrootkit使用コマンド(圧縮版)をroot宛にメール送信
[root@server1 ~]# uuencode chkrootkitcmd.zip chkrootkitcmd.zip|mail root

chkrootkit使用コマンド(圧縮版)削除
[root@server1 ~]# rm -f chkrootkitcmd.zip

■Suckit誤検知の修正
Suckit による /sbin/init の改ざん誤検知対策

[root@server1 ~]# chkrootkit | grep INFECTED
Searching for Suckit rootkit... Warning: /sbin/init INFECTED

chkrootkitの修正

[root@server1 ~]# vi /root/bin/chkrootkit
   ### Suckit
   if [ -f ${ROOTDIR}sbin/init ]; then
      if [ "${QUIET}" != "t" ];then printn "Searching for Suckit rootkit... "; fi
      if [ ${SYSTEM} != "HP-UX" ] && ( ${strings} ${ROOTDIR}sbin/init | ${egrep} 'HOME='   || \
              cat ${ROOTDIR}/proc/1/maps | ${egrep} "init." ) >/dev/null 2>&1
        then
      if [ "`md5sum ${ROOTDIR}sbin/init | cut -d ' ' -f 1`" = "`grep 'sbin/init$' /sbin/init | cut -d ' ' -f 1`" ]
      then
        echo "Warning: ${ROOTDIR}sbin/init INFECTED"
      fi
      else
         if [ -d ${ROOTDIR}/dev/.golf ]; then
            echo "Warning: Suspect directory ${ROOTDIR}dev/.golf"
         else
            if [ "${QUIET}" != "t" ]; then echo "nothing found"; fi
         fi
      fi
   fi

chkrootkit確認

[root@server1 ~]# chkrootkit | grep INFECTED
 "INFECTED"という行が表示されなくなった

rootkit検知ツール(chkrootkit)

chkrootkit は、システムにrootkitが組み込まれていないかを検査してくれるツール。 rootkit とは、不正アクセスの痕跡を消し去り、それを隠ぺいし、さらなる標的を攻撃することを可能とするツール群。 chkrootkit は、いくつかの rootkit を検出できるが、 検出しても駆除する機能はない。しかし不正侵入検知には役立つ。
■chkrootkitのインストール

chkrootkitをインストール
[root@server1 ~]# yum -y install chkrootkit

■chkrootkitの実行

chkrootkitを実行
[root@linux ~]# chkrootkit
ROOTDIR is `/'
Checking `amd'... not found
Checking `basename'... not infected
Checking `biff'... not found
Checking `chfn'... not infected
・
・
・
Checking `scalper'... not infected
Checking `slapper'... not infected
Checking `z2'... user root deleted or never logged from lastlog!
Checking `chkutmp'... chkutmp: nothing deleted
[root@server1 ~]# chkrootkit | grep INFECTED
実行結果中に"INFECTED"という行がなければ問題ない

■chkrootkitの定期自動実行設定
rootkitを発見したときroot宛にメールが来るように設定

chkrootkitの実行スクリプトを作成
[root@server1 ~]# vi /root/chkrootkit
#!/bin/sh
/usr/bin/chkrootkit > /var/log/chkrootkit_log
grep "INFECTED" /var/log/chkrootkit_log
chmod 600 /var/log/chkrootkit_log
chkrootkitの実行スクリプトに実行権限を与える
[root@server1 ~]# chmod 700 chkrootkit
chkrootkit実行スクリプトを毎日自動実行されるディレクトリへ移動
[root@server1 ~]# mv chkrootkit /etc/cron.daily/

■chkrootkitで使用するコマンド群のコピー
chkrootkitが使用するコマンド群をコピーしておき、必要な場合にそのコマンド群でchkrootkitを実行する。

chkrootkitで使用するコマンド群の退避先ディレクトリの作成
[root@server1 ~]# mkdir chkrootkitcmd
chkrootkitで使用するコマンド群を退避先ディレクトリへコピー
[root@server1 ~]# cp `which --skip-alias awk cut echo egrep find head id ls netstat ps strings sed uname` chkrootkitcmd/
退避したchkrootkitでchkrootkit実行
[root@server1 ~]# chkrootkit -p /root/chkrootkitcmd|grep INFECTED
chkrootkitで使用するコマンド群の退避先ディレクトリを圧縮
[root@server1 ~]# zip -r chkrootkitcmd.zip chkrootkitcmd/
adding: chkrootkitcmd/ (stored 0%)
adding: chkrootkitcmd/id (deflated 55%)
adding: chkrootkitcmd/egrep (deflated 49%)
adding: chkrootkitcmd/sed (deflated 54%)
adding: chkrootkitcmd/netstat (deflated 58%)
adding: chkrootkitcmd/echo (deflated 54%)
adding: chkrootkitcmd/find (deflated 50%)
adding: chkrootkitcmd/awk (deflated 51%)
adding: chkrootkitcmd/head (deflated 53%)
adding: chkrootkitcmd/strings (deflated 53%)
adding: chkrootkitcmd/ps (deflated 59%)
adding: chkrootkitcmd/uname (deflated 55%)
adding: chkrootkitcmd/ls (deflated 53%)
adding: chkrootkitcmd/cut (deflated 53%)
退避先ディレクトリの削除
[root@server1 ~]# rm -rf chkrootkitcmd
圧縮したzipファイルを送信するのに必要なuuencodeコマンドのインストール
[root@server1 ~]# yum -y install sharutils
Loaded plugins: fastestmirror, refresh-packagekit
Loading mirror speeds from cached hostfile
* base: ftp.jaist.ac.jp
* centosplus: ftp.jaist.ac.jp
* epel: ftp.jaist.ac.jp
* extras: ftp.jaist.ac.jp
* updates: mirror.khlug.org
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package sharutils.i686 0:4.7-6.1.el6 set to be updated
--> Finished Dependency Resolution
Dependencies Resolved
===================================================================================================================
Package                      Arch                    Version                        Repository               Size
===================================================================================================================
Installing:
sharutils                    i686                    4.7-6.1.el6                    base                    186 k
Transaction Summary
===================================================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)
Total download size: 186 k
Installed size: 609 k
Downloading Packages:
sharutils-4.7-6.1.el6.i686.rpm                                                              | 186 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing     : sharutils-4.7-6.1.el6.i686                                                                  1/1
Installed:
sharutils.i686 0:4.7-6.1.el6
Complete!
圧縮したzipファイルをroot宛にメール送信
[root@server1 ~]# uuencode chkrootkitcmd.zip chkrootkitcmd.zip|mail root
圧縮したzipファイルを削除
[root@server1 ~]# rm -f chkrootkitcmd.zip

■chkrootkitの修正
Suckit による /sbin/init の改ざん誤検知対策。
rpm -V `rpm -qf /sbin/init` を実行し、なにも表示されなかったら未検出とする。
赤字の部分が追加

[root@server1 ~]# vi /usr/lib64/chkrootkit-0.49/chkrootkit
### Suckit
if [ -f ${ROOTDIR}sbin/init ]; then
if [ "${QUIET}" != "t" ];then printn "Searching for Suckit rootkit... "; fi
if [ ${SYSTEM} != "HP-UX" ] && ( ${strings} ${ROOTDIR}sbin/init | ${egrep} HOME  || \
cat ${ROOTDIR}/proc/1/maps | ${egrep} "init." ) >/dev/null 2>&1
then
if ! rpm -V `rpm -qf /sbin/init` >/dev/null 2>&1;
then
echo "Warning: ${ROOTDIR}sbin/init INFECTED"
fi
else
if [ -d ${ROOTDIR}/dev/.golf ]; then
echo "Warning: Suspect directory ${ROOTDIR}dev/.golf"
else
if [ "${QUIET}" != "t" ]; then echo "nothing found"; fi
fi
fi
fi

rootkit検知

rootkit検知時のみroot宛にメール送信するようになってるが、今朝、Cron /root/chkrootkit.shから、次のようなメールが届いた。
Searching for Suckit rootkit… Warning: /sbin/init INFECTED
調べてみると、リブートしたら検知されなくなったという書き込みがあるので、とりあえずリブートして、rootkitのチェックを行う。

[root@server1 ~]# chkrootkit | grep INFECTED
[root@server1 ~]# 

なにも検知されない。
メインサーバと予備サーバで、md5sum /sbin/initのコマンドを実行したところ、結果は全く同じで、INFECTEDされたような形跡はどうも無いようだ。

メインサーバ
[root@server1 ~]# md5sum /sbin/init
5fff3eac49eecf6625085dd9d0f39292  /sbin/init
予備サーバ
[root@server2 ~]# md5sum /sbin/init
5fff3eac49eecf6625085dd9d0f39292  /sbin/init

rpm -V `rpm -qf /sbin/init`を実行し、なにか表示されたら変更された可能性がある。
S ファイルサイズが異なっている
5 MD5チェックサムが異なる
L シンボリックリンクが変更されている
T ファイルの更新時刻が変更されている
D デバイスファイルが変更されている
U ファイルの所有者が変更されている
G ファイルの所有グループが変更されている
M ファイルのパーミッションが変更されている

[root@server1 ~]# rpm -V `rpm -qf /sbin/init`
[root@server1 ~]#

何も表示されない。
今日のところはひとまずよしとするが、もう少し調べてみて本当にrootkitに感染してるようなら、再インストールするしか無いかも。

chkrootkitのアラーム

先日、以下のメールが来るようになった。
Checking `bindshell’… INFECTED (PORTS: 1008)
bindshellが仕掛けられたのかと思い、色々調べたら、どうもポート1008がrpc.statdのプロセスによって使用されていることが分かり、bindshellではなかったようなので、まずは一安心。

ポート1008が使ってるプロセスを確認
[root@server ~]# lsof -i:1008
COMMAND    PID    USER   FD   TYPE DEVICE SIZE NODE NAME
rpc.statd 2098 rpcuser    7u  IPv4   5737       TCP *:1008 (LISTEN)
rpc.statdが、rpcuserによって起動している。
バックアップしてあったchkrootkitで使用するコマンド群使って再検査を行うことに。
[root@server ~]# shutdown -r now
クライアントマシンにバックアップしてあったchkrootkitcmd.zipを、/home/higo/にアップロードしてから以下の作業を行う。
[root@server ~]# cd /home/higo/
[root@server higo]# mv -v chkrootkitcmd.zip /root
`chkrootkitcmd.zip' -> `/root/chkrootkitcmd.zip'
[root@server higo]# cd
[root@server ~]# unzip chkrootkitcmd.zip
Archive:  chkrootkitcmd.zip
creating: chkrootkitcmd/
inflating: chkrootkitcmd/id
inflating: chkrootkitcmd/egrep
inflating: chkrootkitcmd/sed
inflating: chkrootkitcmd/netstat
inflating: chkrootkitcmd/echo
inflating: chkrootkitcmd/find
inflating: chkrootkitcmd/awk
inflating: chkrootkitcmd/head
inflating: chkrootkitcmd/strings
inflating: chkrootkitcmd/ps
inflating: chkrootkitcmd/uname
inflating: chkrootkitcmd/ls
inflating: chkrootkitcmd/cut
[root@server ~]# ls -l ./chkrootkitcmd/
合計 1084
-rwxr-xr-x 1 root root 320416  7月 12 09:20 awk
-rwxr-xr-x 1 root root  34408  7月 12 09:20 cut
-rwxr-xr-x 1 root root  19852  7月 12 09:20 echo
-rwxr-xr-x 1 root root  85060  7月 12 09:20 egrep
-rwxr-xr-x 1 root root 151244  7月 12 09:20 find
-rwxr-xr-x 1 root root  31660  7月 12 09:20 head
-rwxr-xr-x 1 root root  22600  7月 12 09:20 id
-rwxr-xr-x 1 root root  95116  7月 12 09:20 ls
-rwxr-xr-x 1 root root 121300  7月 12 09:20 netstat
-r-xr-xr-x 1 root root  79004  7月 12 09:20 ps
-rwxr-xr-x 1 root root  51764  7月 12 09:20 sed
-rwxr-xr-x 1 root root  25892  7月 12 09:20 strings
-rwxr-xr-x 1 root root  20024  7月 12 09:20 uname
/root/chkrootkitcmd/の外部コマンドで、chkrootkitを実行。
[root@server ~]# which chkrootkit
/usr/sbin/chkrootkit
[root@server ~]# chkrootkit -p /root/chkrootkitcmd/
INFECTEDは無いようだが、INFECTEDのみ表示させてみる。
[root@server ~]# chkrootkit -p /root/chkrootkitcmd/ | grep INFECTED
INFECTEDは無かった。
rpc.statdの待ち受けポートを確認してみる。
[root@server ~]# netstat -anp|grep rpc.statd
tcp        0      0 0.0.0.0:1006                0.0.0.0:*                   LISTEN      2096/rpc.statd
udp        0      0 0.0.0.0:1000                0.0.0.0:*                               2096/rpc.statd
udp        0      0 0.0.0.0:1003                0.0.0.0:*                               2096/rpc.statd
unix  2      [ ]         DGRAM                    5427   2096/rpc.statd
rpc.statdが使ってた1008はすでに違うものになってる。
ポート1008番は、どのプロセスも使用してないことを確認。
[root@server ~]# lsof -i:1008
[root@server ~]#
再検査で使ったファイル群を削除。
[root@server ~]# rm -v -f -R ./chkrootkitcmd/
removed `./chkrootkitcmd//id'
removed `./chkrootkitcmd//egrep'
removed `./chkrootkitcmd//sed'
removed `./chkrootkitcmd//netstat'
removed `./chkrootkitcmd//echo'
removed `./chkrootkitcmd//find'
removed `./chkrootkitcmd//awk'
removed `./chkrootkitcmd//head'
removed `./chkrootkitcmd//strings'
removed `./chkrootkitcmd//ps'
removed `./chkrootkitcmd//uname'
removed `./chkrootkitcmd//ls'
removed `./chkrootkitcmd//cut'
removed directory: `./chkrootkitcmd/'
zipファイルも削除
[root@server ~]# rm -v chkrootkitcmd.zip
rm: remove 通常ファイル `chkrootkitcmd.zip'? y
removed `chkrootkitcmd.zip'
以前のコマンドでchkrootkitを実行
[root@server ~]# chkrootkit | grep INFECTED
[root@server ~]#
rootkitは検出されなかった。