Nmap基础入门
免责声明:本文单纯分享技术,请大家使用过程中遵守法律法规~
介绍及安装
nmap是网络扫描和主机检测的工具。作为一个渗透测试人员,必不可少的就是获取信息。那么nmap就是我们从互联网上获取信息的途径,我们可以扫描互联网上哪个IP暴露了哪些端口。
nmap主要功能:
- 主机发现:发现网络上活跃的主机
- 端口扫描:发现目标主机开放了哪些端口
- 服务识别:识别目标主机具体运行的服务和应用程序的版本号
- 操作系统检测:检测目标主机操作系统类型及版本,用于判断漏洞(特定版本的操作系统存在特定漏洞,可以利用)。
- 执行脚本扫描:支持执行用户自定义脚本进行扫描
- 输出格式:nmap扫描结果支持通过文本、XML、JSON等存储
nmap是一款非常灵活、强大的工具,它在安全团队、渗透测试人员和网络管理员之间广泛使用。我们在使用时,需要遵循相关法律法规和道德准则。
- 官网:https://nmap.org/
- 下载:https://nmap.org/download.html。nmap是跨平台的,不论是在mac、linux、windows都可以使用。如果我们有kali,可以直接使用(kali自带nmap工具)。
基础知识点
端口状态(6种:open、closed、filtered、unfiltered、open|filtered、closed|filtered)
- open 开放的:该端口上的应用程序成功接收TCP、UDP报文并响应
- TCP:nmap 发起两个 SYN 的请求,服务器上监听在此端口的进程会进行应答,会返回 SYN/ACK, nmap 收到服务端返还回来的应答后会发送两个 RST ,并不会和服务端建立通信连接,完成端口的探测。
- UDP:nmap 向目标端口发起两个 UDP 报文,服务端对报文进行应答,nmap 收到应答,将该端口标记为 open。
- closed 关闭的:
- TCP:nmap 发起两个 SYN 的请求,服务器上由于没有进程监听该端口,内核会返回 RST, nmap 收到服务端返还回来的 RST 报文,将探测结果定义为 closed 。
- UDP:nmap 会发送两个一模一样的 UDP 请求,服务端收到请求后会给 nmap 返回一个 type=3 code=3 的 ICMP 报文,意思是访问的端口不可达, nmap 标记此端口是关闭状态。
- filtered 被过滤的:
- TCP:这种情况是服务端将收到的 nmap SYN 报文直接丢弃,不进行应答, 由于 nmap 直接发送了两个 SYN 报文,都没有收到应答,所以认定服务端开启了防火墙,将 SYN 报文丢弃。
- UDP:这个一般指 TCP 端口扫描,参见上面的描述。
- unfiltered 未被过滤的:
- nmap 默认进行的是 SYN 扫描,当用 -sA 选项( TCP ACK 扫描),连续发送两个同样的 ACK 报文,由于 snmp 确认收到了一个服务端根本没有发送的报文,所以服务端会发送一个 RST 报文, snmp 收到服务端发送来的 RST 报文后,确认服务端没有对报文进行丢弃处理,注意本探测不能发现端口是开放还是关闭状态,只能确认探测的报文服务端已收到,并回复给了 snmp RST报文。
- UDP:这个一般指 TCP 端口扫描,参见上面的描述。
- open|filtered 开放或者被过滤的:
- TCP:这种状态主要是 nmap 无法区别端口处于 open 状态还是 filtered 状态。这种状态长出现于 UDP 端口,参考后续 UDP 中的解释。
- UDP:这种状态主要是 nmap 无法区别端口处于 open 状态还是 filtered 状态。这种状态是服务端对 nmap 的请求不做任何回应,导致 nmap 无法确认端口是那种状态。
- closed|filtered 关闭或者被过滤的:
TCP连接扫描和端口状态
# 扫描该目标下1000个常用TCP端口
nmap -sT 127.16.176.130
tcp建立连接通常需要三次握手四次挥手,且四次挥手最后需要发送FIN标志,nmap -sT不论目标主机发送什么,最后都会返回RST。没有实现优雅的告别。
缺点:
- 耗时长:建立连接需要三次握手四次挥手
- 留痕:通信会被目标主机记录,主机通常会对完成握手的会话进行日志的记录,会留下扫描的痕迹
优势:
- 只要目标主机发送了SYN 、ACK包,nmap就会标记这个端口是开放状态;
- 如果目标主机返回的是RST包,nmap则会标识该端口为closed状态
- 如果目标主机没有返回任何包,此时返回的包可能被防火墙阻挡了,nmap会标记端口为filtered(被过滤)状态
SYN扫描:-sS(半链接、半开扫描)
为了解决留痕的问题,可以使用-sS参数进行扫描
- 当收到目标主机发送的 SYN ACK时,nmap不会返回FIN,不会走完所有流程,而是直接返回RST。相当于你给别人打电话,问别人是不是叫xxx,别人回复确认,此时你给别人回复我打错了,虽然你后续没有别人继续通信,但此时你已经确认了对方的身份。
- 有人可能会疑惑,这里能否不返回RST包给目标主机?
- 答:不行,因为如果不返回RST包,目标主机会认为我们上一轮没有收到SYN ACK包而不断重传
nmap -sS ip:没有完成整个握手过程,因此被称为半连接扫描、半开扫描。
优势:
- 效率高:中途就直接返回RST,不会走完握手整个流程
- 不易留痕:不走完握手流程,目标服务器保留日志概率低
注意:执行该命令需要添加sudo或拥有root权限。
TCP扫描:nmap 目标主机IP
SYN扫描:sudo nmap 目标主机IP
UDP扫描
udp没有ack这样的确认机制,只能依靠目标主机的回复做出判断
对于大部分端口,nmap发送的数据包都没有负载,对方相当于收到一个空红包🧧,这样的数据包一般不会收到目标主机的回复,并且如果防火墙丢了我们的包,一般也不会做出回复(但如果UDP端口关闭了,一般会返回类型为3的ICMP包,表示目标主机不可达)。因此我们在使用udp扫描时,会经常看到open|filtered一起显示,此时端口可能开放了,也可能被防火墙阻挡了。
- 如何判断udp端口是开放还是关闭?
小技巧:nmap -sUV (V参数会进行版本扫描,nmap会在open|filtered端口中做探测,确认运行的软件版本,从而明确端口的开放状态)
缺点:
- 慢:大部分场景目标主机都不会回复数据包或因为防火墙等诸多因素,导致同一端口nmap一般会出现多次请求的情况。
建议:
- 配合其他参数使用:nmap -sUV --top-ports 100 扫描常用的100个UDP端口
ICMP和Ping扫描
# 扫描范围(ping扫描)
nmap -sn 192.168.0.1-100# 通过CIDR方式指定范围
nmap -sn 192.168.0.0/24
不论是本地还是远程的网络,我们都可以使用-sn来扫描:
- 本地:扫描本地网络使用了ARP协议进行请求
- 远程:扫描远程网络使用了ICMP协议,还会利用TCP SYN和TCP ACK进行主机发现
但对于windows server来说(如:2016、2019、2022版本),防火墙默认会关闭所有ICMP包,此时如果继续使用nmap -sn就走不通了,进入了死胡同。
- nmap -Pn 目标:表明不使用ping进行探测扫描,以此来绕过防火墙的阻挡,但该命令会很消耗时间,因为nmap默认会认为该主机在运行状态,如果目标主机没有运行,会导致nmap进行重复探测。
使用
主机扫描: nmap ip (TCP/UDP端口)
注意:
- 这种方式只会扫描1000个常用的tcp端口
- 扫描目标所有端口:nmap
-p-
127.16.176.130- 这种方式只会扫描tcp端口
- nmap -sT 127.16.176.130:扫描TCP端口
- nmap -sU 127.16.176.130:扫描UDP端口
# 扫描特定主机(默认只会扫描1k个常用的端口)
nmap 127.16.176.130# 扫描特定主机所有端口(仅扫描TCP端口)
nmap -p- 127.16.176.130# 扫描UDP端口,需使用-s参数
nmap -sU 127.16.176.130# 扫描ip范围内主机
nmap 127.16.176-180# 组合扫描,组合项之后用空格分隔
nmap 127.16.176.130 127.16.176-180# 扫描网段
nmap 127.16.176.1/24# 过滤IP扫描
nmap 127.16.176.1/24 -exclude 127.16.176.130# SYN扫描(半连接扫描),避免留痕,执行命令需要sudo(root权限)
sudo nmap -sS ip# TCP扫描:nmap 目标主机IP:走完全过程,但耗时长,且会留下痕迹
# SYN扫描:sudo nmap 目标主机IP:不走完全过程,效率高,不易在目标机器上留痕
端口扫描:nmap ip -p 端口号
# 扫描特定主机的特定端口
nmap 127.16.176.130 -p 3389# 扫描范围端口
nmap 127.16.176.130 -p 1-100
识别服务版本:nmap ip -p 端口号 -sV
# 想要识别服务版本,我们可以使用-sV参数(serviceVersion)
nmap 39.156.66.x -p 443 -sV
识别操作系统版本:nmap ip -O
-O (OS operating system 操作系统)
# 识别操作系统可以通过-O参数(os),需要root权限
nmap 39.156.66.x -O
常用命令汇总
获取远程主机系统类型及开放端口:nmap -sS -P0 -A -v < target >
nmap -sS -Pn -sV -O 192.168.1.1
nmap -sS -Pn -A -v 192.168.1.1-sS:执行TCP SYN扫描(半连接扫描),它不会建立完整的TCP连接,更隐蔽,效率高
-Pn:表示跳过主机发现阶段,即假设所有主机都是开启的。
-sV:尝试检测服务版本。
-O:启用操作系统检测。
-A:启用操作系统检测、版本检测、脚本扫描和 traceroute。
-v:增加详细程度,提供更详细的输出。
列出开放了指定端口的主机列表:nmap -sT -p 80 -oG - 10.0.1.0/24 | grep open
nmap -sT -p 80 -oG - 10.0.1.0/24 | grep open-sT:进行TCP connect()扫描,这会完成整个TCP三次握手过程。
-p 80:指定要扫描的端口号。
-oG -:以grepable格式输出结果到标准输出。
| grep open:通过管道符过滤出包含“open”的行。
注意:CIDR表示法,10.0.1.0/24来表示子网。
在网络寻找所有在线主机:nmap -sn 10.0.1.0/24
nmap -sn 10.0.1.0/24-sn:(旧版为-sP)只进行ping扫描,不进行端口扫描。
在局域网上扫找 Conficker 蠕虫病毒:nmap -PN -T4 -p139,445 -n -v --script=smb-check-vulns --script-args safe=1 10.0.1.1-254
nmap -PN -T4 -p139,445 -n -v --script=smb-check-vulns --script-args safe=1 10.0.1.1-254-PN:等同于-Pn,忽略ping的结果。
-T4:设置速度模板为激进模式(级别有:0-5,越高扫描速度越快,但准确度)。
-p139,445:指定扫描的端口。
-n:禁用DNS解析。
--script=smb-check-vulns:使用Nmap脚本引擎(NSE)中的脚本来检查SMB漏洞。
--script-args safe=1:传递给脚本的参数,这里是指安全模式
使用诱饵扫描方法来扫描主机端口:sudo nmap -sS 10.0.1.10 -D 10.0.1.11
sudo nmap -sS 10.0.1.10 -D 10.0.1.11,10.0.1.12-D:定义诱饵IP地址,可以用来混淆目标机器的日志记录,可以添加多个诱饵IP,用逗号分隔
常用参数
# -iL 从文件中读取目标主机或网络列表
nmap -iL targets.txt# -sS SYN扫描,又称半开放扫描(TCP SYN 扫描,又称半开放,或隐身扫描。不容易被注意,不留日志。建立一个不完全的TCP,发送一个SYN报文。)
nmap -sS 192.168.1.1# 允许你关闭 ICMP pings
nmap -Pn 192.168.1.1# -sV 打开服务版本检测
nmap -sV 192.168.1.1# -O 尝试识别远程操作系统
nmap -O 192.168.1.1# -A 全⾯系统检测、启⽤脚本检测、扫描、traceroute等
nmap -A 192.168.1.1# -v 增加详细程度,提供更详细的输出。可以多次使用以增加详细程度(如-vv)
nmap -v 192.168.1.1# -p 指定端口。可以是一个端口号、范围或多个端口(用逗号分隔)
nmap -p 80,443 192.168.1.1
nmap -p 1-1024 192.168.1.1# -sn 只进行ping扫描,不进行端口扫描。用于查找在线主机
nmap -sn 192.168.1.0/24 # -sT TCP扫描,当SYN扫描不能用时,默认是TCP扫描。(会留下错误信息和记录,而-sS是最好选择。)
nmap -sT 192.168.1.1# -sU UDP扫描,UDP扫描是不可靠的,速度也慢,但有时是必要的
nmap -sU 192.168.1.1# -sA 用于发现防火墙,不能确定端口是否开放,只能确定是否有状态,是否被过滤。
nmap -sA 192.168.1.1# -Pn 扫描之前不使用ping命令,跳过主机发现阶段,即假设所有主机都是开启的。在有防火墙时比较有用
nmap -Pn 192.168.1.1# --script 使用Nmap脚本引擎(NSE)中的脚本进行扩展扫描,下面是用于检查目标主机是否有常见漏洞
nmap --script=vuln 192.168.1.1
## 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# -T 设置扫描速度模板,范围从0(最慢)到5(最快),数字越大越快,也越容易被发现
## T0(paranoid)极其缓慢,每次探测之间的延迟为5分钟。适用于需要最小化网络流量或避免检测的情况
## T1(sneaky) 非常缓慢,每次探测之间的延迟为15秒。适用于低带宽或隐蔽扫描
## T2(polite)较慢,每次探测之间的延迟为400毫秒。默认情况下使用此模板,以减少对目标网络的影响。
## T3(normal)默认模板,无额外延迟。适合大多数常规扫描。
## T4(aggressive)快速,减少超时时间并增加并发度。适用于快速完成扫描,但可能会更引人注意。
## T5(insane)极快,将最大并发任务数提高到1024,并将超时时间缩短到100毫秒。仅适用于高带宽、低延迟网络。
nmap -T4 192.168.1.1# -D 定义诱饵IP地址,可以用来混淆目标机器的日志记录
nmap -D 192.168.1.10,192.168.1.11 192.168.1.1# --min-rtt-timeout, --max-rtt-timeout, --initial-rtt-timeout:设置RTT(往返时间)超时值
nmap --min-rtt-timeout 100ms --max-rtt-timeout 2000ms --initial-rtt-timeout 300ms 192.168.1.0/24# --host-timeout 设置单个主机的超时时间
nmap --host-timeout 20m 192.168.1.0/24# -max-retries 设置重试次数
nmap --max-retries 3 192.168.1.0/24# --max-scan-delay 设置最大扫描延迟
nmap --max-scan-delay 1000ms 192.168.1.0/24
参考文章:
https://blog.csdn.net/zyqash/article/details/122986256
https://nmap.org/book/performance-timing-templates.html