我的 MC 离线服被黑了——从顶号到炸服的完整日志复盘
昨晚和朋友打雪仗打到一半,服务器被人端了。整个过程不到六分钟,干净利落。我把控制台日志全贴出来,顺便聊聊离线服到底有哪些坑。
先说结论
我开了online-mode=false(离线模式),没装任何登录验证插件,用的默认 25565 端口。这三个条件凑在一起,等于把服务器的大门钥匙挂在了门上。
如果你也有离线服,看到这里可以先去改配置,回来再慢慢看。
事情经过
一开始很正常
7 月 6 号晚上十一点,我和两个朋友在服务器里瞎玩,打雪仗,聊天,没什么特别的。日志里能看出来当时的状态很悠闲:
[23:03:57] [Server thread/INFO]: [Not Secure] <ii7777> 来咱俩打雪仗 [23:04:24] [Server thread/INFO]: [Not Secure] <potter> 笑死我了回去给你看个好玩的注意到[Not Secure]这个标记没有——这就是离线服的特征。正版服这里不会有这个,因为经过了 Mojang 的 session 验证。离线服跳过了这一步,所以服务端自己都知道连接"不安全"。
然后来了两个不速之客
23:04:57,突然冒出来两个陌生 ID 进服:
[23:04:57] ScreenConnect[/194.110.115.24:59170] logged in with entity id 78420 [23:05:43] LaffyOnTop[/194.110.115.52:51322] logged in with entity id 79105两个 IP 都是194.110.115.x,查了一下,是比利时 M247 机房的地址。M247 是个廉价 VPS 厂商,IP 段经常出现在各种代理链路里,扫服的人特别喜欢用。
他们一进来就开始触moved too quickly:
[23:05:00] [Server thread/WARN]: ScreenConnect moved too quickly! -5.713,6.382,-6.112 [23:05:50] [Server thread/WARN]: LaffyOnTop moved too quickly! -0.505,0.347,-10.811这个警告说明他们开了飞行或者加速外挂,服务端检测到玩家位移速度异常。正常人不可能一秒移动 10 个方块以上。
当时我以为就是两个外挂玩家进来捣乱的,没当回事。现在回头看,他们其实是在用高速飞行快速扫描地图、查看 Tab 列表上的玩家,判断谁有 OP 权限。
最关键的一分钟
23:06:28,一切开始失控。
[23:06:28] [Server thread/INFO]: ii7777 lost connection: You logged in from another location [23:06:29] [Server thread/INFO]: ii7777[/194.110.115.24:57052] logged in with entity id 79658 [23:06:31] [Server thread/INFO]: [ii7777: Made LaffyOnTop a server operator]这段日志翻译一下:
- 我朋友
ii7777(他是有 OP 的)突然被踢了,原因写的是"你在另一个地方登录了" - 一秒钟后,一个新的
ii7777从攻击者的 IP 地址登录了 - 再过两秒,这个假的
ii7777直接给了LaffyOnTopOP 权限
三秒钟,服务器易主。
原理很简单,但第一次亲眼看到还是觉得不可思议:离线服验证身份的方式就是看你客户端报上来的玩家名。你叫什么名字,服务器就认你是谁。攻击者只需要在启动器里把 ID 改成ii7777,重连一下,服务器就会踢掉原来的ii7777,然后把所有权限——包括 OP——全部交给这个新连接。没有密码,没有 token 校验,没有任何二次确认。
这就是离线模式最大的问题。正版服走 Mojang 的 session server 做了一次令牌校验,你的游戏客户端持有一个跟你账号绑定的 access token,服务端会去向 Mojang 验证这个 token 是否合法。离线模式跳过了这一步,等于把认证环节直接砍掉了。
接下来就是单方面的屠杀
拿到权限之后,攻击者开始干活了。
先把我朋友potter的 OP 撤了,把原管理员ii76ii的 OP 也下了,同时给他们自己的号ScreenConnect上了 OP:
[23:08:02] [ii7777: Made potter no longer a server operator] [23:08:16] [ii7777: Made ScreenConnect a server operator] [23:08:18] [ii7777: Made ii76ii no longer a server operator]这套操作很有章法——先拿权,再巩固,把我们原来的管理员全部清理掉,防止有人通过控制台或者 Rcon 把权限夺回来。然后在公屏打了一些种族歧视的内容,就不贴了。
中间还伴随着大量的 TNT 和苦力怕爆炸:
[23:07:34] Villager died, message: 'Villager blew up' [23:07:51] potter blew up最后直接把服务器干崩了
大概 23:09 的时候,攻击者开始用/fill指令大规模填充方块。这个指令在 OP 手里基本等于地图编辑器的批量操作——指定一个区域,瞬间填满方块。
[23:09:30] [ii7777: Successfully filled 4692 block(s)] [23:09:34] [ii7777: Successfully filled 26804 block(s)]两次 fill,一共塞了三万多个方块。如果填的是 TNT 或者一些会触发连锁更新的方块,服务端在处理这些方块状态变化的时候会面临极其巨大的计算量。
日志里紧接着就出现了经典的告警:
[23:09:38] Can't keep up! Is the server overloaded? Running 3081ms or 61 ticks behindMC 服务端正常情况下每个 tick(游戏循环)应该在 50ms 内跑完。这条日志说服务端已经落后了 61 个 tick,也就是超过 3 秒没跟上正常节奏了。
然后情况继续恶化,Netty 网络层开始丢包:
[23:10:33] [Netty Epoll IO #0/WARN]: Failed to deliver packet, sending fallback clientbound/minecraft:system_chat最终,23:10:39,主线程卡死了整整 60 秒。Minecraft 的 Watchdog 线程检测到主线程长时间无响应,直接判定崩溃,强制关机:
[23:10:39] [Server Watchdog/ERROR]: A single server tick took 60.00 seconds (should be max 0.05) [23:10:39] [Server Watchdog/ERROR]: Considering it to be crashed, server will forcibly shutdown.从攻击者进来,到服务器彻底死掉,总共六分钟。
这帮人怎么找到我的
事后复盘了一下,我觉得攻击流程大概是这样的:
- 用 Masscan 或者 Shodan 扫全网
25565端口,找出所有在跑 MC 服务器的 IP - 用 VPN 连上去,看 log 里有没有
[Not Secure]标记,有就是离线服 - 进服之后开外挂到处飞,看 Tab 列表和聊天前缀,找出 OP 玩家的 ID
- 改名顶号,继承 OP
- 给自己人上 OP,写入
ops.json当后门 - 炸图或者卡服
第 1 步完全是自动化的,他们根本不需要知道你的服务器存在。你现在去 Shodan 搜minecraft server,能出来几十万个结果,全都是开着 25565 端口的裸服务器。
我后来做了什么
服务器被炸之后,我花了点时间做了以下几件事:
改端口。server.properties里的server-port=25565改成了一个五位数端口,同时在云服务商的安全组里放行。这一步不能防住定向攻击,但能过滤掉 99% 的自动扫描。大部分扫服脚本只扫 25565,改个端口就等于从搜索结果里消失了。
开白名单。white-list=true,然后手动把朋友加进去。开启白名单之后,非白名单玩家连 TCP 握手都过不了,根本进不来,更别说侦察你的服务器了。这一步直接堵死了整个攻击链的前两个环节。
装了 AuthMe。这个是离线服最关键的防线。装了之后,每个玩家第一次进来要/register 密码,之后每次登录要/login 密码。没通过验证的玩家会被锁定在一个"观察模式"里——看得见这个世界,但不能动、不能交互、不能执行任何指令。即使有人知道你的 ID 并成功顶号登录,他不知道密码的话,就是一个完全无法操作的观察者,OP 权限形同虚设。
这三步做完之后,之前那种"改名顶号就能拿到最高权限"的攻击方式在我这个服务器上已经不可能成功了。每一步单独拿出来都有明确的作用:
| 措施 | 防住什么 |
|---|---|
| 改端口 | 自动化端口扫描 |
| 白名单 | 陌生人进服侦察 |
| AuthMe | 改名顶号劫持权限 |
三条加在一起,基本覆盖了离线服所有已知的入侵路径。
另外还建议做的两件事:
- 定时备份。写个 crontab 脚本,每小时把世界存档和
ops.json打包备份到别的地方。万一真的出事,恢复起来很快。 - 装反作弊。Matrix、GrimAC 这些插件可以检测飞行、加速之类的异常行为,自动封号。如果当时装了反作弊,攻击者一开始开外挂侦察的时候就已经被踢了,后面的故事根本不会发生。
写在最后
其实这些安全措施没有什么是"新知识",AuthMe 的 wiki 里都写了,各种服主群里也反复有人提。但总有那种侥幸心理——“我的服务器又不大,谁会专门来搞我”。
问题就在于,他们不是专门来搞你的。他们是批量扫,你的服务器只是被扫到的其中一个。对攻击者来说,入侵你的服和入侵一千个别的服没有任何区别,全脚本跑的。
离线模式本身没有问题,正版验证关了就是关了,你省去了正版校验的开销,朋友也不用买号就能玩。但关掉正版验证的同时,你得自己补上身份认证这一环。不然就是裸奔。
如果你也在跑离线服,现在就去检查这三个配置。真的。
基于 2026-07-06 服务器控制台日志还原。所有 IP、ID 均来自真实日志记录。