参考文献

nmap

端口扫描基础

  • 许多传统的端口扫描器只列出所有端口是开放还是关闭的, Nmap的信息粒度比它们要细得多。 它把端口分成六个状态: open(开放的),closed(关闭的),filtered(被过滤的), unfiltered(未被过滤的), open|filtered(开放或者被过滤的),或者closed|filtered(关闭或者被过滤的)。

  • Nmap所识别的6个端口状态

    状态 说明
    open(开放的) 应用程序正在该端口接收TCP 连接或者UDP报文。发现这一点常常是端口扫描 的主要目标。安全意识强的人们知道每个开放的端口 都是攻击的入口。攻击者或者入侵测试者想要发现开放的端口。 而管理员则试图关闭它们或者用防火墙保护它们以免妨碍了合法用户。 非安全扫描可能对开放的端口也感兴趣,因为它们显示了网络上那些服务可供使用
    closed(关闭的) 关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并作出响应), 但没有应用程序在其上监听。 它们可以显示该IP地址上(主机发现,或者ping扫描)的主机正在运行up 也对部分操作系统探测有所帮助。 因为关闭的关口是可访问的,也许过会儿值得再扫描一下,可能一些又开放了。 系统管理员可能会考虑用防火墙封锁这样的端口。 那样他们就会被显示为被过滤的状态
    filtered(被过滤的) 由于包过滤阻止探测报文到达端口, Nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由器规则 或者主机上的软件防火墙。这样的端口让攻击者感觉很挫折,因为它们几乎不提供 任何信息。有时候它们响应ICMP错误消息如类型3代码13 (无法到达目标: 通信被管理员禁止),但更普遍的是过滤器只是丢弃探测帧, 不做任何响应。 这迫使Nmap重试若干次以访万一探测包是由于网络阻塞丢弃的。 这使得扫描速度明显变慢。
    unfiltered(未被过滤的) 未被过滤状态意味着端口可访问,但Nmap不能确定它是开放还是关闭。 只有用于映射防火墙规则集的ACK扫描才会把端口分类到这种状态。 用其它类型的扫描如窗口扫描,SYN扫描,或者FIN扫描来扫描未被过滤的端口可以帮助确定 端口是否开放
    `open filtered`(开放或者被过滤的)
    `closed filtered`(关闭或者被过滤的)

目标说明

参数 说明
-iL <inputfilename> 从列表中输入(列表中包含hosts/IP)
-iR <hostnum> 随机选择目标,选项 0 意味着永无休止的扫描。
--exclude <host1,host2,...> 排除主机/网络
--excludefile <exclude_file> 排除文件中的列表(文件中的列表用换行符,空格,或者制表符分隔)

主机发现

  • (默认:ICMP,SYN,ACK,UDP Ping)
