我的 MC 离线服被黑了——从顶号到炸服的完整日志复盘

📅 2026/7/9 11:46:58 👁️ 阅读次数 📝 编程学习
我的 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]

这段日志翻译一下:

  1. 我朋友ii7777(他是有 OP 的)突然被踢了,原因写的是"你在另一个地方登录了"
  2. 一秒钟后,一个新的ii7777从攻击者的 IP 地址登录了
  3. 再过两秒,这个假的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 behind

MC 服务端正常情况下每个 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.

从攻击者进来,到服务器彻底死掉,总共六分钟。

这帮人怎么找到我的

事后复盘了一下,我觉得攻击流程大概是这样的:

  1. 用 Masscan 或者 Shodan 扫全网25565端口,找出所有在跑 MC 服务器的 IP
  2. 用 VPN 连上去,看 log 里有没有[Not Secure]标记,有就是离线服
  3. 进服之后开外挂到处飞,看 Tab 列表和聊天前缀,找出 OP 玩家的 ID
  4. 改名顶号,继承 OP
  5. 给自己人上 OP,写入ops.json当后门
  6. 炸图或者卡服

第 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 均来自真实日志记录。