Nmap简介
- Nmap是Linux下一款开源的网络发现和安全审计工具。
- Nmap使用原始IP报文来发现网络上有那些主机,这些主机提供什么服务(应用程序名和版本),服务运行在什么操作系统,它们使用什么类型的报文过滤器/防火墙,以及一些其他功能。
Nmap家族成员
- Zenmap:Nmap的图形界面版
- Ncat:基于netcat,并扩展了一些功能,如ncat链、SSL支持、二进制
- Ncrack:测试已部署的认证系统和密码强度,支持常用协议
- Ndiff:用于网络基线测试,对比Nmap扫描结果之间的差异
- Nping:允许将自己构造的数据包整合在扫描过程中,并对原视数据进行操控
Nmap命令语法格式
nmap【空格】【选项|多选项|协议】【空格】【扫描目标说明】
默认扫描
命令格式:namp<目标地址>
全面扫描
命令格式:nmap -A -T 4 -V <目标地址>
主机发现
目标:确定目标主机是否在线(Alive,处于开启状态)
原理:与ping命令类似,发送探测包到目标主机,如果收到回复,则说明目标主机是开启的
探测方式
Nmap支持十多种不同的主机探测方法
- ICMP ECHO / TIMESTAMP / NETMASK 报文
- TCP SYN / ACK 报文
- SCTP INIT / COOKIE-ECHO 报文
主机发现相关命令选项
选项 | 功能 |
---|---|
-sP或-sN | Ping扫描(不进行端口扫描) |
-P0或-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 | 追踪每个包 |
-Pn | 将所有主机都默认为在线,跳过主机发现 |
实例1:局域网内执行ping扫描
目标:扫描局域网内哪些IP的主机在线。
命令:nmap -sP 192.168.147.0/24
说明:在局域网内,无论采用哪一种选项,Nmap都是通过ARP包来询问IP地址上的主机是否活动的,如果收到ARP回复包,那么说明主机在线
实例2:跨网段执行ping扫描
目标:扫描跨网段目标主机是否在线。
命令: nmap -sP 192.168.1.7
说明:扫描跨网段目标主机时,使用-sP或-sn选项,默认情况下Nmap会依次发送4种不同类型的数据包(ICMP echo request、TCP SYN packet to port 443、TCP ACK packet to port 80、ICMP timestamp request)来探测目标主机是否在线,只要收到其中-一个包的回复,就证明目标机在线。
实例3:--packet-trace的使用
目标:追踪每个包
命令:nmap -sP --packet-trace 192.168.147.132
端口扫描
目标:确定目标主机的TCP/UDP端口开发情况
原理:发送TCP、UDP等类型的探测包到目标端口,根据收到的回复包判定端口是否开放
端口的六个状态
- open:端口是开放的
- closed:端口是关闭的
- filtered:端口被防火墙IDS/IPS屏蔽,无法确认其状态
- unfiltered:端口没有被屏蔽,但是否开放需要进一步确定
- open|filtered:端口是开放的或被屏蔽
- closed|filtered:端口是关闭的或被屏蔽
端口扫描相关的命令选项
实例4:-p选项的应用——指定扫描的端口号
命令:nmap -p 22,23,80,445,3389 192.168.147.132
默认情况下,Nmap仅对用-p指定的TCP端口进行扫描,扫描方式为-sS(TCP SYN扫描)。如果既要扫描TCP端口,又要扫描UDP端口,则可以用“T:” “U:”参数指定目标端口,并指定-sU(UDP扫描方式)和至少一种TCP扫描方式。
命令:nmap -p T:139,U:53 -sS -sU 192.168.147.132
TCP SYN扫描(-sS)原理
Nmap向目标端口发送TCP SYN报文,如果目标机返回TCP SYN+ACK报文,则说明目标端口处于开放状态,同时Nmap会紧接着向目标机发送TCP RST报文以重置此链接;如果目标机返回TCP RST+ACK报文,则说明目标端口处于关闭状态。
实例5:-sS选项的应用——TCP扫描
命令:nmap -p 80 -sS 192.168.147.132
TCP connect扫描(-sT)原理
Nmap向目标端口发送TCP SYN报文,如果目标机返回TCP SYN+ACK报文,则说明目标端口处于开放状态,同时Nmap会紧接着向目标依次发送TCP ACK、TCP RST+ACK完成三次握手和重置此链接;如果目标机返回TCP RST+ACK报文,则说明目标端口处于关闭状态。
实例6:-sT选项的应用——TCP connect扫描
命令:nmap -p 445 -sS 192.168.147.132
TCP ACK扫描(-sA)原理
- Nmap向目标端口发送TCP ACK报文,无论目标端口是否处于开放状态,目标机都会返回TCP RST报文。如果Nmap主机能够收到此TCP RST报文,则说明目标端口未被防火墙屏蔽。
- TCP ACK扫描只能用于确定防火墙是否屏蔽某个端口,可以辅助TCP SYN的方式来判断目标主机防火墙的状况
实例7:-sA选项的应用——TCP ACK扫描
命令:nmap -p 80 -sA 192.168.147.132
隐蔽扫描(-sF / -sN / -sX)原理
- Nmap向目标端口发送TCP FIN(-sF)/ NULL(-sN)/ FIN+RSH+URG(-sX)报文,对于Linux系统的目标机,如果目标机未响应,则说明目标端口处于开放状态或被防火墙屏蔽;如果目标机返回TCP RST+ACK报文,则说明目标端口处于关闭状态。
- 对于Windows系统的目标机,无论目标端口处于开放还是关闭状态,目标机都会返回TCP RST+ACK报文。
- 因此,隐蔽扫描方式适合于Linux系统的目标机端口扫描。
实例8:隐蔽扫描(-sF / -sN / -sX)的应用
应用程序与版本信息侦测
目标:识别目标主机开放的TCP/UDP端口上运行的服务及版本信息
流程:
- 首先检查open与open|filtered状态的端口是否在排除端口列表内。如果在排除列表,将该端口剔除。
- 如果是TCP端口,尝试建立TCP连接。尝试等待片刻(通常6秒或更多,具体时间可以查询文件nmap-services-probes中Probe TCP NULL q|对应的totalwaitms) .通常在等待时间内,会接收到目标机发送的"WelcomeBanner" 信息。Nmap将接收到的Banner与nmap-services-probes中NULL probe中的签名进行对比,查找对应应用程序的名字与版本信息。
- 如果通过"Welcome Banner" 无法确定应用程序版本,那么Nmap再尝试发送其他的探测包(即从nmap-services-probes中挑选合适的probe), 将probe得到的回复包与数据库中的签名进行对比。如果反复探测都无法得出具体应用,那么打印出应用返回报文,让用户自行进一步判定。
- 如果是UDP端口,那么直接使用nmap-services-probes中探测包进行探测匹配,根据结果对比分析出UDP应用服务类型。
- 如果探测到应用程序是SSL,那么调用openSSL进- -步 的侦查运行在SSL之上的具体的应用类型。
- 如果探测到应用程序是SunRPC,那么调用brute- force RPC grinder进一步 探测具体服务。
nmap-services-probes(服务器版本数据库文件)
默认路径:/usr/share/nmap/namp-services-probes
应用程序与版本信息侦测相关的命令选项
实例9:-sV选项(版本探测)的应用
实例10:--version-trace选项的应用——跟踪版本扫描活动
操作系统检测
目标:识别目标主机操作系统的类型
侦测方法:网络协议栈指纹识别技术
常用的网络协议栈指纹识别方法
TTL
TTL:Time To Live,即数据包的“存活时间,表示一个数据包在被丢弃之前可通过多少跃点(Hop)。不同操作系统的缺省TTL值往往是不同的。
常见操作系统的TTL值
- Windows 9x/NT/2000 Intel TTL=128
- Digital Unix 4.0 Alpha TTL= 60
- Linux 2.2.x Intel TTL= 64
- Netware4.11 Intel TTL= 128
- AIX 4.3.x IBM/RS6000 TTL= 60
- Cisco12.0 2514 TTL= 255
- Solaris 8 Intel/Sparc TTL=64
DF位
DF(不分段)位识别:不同OS对DF位有不同的处理方式,有些OS设置DF位,有些不设置DF位;还有一些OS在特定场合设置DF位,在其它场合不设置DF位。
window size
- Window Size:TCP接收(发送)窗口大小。它决定了接收信息的机器在收到多少数据包后发送ACK包。
- 特定操作系统的缺省Window Size基本是常数,例如AIX 用Ox3F25,Windows、OpenBSD、FreeBSD用0x402E。
- 一般地,UNIX的Window Size较大。Windows、路由器、交换机等的较小
ACK 序号
不同的OS处理ACK序号时是不同的。如果发送一个FIN+PSH+URG的数据包到一个关闭的TCP端口,大多数OS会把回应ACK包的序号设置为发送的包的初始序号,而Windows和一些打印机则会发送序号为初始序号加1的ACK包。
对FIN包的响应
发送一个只有FIN标志位的TCP数据包给一个打开的端口,Linux等系统不响应;有些
系统如 Windows、CISCO、HP/UX等,发回一个RST。
ISN(初始化序号)
不同的OS在选择TCP ISN时采用不同的方法:一些UNIX系统采用传统的64K递增方法;较新的Solaris、IRIX、FreeBSD、Digital Unix、Cray等系统采用随机增量的方法;Linux 2.0、OpenVMS、AIX等系统采用真随机方法;Windows系统采用一种时间相关的模型;还有一些系统使用常数,如3Com集线器使用0x803,Apple LaserWriter打印机使用0xC7001。
主机使用的端口
一些OS会开放特殊的端口,如Windows的137、139;一些网络设备设备,如入侵检测系统、防火墙等也开放自己特殊的端口。
操作系统侦测相关的命令选项
实例11:-O选项的应用
目标:执行操作系统的侦测
实例12:-A选项的应用
目标:执行攻击性探测
规避FW/IDS
目标:绕过目标主机的防火墙、入侵检测系统等防护手段
常用选项
实例1:-T选项的应用——控制扫描速度
使用-T (0~5)可以启用时序选项,一般来说使用-T (0~5)可以启用时序选项,一般来说
数字越大,速度越快,精度越低
- -T0 (偏执的) :非常慢的扫描,用于IDS逃避
- -T1 (鬼祟的) :缓慢的扫描,用于IDS逃避
- -T2 (文雅的) :降低速度以降低对带宽的消耗,此选项一般不常用.
- -T3 (普通的) :默认,根据目标的反应自动调整时间
- -T4 (野蛮的) :快速扫描,常用扫描方式, .需要在很好的网络环境下使用
- -T5 (疯狂的) :极速扫描,以牺牲准确度来提升扫描速度
实例2:-D选项的应用——源IP地址欺骗
实例3:空闲扫描(-sI)的应用
实例4:--spoof-mac选项的应用——源MAC地址欺骗
命令:nmap --spoof-mac 0 <目标IP>,其中参数0表示随机分配一个MAC地址
也可以手动指定MAC地址,如:nmap --spoof-mac aa:bb:cc:dd:ee:ff <目标IP>
NSE脚本的简单应用
NSE和lua
除了常规的网络扫描,Nmap还可以根据NSE的脚本进行大量渗透工作,这种脚本基于lua语言编写。这种脚本基于Lua语言编写。
脚本存放目录:/usr/share/nmap/scripts/
NSE脚本运用
常用选项
实例5:暴力破解脚本(--script brute)应用
提供暴力破解的方式,可对数据库、SMB、SNMP等进行简单密码的暴力破解
实例6:漏洞扫描脚本(--script vuln)应用
检查是否存在常见漏洞
扫描结果保存与输出
三种格式的输出
- normal:标准模式(选项-oN)
- xml文档:(选项-oX)
- grep文件:(选项-oG)
- -oA可将扫描结果以标准格式、XML、Grep格式一次性全部保存