◆ Firewalking――如何探测访问控制规则

/ns/hk/hacker/data/20010316011140.htm

◆ Firewalking――如何探测访问控制规则

日期:2000-4-15


原著:Jason
编译:Backend < mailto: backend@nsfocus.com >
主页:http://www.nsfocus.com

目 录

i. 术语

ii. 例子注释


I. 简介

II. 路由跟踪

III. 路由信息

IV. Firewalking

V. Firewalk工具

VI. 安全措施

附录A Traceroute补丁代码(静态目标端口)

附录B 参考文献

--------------------------------------------------------------------------------

i. 术语

ACL
访问控制列表。一组强制实施的安全策略。在本文中的访问控制列表专用于网络策略。

路由器/网关
指设置转发IP数据流的多网络接口主机。可能有或可能没有数据包过滤ACL来阻止某些网络通信。

入站通信
用于描述来自网络外部、目标为网络内部的网络通信。

出站通信流
用于描述来自网络内部、目标为网络外部的网络通信。

防火墙
指设置转发IP数据流、多网络接口、且使用了数据包过滤ACL来处理网络通信的主机。


ii. 例子注释

在本文中举了几个traceroute的输出例子。聪明的读者会发现其中的IP地址是在RFC 1918 [1]中列出的不可路由(non-routable)内部网络地址。为了避免不必要的麻烦,本文将在实际测试中使用的IP地址用这类内部网络地址替换了。


--------------------------------------------------------------------------------

I. 简介

本文将介绍一种名为”Firewalking”的技术。这种技术能用于获取被防火墙保护的远端网络的资料。本文的主旨是说明这种技术给网络带来的风险。本文面向的对象是熟悉网络结构体系和TCP/IP数据包结构的高级读者。

Firewalking使用类似于路由跟踪(traceroute-like)的IP数据包分析方法,来测定一个特殊的数据包是否能够从攻击者的主机传送到位于数据包过滤设备后的目标主机。这种技术能够用于探测网关上打开(‘open’)或允许通过(‘pass through’)的端口。更进一步地,它能够测定带有各种控制信息的数据包是否能通过给定网关。另外,通过这种技术,一个攻击者能够探测位于数据包过滤设备后的路由器。要理解这种技术的工作原理,首先需要明白路由跟踪(traceroute)是如何工作的。本文也提供关于路由跟踪(traceroute)的简介。


II. 路由跟踪(Traceroute)


路由跟踪(Traceroute) [2] 是一个网络调试工具,用于分析或找出到达特定目标主机的路由中的所有主机。Traceroute的基本工作原理是发送UDP或ICMP echo数据包到目标主机,同时在每轮(缺省是三个数据包)成功的探测后将IP包头中的TTL(Time To Live,生存期)域递增1。如果路由跟踪使用UDP数据包,则目标端口在每个数据包中都递增1。

IP数据包头的TTL域用于限制数据包在网络中传输的生存期,其值在每台路由器转发数据包前减1。如果TTL为0或更小,则路由器会向源主机回送一个ICMP错误消息(time to live exceeded in transit)数据包。这样源主机就能够知道数据包在哪台路由器上过期。通过将TTL从开始时设置为1,且依次递增1,并监视ICMP响应信息来获得主机间的所有路由器(这里假设数据包均未被过滤或丢失)。为了确保能够从最终的目标主机获得正确的响应(ICMP port unreachable或ICMP echo reply),traceroute或者使用极少被其它程序使用的高端UDP端口,或者使用ping数据包。

III. 路由信息

在明白了traceroute(路由跟踪)的基本工作原理后,现在来研究如何利用它来获取特定网络的信息。本节将列举使用路由跟踪技术来侦测网络的两种不同的方法。注意,其中的例子是特别“定制”的。;-)

・ 使用不同协议

第一种情况假定网络被一台防火墙保护着,防火墙的规则阻止除ping和ping响应(ICMP类型8和0)外所有的入站通信。我们使用普通的traceroute程序来探测位于过滤器后的主机。图1使用了UDP数据包,而图二使用了ICMP数据包。注意到在第二种探测下我们能够探测到位于防火墙后的主机。


