Nmap

Nmap 使用方法、小技巧

Nmap中文手册,保存为 HTML 格式打开

基本扫描

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
nmap -T4 -sn [ip] 	# 主机发现
nmap -T4 [ip] # 端口扫描
nmap -T4 -sV [ip] # 服务扫描
nmap -T4 -O [ip] # 操作系统扫描


# 扫描选项

-sP # 只扫描在线情况
-sS # SYN 扫描
-sT # TCP 扫描
-sU # UDP 扫描
-sV # 服务版本检测
-O # 操作系统识别
-p # 指定扫描的端口,使用 -p- 扫描全端口
-F # 快速扫描最可能开放的 100 个端口
-n/-R # 不使用/总是使用 DNS 解析
--scanflags # 指定 TCP 标志位,包括 URG, ACK, PSH, RST, SYN, FIN

# 时序选项

-T0 偏执的:非常非常慢,用于IDS逃逸
-T1 猥琐的:相当慢,用于IDS逃逸
-T2 有礼貌的:降低速度以消耗更小的带宽,比默认慢十倍
-T3 普通的:默认,根据目标的反应自动调整时间模式
-T4 野蛮的:假定处在一个很好的网络环境,请求可能会淹没目标
-T5 疯狂的:非常野蛮,很可能会淹没目标端口或是漏掉一些开放端口

# 脚本

-sC 等价于–script=default,使用默认类别的脚本进行扫描 可更换其他类别
script=<Lua scripts> <Lua scripts>使用某个或某类脚本进行扫描,支持通配符描述
script-args=<n1=v1,[n2=v2,...]> 为脚本提供默认参数
script-args-file=filename 使用文件来为脚本提供参数
script-trace 显示脚本执行过程中发送与接收的数据
script-updatedb 更新脚本数据库
script-help=<scripts> 显示脚本的帮助信息,其中<scripts>部分可以逗号分隔的文件或脚本类别

# 脚本分类

auth 负责处理鉴权证书(绕开鉴权)绕过目标主机得访问控制的脚本
broadcast 在局域网内探查更多服务开启状况,如dhcp/dns/sqlserver等服务
brute 提供暴力破解方式,针对常见的应用如http/snmp等
default 使用-sC或-A选项扫描时候默认的脚本,提供基本脚本扫描能力
discovery 对网络进行更多的信息,如SMB枚举、SNMP查询等
dos 用于进行拒绝服务攻击
exploit 利用已知的漏洞入侵系统
external 利用第三方的数据库或资源,例如进行whois解析
fuzzer 模糊测试的脚本,发送异常的包到目标机,探测出潜在漏洞 intrusive: 入侵性的脚本,此类脚本可能引发对方的IDS/IPS的记录或屏蔽
malware 探测目标机是否感染了病毒、开启了后门等信息
safe 此类与intrusive相反,属于安全性脚本
version 负责增强服务与版本扫描(Version Detection)功能的脚本
vuln 负责检查目标机是否有常见的漏洞(Vulnerability),如是否有MS08_067

按脚本分类扫描

# 负责处理鉴权证书(绕开鉴权)的脚本,也可以作为检测部分应用弱口令
nmap --script=auth 192.168.137.*

# 提供暴力破解的方式 可对数据库,smb,snmp等进行简单密码的暴力猜解
nmap --script=brute 192.168.137.*

# 默认的脚本扫描,主要是搜集各种应用服务的信息,收集到后,可再针对具体服务进行攻击
nmap --script=default 192.168.137.* 或者 nmap -sC 192.168.137.*

# 检查是否存在常见漏洞
nmap --script=vuln 192.168.137.*

# 在局域网内探查更多服务开启状况
nmap -n -p445 --script=broadcast 192.168.137.4

# 利用第三方的数据库或资源,例如进行whois解析
nmap --script external 202.103.243.110

高级扫描

1
2
3
4
5
6
7
8
-iflist					# 查看本地路由和接口,当遇到无法达到目标主机或想选择从多块网卡中某一特定网卡访问目标主机时,可以查看nmap –iflist中提供的网络接口信息。
-e [interface] # 指定使用特定网口发送数据,可参考 -iflist 信息
-S [spoofip] # 使用特定源 IP 发送数据
-D [ip1/ME],[ip2/ME]... # 使用诱骗方式隐藏真实扫描地址,使用多个IP同时扫描,ME代表自己的真实地址
-g/-sourve-port # 指定源端口
-spoof-mac # 指定欺骗的 MAC 地址
-scanflag # 定制 TCP 胡举报标志位,包括 URG, ACK, PSH, RST, SYN, FIN
-ip-options # 定制 IP 包的 OPTIONS 字段

Nmap 端口状态

状态 说明
open 应用程序在该端口接收 TCP 连接或者 UDP 报文
closed 关闭的端口对于nmap也是可访问的, 它接收nmap探测报文并作出响应。但没有应用程序在其上监听
filtered 由于包过滤阻止探测报文到达端口,nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由规则 或者主机上的软件防火墙
unfiltered 未被过滤状态意味着端口可访问,但是nmap无法确定它是开放还是关闭。 只有用于映射防火墙规则集的 ACK 扫描才会把端口分类到这个状态
open | filtered 无法确定端口是开放还是被过滤, 开放的端口不响应就是一个例子。没有响应也可能意味着报文过滤器丢弃了探测报文或者它引发的任何反应。UDP,IP协议, FIN, Null 等扫描会引起。

