Nmap的使用
Nmap简介
Nmap是Linux下一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具,软件名字Nmap是Network Mapperf的简称。
Nmap最初由Fyodor在1996年开始创建,随后在开源社区众多的志愿者参与下,该工具逐渐成为最为流行的安全必备工具之一。
Nmap使用原始IP报文来发现网络上有哪些主机,这些主机提供什么服务(应用程序名和版本),服务运行在什么操作系统,它们使用什么类型的报文过滤器/防火墙,以及一些其他功能。
Nmap家族成员
- Zenmap:Nmap的图形界面版
- Ncat:基于netcat,并扩展了一些功能,如ncat链、SSL支持、二进制等
- Ncrack:测试已部署的认证系统和密码强度,支持常用协议
- Ndiff:用于网络基线测试,对比Nmap扫描结果之间的差异
- Nping:允许将自己构造的数据包整合在扫描过程中,并对原始数据进行操控
Nmap安装包下载
Nmap基本功能
基本功能
- 主机发现
- 端口扫描
- 应用程序与版本信息侦测
- 操作系统侦测
附加功能
- 规避防火墙/入侵检测
- NSE脚本定制与使用
Nmap命令语法格式
nmap【空格】【选项多选项协议】【空格】【扫描目标说明】
说明 多个选项之间也是用空格进行分割的,如果某些选项需要指定某些参数,那么在这些选项与指定的参数之间一般也需要用空格进行分割。特殊情况下,有的选项与参数可以直接“连写”,如-p80,-p是选项,80是参数。为了使Nmap语法更加严谨,建议严格用空格进行分割。
默认方式扫描
1 | nmap <目标地址> |

全面扫描
1 | nmap -A -T 4 -v <目标地址> |

主机发现
目标:确定目标主机是否在线(Aive,处于开启状态)
原理:与pig命令类似,发送探测包到目标主机,如果收到回复,则说明目标主机是开启的
探测方式:Nmap支持十多种不同的主机探测方法
- ICMP ECHO/TIMESTAMP/NETMASK报文
- TCP SYN/ACK报文
- SCTP INIT/COOKIE-ECHO报文
选项 | 功能 |
---|---|
-sP | Ping扫描(不进行端口扫描) |
-Pn | 不进行Ping扫描 |
-PS/-PA/-PU/-PY | TCP SYN/TCP ACK/UDP/SCTP INIT Ping 扫描 |
-PE/-PP/-PM | ICMP echo/ICMP timestamp/ICMP netmask Ping 扫描 |
-R/-n | DNS反向域名解析/禁用DNS反向解析 |
-6 | 扫描IPv6地址 |
–dns-servers<serv1[,serv2,…]> | 指定DNS服务器 |
–system-dns | 指定使用系统的DNS服务器 |
–traceroute | 追踪每个路由节点 |
–packet-trace | 追踪每个包 |
局域网内执行Ping扫描
目标:扫描局域网192.168.40.1-192.168.40.254内哪些1P的主机在线。
命令:nmap -sP 192.168.40.1-254
,或 nmap -sP 192.168.40.0/24
说明:在局域网内,无论采用哪一种选项,Nmap都是通过ARP包来询问IP地址上的主机是否活动的,如果收到ARP回复包,那么说明主机在线。

跨网段执行ping扫描
目标:扫描跨网段目标主机192.168.50.5是否在线。
命令:nmap-sP 192.168.50.5
说明:扫描跨网段目标主机时,使用-sP或-sn选项,默认情况下Nmap会依次发送4种不同类型的数据包(ICMP echo request,TCP SYN packet to port 443,TCP ACK packet to port80,ICMP timestamp request)来探测目标主机是否在线,只要收到其中一个包的回复,就证明目标机在线。
–packet-trace的使用
可以查看都发出了什么类型的包

