哥斯拉GodzillaV4版本 WebShell木马(php)通信解密分析
字数 990 2025-09-01 11:26:02

哥斯拉Godzilla V4版本WebShell木马通信解密分析教程

一、概述

本教程详细讲解如何解密哥斯拉(Godzilla)WebShell V4版本的加密通信流量,包括请求和响应的解密过程。哥斯拉V4版本采用了多层加密技术:XOR异或加密 + GZIP压缩 + Base64编码 + URL编码。

关键特征:

  • 默认加密密钥:3c6e0b8a9c15224a
  • 加密流程:PHP序列化数据 → GZIP压缩 → XOR加密 → Base64编码 → URL编码
  • 解密流程:URL解码 → Base64解码 → XOR解密 → GZIP解压

二、原始数据示例

HTTP请求示例

key=fL1tMGI4YTljMX78f8Wo%2FyhTV1ECWEn3M%2BF4ZGJ%2BL2Iz5Ep7TupOFkzm%2Bhr7%2BbAcKvtI%2BCsUKBS1fn9%2Fnwa3ZNEYTX8zalGLMAL5fx%2F9qXySfal9B9pnI%2FJrpKjeqP6o%2BK7yMmKqk8RSazUyMg%3D%3D

HTTP响应示例

72a9c691ccdaab98fL1tMGI4YTljMuYdeRizHEwZsv9K8azoTHj4H/p9TXpO4Cp6L5VT32Exb2o/bX8zYzY=b4c4e1f6ddd2a488

三、解密流程详解

1. 解密HTTP请求中的key参数

步骤1:URL解码

from urllib.parse import unquote

encoded_key = "fL1tMGI4YTljMX78f8Wo%2FyhTV1ECWEn3M%2BF4ZGJ%2BL2Iz5Ep7TupOFkzm%2Bhr7%2BbAcKvtI%2BCsUKBS1fn9%2Fnwa3ZNEYTX8zalGLMAL5fx%2F9qXySfal9B9pnI%2FJrpKjeqP6o%2BK7yMmKqk8RSazUyMg%3D%3D"
decoded_key = unquote(encoded_key)
# 结果: fL1tMGI4YTljMX78f8Wo/yhTV1ECWEn3M+F4ZGJ+L2Iz5Ep7TupOFkzm+hr7+bAcKvtI+CsUKBS1fn9/nwa3ZNEYTX8zalGLMAL5fx/9qXySfal9B9pnI/JrpKjeqP6o+K7yMmKqk8RSazUyMg==

步骤2:Base64解码

import base64

decoded_bytes = base64.b64decode(decoded_key)

步骤3:XOR解密

def xor_decrypt(data, key):
    key_bytes = key.encode('utf-8')
    decrypted = bytearray()
    for i in range(len(data)):
        decrypted.append(data[i] ^ key_bytes[i % len(key_bytes)])
    return bytes(decrypted)

key = "3c6e0b8a9c15224a"  # 哥斯拉V4默认密钥
xor_decrypted = xor_decrypt(decoded_bytes, key)

步骤4:GZIP解压

import gzip

try:
    uncompressed = gzip.decompress(xor_decrypted)
    command = uncompressed.decode('utf-8')
    print("解密后的命令:", command)
except Exception as e:
    print("解压失败:", e)

2. 解密HTTP响应体

响应体结构分析:

72a9c691ccdaab98 [XOR加密的GZIP数据] b4c4e1f6ddd2a488
  • 前16字节和后16字节是随机填充数据
  • 中间部分是真正的加密数据

解密步骤:

response = "72a9c691ccdaab98fL1tMGI4YTljMuYdeRizHEwZsv9K8azoTHj4H/p9TXpO4Cp6L5VT32Exb2o/bX8zYzY=b4c4e1f6ddd2a488"

# 1. 提取中间加密部分
encrypted_part = response[16:-16]  # "fL1tMGI4YTljMuYdeRizHEwZsv9K8azoTHj4H/p9TXpO4Cp6L5VT32Exb2o/bX8zYzY="

# 2. Base64解码
decoded_response = base64.b64decode(encrypted_part)

# 3. XOR解密
xor_decrypted_response = xor_decrypt(decoded_response, key)

# 4. GZIP解压
try:
    uncompressed_response = gzip.decompress(xor_decrypted_response)
    response_data = uncompressed_response.decode('utf-8')
    print("解密后的响应:", response_data)
except Exception as e:
    print("响应解压失败:", e)

四、常见问题与解决方案

问题1:解密后出现乱码

