freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Godzilla Payload的简单分析
2022-12-11 19:57:05
所属地 山东省

前言

对Godzilla Payload的一点简单分析~

Java服务端

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

Godzilla Payload

哥斯拉的全功能Java马位于godzilla_4.0.1/shells/payloads/java/assets下,实现了命令执行、文件上传/下载、基本信息获取等全部功能。

image.pngimage.png

哥斯拉和冰蝎在原理层的区别在于哥斯拉在初次链接时会将全功能的Java马打入session对象中后续只传具体的方法名到服务端即可执行相应的Java代码。

image.pngimage.png

而冰蝎则是每次都加载不同的恶意类实现执行任意java代码。

image.pngimage.png

payload.class全部方法如下:

/* 属性 */
PageContext pageContext;
HashMap praameterMap = new HashMap<Object, Object>();
/* 方法 */
Class g(byte[] b) :类加载
String get(String key):获取prameterMap某个键的值
byte[] getByteArray(String key):获取praameterMap某个键的值

// Shell相关
byte[] run() :核心方法,根据parameterMap中获取的evalClassName和methodName调用方法
void formatParameter():{"ILikeYou":"bWV0b28="} prameterMap,又将praameterMap放入request的parameters属性
boolean equals(Object obj):判断对象是否为PageContext类型
String toString():调用run方法,并清空request的parameters属性
byte[] test():返回"ok"的字节码,shell初次链接时确认key和密码使用
void noLog(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);

image.pngimage.png

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

image.pngimage.png

参数获取

f.equals(pageContext);

image.pngimage.png

判断传入类型分别赋值

image.pngimage.png

对应如下

ByteArrayOutputStream -> this.outputStream
HttpServletRequest | ServletRequest -> this.servletRequest
[B (byte[].class) -> this.requestData
HttpSession -> this.httpSession

参数识别赋值后进入handlePayloadContext,在handlePayloadContext中,通过反射获取request、response、session对象。

image.pngimage.png

完成handlePayloadContext后,进行this.requestData的获取。

image.pngimage.png

代码执行

f.toString();

image.pngimage.png

当this.outputStream为空时,初始化SessionMap,使用GZIPOutputStream修饰this.outputStream.

image.pngimage.png

formatParameter();//获取服务端接受的参数(方法名)

从this.requestData中解压缩数据并存入this.parameterMap。

image.pngimage.png

完成 formatParameter后,执行run方法,执行代码输入后清空所有请求相关对象。

image.pngimage.png

传入类名为空时执行payload类中对应方法,不为空时从sessionMap中获取类并实例化执行其中对应方法。

image.pngimage.png

流程总结

f.equals(arrOut):获取输入对象待用
f.equals(pageContext):获取所有参数
f.toString():执行代码
# 代码分析
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录