前阵子一个朋友的团队做上线前自查,问了句:"我们这台服务器对外到底开着哪些东西,怎么看?"——不是被攻击了,也不是要做什么渗透测试,就是单纯想弄清楚"自己家里有什么"。这种资产自查的需求其实挺常见:接老项目要交接、新服务要上线、或者单纯觉得暴露面有点多、心里没底嘛。做网络的排查做久了会发现,这类问题的答案藏在两个动作里——一个被动、一个主动。
两个动作分别管什么,一张表先摆清楚:
| 你想知道什么 | 用哪个方式 | 会接触目标吗 |
|---|---|---|
| 一个域名底下有哪些子域 | 子域发现 | 不会,只查公开数据 |
| 一台主机开了哪些端口、跑的什么服务 | 端口扫描 | 会,直接连它的端口 |
一个查域名、一个查主机;一个只读、一个主动。下面分开说,完了再聊它们怎么配合。
子域发现:先看公开情报不对目标进行操作
先说被动的那条吧。子域发现的输入是一个域名,输出是它底下的一串子域——数据从哪来?公开情报源,主要两类:证书透明度日志和被动 DNS。前者是 HTTPS 生态的"副产品":一个域名申请证书时会被记录进公开日志,查这些日志就能反推出域名下有哪些主机;后者记录的是历史上 DNS 解析的行为。两条线索交叉,一个域名的资产面就能铺开个大概。
在 TraceEagle 里,这个动作就是输入域名、点查询:几个公开源并行查,结果按来源分类展示、各带命中计数,自动去重排序,支持实时过滤和复制。单个源临时不可用或被限流也不会拖垮整体,其他源照常出结果——查公开数据嘛,本来就是"能拿到多少算多少"。
这条路的本质是"不碰目标":全程只读公开数据集,不向目标域名或它的服务器发送任何请求。所以不存在"打扰"的问题,适合接手一个域名时先把面铺开。
端口扫描:主动探测,看看主机开了什么
主动的这条逻辑就直白了:输入主机名或 IP,直接去连它的 TCP 端口,看哪些是开的。扫描过程实时显示进度和"已发现 N 个开放",每个开放端口给三列信息——端口号、服务名、Banner(服务欢迎信息;HTTP 端口则给状态行和 Server 头)。
这里有个容易忽略、但说白了很实用的点:服务识别是"端口号 + Banner"双重校正的。只按端口猜服务的扫描器,遇到把 SSH 跑在 2222、MySQL 跑在 13306 的服务器就会认错(运维改端口这事儿太常见了);抓到 Banner 之后,跑在哪个端口都能认出真实服务。
扫描范围三选一:常用端口(一批精选高频端口,默认)、全部端口(1–65535)、或者自定义(比如 80,443,8000-8100)。要不要抓 Banner 可以关掉——关了就只按端口给服务名,速度快一些。开箱即用,不需要额外驱动,也不需要啥特权。
说一句不能省的:端口扫描是主动接触目标的行为——你是真真切切去连人家的端口。所以它只适用于你自己拥有、或者明确获得授权的主机。公网上随便找台机器就扫,在很多地方是踩线的,严重的会摊上事。子域发现那条路只读公开数据,不存在这个问题;但顺着挖出来的子域去核实,同样得先有权。自查自家人,怎么扫都行;扫别人,先拿授权。
两条路怎么配合
分开看是两个功能,合起来是一套流程:被动先铺面,主动再核点。顺序能不能反过来呢?也行,就是容易多费力气。
拿自查那台服务器举例:先对主域名做一轮子域发现,把资产面拉出来——可能有二十来个子域,其中几个是官网、API、后台入口,也难免混着几个"不知道谁什么时候建的"测试环境(这种最吓人);挑出对外提供服务的那些主机,再逐个做端口扫描,看实际开了哪些端口、跑着什么服务。一轮下来,"这台服务器对外到底开着哪些东西"基本就有答案了,而且比翻部署文档靠谱——文档会过期,端口不会骗人。
再往下,端口扫描的结果可以和主机档案接上(查 IP 归属、证书信息),也可以和抓包对上(这个端口上跑的到底是什么协议,抓一段流量看看)。这几个能力在 TraceEagle 里是一个工具箱里的邻居,串起来用很顺手。
和同类工具的关系
这类活儿的专业选手大家都熟:nmap 是端口扫描的老牌工具,功能深、脚本引擎强,安全评估场景绕不开它;子域枚举那边,subfinder、amass 这些开源工具也很能打,源接得多、跑得狠。
这些工具不做替代,场景不同——它们适合"专项深挖",这里覆盖的是"手边顺手查一下":日常自查、交接摸底、上线前看一眼,不用为此单独搭一套环境和字典。真到系统性的安全评估,该请专业工具出场还是得请。
说实话,这类自查做一次不难,养成习惯可不容易。新服务上线前顺手把域名和主机的暴露面过一遍,比半年后突然发现某个测试端口还开着强不少——资产盘点这事儿和抓包一样,都属于"做的时候嫌麻烦、真出事时庆幸做过"的那一类。被动铺面、主动核点,顺序别搞反;权限问题上的也别忘了。