端口扫描
目标:确定目标主机的TCP/UDP端口的开放情况
原理:发送TCP、UDP等类型的探测包到目标端口,根据收到的回复包判定端口是否开放
端口的六个状态
open
:端口是开放的closed
:端口是关闭的filtered
:端口被防火墙IDS/小PS屏蔽,无法确定其状态unfiltered
:端口没有被屏蔽,但是否开放需要进一步确定open filtered
:端口是开放的或被屏蔽closed filtered
:端口是关闭的或被屏蔽
选项 | 功能 |
---|---|
-p | 指定扫描的目标端口 |
–exclude-port | 指定排除的目标端口 |
-sT/-sS/-sA | TCP connect/TCP SYN/TCP ACK 扫描 |
-sN/-sF/-sX | TCP NULL/TCP FIN/TCP Xmas扫描 |
-sU | UDP扫描 |
-sW/-sM | TCP窗口/TCP Maimom扫描 |
–scanflags | 自定义TCP扫描 |
-sO | IP扫描 |
-p选项的应用
在-p
选项后指定扫描的端口号,最后跟上IP地址
1 | nmap -p 1-1024,1433,3306,3389 192.168.0.22 |

关于-p选项的说明:默认情况下,Nmap仅对用-p指定的TCP端口进行扫描,扫描方式为-sS(TCP SYN扫描)。如果既要扫描TCP端口,又要扫描UDP端口,则可以用T:``U:
参数指定目标端口,并指定-sU(UDP扫描方式)和至少一种TCP扫描方式
1 | nmap -p T:139,U:53 -sS -sU 192.168.0.22 |

-sS选项的应用
TCP SYN扫描
1 | nmap -p 80,3306 -sS 192.168.0.22 |

TCP SYN扫描(-sS)原理
Nmap向目标端口发送TCP SYN报文,如果目标机返回TCP SYN+ACK报文,则说明目标端口处于开放状态,同时Nmap会紧接着向目标机发送TCP RST:报文以重置此连接;如果目标机返回TCP RST+ACK报文,则说明目标端口处于关闭状态。

-sT选项的应用
TCP connect扫描
相比 TCP SYN扫描,这是一个完整的连接,容易被发现,但是这个扫描允许任何用户发起
1 | nmap -p 80,3306 -sT 192.168.0.22 |

TCP connect扫描(-sT)原理
Nmap向目标端口发送TCP SYN:报文,如果目标机返回TCP SYN+ACK报文,则说明目标端口处于开放状态,同时Nmap会紧接着向目标机依次发送TCP ACK、TCP RST+ACK完成三次握手和重置此连接;如果目标机返回TCP RST+ACK报文,则说明目标端口处于关闭状态。

-sA选项的应用
TCP ACK扫描
1 | nmap -p 80,3306 -sA 192.168.0.22 |

TCP ACK扫描(-sA)原理
Nmap向目标端口发送TCP ACK报文,无论目标端口是否处于开放状态,目标机都会返回TCP RST报文。如果Nmap主机能收到此TCP RST报文,则说明目标端口未被防火墙屏蔽。
TCP ACK扫描只能用于确定防火墙是否屏蔽某个端口,可以辅助TCP SYN的方式来判断目标主机防火墙的状况。

隐蔽扫描选项(-sF/-sN/-sX)的应用
1 | nmap -p 80,3306 -sF 110.242.68.66 |

隐蔽扫描(-sF/-sN/-sX)原理
Nmap向目标端口发送TCP FIN(-sF)/NULL(-sN)/FIN+PSH+URG(-sX)报文
对于Liux系统的目标机,如果目标机未响应,则说明目标端口处于开放状态或被防火墙屏蔽;如果目标机返回TCP RST+ACK报文,则说明目标端口处于关闭状态。
对于Windows系统的目标机,无论目标端口处于开放还是关闭状态,目标机都会返回TCP RST+ACK报文。
因此,隐蔽扫描方式适合于Liux系统的目标机端口扫描。
应用程序与版本信息侦测
目标:识别目标主机开放的TCP/UDP端口上运行的服务及版本信息流程
这个动作一般是发生在端口扫描之后,首先检查open与open filtered状态的端口是否在排除端口列表内。如果在排除列表,将该端口剔除。
如果是TCP端口,尝试建立TCP连接。尝试等待片刻(通常6秒或更多,具体时间可以查询文件nmap-services-probes中Probe TCP NULL q||对应的totalwaitms)。通常在等待时间内,会接收到目标机发送的“Welcome Banner”信息。Nmap将接收到的Banner与nmap-services-probest中NULL probe中的签名进行对比,查找对应应用程序的名字与版本信息
如果通过”Welcome Banner”无法确定应用程序版本,那么Nmap再尝试发送其他的探测包(即从nmap-services-probest中挑选合适的probe),将probe得到的回复包与数据库中的签名进行对比。如果反复探测都无法得出具体应用,那么打印出应用返回报文,让用户自行进一步判定。
如果是UDP端口,那么直接使用nmap-services-probes中探测包进行探测匹配,根据结果对比分析出UDP应用服务类型。
如果探测到应用程序是SSL,那么调用openSSL进一步的侦查运行在SSL之上的具体的应用类型。
如果探测到应用程序是SunRPC,那么调用orute-force RPC grinder进一步探测具体服务。
上面我们反复提到了nmap-services-probes
这是一个服务版本数据库文件 ,默认路径:usr/share/nmap/nmap-services-probes
我们可以打开看一下
选项 | 功能 |
---|---|
-sV | 版本探测 |
–allports | 全端口版本探测 |
–version-intensity | 设置版本扫描强度 |
–version-light | 轻量级扫描(相当于-version-intensity2) |
–version-all | 重量级扫描(相当于-version-intensity9) |
–version-trace | 跟踪版本扫描活动 |
-sR | RPC扫描 |
-sV选项的应用
1 | nmap -sV 110.242.68.66 |