backend:~>traceroute 10.0.0.10
traceroute to 10.0.0.10 (10.0.0.10), 30 hops max, 40 byte packets
1 10.0.0.1 (10.0.0.1) 0.540 ms 0.394 ms 0.397 ms
2 10.0.0.2 (10.0.0.2) 2.455 ms 2.479 ms 2.512 ms
3 10.0.0.3 (10.0.0.3) 4.812 ms 4.780 ms 4.747 ms
4 10.0.0.4 (10.0.0.4) 5.010 ms 4.903 ms 4.980 ms
5 10.0.0.5 (10.0.0.5) 5.520 ms 5.809 ms 6.061 ms
6 10.0.0.6 (10.0.0.6) 9.584 ms 21.754 ms 20.530 ms
7 10.0.0.7 (10.0.0.7) 89.889 ms 79.719 ms 85.918 ms
8 10.0.0.8 (10.0.0.8) 92.605 ms 80.361 ms 94.336 ms
9 * * *
10 * * *

图  一


backend:~>traceroute �CI 10.0.0.10
traceroute to 10.0.0.10 (10.0.0.10), 30 hops max, 40 byte packets
1 10.0.0.1 (10.0.0.1) 0.540 ms 0.394 ms 0.397 ms
2 10.0.0.2 (10.0.0.2) 2.455 ms 2.479 ms 2.512 ms
3 10.0.0.3 (10.0.0.3) 4.812 ms 4.780 ms 4.747 ms
4 10.0.0.4 (10.0.0.4) 5.010 ms 4.903 ms 4.980 ms
5 10.0.0.5 (10.0.0.5) 5.520 ms 5.809 ms 6.061 ms
6 10.0.0.6 (10.0.0.6) 9.584 ms 21.754 ms 20.530 ms
7 10.0.0.7 (10.0.0.7) 89.889 ms 79.719 ms 85.918 ms
8 10.0.0.8 (10.0.0.8) 92.605 ms 80.361 ms 94.336 ms
9 10.0.0.9 (10.0.0.9) 94.127 ms 81.764 ms 96.476 ms
10 10.0.0.10 (10.0.0.10) 96.012 ms 98.224 ms 99.312 ms

图  二


・ 初始端口种子


第二种情况假定一种更常见的被防火墙保护的网络例子,防火墙的规则是阻止除UDP端口53(DNS-域名服务)外的所有入站通信。


backend:~>traceroute 10.0.0.10
traceroute to 10.0.0.10 (10.0.0.10), 30 hops max, 40 byte packets
1 10.0.0.1 (10.0.0.1) 0.540 ms 0.394 ms 0.397 ms
2 10.0.0.2 (10.0.0.2) 2.455 ms 2.479 ms 2.512 ms
3 10.0.0.3 (10.0.0.3) 4.812 ms 4.780 ms 4.747 ms
4 10.0.0.4 (10.0.0.4) 5.010 ms 4.903 ms 4.980 ms
5 10.0.0.5 (10.0.0.5) 5.520 ms 5.809 ms 6.061 ms
6 10.0.0.6 (10.0.0.6) 9.584 ms 21.754 ms 20.530 ms
7 10.0.0.7 (10.0.0.7) 89.889 ms 79.719 ms 85.918 ms
8 10.0.0.8 (10.0.0.8) 92.605 ms 80.361 ms 94.336 ms
9 * * *
10 * * *


图  三

在图三中能够看到路由跟踪(traceroute)在第八跳(hop)处被阻止,原因是除了DNS查询外的任何入站请求都不被允许。但依靠本文的知识,我们能够轻易地探测出位于网关后的主机。

以下是我们能够控制的设置:

Traceroute的起始源端口(缺省时每次探测都会递增1)。
每轮的探测次数(缺省值为3)。
以下是我们能够测定的信息:

攻击主机与目标防火墙之间的跳(hop)数。
我们利用以上这些信息能够当探测到达防火墙时的端口号。据此,由于防火墙一般不进行内容检查,我们就能够使其认为探测数据包为DNS查询,从而得以绕过ACL(访问控制列表)。起始探测数据包的端口号计算公式如下:

