2.3.1 端口扫描 – 探测开放服务
端口扫描 - 探测开放服务与系统特征
端口扫描(Port Scanning)与指纹探测(Fingerprinting)是一项通过向目标系统发送特定网络数据包,识别开放端口、运行服务及系统特征的信息收集技术。在安全测试领域,该技术被视为渗透测试的基础环节,用于目标资产发现和攻击面分析。端口扫描与指纹探测本质上是通过主动或被动的方式探测目标系统的网络服务状态。
图:端口扫描与服务指纹探测交互流程
在上图展示的过程中,常见的扫描器会通过系统性地向目标系统发送各种类型的网络探测包来收集系统信息,通过依次执行端口发现、服务识别和系统指纹识别三个阶段,逐步构建出目标系统的完整网络架构图。在这个信息收集过程中,扫描器不仅能够发现所有开放的网络服务端口,还可以精确识别每个服务的具体版本信息,甚至可以通过分析系统的网络协议栈行为特征来准确判断底层操作系统类型。这使得端口扫描与指纹探测成为网络安全评估中最重要的前期侦察技术,同时也是安全测试人员在实施渗透测试前必须掌握的目标系统信息收集手段。
端口发现阶段:探测网络服务的可达性
端口发现是端口扫描的首要环节,旨在识别目标主机上哪些端口处于开放状态,即有服务正在监听并响应连接。这一阶段主要依赖于TCP和UDP协议的不同特性进行探测。
-
TCP 端口发现原理 TCP(传输控制协议)是一种面向连接的、可靠的传输协议,其连接建立过程依赖于著名的“三次握手”机制。端口扫描器通过模拟这一过程的不同阶段来判断端口状态。
-
TCP SYN 扫描 (半开放扫描) TCP SYN 扫描是最常用且高效的扫描方式之一。扫描器向目标端口发送一个设置了SYN(同步)标志位的TCP数据包。
-
如果端口开放:目标主机将返回一个设置了SYN+ACK(同步-确认)标志位的TCP数据包。扫描器收到此响应后,发送RST(复位)包终止连接,避免完整的TCP连接记录被创建,从而实现“半开放”扫描。
-
如果端口关闭:目标主机将返回一个设置了RST+ACK标志位的TCP数据包,表示拒绝连接。
-
如果端口被防火墙过滤:目标主机可能不返回任何响应,或者返回一个ICMP(互联网控制消息协议)“目标不可达”消息。 这种扫描方式的优势在于隐蔽性相对较高,因为它不完成完整的TCP连接,因此在目标系统日志中可能只留下不完整的连接尝试记录。
-
缺点是对用户权限有要求,在 MacOS 下需要网卡设备的读写权限才能发送原始数据包,Windows 下需要安装 pcap 依赖并且使用管理员权限。
-
-
TCP Connect 扫描 (全连接扫描) TCP Connect 扫描是建立完整TCP连接的扫描方式。扫描器调用操作系统尝试与目标端口建立完整的TCP三次握手。
-
如果端口开放:连接成功建立。
-
如果端口关闭:连接将失败,并返回连接拒绝的错误。 这种方式的优点是无需特权用户权限即可执行,但缺点是会在目标系统日志中留下完整的连接记录,隐蔽性较差。
-
-
-
UDP 端口发现原理 UDP(用户数据报协议)是一种无连接的协议,其探测方式与TCP截然不同。扫描器向目标UDP端口发送一个UDP数据包(通常是空包或特定协议的探测包)。
-
如果端口开放:通常不返回任何响应(因为UDP无连接),但某些服务(如DNS、SNMP)在收到有效查询后会返回特定响应。
-
如果端口关闭:目标主机通常会返回一个ICMP“端口不可达”错误消息。 UDP扫描相对于TCP扫描通常较慢且不确定性高,因为开放的UDP端口不一定会响应探测,而防火墙也可能过滤ICMP错误消息。
-
服务识别阶段:识别服务类型与版本
在端口被发现为开放后,下一个关键步骤是识别该端口上运行的具体服务类型及其版本。这对于后续的漏洞分析至关重要,因为许多漏洞都与特定服务或其特定版本相关。
-
Banner 抓取 (Banner Grabbing) 最直接的服务识别方法是“Banner抓取”。扫描器与开放端口建立连接后,尝试读取服务在连接建立时返回的初始信息(Banner)。许多服务(如FTP、SSH、HTTP、SMTP)在连接成功后会发送包含服务名称、版本号、操作系统信息等内容的Banner。 例如,连接到一个HTTP服务可能会返回类似:
Server: Apache/2.4.6 (CentOS) PHP/5.4.16的信息。 -
协议探测与指纹分析 当Banner信息不完整或不存在时,扫描器会发送针对特定协议的探测数据包,并分析目标服务的响应。这涉及到维护一个庞大的协议指纹数据库,其中包含了各种服务的独特响应模式。 例如:
-
HTTP/HTTPS:发送标准HTTP GET请求,解析响应头中的
Server字段、X-Powered-By字段等。 -
SMB:发送SMB协议协商请求,分析响应中的NTLM协商字段来判断Windows版本或Samba版本。
-
数据库服务 (如MySQL, SQL Server):发送特定数据库协议的握手包,解析其返回的协议版本和身份验证信息。
-
SSH:读取SSH协议版本字符串。 通过这种方式,扫描器可以精确识别出端口上运行的Web服务器、数据库、文件共享服务等,并获取其详细版本信息。
-
扫描流程解析:统合与创新
Yakit 端口扫描将上述技术整合为一个统一的工作流,同时额外引入了"加载插件"功能,用户可以根据需求选择不同的扫描模式,配置不同的扫描参数,加载不同的插件,Yakit 端口扫描模块会自动执行相应的探测、识别和结果输出。
Yakit 端口扫描模块在端口发现阶段主要提供三种核心扫描模式,每种模式都有其独立的配置项以适应不同场景。
-
SYN 扫描模式 :此模式下,扫描以速度和隐蔽性为优先。由于不建立完整连接,扫描效率极高,适合大规模网络的快速端口发现 。但需要注意的是,该模式需要 Yakit 启动时具备 root 或管理员权限,并且默认不进行后续的指纹识别 。其核心配置包括 SYN 并发数和网卡选择等 。
-
指纹扫描模式 :使用 TCP Connect 端口发现后,会进行深度的服务指纹识别 。用户可以精细控制指纹扫描的并发数、探测级别(级别越高,发包越多,结果越详细)、超时时间,甚至可以配置 TCP 代理和加载自定义指纹库 。此模式还内置了基础的爬虫功能,用于在发现 Web 服务后进行简单的页面抓取以发现更多资产 。
-
SYN+指纹 混合模式 :该模式是前两者的结合体,它利用 SYN 扫描进行高速的端口存活检测,然后仅对发现的开放端口进行深度的指纹识别 。这种策略兼顾了速度与深度,是进行大规模、精细化资产探测的理想选择。其配置项是前两种模式的并集
Yakit 端口扫描模块在服务识别阶段集成了业界主流的指纹库,以确保识别的广度和准度,同时,Yakit 允许用户按规定格式自定义添加指纹:
-
TCP/UDP 的协议识别采用了 Nmap 的原生指纹库及扫描格式,
-
Web 应用的指纹识别则采用了 Wappalyzer 的指纹格式。
-
自定义添加指纹,用户按既定格式添加指纹,最终所有扫描结果都将以规范化的 CPE (Common Platform Enumeration) 格式呈现,便于资产管理和漏洞关联
Yakit 端口扫描模块在服务识别阶段后还可以通过加载插件的方式,实现进一步的功能,例如:PoC 检测,或一些其他的自定义需求
-
MITM 插件
-
端口扫描插件
-
Nuclei Yaml 插件
我们使用下面的图例来理解 Yakit 端口扫描与指纹识别的流程:
图:Yakit端口扫描模块流程解析
Yakit 端口扫描基础使用
在理解了端口扫描的基本原理后,本节将引导您掌握 Yakit 端口扫描模块的实际操作流程。Yakit 将复杂的扫描技术封装在简洁的图形化界面之后,为用户提供了快速、准确的端口状态检测和服务识别能力 。
基本配置与操作台
在正式开始使用端口扫描之前,我们先来了解一下端口扫描的两个入口,如下图
图:Yakit 安全工具模块入口与漏洞扫描操作界面
进入 Yakit 的端口扫描模块后,用户可以看见下图的端口指纹扫描主页面
图:端口指纹扫描插件配置与预设端口组
在主界面中,用户可以看到如下配置信息,这些配置信息主要是端口扫描中的一些高频配置:
对于初次使用者或常规扫描任务,通常只需配置最核心的两个选项 **扫描目标 和 扫描端口 **就可以执行端口扫描任务了。
在默认配置下,Yakit 会使用 TCP Connect 模式进行全连接扫描并进行指纹识别,这足以满足大多数日常扫描需求 。当遇到特殊情况,如需进行大规模网段扫描或需要更高精度的指纹识别时,则可以通过“额外参数”进行精细化配置 。下面我们会根据选择的扫描模式进行详细的讲解
SYN 扫描模式
我们先介绍 SYN 扫描的一些额外配置,SYN 扫描本质上是发送一个TCP的 SYN 报文给目标端口,如果收到 SYN+ACK 响应则表示端口开放,然后扫描程序立刻发送 RST 断开连接;如果收到 RST 则表示端口关闭;无响应则可能被防火墙丢弃。SYN 扫描速度快且隐蔽性相对高,因为并未完成完整的TCP握手。需要有原始套接字权限(root权限)才能发送自定义 SYN 包。该模式下不进行指纹识别。
SYN扫描额外参数配置界面如图:
图:Yakit SYN扫描模式网卡选择配置界面
配置参数说明:
SYN 扫描模式注意事项
我们在前文已探讨了 SYN 扫描在效率与隐蔽性上的显著优势,但这种优势源于其绕过操作系统标准 TCP/IP 协议栈、直接在数据链路层构造和发送原始报文(Raw Packet)的能力。这一底层操作机制决定了执行 SYN 扫描必须拥有特殊的系统权限,以便能够访问原始套接字(Raw Socket)。本节将详细阐述 Yakit 如何处理这一权限问题,并以 macOS 系统为例,提供清晰的操作指引。
Yakit 引擎在启动时会执行一系列严格的自检程序,其中就包括对网络抓包(PCAP)权限的检测。当权限不足时,Yakit 会在界面右上角的“系统检测”处以醒目的红色感叹号进行警示,主动引导用户进行修复。在 macOS 系统下,用户会直观地看到此警示。单击该感叹号图标,会展开“系统检测”面板,明确提示“网卡权限未修复”的问题,并指明其可能对部分功能造成影响。
图:Yakit网卡权限未修复提示与修复方式
**MacOS **下网卡授权方案
为了解决此问题,Yakit 提供了内置的自动化修复向导,推荐用户优先使用。操作流程清晰明了:
-
启动修复向导:在“系统检测”面板中,点击“去修复”按钮,系统将弹出权限修复对话框。此对话框提供了两种修复方式:手动执行命令行和自动修复。
-
执行自动修复:强烈建议选择“开启 PCAP 权限”选项,以启动引导式修复流程。该流程会通过
osascript调用系统原生功能来请求授权。 -
系统授权确认:用户会依次看到两次系统弹窗。首先是请求控制“System Events”的授权,请点击“好”;随后是请求输入当前用户的登录密码以执行提权操作,输入密码后再次点击“好”。
图:Yakit 开启 PCAP 权限操作流程
完成以上步骤后,系统会提示网卡权限已修复。此时,Yakit 便获得了直接操作伯克利包过滤器(BPF, Berkeley Packet Filter)设备(即 /dev/bpf*)的读写权限,从而可以正常执行 SYN 扫描及其他依赖底层网络抓包的全部功能。对于希望了解其原理或偏好手动操作的用户,修复对话框中也提供了 sudo chmod +rw /dev/bpf* 命令,其效果与自动化修复完全一致。
Windows** 下的网卡授权方案**
在介绍 Windows 下的 SYN 扫描前,我们先介绍一下 Npcap:
Npcap 是 Nmap 项目为 Microsoft Windows 开发的数据包捕获(和发送)库。它使用自定义的 Windows 内核驱动程序以及基于优秀的 libpcap 库的 Windows 版本实现了开放的 Pcap API 。这使得 Windows 软件能够使用简单易用的 API 捕获原始网络流量(包括无线网络、有线以太网、本地主机流量以及多种 VPN)。Npcap 也支持发送原始数据包。Mac 和 Linux 系统已经包含 Pcap API,因此 Npcap 允许 Nmap 等常用软件,比如 Wireshark 只需一个代码库即可在所有这些平台(以及更多平台)上运行。Npcap 诞生于 2013 年,最初是对 WinPcap 库(现已停用)的一些改进,但自那时起,它已被大量重写,并发布了数百个版本。
因此,在 Windows 下使用 SYN 扫描需要先安装 Npcap(https://npcap\.com/\#download\),我们总结了一些常见的错误,
- Npcap 未安装:未安装 Npcap(Windows 下) 会导致 SYN 扫描不可用,出现类似下图的错误
图:Yakit SYN扫描模式下的终端错误日志输出
-
权限问题:由于扫描并未完成完整的TCP握手,因此需要使用 Npcap 进行读写包,可能会出现类似,
You don't have permission to capture on that device ((cannot open BPF device) Permission denied)的错误,需要使用管理员(Administrator)权限启动 Yakit。 -
找不到本地环回(Loopback)网卡: 安装 Npcap 一些比较旧的版本(比如 v1.60),安装完成后,立即使用Yakit,可能会出现找不到本机 Loopback 网卡的情况,需要重启电脑后再次尝试打开Yakit。
-
扫描不出端口(网卡选择):还记得我们在SYN 扫描模式中有一个网卡配置选项吗?Yakit 启动时会自动获取本机所有网卡,如下图,在扫描虚拟机中的端口时,我们可以切换网卡,比如选择
VMnet 1/8网卡进行对应目标的端口扫描与指纹探测。
图:Yakit网卡配置界面展示WLAN 4选择
指纹扫描模式
扫描模式中的 指纹 模式,该模式的额外配置界面如下,本质上是利用操作系统的正常 socket 去尝试连接目标端口(三次握手完整执行)。如果连接成功建立就马上断开,表示端口开放;若直接被拒绝则端口关闭;无响应则表示被过滤。Connect 扫描不需要特殊权限,任何用户都能执行,但因为要完整建立连接,速度比SYN稍慢,且目标主机可能在日志中看到一次正常连接的记录。该模式下会进行指纹识别
指纹扫描模式额外参数配置界面如图
图:Yakit指纹扫描模式配置界面
配置参数说明:
SYN+指纹 混合模式
扫描模式中的 SYN+指纹 模式,该模式的本质上就是使用SYN进行端口存活检测,随后进行指纹识别,配置项是前两种模式的并集,这里就不重复介绍了,但是我们还需要介绍一下额外参数中的其他配置,其他配置是所有模式都有的参数,如下图
图:Yakit扫描配置界面展示
至此,我们介绍了三种扫描模式的全部参数。
端口扫描实战
以上的配置项繁多庞杂,一般情况下,我们使用默认配置就可以满足我们大多数情况下的扫描需求了,在遇到一些特殊情况的时候再考虑更改我们的扫描配置。
下面是一个使用指纹服务探测的端口扫描实例。如下图所示,我们使用一个带有子网掩码的内网扫描目标,并勾选“常见100端口”的预设端口选项,直接点击开始执行。
图:Yakit端口指纹扫描配置界面
扫描过程中会详细展示存活的主机IP、开放的端口、识别到的协议和指纹,对于HTTP 协议还会尝试获取 Title,如下图
图:Yakit端口指纹扫描界面展示
扫描完成后,可以选择保存为 xlsx格式的文件
图:Yakit端口资产数据导出为Excel
端口扫描注意事项:
• 扫描范围不宜过大,以免耗费太长时间或引起目标警觉。合理设置并发线程数:Yakit 默认并发通常适中,如果需要扫C段以上网络,考虑提高线程但也注意不要过度造成漏报。
• 合理利用指纹识别结果:指纹识别有助于明确服务版本,为后续漏洞利用提供线索。但指纹匹配可能不完全准确,要结合经验判断。
• SYN扫描需要权限,可以使用普通TCP Connect模式替代,但TCP Connect模式在扫描大量端口时效率较低。
• 注意目标的防御策略:某些防火墙对大量端口扫描会触发报警或进行阻断,所以对生产环境目标执行扫描要遵守规则,并做好授权证明。
端口扫描完成后,我们已经知道目标开放的服务,下一步可以尝试对一些服务进行弱口令测试。比如,如果扫描结果显示某IP的22端口(SSH)开放,我们可以测试SSH登录的弱密码;若3306端口(MySQL数据库)开放,可以测试MySQL的弱口令;或者针对常见的服务如 FTP、SMB 等进行密码爆破。下面我们介绍 Yakit 的弱口令爆破模块用法。