1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
Usage: nmap [Scan Type(s)] [Options] {target specification}

目标规范:
Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1, 10.0.0-255.1-254
-iL <输入文件名>: 从文件中读取主机/网络列表
-iR <数量>: 随机选择目标
--exclude <主机1[,主机2][,主机3],...>: 排除指定主机/网络
--excludefile <排除文件>: 从文件中排除列表

主机发现:
-sL: 列出扫描 - 仅列出扫描目标
-sn: Ping 扫描 - 禁用端口扫描
-Pn: 假设所有主机在线 - 禁用 ICMP Echo 请求 - 跳过主机发现
-PS/PA/PU/PY[端口列表]: TCP SYN、TCP ACK、UDP 或 SCTP 发现至指定端口
-PE/PP/PM: ICMP 回显、时间戳和网络掩码请求发现探针
-PO[协议列表]: IP 协议 Ping
-n/-R: 不进行 DNS 解析 / 始终解析 [默认:有时]
--dns-servers <服务器1[,服务器2],...>: 指定自定义 DNS 服务器
--system-dns: 使用操作系统的 DNS 解析器
--traceroute: 跟踪每个主机的跳跃路径

扫描技术:
-sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scan
-sU: UDP 扫描
-sN/sF/sX: TCP 空、FIN 和 Xmas 扫描
--scanflags <标志>: 自定义 TCP 扫描标志
-sI <僵尸主机[:探针端口]>: 空闲扫描
-sY/sZ: SCTP INIT/COOKIE-ECHO 扫描
-sO: IP 协议扫描
-b <FTP 中继主机>: FTP 中继扫描

端口规范和扫描顺序:
-p <端口范围>: 仅扫描指定端口
示例: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
--exclude-ports <端口范围>: 排除指定端口
-F: 快速模式 - 扫描的端口比默认扫描少
-r: 顺序扫描端口 - 不随机化
--top-ports <数量>: 扫描最常见的 <数量> 个端口
--port-ratio <比例>: 扫描超过指定比例的常见端口

服务/版本检测:
-sV: 探测开放端口的服务/版本信息
--version-intensity <等级>: 设置从 0 (轻) 到 9 (尽量探测)
--version-light: 限制为最可能的探测 (强度 2)
--version-all: 尝试所有探测 (强度 9)
--version-trace: 显示详细的版本扫描活动 (用于调试)

脚本扫描:
-sC: 相当于 --script=default
--script=<Lua 脚本>: <Lua 脚本> 为目录、脚本文件或脚本类别的逗号分隔列表
--script-args=<n1=v1,[n2=v2,...]>: 为脚本提供参数
--script-args-file=文件名: 从文件中提供 NSE 脚本参数
--script-trace: 显示所有发送和接收的数据
--script-updatedb: 更新脚本数据库
--script-help=<Lua 脚本>: 显示关于脚本的帮助
<Lua 脚本> 为脚本文件或脚本类别的逗号分隔列表

操作系统检测:
-O: 启用操作系统检测
--osscan-limit: 将操作系统检测限制在潜在目标上
--osscan-guess: 更积极地猜测操作系统

时间和性能:
-T<0-5>: 设置时间模板 (数值越高越快)
--min-hostgroup/max-hostgroup <大小>: 并行主机扫描组大小
--min-parallelism/max-parallelism <数目>: 探针并行化
--min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <时间>: 设置探针往返时间
--max-retries <次数>: 限制端口扫描探针的重传次数
--host-timeout <时间>: 达到指定时间后放弃目标
--scan-delay/--max-scan-delay <时间>: 调整探针之间的延迟
--min-rate <数量>: 以每秒不少于 <数量> 的速度发送数据包
--max-rate <数量>: 以每秒不超过 <数量> 的速度发送数据包

防火墙/IDS 规避和伪装:
-f; --mtu <值>: 分段数据包 (可选指定 MTU)
-D <诱饵1,诱饵2[,ME],...>: 使用诱饵进行扫描
-S <IP 地址>: 伪装源地址
-e <接口>: 使用指定接口
-g/--source-port <端口号>: 使用指定端口号
--proxies <url1,[url2],...>: 通过 HTTP/SOCKS4 代理连接
--data <十六进制字符串>: 向数据包中附加自定义负载
--data-string <字符串>: 向数据包中附加自定义 ASCII 字符串
--data-length <长度>: 向数据包中附加随机数据
--ip-options <选项>: 使用指定 IP 选项发送数据包
--ttl <值>: 设置 IP 生存时间字段
--spoof-mac <mac 地址/前缀/厂商名称>: 伪装 MAC 地址
--badsum: 发送伪造的 TCP/UDP/SCTP 校验和的数据包