(目标端口-(两机间的跳数*探测数据包数))-1

注意,如果两机间的路数大于(目标端口-1),则此方法无效。对于上例,计算结果为:

(53 - (8 * 3)) - 1 = 28

这样,探测包到达过滤器时,其中的目标端口号将符合防火墙的ACL要求,从而允许该数据包通过。参见图四:

backend:~>traceroute -p28 10.0.0.10
traceroute to 10.0.0.10 (10.0.0.10), 30 hops max, 40 byte packets
1 10.0.0.1 (10.0.0.1) 0.501 ms 0.399 ms 0.395 ms
2 10.0.0.2 (10.0.0.2) 2.433 ms 2.940 ms 2.481 ms
3 10.0.0.3 (10.0.0.3) 4.790 ms 4.830 ms 4.885 ms
4 10.0.0.4 (10.0.0.4) 5.196 ms 5.127 ms 4.733 ms
5 10.0.0.5 (10.0.0.5) 5.650 ms 5.551 ms 6.165 ms
6 10.0.0.6 (10.0.0.6) 7.820 ms 20.554 ms 19.525 ms
7 10.0.0.7 (10.0.0.7) 88.552 ms 90.006 ms 93.447 ms
8 10.0.0.8 (10.0.0.8) 92.009 ms 94.855 ms 88.122 ms
9 10.0.0.9 (10.0.0.9) 101.163 ms * *
10 * * *

图  四

也许你注意到了,当含有正确目标端口号通过后,其后的探测包都被丢弃了。这是因为traceroute使其后的探测包的目标端口都持续递增,从而使这些数据包都被防火墙的ACL拒绝通过。为了解决这个问题,可以对traceroute的源代码进行一些修改,使traceroute能在使用特定命令行参数时不递增探测数据包的目标端口(如图五)。这样我们发送的每个探测数据包因为其目标端口满足防火墙的ACL要求而均得以通过。(这种方法的副作用是我们可能接收不到目标主机返回的正常ICMP unreachable消息,因为很可能在目标主机上也有进程在监听这些端口。)附录A是traceroute的源代码补丁。
backend:~>traceroute -S �Cp53 10.0.0.15
traceroute to 10.0.0.15 (10.0.0.15), 30 hops max, 40 byte packets
1 10.0.0.1 (10.0.0.1) 0.516 ms 0.396 ms 0.390 ms
2 10.0.0.2 (10.0.0.2) 2.516 ms 2.476 ms 2.431 ms
3 10.0.0.3 (10.0.0.3) 5.060 ms 4.848 ms 4.721 ms
4 10.0.0.4 (10.0.0.4) 5.019 ms 4.694 ms 4.973 ms
5 10.0.0.5 (10.0.0.5) 6.097 ms 5.856 ms 6.002 ms
6 10.0.0.6 (10.0.0.6) 19.257 ms 9.002 ms 21.797 ms
7 10.0.0.7 (10.0.0.7) 84.753 ms * *
8 10.0.0.8 (10.0.0.8) 96.864 ms 98.006 ms 95.491 ms
9 10.0.0.9 (10.0.0.9) 94.300 ms * 96.549 ms
10 10.0.0.10 (10.0.0.10) 101.257 ms 107.164 ms 103.318 ms
11 10.0.0.11 (10.0.0.11) 102.847 ms 110.158 ms *
12 10.0.0.12 (10.0.0.12) 192.196 ms 185.265 ms *
13 10.0.0.13 (10.0.0.13) 168.151 ms 183.238 ms 183.458 ms
14 10.0.0.14 (10.0.0.14) 218.972 ms 209.388 ms 195.686 ms
15 10.0.0.15 (10.0.0.15) 236.102 ms 237.208 ms 230.185 ms

图  五


・进阶

因为traceroute(路由跟踪)工作在IP层(网络层),其上的任何传输协议(UDP、TCP和ICMP)均能被使用。Traceroute的这个特性使得其能利用任何位于IP层上层的协议。如果我们试图探测位于防火墙后的主机,而到达该防火墙的数据包被ACL所禁止,则该数据包会(在大多数情况下)被丢弃。通过这种探测,我们能够确定该路由上的最后一台网关(如防火墙)。如果我们再使用其它不同类型的traceroute探测,并得到正常响应时,说明了两点:1)该防火墙允许这种类型的网络通信通过;2)探测到位于该防火墙后的一台主机。如果以这些结果为依据,我们会知道防火墙的过滤规则是基于通信类型的。这就是firewalking的基本原理。


