☰
从运维到安全:用应用层协议重新解读数据包
2026/10/11 17:26:02 网站建设 项目流程

1. 重新拿起抓包工具:同样的数据包,完全不同的解读方式

离开运维行业快十年,再回到网络安全这行,最强烈的感受不是技术更迭有多快,而是——同样一个数据包,十年前我看它和现在看它,完全是两个世界的东西。

当年做运维,抓包排障是基本功。某个应用响应慢了,接口报错了,我先看链路通不通,再看端口通不通,接着抓包看握手有没有完成,重传率高不高。那时候脑子里想的是“连通性”和“性能”,看的是三次握手、窗口大小、RTT这些指标。数据包对我来说是排障的线索,只要它能顺畅地从A点到B点,我的工作就结束了大半。

可现在站在安全视角重新看同一个数据包,问题完全变了。我首先想的是:这个连接是谁发起的?它的目的端口为什么是445而不是80?这个HTTP请求里为什么带着一段十六进制编码的字符串?DNS查询的域名为什么像一串随机字符后面跟着一个看起来正常的根域名?这些在过去会被我直接略过的“边缘信息”,现在恰恰是攻击者在网络里留下的脚印。

之所以说应用层协议是重新入行者的第一站,是因为今天的攻击几乎都发生在应用层。十年前做运维时,我们防的是外部扫描、端口探测,防火墙一挡,感觉就安全了。但现在的威胁模型完全不同:攻击者不需要打得穿防火墙,只需要在一个合法的HTTP请求里藏一段恶意载荷,在一个正常的DNS查询里夹带数据,在一条看似无害的HTTPS连接里执行远程指令。防火墙放行80和443是因为业务需要,而攻击者就顺着这些“必须开放”的口子进来了。

所以这篇文章我不会去背协议标准。我更想从“一个干了十年运维、刚转回安全的人”的视角,说说重新理解应用层协议时那些真正改变我思维方式的东西,以及在实际分析和溯源工作中,这些协议细节是怎么被用起来的。如果你也是从运维、开发这类“建设方”角色转来做安全,这篇文章应该能帮你省下不少自己摸索的时间。

2. 为什么说应用层是安全的主战场:绕开系统层,直捣业务层

2.1 从三次握手到七层模型:运维知识没有白费,但需要换一种使用方法

很多人觉得转行安全要“忘掉过去重学”,我反而不这么看。运维底子不仅不浪费,而且是安全分析里非常稀缺的能力。关键在于换一个角度去用它。

当年调试链路问题,我脑子里有完整的TCP状态机:SYN_SENT、SYN_RCVD、ESTABLISHED、FIN_WAIT……这套东西在分析安全事件时依然好用。比如看到大量SYN包发出去却没有回应,第一个反应可能是“这机器被扫了”,或者是“有程序在尝试外连”。再往下追,就要看是谁发起的、目标是什么端口、源端口有什么规律,这些全都要回到传输层的基础上来分析。

但安全工作和运维有一个根本区别:运维的目标是让流量“正常跑起来”,安全的目标是判断流量“正不正常,不正常到什么程度”。运维关注的是协议“按标准工作”,安全关注的是协议“有没有被歪用”。同一个HTTP头,运维确认格式对不对;安全分析则要追问:这个User-Agent常见吗?这个Content-Type和实际内容匹配吗?这个Cookie的值为什么长度异常?

这就是我前面说的“换一种使用方法”。TCP/IP的基础知识是你的地基,但在安全领域,你真正要精耕的是地基之上那个最复杂、最多变、最容易被滥用的部分——应用层。

2.2 应用层为什么是攻击者的“舒适区”

攻击者不是随机选择攻击层的,他们选应用层,有非常现实的原因。

第一,应用层暴露面最大。任何对外开放的业务系统,Web界面、API接口、邮件服务、文件共享,全都跑在应用层。你能在防火墙后面藏住一个IP,但藏不住业务本身——一个面向用户的网站就必须让全世界都能访问到443端口。

第二,应用层的数据结构最复杂。TCP层的数据是一段字节流,而应用层要把这段字节流拆解成有意义的请求、响应、命令、参数。这个“拆解”的过程,就是攻击者做手脚的地方。多一个参数、编码方式换一下、请求方法改一下,解析结果就会完全不同。

第三,应用层协议是“人写得最多,写错也最多”的地方。操作系统内核有几十年沉淀,很难出低级漏洞;但业务代码是每个公司自己写的,水平参差不齐。一个开发者写的登录接口,可能连基本的输入过滤都没做。

