Java冷补丁
准备环境
- jdk: 为了离线做准备,最后提前下载好Oracle Java 8/11/17这几个主流版本
- 反编译工具: cfr-0.152.jar
反编译jar文件
环境说明
JAVA_HOME:~/java/jdk1.8.0_181/
decompile.sh脚本,用于class转换成java文件。
1 | #!/bin/bash |
现在先解压jar文件到example目录
1 | unzip DocToolkit-0.0.1-SNAPSHOT.jar -d example |
解压Jar文件
单纯的解压,只是第一步,可以看到都是class文件,第二步就是反编译了。
创建文件夹,并且复制class相关文件到目录中。
1 | mkdir -p src/main/java |
1 | find src/main/java |
查看下,发现有.java说明成功反编译了。
根据源码,可以发现存在硬编码Shiro Key值。
1 | cat src/main/java/com/example/doctoolkit/shiro/ShiroConfig.java |
查看源码
找到默认Key值
通过漏洞利用工具,实现自动化利用(Shiro 1.4.0及以后版本中,默认的加密算法被更新为AES-GCM)。
QZIysgMYhG7/CzIJlVpR1g==
Shiro反序列化漏洞利用
找到依赖目录,这个目录很重要,后续需要使用到。
查询Lib中jar文件清单
修改默认Key
编辑src/main/java/com/example/doctoolkit/shiro/ShiroConfig.java源码,修改值。
1 | QZIysgMYhG7/CzIJlVpR1g== |
进行打包
1 | CLASS_LIB=$(find example/BOOT-INF/lib/ -name "*.jar" | tr '\n' ':'); |
遇到报错不需要慌,根据报错提示,可以看到,需要其他几个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 |
此时已经class文件生成了,可以看到修改时间,是一致的,因为对应的UserRealm、AdminController文件也会生成class文件。
重新打包
首先替换原有的class文件
1 | cp src/main/java/com/example/doctoolkit/shiro/ShiroConfig.class example/BOOT-INF/classes/com/example/doctoolkit/shiro/ShiroConfig.class |
然后开始正式打包,解压每一个嵌套的JAR文件到单独的目录中。
1 | cd example |
对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== |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 晴川's Blog🌈!