使用ICMP协议来进行主机探测

/ns/cn/jc/data/20020821024042.htm



BY XUNDI

--主机探测对于攻击者来将是很重要的一步,通过对主机的信息搜寻,才能很
好的下一步的进攻,当然对于主机探测来说有很多方法,主机某些服务的BANNER,
一些使用的应用程序,或者使用工具来检测主机,如NMAP,在WEB上有www.netcraft.co
m
来简单的估测主机。下面所讲的是使用ICMP协议来探测主机,主要也是可以了解
ICMP这个协议,这里最主要的也是将这个ICMP协议,呵呵。

--1,ICMP ECHO(Type 8) 和ECHO Reply (Type 0)
我们使用一个ICMP ECHO数据包来探测主机地址是否存活(当然在主机没
有被配置为过滤ICMP形式),通过简单的发送一个ICMP ECHO(Type 8)数据包到目标
主机,如果ICMP ECHO Reply(ICMP type 0)数据包接受到,说明主机是存活状态。
如果没有就可以初步判断主机没有在线或者使用了某些过滤设备过滤了ICMP的REPLY。
|-------------------------------------------------------------
| |
| ------ ICMP ECHO request ------ |
| |HOST| ――――――――――---> |HOST| |
| | A | <----------------------- | B | |
| | | 如果存活或者没有过滤 | | |
| ------ 将返回ICMP RCHO REPLY ------ |
| |
--------------------------------------------------------------
这种机制就是我们通常所用的ping命令来检测目标主机是否可以ping到。

下面是两个LINUX机器的演示:
[root@xundi /root]# ping 192.168.5.5
PING 192.168.5.5 (192.168.5.5) from 192.168.5.1 : 56(84) bytes of data.
64 bytes from 192.168.5.5: icmp_seq=0 ttl=255 time=4.4 ms
64 bytes from 192.168.5.5: icmp_seq=1 ttl=255 time=5.9 ms
64 bytes from 192.168.5.5: icmp_seq=2 ttl=255 time=5.8 ms
--- 192.168.5.5 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 4.4/5.3/5.9 ms

下面是snort所显示的信息包 :
01/26-13:16:25.746316 192.168.5.1 -> 192.168.5.5
ICMP TTL:64 TOS:0x0 ID:6059

ID:5721 Seq:1 ECHO
89 D7 8E 38 27 63 0B 00 08 09 0A 0B 0C 0D 0E 0F ...8'c..........
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ................
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./
30 31 32 33 34 35 36 37 01234567
01/26-13:16:25.746638 192.168.5.5 -> 192.168.5.1
ICMP TTL:255 TOS:0x0 ID:6072
ID:5721 Seq:1 ECHO REPLY
89 D7 8E 38 27 63 0B 00 08 09 0A 0B 0C 0D 0E 0F ...8'c..........
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ................
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./
30 31 32 33 34 35 36 37 01234567

0 4 8 16 31
____________________________________________________________
| 8位类型 | 代码=0 | 校验和 |
|_____________|______________|_____________________________|
| 表示符 | 序列号 |
|____________________________|_____________________________|
| Option data |
|__________________________________________________________|

上面是ICMP ECHO request & replay报文

安全建议:在你的边缘路由或者防火墙阻塞来自INTERNET的ICMP ECHO requests

--2,ICMP SWEEP

使用ICMP ECHO轮询多个主机称为ICMP SWEEP(或者Ping Sweep).

对于小的或者中等网络使用这种方法来探测主机是一种比较可接受的行为,
但对于一些大的网络如CLASS A,B,这种方法就显的比较慢,原因是Ping
在处理下一个之前将会等待正在探测主机的回应。