我在实际排查中见过太多这样的案例:某公司自己的系统明明只该接收JSON请求,却有人用multipart/form-data的方式提交了一个登录表单,然后在文件名字段里塞了一段命令。如果只看IP层、TCP层,这段流量和正常请求毫无区别。只有在应用层解析之后,恶意意图才会暴露。

这就是为什么我们说“安全的主战场在应用层”——因为攻击在这里最省力、成功率最高、手段最多样。而防御方要做的,就是把每一层协议的“正常情况”吃透,才能第一时间发现那些“不太对劲”的流量。

3. 三个必须吃透的应用层协议:HTTP、DNS、FTP/SMB

3.1 HTTP/HTTPS:最庞大的攻击面,也是最练功的协议

如果要给应用层协议的重要性排个序,HTTP/HTTPS毫无争议排第一。今天的Web攻击、API攻击、爬虫、数据泄露,几乎都绕不开HTTP。

先说说HTTP本身。它是纯文本协议(加密的是TLS层,HTTP本身的结构没变),请求行、请求头、请求体三个部分,每部分都有文章可做。

请求行里最直观的就是方法。GET、POST之外,PUT、DELETE、OPTIONS、PATCH这些不太常用的方法经常被忽略,但往往是问题所在。我之前分析过一个事件:内部某台服务器对外发起大量请求,特征就是用了DELETE方法访问一个公开API,而且每次删除之后都会立刻重新PUT一个新值。如果只看“有没有流量外传”,这个问题根本发现不了;但当你在HTTP层观察“方法序列不合理”,异常就浮出来了。

请求头是另一个高发区域。User-Agent是重灾区。扫描器、恶意脚本、自动化工具都有特征明显的UA,这也是很多WAF做拦截的基础。但也有攻击者故意伪装成浏览器UA,这时候光看UA就不够了,要结合行为特征——一个声称是Chrome的UA,却保持着每秒20个请求的频率,明显就不合理。

请求体则是注入类攻击的藏身处。SQL注入、命令注入、反序列化攻击,很多都隐藏在POST请求的body里。我学到的一个重要经验是:不要只看参数名和值,要看参数的类型和结构。一个正常的id=123和一个id=1 OR 1=1,格式上完全不一样。这也是“内容安全”和“流量安全”的分界线——只在网络层做防护,根本看不到这层差异。

再说HTTPS。加密流量是今天所有安全分析人员绕不过去的坎。十年前做运维时,我只需要知道证书没过期、握手能成功就够了。现在做安全,加密流量里藏着大部分的攻击行为,看不穿就只能靠其他手段做侧写——比如连接时长、数据包大小分布、TLS握手指纹。

TLS握手指纹是个好东西。简单说,每个TLS客户端在握手中提交的密码套件列表、扩展项顺序都不太一样,这些信息的组合可以形成一个“指纹”,用来识别这个客户端是什么软件。常见的开源库、恶意软件都有自己独特的指纹。在这上面我吃过亏,一开始只盯着解密流量,忽略了对握手阶段的分析,结果漏掉了一个疑点——后来才意识到,攻击者根本不需要等加密内容被解出来,光握手就能暴露身份的一部分。

3.2 DNS:看似简单的协议,却能干很多“大事”

DNS可能是应用层协议里最不起眼的一个,但恶意软件最爱用它。

DNS的流量特征是:数据包不大、UDP传输、查询频繁。企业网络里默认就允许内网机器访问外部DNS服务器。攻击者利用的正是这份“默认信任”。

最典型的是DNS隧道。原理不复杂:把想传的数据拆成小块,编码进DNS查询的域名里,比如你要传的数据.某个公网域名;接收方在自己的DNS服务器上记录查询日志,再把数据拼回去。这个过程从网络侧看只是无数条DNS查询,完全淹没在正常流量里。很多公司防火墙拦截了所有非标准端口的外连,但唯独放行UDP 53,因为业务查询域名总要解析——DNS隧道就顺着这个口子出去了。

我自己做过一次实验,在一个只放行DNS和HTTP外连的环境里,用现成的DNS隧道工具传一个几MB的文件。结果网络侧几乎没有任何告警,只有一台专用服务器上的查询日志记录了所有数据分片。这个实验给我留下的印象极深——它说明如果一个安全团队连DNS流量都不监控,就相当于在自己门口留了一条小路,专门供人搬运东西。

