AWD离线-Jar文件冷补丁

WriteUp 6个月前 admin
214 0 0

前言

  • 大家好,我是Alphabug。最近有朋友参加了长城杯2024半决赛,其中有一题是DocToolkit,网上有攻击思路,这里我就不赘述了,我就来讲一讲Jar文件打补丁的思路。

一般做过开发的同学都知道只需要反编译成源码,然后用打包成jar就行,或者jsp文件直接修改代码即可。那么如果是打jar包,肯定避免不了拉去Spring的一些库。

第二种比较靠谱的方式就是用Java Agent热补丁来实现,为了降低修复学习的成本,我这里给大家找了第三种方式,我称为“Jar文件冷补丁”

准备环境

  • jdk: 为了离线做准备,最后提前下载好Oracle Java 8/11/17这几个主流版本
  • 反编译工具: cfr-0.152.jar

反编译jar文件

环境说明

JAVA_HOME:~/java/jdk1.8.0_181/

AWD离线-Jar文件冷补丁

decompile.sh脚本,用于class转换成java文件。

#!/bin/bash# 设置CFR JAR文件的路径CFR_JAR="cfr-0.152.jar"# 设置class文件的根目录CLASS_ROOT="src/main/java"# 查找所有的class文件并反编译为java文件find $CLASS_ROOT -name "*.class" | while read class_file; do    # 获取class文件的目录和文件名    class_dir=$(dirname "$class_file")    class_name=$(basename "$class_file" .class)    echo $class_name    # 反编译class文件并将输出重定向到.java文件    ~/java/jdk1.8.0_181/bin/java -jar $CFR_JAR "$class_file" > "$class_dir/$class_name.java"done

现在先解压jar文件到example目录

unzip DocToolkit-0.0.1-SNAPSHOT.jar -d example

AWD离线-Jar文件冷补丁

解压Jar文件

单纯的解压,只是第一步,可以看到都是class文件,第二步就是反编译了。

创建文件夹,并且复制class相关文件到目录中。

mkdir -p src/main/javacp -r example/BOOT-INF/classes/* src/main/java/

AWD离线-Jar文件冷补丁

对Class进行反编译

查看下,发现有.java说明成功反编译了。

AWD离线-Jar文件冷补丁

java文件

根据源码,可以发现存在硬编码Shiro Key值。

AWD离线-Jar文件冷补丁

查看源码

AWD离线-Jar文件冷补丁

找到默认Key值

通过漏洞利用工具,实现自动化利用(Shiro 1.4.0及以后版本中,默认的加密算法被更新为AES-GCM)。

AWD离线-Jar文件冷补丁

Shiro反序列化漏洞利用

找到依赖目录,这个目录很重要,后续需要使用到。

AWD离线-Jar文件冷补丁

查询Lib中jar文件清单

修改默认Key

编辑src/main/java/com/example/doctoolkit/shiro/ShiroConfig.java源码,修改值。

QZIysgMYhG7/CzIJlVpR1g==QZIysgMYhG7/CzAlphabug==

进行打包

CLASS_LIB=$(find example/BOOT-INF/lib/ -name "*.jar" | tr 'n' ':');~/java/jdk1.8.0_181/bin/javac -cp ".:${CLASS_LIB%:}" src/main/java/com/example/doctoolkit/shiro/ShiroConfig.java

AWD离线-Jar文件冷补丁

生成Class文件

遇到报错不需要慌,根据报错提示,可以看到,需要其他几个java文件一起进行编译。(其他几个文件,可以通过类名找到对应的java文件)

~/java/jdk1.8.0_181/bin/javac -cp ".:${CLASS_LIB%:}" src/main/java/com/example/doctoolkit/shiro/ShiroConfig.java src/main/java/com/example/doctoolkit/shiro/UserRealm.java src/main/java/com/example/doctoolkit/controller/admin/AdminController.java

AWD离线-Jar文件冷补丁

93dc702a3f409231.png

此时已经class文件生成了,可以看到修改时间,是一致的,因为对应的UserRealm、AdminController文件也会生成class文件。

AWD离线-Jar文件冷补丁

查看目录确保Class生成

重新打包

首先替换原有的class文件

cp src/main/java/com/example/doctoolkit/shiro/ShiroConfig.class example/BOOT-INF/classes/com/example/doctoolkit/shiro/ShiroConfig.classcp src/main/java/com/example/doctoolkit/shiro/UserRealm.class example/BOOT-INF/classes/com/example/doctoolkit/shiro/UserRealm.classcp src/main/java/com/example/doctoolkit/controller/admin/AdminController.class example/BOOT-INF/classes/com/example/doctoolkit/controller/admin/AdminController.class

然后开始正式打包,解压每一个嵌套的JAR文件到单独的目录中。

cd examplecd BOOT-INF/libfor jar in *.jar; do    mkdir -p "../lib_unpacked/$jar"    cd "../lib_unpacked/$jar"    ~/java/jdk1.8.0_181/bin/jar -xvf "../../lib/$jar"    cd ../../libdone

AWD离线-Jar文件冷补丁

Lib中的Jar进行解压

重新打包嵌套的JAR文件

cd ../lib_unpackedfor dir in *; do     ~/java/jdk1.8.0_181/bin/jar -cvfM0 "../lib/$dir.jar" -C "$dir" .done

AWD离线-Jar文件冷补丁

对Lib中的Jar重新打包

重新打包主JAR文件

cd ..cd ..jar -cvfM0 ../example_repacked.jar -C . .

AWD离线-Jar文件冷补丁

重新对Jar文件打包

测试

~/java/jdk1.8.0_181/bin/java -jar example_repacked.jar

AWD离线-Jar文件冷补丁

运行打补丁后程序

测试shiro利用,发现使用原Key已无效,修改后的Key生效。

QZIysgMYhG7/CzAlphabug==

AWD离线-Jar文件冷补丁

补丁成功


原文始发于微信公众号(百灵鸟安全团队):AWD离线-Jar文件冷补丁

版权声明:admin 发表于 2024年5月20日 下午11:41。
转载请注明:AWD离线-Jar文件冷补丁 | CTF导航

相关文章