使用ICMP协议来进行主机探测 |
| 来源:本文出自: 作者: (2001-07-26 09:00:00) |
|
主机探测对于攻击者来将是很重要的一步,通过对主机的信息搜寻,才能很好的下一步的进攻,当然对于主机探测来说有很多方法,主机某些服务的BANNER,一些使用的应用程序,或者使用工具来检测主机,如NMAP,在WEB上有www.netcraft.com来简单的估测主机。下面所讲的是使用ICMP协议来探测主机,主要也是可以了解ICMP这个协议,这里最主要的也是将这个ICMP协议,呵呵。
1,ICMPECHO(Type8)和ECHOReply(Type0)
我们使用一个ICMPECHO数据包来探测主机地址是否存活(当然在主机没有被配置为过滤ICMP形式),通过简单的发送一个ICMPECHO(Type 8)数据包到目标主机,如果ICMPECHOReply(ICMPtype0)数据包接受到,说明主机是存活状态。
如果没有就可以初步判断主机没有在线或者使用了某些过滤设备过滤了ICMP的REPLY。
|------------------------------------------------------------- 
|| 
|------ICMPECHOrequest------|
||HOST|——————————--->|HOST||
||A|<-----------------------|B||
|||如果存活或者没有过滤||| 
|------将返回ICMPRCHOREPLY------|
|| 
-------------------------------------------------------------- 
这种机制就是我们通常所用的ping命令来检测目标主机是否可以ping到。
下面是两个LINUX机器的演示:
[root@xundi/root]#ping192.168.5.5
PING192.168.5.5(192.168.5.5)from192.168.5.1:56(84)bytesofdata.
64bytesfrom192.168.5.5:icmp_seq=0ttl=255time=4.4ms
64bytesfrom192.168.5.5:icmp_seq=1ttl=255time=5.9ms
64bytesfrom192.168.5.5:icmp_seq=2ttl=255time=5.8ms 
---192.168.5.5pingstatistics---
3packetstransmitted,3packetsreceived,0%packetloss 
round-tripmin/avg/max=4.4/5.3/5.9ms
下面是snort所显示的信息包:
01/26-13:16:25.746316192.168.5.1->192.168.5.5
ICMPTTL:64TOS:0x0ID:6059 
ID:5721Seq:1ECHO
89D78E3827630B0008090A0B0C0D0E0F...8'c..........
101112131415161718191A1B1C1D1E1F................
202122232425262728292A2B2C2D2E2F!"#$%&'()*+,-./
303132333435363701234567
01/26-13:16:25.746638192.168.5.5->192.168.5.1
ICMPTTL:255TOS:0x0ID:6072 ID:5721Seq:1ECHOREPLY
89D78E3827630B0008090A0B0C0D0E0F...8'c.......... 
101112131415161718191A1B1C1D1E1F................ 
202122232425262728292A2B2C2D2E2F!"#$%&'()*+,-./ 
303132333435363701234567
0481631
____________________________________________________________ 
|8位类型|代码=0|校验和|
|_____________|______________|_____________________________|
|表示符|序列号| 
|____________________________|_____________________________| 
|Optiondata| 
|__________________________________________________________|
上面是ICMPECHOrequest&replay报文
安全建议:在你的边缘路由或者防火墙阻塞来自INTERNET的ICMPECHOrequests
2,ICMPSWEEP
使用ICMPECHO轮询多个主机称为ICMPSWEEP(或者PingSweep).
对于小的或者中等网络使用这种方法来探测主机是一种比较可接受的行为,但对于一些大的网络如CLASSA,B,这种方法就显的比较慢,原因是Ping在处理下一个之前将会等待正在探测主机的回应。
fping(http://ftp.tamu.edu/pub/Unix/src/)是一个UNIX工具,可以并行发送大量的请求,这使的它处理起来比普通的PING工具更为快速,它也可以由gping工具来传递IP地址,gping是一个用来产生IP地址列表的工具。fping也可以使用-d选项来解析探测的机器。
另外也有一个工具也可以并行处理ICMPSWEEP,并能解析被探测主机的主机名,它就是我们常用的NMAP(http://www.insecure.org),由Fyodor编写.
对于WINDOWS来讲,一个比较有名的ICMPSWEEP工具就是Rhino9的pinger,不知大家用过没有,它扫描速度确实比较快。可以和NMAP,fping相比美。
*但上面有点要注意的是,如果你使用解析被探测主机名的方法来进行PING探测,你就会在权威DNS服务器中留下你(攻击者)的LOG记录。
下面的例子是使用NMAP对20个IP地址进行ICMPSWEEP的演示,因为我的机器没有使用NAME服务器,所以使用_n选项来关闭自动解析主机名,其中三台机器,两台是FREEBSD3.4-RELEASE,一台是WINDOWS2000ProfessinolBETA3,三台机器都有回应,当然如果你没有NAME服务器由不关闭自动解析主机名选项,探测就会非常慢: 
#nmap-sP-PI-n192.168.0.1-20
StartingnmapV.2.54BETA1byfyodor@insecure.org(www.insecure.org/nmap/)
Host(192.168.0.1)appearstobeup. Host(192.168.0.2)appearstobeup.
Host(192.168.0.3)appearstobeup.
Nmapruncompleted--20IPaddresses(3hostsup)scannedin1seconds
安全建议:在你的边缘路由或者防火墙阻塞来自INTERNET的ICMPECHOrequests
3,BroadcastICMP
通过发送ICMPECHOrequest到广播地址或者目标网络地址可以简单的来反映目标网络存活主机。这样的请求会广播到目标网络中的所有主机,所有存活的主机都将会发送ICMP ECHOREPLY到攻击者的源IP地址。这种技术的主机探测只适用于目标网络的UNIX主机,WINDOWS机器将不产生ICMPECHOREPLY给目标是广播地址或网络地址的ICMP ECHOREQUEST,但这种行为是正常的操作,可以参考RFC1122(http://www.ietf.org/rfc/rfc1122.txt.), 它是这样描述的,如果我们发送ICMPECHOREQUEST给一个IP广播地址或者IP多播地址,它可以没有任何回应的丢弃。(我不知道其这个ping-b的选项是怎么得到的,我查询linux,freebsd, WINDOWS都没有关于-b的选项,所以请大家解释。但我还是把示例写进去。)
下面是一个演示,当发送ICMPECHOREQUEST给网络广播地址的时候期望得到主机的回应,其中的两台是FREEBSD主机,一台是WIN2K主机,WIN2K 没有回应: 
#ping-b192.168.0.255 
WARNING:pingingbroadcastaddress
PING192.168.0.255(192.168.0.255)from192.168.0.1:56(84)bytesofdata.
64bytesfrom192.168.0.2:icmp_seq=0ttl=255time=4.1ms
64bytesfrom192.168.0.3:icmp_seq=0ttl=255time=5.7ms(DUP!) 
---192.168.0.0pingstatistics--- 
1packetstransmitted,1packetsreceived,+1duplicates,0%packetloss 
round-tripmin/avg/max=4.1/4.9/5.7ms
下面个例子是发一个PING到网络地址,出现的现象同样: 
#ping-b192.168.0.0 WARNING:pingingbroadcastaddress
PING192.168.0.0(192.168.0.0)from192.168.0.1:56(84)bytesofdata.
64bytesfrom192.168.0.2:icmp_seq=0ttl=255time=4.1ms
64bytesfrom192.168.0.3:icmp_seq=0ttl=255time=5.7ms(DUP!)
---192.168.0.0pingstatistics--- 
1packetstransmitted,1packetsreceived,+1duplicates,0%packetloss 
round-tripmin/avg/max=4.1/4.9/5.7ms
注意:ICMP广播如果有很多机器回应的话会造成拒绝服务。
安全建议:在边缘路由上阻塞IP直接广播。
4,Non-ECHOICMP(端口不可达ICMP)
在ICMP协议中不光光只有ICMPECHO的ICMP查询信息类型,在ICMP扫描技术中也用到Non-ECHOICMP技术(不仅仅能探测主机,也可以探测网络设备如路由)。其中ICMP报文的类型包括如下:
ECHO(Request(Type8),Reply(Type0))--回显应答,
Time Stamp(Request(Type13),Reply(Type14))--时间戳请求和应答,
Information(Request (Type15),Reply(Type16))--信息请求和应答,
和AddressMask(Request(Type17),Reply (Type18))--地址掩码请求和应答等。
具体的就请看RFC1122和RFC1812--http://www.ietf.org/rfc/rfc1812.txt.
下面是关于利用Non-ECHOICMP查询信息的两个用法 
--TimeStamp(RequestandReply)和AddressMask(RequestandReply). 
--ICMPTimeStampRequest(Type13)和Reply(Type14)
ICMPTimeStampRequest和Reply允许一个节点查询另一个节点的当前时间,返回值是自午夜开始计算的豪秒数。发送者可以初始化标识符和序列号,请求端还填写发起时间戳,然后发送报文给应答系统。应答系统接受请求后,填写接受和传送的时间戳,把信息类型改变为REPLY--应答并送回给发送者。返回值是自午夜开始计算的豪秒数。
(上面这些术语在ICMP报文图上会体现。) 
0481631
____________________________________________________________
|8位类型|代码=0|校验和|
|_____________|______________|_____________________________|
|表示符|序列号| 
|____________________________|_____________________________|
|Originatetimestamp发起时间戳|
|__________________________________________________________|
|Receivetimestamp接受时间戳|
|__________________________________________________________|
|Transmittimestamp传送时间戳| 
|__________________________________________________________|
ICMP时间戳请求和应答报文
根据RFC1122的描述:一个主机可以执行Timestamp和TimestampReply.但必须遵循如下原则: --在处理时间戳请求时应该最小化可变性延迟(Minimumvariabilitydelay)。 
--接受主机必须"回答"每个它接受到的时间戳请求。 
--请求是一个IP广播地址或者IP多播地址的ICMP时间戳请求可以丢弃。
--在ICMP时间戳回应里的IP源地址必须与响应的时间戳请求信息的源地址相同。 
--如果在时间戳请求中接受到源路由器选项,返回路由必须为保留并为时间戳返回选项TimestampReplyoption设置源路由选项。接受一个ICMP时间戳回应(ICMP TimestampReply)会揭露一个存活主机或者网络设备的信息。
在下面的例子中,使用了发送ICMPTimeStampRequest,我使用了icmpush--http://hispahack.ccc.de/ .  下面是对REDHAT6.1,内核为2.2.12机器的测试:[root@stan/root]#icmpush-tstamp192.168.0.2 linux->13:48:07//当然你那里测试可能会显示这个域名。
Snort的分析: 
01/26-13:51:29.342647192.168.0.3->192.168.0.2 
ICMPTTL:254TOS:0x0ID:13170 
TIMESTAMPREQUEST 
8816D8D9028B633D0000000000000000......c=........ 
01/26-13:51:29.342885192.168.0.2->192.168.0.3 
ICMPTTL:255TOS:0x0ID:6096
TIMESTAMPREPLY 
8816D8D9028B633D0288501802885018......c=..P...P. 
2ADE1C00A0F9*.....
但根据作者发送这个ICMP时间戳请求的时候WINDOWSNTWRKS4.0SP4机器上,NT是没有反应的,因为我没有NTWRKS4.0 SP4机器,所以没有办法进行测试,所以作者是认为这个是可以判断有些系统,因为系统对ICMP时间戳的反应是不同的。
关于ICMPAddressMaskRequest(Type17)和Reply(Type18)[ICMP地址掩码请求和应答]:
CMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码,这个过程于无盘系统在引导过程中用RARP获取IP地址是类似的。地址掩码请求也用于当一个节点想知道接口的地址掩码地址时使用。其中应答的信息中包含接口地址的掩码。
0481631
____________________________________________________________
|8位类型|代码=0|校验和| 
|_____________|______________|_____________________________|
|表示符|序列号|
|____________________________|_____________________________| 
|32位子网掩码|
|__________________________________________________________|
ICMP地址掩码请求和应答报文
RFC1122描述一个系统不能不发送地址掩码的应答,除非它是一个授权地址掩码代理。作为授权代理,它必须进行特殊配置,以发送这些应答。
通常一个地址掩码的请求是由网关了应答的。如果从一系统接受到一个地址掩码应答,就表明这个存活主机是一个授权代理系统,它可以被攻击者用来获得你的网络配置情况,这些信息包括你的内部网络结构,路由表。
下面是对LINUX机器和WINDOWS机器的地址掩码请求,两个系统都没有ICMP地址掩码的应答。发送一个ICMP地址掩码请求到广播地址192.168.0.255, 并伪造了源IP为192.168.0.58。 
[root@linuxicmpush-2.2]#icmpush-vv-mask-sp192.168.0.58192.168.0.255 
->ICMPtotalsize=12bytes 
->Outgoinginterface=192.168.0.2 
->MTU=1500bytes 
->Totalpacketsize(ICMP+IP)=32bytes
ICMPAddressMaskRequestpacketsentto192.168.0.255(192.168.0.255) 
ReceivingICMPreplies...
----------------------------------------------------- 
192.168.0.58... 
Type=AddressMaskRequest(0x11) 
Code=0x0Checksum=0x7730 Id=0x1BESeq#=0x8700 
----------------------------------------------------- 
icmpush:ProgramfinishedOK 
-*>Snort!<*-Version1.5 
ByMartinRoesch(roesch@clark.net,www.clark.net/~roesch) 
Kernelfilter,protocolALL,rawpacketsocket 
DecodingEthernetoninterfaceeth0 
02/15-13:47:37.179276192.168.5.3->192.168.5.255 
ICMPTTL:254TOS:0x0ID:13170 
ADDRESSREQUEST 
B9038E4900000000...I....
都没有接受到LINUX机器和NT机器上的应答。
通过发送ICMP地址掩码请求到本地网络路由器的时候,我们接受到一个应答: 
-*>Snort!<*
- Version1.5
ByMartinRoesch(roesch@clark.net,www.clark.net/~roesch)
DecodingEthernetoninterfaceeth0 
01/30-09:33:00.711595Host13->Destination_Router
ICMPTTL:254TOS:0x0ID:13170
ADDRESSREQUEST
9002041700000000........ 
01/30-09:33:00.717388Destination_Router->Host
ICMPTTL:63TOS:0x0ID:367 ADDRESSREPLY
90020417FFFFFFF80000000000000000................
000000000000......
[上面的真实IP地址和路由IP地址去掉了]
(http://www.fanqiang.com)
|
|