除了隧道,DNS还用来做僵尸网络的指令下发。恶意软件定期向某个域名发起查询,频率像心跳一样。域名的含义对人类来说毫无意义,但对恶意软件却是一个“约定好的信号”。我在分析一个内网异常时,靠的就是发现一台机器每过5分钟查询一个由随机字符构成的域名,后来确认是某种下载器的回连行为。

所以做安全分析,DNS必须重视。不是说要把每个查询都抓下来分析,而是要对“异常的域名结构”“异常的查询频率”“异常的解析结果”保持敏感。

3.3 FTP与SMB:时代遗留的协议,仍然是内网渗透的经典入口

如果说HTTP是外网攻击的主战场,那FTP和SMB就是内网渗透的老路。

FTP这个协议我太熟悉了,早年运维时传文件基本靠它。它最大的弱点在哪里?控制信道和数据信道分离。FTP用一个21端口做控制,另一个随机高位端口做数据传输。防火墙往往只放行了21端口,但实际数据连接跑在随机端口上——于是出现了“控制通了,数据传不了”这种运维经典问题。这个特性在安全上同样是个漏洞:攻击者可以通过FTP的PORT命令让FTP服务器向任意IP和端口发起连接,造成所谓的FTP反弹攻击。一个处于内网的FTP服务器,可以被外部攻击者当作“跳板”去扫内网其他主机。

SMB则是Windows网络共享的核心协议。当年运维中我见到SMB就像见到空气一样自然——打印机、文件共享、组策略下发,全都跑在它上面。可它的历史包袱非常重:早期版本为了兼容,留下了大量复杂的消息类型和机制,这也让SMB成为远程漏洞的重灾区。更重要的是,SMB天生是“内网协议”,它假设内网是可信的。一旦攻击者拿到了内网的任何一台机器,SMB就成了他们横向移动最顺手的工具:枚举共享、尝试弱口令、利用漏洞执行远程代码。

我在一次内网应急里复盘过一个感染链路:入口是某台服务器上的Web漏洞,攻击者拿到权限后,没有急着外传数据,而是先用SMB枚举整个网段的共享资源,找到一台设置了弱口令的文件服务器,然后通过计划任务横向跳了过去。整个过程全是“正常功能”的调用——共享访问、文件拷贝、计划任务创建。没有一次使用漏洞,没有一次使用越权行为,纯粹就是靠协议功能本身做坏事。

这就是FTP和SMB这类“老协议”的难防之处:它们的功能设计是合法的,但同样一批功能,在不同的人手里可以变成完全不同的用途。安全人看协议,除了看“怎么实现的”,更得看“怎么被歪用的”。

我整理了一个表格,把这三个协议从“运维视角”和“安全视角”做对照,方便转行的人快速建立思维转换:

协议运维关心的核心能力安全关注的核心风险
HTTP/HTTPS连通性、响应时间、缓存策略注入、漏洞利用、恶意载荷、API滥用、数据窃取
DNS解析速度、缓存命中率、可用性隧道外传、恶意域名回连、隐蔽通道、劫持
FTP / SMB传输效率、鉴权配置、共享权限反弹链接、弱口令、横向移动、蠕虫传播与漏洞利用

4. 应用层分析的实战方法:从流量里看出“人味儿”

4.1 把抓包工具用出安全分析的味道

抓包工具还是当年那几款,但用法已经完全变了。

版本选型上,命令行下的分析我用tcpdump抓原始包,再用tshark做字段级过滤。图形界面我用Wireshark做深入交互分析。这里有个“从运维转安全”的人最容易犯的错:抓包抓得太晚。做运维时一般是问题出现了才抓包,抓到的往往只是问题发生后的后半段。做安全分析,必须在可疑行为一开始就持续抓取、保留完整链路,不然事后回溯时,关键的第一跳流量早就没了。

实际操作时,我会先做粗过滤把总体流量跑一遍,重点看以下信息:

# 统计所有IP对之间的会话量 tshark -r capture.pcap -q -z conv,ip # 只看HTTP请求,带方法、URI和UA tshark -r capture.pcap -Y "http.request" -T fields \ -e http.request.method -e http.host -e http.uri -e http.user_agent # 只看DNS查询 tshark -r capture.pcap -Y "dns.flags.response == 0" -T fields \ -e dns.qry.name -e dns.qry.type

这三条命令在过去排障时也会用,但目的不同。现在我会特别关注“比例”——比如某个IP的请求方法几乎全是POST,占99%以上;正常业务POST占比高不是不可能,但要看POST对应的URI是否集中在特定路径上。如果POST分散、GET极少、UA还各不相同,这往往是自动化的扫描行为而不是真人操作。

