防火墙和IDS都是目前主流的网络安全产品,用来保护网络的安全。其中,防火墙主要是通过包过滤策略来保护网络的安全。防火墙可以是硬件,也可以是软件。入侵检测系统(Intrusion Detection System,IDS)是按照一定的安全策略,通过软件或硬件对网络和系统的运行状况进行监视,尽可能发现各种攻击行为,以保证网络系统资源的安全。由于Nmap常用于渗透测试前期的扫描,因此所有主流的IDS都包含检测Nmap的扫描规则。因此,为了能够正常实施扫描,需要规避防火墙和IDS。Nmap提供了一些规避措施,如定制数据包、定制数据包传输路径和隐藏自己的身份等。
定制数据包
- 使用受信的源端口 在一些服务器中虽然使用了防火墙和IDS来保护网络的安全,但是一些服务又必须对外开放,如DNS的53号端口、DHCP的67号端口等。通常情况下,一些管理人员也认为这些端口不会被攻击和利用,因此放心地对外开放这些端口。此时可以通过使用这些信任源端口来欺骗目标主机,实现主机扫描。
- --source-port <portnum>:指定信任的源端口
- -g <portnum>:指定信任的源端口
- 指定校验值 校验值是为了验证数据包的完整性而计算出的一个值。通过发送一个包含错误的校验值,也可以规避防火墙和IDS
- --badsum:使用一个伪TCP/UDP/SCTP校验值来发送探测数据包
- --adler32:用于指定SCTP校验值
- 指定IP选项 一个IP数据包中包含多个选项字段。可以指定任意一个IP选项来发送数据包,以规避防火墙和IDS。
- --ip-options <S|R[route]|L[route]|T|U...>,<hex string>:使用指定的IP选项发送数据包,可以指定的值有S、R、L、T、U。其中,S表示严格源路由,R表示记录路由,L表示松散源路由,T表示记录时间戳,U表示记录时间戳和路由。还可以指定十六进制字符串,而且该字符串的长度必须是4的倍数。另外,当指定十六进制字符串时,字节的值使用\x分隔。
- 附加数据载荷 数据载荷指发送的数据包中所包含的数据。默认情况下,Nmap仅发送一个包头,如TCP包头为40字节,ICMP ECHO请求为28字节。正常情况下网络中不会发送空包,因为空的数据包容易被防火墙和IDS检测到,从而被拦截。为了避免形成空包,可以通过附加数据载荷伪造成有意义的数据包,以规避防火墙和IDS。
- --data-length <num>:指定数据包长度的随机值。
- --data <hex string>:指定一个十六进制值的数据。
- --data-string:指定一个文本值的数据。
- 报文分段 将一个数据包分成许多更小的分片,以此规避防火墙和IDS的检测。
- -f <val>:设置分片大小。Nmap默认在IP头后会分成8字节的分片或更小的分片,因此一个20字节的TCP头会被分成3个包。其中,前两个包分别包含TCP头的8字节,最后一个包只包含TCP头剩下的4字节
- --mtu <val>:设置最大传输单元值,即数据偏移大小。使用该选项时不需要-f选项,并且指定的偏移量必须是8的倍数
定制数据传输路径
- 使用代理 --proxies <url1,[url2],...>:指定使用HTTP/SOCKS4代理转发
- 将一个主机发送的数据包通过代理主机转发给另一个目标主机,并由该主机进行发送。
- 指定TTL --ttl <val>:设置一个TTL值。其中,TTL值的范围为0~255
- 通过限制TTL值,可以避免被防火墙发现扫描操作的数据包。
- 目标随机排列 --randomize-hosts:对目标主机的顺序随机排列并进行扫描
- 当需要扫描多个目标主机时,Nmap将会根据指定的目标顺序依次进行扫描。通过设置目标随机排列,可以避免对同一个防火墙下的多个主机连续探测
隐藏自己
- 诱饵扫描 -D <decoy1,decoy2[,ME],...>,RND:number
- 让目标主机认为其他主机(诱饵)在对自己进行扫描。用户可以指定多个诱饵主机,使目标主机无法确定哪个是真实的主机,哪个是诱饵主机。其中,诱饵扫描可以用在初始的Ping扫描(如ICMP、SYN和ACK等)阶段,或者远程操作系统检测阶段。但是在版本检测或TCP连接扫描阶段,诱饵扫描无效。
- 诱饵主机是活动的,否则会引起目标主机的SYN洪水攻击
- 伪造源地址 -S:指定一个源IP地址。如果指定一个伪造的源地址,则需要结合-e和-Pn选项一起使用
- 伪造MAC地址 --spoof-mac
- 指定的MAC地址格式有多种,如字符串0、十六进制数字(01:02:03:04:05:06)、MAC地址的前三个字节(0020F2)和厂商名称(Cisco)等。如果指定的参数是字符串0,Nmap将选择一个完全随机的MAC地址;如果指定的参数是一个十六进制数,则数字之间使用冒号(:)分隔;如果指定的参数是一个小于12的十六进制数字,Nmap会随机填充剩下的六个字节;如果指定的参数是一个厂商的名称,Nmap将从nmap-mac-prefixes文件中查找厂商的名称,如果找到匹配的名称,Nmap将使用厂商的OUI(MAC地址的前三个字节),然后随机填充剩余的三个字节