IV. Firewalking

为了利用网关的响应得到更多信息,我们必须掌握以下两个条件:

・ 在防火墙规则生效前的最后一台网关的IP地址

・ 位于防火墙后主机的IP地址

第一个IP地址用于帮助计算上面提到的公式。如果我们不能从该网关得到响应,则可猜测该协议可能被禁止了。第二个IP地址是探测包的最终目的地址。(参见下图)

利用这种技术,我们能够实施多种信息探测攻击。一种是防火墙协议扫描,即确定防火墙允许什么端口或协议的网络通信通过。方法是尝试发送所有端口和协议的探测数据包并监听响应。第二种则更先进些,是网络结构扫描。通过向位于防火墙后的每台主机发送探测数据包,攻击者有可能获得整个网络的拓扑结构图。


V. Firewalk工具

虽然traceroute是一个很有用的工具,但如果用于各种真正的探测扫描,似乎力所不逮。正是由于这个原因,便有了这个工具:Firewalk。

・ 什么是Firewalk工具?

Firewalk是一种利用上述技术的网络审核工具。它尝试测定指定网关允许哪些传输协议数据包通过。Firewalk扫描的工作原理是发送IP TTL值比到目标网关跳数(hop)大1的TCP或UDP数据包。如果该网关允许此类网络通信,它将转发此探测包到下一路由器或主机,而此路由器或主机将因为TTL过期而立即向探测主机回送“TTL过期”的消息。如果该网关禁止此类网络通信,则会丢弃该数据包,探测主机将无法得到响应。通过连续发送这种探测数据包和分析监听到的响应,将能够确定该网关上的访问控制列表。

・ 两个阶段

Firewalk的探测工作包括了两个阶段:一个是网络探测阶段,另一个是扫描阶段。最初,为了得到正确的IP TTL值,我们需要得到到达网关的跳数(hop)。通过依次递增数据包的TTL值(即traceroute的工作原理),向目标主机连接发送这些探测包。一旦得到了到达网关的跳数,我们将进入下一阶段:实际的扫描。

这些扫描是很简单的,Firewalk向目标主机发送带有超时设置的TCP或UDP数据包。如果能够在传输超时前监听到响应,则可以认为该端口是打开的,否则就是关闭的。(参见图七)


backend:#firewalk -n -P1-8 �CpTCP 10.0.0.5 10.0.0.20
Firewalking through 10.0.0.5 (towards 10.0.0.20) with a maximum of 25 hops.
Ramping up hopcounts to binding host...
probe: 1 TTL: 1 port 33434: [10.0.0.1]
probe: 2 TTL: 2 port 33434: [10.0.0.2]
probe: 3 TTL: 3 port 33434: [10.0.0.3]
probe: 4 TTL: 4 port 33434: [10.0.0.4]
probe: 5 TTL: 5 port 33434: Bound scan: 5 hops [10.0.0.5]
port 1: open
port 2: open
port 3: open
port 4: open
port 5: open
port 6: open
port 7: *
port 8: open
13 packets sent, 12 replies received
图  七

・ 慢速探测

正如我们知道的,在IP网络中传输的数据包被丢弃的可能原因有很多。如果探测数据包不是因为被过滤器禁止而是因为其它原因被丢弃,则可能会使探测结果有误。为了使firewalk得到的结果更精确,我们需要尽量避免这种情况。在大多数情况下,最好的解决方法是发送冗余的探测数据包,这样将能基本上保证总有数据包的探测正确。但是,如果我们发送的探测数据包被同一条路由上不同的网关过滤或丢弃,那又如何呢?(参见下图)


