前言

对Godzilla Payload的一点简单分析~

Java服务端

Java服务端即Webshell,负责对客户端传输数据的解析、执行和结果返回。

Godzilla Payload

哥斯拉的全功能Java马位于godzilla_4.0.1/shells/payloads/java/assets下,实现了命令执行、文件上传/下载、基本信息获取等全部功能。
哥斯拉和冰蝎在原理层的区别在于哥斯拉在初次链接时会将全功能的Java马打入session对象中后续只传具体的方法名到服务端即可执行相应的Java代码。
而冰蝎则是每次都加载不同的恶意类实现执行任意java代码。
payload.class全部方法如下:
/* 属性 */
PageContext pageContext;

HashMappraameterMap=newHashMap
<Object, Object>();

/* 方法 */
Class 
g
(
byte
[] b) :类加载

String 
get
(String key):获取prameterMap某个键的值

byte
[] getByteArray(String key):获取praameterMap某个键的值


// Shell相关
byte
[] run() :核心方法,根据parameterMap中获取的evalClassName和methodName调用方法

voidformatParameter
():{
"ILikeYou"
:
"bWV0b28="
} prameterMap,又将praameterMap放入request的parameters属性

booleanequals
(Object obj):判断对象是否为PageContext类型

String 
toString
():调用run方法,并清空request的parameters属性

byte
[] test():返回
"ok"
的字节码,shell初次链接时确认key和密码使用

voidnoLog
(PageContext pc):清空日志

handle():


// 文件管理
getFile()、listFileRoot()、readFile()、uploadFile()、newFile()、newDir()、deleteFile() 、moveFile() 、copyFile() 、deleteFiles(File f) 


// 命令执行
byte
[] execCommand()


// 基础信息
byte
[] getBasicsInfo()

byte
[] include() 

Map<String, String> 
getEnv
()

String 
getDocBase
()

String 
getRealPath
()


// 数据库管理
byte
[] execSql()


// 反射
Object 
invoke
(Object obj, String methodName, Object... parameters) 

Method 
getMethodByClass
(Class cs, String methodName, Class... parameters) 

static
 Object 
getFieldValue
(Object obj, String fieldName) 


// Base64操作
String 
base64Encode
(String data)

String 
base64Encode
(
byte
[] src)

byte
[] base64Decode(String base64Str) 

结果输出

f.equals(arrOut);
实例化的payload对象重写的equals方法传入的参数为ByteArrayOutputStream类型,进入handle方法,在handle方法中将传入的arrOut赋值给this.outputStream用于结果输出。

参数获取

f.equals(pageContext);
判断传入类型分别赋值
对应如下
ByteArrayOutputStream -> 
this
.outputStream

HttpServletRequest | ServletRequest -> 
this
.servletRequest

[B (
byte
[].class) -> 
this
.requestData

HttpSession -> 
this
.httpSession
参数识别赋值后进入handlePayloadContext,在handlePayloadContext中,通过反射获取request、response、session对象。
完成handlePayloadContext后,进行this.requestData的获取。

代码执行

f.toString();
当this.outputStream为空时,初始化SessionMap,使用GZIPOutputStream修饰this.outputStream.
formatParameter();//获取服务端接受的参数(方法名)
从this.requestData中解压缩数据并存入this.parameterMap。
完成 formatParameter后,执行run方法,执行代码输入后清空所有请求相关对象。
传入类名为空时执行payload类中对应方法,不为空时从sessionMap中获取类并实例化执行其中对应方法。

流程总结

f.equals(arrOut):获取输入对象待用

f.equals(pageContext):获取所有参数

f.toString():执行代码
E
N
D
知识星球产品及服务
团队内部平台:潮汐在线指纹识别平台 | 潮听漏洞情报平台 | 潮巡资产管理与威胁监测平台 | 潮汐网络空间资产测绘 | 潮声漏洞检测平台 | 在线免杀平台 | CTF练习平台 | 物联网固件检测平台 | SRC资产监控平台  | ......
星球分享方向:Web安全 | 红蓝对抗 | 移动安全 | 应急响应 | 工控安全 | 物联网安全 | 密码学 | 人工智能 | ctf 等方面的沟通及分享
星球知识wiki:红蓝对抗 | 漏洞武器库 | 远控免杀 | 移动安全 | 物联网安全 | 代码审计 | CTF | 工控安全 | 应急响应 | 人工智能 | 密码学 | CobaltStrike | 安全测试用例 | ......
星球网盘资料:安全法律法规 | 安全认证资料 | 代码审计 | 渗透安全工具 | 工控安全工具 | 移动安全工具 | 物联网安全 | 其它安全文库合辑  | ......
扫码加入一起学习吧~
继续阅读
阅读原文