## 十二、 防火墙/IDS 躲避和哄骗
很多 Internet 先驱们设想了一个全球开放的网络,使用全局的 IP 地址空间,使得任何两个节 点之间都有虚拟连接。这使得主机间可以作为真正的对等体,相互间提供服务和获取信息。人 们可以在工作时访问家里所有的系统、调节空调温度、为提前到来的客人开门。随后,这些全 球连接的设想受到了地址空间短缺和安全考虑的限制。在 90 年代早期,各种机构开始部署防火 墙来实现减少连接的目的,大型网络通过代理、NAT 和包过滤器与未过滤的 Internet 隔离。不 受限的信息流被严格控制的可信通信通道信息流所替代。
类似防火墙的网络隔离使得对网络的搜索更加困难,随意的搜索变得不再简单。然而,Nmap 提 供了很多特性用于理解这些复杂的网络,并且检验这些过滤器是否正常工作。此外,Nmap 提供 了绕过某些较弱的防范机制的手段。检验网络安全状态最有效的方法之一是尝试哄骗网络,将 自己想象成一个攻击者,使用本节提供的技术来攻击自己的网络。如使用 FTP bounce 扫描、Idle 扫描、分片攻击或尝试穿透自己的代理。
除限止网络的行为外,使用入侵检测系统(IDS)的公司也不断增加。由于 Nmap 常用于攻击前期 的扫描,因此所有主流的 IDS 都包含了检测 Nmap 扫描的规则。现在,这些产品变形为入侵预防 系统(IPS),可以主动地阻止可疑的恶意行为。不幸的是,网络管理员和 IDS 厂商通过分析报文 来检测恶意行为是一个艰苦的工作,有耐心和技术的攻击者,在特定 Nmap 选项的帮助下,常常 可以不被 IDS 检测到。同时,管理员必须应付大量的误报结果,正常的行为被误判而被改变或 阻止。
有时,人们建议 Nmap 不应该提供躲闭防火墙规则或哄骗 IDS 的功能,这些功能可能会被攻击者 滥用,然而管理员却可以利用这些功能来增强安全性。实际上,攻击的方法仍可被攻击者利用 他们可以发现其它工具或 Nmap 的补丁程序。同时,管理员发现攻击者的工作更加困难,相比较 采取措施来预防执行 FTP Bounce 攻击的工具而言,部署先进的、打过补丁的 FTP 服务器更加有 效。
Nmap 不提供检测和破坏防火墙及 IDS 系统的魔弹(或 Nmap 选项),它使用的是技术和经验,这超 出了本参考手册的范围,下面描述了相关的选项和完成的工作。
`-f` (报文分段); `--mtu` (使用指定的 MTU)
-f 选项要求扫描时(包挺 ping 扫描)使用 小的 IP 包分段 其思路是将 TCP 头分段在几个 包中,使得包过滤器、 IDS 以及其它工具的检测更加困难。必须小心使用这个选项,有 些系 统在处理这些小包时存在问题,例如旧的网络嗅探器 Sniffit 在接收 到第一个分 段时会立刻出现分段错误。该选项使用一次,Nmap 在 IP 头后将包分成 8 个字节或更小 因此,一个 20 字节的 TCP 头会被分成 3 个 包,其中 2 个包分别有 TCP 头的 8 个字节, 另 1 个包有 TCP 头的剩下 4 个字 节 当然 每个包都有一个 IP 头 再次使用-f 可使用 16 字节的分段(减少分段数量)。使用--mtu 选项可 以自定义偏移的大小,使用时不需要-f 偏移量必须 是 8 的倍数。包过滤器和防火墙对所有的 IP 分段排队,如 Linux 核心中的 CONFIG_IP_ALWAYS_DEFRAG 配置项,分段包不会直接使用。一些网络无法 承受这样所带 来的性能冲击,会将这个配置禁止。其它禁止的原因有分段 包会通过不同的路由进入网 络。一些源系统在内核中对发送的报文进行 分段,使用 iptables 连接跟踪模块的 Linux 就是一个例子。当使用类似 Ethereal 的嗅探器时,扫描必须保证发送的报文要分段。如 果主机操作系统会产 生问题 尝试使用--send-eth 选项以避开 IP 层而直接 发送原始的 以太网帧。
`-D <decoy1 [,decoy2][,ME],...>` (使用诱饵隐蔽扫描)
为使诱饵扫描起作用,需要使远程主机认为是诱饵在扫描目标网络。 IDS 可能会报个某 个 IP 的 5-10 个端口扫描,但并不知道哪个 IP 在扫描以及 哪些不是诱饵。但这种方式 可以通过路由跟踪、响应丢弃以及其它主动 机制在解决。这是一种常用的隐藏自身 IP 地址的有效技术。
使用逗号分隔每个诱饵主机,也可用自己的真实 IP 作为诱饵,这时可使用 ME 选项说明 如果在第 6 个位置或 更后的位置使用 ME 选项,一些常用 端口扫描检测器(如 Solar Designer's excellent scanlogd)就不会报告 这个真实 IP 如果不使用 ME 选项 Nmap 将 真实 IP 放在一个随机的位置
注意,作为诱饵的主机须在工作状态,否则会导致目标主机的 SYN 洪水攻击。 如果在网 络中只有一个主机在工作,那就很容易确定哪个主机在扫描。也可 使用 IP 地址代替主 机名(被诱骗的网络就不可能在名字服务器日志中发现)。
诱饵可用在初始的 ping 扫描(ICMP、SYN、ACK 等)阶段或真正的端口扫描 阶段。诱饵也 可以用于远程操作系统检测(-O)。在进行版 本检测或 TCP 连接扫描时,诱饵无效。
使用过多的诱饵没有任何价值,反而导致扫描变慢并且结果不准确。 此外,一些 ISP 会 过滤哄骗的报文,但很多对欺骗 IP 包没有任何限制。
`-S <IP_Address>` (源地址哄骗)
在某些情况下,Nmap 可能无法确定你的源地址(如果这样,Nmap 会给出 提示)。此时, 使用-S 选项并说明所需发送包的接口 IP 地址。
这个标志的另一个用处是哄骗性的扫描,使得目标认为是另 一个地址在进行扫描。可以 想象某一个竞争对手在不断扫描某个公司! -e 选项常在这种情况下使用,也可采用-P0 选项。
`-e <interface>` (使用指定的接口)
告诉 Nmap 使用哪个接口发送和接收报文,Nmap 可以进行自动检测, 如果检测不出会给 出提示。
`--source-port <portnumber>; -g <portnumber>` (源端口哄骗)
仅依赖于源端口号就信任数据流是一种常见的错误配置,这个问题非常好理解。例如一个管理员部署了一个新的防火墙,但招来了很多用户的不满,因为他们的应用停止工作了。可能是由于外部的 UDP DNS 服务器响应无法进入网络,而导致 DNS 的崩溃。FTP 是 另一个常见的例子,在 FTP 传输时,远程服务器尝试和内部用建立连接以传输数据。
对这些问题有安全解决方案,通常是应用级代理或协议分析防火墙模块。但也存在一些 不安全的方案。注意到 DNS 响应来自于 53 端口,FTP 连接来自于 20 端口,很多管理员会 掉入一个陷阱,即允许来自于这些端口的数据进入网络。他们认为这些端口里不会有值得注意的攻击和漏洞利用。此外,管理员或许认为这是一个短期的措施,直至他们采取 更安全的方案。但他们忽视了安全的升级。
不仅仅是工作量过多的网络管理员掉入这种陷阱,很多产品本身也会有这类不安全的隐 患,甚至是微软的产品。Windows 2000 和 Windows XP 中包含的 IPsec 过滤器也包含了一 些隐含规则,允许所有来自 88 端口(Kerberos)的 TCP 和 UDP 数据流。另一个常见的例子 是 Zone Alarm 个人防火墙到 2.1.25 版本仍然允许源端口 53(DNS)或 67(DHCP)的 UDP 包 进入。
Nmap 提供了-g 和--source-port 选项(它们是等价的),用于利用上述弱点。只需要提供 一个端口号,Nmap 就可以从这些端口发送数据。为使特定的操作系统正常工作,Nmap 必 须使用不同的端口号。 DNS 请求会忽略--source-port 选项,这是因为 Nmap 依靠系统库 来处理。大部分 TCP 扫描,包括 SYN 扫描,可以完全支持这些选项,UDP 扫描同样如此
`--data-length <number>` (发送报文时 附加随机数据)
正常情况下 Nmap 发送最少的报文 只含一个包头 因此 TCP 包通常 是 40 字节 ICMP ECHO 请求只有 28 字节。这个选项告诉 Nmap 在发送的报文上 附加指定数量的随机字节。操作 系统检测(-O)包不受影响, 但大部分 ping 和端口扫描包受影响,这会使处理变慢,但 对扫描的影响较小。
`--ttl <value>` (设置 IP time-to-live 域)
设置 IPv4 报文的 time-to-live 域为指定的值。
`--randomize-hosts` (对目标主机的顺序随机排列)
告诉 Nmap 在扫描主机前对每个组中的主机随机排列,最多可达 8096 个主机。这会使得 扫描针对不同的网络监控系统来说变得不是很 明显,特别是配合值较小的时间选项时更 有效。如果需要对一个较大 的组进行随机排列,需要增大 nmap.h 文件中 PING_GROUP_SZ 的值,并重新编译。另一种方法是使用列表扫描 (-sL -n -oN filename),产生目标 IP 的列表, 使用 Perl 脚本进行随机化,然后使用-iL 提供给 Nmap。
`--spoof-mac <mac address,prefix,or vendor name>` (MAC 地址哄骗)
要求 Nmap 在发送原以太网帧时使用指定的 MAC 地址 这个选项隐含了 --send-eth 选项 以保证 Nmap 真正发送以太网包。MAC 地址有几 种格式。如果简单地使用字符串“0”, Nmap 选择一个完全随机的 MAC 地址 如果给定的字符品是一个 16 进制偶数(使用:分隔) Nmap 将使用这个 MAC 地址。 如果是小于 12 的 16 进制数字,Nmap 会随机填充剩下的 6 个字节。如果参数不是 0 或 16 进 制字符串,Nmap 将通过 nmap-mac-prefixes 查找 厂商 的名称(大小写区分),如果找到匹配,Nmap 将使用厂商的 OUI(3 字节前缀),然后 随机 填充剩余的 3 个节字。正确的--spoof-mac 参数有, Apple, 0,01:02:03:04:05:06, deadbeefcafe,0020F2, 和 Cisco.