|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2012-4-29 00:20:47
|
显示全部楼层
Linux下后门查找初步
1. 帐号后门
检查/etc/passwd、/etc/shadow文件中如下帐号是否已经拥有合法登录shell、登录口令
bin、daemon、adm、lp、sync、shutdown、halt、mail、news、uucp、games、gopher、ftp、nobody、xfs、named、gdm、sys、nuucp、listen
/etc/passwd文件格式如下
username : password : uid : gid : comment : home_directory : shell
建议对/etc/passwd、/etc/shadow文件做备份,保留在其他主机或可移动介质上,定期对比,检查是否增加了异常帐号。
2. $HOME/.rhosts后门
趁系统干净的时候,记录、备份/etc/hosts.equiv和$HOME/.rhosts文件,定期扫描检查是否增加了这类文件以及原有文件内容是否改变
3. binary木马后门
二进制木马后门是将系统二进制可执行文件替换成特洛伊(trojan)木马文件来达到放置后门的效果。可能是获取了源代码,修改后重新编译。或者借助其他技术直接向二进制程序文件中植入代码。
对这类后门检测的第一步是检查时间戳与校验和,假设已经对文件用类似TripWire这类工具作了时间戳与校验和记录。如果没有使用过TripWire,用"ls -l"和"stat"命令检查时间戳,是否有明显不协调的文件。如果存在,极可能被替换成特洛伊木马植入后门了,仔细作进一步查证。
对于网络应用程序,运行后用netstat和lsof命令查看是否存在不正常的行为。尤其是查看有无异常端口被打开,有无异常文件被打开。
作进一步查证时,第一步是用strings命令查找程序中有无异常字符串。第二步,如有必要,需要将现有二进制代码与确认干净的二进制代码进行比较。
对于这类后门,重点检查这样一些程序
in.ftpd、in.telnetd、in.rshd、in.rlogind、in.rexecd、in.talkd、in.tnamed、in.uucpd、in.tftpd、in.fingerd、sadmind、rquotad、rpc.rusersd、rpc.sprayd、rpc.rwalld、rpc.rstatd、rpc.rexd、rpc.ttdbserverd、rpc.cmsd、kcms_server、ufsd、fs.auto、cachefsd、kerbd、in.lpd、gssd、dtspcd、in.comsat
/etc/init.d目录中启动脚本调用的二进制可执行程序
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
除了上面所列的,还要注意下面这些后门
1) login后门
如果"strings /usr/bin/login | grep crypt"有输出,很可能是木马。
2) ls、dir、vdir后门
ls、dir、vdir后门的用意在于隐藏文件和目录。如果执行这些命令时可以加"-/"选项(原有代码中不支持这个选项),则说明已经被植入木马了。
检查/dev目录,查找是否有诸如"/dev/ptyr"之类的文件,用"ls -l"看结果是否为
-rw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyr
而不是
crw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyr
或
brw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/***
如果有,说明已经有木马了。如果strings ls | grep "/dev/pty"有输出,或者直接strings ls发现可疑路径和文件名,说明已经有木马。对dir、vdir也一样。
3) du后门
du后门同样是用来隐藏文件和目录的。如果命令行中执行这个命令可以加"-/"选项(原有代码中没有这个选项),那么说明已经被植入木马了。检查/dev目录,查找是否有诸如
"/dev/ptyr"之类的文件,用"ls -l"看结果是否为
-rw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyr
而不是
crw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyr
或
brw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/***
如果有,说明已经有木马了。如果strings du | grep "/dev/pty"有输出,或者直接strings du发现可疑路径和文件名,说明已经有木马。
4) ifconfig后门
ifconfig后门就是把下面一行代码注释掉
if ( ptr->flags & IFF_PROMISC ) printf( "PROMISC " );
以去掉网卡混杂模式显示。如果"strings /sbin/ifconfig | grep PROMISC"没有输出,ifconfig肯定已被修改过了。
5) netstat后门
检查/dev目录,检查是否存在"/dev/ptyq"一类的文件,用"ls -l"看结果是否为
-rw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyq
而不是
crw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyq
或
brw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/***
如果有,而执行netstat时用lsof发现它被打开,说明netstat被植入木马。如果命令行中netstat接受"-/"选项(原有代码中没有这个选项),那么,netstat肯定被修改过了。
如果strings netstat | grep "/dev/pty"有输出,或者直接strings netstat发现可疑路径或文件名,说明已经被修改过。
netstat木马程序的一个实现不支持"-p"选项,而系统自身的netstat实现支持"-p"选项。因此如果发现netstat不支持"-p"选项,肯定netstat被修改过。另外,Linux系统的"-p"选项表示打印出进程号(pid)和程序名(program name)信息,而Solaris系统上"-p"表示打印出ARP Cache信息。如果发现与这一点不符,netstat就被修改过。
6) ps后门
检查/dev目录,查找是否有诸如"/dev/ptyp"之类的文件,用"ls -l"看结果是否为
-rw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyp
而不是
crw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyp
或
brw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/***
如果有,而执行ps时用lsof发现它被打开,说明ps被植入木马。如果命令行中ps接受"-/"选项(原有代码中没有这个选项),那么ps肯定被修改过。如果strings ps | grep "/dev/pty"有输出,或者直接strings ps发现可疑路径和文件名,说明已经被植入木马。
7) top后门
检查/dev目录,查找是否有诸如"/dev/ptyp"之类的文件,用"ls -l"看结果是否为
-rw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyp
而不是
crw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyp
或
brw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/***
如果有,而执行top时用lsof发现它被打开,说明ps被植入木马。如果命令行中top接受"-/"选项(原有代码中没有这个选项),那么top肯定被修改过。如果strings top | grep "/dev/pty"有输出,或者直接strings top发现可疑路径和文件名,说明已经被植入木马。
8) tcpd后门
tcpd中有一段代码,这段代码对远程主机名进行查询和检查,拒绝可疑连接。木马的目的是使这段代码失效。
检查/dev目录,查找是否有诸如"/dev/ptyq"之类的文件,用"ls -l"看结果是否为
-rw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyq
而不是
crw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyq
或
brw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/***
如果有,而启动tcpd时用lsof发现它被打开,说明tcpd被植入木马。如果tcpd接受"-/"选项(原有代码中没有这个选项),那么tcpd肯定被修改过。如果strings tcpd | grep "/dev/pty"有输出,或者直接strings tcpd发现可疑路径和文件名,说明已经被植入木马。
9) syslogd后门
检查/dev目录,查找是否有诸如"/dev/ptys"之类的文件,用"ls -l"看结果是否为
-rw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptys
而不是
crw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptys
或
brw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/***
如果有,而启动syslogd时用lsof发现它被打开,说明syslogd被植入木马。如果strings syslogd | grep "/dev/pty"有输出,或者直接strings syslogd发现可疑路径和文件名,说明已经被植入木马。
10) killall后门
检查/dev目录,查找是否有诸如"/dev/ptyp"之类的文件,用"ls -l"看结果是否为
-rw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyp
而不是
crw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyp
或
brw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/***
如果有,而执行killall时用lsof发现它被打开,说明killall被植入木马。如果killall接受"-/"选项(原有代码中没有这个选项),那么killall肯定被修改过。如果strings killall | grep "/dev/pty"有输出,或者直接strings killall发现可疑路径和文件名,说明已经被植入木马。
11) pop3d后门
pop3d-trojan.tar.gz
12) sshd后门
sshd后门把ssh发行包里的login.c作了修改,加入内置的帐号/口令。执行"strings sshd",发现诸如"hax0r3d"这样的字符串,说明sshd已被植入木马
13) cgi后门
在cgi-bin/目录下检查这类cgi程序,尤其是perl写的脚本
14) find后门
检查/dev目录,查找是否有诸如"/dev/ptyr"之类的文件,用"ls -l"看结果是否为
-rw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyr
而不是
crw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/ptyr
或
brw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/***
如果有,而执行find时用lsof发现它被打开,说明find被植入木马。如果find接受"-/"选项(原有代码中没有这个选项),那么find肯定被修改过。如果strings find | grep "/dev/pty"有输出,或者直接strings find发现可疑路径和文件名,说明已经被植入木马。
15) chfn后门
16) chsh后门
4. 守护进程后门
binary木马后门是把系统上原有的二进制可执行程序换成特洛伊(trojan)木马程序。另一类后门是在系统上隐藏一些可执行程序,这些可执行程序原来系统上并不存在。按照网络协议来分类,它们有如下类别
1) UDP后门
启动一个守护进程,侦听某个UDP端口,收到特定UDP报文后启动一个shell。例如udp-backdoor-v2.0.tgz,就是这类后门的安装包。可用"netstat -na -P udp"查看这类后门。
2) TCP后门
诸如bdoor.c之类的小程序。执行"netstat -na -P tcp" 查看这类后门是否在活动。
3) Raw Socket后门
这类后门打开一个raw socket,通过发ICMP包来进行网络通讯。
如果已对文件系统用TripWire之类的工具作了备份和记录,检测这类后门的第一步当然是用这类工具检查是否增加了新文件,特别是可执行文件。如果有,需仔细检查,它极可能是后门程序。
另一方面,在系统上安置守护进程后门后,攻击者要做的事就是如何启动它。如果没有启动,后门毫无用处。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
和,这两个字段的关系就象execve()函数的第一个形参和第二形参。检查/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命令没有列出的 。随后按上面Linux系统一样的方式来做。注意,这里的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 mtu 8232
inet 127.0.0.1 netmask ff000000
hme0: flags=863 mtu 1500
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 ***" 有输出,说明有监听程序在运行,"***"是程序名,进一步仔细查证,
确定是否是后门程序。 |
|