参数 说明
-sL 列表扫描,列表扫描是主机发现的退化形式,它仅仅列出指定网络上的每台主机, 不发送任何报文到目标主机
-sP Ping扫描,该选项告诉Nmap仅仅 进行ping扫描 (主机发现),然后打印出对扫描做出响应的那些主机。它可以很方便地得出 网络上有多少机器正在运行或者监视服务器是否正常运行。常常有人称它为 地毯式ping
-P0 (无ping) 该选项完全跳过Nmap发现阶段。 通常Nmap在进行高强度的扫描时用它确定正在运行的机器。 默认情况下,Nmap只对正在运行的主机进行高强度的探测如 端口扫描,版本探测,或者操作系统探测。用-P0禁止 主机发现会使Nmap对每一个指定的目标IP地址 进行所要求的扫描。所以如果在命令行指定一个B类目标地址空间(/16), 所有 65,536 个IP地址都会被扫描。 -P0的第二个字符是数字0而不是字母O。 和列表扫描一样,跳过正常的主机发现,但不是打印一个目标列表, 而是继续执行所要求的功能,就好像每个IP都是活动的
-PS [portlist] (TCP SYN Ping) 该选项发送一个设置了SYN标志位的空TCP报文。 默认目的端口为80 (可以通过改变nmap.h) 文件中的DEFAULT-TCP-PROBE-PORT值进行配置,但不同的端口也可以作为选项指定。 甚至可以指定一个以逗号分隔的端口列表(如 -PS22,23,25,80,113,1050,35000), 在这种情况下,每个端口会被并发地扫描。
-PA [portlist] (TCP ACK Ping) TCP ACK ping和刚才讨论的SYN ping相当类似。 也许您已经猜到了,区别就是设置TCP的ACK标志位而不是SYN标志位。 ACK报文表示确认一个建立连接的尝试,但该连接尚未完全建立。 所以远程主机应该总是回应一个RST报文, 因为它们并没有发出过连接请求到运行Nmap的机器,如果它们正在运行的话。
-PA选项使用和SYN探测相同的默认端口(80),也可以 用相同的格式指定目标端口列表。如果非特权用户尝试该功能, 或者指定的是IPv6目标,前面说过的connect()方法将被使用。 这个方法并不完美,因为它实际上发送的是SYN报文,而不是ACK报文。
-PU [portlist] (UDP Ping) 还有一个主机发现的选项是UDP ping,它发送一个空的(除非指定了–data-length UDP报文到给定的端口。端口列表的格式和前面讨论过的-PS和-PA选项还是一样。 如果不指定端口,默认是31338。该默认值可以通过在编译时改变nmap.h文件中的 DEFAULT-UDP-PROBE-PORT值进行配置。默认使用这样一个奇怪的端口是因为对开放端口 进行这种扫描一般都不受欢迎
-PE; -PP; -PM (ICMP Ping Types) 除了前面讨论的这些不常见的TCP和UDP主机发现类型, Nmap也能发送世人皆知的ping 程序所发送的报文。Nmap发送一个ICMP type 8 (回声请求)报文到目标IP地址, 期待从运行的主机得到一个type 0 (回声响应)报文。 对于网络探索者而言,不幸的是,许多主机和 防火墙现在封锁这些报文,而不是按期望的那样响应, 参见RFC 1122。因此,仅仅ICMP扫描对于互联网上的目标通常是不够的。 但对于系统管理员监视一个内部网络,它们可能是实际有效的途径。 使用-PE选项打开该回声请求功能。
-PR (ARP Ping) 最常见的Nmap使用场景之一是扫描一个以太局域网。 在大部分局域网上,特别是那些使用基于 RFC1918私有地址范围的网络,在一个给定的时间绝大部分 IP地址都是不使用的。 当Nmap试图发送一个原始IP报文如ICMP回声请求时, 操作系统必须确定对应于目标IP的硬件 地址(ARP),这样它才能把以太帧送往正确的地址。 这一般比较慢而且会有些问题,因为操作系统设计者认为一般不会在短时间内 对没有运行的机器作几百万次的ARP请求。
-n (不用域名解析) 告诉Nmap 永不对它发现的活动IP地址进行反向域名解析。 既然DNS一般比较慢,这可以让事情更快些。
-R (为所有目标解析域名) 告诉Nmap 永远 对目标IP地址作反向域名解析。 一般只有当发现机器正在运行时才进行这项操作。
–system-dns (使用系统域名解析器) 默认情况下,Nmap通过直接发送查询到您的主机上配置的域名服务器 来解析域名。为了提高性能,许多请求 (一般几十个 ) 并发执行。如果您希望使用系统自带的解析器,就指定该选项 (通过getnameinfo()调用一次解析一个IP)。除非Nmap的DNS代码有bug–如果是这样,请联系我们。 一般不使用该选项,因为它慢多了。系统解析器总是用于IPv6扫描

nmap按脚本分类扫描

1
nmap --script=[脚本名称]
脚本名称 说明
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

示例

获取某网段存活的主机列表

1
nmap -sn 192.168.1.0/24 |grep report |awk '{print $5}' > live-hosts.txt

对列表中的主机进行扫描

1
nmap -iL live-hosts.txt -A -T4 -v -oX scan.xml --stylesheet /usr/share/nmap/nmap.xsl
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
# 扫描目标IP的所有常用端口
nmap 192.168.1.1

# 扫描目标IP的1到1000端口
nmap -p 1-1000 192.168.1.1

# 扫描目标IP的22、80和443端口
nmap -p 22,80,443 192.168.1.1

# 执行服务版本检测
nmap -sV 192.168.1.1

# 扫描目标IP的操作系统
nmap -O 192.168.1.1

# 执行默认的NSE脚本扫描
nmap -sC 192.168.1.1

# 启用操作系统检测、服务版本检测、脚本扫描和Tracert
nmap -A 192.168.1.1

# 扫描目标IP的53、67和161 UDP端口
nmap -sU -p 53,67,161 192.168.1.1

# 扫描192.168.1.0/24网络范围的所有主机
nmap 192.168.1.0/24

# 执行TCP SYN扫描
nmap -sS 192.168.1.1

# 扫描目标IP的服务版本和操作系统
nmap -sV -O 192.168.1.1

# 扫描目标IP的所有端口
nmap -p- 192.168.1.1

# 执行指定的NSE脚本扫描
nmap --script=default 192.168.1.1
# 扫描漏洞
nmap -Pn -p- --script vuln 192.168.1.1

# 将扫描结果输出到output.txt文件
nmap -oN output.txt 192.168.1.1

# 扫描目标IP的所有端口,显示详细信息
nmap -p- -vv 192.168.1.1

# 扫描HTTP服务并执行http-title脚本
nmap -p 80,443 --script http-title 192.168.1.1

# 设置扫描的速度等级,快速扫描
nmap -T4 192.168.1.1

# 扫描指定MAC地址范围的网络
nmap -sn --source-mac 00:11:22:33:44:55 192.168.1.0/24

# 扫描指定端口并进行服务版本检测
nmap -sV -p 22,25,80 192.168.1.1

# 将扫描结果以XML格式保存到output.xml文件
nmap -oX output.xml 192.168.1.1

# 会对IP地址192.168.1.1进行详细的TCP端口扫描,使用默认脚本和版本检测来获取更多的信息,同时跳过主机发现阶段,提供详细输出,并将结果保存为三种文件格式
nmap -sC -sV -Pn -nvv 192.168.1.1 -oA initial_tcp