如何修改nmap, 重新编译,bypass emergingthreats 的公开ids规则
字数 2706 2025-08-26 22:12:02
Nmap流量特征修改与IDS绕过技术详解
1. 背景与概述
本文详细讲解如何通过修改Nmap源代码和配置文件,重新编译Nmap,以绕过Emerging Threats等公开IDS规则的检测。主要内容包括Nmap扫描特征分析、IDS规则解读、具体修改方法和重新编译过程。
2. 前置知识
2.1 网络协议基础
- IP包格式
- TCP包格式
- TCP三次握手与四次挥手
2.2 IDS规则语法
- Suricata规则语法:https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Suricata_Rules
- Snort规则语法:http://manual-snort-org.s3-website-us-east-1.amazonaws.com/node33.html
2.3 Nmap扫描技术
- 端口扫描技术:https://nmap.org/man/zh/man-port-scanning-techniques.html
- 服务探测文件格式:https://nmap.org/book/vscan-fileformat.html
3. Nmap服务探测文件分析
nmap-service-probes文件包含不同服务的探测报文和响应匹配表达式,主要指令如下:
3.1 Exclude指令
Exclude <port specification>
从版本扫描中排除指定端口,通常放在文件顶部。例如:
Exclude T:9100-9107
--allports指令可以覆盖Exclude指令。
3.2 Probe指令
Probe <protocol> <probename> <probestring>
- protocol: TCP或UDP
- probename: 探测名称
- probestring: 发送的数据包内容,支持转义字符
示例:
q|GET / HTTP/1.0\r\n\r\n|
3.3 Match指令
match <service> <pattern> [<versioninfo>]
- service: 服务名(ssh, smtp, http等)
- pattern: 正则表达式匹配模式
- versioninfo: 版本信息格式
版本信息字段:
p/vendorproductname/ # 供应商或服务名
v/version/ # 应用版本信息
i/info/ # 其他信息
h/hostname/ # 主机名
o/operatingsystem/ # 操作系统
d/devicetype/ # 设备类型
cpe:/cpename/[a] # CPE格式指纹
3.4 Softmatch指令
与match类似,但匹配后扫描继续,服务名作为已知条件。
3.5 其他指令
ports <portlist>: 指定探测发送的端口totalwaitms <milliseconds>: 等待时间tcpwrappedms <milliseconds>: 仅用于NULL探针rarity <value between 1 and 9>: 探测稀有度(1-9)fallback <Comma separated list of probes>: 指定回退探针
4. IDS规则分析与绕过方法
4.1 Ping扫描(-sP)
检测规则:
alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"GPL SCAN PING NMAP"; dsize:0; itype:8; ...)
特征:
- ICMP type=8(echo request)
- 数据部分大小(dsize)=0
绕过方法:修改ICMP数据包大小或使用其他ICMP类型
4.2 TCP SYN扫描(-sS)
检测规则:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SCAN NMAP -sS window 2048"; fragbits:!D; dsize:0; flags:S,12; ack:0; window:2048; ...)
特征:
- 不分片(!D)
- 数据大小=0
- SYN标志(S)
- 保留位1和2设置(12)
- ACK=0
- 窗口大小=2048/1024/3072/4096
绕过方法:
- 修改TCP窗口大小(修改tcpip.cc)
- 调整扫描速率
4.3 TCP Connect扫描(-sT)
检测规则:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"GPL SCAN nmap TCP"; ack:0; flags:A,12; ...)
特征:
- ACK=0
- ACK标志(A)和保留位(12)
绕过方法:降低扫描速率
4.4 UDP扫描(-sU)
检测规则:
alert udp $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SCAN NMAP OS Detection Probe"; dsize:300; content:"CCCCCCCCCCCCCCCCCCCC"; ...)
特征:
- 数据大小=300
- 包含特定内容(多个"C")
绕过方法:修改探测内容
4.5 TCP Null/FIN/Xmas扫描(-sN/-sF/-sX)
检测规则:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SCAN NMAP -f -sN"; fragbits:!M; dsize:0; flags:0,12; ack:0; window:2048; ...)
特征:
- 不分片(!M)
- 数据大小=0
- 标志位组合:
- Null: 无标志(0)
- FIN: F
- Xmas: FPU
- ACK=0
- 窗口大小=2048
绕过方法:修改标志位组合或窗口大小
4.6 TCP ACK扫描(-sA)
检测规则:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SCAN NMAP -sA (1)"; fragbits:!D; dsize:0; flags:A,12; window:1024; ...)
特征:
- ACK标志(A)和保留位(12)
- 窗口大小=1024/3072
绕过方法:修改窗口大小
4.7 操作系统检测(-O)
检测规则:
alert ip $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SCAN NMAP -sO"; dsize:0; ip_proto:21; ...)
特征:
- IP协议号=21
- 数据大小=0
绕过方法:修改探测协议和内容
4.8 服务版本检测(-sV)
检测规则:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SCAN NMAP -f -sV"; fragbits:!M; dsize:0; flags:S,12; ack:0; window:2048; ...)
特征:
- 类似SYN扫描特征
- 特定服务探测内容
绕过方法:
- 修改
nmap-service-probes文件中的探测内容 - 修改
osscan2.cc中的随机填充生成函数(nbase\nbase_rnd.c)
4.9 SIP探测
检测规则:
alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:"ET SCAN NMAP SIP Version Detect OPTIONS Scan"; content:"OPTIONS sip|3A|nm SIP/"; ...)
特征:
- 包含"OPTIONS sip:nm SIP/"
- Via头包含"SIP/2.0/TCP nm"
- From头包含"<sip:nm@nm"
绕过方法:修改nmap-service-probes中的关键词(nm@nm, nm2@nm2, nmap等)
4.10 NSE脚本检测
检测规则示例:
alert http $EXTERNAL_NET any -> $HTTP_SERVERS any (msg:"ET SCAN NMAP SQL Spider Scan"; content:" OR sqlspider"; ...)
alert http $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SCAN Nmap Scripting Engine User-Agent Detected"; content:"Nmap Scripting Engine"; ...)
特征:
- 特定SQL注入内容(" OR sqlspider")
- 特定User-Agent("Nmap Scripting Engine")
绕过方法:
- 修改
scripts/http-sql-injection.nse中的内容("OR sqlspider" → "OR google") - 修改
nselib/http.lua中的默认User-Agent - 修改
nselib/sip.lua中的SIP UA(设置为"FreeSWITCH-mod_sofia") - 修改
scripts/ssl-heartbleed.nse中的特征
5. 修改与重新编译步骤
5.1 修改关键文件
tcpip.cc: 修改TCP窗口大小等参数nbase/nbase_rnd.c: 修改随机填充生成函数nmap-service-probes: 修改探测内容和关键词- NSE脚本文件:
scripts/http-sql-injection.nsenselib/http.luanselib/sip.luascripts/ssl-heartbleed.nse
5.2 重新编译Nmap
./configure
make
make install
5.3 验证版本
./nmap --version
6. 总结
通过分析Nmap的各种扫描类型产生的流量特征和对应的IDS检测规则,我们可以有针对性地修改Nmap源代码和配置文件,重新编译后生成具有隐蔽扫描能力的定制版本。关键点包括:
- 理解各种扫描类型的特征和对应的IDS规则
- 修改TCP/IP参数(窗口大小、标志位等)
- 修改服务探测内容避免模式匹配
- 调整NSE脚本避免特征检测
- 重新编译并验证修改效果
这种方法可以有效绕过基于公开规则的IDS检测,但需要注意不要违反法律法规,仅用于授权测试。