“被动侦察 Passive Reconnaissance”是指在不接触目标的情况下,从公开来源收集情报。这与“主动侦察”形成鲜明对比——在主动侦察中,你需要与目标直接交互,从而面临被发现的风险。
无论是在渗透测试、漏洞赏金计划还是威胁狩猎活动中,被动侦察始终是最强大且风险最低的阶段之一。尽管现有的隐私法规(如 GDPR、CCPA)日益严格,但仍有大量有用数据通过 DNS、WHOIS、证书透明度(Certificate Transparency)日志、搜索引擎及设备普查平台等渠道公开暴露。
早在计算机网络问世之前,孙武便在《孙子兵法》中写道:“知彼知己,百战不殆。”
在网络安全领域,这一原则对应着两种角色。作为攻击者(或道德黑客),你需要收集有关目标的情报以发现其弱点;作为防御者,你则必须了解对手能从公开渠道获取哪些关于你系统的信息,并尽可能减少此类信息暴露。
侦察(Reconnaissance,简称 Recon)是指针对目标收集信息的初步探测活动。在现代攻击框架(如“统一杀伤链”——其中侦察有助于在建立立足点之前获取初步了解)以及经典的“网络杀伤链”各类变体中,侦察始终是首要阶段。侦察主要分为两大类型。
Passive Reconnaissance
常见的被动侦察活动包括:
- 从开放解析器查询公共 DNS 记录(如 A、MX、TXT 记录等)。
- 在证书透明度日志(如 crt.sh)中搜索子域名和已签发的证书。
- 查看 LinkedIn 或公司招聘页面上的职位信息,以获取有关技术栈的线索。
- 阅读公开新闻、新闻稿或发布在文本分享网站(paste sites)上的泄露文档。
- 利用 Shodan 或 Censys 等搜索引擎查找暴露在互联网上的设备。
- 扫描公开的 GitHub 仓库,查找硬编码的凭据或配置文件。
Whois
通过 WHOIS 响应,通常可以获取以下信息(前提是未被隐藏):
- 注册商:负责注册该域名的公司(例如 Namecheap、GoDaddy)。
- 注册人联系信息:姓名、所属机构、地址、电话和电子邮件。不过,由于隐私保护服务(自 2018 年 GDPR 实施以来已成标配)的存在,这些信息通常会被替换为“Withheld for Privacy”(因隐私原因隐藏)或类似表述。
- 日期:创建(注册)日期、更新(最后变更)日期和到期(续费截止)日期。
- 名称服务器:该域名的权威 DNS 服务器。
- 状态码:例如,
clientTransferProhibited表示域名已被锁定,禁止未经授权的转移。 - 滥用举报联系方式:注册商用于接收问题报告的电子邮件和电话。
- 受隐私法规(如 GDPR、CCPA)及隐私代理服务广泛使用的影响,如今已很难获取完整的个人详细信息。
在实际操作中,攻击者主要关注日期(用于估算域名注册时长或围绕续费期策划社会工程学攻击)、注册商(用于分析网络钓鱼手法)、名称服务器(潜在的薄弱环节)以及历史变更记录。像 whoxy.com 这样的服务提供 WHOIS 历史快照。历史 WHOIS 数据可以揭示域名的过往所有者、注册商变更或名称服务器迁移情况,这些信息可能暗示了域名曾遭入侵或基础设施发生过变动。
如需查询 WHOIS 信息,可使用 whois 命令行客户端(速度通常快于大多数网页工具),或使用在线查询工具进行传统方式的查询。
语法:
whois DOMAIN_NAME
# whois tryhackme.com
Domain Name: TRYHACKME.COM
Registry Domain ID: 2282723194_DOMAIN_COM-VRSN
Registrar WHOIS Server: whois.namecheap.com
Registrar URL: http://www.namecheap.com
Updated Date: 2025-05-11T14:06:02Z
Creation Date: 2018-07-05T19:46:15Z
Registry Expiry Date: 2034-07-05T19:46:15Z
Registrar: NameCheap, Inc.
Registrar IANA ID: 1068
Registrar Abuse Contact Email: abuse@namecheap.com
Name Server: KIP.NS.CLOUDFLARE.COM
Name Server: UMA.NS.CLOUDFLARE.COM
DNSSEC: unsigned
RDAP 示例
使用 curl 查询公共 RDAP 端点(例如针对 .com 域名的 Verisign 端点)。jq 工具用于格式化 JSON 输出,使其更易于阅读;请通过软件包管理器进行安装(例如执行 sudo apt install jq)。
# curl -s https://rdap.verisign.com/com/v1/domain/tryhackme.com | jq .
{
"objectClassName": "domain",
"handle": "2282723194_DOMAIN_COM-VRSN",
"links": [
{
"value": "https://rdap.verisign.com/com/v1/domain/TRYHACKME.COM",
"rel": "self",
"href": "https://rdap.verisign.com/com/v1/domain/TRYHACKME.COM",
"type": "application/rdap+json"
},
],
"status": [
"client transfer prohibited"
],
关注要点:
- 重定向链(从 Verisign 到注册商服务器)。
- 日期:有助于估算公司成立时间或识别域名续费相关的网络钓鱼窗口期。
- 名称服务器(Name servers):潜在的新攻击目标(若在测试范围内)。
- 状态:处于锁定状态的域名(例如
clientTransferProhibited)较难被劫持。
在线查询替代方案(若 whois 命令表现异常):
- whois.icann.org/ (传统 WHOIS)
- lookup.icann.org/ (基于 RDAP 的现代查询服务)
- www.whoxy.com/ (提供 WHOIS 历史快照,免费且有限额)
nslookup
这些工具能够将域名解析为 IP 地址、查找邮件服务器、获取 TXT 记录(如 SPF、DMARC、验证字符串)等。
dig(其名称源自“Domain Information Groper”这一回溯缩写)是现代且更受推荐的选择。它输出的信息更清晰,默认显示 TTL 值(即记录的缓存时长),并且在处理复杂查询或编写脚本时更为可靠。此处介绍 nslookup 主要是为了兼容性考虑,因为在旧版文档或 Windows 系统中仍会遇到它;但在实际使用中,应优先选择 dig 作为默认工具。
语法:
nslookup DOMAIN_NAME使用默认解析器执行简单的查询。nslookup -type=TYPE DOMAIN_NAME [SERVER]指定记录类型及可选的 DNS 服务器。
常见的 DNS 记录类型:
| Query type | Result |
|---|---|
| A | IPv4 address(es) for the domain |
| AAAA | IPv6 address(es) for the domain |
| CNAME | Canonical Name: an alias that points one domain name to another |
| MX | Mail Servers: the servers responsible for handling email for the domain |
| SOA | Start of Authority: the primary name server, admin email, and zone serial number |
| TXT | Text Records: arbitrary text, commonly used for SPF, DKIM, DMARC, and domain verification |
示例(通过 Cloudflare 解析器获取的 IPv4 地址):
nslookup -type=A tryhackme.com 8.8.8.8
MX 示例(邮件服务器):
nslookup -type=MX tryhackme.com:
每个服务器前的数字表示优先级:数值越低,优先级越高。在本例中,由 Google Workspace 处理电子邮件;这对许多组织而言很常见,且该服务通常能及时应用安全补丁。
dig
dig 是现代且首选的 DNS 查询工具。
语法:
dig [@SERVER] DOMAIN_NAME [TYPE]
示例(通过 Cloudflare 查询 MX 记录):
dig @1.1.1.1 tryhackme.com A
隐私提示:使用 1.1.1.1 等公共解析器(支持 DNS over HTTPS 和 DNS over TLS),以避免你的 ISP 记录您的查询。
防御者提示:监控异常的 DNS 更改(例如新的 MX 记录、异常的 TXT 条目)。这些可能是子域名劫持或配置错误的迹象。
DNSDumpster
标准的 DNS 查询(如 dig 或 nslookup)只能解析你已知的域名。它们无法发现那些未公开列出的子域名。
关注子域名至关重要,因为它们往往会暴露一些被遗忘或存在漏洞的服务(如过时的 CMS 系统、开发管理面板)、“影子 IT”资源、配置错误的应用程序,以及额外的攻击面(如暴露的 API 或管理后台)。
在被动侦察阶段,发现这些子域名是利用公开的 OSINT(开源情报)资源进行的,过程中不会向目标发送任何查询请求。
DNSDumpster 是一款广为人知的免费工具。它汇集了来自搜索引擎缓存、区域传输(zone transfer)数据库和证书记录等来源的公开 DNS 数据。该工具不执行暴力枚举,因此保持了完全被动的特性。其结果包含子域名和主机信息、解析出的 IP 地址及其地理位置、MX/TXT/CNAME 记录,以及展示这些元素之间关联的可视化图谱。
在 DNSDumpster 上搜索 tryhackme.com,你就能看到诸如 blog.tryhackme.com 这样常规 DNS 查询无法发现的条目。
如果一个域名出现多个国家,说明:
- 可能使用了 CDN 或负载均衡。
- 可能存在多个公网 IP,需要分别收集和分析。
- 可能使用了不同的云服务商(AWS、Azure、GCP 等)。
- 可以进一步查看每个 IP 的开放端口、证书、服务版本等,了解基础设施分布
DNSDumpster 还会将数据可视化,展示子域名、IP 地址和邮件服务器之间的关联:
CT Logs
证书透明度是一项公开的日志记录框架(自 2015 年左右起成为强制要求),用于记录由参与该计划的证书颁发机构 (CA) 签发的所有 SSL/TLS 证书。每张证书都包含一个“使用者备用名称”(SAN) 字段,其中列出了该证书涵盖的域名和子域名。通过搜索这些日志,无需向目标发送任何流量即可发现子域名。
若要使用 crt.sh,请访问 https://crt.sh 并搜索 %.tryhackme.com。其中的 % 通配符可匹配任意子域名。搜索结果将列出所有针对 tryhackme.com 子域名签发的证书;通常,这种方法发现的子域名数量是仅使用 DNSDumpster 所能发现数量的 10 到 100 倍。
Shodan.io
在被动侦察阶段,利用 Shodan.io 等工具,无需向目标发送任何流量即可收集有关其面向互联网的资产的情报。
Shodan 是一款针对联网设备的搜索引擎。它持续扫描公共互联网,收集开放端口及服务的标语(banner)和响应信息,并将其建立索引以供检索。与索引网页内容的 Google 不同,Shodan 专注于设备,涵盖服务器、物联网(IoT)设备、摄像头、路由器、工业控制系统等。
防御价值:组织机构可以通过监控 Shodan(利用警报或人工检查)来发现意外暴露的资产,例如未经授权的服务器、被遗忘的测试机器或存在漏洞的服务。
访问 Shodan.io进行基本搜索无需注册账户。在搜索栏中输入域名(例如 tryhackme.com)或此前通过 DNS 查询获取的 IP 地址(例如 104.26.10.229)。
搜索结果页面会显示匹配的主机列表。选中某台主机后,将打开详细信息视图,其中包含以下内容:
- IP 地址与 ASN(自治系统编号):用于标识网络地址块。
- 托管服务提供商/组织(例如 Cloudflare、AWS):揭示域名背后的基础设施。
- 地理位置(国家、城市):服务器的大致物理位置。
- 开放端口与服务:包含版本字符串和标语信息(例如 HTTP 服务器类型及版本)。
- 标签(Tags):例如
cdn,或者当检测到的服务版本存在已知漏洞时显示的vuln标签。
搜索技巧 Shodan 支持多种搜索过滤器,用于缩小搜索结果范围:
hostname:tryhackme.com匹配特定的主机名。org:"TryHackMe"按组织名称进行筛选。port:443 country:US按端口和国家/地区进行筛选。http.component:"wordpress"识别技术栈(如果已公开)。
如需查看完整参考资料,请访问:help.shodan.io/the-basics/…
若想进一步探索,Censys.io也提供类似的主机和证书数据(支持免费基础搜索)。在交叉比对结果时,它可以作为有益的补充。
快速参考
| Purpose | Command-line Example |
|---|---|
| Lookup WHOIS record | whois tryhackme.com |
| Lookup DNS A records (legacy) | nslookup -type=A tryhackme.com |
| Lookup DNS MX records at specific server (legacy) | nslookup -type=MX tryhackme.com 1.1.1.1 |
| Lookup DNS TXT records (legacy) | nslookup -type=TXT tryhackme.com |
| Lookup DNS A records (recommended) | dig tryhackme.com A |
| Lookup DNS MX records at specific server (recommended) | dig @1.1.1.1 tryhackme.com MX |
| Lookup DNS TXT records (recommended) | dig tryhackme.com TXT |
| Passive subdomain discovery (browser-based) | Visit crt.sh and search %.tryhackme.com |
Active Reconnaissance
主动侦察需要发送数据包、建立连接以及探测服务。这种区别至关重要,因为主动侦察技术会留下痕迹,例如日志记录、IDS(入侵检测系统)警报、WAF(Web应用防火墙)拦截记录以及蜜罐触发记录。
Web browser
网络浏览器是进行主动侦察时最便捷且最不易引起怀疑的工具之一。它几乎存在于所有系统中,且其产生的流量与正常用户活动无异,这使得防御者难以区分侦察行为与正常的网页浏览。
Developer Tools
在 Firefox、Chrome、Edge 或大多数基于 Chromium 的浏览器中,按下 Ctrl + Shift + I(Windows 和 Linux)或 Option + Command + I(macOS)即可打开“开发者工具”(Developer Tools)。其中几个标签页对于侦察工作特别有用。
“网络”(Network)标签页实时显示所有请求和响应。这包括请求和响应头信息(如 Server、X-Powered-By 和 Content-Security-Policy),以及耗时数据、状态码和发送/接收的 Cookie。
“控制台”(Console)标签页允许你在页面上下文中直接执行 JavaScript 代码片段、查看错误信息并与 DOM 进行交互。
“源代码”(Sources)标签页允许你浏览页面加载的 JavaScript、CSS 和 HTML 文件。这是通过浏览器进行侦察的最实用手段之一。JavaScript 源代码文件中往往包含硬编码的 API 端点、目录结构、内部服务引用以及本不应公开的开发人员注释。检查这些文件可能会发现页面渲染后不可见的信息。你将在后续问题中用到这一技巧。
“应用程序”(Application)标签页(位于“存储”/Storage 区域下)允许你检查 Cookie、本地存储(Local Storage)和会话存储(Session Storage)。这些存储区域有时包含会话令牌、意外暴露在客户端的 API 密钥、追踪 ID 或身份验证数据。
“安全”(Security)标签页提供证书详细信息,包括颁发者、有效期和使用者备用名称(SAN)。SAN 往往能揭示属于同一组织的其他子域名或相关域名。
下图是 Firefox 开发者工具的截图。Chrome 和 Edge 提供的界面也非常相似。
Browser Extensions
浏览器扩展可以将浏览器转变为功能更强大的侦察平台。以下是一些当前流行且持续维护的扩展:
-
FoxyProxy 允许在 Burp Suite、ZAP 和 SOCKS5 隧道等代理之间进行切换。在渗透测试或安全评估过程中,当需要通过不同工具拦截或路由流量时,此功能非常有用。
-
User-Agent Switcher and Manager 可以更改 User-Agent 字符串,从而模拟不同的浏览器、操作系统或设备。可以将其伪装成移动版 Safari 或旧版本浏览器,以发现针对移动设备的特定端点或特定版本的行为特征。不过,许多现代 WAF(Web 应用防火墙)和 CDN 能够检测到可疑或频繁的 User-Agent 变更。
-
Wappalyzer 能够自动识别网站使用的技术,包括 CMS 平台、Web 服务器、JavaScript 框架、分析工具、CDN 和数据库等。它在你浏览网页时以被动模式运行,是用于快速进行技术指纹识别的最广泛使用的扩展之一。
Ping
在 Linux 和 macOS 上,使用 -c 选项指定要发送的数据包数量。
ping -c 5 MACHINE_IP
也可以 ping 主机名,此时会先进行 DNS 解析。
ping -c 5 eg.com
在 Windows 上,对应的选项是 -n。
ping -n 5 MACHINE_IP
如果在 Linux 上省略计数参数,ping 命令将无限期运行。按 Ctrl+C 可停止运行。
可以使用 -4 和 -6 选项强制指定 IP 版本。这在双栈(dual-stack)环境中非常有用,因为在这种环境中,主机名可能会解析为 IPv4 和 IPv6 两个地址。在某些系统中,ping6 可作为专门用于 IPv6 的独立命令使用。
ping -4 -c 5 MACHINE_IP
ping -6 -c 5 MACHINE_IPV6
解读输出结果:Ping 成功
64 bytes from 64.239.123.1: icmp_seq=1 ttl=248 time=1.93 ms
64 bytes from 64.239.123.1: icmp_seq=2 ttl=248 time=1.16 ms
64 bytes from 64.239.123.1: icmp_seq=3 ttl=248 time=1.13 ms
64 bytes from 64.239.123.1: icmp_seq=4 ttl=248 time=1.23 ms
64 bytes from 64.239.123.1: icmp_seq=5 ttl=248 time=1.15 ms
TTL(生存时间)字段值得特别关注。尽管名称中包含“时间”二字,但 TTL 实际上代表数据包在被丢弃前所能经过的最大路由器数量(即“跳数”)。路径上的每一台路由器都会将 TTL 值减 1。初始 TTL 值由操作系统设定,因此它也是进行操作系统指纹识别的一个有用指标。Linux 系统的初始 TTL 值通常为 64,而 Windows 系统通常为 128。
然而,数据包在到达你这里之前,中间的路由器会对其 TTL 值进行递减。如果响应中的 TTL 值为 58,这很可能表明该系统是 Linux 系统且距离为六跳,而不是指完全不同的操作系统。在解读结果时,请务必考虑到这一点。
Traceroute
traceroute 命令用于追踪数据包从你的系统到达目标主机所经过的路径。其目的是发现路径上的路由器(即“跳数/hops”)的 IP 地址,并确定你与目标之间存在多少个此类节点。这些信息有助于了解网络拓扑、识别发生过滤或延迟的位置,以及绘制基础设施的布局图。
然而,数据包所走的路径并非固定不变。许多路由器使用 BGP 或 OSPF 等动态路由协议,能够根据网络变化进行调整。现代网络还采用负载均衡和任播(anycast)路由技术,这意味着即使连续多次运行同一命令,数据包也可能走不同的路径。
在 Linux 和 macOS 系统上,该命令为 traceroute MACHINE_IP;在 Windows 系统上,则为 tracert MACHINE_IP。对于 IPv6,请使用 traceroute -6 MACHINE_IPV6 或直接使用 traceroute6 命令。
无法直接获取从本机到目标主机的完整路径。为此,traceroute 利用了 IP 头部中的 TTL(生存时间)字段。每台处理数据包的路由器在转发前都会将 TTL 值减 1。当 TTL 降至 0 时,路由器会丢弃该数据包,并向发送方返回一条 ICMP“生存时间超时”(Time-to-Live Exceeded)消息。
下图展示了一个初始 TTL 为 64 的数据包离开系统的过程。在依次经过四台路由器(每台都会将 TTL 减 1)后,该数据包到达目标主机时,其 TTL 值变为 60。
通过发送 TTL(生存时间)值从 1 开始递增的数据包,traceroute 强制路径上的每一跳路由器依次暴露其 IP 地址。TTL 值为 1 时,第一个路由器会丢弃该数据包并做出响应;TTL 值为 2 时,数据包会到达第二个路由器后才被丢弃。这一过程持续进行,直到数据包到达目的地。
某些路由器被配置为不发送 ICMP“生存时间(TTL)超时”消息。这种情况常见于旨在防止侦察的安全环境中;在 traceroute 的输出结果中,这些路由器会显示为星号(*)。
在 Linux 系统上,traceroute 默认发送 UDP 数据报。若要切换到基于 TCP 的追踪(这有助于绕过 UDP 过滤),可使用命令 traceroute -T MACHINE_IP;若要进行基于 ICMP 的追踪,则使用 traceroute -I MACHINE_IP。
使用 mtr MACHINE_IP(My Traceroute)可获得实时、连续的视图,该工具结合了 traceroute 与类似 ping 的统计数据,能显示每一跳的丢包率和延迟。
Telnet
TELNET(Teletype Network,电传打字机网络)协议于 1969 年开发,旨在通过命令行界面与远程系统进行通信。telnet 命令利用该协议进行远程管理,默认端口为 23。从安全角度来看,Telnet 以明文形式传输所有数据(包括用户名和密码),这意味着任何能够访问通信信道的人都可以轻易截获登录凭据。SSH(Secure Shell)是更安全的替代方案,它会对所有流量进行加密,是当今远程命令行(CLI)访问的标准。
尽管存在安全缺陷,Telnet 客户端在侦察(reconnaissance)方面却有一个很有用的特性。由于它基于 TCP 运行,你可以利用它连接到任意 TCP 端口并观察服务器的响应。这种技术被称为“Banner 抓取”(banner grabbing)。具体做法是连接到某项服务,然后读取服务器返回的初始响应信息,即“Banner”(标语/横幅信息)。这些 Banner 信息往往会透露该端口上运行的软件名称及版本号。
如果你的系统中未安装 Telnet,可以在 Debian 和 Ubuntu 上使用 apt install telnet 命令进行安装。不过,netcat (nc) 和 curl 通常是更受推荐的替代工具,它们不仅提供类似的功能,而且灵活性更高。
下面的示例演示了针对运行在 80 端口的 Web 服务器进行 Banner 抓取的过程。首先使用 telnet MACHINE_IP 80 建立连接,然后发送一个最简化的 HTTP 请求。只需输入 GET / HTTP/1.1,接着输入 host: example,并连续按两次回车键(Enter),即可触发服务器响应。
$ telnet MACHINE_IP 80
Trying MACHINE_IP... Connected to MACHINE_IP. Escape character is '^]'. GET / HTTP/1.1 host: telnet HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Tue, 17 Aug 2021 11:13:25 GMT
Content-Type: text/html
Content-Length: 867
Last-Modified: Tue, 17 Aug 2021 11:12:16 GMT
Connection: keep-alive
ETag: "611b9990-363"
Accept-Ranges: bytes
在现代环境中,许多服务都强制执行加密。例如,SMTPS 运行在 465 端口,HTTPS 运行在 443 端口。Telnet 无法处理加密连接。对于 HTTPS,请使用 TLScurl --head https://MACHINE_IP或 TLS协议openssl s_client -connect MACHINE_IP:443。对于其他使用 TLS 封装的服务,openssl s_client或 TLSncat --ssl是合适的工具。
Netcat
Netcat(简称 Netcat nc)是一款功能强大的网络工具,支持 TCP 和 UDP 协议。它既可以作为客户端连接到监听端口,也可以作为服务器监听用户指定的端口。这种双重功能使其适用于横幅抓取、端口探测、简单的文件传输以及基本的客户端-服务器通信。
语法:
nc MACHINE_IP PORT
$ nc MACHINE_IP 80
GET / HTTP/1.1 host: netcat HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Tue, 17 Aug 2021 11:39:49 GMT
Content-Type: text/html
Content-Length: 867
Last-Modified: Tue, 17 Aug 2021 11:12:16 GMT
Connection: keep-alive
ETag: "611b9990-363"
Accept-Ranges: bytes
...
Netcat 监听指定的端口
在服务器系统上,运行命令nc -vnlp 1234开始监听 1234 端口。在客户端系统上,运行nc MACHINE_IP 1234命令进行连接
| 选项 | 意义 |
|---|---|
-l | 监听模式 |
-p | 指定端口号 |
-n | 仅支持数字;不支持主机名 DNS 解析。 |
-v | 详细输出,有助于调试 |
-vv | 非常冗长的输出 |
-k | 客户端断开连接后继续监听。 |
快速参考
| 命令 | 例子 |
|---|---|
| ping | ping -c 10 MACHINE_IP在 Linux 或 macOS 上 |
| ping | ping -n 10 MACHINE_IP在 Windows 系统上 |
| ping(IPv6) | ping -6 MACHINE_IPV6或者ping6 MACHINE_IPV6 |
| traceroute | traceroute MACHINE_IP在 Linux 或 macOS 上 |
| tracert | tracert MACHINE_IP在 Windows 系统上 |
| traceroute (IPv6) | traceroute -6 MACHINE_IPV6或者traceroute6 MACHINE_IPV6 |
| mtr | mtr MACHINE_IP用于实时路径监控 |
| telnet(传统) | telnet MACHINE_IP PORT_NUMBER |
| netcat 作为客户端 | nc MACHINE_IP PORT_NUMBER |
| netcat 作为服务器 | nc -lvnp PORT_NUMBER |
| netcat(IPv6) | nc -6 MACHINE_IPV6 PORT_NUMBER |
| curl 用于 HTTP 横幅 | curl -I http://MACHINE_IP或者curl -I https://MACHINE_IP |