fping(http://ftp.tamu.edu/pub/Unix/src/)是一个UNIX工具,可以并行
发送大量的请求,这使的它处理起来比普通的PING工具更为快速,它也可
以由gping工具来传递IP地址,gping是一个用来产生IP地址列表的工具。
fping也可以使用-d选项来解析探测的机器。

另外也有一个工具也可以并行处理ICMP SWEEP,并能解析被探测主机的主
机名,它就是我们常用的NMAP( http://www.insecure.org),由Fyodor编写.

对于WINDOWS来讲,一个比较有名的ICMP SWEEP工具就是Rhino9的pinger,
不知大家用过没有,它扫描速度确实比较快。可以和NMAP,fping相比美。

*但上面有点要注意的是,如果你使用解析被探测主机名的方法来进行PING
探测,你就会在权威DNS服务器中留下你(攻击者)的LOG记录。

下面的例子是使用NMAP对20个IP地址进行ICMP SWEEP的演示,因为我的
机器没有使用NAME服务器,所以使用_n选项来关闭自动解析主机名,其中
三台机器,两台是FREEBSD3.4-RELEASE,一台是WINDOWS 2000 Professinol
BETA 3,三台机器都有回应,当然如果你没有NAME服务器由不关闭自动解析
主机名选项,探测就会非常慢:

# nmap -sP -PI -n 192.168.0.1-20
Starting nmap V. 2.54BETA1 by fyodor@insecure.org (www.insecure.org/nmap/ )
Host (192.168.0.1) appears to be up.
Host (192.168.0.2) appears to be up.
Host (192.168.0.3) appears to be up.
Nmap run completed -- 20 IP addresses (3 hosts up) scanned in 1 seconds

安全建议:在你的边缘路由或者防火墙阻塞来自INTERNET的ICMP ECHO requests

--3,Broadcast ICMP
通过发送ICMP ECHO request到广播地址或者目标网络地址可以简单的来
反映目标网络存活主机。这样的请求会广播到目标网络中的所有主机,
所有存活的主机都将会发送ICMP ECHO REPLY到攻击者的源IP地址。

这种技术的主机探测只适用于目标网络的UNIX主机,WINDOWS机器将不
产生ICMP ECHO REPLY给目标是广播地址或网络地址的ICMP ECHO REQUEST,
但这种行为是正常的操作,可以参考RFC 1122(http://www.ietf.org/rfc/rfc1122.txt
.),
它是这样描述的,如果我们发送ICMP ECHO REQUEST给一个IP广播地址或者
IP多播地址,它可以没有任何回应的丢弃。

(我不知道其这个ping -b的选项是怎么得到的,我查询linux,freebsd,
WINDOWS都没有关于-b的选项,所以请大家解释。但我还是把示例写进去。)
下面是一个演示,当发送ICMP ECHO REQUEST给网络广播地址的时候期望
得到主机的回应,其中的两台是FREEBSD主机,一台是WIN2K主机,WIN2K
没有回应:

# ping -b 192.168.0.255
WARNING: pinging broadcast address
PING 192.168.0.255 (192.168.0.255) from 192.168.0.1 : 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=0 ttl=255 time=4.1 ms
64 bytes from 192.168.0.3: icmp_seq=0 ttl=255 time=5.7 ms (DUP!)
--- 192.168.0.0 ping statistics ---
1 packets transmitted, 1 packets received, +1 duplicates, 0% packet loss
round-trip min/avg/max = 4.1/4.9/5.7 ms

下面个例子是发一个PING到网络地址,出现的现象同样:

# ping -b 192.168.0.0
WARNING: pinging broadcast address
PING 192.168.0.0 (192.168.0.0) from 192.168.0.1 : 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=0 ttl=255 time=4.1 ms
64 bytes from 192.168.0.3: icmp_seq=0 ttl=255 time=5.7 ms (DUP!)
--- 192.168.0.0 ping statistics ---
1 packets transmitted, 1 packets received, +1 duplicates, 0% packet loss
round-trip min/avg/max = 4.1/4.9/5.7 ms

注意:ICMP 广播如果有很多机器回应的话会造成拒绝服务。

安全建议:在边缘路由上阻塞IP直接广播。

4--Non-ECHO ICMP(端口不可达ICMP)
在ICMP协议中不光光只有ICMP ECHO的ICMP查询信息类型,在ICMP扫描
技术中也用到Non-ECHO ICMP技术(不仅仅能探测主机,也可以探测网络
设备如路由)。

其中ICMP报文的类型包括如下:ECHO (Request (Type 8), Reply (Type 0))--
回显应答,Time Stamp (Request (Type 13), Reply (Type 14))--时间戳请求
和应答, Information (Request (Type 15), Reply (Type16))--信息请求和应答
,和 Address Mask (Request (Type 17), Reply (Type 18))--地址掩码请求和应
答等。具体的就请看RFC 1122 和 RFC 1812 --http://www.ietf.org/rfc/rfc1812.txt
.

--下面是关于利用Non-ECHO ICMP查询信息的两个用法--
--Time Stamp (Request and Reply) 和 Address Mask (Request and Reply).

--ICMP Time Stamp Request (Type 13) 和 Reply (Type 14)
ICMP Time Stamp Request 和 Reply允许一个节点查询另一个节点
的当前时间,返回值是自午夜开始计算的豪秒数。
发送者可以初始化标识符和序列号,请求端还填写发起时间戳,
然后发送报文给应答系统。

应答系统接受请求后,填写接受和传送的时间戳,把信息类型改变
为REPLY--应答并送回给发送者。返回值是自午夜开始计算的豪秒数。
(上面这些术语在ICMP报文图上会体现。)

0 4 8 16 31
____________________________________________________________
| 8位类型 | 代码=0 | 校验和 |
|_____________|______________|_____________________________|
| 表示符 | 序列号 |
|____________________________|_____________________________|
| Originate timestamp 发起时间戳 |
|__________________________________________________________|
| Receiv e timest amp 接受时间戳 |
|__________________________________________________________|
| Transmit timestamp 传送时间戳 |
|__________________________________________________________|

ICMP时间戳请求和应答报文

根据RFC1122的描述:一个主机可以执行Timestamp 和Timestamp Reply.
但必须遵循如下原则:
--在处理时间戳请求时应该最小化可变性延迟(Minimum variability delay)。
--接受主机必须"回答"每个它接受到的时间戳请求。
--请求是一个IP广播地址或者IP多播地址的ICMP时间戳请求可以丢弃。
--在ICMP时间戳回应里的IP源地址必须与响应的时间戳请求信息的源
地址相同。
--如果在时间戳请求中接受到源路由器选项,返回路由必须为保留并
为时间戳返回选项Timestamp Reply option设置源路由选项。

接受一个ICMP时间戳回应(ICMP Timestamp Reply)会揭露一个
存活主机或者网络设备的信息。

在下面的例子中,使用了发送ICMP Time Stamp Request,我使用了icmpush
--http://hispahack.ccc.de/ .下面是对REDHAT 6.1,内核为2.2.12机器
的测试:

[root@stan /root]# icmpush -tstamp 192.168.0.2
linux -> 13:48:07 //当然你那里测试可能会显示这个域名。

Snort的分析:
01/26-13:51:29.342647 192.168.0.3 -> 192.168.0.2
ICMP TTL:254 TOS:0x0 ID:13170
TIMESTAMP REQUEST
88 16 D8 D9 02 8B 63 3D 00 00 00 00 00 00 00 00 ......c=........
01/26-13:51:29.342885 192.168.0.2 -> 192.168.0.3
ICMP TTL:255 TOS:0x0 ID:6096
TIMESTAMP REPLY
88 16 D8 D9 02 8B 63 3D 02 88 50 18 02 88 50 18 ......c=..P...P.
2A DE 1C 00 A0 F9 *.....

但根据作者气发送这个ICMP时间戳请求的时候WINDOWS NT WRKS 4.0 SP4机器上,
NT是没有反应的,因为我没有NT WRKS 4.0 SP4机器,所以没有办法进行测试,
所以作者是认为这个是可以判断有些系统,因为系统对ICMP时间戳的反应是不
同的。

--关于ICMP Address Mask Request (Type 17) 和 Reply (Type 18)[ICMP地址掩码请

和应答]:

ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码,这个过程于
无盘系统在引导过程中用RARP获取IP地址是类似的。地址掩码请求也用于当一个
节点想知道接口的地址掩码地址时使用。其中应答的信息中包含接口地址的掩码。



0 4 8 16 31
____________________________________________________________
| 8位类型 | 代码=0 | 校验和 |
|_____________|______________|_____________________________|
| 表示符 | 序列号 |
|____________________________|_____________________________|
| 32位子网掩码 |
|__________________________________________________________|

ICMP地址掩码请求和应答报文

RFC 1122描述一个系统不能不发送地址掩码的应答,除非它是一个授权
地址掩码代理。作为授权代理,它必须进行特殊配置,以发送这些应答。

通常一个地址掩码的请求是由网关了应答的。

如果从一系统接受到一个地址掩码应答,就表明这个存活主机是一个
授权代理系统,它可以被攻击者用来获得你的网络配置情况,这些信息
包括你的内部网络结构,路由表。

下面是对LINUX机器和WINDOWS机器的地址掩码请求,两个系统都没有
ICMP地址掩码的应答。发送一个ICMP地址掩码请求到广播地址192.168.0.255,
并伪造了源IP为192.168.0.58。

[root@linux icmpush-2.2]# icmpush -vv -mask -sp 192.168.0.58 192.168.0.2
55
-> ICMP total size = 12 bytes
-> Outgoing interface = 192.168.0.2
-> MTU = 1500 bytes
-> Total packet size (ICMP + IP) = 32 bytes
ICMP Address Mask Request packet sent to 192.168.0.255 (192.168.0.255)
Receiving ICMP replies ...
-----------------------------------------------------
192.168.0.58 ...
Type = Address Mask Request (0x11)
Code = 0x0 Checksum = 0x7730
Id = 0x1BE Seq# = 0x8700
-----------------------------------------------------
icmpush: Program finished OK

-*> Snort! <*-Version 1.5
By Martin Roesch (roesch@clark.net, www.clark.net/~roesch)
Kernel filter, protocol ALL, raw packet socket
Decoding Ethernet on interface eth0
02/15-13:47:37.179276 192.168.5.3 -> 192.168.5.255
ICMP TTL:254 TOS:0x0 ID:13170
ADDRESS REQUEST
B9 03 8E 49 00 00 00 00 ...I....

都没有接受到LINUX机器和NT机器上的应答。

通过发送ICMP地址掩码请求到本地网络路由器的时候,我们接受到
一个应答:

-*> Snort! <*-
Version 1.5
By Martin Roesch (roesch@clark.net, www.clark.net/~roesch)
Decoding Ethernet on interface eth0
01/30-09:33:00.711595 Host 13 -> Destination_ Router
ICMP TTL:254 TOS:0x0 ID:13170
ADDRESS REQUEST
90 02 04 17 00 00 00 00 ........

01/30-09:33:00.717388 Destination_Router -> Host
ICMP TTL:63 TOS:0x0 ID:367
ADDRESS REPLY
90 02 04 17 FF FF FF F8 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 ......

[上面的真实IP地址和路由IP地址去掉了]