动,后门毫无用处。Unix系统上守护进程通过rc脚本来启动,对网络守护进程,还可以
通过inetd 超级服务器来启动。相应地,检测这类后门也依据这些,并结合这类后门大都
要进行网络通讯的特征
1) 检查rc脚本
对Solaris系统,在/etc目录下有这样一些rc脚本
rcS、rc0、rc1、rc2、rc3、rc5、rc6
对Linux,rc脚本在/etc/rc.d目录下,它们是rc、rc.local、rc.sysinit。
对Solaris系统,rc[S-6]脚本名最后一个数字或字母表示运行级别。/etc目录下另有
rc0.d、rc1.d、rc2.d、rc3.d、rcS.d五个目录,目录名中''.''前面的数字或字母同样是表
示运行级别。rc[S-6] 脚本的作用是,按运行级别,对相应的rc[S-6]目录下文件名以''S''
打头的脚本文件,赋给参数start,启动相应的守护进程,以''K''打头的脚本文件,赋给参
数stop,关闭相应的守护进程。其中的例外是,rc5和rc6脚本启动或关闭的是rc0.d中
的守护进程。此外,rcS、rc0、rc1、rc5、rc6脚本还进行文件系统安装或拆卸工作。特
别是 rcS,它是系统启动时必须执行的,它对文件系统进行检查和安装,进行各项系统配
置。
对Linux系统,/etc/rc.d目录下有rc0、rc1、rc2、rc3、rc4、rc5、rc6这七个目录。
/etc/rc.d/rc脚本依据运行级别象Solaris上一样通过rc[0-6]目录中的脚本启动或关闭
守护进程。同时,对每个运行级别,rc.local脚本都将执行。rc.sysinit脚本系统启动时
必须执行,它检查和安装文件系统,进行各项系统配置。
检查上面的几个脚本文件,如果发现文件被修改,加有别的东西执行别的程序,必须仔细
检查这些程序,很可能是启动某个后门程序。
上面所列的rc?.d目录中的脚本文件,对Solaris,都是到/etc/init.d目录中某个脚本文
件的符号连接或者硬链接,对Linux,都是到/etc/rc.d/init.d目录中某个脚本文件的符
号连接或者硬链接。这些rc?.d目录中的脚本文件名为SNN***或KNN***,NN为数字,它
的大小表明脚本执行的次序,***为字符串,表示服务名。对脚本文件名的 *** 部分,在
Solaris上大致为下面这些
ANNOUNCE MOUNTFSYS PRESERVE RMTMPFILES ab2mgr
afbinit audit autofs autoinstall buildmnttab
cachefs.daemon cachefs.root cacheos cacheos.finish cron
devlinks drvconfig dtlogin inetinit inetsvc
init.dmi init.snmpdx initpcmcia keymap lp
mkdtab nfs.client nfs.server nscd pcmcia
power rootusr rpc savecore sendmail
spc standardmounts sysetup sysid.net sysid.sys
syslog ufs_quota utmpd volmgt xntpd
在Linux上,大致为下面这些
anacron apmd arpwatch atd crond functions
gpm halt httpd httpd.orig identd inet
ipchains ipsec irda kdcrotate keytable killall
kudzu linuxconf lpd named netfs network
nfs nfslock pcmcia portmap random rstatd
rusersd rwalld rwhod sendmail single snmpd
syslog xfs ypbind yppasswdd ypserv
仔细检查这些rc?.d 目录,如果发现某个脚本文件不是到/etc/rc.d/init.d或/etc/init.d
目录中某个脚本文件的符号连接、硬链接,或者出现与上面文件名规则不相符的脚本文件,
或者增加了某个脚本文件,它很可能是用来启动后门进程的,必须仔细检查这些脚本启动
的程序。
确信rc?.d目录中脚本文件都是到/etc/rc.d/init.d或/etc/init.d目录中某个脚本文件
的符号连接、硬链接后,再cd到/etc/rc.d/init.d或/etc/init.d目录下。检查init.d
目录下的脚本文件。如果某个脚本启动的服务进程与名称不符,或者脚本文件的内容被修
改,加有别的什么东西启动了别的进程,必须仔细检查,极可能是被用来启动后门进程。
除此之外,与二进制木马后门相交叉,对init.d目录下脚本文件启动的每一个程序本身,
都要仔细检查,运行起来看看有没有什么不正常的现象,防止它有可能被换成木马。对于
init.d目录中的脚本文件启动的程序,它们的二进制文件大都在/usr/bin、
/usr/local/bin、/sbin、/usr/sbin目录下。
2) 检查/etc/inetd.conf配置文件
注意/etc/inetd.conf中的语法
#
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
形参。检查/etc/inetd.conf,特别是最后两个字段,是否除通常的服务外启动了别的服务。
如果有的话,仔细检查这项服务,很可能是在启动后门程序。
同样,与binary木马后门相交叉,对inet.conf所列的每项服务,都要对相应程序进行检
查,很有可能它们被换成木马程序。
3) 使用netstat和lsof命令
如果后门程序作为守护进程启动,通常它侦听某个端口,通过该端口与外网连接。攻击者
借此获取对系统的访问。
对Linux系统,用"netstat -nap"命令列出网络状态信息,特别注意
状态,而系统又没有在这个端口启动服务,从
它肯定是后门程序。如果
端口上配置服务,从
常系统配置允许使用的客户程序,仔细检查该程序,它属于不正常的行为,很可能是后门
程序。
对Solaris系统,先用"netstat -na"列出网络状态信息,取出
local_host_addr:port。再执行"lsof -i tcp@local_host_addr:port"命令,或者对UDP
协议执行"lsof -i udp@local_host_addr:port"命令,这样就得到了netstat命令没有列
出的
local_host_addr 是本机的IP地址或主机名,也可以简化为 tcp:port 或 udp:port,还
可以加上 -T[q、s、w 任意组合] 选项列出队列长度、状态、窗口大小信息。
对于raw socket,用"lsof -n | grep raw"命令进行检查。
5. cron后门
除了以守护进程方式启动后门,还可以利用cron机制启动后门,下面就是植入这类后门的
一个脚本
-------------------------------------------------------------------------------
#! /sbin/sh
# Which port should the shell start on
PORT="31337"
# Where (and under what name) to hide the socket demon
HIDE="/dev/ptyp"
# Time when the demon should start (0-23 h, military time)
START="2"
# Same like above but when should it stop
STOP="3"
if [ "`whoami`" != "root" ]; then
echo "you had to be root to do this!"
exit 1
fi
echo "#define PORT " $PORT > backdoor.c
cat >> backdoor.c << ''EOF''
... ...
EOF
gcc -O3 -o $HIDE backdoor.c
if [ -f $HIDE ]; then
echo "Compiling done"
rm -f backdoor.c
else
echo "Unable to compile"
rm -f backdoor.c
exit 1
fi
echo "STARTTIME = "$START"; ENDTIME = "$STOP"h"
echo "*" $START "* * *" $HIDE > crontabfile
echo "*" $STOP "* * * killall -9 "$HIDE >> crontabfile
crontab crontabfile
rm -f crontabfile
-------------------------------------------------------------------------------
(这个脚本有问题,如果这样做了,会破坏原来的/var/spool/cron/crontabs/root)
对Linux系统,crontab文件位于/var/spool/cron目录中,对Solaris系统,位于
/var/spool/cron/crontabs目录中。这些crontab文件一般以用户名作文件名,cron守护
进程每隔一分钟就检查一次,依据它们更新内存中的crontab表。编辑crontab文件后,
后门程序就在固定的时间启动和停止。
检测后门时,相应地检查/var/spool/cron/crontabs或/var/spool/cron目录中的crontab
文件,查看是否有可疑程序被执行了。如果有,仔细检查它是否是后门程序。与binary木
马后门相交叉,还要仔细检查原有cron任务对应的程序,防止它们被换成木马。
如果cron后门有网络通讯,与守护进程后门一样,可以结合netstat和lsof命令来检测。
6. 动态链接库后门
几乎所有的Unix系统使用动态库。动态库重用相同代码而减少空间占用。入侵者可以修改
动态库里的函数,比如说crypt()、open()或read()等,在修改后的函数里植入后门,启
动shell或建立网络连接。
动态库后门的特点是非常隐蔽,一旦植入很难被发现。尤其是可以用来避免后门作为守护
进程常驻后台,这就大大减小了被发现的可能性。例如这样,在系统经常调用的函数,比
如open()里植入后门,后门程序启动一个进程作为连接的客户端,它主动发起连接连向攻
击者指定主机上的守护进程。如果连接失败或攻击者没有坐在机器前输入什么数据相应,
后门进程立即退出。如果连接成功而攻击者又坐在机器前,攻击者迅速做完要做的事后断
开连接,后门进程立即退出。如果攻击者在夜深人静的工作,在这个短暂的时间里很难被
发现。
对于动态库后门,很难检测出来。一般说来,对大多数动态库,都有一个对应的静态库。
它们的功能是相同的,只有动态连接和静态连接的区别。因此一种检测方法是,如果通过
某种方法,比如说比较MD5校验和,确信静态库没有被污染,那么,对于经常被调用的函
数,用objdump观察动态库和静态库,比较这些函数在动态库和静态库中的代码有没有什
么区别。如果某个函数有区别,说明这个动态库函数已被植入后门。
当然,如果静态库已经被污染,就需要干净系统动态库文件的一份拷贝了。用objdump来
对经常被调用的函数进行比较,检查是否某个函数被植入后门。
另一种方法是,写一个main()函数来调用这些经常被调用的函数,编译后运行它。运行时
查看有没有什么异常,特别是用netstat和lsof查看有无哪个端口或文件不正常地被打开。
如果有这些异常,说明相应函数被植入后门。做这件事时要特别小心,最好事先作好系统
备份,以防某些有害后门对系统造成伤害,比如说删除某个文件。
如果检测binary木马后门和守护进程后门时发现异常,但又未发现某个可执行文件被换成
木马,也没有发现暗藏的后门程序,此时就要注意动态库了,很可能是在动态库做了手脚。
经常调用的函数列表
函数 | 所在的库文件 | 简单说明
-----------------+-----------------------+-----------------------
open | libc.so | . . .
-----------------+-----------------------+-----------------------
close | libc.so | . . .
-----------------+-----------------------+-----------------------
crypt | libcrypt.so | . . .
-----------------+-----------------------+-----------------------
(注意完成这个表)
为了检测这类后门,下面给出一个shell脚本。从干净系统上取得一个动态库拷贝,用这
脚本进行比较,查看代码有没有什么区别,以确定是否被置入后门。
-------------------------------------------------------------------------------
此处代码略
-------------------------------------------------------------------------------
7. SLKM后门
THC的slkm-1.0.tar.gz
-------------------------------------------------------------------------------
此处代码略
-------------------------------------------------------------------------------
8. sniffer后门
sniffer用来监听主机或网络,以获取敏感数据,比如帐号/口令。对于网络监听,可以查
看网络接口是否处于混杂(promisc)模式后确定。
对Linux系统,在命令行执行ifconfig命令,如果发现PROMISC这个字符串,说明网络接
口处于混杂(promisc)模式,排除合法用户运行网络协议分析程序后,意味着有sniffer在
运行。如果这样,立即执行命令"lsof -n | grep sock",对第五列TYPE字段为sock的那
些输出行仔细检查,确定出哪一个程序在sniffer,删除之。
对于Solaris系统,用下面的方法来查出是否有某个进程在进行网络监听,它是正常运用
还是后门程序
# ifconfig -a # 列出活动的网络接口
lo0: flags=849
inet 127.0.0.1 netmask ff000000
hme0: flags=863
inet 192.168.10.2 netmask ffff0000 broadcast 192.168.255.255
ether 8:0:20:b0:64:6d
# ls -l /dev/hme* # 查出网络接口设备
lrwxrwxrwx 1 root other 29 Oct 9 1998 /dev/hme->../devices/pseudo/clone@0:hme
# ls -l /devices/pseudo/clone@0:hme # 细看一下
crw------- 1 root sys 11, 7 Oct 9 1998 /devices/pseudo/clone@0:hme
# lsof | grep "hme" # 用 lsof 查看是否处于混杂模式
snoop 7988 root 3u VCHR 7,2 0t0 423220 /devices/pseudo/clone@0:hme->bufmod->hme
# lsof | grep "clone@0:hme" # 同上
snoop 7988 root 3u VCHR 7,2 0t0 423220 /devices/pseudo/clone@0:hme->bufmod->hme
#
"lsof | grep ***" 有输出,说明有监听程序在运行,"***"是程序名,进一步仔细查证,
确定是否是后门程序。
http://netadmin.77169.com/HTML/20050912011900.html