Bungeecord 作为简单好用的Minecraft跨服服务端,受到很多腐竹的喜爱,也是大多数人接触跨服所使用的第一个服务端。
一般来说,要开一个BC服非常简单,只需要配置好后端服务器的IP端口这些信息就可以直接开始使用。

但殊不知,Bungeecord 也有很多“正确使用姿势”。如果没有正确配置,可能导致一些安全性问题。

(这是咱第一次尝试严谨的文风

隐藏的跨服管理员

在BC的配置中,是有一个简单的权限管理系统的:

permissions:
  default:
  - bungeecord.command.server
  - bungeecord.command.list
  admin:
  - bungeecord.command.alert
  - bungeecord.command.end
  - bungeecord.command.ip
  - bungeecord.command.reload
....
groups:
  md_5:
  - admin

其中定义了普通权限组 "default" 和管理员组 "admin" 的权限。每个权限对应了一个BC命令的使用权。

我们先把目光集中到下面言简意赅看上去人畜无害的 group 这一组:

groups:
  md_5:
  - admin

让我们来解释一下这一小串配置组的含义:md_5 代表的是一个玩家ID,这个玩家被设置为拥有 admin 管理员的权限。

刚刚展示的是BC的默认配置,没有经过任何修改。

惊讶吗?刚刚配置好的BC,里面已经悄然有了一个定义好的管理员 md_5。如果我通过 md_5 这一ID进入,那我就可以使用 /end 直接关闭BC服务器并使所有玩家断开连接,通过 /alert 向所有玩家发送消息,通过 /ip <player> 查看任何玩家的IP地址。

其实这没什么问题,因为 md_5 是BC的核心开发者的名字,而且这个默认的“管理员”,只是作为“我们Bungeecord是这么定义每个人的权限组的”示例而写在配置里的。但是很多使用BC的腐竹完全没有意识到这一点,即刚刚配置好的BC其实是有一个默认管理员的。


在使用各类服务端软件时,都要认真审阅默认配置,避免这些 “安全性漏洞” 问题的发生。同时也要注意尽量不要使用网传的那些通用配置。否则当这些配置中出现安全性问题时,一是很难及时发现这些问题,二是很容易受到针对性攻击。

比如 nginx php-fpm 配置的 这个漏洞。通过不完善的 php-fpm 配置,可以远程执行代码。Nextcloud 官方甚至都在默认使用这个有漏洞的配置。


实际上在外网测试中,这个漏洞的可利用性并不高orz

很多腐竹都会在BC端中安装插件,而这些插件的一大需求就是权限控制。相当于,如果你在BC端中使用插件(而安装插件又是很多人,包括很多喜欢自定义自己服务器的新手腐竹使用BC必做的一个步骤),那大概率也会用到权限组插件,而权限组插件会接管自带的权限配置,从而使漏洞失效。

另外在外网测试时,我发现一些服务端默认的配置并不会包含这个默认管理员。
原因?未知 o(≧口≦)o

直接进入后端服务器

如果你做过跨服,你一定知道你需要在 spigot.yml 中配置 bungeecord: true,这样可以获得玩家的真实IP,同时如果玩家不通过BC访问服务器,他将被踢出。

一般来说我们都只在BC上配置登录插件比如 AuthMe,这样可以省去在每个子服都登录以便的麻烦。Spigot 的这个功能可以一定程度上防止玩家直接访问后端服务器,导致没有经过登录插件就可以直接免密码登录的风险。

但是请注意这个功能只会判断玩家是不是通过BC协议登录的,但是没有判断是从哪一个BC端登录的 —— 是你的服务器上配置好登录插件的BC端呢,还是玩家自己电脑上没有登录插件的BC端呢?

如果我在自己可控的本地上搭建一个BC跨服端,那我就可以绕过AuthMe,也就是不输入密码,通过任何玩家ID登录到后端服务器。是服务器的老玩家?还是服务器上的OP?任君选择。

Spoof

如果你是一个正版服务器的服主,那你一定知道,配置BC正版登录的时候,只需要在BC端上配置好正版验证就可以了,在后端服务器上需要把正版验证关闭。

这时候问题就出现了。如果我能够直接访问到后端的那个没有开启正版验证的服务器,那我就可以通过伪造UUID的方式,以某个玩家身份登录服务器,而不需要通过MOJANG服务器的鉴权。

如何解决?

解决的方案非常简单,主要突破口是禁止玩家不通过BC访问后端服务器。

  1. 将所有后端服务器的 server-ip 更改为 127.0.0.1。这种方式无论是面板服、容器还是VPS都可以使用。这样之后,服务端将被绑定到本地(loopback)。也就是说,除非恶意玩家和你的服务器处于同一内网,否则他无法访问这个服务端。
  2. 使用防火墙,比如 iptable 或者 windows defender,禁止后端服务器的端口被外网访问。

这样之后,就可以顺利解决如上所述的安全性问题了。


后记:然鹅,经过在 mcbbs 上大浪淘沙般寻找可利用的服务器之后,我得出了这篇文章就是个fw的结论(

标签: bungeecord, spoof, 漏洞, minecraft