Nmap基础
Nmap介绍
Nmap,也就是Network Mapper,中文为“网络映射器”。Nmap是一款开源的网络探测和安全审核的工具,它的设计目标是快速地扫描大型网络。它是网络管理员必用的软件之一,以及用以评估网络系统保安。
Nmap基本功能
- 探测一组主机是否在线
- 扫描主机端口,嗅探所提供的网络服务
- 推断主机所用的操作系统
Nmap工作原理
Nmap对目标主机进行一系列的测试,利用测试结果建立相应目标主机的Nmap指纹,然后Nmap会对指纹进行匹配,最终输出相应的结果。
Nmap TCP/IP 协议栈指纹
测试 | 描述 |
---|---|
T1 | 发送TCP数据包(Flag=SYN)到开放TCP端口 |
T2 | 发送一个空的TCP数据包到开放的TCP端口 |
T3 | 发送TCP数据包(Flag=SYN,URG,PSH,FIN)到开放的TCP端口 |
T4 | 发送TCP数据包(Flag=ACK)到开放的TCP端口 |
T5 | 发送TCP数据包(Flag=SYN)到关闭的TCP端口 |
T6 | 发送TCP数据包(Flag=ACK)到关闭的TCP端口 |
T7 | 发送TCP数据包(Flag=URG,PSH,FIN)到关闭的TCP端口 |
Nmap语法
Nmap的固定语法格式如下:
Nmap【空格】【选项|多选项|协议】【空格】【目标】
Nmap基本用法
全面扫描
全面扫描指定IP或域名的所有端口及其目标系统信息等。所需时间较长
-A 全面扫描/综合扫描
nmap -A 192.168.1.9
扫描指定网段
指定扫描一个网段。
nmap 192.168.1.0/24 或者 nmap 192.168.1.1-200(扫描1-200的主机)
简单扫描
该扫描方式可以针对IP或者域名进行扫描,扫描方式迅速,可以很方便地发现目 标端口的开放情况及主机在线情况。
nmap 192.168.1.9
简单扫描结果:
查看版本号
nmap -V
主机发现
选项 | 解释 |
---|---|
-sP | Ping扫描 |
-P0 | 无Ping扫描 |
-PS | TCP SYN Ping扫描 |
-PA | TCP ACK Ping 扫描 |
-PU | UDP Ping扫描 |
-PE;-PP;-PM | ICMP Ping Types扫描 |
-PR | ARP Ping扫描 |
-n | 禁止DNS反向解析 |
-R | 反向域名解析 |
–system-dns | 使用系统域名解析器 |
-sL | 列表扫描 |
-6 | 扫描TPv6地址 |
–traceroute | 路由跟踪 |
-PY | SCTP INIT Ping扫描 |
Ping扫描
Ping扫描只进行ping,然后显示出在线的主机。使用该选项扫描可以轻易获取目标信息而不会被轻易发现。在默认情况下,Nmap会发送一个ICMP回声请求和一个TCP报文到目标端口。Ping扫描的优点是不会返回太多的信息影响对结果的分析,并且扫描方式高效。
nmap -sP 192.168.1.0/24
nmap -sP 192.168.1.9
无Ping扫描
无ping扫描通常用于防火墙禁止ping的情况下,它能确定正在运行的机器。默认情况下,nmap只对正在运行的主机进行高强度的探测,如端口扫描,版本探测或者操作系统探测。用-P0禁止主机发现会使nmap对每一个特定的目标IP地址进行所要求的扫描,这可以穿透防火墙,也可以避免被防火墙发现。
nmap -P0 192.168.1.9
如果没有指定任何协议,nmap会使用协议1、协议2、协议4,使用–packet-trace选项查看这些协议是如何判断目标主机是否存活。
nmap -p0 --packet-trace scanme.nmap.org
以上返回的信息可看到,有4行信息被标记为SENT,并显示为ICMP和IP包。
如此可以判断主机是存活状态。Nmap支持的协议和编号如下:
- TCP:对应协议编号为6。
- ICMP:对应协议编号为1。
- IGMP:对应协议编号为2。
- UDP:对应协议编号为17。
可使用指定的TCP,UDP,IGMP协议向目标主机发送包并判断目标主机是否在线。
nmap -p0 6,17,2 --packet-trace scanme.nmap.org
TCP SYN Ping 扫描
通常情况下,nmap默认是使用TCP ACK 和 ICMP Echo 请求对目标进行是否存活的响应,当目标主机的防火墙阻止这些请求时,可以使用TCP SYN Ping扫描来判断主机是否存活。-PS 选项发送一个设置了SYN标志位的空TCP报文。默认端口为80(可以通过改变nmap.h)文件中的DEFAULT-TCP-PROBR-PORT值进行配置,但不同的端口也可以作为选项指定,甚至可以指定一个以逗号分隔的端口列表(如-PS22,23,25,80,115,3306,3389),在这种情况下,每个端口会被并发地扫描。
nmap -PS -v 192.168.1.9
上面结果可得知Nmap是通过SYN/ACK和RST响应来对目标主机是否存活进行判断,但在特定情况下防火墙会丢弃RST包,这时结果会不准确,我们需要指定一个端口或端口范围来避免这种情况。
nmap -PS80,100-200 -v 192.168.1.9
TCP ACK Ping 扫描
使用-PA选项可以进行TCP ACK Ping扫描,它与TCP SYN Ping扫描非常类似,区别在于设置的TCP标志位是ACK而不是SYN,使用这种方式扫描可以探测阻止SYN包或ICMP Echo请求的主机。
nmap -PA -v 192.168.1.9
同时使用-PS与-PA选项命令如下:
nmap -PA -PS 192.168.1.9
UDP Ping扫描
使用UDP Ping扫描时Nmap会发送一个空UDP包到目标之间,如果目标主机相应则返回一个ICMP端口不可达错误,如果目标主机不是存活状态则会返回各自ICMP错误信息。
nmap -PU -v 192.168.1.9
ICMP Ping Types 扫描
ICMP是控制报文协议。nmap发送一个ICMP type8(回声请求)报文到目标ip地址,从运行的主机得到一个type0(回声相应)报文。-PE选项简单的来说是通过向目标发送ICMP Echo数据包来探测目标主机是否在线,使用-PE选项打开该回声请求功能。-PP选项是ICMP时间戳ping扫描,-PM选项可以进行icmp地址掩码ping扫描
nmap -PE -v 192.168.1.9
nmap -PP -v 192.168.1.9
nmap -PM -v 192.168.1.9
ARP Ping扫描
-PR 通常在扫描局域网时使用,在内网的情况下,使用ARP ping扫描方式是最有效的,在本地局域网中防火墙不会禁止ARP请求,这就使得它比其他ping扫描都更加高效。
nmap -PR 192.168.1.9
扫描列表
列表扫描时主机发现的退化形式,它仅仅列出指定网络上的每台主机,不发送任何报文到目标主机。默认情况下,Nmap仍然对主机进行反向域名解析以获取它们的名字。
nmap -sL 192.168.1.0/24
禁止反向域名解析
如果单纯扫描一段IP,使用该选项可以大幅度减少目标主机的相应时间,从而更快的得到结果。
namp -n -sL 192.168.1.0/24
反向域名解析
nmap -R -sL *. 192.168.1.0/24
扫描TPv6地址
nmap -6 fe80::20c:29ff:fee0:2e76
路由跟踪
通过此选项可以轻松地查找出本地计算机到目标之间所经过的网络节点,并可以看到通过各个节点的时间。
nmap --traceroute -v www.baidu.com
SCTP INIT Ping扫描
SCTP(流控制传输协议)是IETF在2000年定义的一个传输层协议。SCTP可以看作是TCP协议的改进,它改进了TCP的一些不足,SCTP INIT Ping扫描通过向目标发送INIT包,根据目标主机的相应判断目标主机是否存活。
nmap -PY -v 192.168.0.12
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vMKDUbdY-1604474465116)(https://cdn.jsdelivr.net/gh/hirak0/hirak0-images/blog/xinan/20200731173816.png)]
端口扫描
选项 | 解释 |
---|---|
-T | 时序选项 |
-p | 端口扫描顺序 |
-sS | TCP SYN 扫描 |
-sT | TCP 连接扫描 |
-sU | UDP扫描 |
-sN;-sF;-sX | 隐蔽扫描 |
-sA | TCP ACK扫描 |
-sW | TCP 窗口扫描 |
-sM | TCP Maimon扫描 |
–scanflags | 自定义TCP扫描 |
-sI | 空闲扫描 |
-sO | IP协议扫描 |
-b | FTP Bounce扫描 |
从nmap识别端口状态
- Open:对外开放
- Closed:端口关闭状态
- Filtered:防火墙过滤或者网络堵塞
- Unfiltered:未被过滤,端口可访问,但是无法判断是开放还是关闭状态
- Open|Filtered:开放还是被过滤
- Closed|Filtered:不能确定是关闭还是被过滤,只可能出现在IPID Idle扫描中。
时序选项
在nmap中使用-T(0-5)可以启用时序选项,对于时序选项这里有0~5不同选项。
- -T0(偏执的):非常慢的扫描,用于IDS逃避。
- -T1(鬼祟的):缓慢的扫描,用于IDS逃避。
- -T2(文雅的):降低速度以降低对带宽的消耗,此选项不常用。
- -T3(普通的):默认,根据目标的反应自动调整时间。
- -T4(野蛮的):快速扫描,常用扫描方式,需要在很好的网络环境下进行扫描, 请求可能会淹没目标。
- -T5(疯狂的):极速扫描,这种扫描方式以牺牲准确度来提示扫描速度。
nmap -T4 192.168.1.9
常用扫描方式
① -p :指定扫描端口号,可以指定唯一的值也可以指定一个范围。
nmap -p 80 192.168.1.9
如果既想扫描TCP端口又想扫描UDP端口,可以在端口号前加上“T:”或“U:”,分别代表TCP协议与UDP协议。(要既扫描UDP又扫描TCP,必须指定-sU以及至少一个TCP扫描类型如:-sS,-sF,-sT)如果没有给定协议限定符,端口号会被加到所有协议列表。)
nmap -sS -p T:111, U:445 192.168.1.9
② -F : 使用该选项可以快速地扫描端口,但并不是所有的端口都会扫描,只会扫描有限的端口。
nmap -F 192.168.1.9
③ -r :使用该选项不会对端口进行随机顺序扫描,默认情况下,Nmap是随机顺序端口的,一般我们也会选择nmap进行随机扫描,但也可以以使用这个选项进行排序。
④ --top-ports:发现具体而又有用的端口。
nmap --top-ports 100 192.168.1.9
TCP SYN 扫描
半开放扫描,扫描速度快,扫描方式隐蔽。(在SYN扫描不能用时,TCP连接扫描会使用默认的TCP扫描)
nmap -sS 192.168.1.9
TCP 连接扫描
端口扫描中最基础,最稳定的扫描方式
nmap -sT 192.168.1.9
UDP扫描
UDP扫描非常缓慢,UDP端口扫描通过发送UDP数据包到目标主机并等待响应,它将判断目标端口是否开放状态,如果目标返回ICMP不可达的错误,说明端口是关闭的,如果得到正确的适当的响应,这说明端口是开放的。
nmap -sU -p 80-500 192.168.1.9
隐蔽扫描
-sN是Null扫描,是通过发送非常规的TCP通信数据包对计算机进行探测,很多情况下Null扫描与Xmas扫描恰好相反,因为Null扫描不会标记任何数据包,若目标主机的相应端口是关闭的,会响应一个RST数据包,若目标端口是开放的则不会响应任何信息。
nmap -sN 192.168.1.9
-sF是FIN扫描,当我们使用TCP SYN扫描时可能会被目标主机的防火墙发现,会阻止SYN数据包,这时我们使用TCP FIN扫描方式会有很好的穿透效果,因为TCP FIN扫描并不需要完成TCP握手。TCP FIN扫描就是向目标端口发送一个FIN包,如果收到目标响应的RST包,则说明目标端口是开放的,如果没有收到RST包则说明目标端口是关闭的。
nmap -sF 192.168.1.9
-sX是Xmas扫描,数据包的FIN、PSH和URG标记位置打开,既标志位1,根据RFC 793规定如果目标主机端口是开放的则会响应一个RST标志包。
nmap -sX 192.168.1.9
TCP ACK 扫描
使用该扫描不能确定端口是否是开放还是被过滤的。
nmap -sA -v 192.168.1.9
TCP 窗口扫描
当收到RST包时,根据TCP窗口的值是正数还是0来判断目标端口是开放还是关闭的。
从输出结果来看是不准确的,如果扫描的端口都是开放状态或者只有少数几个是关闭状态就很不准确。
nmap -sW -v -F 192.168.1.9
TCP Maimon扫描
探测报文是FIN/ACK 根据 RFC 793(TCP),无论端口开放或者关闭,都应该对这样的探测响应RST报文,如果端口开放,许多基于BSD的系统只是丢弃该探测报文。
nmap -sM -T4 192.168.1.9
自定义TCP扫描
可以通过指定任意的TCP标志位来进行扫描。
nmap -sT --scanflags SYNURG 192.168.1.9
空闲扫描
空闲扫描允许端口完全欺骗扫描。可以使攻击者能够不使用自己的IP向目标主机发送数据包,它可以利用不活跃的僵尸主机反弹给攻击者一个旁通信道,从而进行端口扫描。IDS会把不活跃的僵尸主机当做攻击者,这是一种非常隐蔽的扫描方法。
nmap -sI www.0day.co:80 192.168.0.12
这是利用僵尸主机为www.0day.co的主机对192.168.0.12进行空闲扫描,如果有IDS,IDS则会把www.0day.co当做扫描者。选择的端口必须不能被自己的nmap主机或目标主机过滤掉并且必须为开放的。
IP协议扫描
扫描IP协议号。IP协议扫描可以帮助用户确定目标主机哪些是支持IP协议的,例如TCP,ICMP.IGMP。虽然它遍历的是IP协议号并不是TCP或UDP端口,但仍可以使用-p选项选择需要扫描的协议号。它不是在UDP报文的端口域上循环,而时在IP协议域的2位上循环,发送空的IP报文头。
nmap -sO -T4 192.168.1.9
FTP Bounce扫描
使用-b选项就可以进行FTP Bounce Scan扫描。它允许用户连接到一台FTP服务器,然后要求文件送到一台第三方服务器,这种扫描方式被支持较少,但可绕过防火墙。
nmap -b 192.168.1.9
指纹识别与探测
选项 | 解释 |
---|---|
-sV | 版本探测 |
–allports | 全端口版本探测 |
–version-intensity | 设置扫描强度 |
–version-light | 轻量级扫描 |
–version-all | 重量级扫描 |
–version-trace | 获取详细版本信息 |
-sR | RPC扫描 |
-O | 启用操作系统探测 |
–osscan-limit | 对指定的目标进行操作系统检测 |
–osscan-guess;–fuzzy | 推测系统识别 |
版本探测
使用-sV选项即可启用版本探测。通过相应的端口对应相应的服务,根据服务指纹识别出相应的版本。
nmap -sV 192.168.1.9
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PCFOCHeD-1604474465138)(https://cdn.jsdelivr.net/gh/hirak0/hirak0-images/blog/xinan/20200731181436.png)]
nmap -sV -A 192.168.1.9 (借助-A 进行操作系统探测和版本探测)
全端口版本探测
nmap会跳过9100 TCP端口,只有使用–allports才可以扫描所有端口
nmap -sV --allports 192.168.1.9
设置扫描强度
使用Nmap进行扫描的时候,Nmap发送一系列探测报文,–version-intensity选项可以为每个报文赋予1~9
之间的值。被赋予较低值的探测报文对大范围的常见服务有效,而被赋予较高值的报文一般没有实际作用,强度水平说明了应该使用哪些探测报文。当我们赋予的值越高,服务越有可能被正确识别,但是这也会牺牲相当长的一段实际,强度必须在0~9
,默认的强度是7。
nmap -sV --version-intensity 1 192.168.1.9
轻量级扫描
使用 --version-light 进行轻量级扫描。可以大幅度的节省时间,但会牺牲准确性。与–version-intensity 2 等价
nmap -sV --version-light 192.168.1.9
重量级扫描
使用 --version-all选项可以进行重量级扫描对应–version-intensity 9的快捷方式。时间长,准确性高。
nmap -sV --version-all 192.168.1.9
获取详细版本信息
nmap -sV --version-trace 192.168.1.9
RPC扫描
该选项对用于与其他端口扫描选项相结合使用,它对所有被发现开放的TCP/UDP端口执行SunRPC程序NULL命令,来试图确定它们是否为RPC端口,如果是RPC端口,则返回程序和版本号。
nmap -sS -sR 192.168.1.9
启用操作系统探测
nmap -O 192.168.1.9
对指定的目标进行操作系统检测
使用–osscan-limit选项可以对指定的目标进行操作系统检测。Nmap只对满足“具有打开和关闭的端口”条件的主机进行操作系统检测,这样可以节约时间,特别是在使用-P0扫描多个主机时。这个选项仅在使用-O或-A进行操作系统检测时起作用。
nmap -O --osscan-limit 192.168.1.0/24
推测系统并识别
使用–osscan-guess;–fuzzy选项可以推测系统并识别。Nmap对系统进行识别时并不一定都能准确识别,当无法准确识别的时候,Nmap会从最近的数据中取值,猜测系统。
nmap -O --osscan-guess 192.168.1.9
nmap保存和输出
标准保存
nmap -F -oN test1.txt 192.168.1.9
XML保存
nmap -F -oX test1.xml 192.168.1.9
133t保存
namp -F -oS test2.txt 192.168.1.9
Grep保存
nmap -F -oG test3.txt 192.168.1.9
保存到所有格式
nmap -F -oA testA 192.168.1.9
补充保存文件
nmap -F --append-output -oN test1.txt 192.168.1.9