Wireshark的“Conversation过滤”和“Follow Stream”这段时间我用了特别多。Follow TCP Stream可以直接把一次会话的请求和响应拼成可读内容,虽然HTTPS下看到的只是密文,但HTTP下能直接看到整个对话过程。有一次分析某个被入侵的Web服务器,就是这么一路Follow下来,看到了攻击者通过一个命令执行漏洞,在服务器上逐条输入命令的完整记录——从创建目录,到下载工具,再到关闭防火墙,整个过程就像在眼前操作一样清晰。

4.2 特征层面的倾斜:正则、指纹与行为基线

抓包看多了以后,你会形成一种“流量直觉”——哪个IP不对劲,哪个端口组合可疑,扫一眼就知道。但这种直觉不能只靠感觉,得沉淀成特征和规则。

正则匹配是基础手段。比如HTTP响应中的报错信息,很多注入类攻击在成功触发时会在响应里带上数据库报错内容。通过特征正则,可以快速把所有疑似SQL注入的请求筛出来。但这个做法有明显局限:只要攻击者稍加编码、分段、转换,正则就会被绕过。

指纹匹配是更高一层的手段。前面提到TLS握手指纹,还有JARM指纹(一种基于TLS服务器响应风格的指纹)、HTTP头顺序指纹等。攻击者可以改UA、改载荷内容,但很难完全抹掉自身工具的指纹特征——因为他们用的代码库、默认参数、加密套件偏好已经固化了。有一次,一批攻击请求的UA伪装成了最新版本的浏览器,但请求头里HTTP头部的顺序和那个版本浏览器的真实顺序不一致,明显是从别处抄来的UA字符串贴在了错误的工具上。这类细节,光看单个请求是发现不了的,一对比就露馅。

行为基线则是最高最难的一层。拉长时间窗口,把一台主机连续几周的对外连接记录下来,建立“它平时是什么样子”的基线。新出现的目标、异常的请求频率、奇怪的端口组合,在这些基线面前都会显得刺眼。运维背景的人做这件事有天然优势:我们本来就熟悉“正常的系统该长什么样”,这个直觉放在行为基线里,非常有价值。

4.3 案例分析:一段异常加密流量是如何被“扒开”的

分享一个实际的排查过程,不算特别复杂,但很能说明问题。

某天值班同事发现一台内网Linux服务器的带宽占用异常,长时间维持在高速状态。一开始怀疑是有人下载大文件,但从系统进程里找不到任何大流量进程,CPU负载也不高。排到网络侧后发现,占用带宽的是一批持续的加密TCP连接,目标都是海外的一个IP,端口是443。从传输层看,一切“正常”——连接稳定、重传率低、收发对称。

问题就出在“太正常”了。如果是业务请求,请求量应该随着时间有明显波动;但这台服务器的连接是恒定、匀速、7x24不间断的。正常的业务流量是人产生的,人的活动有昼夜节律,哪怕是自动任务也会有周期调整。而这种恒定连接更像是一台机器在按固定速率发送数据。

接着往下钻。这批连接的TLS握手指纹不属于任何主流的操作系统或浏览器的表现——既不是Windows的Schannel,也不是Linux的OpenSSL、Nginx、Apache等常见组合,而是一个我们不认识的密码套件顺序。仔细核对后发现,它指向的是一个开源的数据传输工具。为什么确认?因为那个工具默认会启用一个特定扩展且顺序固定,这个特征在正常浏览器里几乎不出现。

最后通过DNS解析记录和对连接目标的资产信息分析,确认这台服务器被植入了后门,数据正在以加密流量的形式加密外传。整个过程没有解密任何HTTPS内容,全靠握手指纹、行为特征和连接形态就完成了判别。

这个案例给我们的启发很直接:安全分析不能死磕“解不开密就没办法”。流量里除了加密部分,还有大量明文元数据——连接时长、数据大小、频率、目标、TLS参数。这些信息配合起来,往往已经足以形成高置信度的判断。

5. 给回归者的应用层协议学习路线:别上来就啃标准文档

5.1 从抓包开始而不是从文档开始

很多转安全的人一上来就去读RFC文档,这个习惯我不太推荐。RFC是给实现者看的,描述了“协议长什么样”,但安全分析需要的是“协议在实际流量中长什么样”。这两者之间有不小的差距:真实流量里各种厂商实现不规范、兼容性处理、私有扩展、反向代理改写,都让流量形态比标准复杂得多。

我的建议是反过来——先抓包,再看文档。

