Zagreus9723/MC-271325-DoS-PoC
GitHub: Zagreus9723/MC-271325-DoS-PoC
这是一个针对Minecraft服务器漏洞MC-271325的DoS概念验证工具,通过日志放大攻击演示资源耗尽问题。
Stars: 3 | Forks: 0
# 基于日志放大的原版Minecraft服务阻断攻击 (MC-271325)
未验证的客户端能够通过发送一个有效的状态握手包,随后再发送一个畸形的状态数据包,使原版和Fabric的Minecraft服务器在`latest.log`中写入大量堆栈跟踪信息。这不仅消耗CPU周期和内存,还会生成高达数GB的日志文件。
## Minecraft错误报告:[MC-271325](https://bugs.mojang.com/browse/MC-271325)(已有两年历史!)
## 攻击过程
1. 客户端建立TCP连接,并发送一个正常的握手包,其中`next state`(下一步状态)设置为`STATUS` (1)。
2. 客户端发送一个畸形的状态请求:
- 主要触发方式:数据包ID `0`(状态请求)加上一个额外的`0x00`字节 → 传输帧为 `02 00 00`。
- 备用方式:数据包ID `1`(在状态阶段对服务器端无效)→ 帧为 `01 01`。
3. 服务器的解码器拒绝该数据包(存在无法读取的字节或未知ID)。
4. `Connection.exceptionCaught`在连接仍处于状态协议期间尝试发送`clientbound/minecraft:disconnect`,而该数据包在此状态下并未注册。
5. Netty会再次抛出异常:
`io.netty.handler.codec.EncoderException: Sending unknown packet 'clientbound/minecraft:disconnect'`
正是这第二次异常导致日志被填满(本地测试中每个恶意请求约产生50行日志)。
## 受影响的版本(本地测试)
| 服务器 | 测试版本 | 日志放大 |
|--------|----------|----------|
| 原版 | 26.1.2 | 是 |
| Fabric | 26.1.2 + 加载器 0.19.2 | 是 |
| Paper | 1.21.11-69 | 否(测试中) |
## 最小化攻击载荷
握手至状态状态后:
PoC构建这些载荷时,使用了与真实客户端相同的帧格式(长度前缀的变长整型数据包ID)。
## 如何运行 PoC
在仓库根目录,针对任何正在监听的服务器:
```
python poc.py 127.0.0.1 25565 --count 10
```
可用参数:
| 参数 | 用途 |
|------|------|
| `--protocol N` | 强制握手协议(跳过自动检测) |
| `--no-auto-protocol` | 不先进行状态探测;使用默认协议774 |
| `--handshake-host NAME` | 用于代理的虚拟主机(BungeeCord / Velocity) |
| `--variant trailing_nul` | 默认的3字节触发载荷 |
| `--variant unknown_packet` | 备用的2字节触发载荷 |
| `--threads N` | 并行连接数 |
| `--count N` | 总连接数 |
| `-q` | 仅显示摘要 |
自动探测(默认)会执行一次合法的状态探测,以获取服务器的协议版本和版本名称。
## 关注点
不要依赖PoC输出`tcp_ok=True`。TCP会话可能已完成,但服务器已记录下损害。
在服务器上,使用`grep`在`latest.log`中查找:
- `EncoderException`
- `Sending unknown packet 'clientbound/minecraft:disconnect'`
- 位于`Connection.exceptionCaught` / `LegacyQueryHandler.channelRead`下的堆栈帧
来自打包重现脚本(`working-pocs/evidence/status-trailing-byte/repro-results.json`)的计数示例:
- 原版 / Fabric:10次尝试 → ~500行新日志,10个`EncoderException`,~480行堆栈跟踪;服务器进程仍存活。
- 压力测试(在原版/Fabric上约5秒内250次请求):本地约产生1.2万行日志和~1.1 MB的日志增长。
## 根本原因(简述)
对状态请求ID `0`进行严格解码 → 触发异常路径 → 在错误的协议状态下编码断开连接数据包 → 第二次异常及其完整堆栈被记录。Paper避免了在该状态下发送断开连接数据包。
## 伦理声明
仅在您拥有或已获明确授权测试的系统上使用。该脚本用于确认[MC-271325](https://bugs.mojang.com/browse/MC-271325)和进行防御性修复,而非用于干扰公共服务器。
标签:Bug 利用, Minecraft 服务器, Netty, PoC 开发, Python 脚本, TCP 协议, 安全测试, 应用层攻击, 情报收集, 拒绝服务攻击, 攻击性安全, 日志放大, 游戏安全, 漏洞研究, 网络安全, 资源耗尽, 逆向工具, 配置错误, 隐私保护