对于firewalk,探测数据包似乎被目标网关所禁止,但实际上这是个完全错误的结论。上面所说的方法并不能解决这种问题。为了防止这种问题,我们必须实施“慢速探测”或“极慢速探测”。它类似于正常的扫描,只不过我们会对到目标主机的路由上的每一跳(hop)都进行扫描。我们先进行正常的firewalk探测阶段,然后对到达目标主机前的每个中间跳(hop)进行扫描。这种方法能够避免因中间过滤器规则处理而导致的错误结论,从而使firewalk的输出更精确。

补充一点,这种方法的缺点正如它的名字:慢!

VI. 安全措施

最简单的的安全措施是禁止内部网络输出的“ICMP TTL exceeded”消息。这种方法的缺点是会影响traceroute的一些有用功能和可能无法远程诊断内部网络故障。另一个对付firewalking的方法是使用代理服务器。网络地址转换(NAT)或任何代理服务器(应用级代理或回路级代理)都能阻止Firewalk探测位于其后的网络信息。虽然有些入侵监测系统(IDS)也许能够发现这种扫描攻击,但开发新版本的Firewalk,能够伪造每个探测数据包成正常数据包,从而使IDS失效。目前版本的Firewalk只是处理了数据包头,而没有填入任何数据段内容。更高级版本将能够模拟各种服务和数据通信,甚至随机化探测扫描的次序和次数,其隐蔽性和功能将更强。


--------------------------------------------------------------------------------

附录A Traceroute补丁代码(静态目标端口)

ASCII traceroute.diff.


--------------------------------------------------------------------------------

--- traceroute.c.orig Fri Aug 21 15:15:23 1998
+++ traceroute.c Thu Apr 13 22:40:08 2000
@@ -289,6 +289,7 @@
int nprobes = 3;
int max_ttl = 30;
int first_ttl = 1;
+int static_port = 0;
u_short ident;
u_short port = 32768 + 666; /* start udp dest port # for probe packets */
@@ -352,7 +353,7 @@
prog = argv[0];
opterr = 0;
- while ((op = getopt(argc, argv, "dFInrvxf:g:i:m:p:q:s:t:w:")) != EOF)
+ while ((op = getopt(argc, argv, "dFInrvxf:g:i:m:p:q:Ss:t:w:")) != EOF)
switch (op) {
case 'd':
@@ -406,6 +407,13 @@
options |= SO_DONTROUTE;
break;
+ case 'S':
+ /*
+ * Tell traceroute to not increment the destination
+ * port, useful for bypassing some packet filters.
+ * Useless without the -p option.
+ static_port = 1;
+ break;
case 's':
/*
* set the ip source address of the outbound
@@ -744,7 +752,7 @@
register struct ip *ip;
(void)gettimeofday(&t1, &tz);
- send_probe(++seq, ttl, &t1);
+ send_probe(static_port ? seq : ++seq, ttl, &t1);
while ((cc = wait_for_reply(s, from, &t1)) != 0) {
(void)gettimeofday(&t2, &tz);
i = packet_ok(packet, cc, from, seq);
@@ -1300,9 +1308,9 @@
extern char version[];
Fprintf(stderr, "Version %s\n", version);
- Fprintf(stderr, "Usage: %s [-dFInrvx] [-g gateway] [-i iface] \
-[-f first_ttl] [-m max_ttl]\n\t[ -p port] [-q nqueries] [-s src_addr] [-t tos]
\
-[-w waittime]\n\thost [packetlen]\n",
+ Fprintf(stderr, "Usage: %s [-dFInrSvx] [-g gateway] [-i iface] \
+[-f first_ttl]\n\t[-m max_ttl] [ -p port] [-q nqueries] [-s src_addr] \
+[-t tos]\n\t[-w waittime] host [packetlen]\n",
prog);
exit(1);
}

--------------------------------------------------------------------------------

附录B 参考文献

・ Y. Rekhter, B. Moskowitz, D. Karrenberg, G. J. de Groot and E. Lear, "Address Allocation for Private Internets" RFC1918, February 1996

・ Van Jacobson, traceroute documentation and source code, Lawrence Berkeley National Laboratory

・ Thomas H. Ptacek and Timothy Newsham, "Insertion, Evasion, and Denial of Service: Eluding Network Intrusion Detection", Secure Networks, January 1998

<<< 完 >>>