网络安全 频道

Linux环境下发现并阻止系统攻击

下面我们就运行nmap看可以得到什么结果: 选项-sS,指使用TCP SYN, 也就是半连接half-pen扫描, -O,只同时探测被扫描系统的操作系统o。 (利用OS指纹的技术,可以参见http://www.isbase.com/book/showQueryL.asp?libID=271)攻击者知道了 对方使用的何种操作系统就可以有
针对性的寻找该操作系统的常见漏洞

# nmap -sS -O localhost

Starting nmap V. 2.3BETA5 by Fyodor (fyodor@dhp.com,
www.insecure.org/nmap/)
Interesting ports on localhost (127.0.0.1):
Port State Protocol Service
21 open tcp ftp
23 open tcp telnet
25 open tcp smtp
53 open tcp domain
79 open tcp finger
80 open tcp http
98 open tcp linuxconf
111 open tcp sunrpc
113 open tcp auth
139 open tcp netbios-ssn
513 open tcp login
514 open tcp shell
515 open tcp printer

TCP Sequence Prediction: Class=random positive increments
Difficulty=4360068 (Good luck!)
Remote operating system guess: Linux 2.1.122 - 2.2.12

Nmap run completed -- 1 IP address (1 host up) scanned in 2
seconds

这些打开的端口就是攻击者入侵点。当你修改过inetd.conf文件以关闭某些服务,从新启动inetd后,你 再用nmap扫描就可以发现被注释掉的服务扫描不到了。 当然,管理员还可以使用一些其他的安全扫描工具如:satan或 Nessus等 来检测自己的系统的安全可靠性,在攻击者发现其以前更早的发现自己的系统的漏洞,并加以弥补。

三、
一个笑话里说一个小偷进入到一家,偷光了屋子里所有的东西,但是却用一个相同的东西代替了偷走的东西。但是在网络世界里,这却是可能发生的。一个攻击者利用一个系统漏洞非法入侵进入到你的系统后,当你使用ps命令列出系统中的所有的进程时,却看不到什么异常的证据。你查看你的password文件,一切也是那么的正常。到底发生了什么事情呢?当系统进入到你的系统以后,第一步要做的事情就是取代 系统上某些特定的文件:如netstat命令等。当你使用netstat -a命令时,就不会显示系统攻击者存在的信息。当然攻击者将替代所有的可能泄露其存在的文件在linux环境下一个有名的这样的工具包名字是rootkit。通过在任何一个搜索引擎搜索关键字rootkit可以得到数以百计的结果。这些工具一般来说包括:

ps netstat top .....

由于这些经过文件已经被取代。所以简单的利用ls命令查看这些文件是看不出什么破绽的。有若干种方法你
可以验证系统文件的完整性。如果你安装的是Red Hat, Caldera, TurboLinux或任何使用RPM的系统。你可
以利用RPM来验证系统文件的完整性: 首先你应该查明你的那些你需要查看的文件来自哪个软件包,使用
rpm命令你可以查明某个文件属于某个包: # rpm -qf /bin/netstat net-tools-1.51-3 然后,可以扫描
整个rpm包来查看那些发生了改变。对没有发生改变的包使用该命令将没有任何输出信息,如下所示:

# rpm -V net-tools

将netstat的5.2版本的二进制可执行文件替换为6.0的版本以后再使用该命令的结果为

.......T /bin/netstat

这说明/bin/netstat/文件已经被修改。若我使用rpm -qf测试ps和top命令可以得到其属于包procps,然后再验证包procps的完整性。下面是一个被"黑"的站点的结果:

# rpm -qf /bin/ps procps.2.0.2-2
# rpm -V procps
SM5..UGT /bin/ps
..UGT /usr/bin/top

攻击者入侵到系统中,并且用自己的ps及top命令替代了我们系统中的命令。从而使管理员看不到其运行的进程,也许是一个sniffer来监听所有的用户所有进出网络的数据并找寻到密码信息。 下面是一个小的script来扫描你系统的所有的rpm库,并检查所有的包是否被篡改。但是应该注意的是并不是所有该scripts
报告的问题都是说明该系统文件被攻击者破坏。例如你的password文件一般肯定和你安装系统时是不同的:

#!/bin/bash
#
# Run through rpm database and report inconsistencies
# for rpmlist in `rpm -qa`
# These quotes are back quotes
do echo " ----- $rpmlist -----" ;
rpm -V $rpmlist done > /tmp/rpmverify.out

当你运行该scripts时,输出被定向到文件/tmp/rpmverify.out你可以使用less命令查看该文件。但是由于文本文件如:/etc/passwd, /etc/inetd.conf等很可能显示为被修改过。但是你如何知道这些是管理员
自己修改的还是入侵者修改的呢?方法是:在你确保你的系统是干净的,没有被攻击者入侵时,你为这些系统文件创建指纹信息。在你怀疑你的系统被入侵时使用这些这些指纹信息来判定系统是否被入侵。创建文件的指纹信息是通过命令md5sum 来实现的:

# md5sum /etc/passwd
d8439475fac2ea638cbad4fd6ca4bc22 /etc/passwd

# md5sum /bin/ps
6d16efee5baecce7a6db7d1e1a088813 /bin/ps

# md5sum /bin/netsat
b7dda3abd9a1429b23fd8687ad3dd551 /bin/netstat

这些数据是我的系统上的文件的指纹信息。不同的系统上的文件的 指纹信息一般是不同的,你应该是使用md5sum来计算自己系统文件的指纹信息。下面是一些你应该创建指纹信息的文件;
/usr/bin/passwd /sbin/portmap /bin/login /bin/ls /usr/bin/top /etc/inetd.conf /etc/services
通过指纹信息你可以决定是否有系统文件被篡改。

四、
上一节中说过,当netstat,ls等命令被修改,从而发现系统已经被入侵,下面该怎么办?根据你系统的重要
性的不同,你有很多种选择。但是我推荐对用户目录,password及其他关键的系统文件进行备份。然后重新
安装系统。但是不要随便就将备份的文件拷贝到新系统,因为攻击者可能在这些文件中隐藏一些非法的东西。也可以不重新安装系统,而是通过TCP wrapper来限制对主机的访问,并且关闭非关键的网络服务。然后更新被影响的包。重新"干净"的启动系统是很重要的,但是要实现这点并不容易。若你发现procps或net-tools包已经被攻击者修改,第一件事情是重新安装干净的包来替换被攻击者做了手脚留下后门的包。一般最好从你的系统发布者处得到最新的包来重新安装。

一旦攻击者进入到系统其就将在系统上存放一些工具并且将之隐藏起来,使你不容易发现。下面是一个被攻击者入侵的系统的实例。当系统被攻击者入侵,服务器被限制网络访问,并且替代所有的受影响的包。然后就需要通过仔细查看log文件来发现重复的企图进入系统。查看/etc/passwd文件,发现一个不属于合法的用户。进入到该用户的目录下:/home/jon,运行 "ls -l"得到如下的内容:

. .. .. .bashrc .bash_history .screenrc emech.tar.gz

除了一个名字为emech.tar.gz的文件以外,看不出什么异常现象。但是仔细观察,你就会发现系统有两个
".."目录。(指该子目录的上一级目录)是的确很奇怪,我使用命令"cd .."我就会进入到/home目录。原来
其中子目录名字是在两个点后面有一个空格。(".. ")你可以通过如下命令发现:

# cd /home/jon
# echo .* | cat -v
. .. .. .bashrc .bash_history .screenrc emech.tar.gz

仔细观察可以发现每个子目录都是被一个空格隔开,而在第二个“..”和.bashrc之间有两个空格。这就
意味着第二个".."子目录其实为点-点-空格。下面进入到该目录:

# cd ".. "

然后列出该目录下的内容:

#ls

randfiles mech.set mech.pid checkmech cpu.memory
mech.help mech.usage mech mech.levels emech.users psdevtab

下一步我们再查看是否其还在其他地方隐藏了文件:

# find / -user jon -print

除了/home/jon目录以外,还发现如下的内容;

/usr/local/bin/.httpd
/tmp/cl
/tmp/.l/bcast
/tmp/.l/.l
/tmp/.l/imapd
/tmp/.l/log
/tmp/.l/pscan
/tmp/.l/pscan.c
/tmp/.l/rpc
/tmp/.l/slice2
/tmp/.l/sniffer
/tmp/.l/sxploit
/tmp/.l/thc
/tmp/.l/ufs.c

这个入侵者已经在系统上安装了Sniffers、端口扫描器,他给自己营造了一个很好的"家" 。在查看中,还
在合法的用户的目录下发现了一个可怕的名为"tcp.log"的文件。文件该文件有几百行长,包括每一次elnet 及 ftp 出入该系统的连接!除了通告在该文件中出现的可能已经被入侵的机器管理员应该重新安装
系统以外,我同样告诉他们需要更新系统的所有的用户的口令。

下面有一些例子来帮助你搜索隐藏的危险。首先查看位于用户目录的具有"suid"或"guid"的文件。这些文件的可执行属性位为s而不是x。如:

#ls -s /usr/bni/passwd
-r-s--x--x 1 root root 10704 Apr 14 1999 /usr/bin/passwd

属性第四位的 "s" 表示该命令被执行时,该进程的实际有效用户ID就变为root用户。为了允许普通用户修
改自己的密码,这是必须的。第七位的x若为s则表示别的组的用户若运行该程序则该程序则具有用户所有组
的有效组ID。使程序能冒充特定的用户或者组并不是一件有害的事情。但是一般来说非管理用户在其目录下
不应该具root-suid 程序。我们可以使用下面的命令来查寻这样的文件:

# find /home -perm -4000 -o -perm -2000 -print

下一步我们继续寻找入侵者留下的程序和文件,所以需要一个快速的寻找隐藏目录的方法。下面的方法就是
寻找如".kde"的隐藏目录。你也可以找到如".. "或“..."等目录:cracker.

# find / -type d -name ".*" -print

"-type d"选项指仅仅列出目录。这个命令不会不会将"."或".."列出。

五、 
作为一个好的系统管理者,为了击败攻击者的攻击行动,最好的方法是了解攻击者的工作原理和机制。它
们使用了那些工具,它们如何操作入侵等等。所以深入理解掌握我这里讲解的各种网络工具是很有必要的。

上面用实例的方式说到了了一个攻击者使用sniffer监听网络流来搜集用户名和密码。下面我们就详细说明sniffer是如何工作的。简单的说,sniffer是一个使你能检测你的网络接口接收到所有的数据报。一般情况下,计算机仅仅接受目的地址是自身的数据报,而sniffer使网络接口进入杂错模式,从而可以接受网卡收到的所有的数据报。

若你运行ifconfig eth0命令,会得到下面的结果:


eth0 Link encap:Ethernet HWaddr 00:C0:4F:E3:C1:8F
inet addr:192.168.22.2 Bcast:192.168.22.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:49448 errors:0 dropped:0 overruns:0 frame:0
TX packets:33859 errors:0 dropped:0 overruns:0 carrier:0
collisions:6 txqueuelen:100
Interrupt:10 Base address:0x300


打开两个终端,一个终端里运行sniffer器-sniffit;
# sniffit -i
另外一个虚拟终端里你可以再次运行ifconfig eth0。你将会发现输出中有下面的内容

UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
注意和上面相比较,增加了一个单词"PROMISC" 这是杂错模式(promiscuous mode)的缩写,

sniffit是一个轻量级的,基于终端的sniffer器。你可以从
http://reptile.rug.ac.be/~coder/sniffit/sniffit.html得到它。

另外一个类似的sniffer是netwatch,你可以从http://www.slctech.org/~mackay/net
watch.html得到它。

如果你不希望在系统中安装另外的sniffer,你可以使用系统中带有的一个工具:tcp
dump 这个工具虽然
不如前面两个工具那么华丽,但是她可以完成所有同样的功能。

# tcpdump host www.linuxjournal.com -l | tee /tmp/tcpdump.out
其中-l指示tcpdump将输出数据存进入一个文件中。下面是输出的内容:


16:41:49.101002 www2.linuxjournal.com.www > marcel.somedomain.com.1432: F
2303148464:2303148464(0) ack 1998428290 win 16352
16:41:49.101206 marcel.somedomain.com.1432 > www2.linuxjournal.com.www: .
ack
1 win 32120 (DF)
16:41:50.001024 www2.linuxjournal.com.www > marcel.somedomain.com.1429: F
1805282316:1805282316(0) ack 1988937134 win 16352
16:41:50.001215 marcel.somedomain.com.1429 > www2.linuxjournal.com.www: .
ack
1 win 32120 (DF)
16:41:50.840998 www2.linuxjournal.com.www > marcel.somedomain.com.1431: F
1539885010:1539885010(0) ack 1997163524 win 16352
16:41:50.841198 marcel.somedomain.com.1431 > www2.linuxjournal.com.www: .
ack
1 win 32120 (DF)
16:41:51.494356 marcel.somedomain.com.1429 > www2.linuxjournal.com.www: P
1:335(334) ack 1 win 32120 (DF)
16:41:51.497003 marcel.somedomain.com.1433 > www2.linuxjournal.com.www: S
2019129753:2019129753(0) win 32120
(DF)
16:41:51.671023 www2.linuxjournal.com.www > marcel.somedomain.com.1429:R

Linux系统中可以得到有很多种的sniffer。攻击者在入侵系统以后,也许会使用修改的ps命令来隐藏其运
行的sniffer器。或者将其改为一个看上去很正常的进程的名称。
http://hackbase.com/tech/2004-09-29/93102.html

0
相关文章