现象: 类似KMKe2a``(PMVPJNQP/K,///(/I-I,I-OJM2W.(OQR0S3M-OKMeZ윟윟1Z的乱码

原因:

  1. 缺少GZIP解压步骤
  2. 检查十六进制开头是否为1f8b08(GZIP魔数)

解决方案:
确保解密流程完整:Base64 → XOR → GZIP

问题2:响应解密失败

原因:

  1. 未正确处理响应体结构(前后16字节的随机数据)
  2. 密钥不正确

解决方案:

  1. 确保只解密中间部分数据
  2. 验证密钥是否正确(默认3c6e0b8a9c15224a)

问题3:GZIP解压失败

原因:

  1. XOR解密不完整导致数据损坏
  2. 数据被截断

解决方案:

  1. 检查XOR解密步骤是否正确
  2. 验证Base64解码是否完整

五、完整Python解密脚本

import base64
import gzip
from urllib.parse import unquote

def xor_decrypt(data, key):
    key_bytes = key.encode('utf-8')
    decrypted = bytearray()
    for i in range(len(data)):
        decrypted.append(data[i] ^ key_bytes[i % len(key_bytes)])
    return bytes(decrypted)

def decrypt_godzilla_v4(encrypted_data, is_response=False):
    # 哥斯拉V4默认密钥
    key = "3c6e0b8a9c15224a"
    
    try:
        # 如果是响应数据,需要去掉前后16字节的随机数据
        if is_response:
            encrypted_data = encrypted_data[16:-16]
        
        # Base64解码
        decoded = base64.b64decode(encrypted_data)
        
        # XOR解密
        xor_decrypted = xor_decrypt(decoded, key)
        
        # GZIP解压
        uncompressed = gzip.decompress(xor_decrypted)
        
        # 返回解密后的明文
        return uncompressed.decode('utf-8')
    except Exception as e:
        return f"解密失败: {str(e)}"

# 解密请求示例
encoded_key = "fL1tMGI4YTljMX78f8Wo%2FyhTV1ECWEn3M%2BF4ZGJ%2BL2Iz5Ep7TupOFkzm%2Bhr7%2BbAcKvtI%2BCsUKBS1fn9%2Fnwa3ZNEYTX8zalGLMAL5fx%2F9qXySfal9B9pnI%2FJrpKjeqP6o%2BK7yMmKqk8RSazUyMg%3D%3D"
decoded_key = unquote(encoded_key)
decrypted_command = decrypt_godzilla_v4(decoded_key)
print("解密后的命令:", decrypted_command)

# 解密响应示例
response = "72a9c691ccdaab98fL1tMGI4YTljMuYdeRizHEwZsv9K8azoTHj4H/p9TXpO4Cp6L5VT32Exb2o/bX8zYzY=b4c4e1f6ddd2a488"
decrypted_response = decrypt_godzilla_v4(response, is_response=True)
print("解密后的响应:", decrypted_response)

六、技术要点总结

  1. 加密流程:哥斯拉V4采用多层加密,理解每层的顺序是关键
  2. 密钥使用:XOR加密使用固定密钥,循环使用密钥字节进行异或
  3. 数据识别
    • GZIP压缩数据以1f8b08开头
    • 响应体包含前后16字节的随机数据
  4. 错误处理:解密失败时逐步检查每步结果,特别是Base64和GZIP步骤

通过本教程,您应该能够完整解密哥斯拉V4 WebShell的通信流量,分析攻击者执行的命令和服务器返回的信息。

哥斯拉Godzilla V4版本WebShell木马通信解密分析教程 一、概述 本教程详细讲解如何解密哥斯拉(Godzilla)WebShell V4版本的加密通信流量,包括请求和响应的解密过程。哥斯拉V4版本采用了多层加密技术:XOR异或加密 + GZIP压缩 + Base64编码 + URL编码。 关键特征: 默认加密密钥: 3c6e0b8a9c15224a 加密流程:PHP序列化数据 → GZIP压缩 → XOR加密 → Base64编码 → URL编码 解密流程:URL解码 → Base64解码 → XOR解密 → GZIP解压 二、原始数据示例 HTTP请求示例 HTTP响应示例 三、解密流程详解 1. 解密HTTP请求中的key参数 步骤1:URL解码 步骤2:Base64解码 步骤3:XOR解密 步骤4:GZIP解压 2. 解密HTTP响应体 响应体结构分析: 前16字节和后16字节是随机填充数据 中间部分是真正的加密数据 解密步骤: 四、常见问题与解决方案 问题1:解密后出现乱码 现象: 类似 KMKe2a``(PMVPJNQP/K,///(/I-I,I-OJM2W.(OQR0S3M-OKMeZ윟윟1Z 的乱码 原因: 缺少GZIP解压步骤 检查十六进制开头是否为 1f8b08 (GZIP魔数) 解决方案: 确保解密流程完整:Base64 → XOR → GZIP 问题2:响应解密失败 原因: 未正确处理响应体结构(前后16字节的随机数据) 密钥不正确 解决方案: 确保只解密中间部分数据 验证密钥是否正确(默认 3c6e0b8a9c15224a ) 问题3:GZIP解压失败 原因: XOR解密不完整导致数据损坏 数据被截断 解决方案: 检查XOR解密步骤是否正确 验证Base64解码是否完整 五、完整Python解密脚本 六、技术要点总结 加密流程 :哥斯拉V4采用多层加密,理解每层的顺序是关键 密钥使用 :XOR加密使用固定密钥,循环使用密钥字节进行异或 数据识别 : GZIP压缩数据以 1f8b08 开头 响应体包含前后16字节的随机数据 错误处理 :解密失败时逐步检查每步结果,特别是Base64和GZIP步骤 通过本教程,您应该能够完整解密哥斯拉V4 WebShell的通信流量,分析攻击者执行的命令和服务器返回的信息。