一、Nmap
免责声明 本文仅是个人对该工具的学习测试过程记录,不具有恶意引导意向。 本文工具仅面向合法授权的企业安全建设行为,如您需要测试本工具的可用性,请自行搭建靶机环境。 在使用本工具进行检测时,您应确保该行为符合当地的法律法规,并且已经取得了足够的授权。请勿对非授权目标进行扫描,以避免侵犯对方的隐私或违反相关法律法规。 |
1.1 概述
下载地址:https://nmap.org/download.html
官方文档说明:https://nmap.org/man/zh/index.html
端口+IP+指纹
虽然Nmap这些年来功能越来越多,但它最初也是从一个端口扫描器开始的,并且这仍然是它的核心功能。
nmap 是一个网络扫描和安全审计工具,它被广泛用于网络发现和安全审核。
Nmap(“Network Mapper<网络映射器>”)是一款开放源代码的网络探测和安全审核的工具。它的设计目标是快速扫描大型网络,当然用它扫描单个主机也没有问题。Nmap以新颖的方式使用原始IP报文来发现网络上有哪些主机,这些主机提供什么服务(应用程序名和版本),这些服务运行在什么操作系统中, 它们使用什么类型的报文过滤器/防火墙,以及一堆其它功能。(端口和指纹信息)
虽然Nmap通常用于安全审核,许多系统管理员和网络管理员也用它来做一些日常的工作,比如查看整个网络的信息, 管理服务升级计划,以及监视主机和服务的运行。
Nmap输出的是扫描目标的列表,以及每个目标的补充信息,至于是哪些补充信息则依赖于所使用的选项。通常会列出端口号,协议,服务名称和状态。
nmap **这个简单的命令会扫描主机上的超过1660个TCP端口。许多传统的端口扫描器只列出所有端口是开放还是关闭的,Nmap的信息粒度比它们要细得多:
端口状态: ①open(开放的):意味着目标机器上的应用程序正在该端口监听连接/报文。 ②filtered(被过滤的):意味着防火墙、过滤器或者其它网络障碍阻止了该端口被访问,Nmap无法得知它是open还是closed。 ③closed(关闭的):端口没有应用程序在它上面监听,但是它们随时可能开放。 ④unfiltered(未被过滤的):当端口对Nmap的探测做出响应,但是Nmap无法确定它们是关闭还是开放时,这些端口就被认为是unfiltered。 ⑤open|filtered 和 closed|filtered :状态组合,即Nmap无法确定该端口处于两个状态中的哪一个状态。 |
1.2 nmap目标指定规范
Nmap指定扫描目标支持IPv4的CIDR风格的地址:
192.168.10.0/24
Nmap通过八位字节地址范围支持IPv4这样的扫描:
192.168.0-255.1-254
0-255.0-255.13.37
Nmap扫描目标也可以是域名
1.3 选项及示例
nmap -A -T4 scanme.nmap.org |
说明: -A: Enable OS detection, version detection, script scanning, and traceroute 用来进行操作系统及其版本的探测,及路由跟踪。 |
-T4:时间模板;设置扫描速度。可以设置不同的速度等级,以适应不同的扫描环境。速度级别从0到5,级别越高,扫描速度越快,但也越容易被防火墙拦截。
paranoid (0)、sneaky (1)、polite (2)、normal(3)、aggressive(4)、insane(5) (T0)适合需要极小网络影响的扫描,几乎不会被IDS/IPS检测到。这是串行扫描,速度极慢(至少间隔5m) (T1)扫描速度很慢,可用于IDS躲避;仍然是串行扫描(15s) (T2)降低了扫描速度以使用更少的带宽和目标主机资源(400ms,但会动态地调整间隔,最大为1s) (T3)默认模式为Normal,因此 -T3实际上是未做任何优化;(不使用固定的扫描间隔,而是采用并行扫描技术,同时发送多个探测;单次扫描延时1s,一秒后当前端口被放弃并进行下一个端口扫描) (T4)假设用户具有合适及可靠的网络从而加速扫描;(行扫描来增加速度,但可能会增加被检测到的风险;单次扫描延时10ms) (T5)假设用户具有特别快的网络或者愿意为获得速度而牺牲准确性最快,但可能会产生大量的网络流量,极有可能被IDS/IPS检测到;(单次扫描延时5ms) 从Nmap的某个版本开始(可能是Nmap 7.00或更高版本),-T 参数的行为有所变化,并且可能已经被新的参数(如--min-rate, --max-rate, --min-hostgroup, --max-hostgroup, --min-parallelism, --max-parallelism, --min-rtt-timeout, --max-rtt-timeout, --initial-rtt-timeout, --max-retries, --host-timeout, --scan-delay 等)所取代,这些参数提供了更细粒度的控制来优化扫描速度和避免被检测。 |
1.3.1 nmap指定主机的其他方式
除了直接自定域名或IP为扫描目标,也可以通过选项指定
加黑字体的选项是网络安全人员常用选项
-iL (IP地址列表文件) 列表中的项可以是Nmap在命令行上接受的任何格式(IP地址,主机名,CIDR,IPv6,或者八位字节范围)。 每一项必须以一个或多个空格,制表符或换行符分开 |
-iR (主机数量) (随机选择目标)可以用来选择随机的互联网主机来扫描;不合需要的IP如特定的私有,组播或者未分配的地址自动略过。选项0意味着永无休止的扫描;些网管对于未授权的扫描可能会很感冒并加以抱怨,使用该选项的后果自负! |
--exclude <host1,host2,host3,...> (排除主机/网络) |
--excludefile (排除文件中的列表)以换行符,空格,或者制表符分隔 |
1.3.2 主机发现常用参数(主机发现)
加黑字体的选项是网络安全人员常用选项
-sL (列表扫描) 它仅仅列出指定网络上的每台主机,不发送任何报文到目标主 机,也并不能确定主机是否存活,所以扫描速度是很快的。默认情况下,Nmap会对主机进行反向域名解析以获取它们的名字(是主机发现的退化形式);如果主机的域 名出乎您的意料,那么就值得进一步检查以防错误地扫描其它组织的网络。既然只是打印目标主机的列表,像其它一些高级功能如端口扫描,操作系统探测或者Ping扫描的选项就没有了。(从描述看,感觉该选项更多关注反向域名解析结果) |
-sP (Ping扫描) 只进行ping扫描(主机发现),然后输出对扫描做出响应的那些主机,没有进一步的测试 (如端口扫描或者操作系统探测)当防守严密的防火墙位于运行Nmap的源主机和目标网络之间时, 推荐使用那些高级选项。否则,当防火墙捕获并丢弃探测包或者响应包时,一些主机就不能被探测到。 |
-P0 (无ping) 默认情况下,Nmap只对正在运行的主机进行高强度的探测如端口扫描,版本探测,或者操作系统探测。用-P0禁止主机发现会使Nmap对每一个指定的目标IP地址进行所要求的扫描(也就是说默认情况nmap现对目标探活,再对活动的目标执行其他探测) |
Namp -P0 10.0.0.0/24 (不预先探活,直接全部扫描,省时) Nmap 10.0.0.0/24 (现探活,再对活目标扫描,耗时) |
-PS [portlist] (TCP SYN Ping) SYN标志位告诉对方正试图建立一个连接。 通常目标端口是关闭的,一个RST (复位) 包会发回来。 如果碰巧端口是开放的,目标会进行TCP三步握手的第二步,回应一个SYN/ACK TCP报文。然后运行Nmap的机器则会扼杀这个正在建立的连接, 发送一个RST而非ACK报文, RST报文是运行Nmap的机器而不是Nmap本身响应的,因为它对收到的SYN/ACK感到很意外。Nmap并不关心端口开放还是关闭。 无论RST还是SYN/ACK 响应都告诉Nmap该主机正在运行; 定义:TCP SYN Ping扫描是Nmap用于检测目标主机是否存活的一种技术。 工作原理:在这种扫描方式中,Nmap向目标主机的特定端口(通常是80)发送一个TCP SYN数据包。如果目标主机在该端口上监听,并且主机是活跃的,它将返回一个SYN/ACK响应。Nmap收到这个响应后,就知道目标主机是活跃的,但并不会进一步尝试建立连接。 权限要求:通常不需要特殊权限,因为它不涉及建立完整的TCP连接。 应用场景:主要用于快速检测目标主机是否在线,而不进行深入的端口扫描或操作系统检测。 |
-PA [portlist] (TCP ACK Ping) 远程主机应该总是回应一个RST报文, 因为它们并没有发出过连接请求到运行Nmap的机器,如果它们正在运行的话; |
-PU [portlist] (UDP Ping) 不指定端口,默认是31338;如果目标机器的端口是关闭的,UDP探测应该马上得到一个ICMP端口无法到达的回应报文。 这对于Nmap意味着该机器正在运行。没有回应也被这样解释:类似许多其它类型的ICMP错误,像主机/网络无法到达或者TTL超时则表示down掉的或者不可到达的主机。(该扫描类型的主要优势是它可以穿过只过滤TCP的防火墙和过滤器) |
-PE; -PP; -PM (ICMP Ping Types) -PE:Nmap发送一个ICMP type 8 (回声请求),期望返回type 0 (回声响应)报文;type 0 (回声响应)报文; 当管理员特别封锁了回声请求报文,而忘了其它ICMP查询可能用于相同目的时,这两个查询可能很有价值: -PP:时间戳请求;Nmap发送一个ICMP type 13 (回声请求),期望返回type 14 (回声响应)报文; -PM:地址掩码请求;Nmap发送一个ICMP type 17 (回声请求),期望返回type 18 (回声响应)报文; |
-n (不用域名解析) 告诉Nmap永不对它发现的活动IP地址进行反向域名解析; |
-R (为所有目标解析域名) 告诉Nmap 永远 对目标IP地址作反向域名解析。 一般只有当发现机器正在运行时才进行这项操作。 |
1.3.3 端口扫描
虽然Nmap努力产生正确的结果,但请记住所有结果都是基于目标机器(或者它们前面的防火墙)返回的报文的。这些主机也许是不值得信任的,它们可能响应以迷惑或误导Nmap的报文。
这一节讨论Nmap支持的大约十几种扫描技术。一般一次只用一种方法。
-sS (TCP SYN扫描) 半连接扫描,使用最频繁,安全,快 它执行得很快,在一个没有入侵防火墙的快速网络上,每秒钟可以扫描数千个端口。SYN扫描相对来说不张扬,不易被注意到,因为它从来不完成TCP连接; 定义:半开放扫描(SYN Scan),也称为SYN半连接扫描,是Nmap中最常用的扫描技术之一。 工作原理:在这种扫描方式中,Nmap向目标端口发送一个SYN数据包,就像它打算建立一个完整的TCP连接一样。但是,一旦收到SYN/ACK响应,Nmap不会发送ACK数据包来完成三次握手,而是发送一个RST数据包来终止连接。这种方式的好处是,它不会建立一个完整的TCP连接,因此扫描速度更快,且不易被目标主机记录在系统日志中。 权限要求:通常需要root或管理员权限来执行,因为它涉及到发送原始套接字数据包。 应用场景:适用于快速扫描大量主机的开放端口,同时减少被目标主机记录的风险。 -sS和-PS的区别总结: 主要区别:-sS用于扫描目标主机的开放端口,而-PS主要用于检测目标主机是否存活。-sS会尝试与目标端口的TCP连接(但不完全建立),而-PS只是发送一个SYN数据包来检测主机是否响应。 使用场景:-sS适用于需要了解目标主机开放端口的情况,而-PS则适用于仅需要知道目标主机是否在线的场景。 |
-sT (TCP connect()扫描) 一种基本的TCP扫描方式,它基于TCP连接机制来探测目标主机的端口状态。 原理 -sT扫描通过发送TCP连接请求(即进行三次握手)来探测目标端口的开放状态。具体来说,扫描器会尝试与目标主机上的指定端口建立TCP连接。如果目标端口有程序在监听,那么连接会成功建立,此时端口被视为开放(open);如果目标端口没有程序监听,则目标主机会回复一个RST(重置)包,表示端口不可达(close)。 特点 易于使用:-sT扫描不需要特殊的权限,在大多数UNIX系统下,任何用户都可以自由使用这个系统调用。 易被发现:由于这种扫描方式需要建立完整的TCP连接,因此它很容易被目标主机察觉并记录在系统日志中。这表现为一系列的连接请求和可能的错误信息。 有效性:虽然易于被发现,但-sT扫描是一种非常有效的端口扫描方式,它能够准确地识别出目标主机的开放端口。 使用场景 -sT扫描适用于大多数需要探测目标主机开放端口的场景。然而,由于其易于被发现的特点,建议在网络扫描和渗透测试等需要高度隐蔽性的场景中谨慎使用,或者结合其他扫描方式以提高隐蔽性。 |
-sU (UDP扫描) UDP扫描用-sU选项激活。它可以和TCP扫描如 SYN扫描 (-sS)结合使用来同时检查两种协议;UDP不建立连接,通常依赖于目标主机对特定类型 UDP 数据包的响应来推断端口状态; closed(关闭的):回ICMP端口不可到达错误(类型3,代码3) filtered(被过滤的):ICMP不可到达错误(类型3, 代码1,2,9,10,或者13) open(开放的):某服务会响应一个UDP报文 open|filtered(开放|被过滤的)几次重试后还没有响应: 防火墙和过滤规则:UDP 扫描可能会受到网络中的防火墙和过滤规则的影响。一些防火墙可能会丢弃 UDP 数据包或发送伪造的 ICMP 端口不可达消息来欺骗扫描器。 扫描速度和效率:由于 UDP 扫描的复杂性,它可能比 TCP 扫描更慢且效率更低。因此,在进行大规模 UDP 扫描时,需要仔细考虑扫描参数和扫描策略。 |
1.3.4 端口说明和扫描顺序
除了所有前面讨论的常用扫描方法, Nmap提供选项说明哪些端口被扫描以及扫描是随机还是顺序进行。
默认情况下,Nmap用指定的协议对端口1到1024以及nmap-services 文件中列出的更高的端口在扫描。
-p (只扫描指定的端口) 该选项指明想扫描的端口,覆盖默认值,参数后面可以跟一个或多个端口号或端口范围。端口号之间可以用逗号(,)分隔,范围可以用连字符(-)表示(如1-1023)。 既扫描TCP端口又扫描UDP端口时,可以在端口号前加上T:或者U:指定协议( -p U:53,111,137,T:21-25,80,139,8080),但必须指定 -sU ,以及至少一个TCP扫描类型(如 -sS,-sF,或者 -sT)。如果没有给定协议限定符, 端口号会被加到所有协议列表 注意: 默认情况下,nmap 使用 TCP 协议进行扫描。如果你需要扫描 UDP 端口,可以使用 -sU 参数。 你可以通过 -p-(连字符后无空格)来指定扫描目标上的所有端口(TCP 或 UDP,取决于是否使用了 -sU)。 对于大范围的端口扫描,考虑使用 -T 参数来设置扫描的时间模板,以加快扫描速度。但要注意,提高扫描速度可能会增加被目标网络发现的风险 |
-r (不要按随机顺序扫描端口) 默认情况下,Nmap按随机顺序扫描端口(除了出于效率的考虑,常用的端口前移)。这种随机化通常都是受欢迎的, 但您也可以指定-r来按顺序进行端口扫描。 |
1.3.5 服务和版本探测
在用某种其它类型的扫描方法发现TCP 和/或者UDP端口后,版本探测会询问这些端口,确定到底什么服务正在运行。nmap-service-probes 数据库包含查询不同服务的探测报文和解析识别响应的匹配表达式
Nmap试图确定服务协议 (如 ftp,ssh,telnet,http),应用程序名(如ISC Bind,Apache httpd,Solaris telnetd),版本号, 主机名,设备类型(如 打印机,路由器),操作系统家族 (如Windows,Linux)以及其它的细节,如 如是否可以连接X server,SSH协议版本 ,或者KaZaA用户名)
-sV (版本探测) 打开版本探测,也可以用 -A 同时打开操作系统探测和版本探测。 |
--allports (不为版本探测排除任何端口) 用于指示Nmap扫描目标主机上所有可能的端口(通常是1到65535之间的所有端口),而不是仅限于Nmap的默认扫描范围; 默认情况下,Nmap版本探测会跳过 9100 TCP端口,因为一些打印机会打印发送到该端口的任何数据,会导致数十页HTTP get请求、二进制 SSL会话请求等等被打印出来。这一行为可以通过修改或删除nmap-service-probes 中的Exclude指示符改变,也可以不理会任何Exclude指示符,指定--allports扫描所有端口。 |
1.3.6 操作系统探测
-O (启用操作系统检测) 也可以使用 -A 来同时启用操作系统检测和版本检测。 |
1.3.7 时间和性能
-T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane> (设置时间模板) |
1.3.8 输出
-oN <文件名>: 将扫描结果保存到指定文件中,以标准格式(nmap 的默认输出格式)存储。 -oX <文件名>: 将扫描结果以 XML 格式保存到指定文件中,这便于后续使用其他工具进行解析和处理。 -oG <文件名>: 将扫描结果以 Grepable 格式保存到指定文件中,这种格式便于通过 grep 等工具进行搜索和过滤。 -oA <基本文件名>: 同时以 -oN、-oX 和 -oS 的格式保存扫描结果,文件名由指定的基本文件名和扩展名组成(例如,-oA myscan 将产生 myscan.nmap、myscan.xml 和 myscan.gnmap)。 -oS <文件名>: 将扫描结果以脚本 kiddie 友好的格式保存到指定文件中,这通常是一种更容易阅读的格式。 |
-v (提高输出信息的详细度) 通过提高详细度,Nmap可以输出扫描过程的更多信息。 输出发现的打开端口,若Nmap认为扫描需要更多时间会显示估计 的结束时间。这个选项使用两次,会提供更详细的信息。这个选 项使用两次以上不起作用。 |