-version-trace选项的应用
跟踪版本扫描活动,我们指定一下扫描的端口,节约时间
1 | nmap -p 80,443,3306 -sV --version-trace 110.242.68.66 |

操作系统侦测
目标:识别目标主机操作系统的类型
侦测方法:网络协议栈指纹识别技术
Nmap只是有这个功能罢了,一般来说侦测的不是很准确
常用的网络协议栈指纹识别方法
TTL
TTL:Time To Live,即数据包的“存活时间”,表示一个数据包在被丢弃之前可以通过多少跃点(Hop)。不同操作系统的缺省TTL值往往是不同的。
常见操作系统的TTL值
操作系统名称 TTL值 Windows 9x/NT/2000 Intel TTL=128 Digital Unix 4.0 Alpha TTL=60 Linux 2.2.x Intel TTL=64 Netware 4.11 Intel TTL=128 AIX 4.3.x IBM/RS6000 TTL=60 Cisc012.02514 TTL=255 Solaris 8 Intel/Spard TTL=64 Windows系统修改TTL值的方法:
打开注册表,在”HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters”新建一个“DefaultTTL”Dword键值进行自定义
DF位
DF(不分段)位识别:不同OS对DF位有不同的处理方式,有些OS设置DF位,有些不设置DF位;还有一些OS在特定场合设置DF位,在其它场合不设置DF位。
Window Size
Window Size:TCP接收(发送)窗口大小。它决定了接收信息的机器在收到多少数据包后发送ACK包。
特定操作系统的缺省Window Size基本是常数,例如AIX用0x3F25,Windows、OpenBSD、FreeBSD用0x402E
一般地,UNIX的Window Size较大。Windows、路由器、交换机等的较小。
ACK序号
不同的OS处理ACK序号时是不同的。如果发送一个FIN+PSH+URG的数据包到一个关闭的TCP端口,大多数OS会把回应ACK包的序号设置为发送的包的初始序号,而Windows和一些打印机则会发送序号为初始序号加1的ACK包。
对FIN包的响应
发送一个只有FIN标志位的TCP数据包给一个打开的端口,Liux等系统不响应;有些系统如Windows、CISCO、HP/UX等,发回一个RST。
ISN(初始化序列号)
不同的OS在选择TCP ISN时采用不同的方法:一些UNIX系统采用传统的64K递增方法;较新的Solaris、IRIX、FreeBSD、Digital Unix、Cray等系统采用随机增量的方法;Linux2.0、OpenVMS、AIX等系统采用真随机方法;Nindows系统采用一种时间相关的模型;还有一些系统使用常数,如3Com集线器使用0x803,Apple LaserWriter打印机使用0xC7001.
主机使用的端口
一些OS会开放特殊的端口,如Windows的137、139;一些网络设备,如入侵检测系统、防火墙等也开放自己特殊的端口。
侦测方法
与应用程序与版本信息侦测类似,操作系统侦测也是通过在数据库文件中查找比对来确定操作系统的
nmap-os-db
就是操作系统数据库文件,该数据库包含了超过2600种操作系统的指纹信息,Nmap把TCP和UDP报文发送到目标机器上,然后将检查结果和nmap-os-db数据库进行比对,默认路径:/usr/share/nmap/nmap-os-db
选项 | 功能 |
---|---|
-O | 执行操作系统侦测 |
-A | 执行攻击性探测 |
–osscan-limit | 对指定的目标进行操作系统侦测 |
–osscan-guess /–fuzzy | 推测系统识别 |
-O选项的应用
1 | nmap -O 110.242.68.66 |
规避FW(防火墙)/IDS(入侵检测)
目标:绕过目标主机的防火墙、入侵检测系统等防护手段
常用选项
选项 | 功能 |
---|---|
-T | 时序选项 |
-f | 报文分段 |
–data-length | 指定发包长度 |
–mtu | 指定偏移量大小(必须是8的倍数) |
-D | 使用诱饵进行源地址欺骗 |
-sI | 空闲扫描(源地址欺骗) |
–source-port | 源端口欺骗 |
–spoof-mac | 源MAC地址欺骗 |
-T选项的应用
控制扫描速度,使用-T(0~5)可以启用时序选项,一般来说数字越大,速度越快,精度越低
-T0
(偏执的):非常慢的扫描,用于IDS逃避-T1
(鬼崇的):缓慢的扫描,用于IDS逃避-T2
(文雅的):降低速度以降低对带宽的消耗,此选项一般不常用-T3
(普通的):默认,根据目标的反应自动调整时间-T4
(野蛮的):快速扫描,常用扫描方式,需要在很好的网络环境下使用-T5
(疯狂的):极速扫描,以牺牲准确度来提升扫描速度
1 | nmap -T 4 192.168.0.22 |
-D选项的应用
源IP地址欺骗,使用参数 RND来指定欺骗的地址个数
1 | nmap -D RND:2 110.242.68.66 |