第一步:抓一段自己的浏览流量。打开Wireshark,访问一个普通网站,把过程中的流量存下来。然后一条一条看,哪些是DNS查询,哪些是TCP握手,哪些是TLS握手,哪些是HTTP请求。你很快会发现,一个页面加载会产生几十上百个请求,每个请求都有完整的生命周期。这段经验是任何文档都给不了的。

第二步:带着问题去读文档。当你在流量里看到某个字段看不懂,比如Accept-Encoding: gzip, deflate, br里的br是什么,再去查RFC和相关资料。那个时刻的学习效率是最高的,因为你有真实的例子在手上,一查就懂,一懂就能用。

第三步:主动制造异常流量。比如用curl向某个端口发一些非常规的请求,看看服务器的响应有什么不同;或者用一个简单的Python脚本发送畸形HTTP请求,观察服务端会不会报错、会不会崩溃。这类主动探测能帮你快速建立“异常长什么样”的感觉。

5.2 值得长期跟踪的“实验台”:本地环境自建

学习应用层协议安全,最忌讳只看理论不实践。我建议花一晚上时间,在本机建一个实验环境,成本低、效果好。

在本地用容器模拟一套业务系统:一个Web服务负责登录和文件上传,一个解析服务负责把数据加工后入库,中间加一层Nginx做代理。然后分别从“正常用户”“攻击者”两个身份访问这条链路——正常用户就是打字访问,攻击者则尝试在参数中拼接特殊字符、绕过上传后缀限制、以极端参数值触发服务端异常。

做完这一步,再用抓包工具把两边的流量分别存下来。你会发现:正常请求和恶意请求在流量层面有明显差别。攻击者的请求大概率会带着探测性参数、非常规的Content-Type、额外的方法调用。这种“对照样本”做得越多,你对恶意流量的敏感度就越高。

也推荐平时多看看开源的安全测试工具生成的流量特征,比如各种扫描器、渗透测试框架默认的请求长什么样。了解这些工具的指纹之后,当你在真实流量里看到同款指纹,就能立刻锁定攻击工具。

5.3 常见误区清单:转安全后最容易踩的坑

结合我自己这两个月的经历,列了几个转行过程中最容易踩的坑:

误区一:什么都想抓,什么都想存。存储永远是有限的,全量抓包在企业环境里根本扛不住。要懂得分层留存:短周期的全量抓包用于深度分析,中周期的连接日志(五元组、时间戳、字节数)用于行为回顾,长周期的告警事件用于战略分析。这个“分层”的思路我在运维时期就熟悉,转到安全后依然适用。

误区二:只关注有没有“攻击特征”,不关注“正常长什么样”。高级攻击者最擅长的就是藏进正常流量里,去掉显著特征。如果你不知道正常的基线,看到什么都会觉得“好像没问题”。建立行为基线是安全运营里最花时间但最值得做的事。

误区三:看到加密流量就跳过。加密不等于安全,加密只是把内容藏起来了。还有很多非内容维度可以参考——证书的颁发史、JARM指纹、流量形态、连接模式,都能提供分析线索。

误区四:忽略协议“被歪用”的可能性。这是从运维转安全最需要扭转的一点。运维思维是“协议是做这个用的”,安全思维是“协议在这个场景下居然可以被这样用”。举个最简单的例子:HTTP的TRACE方法,正常情况下几乎没人用,但它可以被用来做跨站追踪攻击。如果没有“歪用”的思维,你会觉得所有TRACE请求都是噪音。

6. 最后说几句掏心窝的话

离开运维十年再回来,我的一个深切的体会是:技术变了,思维方式也得跟着变,但“底层逻辑”这东西是一通百通的。

十年前我理解一台服务器,靠的是进程、端口、日志、性能计数器;现在理解一次攻击,靠的是连接、协议、特征、行为模式。表面看是完全不同的知识体系,骨子里都是同一件事——“通过可观测的信息,还原藏在背后的真实活动”。做运维的还原的是业务异常,做安全的还原的是恶意行为。这个底层能力,十年前培养起来,如今依然直接可用。

如果你和我一样从运维、开发阵营转过来,我建议你在应用层协议上多花点时间,别急着去学那些花哨的攻防技巧。协议是流量分析的底层语言,在这一层扎得越深,后面做入侵分析、威胁狩猎、应急响应都会顺手很多。

至于下一步的内容,我打算往TLS协议和加密流量分析再走一步。目前手头正整理一批“看起来正常但实际可疑”的加密连接样本,里面有不少有意思的细节。到时候写出来,应该能做一些内容上的延伸。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询