尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

从加密流量中还原Laravel RCE攻击链:CTF实战与安全分析

从加密流量中还原Laravel RCE攻击链:CTF实战与安全分析 1. 项目概述一次从流量到攻击链的深度追踪最近在复盘一些经典的CTF赛题和实战案例绿城杯这道Misc题目“从加密流量中还原Laravel RCE攻击链”给我留下了很深的印象。它不像传统的Misc那样只考个文件分离或者简单的协议分析而是把流量分析、Web漏洞原理和实战攻击链复现完整地串联了起来。题目给了一个加密的流量包要求我们从中抽丝剥茧找到攻击者利用Laravel框架反序列化漏洞CVE-2021-3129进行远程代码执行RCE的完整证据链。这不仅仅是在找flag更是在模拟一次真实的安全事件应急响应IR过程。对于刚接触安全分析的朋友来说这道题是个绝佳的综合性练习。它要求你具备几个维度的能力首先是基础的网络流量抓取和分析能力知道如何在看似杂乱的数据包中定位到关键的HTTP/HTTPS会话其次是对Web应用框架特别是Laravel的运作机制要有一定了解否则你无法理解那些看似奇怪的请求到底在做什么最后也是最重要的是具备攻击者思维能够将分散在流量中的“线索点”如特殊的POST数据、异常的Cookie、服务器返回的错误信息像拼图一样组合起来还原出攻击者从信息探测到漏洞利用再到最终执行命令的完整路径。接下来我就结合这道题把整个分析思路和实操过程拆解一遍希望能帮你建立起一套分析类似问题的框架。2. 核心思路与工具准备我们到底要分析什么拿到一个流量分析题目尤其是涉及加密流量的最忌讳的就是一头扎进Wireshark里漫无目的地翻看。我们必须先明确分析目标。这道题的核心目标是“还原Laravel RCE攻击链”。这直接指明了几个关键方向第一流量中必然存在针对Laravel应用的HTTP(S)请求。攻击者是通过Web接口发起攻击的所以我们的首要任务是在所有TCP流中筛选出HTTP协议的数据。第二攻击利用了CVE-2021-3129漏洞。这是一个Laravel框架中由于Ignition组件默认的错误报告页面对反序列化操作处理不当而导致的安全漏洞。攻击者可以通过发送精心构造的POST请求在服务器上执行任意PHP代码。因此我们需要在HTTP流量中寻找与/index.php、/vendor/laravel路径相关特别是包含序列化数据可能以O:、a:、s:等开头的字符串的请求。第三题目提到“加密流量”。在CTF和实战中这通常意味着流量是经过TLS/SSL加密的即HTTPS。如果没有提供服务器的私钥我们无法直接解密内容。但出题人往往会“留后门”比如在题目描述或附件中暗示使用了某些已知的、可解密的加密方式如SSLKEYLOGFILE或者流量包中其实包含了前置的、未加密的通信如HTTP请求或用于协商密钥的Client Hello包其中可能泄露了关键信息。基于以上分析我们的技术路线就清晰了初步侦查用Wireshark打开流量包快速浏览协议分层统计判断主要协议构成TCP/HTTP/SSL。会话筛选聚焦到HTTP和SSL/TLS协议追踪TCP流查看明文部分。关键请求定位在HTTP流量中寻找方法为POST、路径特征为Laravel、数据体可疑的请求。数据提取与解码从请求中提取出可能的攻击载荷Payload这些载荷可能是Base64编码、URL编码或直接序列化字符串需要逐层解码分析。攻击链重构将解码后的Payload与CVE-2021-3129的漏洞利用原理结合解释每一步攻击者意图并最终还原出执行的系统命令从而拿到Flag。工具准备清单Wireshark流量分析核心工具必备。NetworkMiner或Xplico辅助工具可以更直观地提取流量中的文件、会话信息有时能更快发现异常。CyberChef在线或离线版“瑞士军刀”式的编解码工具用于处理Base64、URL Decode、Hex Decode等操作非常方便。文本编辑器如VS Code, Sublime用于查看和整理提取出来的大量文本数据。PHP环境可选用于本地验证反序列化Payload加深理解。注意在真实环境中分析HTTPS流量如果没有私钥几乎不可能解密。但在CTF中这往往是一个“障眼法”或解题的突破口。务必仔细检查题目描述、注释或流量包中是否包含任何可用于解密的信息例如一个名为“sslkey.log”的文件或者流量中是否存在早期未启用加密的会话。3. 实操解析一步步拆解加密流量中的攻击痕迹3.1 流量包初探与协议聚焦用Wireshark打开提供的.pcapng或.pcap文件。第一步不是看具体数据包而是点击菜单栏的“统计” - “协议分级”。这个视图会告诉你这个流量包里各种协议的占比。我们预期会看到大量的TLSTransport Layer Security协议这证实了“加密流量”的说法。同时也应该能看到HTTP或TCP协议。接下来在Wireshark主界面的过滤栏输入http or ssl过滤出所有HTTP和SSL/TLS协议相关的数据包。这样能排除掉大量的底层TCP握手、ACK包等噪音让我们聚焦在应用层通信上。浏览过滤后的数据包列表寻找明显的HTTP请求。通常一个完整的HTTP会话会以GET或POST请求开始。你可以右键某个HTTP包选择“追踪流” - “TCP流”Wireshark会以对话形式展示客户端攻击者和服务器靶机之间的完整通信内容。这里要特别留意以下几点Host头与路径查看请求的Host字段和URL路径。如果目标是Laravel应用路径中可能会包含/index.php、/public/或直接是一些路由路径。题目可能为了简化直接让应用运行在根路径下。Cookie与User-Agent攻击者有时会使用特征明显的User-Agent或者Cookie中包含调试信息。但更关键的是Laravel的会话Cookie通常名为laravel_session本身是一个序列化后加密的字符串虽然我们无法直接解密但它的存在可以帮助我们确认目标应用是Laravel。POST数据这是重中之重。任何携带大量、看似乱码数据的POST请求都值得高度怀疑。数据可能出现在application/x-www-form-urlencoded或multipart/form-data格式中。3.2 定位关键攻击请求与载荷提取在追踪了数个TCP流后你大概率会发现一个或多个非常“扎眼”的POST请求。它的内容长度Content-Length会比较大数据体看起来是一长串毫无规律的字符可能混合了字母、数字和特殊符号。以一道典型题目为例你可能会发现一个POST请求到/index.php其数据体类似于dataJTJGd3d3JTJGJTNBJTJG...很长一串或者直接是s:6:secret;O:40:Illuminate\Broadcasting\BroadcastEvent:1:{s:10:connection;O:47:Illuminate\Broadcasting\InteractsWithSockets:0:{}}...第一种情况data参数的值看起来像Base64或URL编码。在Wireshark的“追踪TCP流”窗口你可以直接复制这一长串值。然后打开CyberChef将复制的字符串粘贴到“Input”框。第一步尝试URL Decode因为Web传输中、等特殊字符经常被URL编码。在CyberChef的“Operations”中搜索“URL Decode”并添加。如果解码后的结果仍然是一串以结尾的字符串那么它很可能是Base64。第二步尝试Base64 Decode在“Operations”中添加“From Base64”操作。解码后你可能会看到清晰的PHP序列化字符串或者是一段PHP代码。如果像第二种情况直接看到了经典的PHP序列化字符串格式如O:表示对象a:表示数组s:表示字符串那么你已经找到了核心的攻击载荷。实操心得在Wireshark中直接查看TCP流数据可能夹杂着HTTP头和非打印字符不方便复制。一个更高效的方法是在找到关键数据包后右键该包 - “复制” - “...as a Hex Stream”或“...as Printable Text”然后粘贴到文本编辑器里进行清理只保留data之后的部分。或者使用Wireshark的“文件” - “导出对象” - “HTTP”功能可以直接将整个HTTP请求体保存为一个文件方便后续分析。3.3 解密CVE-2021-3129的攻击载荷现在我们假设已经提取出了一段PHP序列化字符串。它可能长这样这是一个高度简化的示例真实攻击载荷更复杂O:40:Illuminate\Broadcasting\BroadcastEvent:1:{s:10:connection;O:47:Illuminate\Broadcasting\InteractsWithSockets:1:{s:10:broadcaster;O:38:Illuminate\Broadcasting\Broadcasters\LogBroadcaster:1:{s:10:connection;s:6:system;}}}这段Payload利用了Laravel框架内部类的反序列化链。简单解释一下O:40:Illuminate\Broadcasting\BroadcastEvent表示实例化一个名为BroadcastEvent的类对象。这个对象有一个属性connection其值又是一个InteractsWithSockets对象。以此类推最终链式调用到了system函数。在PHP反序列化过程中当对象被还原时其__destruct()或__wakeup()魔术方法会被自动调用攻击者就是通过精心构造的类属性让这些方法的调用链最终执行system()函数。在CVE-2021-3129的利用中攻击者会将此序列化字符串作为值发送给Laravel Ignition组件的一个特定端点例如/index.php并带有特定的查询参数或者直接通过POST到某个路由。Ignition在处理错误日志时会错误地对用户输入进行反序列化操作从而触发这条链执行system()函数中指定的命令。在我们的流量分析中下一步就是找出攻击者通过这个漏洞具体执行了什么命令。这需要我们在解码后的数据中继续深挖。通常攻击者会将待执行的系统命令如whoami、ls /、cat /flag等作为参数嵌入到上述对象链的某个属性值中。例如在更完整的Payload里你可能会发现s:6:system;后面跟着s:13:cat /flag.txt;这样的结构。这意味着反序列化后最终执行的命令是cat /flag.txt。关键技巧有时攻击者会对命令进行编码如Base64以绕过简单的WAF检测。因此即使你找到了像s:28:ZWNobyAiSGVsbG8gV29ybGQiOw;这样的字符串也要意识到它可能是Base64编码的PHP代码echo Hello World;或系统命令。务必在CyberChef中对其进行Base64解码查看原始内容。3.4 从服务器响应中确认攻击成功一个完整的攻击链不仅要有攻击请求还要有服务器的响应。攻击是否成功往往体现在服务器的返回数据中。在Wireshark中定位到那个可疑POST请求之后的数据包。通常下一个或下几个从服务器发往客户端的包就是HTTP响应。追踪这个响应的TCP流。你需要重点关注HTTP状态码虽然是漏洞利用但服务器可能仍然返回200 OK只是在响应体中包含了命令执行的结果。也可能返回500 Internal Server Error但错误信息中泄露了关键数据。响应体内容这是寻找Flag或命令执行结果的关键位置。如果攻击者执行了ls响应体里可能会出现目录列表如果执行了cat /flag那么Flag很可能就直接明文出现在响应体的HTML源码或纯文本中。响应头有时服务器错误配置会在响应头如X-Powered-By、Server中泄露PHP版本、Laravel版本信息这侧面印证了漏洞环境。在分析响应体时同样要注意编码。结果可能是纯文本也可能是HTML实体编码如lt;代表或Base64编码。使用CyberChef的“Render Image”操作有时能直接显示图片结果如果命令是截图之类的。4. 攻击链完整还原与报告撰写将以上所有步骤的发现串联起来我们就能够还原出完整的攻击链侦查阶段攻击者可能先发送了普通的GET请求如GET / HTTP/1.1来确认目标是一个Laravel应用通过查看响应头中的Set-Cookie: laravel_session或页面特征。漏洞探测与利用攻击者直接构造了针对CVE-2021-3129的恶意POST请求将包含反序列化链和系统命令的Payload发送到目标服务器的特定端点如/index.php。命令执行与回显服务器端的Laravel Ignition组件错误地反序列化了该Payload导致链式调用触发最终执行了嵌入的系统命令例如find / -name \*flag*\ 2/dev/null或cat /var/www/html/flag.php。结果获取命令执行的标准输出stdout被捕获并混入了服务器的HTTP响应中返回给攻击者。攻击者从响应体中读取到了目录结构、文件内容或直接的Flag字符串。在CTF解题报告中你需要清晰地展示这个链条。而在真实的应急响应报告中你还需要补充时间线精确到毫秒的攻击发生时间。源IP与目的IP/端口攻击来源和受害资产。载荷详解解码后的完整Payload并解释其每一部分的含义。影响评估攻击者成功执行了哪些命令可能窃取了什么数据或造成了什么破坏。处置建议立即升级Laravel框架及Ignition组件、检查服务器是否被植入后门、修改相关凭证等。5. 常见问题与排查技巧实录在实际操作中你肯定会遇到各种问题。下面是我总结的一些常见坑点和解决技巧问题1流量包里全是TLS找不到任何HTTP明文过滤http什么都没显示。排查思路这说明所有HTTP通信都走了HTTPS。尝试过滤tls.handshake.type 1这是Client Hello包是TLS握手的开始。找到它看它的目的IP和端口通常是443。然后对这个IP和端口组合进行TCP流追踪过滤ip.addr x.x.x.x tcp.port 443。虽然内容加密但你可以观察数据包的长度和交互频率。攻击请求的POST包通常数据量明显大于普通GET请求。你可以尝试导出这些加密的TCP流数据有时题目设计时会在流量中“不小心”包含了一个可导出的SSL会话密钥文件通过Wireshark的Edit - Preferences - Protocols - TLS可以指定(Pre)-Master-Secret log filename。如果题目附件中有.log或.key文件一定要试试。问题2找到了可疑的POST数据但解码后是一堆乱码不像PHP序列化字符串。排查思路检查编码层数可能经过了多重编码。尝试在CyberChef中组合多种解码操作如 URL Decode - Base64 Decode - Hex Decode。顺序可以调换尝试。检查是否被压缩攻击者有时会用gzcompress或gzencode压缩Payload。在CyberChef中尝试“Raw Inflate”或“Gunzip”操作。查看原始十六进制在Wireshark中将数据包详情面板切换到“分组字节流”视图直接看十六进制值。有时Payload的开头会有特征字节如Gzip压缩的1f 8b 08或者PHP序列化对象的4f 3a即O:的十六进制。问题3解码出了序列化字符串但看不懂结构无法定位执行的命令。排查技巧格式化将长长的序列化字符串复制到支持PHP的在线美化工具或本地IDE中根据花括号{}和分号;进行缩进格式化使其结构清晰。关键词搜索在格式化后的字符串中搜索system、exec、shell_exec、passthru、eval等危险函数名。关注字符串值搜索s:后面跟着的数字和引号内的内容就是字符串值其中很可能包含系统命令。例如s:10:cat /flag;。本地验证谨慎如果实在无法理解可以在一个完全隔离的、无网络连接的测试PHP环境中尝试反序列化这个字符串使用unserialize()函数并打印出反序列化后的对象结构。警告切勿在生产环境或连接互联网的机器上操作未知Payload问题4在服务器响应里看到了疑似命令输出的内容但夹杂在大量HTML中很难找。解决技巧过滤HTML标签在CyberChef中使用“Strip HTML Tags”操作可以快速清除所有HTML标签只留下纯文本。搜索关键词在响应体中直接搜索flag、root、www-data、/etc/passwd、ls、cat等关键词。查看差异对比攻击前一个正常的HTTP响应和攻击后的响应差异部分很可能就是命令执行的结果。问题5感觉所有步骤都对了但就是找不到Flag。终极检查清单Flag格式确认比赛或题目规定的Flag格式如flag{...}、CTF{...}、SECCON{...}。用正则表达式在全部提取出的文本中搜索。响应包顺序攻击者可能执行了多个命令如先ls再cat。确保你查看了攻击请求之后的所有服务器响应包不仅仅是紧接着的那一个。隐蔽通道Flag可能不在HTTP响应体中而是攻击者通过其他方式获取的比如将命令结果写入一个Web可访问的文件再通过另一个GET请求去读取。检查流量中是否有短时间内对某个新URL如/tmp/result.txt的访问。数据提取完整性你是否提取了所有TCP流的内容Wireshark的“文件”-“导出对象”-“HTTP”功能可以一次性列出所有HTTP传输的文件检查是否有被遗漏的文本或文件。这道“绿城杯”的题目完美地将Misc的流量分析与Web安全的漏洞利用结合了起来。它告诉我们安全分析不是一个孤立的技能点。当你面对一个加密的流量包时你需要网络协议知识、需要Web应用框架知识、需要漏洞原理知识更需要像侦探一样的逻辑串联能力。通过这样一道题的实战你收获的不仅仅是一个Flag更是一套应对真实世界网络攻击溯源的分析方法论。下次再看到“加密流量”和“RCE”出现在同一个题目里你应该能会心一笑知道从哪里开始下刀了。
返回列表