漏洞原理
在 Shiro <= 1.2.4 中,AES 加密算法的key是硬编码在源码中,当我们勾选remember me 的时候 shiro 会将我们的 cookie 信息序列化并且加密存储在 Cookie 的 rememberMe字段中,这样在下次请求时会读取 Cookie 中的 rememberMe字段并且进行解密然后反序列化
由于 AES 加密是对称式加密(Key 既能加密数据也能解密数据),所以当我们知道了我们的 AES key 之后我们能够伪造任意的 rememberMe 从而触发反序列化漏洞
环境搭建
本地环境
https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4
<dependency>
<groupId>javax.servlet</groupId>
<!-- 这里需要将jstl设置为1.2 -->
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<!-- 添加利用链 -->
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
之后直接用idea打开
远程tomcat
环境
手动安装哪里有apt instal 香
kali2021
192.168.1.128
修改ssh配置,允许远程连接/etc/ssh/sshd_config,添加
PermitRootLogin yes
或者
sed -i 's/#PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/g' /etc/ssh/sshd_config
service ssh start
apt-get install tomcat9 tomcat9-docs tomcat9-examples tomcat9-admin
修改/usr/share/tomcat9/bin/catalina.sh添加如下代码
CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.128 -agentlib:jdwp=transport=dt_socket,address=0.0.0.0:60222,suspend=n,server=y"