准备环境

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

反编译jar文件

环境说明

JAVA_HOME:~/java/jdk1.8.0_181/

图片

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# 设置CFR JAR文件的路径
CFR_JAR="./DocToolkit-0.0.1-SNAPSHOT.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 -jar $CFR_JAR "$class_file" > "$class_dir/$class_name.java"
done

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

1
unzip DocToolkit-0.0.1-SNAPSHOT.jar -d example

image-20240605195948275

解压Jar文件

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

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

1
2
mkdir -p src/main/java
cp -r example/BOOT-INF/classes/* src/main/java/

图片

image-20240605200537011

1
find src/main/java

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

image-20240605200718587

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

1
cat src/main/java/com/example/doctoolkit/shiro/ShiroConfig.java

图片

image-20240607215511606

查看源码

找到默认Key值

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

QZIysgMYhG7/CzIJlVpR1g==

image-20240605202003820

Shiro反序列化漏洞利用

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

image-20240605202046326

查询Lib中jar文件清单

修改默认Key

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

1
2
QZIysgMYhG7/CzIJlVpR1g==
改QZIysgMYhG7/CzAlphabug==

进行打包

1
2
3
CLASS_LIB=$(find example/BOOT-INF/lib/ -name "*.jar" | tr '\n' ':');

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

图片

image-20240605205650307

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

1
~/java/jdk1.8.0_211/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

图片

image-20240607215907291

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

image-20240605210344319

重新打包

首先替换原有的class文件

1
2
3
4
5
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文件到单独的目录中。

1
2
3
4
5
6
7
8
cd example
cd BOOT-INF/lib
for jar in *.jar; do
mkdir -p "../lib_unpacked/$jar"
cd "../lib_unpacked/$jar"
~/java/jdk1.8.0_211/bin/jar -xvf "../../lib/$jar"
cd ../../lib
done

图片

对Lib中的Jar进行解压

重新打包嵌套的JAR文件

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

图片

对Lib中的Jar重新打包

重新打包主JAR文件

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

图片

重新对Jar文件打包

测试

1
~/java/jdk1.8.0_211/bin/java -jar example_repacked.jar

图片

运行打补丁后程序

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

1
QZIysgMYhG7/CzAlphabug==

图片