可以看到图中除了本机IP192.168.0.24
之外,还多了两个其它的假Ip
空闲扫描(-sI)的应用
就是利用网络上空闲的IP来代替本机去扫描
1 | nmap -Pn -sI 192.168.0.7 110.242.68.66 |
使用 -Pn
选项是为了防止来自真实ip 的ping,注意前一个ip一定要是网络上可用的ip
-spoof-mac选项的应用一一源MAC地址欺骗
所用命令:nmap --spoof-mac 0 <目标lP>
,其中参数0表示随机分配一个MAC地址,也可以手动指定MAC地址,如:nmap --spoof-mac aa:bb:cc:dd:ee:ff<目标IP>
1 | nmap --spoof-mac 0 110.242.68.66 |

NSE脚本的简单应用
NSE和Lua
除了常规的网络扫描,Nmap还可根据NSE(Nmap scripting Engine)的脚本进行大量渗透工作,这种脚本基于Lua语言编写。
脚本存放目录:/usr/share/nmap/scripts/
NSE开发工具
IDE for Nmap Script Developers
NSE脚本运用
常用选项
选项 | 功能 |
---|---|
-sC | 等价于-scripta=default,使用默认类别的脚本进行扫描 |
–script= |
|
–script-args=<n1=v1,[n2=v2,…]> | 为脚本提供默认参数 |
–script-args-file=filename | 使用文件来为脚本提供参数 |
–script-trace | 显示脚本执行过程中发送与接收的数据 |
–script-updatedb | 更新脚本数据库 |
–script-help= |
显示脚本的帮助信息,其中 |
暴力破解脚本(–script brute)应用
提供暴力破解的方式,可对数据库、SMB、SNMP等进行简单密码的暴力猜解

漏洞扫描脚本(-script vuln)应用
检查是否存在常见漏洞
1 | nmap --script vuln 192.168.0.22 |

扫描结果保存与输出
三种格式的输出
- norma:标准模式(选项-oN)
- xml文档:(选项-oX)
- grep文件(选项-oG)
注:-oA
选项可将扫描结果以标准格式、XML、Grep格式一次性全部保存
以普通模式(-oN)输出Nmap扫描结果
1 | nmap -sS -oN /home/outputl.txt 192.168.0.22 |
上面的命令就可用吧扫描结果写入指定目录下的文件中