1. 入侵检测
使用入侵检测系统(IDS)的公司也不断增加。由于 nmap 常用于攻击前期的扫描,因此所有主流的 IDS 都包含了检测 nmap 扫描的规则。现在这些产品演变成入侵预防系统(IPS),可以主动地阻止可疑的恶意扫描行为。但是网络管理员和 IDS 厂商通过分析报文来检测恶意行为是一个艰苦的工作,有耐心和技术的攻击者,在特定 nmap 选项的帮助下,常常可以不被 IDS 检测到。同时管理员必须应付大量的误报结果,正常的行为被误判而被改变或被阻止。
2. 报文分段
-f
(报文分段) 该选项要求扫描时使用小的 IP 包分段。将 TCP 头分段在几个包中使得包过滤器,IDS 以及其它工具的检测更加困难。但这样也是存在问题的有些系统在处理这些小包时存在问题,例如旧的网络嗅探器 Sniffit 在接收到第一个分段时会立刻出现分段错误。
报文分段选项使用一次,nmap 在 IP 头后将包分成 8 个字节或更小。因此一个 20 字节的 TCP 头会被分成 3 个 包,其中 2 个包分别有 TCP 头的 8 个字节,另 1 个包有 TCP 头的剩下 4 个字 节,注意每个包都会有一个 IP 头这个和普通的 IP 报文分段一样,分段后的包都会有一个首部。
--mtu
(使用指定的 MTU) 该选项可以自定义报文偏移的大小,使用时不需要 使用-f
选项,偏移量必须 是 8 的倍数(这一点和我们知道的普通的 IP 报文也是一样的,偏移量必须是 8 的倍数)。
包过滤器和防火墙对所有的 IP 分段排队,如 linux 核心中的
CONFIG_IP_ALWAYS_DEFRAG
配置项,分段包不会直接使用。一些网络无法承受这样所带来的性能冲击,会将这个配置禁止。
3. 使用诱饵隐蔽扫描
-D <decoy1 [,decoy2][,ME],...>
(使用诱饵隐蔽扫描) 为使诱饵扫描起作用,需要使远程主机认为是诱饵在扫描目标网络。 IDS 可能会报个某个 IP 的 5-10 个端口扫描,但并不知道哪个 IP 在扫描以及哪些不是诱饵。但这种方式可以通过路由跟踪,响应丢弃以及其它主动 机制在解决。这是一种常用的隐藏自身 IP 地址的有效技术。
使用逗号分隔每个诱饵主机,也可用自己的真实 IP 作为诱饵,这时可使用
ME
选项说明。如果在第 6 个位置或 更后的位置使用ME
选项,一些常用端口扫描检测器(如 SolarDesigner’s excellent scanlogd)就不会报告 这个真实 IP。如果不使用ME
选项,nmap 将真实 IP 放在一个随机的位置。
作为诱饵的主机须在工作状态,否则会导致目标主机的 SYN 洪水攻击。 如果在网络中只有一个主机在工作,那就很容易确定哪个主机在扫描。也可 使用 IP 地址代替主机名(被诱骗的网络就不可能在名字服务器日志中发现)。
诱饵可用在初始的 ping 扫描(ICMP、SYN、ACK 等)阶段或真正的端口扫描 阶段。诱饵也可以用于远程操作系统检测 (
-O
选项)。在进行版 本检测或 TCP 连接扫描时,诱饵无效。
使用过多的诱饵没有任何价值,反而导致扫描变慢并且结果不准确。 此外一些 ISP 会过滤哄骗的报文,但很多对欺骗 IP 包没有任何限制。
4. 源地址哄骗
-S <IP address>
(源地址哄骗) 有时 nmap 可能无法确定你的源地址这时 nmap 会给出提示。此时使用该选项并说明所需发送包的接口 IP 地址。这个标志的另一个用处是哄骗性的扫描,使得目标认为是另 一个地址在进行扫描。-e
选项常在这种情况下使用或采用-P0
选项。
5. 使用指定的接口
-e <interface>
(使用指定的接口) 该选项告诉 nmap 使用哪个接口发送和接收报文,nmap 可以进行自动检测, 如果检测不出会给出相应提示。
6. 源端口哄骗
--source-port <portnumber>
和-g <portnumber>
(源端口哄骗) nmap 提供了--source-port
和-g
选项,这两个选项是相同的。只需要提供一个端口号,nmap 就可以从这些端口发送数据。为使特定的操作系统正常工作,nmap 必须使用不同的端口号。 还有一个问题就是 DNS 请求会忽略--source-port
选项,这是因为 nmap 依靠系统库来处理。但是没关系大部分 TCP 扫描,SYN 扫描,UDP 扫描可以完全支持这些选项。
这个选项主要用来扫描仅依赖于源端口号就信任数据流的场景,比如这样的场景:一个管理员部署了一个新的防火墙,但是由于外部的 UDP DNS 服务器响应无法进入网络,而导致 DNS 的崩溃。FTP 是另一个常见的例子,在 FTP 传输时远程服务器尝试和内部用建立连接以传输数据。对这些问题有安全解决方案,通常是应用级代理或协议分析防火墙模块。但也存在一些不安全的方案,比如 DNS 响应来自于 53 端口,FTP 连接来自于 20 端口,很多管理员会掉入一个陷阱,认为这些端口里不会有值得注意的攻击和漏洞利用就允许来自于这些端口的数据进入网络。此外认为这是一个短期临时的措施,后面想到好的办法再采取更安全的方案,但是后面却忘记了这个问题而没有升级。
7. 发送报文时附加随机数据
--data-length <number>
(发送报文时 附加随机数据) 我们知道正常情况下 nmap 发送最少的报文,只含一个包头。对于 TCP 协议包来说包通常 是 40 字节,对于 ICMP ECHO 请求来说只有 28 字节。
该选项告诉 nmap 在发送的报文上 附加指定数量的随机字节。注意数据是 nmap 随机附加的,并不需要人为指定,对于操作系统检测(
-O
选项)包不受影响, 但大部分 ping 和端口扫描包会受影响,这会使处理变慢,但对扫描的影响较小。
8. 设置 IP time-to-live 域
--ttl <value>
(设置 IP time-to-live 域) 该选项用于设置 IPv4 报文的time-to-live
(该选项指的是报文活动周期)域为指定的值。这个域值表明这个数据包还能活动多久。
9. 对目标主机的顺序随机排列
--randomize-hosts
(对目标主机的顺序随机排列) 该选项告诉 nmap 在扫描主机前对每个组中的主机随机排列,最多可以排列 8096 个主机。这会使得扫描针对不同的网络监控系统来说变得不是很 明显,特别是配合值较小的时间选项时更有效。如果需要对一个较大 的组进行随机排列,需要增大 nmap.h 文件中PING_GROUP_SZ
的值,并重新编译。另一种方法是使用列表扫描(-sL -n -oN filename
),产生目标 IP 的列表, 使用 Perl 脚本进行随机化,然后使用-iL <文件名>
(从列表中输入) 选项将文件提供给 nmap。
10. 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
。