输出:
-oN/-oX/-oS/-oG <文件>: 以 .nmap/.xml/s|<rIpt kIddi3/.gnmap 格式输出扫描到文件
-oA <基本名>: 同时输出为三种主要格式
-v: 增加详细级别 (使用 -vv 或更多)
-d: 增加调试级别 (使用 -dd 或更多)
--reason: 显示端口处于特定状态的原因
--open: 仅显示开放 (或可能开放) 的端口
--packet-trace: 显示所有发送和接收的数据包
--iflist: 打印主机接口和路由 (用于调试)
--append-output: 附加到指定的输出文件,而非覆盖
--resume <文件名>: 恢复中断的扫描
--noninteractive: 禁用通过键盘的运行时交互
--stylesheet <路径/URL>: XSL 样式表,用于将 XML 输出转换为 HTML
--webxml: 从 Nmap.Org 引用样式表,以提高 XML 的可移植性
--no-stylesheet: 不将 XSL 样式表关联到 XML 输出

其他:
-6: 启用 IPv6 扫描
-A: 启用操作系统检测、版本检测、脚本扫描和 traceroute
--datadir <目录名>: 指定自定义 Nmap 数据文件位置
--send-eth/--send-ip: 使用原始以太网帧或 IP 数据包发送
--privileged: 假设用户具备完全权限
--unprivileged: 假设用户缺乏原始套接字权限
-V: 显示版本号
-h: 显示帮助摘要页面
1
2
3
4
--disable-arp-ping	禁用 ARP ping
-D RND:5 生成5个随机 IP 地址,指示连接来自的源
-S <ip> 使用不同的源IP地址扫描目标
--source-port 53 从 DNS 端口执行扫描
脚本类别 描述
auth 确定身份验证凭证。
broadcast 通过广播来发现主机的脚本以及发现的主机可以自动添加到剩余的扫描中。
brute 执行脚本,尝试通过使用凭证进行暴力破解来登录相应的服务。
default 使用该-sC选项执行的默认脚本。
discovery 无障碍服务的评估。
dos 这些脚本用于检查服务是否存在拒绝服务漏洞,由于它会损害服务,因此使用较少。
exploit 此类脚本尝试利用扫描端口的已知漏洞。
external 使用外部服务进行进一步处理的脚本。
fuzzer 这使用脚本通过发送不同的字段来识别漏洞和意外的数据包处理,这可能需要很长时间。
intrusive 可能对目标系统产生负面影响的侵入性脚本。
malware 检查某些恶意软件是否感染了目标系统。
safe 不执行侵入性和破坏性访问的防御脚本。
version 服务检测的扩展。
vuln 识别特定的漏洞。
状态 描述
open 这表示已建立与扫描端口的连接。这些连接可以是TCP 连接UDP 数据报以及SCTP 关联
closed 当端口显示为关闭时,TCP 协议会指示我们收到的数据包包含一个RST标志。这种扫描方法还可用于确定我们的目标是否还活着。
filtered Nmap 无法正确识别扫描的端口是打开还是关闭,因为目标没有返回该端口的响应,或者我们从目标收到错误代码。
unfiltered 端口的这种状态仅在TCP-ACK扫描期间发生,表示该端口可访问,但无法确定它是开放还是关闭。
`open filtered`
`closed filtered`
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# nmap-egrep

# 主机和开放端口
egrep -v "^#|Status: Up" file.gnmap | cut -d' ' -f2,4- | \
sed -n -e 's/Ignored.*//p' | \
awk '{print "Host: " $1 " Ports: " NF-1; $1=""; for(i=2; i<=NF; i++) { a=a" "$i; }; split(a,s,","); for(e in s) { split(s[e],v,"/"); printf "%-8s %s/%-7s %s\n" , v[2], v[3], v[1], v[5]}; a="" }'

# 打印端口
egrep -v "^#|Status: Up" file.gnmap | cut -d' ' -f4- | \
sed -n -e 's/Ignored.*//p' | tr ',' '\n' | sed -e 's/^[ \t]*//' | \
sort -n | uniq -c | sort -k 1 -r | head -n 10

# 统计端口数
egrep -v "^#|Status: Up" file.gnmap | cut -d' ' -f2,4- | \
sed -n -e 's/Ignored.*//p' | \
awk -F, '{split($0,a," "); printf "Host: %-20s Ports Open: %d\n" , a[1], NF}' \
| sort -k 5 -g

# 横幅爬取
egrep -v "^#|Status: Up" file.gnmap | cut -d' ' -f2,4- | \
awk -F, '{split($1,a," "); split(a[2],b,"/"); print a[1] " " b[1]; for(i=2; i<=NF; i++) { split($i,c,"/"); print a[1] c[1] }}' \
| xargs -L1 nc -v -w1

# 顶级服务标识符
egrep -v "^#|Status: Up" file.gnmap | cut -d ' ' -f4- | tr ',' '\n' | \
sed -e 's/^[ \t]*//' | awk -F '/' '{print $7}' | grep -v "^$" | sort | uniq -c \
| sort -k 1 -nr

2024-09-08
Contents

⬆︎TOP