前言
-
大家好,我是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/
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
单纯的解压,只是第一步,可以看到都是class文件,第二步就是反编译了。
创建文件夹,并且复制class相关文件到目录中。
mkdir -p src/main/java
cp -r example/BOOT-INF/classes/* src/main/java/
查看下,发现有.java说明成功反编译了。
根据源码,可以发现存在硬编码Shiro Key值。
通过漏洞利用工具,实现自动化利用(Shiro 1.4.0及以后版本中,默认的加密算法被更新为AES-GCM)。
找到依赖目录,这个目录很重要,后续需要使用到。
修改默认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
遇到报错不需要慌,根据报错提示,可以看到,需要其他几个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
此时已经class文件生成了,可以看到修改时间,是一致的,因为对应的UserRealm、AdminController文件也会生成class文件。
重新打包
首先替换原有的class文件
cp src/main/java/com/example/doctoolkit/shiro/ShiroConfig.class example/BOOT-INF/classes/com/example/doctoolkit/shiro/ShiroConfig.class
cp src/main/java/com/example/doctoolkit/shiro/UserRealm.class example/BOOT-INF/classes/com/example/doctoolkit/shiro/UserRealm.class
cp src/main/java/com/example/doctoolkit/controller/admin/AdminController.class example/BOOT-INF/classes/com/example/doctoolkit/controller/admin/AdminController.class
然后开始正式打包,解压每一个嵌套的JAR文件到单独的目录中。
cd example
cd BOOT-INF/lib
for jar in *.jar; do
mkdir -p "../lib_unpacked/$jar"
cd "../lib_unpacked/$jar"
~/java/jdk1.8.0_181/bin/jar -xvf "../../lib/$jar"
cd ../../lib
done
重新打包嵌套的JAR文件
cd ../lib_unpacked
for dir in *; do
~/java/jdk1.8.0_181/bin/jar -cvfM0 "../lib/$dir.jar" -C "$dir" .
done
重新打包主JAR文件
cd ..
cd ..
jar -cvfM0 ../example_repacked.jar -C . .
测试
~/java/jdk1.8.0_181/bin/java -jar example_repacked.jar
测试shiro利用,发现使用原Key已无效,修改后的Key生效。
QZIysgMYhG7/CzAlphabug==
原文始发于微信公众号(百灵鸟安全团队):AWD离线-Jar文件冷补丁