
§2 扫描
如果说踩点相当于寻找并侦察情报中心的话,扫描就是在逐寸敲打墙壁以期找出所有门窗了。在第1章里,我们通过whois和ARIN查询获得了一份IP网络地址块和IP地址清单。那些技巧向系统安防管理员(以及黑客)提供了很多有价值的信息,包括员工们的姓名和电话号码、IP地址范围、DNS服务器以及邮件服务器等等。在这一章里,我们将利用各种工具和技巧——比如ping扫描、端口扫描以及各种自动发现工具——去确定在目标网络里都有哪些系统正在监听外来的网络通信(或者说是真实存在的),以及都有哪些系统可以从因特网直接进行访问。你们还将看到如何绕过防火墙去扫描对方有意识地使用防火墙规则阻断了普通扫描活动的系统。
我们将依次测试每一个目标系统以判断它是否真实存在以及它(如果有的话)正在监听着哪些端口。我们曾见过许多配置不当的DNS名字服务器把内部网络的IP地址(例如10.10.10.0)夹杂在公共IP地址表里列了出来。因为这些内部IP地址是无法通过因特网上的路由到达的,所以试图寻找一条访问这些地址的路由只会让你白费功夫。保留给内部网络使用的IP地址包括10.0.0.0/8、172.16.0.0/12和192.168.0.0/16。RFC 1918号文档对无法通过公共网络路由进行访问的IP地址范围做了详细的介绍(http://www.ietf.org/rfc /rfc1918.txt)。
现在,让我们开始情报收集工作的第二阶段:扫描。
§2.1 确定目标系统是否真实存在
要想查出某个网络的拓扑结构,最基本的步骤之一是对其IP地址范围和网络地址块进行一轮自动化的ping扫描,以确定在这个网络里都存在着哪些设备或系统。传统意义上ping操作是这样的:向目标系统发出一些ICMP ECHO(协议类型8)数据包,如果从目标系统返回了一个ICMP ECHO_REPLY数据包(协议类型0),就说明目标系统是真实存在的。
在linux中,在/etc/sysctl.conf中添加net.ipv4.icmp_echo_ignore_all=1,再执行sysctl -p /etc/sysctl.conf,就不会响应任何ICMP_echo,也就不能ping通。
* 网络ping扫描
流行度:
10
简单度:
9
影响力:
3
风险率:
7
Fping是一款快速的ping的工具。具体参见相关命令手册。
由Fyodor编写的nmap工具(http://www.insecure.org/nmap)也可以进行ping扫描。扫描功能更强,比如:nmap -sP 192.168.1.0/24
Foundstone公司(http://www.foundstone.com)开发的SuperScan软件是个值得一试的自由软件产品。
从技术角度讲,以下几类的ICMP数据包都可以用来ping一台主机(详见RFC 792号文档)。常用的ICMP数据包类型有:
— 消息类型:0 – Echo Reply(回音应答)
— 消息类型:3 – Destination Unrechable(目的地无法到达)
— 消息类型:4 – Source Quench(源主机准备关机)
— 消息类型:5 – Redirect(重定向)
— 消息类型:8 – Echo(回音)
— 消息类型:11 – Times Exceeded(超时)
— 消息类型:12 – Parameter Problem(参数有错误)
— 消息类型:13 – Timestamp(时间戳)
— 消息类型:14 – Timestamp Reply(时间戳应答)
— 消息类型:15 – Information Request(信息请求)
— 消息类型:16 – Information Reply(信息应答)
以上这些ICMP数据包都可以用来发现网络上的主机,具体情况取决于目标主机上的ICMP实现和它对这些数据包类型的响应。不同的操作系统会对这些ICMP数据包类型做出不同的响应或是不做出响应,利用这些细微的差异可以推测出目标主机使用的操作系统。
SolarWinds公司(http://www.solarwinds.net)开发的Ping Sweep软件(它是一种商业化软件)也是一种速度奇快的ping扫描工具。Ping Sweep工具之所以有那么高的扫描速度,是因为它允许用户设定数据包的发送间隔时间——如果把这个值设定为0或1的话,Ping Sweep在7秒钟之内就可以完成对一个C类网络从头到尾的扫描和主机名解析工作。不过,扫描速度太快并不见得是件好事,128K ISDN或Frame Relay(帧中继)等低速链路的带宽很容易因为这些高速ping扫描工具在短时间内发出的大量数据包而被消耗殆尽——卫星或红外线(IR)链路就更不用说了。
Windows环境下的其他ping扫描工具还包括WS_Ping ProPack(www.ipswitch.com)和NetScanTools(www.nwpsw.com)。这两种工具完全可以胜任对一个小网络的扫描工作,但它们的扫描速度却要比SuperScan和Ping Sweep慢不少。我们还想提醒大家的是,虽然这些GUI界面的ping扫描工具可以提供赏心悦目的输出效果,但如果你们打算把ping扫描编写为脚本的话,这些工具就很难满足要求了。
看到这里,有些读者可能会问:万一目标站点阻断了ICMP数据包,情况又会是怎样的呢?这个问题问得好。有安防意识的站点往往会在它们的网络边界路由器或防火墙上阻塞ICMP,但即使目标网络阻断了ICMP,我们还是可以利用其他一些工具和技巧去发现它里面真实存在并正在运行的系统,只是在准确性和效率方面要比正常的ping扫描差一些罢了。
如果目标网络阻断了ICMP通信,端口扫描(port scanning)将是我们用来发现活跃主机的首选替代技术(我们将在本章稍后对端口扫描做详细的讨论)。通过扫描每个潜在IP地址上的常用端口,我们就能通过发现目标系统开放或正在监听着的端口,从而判断出有哪些主机是真实存在的。这种技术往往需要花费很多的时间,但它经常能够发现一些隐藏得很深或受到高度保护的系统。
在Windows环境下,我们推荐的端口扫描工具是SuperScan。正如刚才讨论的那样,SuperScan工具可以分别使用ICMP和TCP/UDP发现目标网络里的主机和服务。它的TCP/UDP端口扫描选项可以帮助你们判断出目标网络里的某个主机是否真实存在——而不需要使用ICMP。
UNXI/Windows工具nmap也可以利用端口扫描技术去发现目标主机。除我们刚才介绍的ICMP扫描能力外,nmap工具还提供了一种更为高级的扫描选项——TCP ping扫描。nmap工具可以对其“-PT”选项指定的端口(通常是80号端口)进行TCP ping扫描。选用80号端口是因为大多数网络都允许80号端口上的通信穿过自己的网络边界路由器到达不设防区(demilitarized zone,DMZ)里的系统,有些网络甚至允许这类通信穿过自己的主防火墙。“-PT”选项将使nmap工具向目标网络发出一系列TCP ACK数据包并根据从目标网络返回的RST数据包去判断有哪些活跃主机。之所以会选用发出ACK数据包的办法进行TCP ping扫描,是因为绝大多数无状态(non-stateful)防火墙产品(比如Cisco IOS系列)通常都会放行这种数据包。我们来看一个例子:
[root] nmap -sP -PT80 192.168.1.0/24
TCP probe port is 80
Starting nmap V. 3.70
Host (192.168.1.0) appears to be up.
Host (192.168.1.1) appears to be up.
Host shadow (192.168.1.10) appears to be up.
Host (192.168.1.11) appears to be up.
Host (192.168.1.15) appears to be up.
Host (192.168.1.20) appears to be up.
Host (192.168.1.50) appears to be up.
Host (192.168.1.101) appears to be up.
Host (192.168.1.102) appears to be up.
Host (192.168.1.255) appears to be up.
Nmap run completed (10 hosts up) scanned in 5 seconds
如上所示,即使目标网络阻断了ICMP,我们也能有效地确定那个网络里都有哪些系统正在运行。分别对SMTP端口(25)、POP端口(110)、IMAP端口(143)、AUTH端口(113)以及目标网络独有的其他常用端口多进行几次扫描,往往会有意想不到的收获。
http://www.hping.org的hping2工具比较适合技术型读者,这个UNIX环境下的TCP ping扫描工具有一些nmap工具不具备的TCP功能。hping2工具允许用户设定UDP、TCP和Raw IP数据包里的某些特定选项,而这使得hping2工具发出的扫描数据包可以穿透某些网络访问控制设备。
用hping2工具的“-p”选项指定一个TCP目的端口就可以进行一次简单的TCP ping扫描。hping2工具可以像在第1章介绍的traceroute技巧那样绕过某些网络访问控制设备。除了可以进行TCP和UDP ping扫描,hping2工具还具备把数据包分割为多个片段的能力,可以利用这种能力可以绕过某些网络访问控制设备。我们来看一个例子:
[root]# hping2 192.168.0.2 -S -p 80 -f
HPING 192.168.0.2 (eth0 192.168.0.2): S set, 40 data bytes
60 bytes from 192.168.0.2: fl ags=SA seq=0 ttl=64 id=418 win=5840
time=3.2 ms
60 bytes from 192.168.0.2: fl ags=SA seq=1 ttl=64 id=420 win=5840
time=2.1 ms
60 bytes from 192.168.0.2: fl ags=SA seq=2 ttl=64 id=422 win=5840
time=2.0 ms
— 192.168.0.2 hping statistic —
3 packets tramitted, 3 packets received, 0% packet loss
比较简单的访问控制设备往往无法正确处理被分割为多个片段的数据包,这就使得hping2工具的扫描数据包可以穿越它们而探测出目标系统是否真实存在。一般来说,只要目标系统有一个开放着的端口(flags=SA),就会在收到hping2工具发出的扫描数据包时返回TCP SYN(S)和TCP ACK(A)标志作为响应。hping2工具的数据包计数选项“-cN”使得这个工具很容易被集成到一个shell脚本里去——“-cN”选项使hping2工具在向目标系统发送“N”个数据包后结束运行并开始执行下一条脚本命令。虽然hping2工具在扫描速度方面不如前面介绍的某些ICMP ping扫描方法,但某些特定配置的目标网络只有用hping2工具扫描才能有所收获。我们将在第9章对hping2工具做进一步介绍。
由Simple Nomad团队开发的icmpenum程序(http://www.nmrc.org/files/sunix /icmpenum-1.1.1.tgz)是我们将在本小节介绍的最后一个TCP ping扫描工具。这个UNIX程序是很一个方便的ICMP查点工具,利用它可以迅速确定目标网络里都存在着哪些活跃的系统。这个工具既可以发出传统的ICMP ECHO数据包、也可以发出ICMP TIME STAMP REQUEST和ICMP INFO请求(类似于SuperScan工具)。换句话说,即使ICMP ECHO数据包被目标网络的边界路由器或防火墙阻断了,icmpenum程序也可以利用其他类型的ICMP数据包把目标网络里的活跃系统找出来:
[shadow] icmpenum -i2 -c 192.168.1.0
192.168.1.1 is up
192.168.1.10 is up
192.168.1.11 is up
192.168.1.15 is up
192.168.1.20 is up
192.168.1.103 is up
在上面的例子里,我们利用ICMP TIME STAMP REQUEST数据包对C类网络192.168.1.0从头至尾进行了一次查点。不过,icmpenum工具的真正威力在于它可以使用伪造的数据包去发现目标网络里的活跃系统,以免被对方监测到扫描活动的真正来源——icmpenum工具的“-s”选项可以给它发出的扫描数据包设置一个虚假的源地址,“-p”选项可以让它以被动方式监听从目标网络返回的响应。
总结一下,在查点步骤里,我们可以选用某种ICMP扫描工具或是其他类型的端口扫描工具准确地把目标网络里的活跃系统找出来。同时,我们已经从某C类网络共255个可用的IP地址当中发现了几个真实存在并正在运行着的主机,这些主机将是我们侦察活动的重点目标。
* 针对网络侦察活动的防范措施
虽说ping扫描活动看起来只是一种骚扰,但及时监测到这种活动的发生还是非常重要的。根据具体的安防策略,你们也许还需要阻断ping扫描数据包。下面是我们在这两方面给出的建议。
-*监测
利用ping扫描活动摸清目标网络的拓扑结构,是在发起攻击之前侦察目标网络的有效办法之一;所以防御者对ping扫描活动进行监测有助于判断攻击将在何时发生和来自何方。监测ping扫描活动的基本方法是使用诸如Snort(www.snort.org)之类基于网络的IDS(intrusion detection system,入侵监测系统)程序。
从基于主机的角度,有几种UNIX实用工具可以监测到ping扫描活动并把它们记载到日志文件里去。如果你们在查看有关日志时发现来自某个系统或网络的ICMP ECHO数据包是某种可疑的模式,那可能代表着有人正在对你们的站点进行网络侦察。一定要密切留意这类活动,它往往预示着一次全面的攻击已迫在眉睫。
有许多种商业化的网络和桌面防火墙工具(Cisco、Check Point、Microsoft、McAfee、Symantec和ISS等公司都能提供)可以监测到ICMP、TCP和UDP ping扫描活动。但存在可以监测ping扫描活动的技术,并不意味着有人在密切监测着这类活动。
基于Windows主机的自由软件类ping扫描监测工具是存在的。Genius工具就是一种很不错的共享/自由软件类产品。Genius工具的最新版本是3.1,可以从http://www.indiesoft.com网站下载。Genius工具不能监测系统是否受到了ICMP ECHO(ping)扫描,但它将监测是否有人在对某个特定的端口进行TCP ping扫描。表2.1列出了一些可以提高你们安防监控能力的UNIX ping扫描监测工具。
程序
资源
Scanlogd
http://www.openwall.com/scanlogd
Courtney
http://packetstormsecurity.org/UNIX/audit/courtney-1.3.tar.Z
Ippl
http://pltplp.net/ippl
Protolog
http://packetstormsecurity.org/UNIX/loggers/protolog-1.0.8.tar.gz
表2-1 基于UNIX主机的ping扫描监测工具
-*防御
监测ping扫描活动固然重要,但提前安排好防御措施的效果无疑更佳。你应该对允许哪些类型的ICMP通信进入网络或特定系统做出细致的评估。ICMP通信分为许多种不同的类型——ECHO请求和ECHO_REPLY响应只是其中的两种而已。绝大多数路由器并非必须放行所有类型的ICMP通信到达与因特网直接相连的系统才能正常工作。尽管几乎任何一种防火墙都能对ICMP通信进行过滤,但企事业单位的业务活动往往需要防火墙放行某些ICMP通信才能顺利进行。如果你们公司确实有这类需要,请务必仔细考虑应该放行哪些类型的ICMP通信。最简单的办法是只允许ICMP ECHO_REPLY、HOST_UNREACHABLE和TIME_EXCEEDED数据包进入DMZ网络并只允许它们到达特定的主机。此外,若是可以通过访问控制表(access control list,ACL)把外来ICMP通信限制在只能到达某些属于你们ISP(因特网接入服务提供商)的IP地址,你们的处境将会更安全。这既不会影响ISP检修网络线路故障,又可以让别人更难以对你们直接接入因特网的系统进行ICMP扫描。
ICMP是为了检修网络线路故障而开发出来的一种功能强大的通信协议,但它也很容易被滥用。允许ICMP通信不受限制地进入网络边界网关会给攻击者留下发动“拒绝服务”(denial of service)攻击的可乘之机,这会造成系统死机或降低它们的可用性。更糟糕的是,万一攻击者真的攻陷了网络中的某个系统,他们就可以安插操作系统后门并利用loki等黑客工具把恶意数据打包在ICMP EHO数据包里。有关loki工具的详细介绍见Phrack Magazine杂志1997年9月1日第7卷第51期中的06号文章(http://phrack.org /show.php?p=51&a=6)。
由Tom Ptacek开发并由Mike Schiffman移植到Linux上的pingd工具提出了另外一个有趣的概念。pingd是一个在主机层面处理各种ICMP ECHO和ICMP ECHO_REPLY通信的用户级守护进程。这一卓绝的手法禁用操作系统内核对ICMP ECHO数据包的处理功能,然后一个带底层ICMP套接口的用户级守护进程去处理这些数据包。也就是pingd工具提供了一种主机级的ping访问控制机制。基于Linux的pingd工具可以从http://packetstormsecurity.org/UNIX/misc/pingd-0.5.1tgz获得。
* ICMP查询(实际作用不大)
流行度:
2
简单度:
9
影响力:
5
风险率:
5
说到某个系统的ICMP信息,ping扫描(或ICMP ECHO数据包)仅仅是冰山一角。只须简单地向某个系统发送一个ICMP数据包,你们就可以收集到种种与该系统有关的高价值情报。比如说,如果用UNIX工具icmpquery(http://packetstormsecurity.org /UNIX/scanners/icmpquery.c)或icmpush(http://packetstormsecurity.org/UNIX/scanners /icmpush22.tgz)向某个系统发出一条ICMP TIMESTAMP(时间戳,ICMP消息类型13)消息,就可以获知系统时间和它所在的地理时区。类似地,如果你们向目标设备发出的是ICMP ADDRESS MASK REQUEST(地址掩码请求;ICMP消息类型17)消息,返回的就将是该设备的子网掩码(netmask)。网卡的子网掩码非常重要,攻击者可以根据子网掩码把目标网络的各个子网全部查找出来。查出那些子网之后,攻击者就可以撇开广播地址而集中火力只攻击某几个特定的子网。icmpquery工具既可以用来发出时间戳请求,也可以发出地址掩码请求:
icmpquery <-query> [-B] [-f fromhost] [-d delay] [-T time] targets
where is one of:
-t : icmp timestamp request (default)
-m : icmp address mask request
The delay is in microseconds to sleep between packets.
targets is a list of hostnames or addresses
-T specifi es the number of seconds to wait for a host to
respond. The default is 5.
-B specifi es ‘broadcast’ mode. icmpquery will wait
for timeout seconds and print all responses.
If you’re on a modem, you may wish to use a larger -d and –T
如果你想用icmpquery工具查询某个路由器的时间,请执行如下的命令:
[root] icmpquery -t 192.168.1.1
192.168.1.1 : 11:36:19
如果你想用icmpquery工具查询某个路由器的子网掩码,请执行如下的命令:
[root] icmpquery -m 192.168.1.1
192.168.1.1 : 0xFFFFFFE0
并非所有的路由器或系统都允许ICMP TIMESTAMP或NETMASK响应,所以用icmpquery或icmpush工具对不同主机进行这类查询时的返回结果可能会有很大的差别。
* 针对ICMP查询的防范措施
最好的防范措施之一是在网络边界路由器上阻断有可能泄漏敏感信息的各种ICMP数据包,至少应该限制TIMESTAMP(ICMP消息类型13)和ADDRESS MASK(ICMP消息类型17)这两种数据包进入你们的网络。如果在网络边界上部署的是Cisco路由器,可以用如下所示的ACL表限制其对这两种ICMP请求数据包做出响应:
access-list 101 deny icmp any any 13 ! timestamp request
access-list 101 deny icmp any any 17 ! address mask request
诸如Snort之类的网络入侵监测系统(network intrusion detection system,NIDS)也可以监测到这类活动。下面是Snort在监测到此类活动时记入日志的消息示例:
[**] PING-ICMP Timestamp [**]
05/29-12:04:40.535502 192.168.1.10 -> 192.168.1.1
ICMP TTL:255 TOS:0×0 ID:4321
TIMESTAMP REQUEST
From:http://blog.chinaunix.net/u/21908/showart.php?id=971294

本文还暂无回复