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 协议, 安全测试, 应用层攻击, 情报收集, 拒绝服务攻击, 攻击性安全, 日志放大, 游戏安全, 漏洞研究, 网络安全, 资源耗尽, 逆向工具, 配置错误, 隐私保护