扫描防火墙

命令 类型 说明
nmap -sS [ip] SYN 扫描 -
nmap -sF [ip] FIN 扫描 识别端口是否关闭,收到RST说明端口关闭,否则为 open 或者 filtered
nmap -sA [ip] ACK 扫描 识别端口是否被过滤,收到RST说明端口未被过滤(open 或者 closed)
nmap -sW [ip] Window 扫描 只用于某些 TCP/IP 协议实现,发送ACK,检查回复的RST包中的 Window size,关闭的端口为0,开放的端口非0

用以上方式交叉扫描可以得出端口的真实状态。

扫描路由器

1
2
3
4
5
6
nmap -p1-25,80,512-515,2001,4001,6001,9001 [subnet] 
# 思科路由器在上述端口中运行了一些常见服务,列出这些端口开放的主机可以帮助定位路由器的IP地址可端口状态
nmap –sU –p69 –nvv [ip]
# 多数路由器支持 TFTP(简单文件传输协议)用于备份和回复路由器配置文件,运行在 UDP 69 端口
nmap -F -O -n [ip]
# 扫描操作系统

扫描互联网

1
nmap -iR 100000 -sS -PS80 -p 80 -oG nmap.txt

随机生成 10w 个 IP 地址,对它们的80端口进行扫描,将结果以 grepable 格式输出到 nmap.txt

1
nmap -iR 1200000 -sL -n | grep ”not scanned” | awk ’{print $2}’ | sort -n | uniq >! tp; head -25000000 tp >! tcp-allports-1M-IPs; rm tp

随机生成1200000个IP地址(-iR 120000),并进行列表扫描(-sL,列举出IP地址,不进行真正的扫描),不进行dns解析操作(-n),这样将产生Nmap列表扫描的结果。在此 结果中搜出未扫描的行(grep “not scanned”),打印出每一行的第二列内容(awk ‘{print $2}’,也就是IP地址),然后对获取到的IP地址进行排序(sort -n),然后剔除重复IP地址,将结果保存到临时文件tp,再取出前1000000个IP地址保存到tcp-allports-1M-IPs文件中,删除 临时文件。

1
nmap -sP -PE -PP -PS21,22,23,25,80,113,31339-PA80,113,443,10042 –source-port 53 -T4 -iL tcp-allports-1M-IPs

使用产生的IP地址(-iL tcp-allports-1M-IPs),指定发送包的源端口为53(–source-port 53,该端口是DNS查询端口,一般的防火墙都允许来自此端口的数据包),时序级别为4(-T4,探测速度比较快),以TCP SYN包方式探测目标机的21,22,23,25,80,113,31339端口,以TCP ACK包方式探测对方80,113,443,10042端口,另外也发送ICMP ECHO/ICMP TIMESTAMP包探测对方主机。只要上述的探测包中得到一个回复,就可以证明目标主机在线。

1
nmap -S [srcip] -d –max-scan-delay 10 -oAlogs/tcp-allports-%T-%D -iL tcp-allports-1M-IPs –max-retries 1–randomize-hosts -p- -PS21,22,23,25,53,80,443 -T4min-hostgroup 256min-rate175 –max-rate 300

使用包含100万个IP地址的文件(-iL tcp-allports-1M-IPs),源端IP地址设置为srcip(指定一个IP地址,保证该IP地址位于统一局域网中,否则无法收到目标机的回 复包),主机发现过程使用TCP SYN包探测目标机的21,22,23,25,53,80,443,扫描过程将随机打乱主机顺序(–randomize-hosts,因为文件中的IP 已经排序,这里将之打乱,避免被防火墙检查出),端口扫描过程检查全部的TCP端口(-p-,端口1到65535),使用时序级别为4(-T4,速度比较 快),将结果以XML/grepable/普通格式输出到文件中(-oA logs/tcp-allports-%T-%D,其中%T表示扫描时间,%D表示扫描日期)。

-d表示打印调试出信息。

–max-scan-delay 10表示发包最多延时10秒,防止特殊情景下等待过长的时间。

–max-retries 1,表示端口扫描探测包最多被重传一次,防止Nmap在没有收到回复的情况下多次重传探测包,当然这样也会降低探测的准确性。

–min-host-group 256表示进行端口扫描与版本侦测时,同时进行探测的主机的数量,这里至少256个主机一组来进行扫描,可以加快扫描速度。

–min-rate 175和–max-rate 300,表示发包速率介于175和300之间,保证扫描速度不会太慢,也不会因为速率过高引起目标机的警觉。

由以上扫描得出互联网上最可能开放的 10 个 TCP 端口:

1
2
3
4
5
6
7
8
9
10
80 (http)
23 (telnet)
22 (ssh)
443 (https)
3389 (ms-term-serv)
445 (microsoft-ds)
139 (netbios-ssn)
21 (ftp)
135 (msrpc)
25 (smtp)

最可能开放的 UDP 端口:

1
2
3
4
5
6
7
8
9
10
137 (netbios-ns)
161 (snmp)
1434 (ms-sql-m)
123 (ntp)
138 (netbios-dgm)
445 (microsoft-ds)
135 (msrpc)
67 (dhcps)
139 (netbios-ssn)
53 (domain)

扫描 Web 站点

1
nmap -sV -p 80 -T4 –script=http*,default scanme.nmap.org
作者

lll

发布于

2020-06-12

更新于

2022-09-19

许可协议