找回密码
立即注册
搜索
发回帖 发新帖

5205

积分

0

好友

667

主题
发表于 半小时前 | 查看: 5| 回复: 0

前阵子,公司一位实习生在分析 FOFA 协议时问我:“这么多协议,FOFA 怎么决定做哪些、做到什么程度呢?”这个问题挺好,但它没有标准答案。毕竟大多数人对某个协议有没有、好不好基本无感,那大家怎么知道做了有没有价值?

我们总说“利他主义”,但这种“利他”有时会变成一种自我感觉良好。在我看来,做不好“利我”,就谈不上真正做好“利他”。一旦从利他视角讨论问题,人很容易掉进“我不是用户”的陷阱。对科技或产品团队来说,这是非常要命的红线:你不了解“他”是谁、在什么场景下遇到什么问题,凭空琢磨,很难做出用户想要的效果。

有个周末,我在研究 AI 结合类似 JEV 这样的决策模型能做什么。看到有人用它做《街头霸王》街机通关视频,也有人让它打《我的世界》末影龙,感觉都挺有趣。我自己不玩 Minecraft,不过家里小孩玩,就拿来验证一下决策模型的效果,找找体感。在小朋友建议下,选了 Fabric 1.20.1 经典版本。我让 AI 在云上搭了一台 Minecraft 游戏服务器,再用客户端连上去——因为需要 AI 控制一个玩家、另一个玩家负责观察,所以不能是单机模式。搭好 AI 框架后,我直接给了它一个指令:制造一个“铁巨人农场”。说实话,我当时并不知道这玩意儿是干什么的。

我家娃在旁边写作业,我盯着 AI 看了一个小时,看它走来走去、砍来砍去,忙得不亦乐乎。看着看着困意上来了,就跟小朋友说我去睡会儿,起来再看结果。

等我醒来,听到一阵噼里啪啦的声音,还以为小朋友在偷玩电脑。结果他说是我的 AI 出问题了:屏幕上全是岩浆,满屏“凋灵”,还有核爆标志,里面的 Steve 已经死了很多轮。画面大致如下。画面下方,我们的 AI 玩家正在“就义”——这是他当天第 156 次死亡,凶手是凋灵。等救援结束时,这个数字停在了 175。

Minecraft 1.20.1 服务器岩浆地狱与 AI 玩家被凋灵追杀

Minecraft 服务器被入侵后的巨型像素涂鸦与聊天信息

我第一反应是 AI 出问题了:自动刷装备工具没有就算了,怎么还抑郁到自残?直到瞥见图里那行字“trolled! by xxx xxx discord.gg/xxxx”。作为 网络安全 的从业人员,这点敏感度还是有的——这多半是被黑了。好奇心立刻被点燃:到底怎么进来的?

赶紧翻服务器日志,当天下午有两条登录记录:15:35:56,某 IP 登录了“xiaozhi”——我们另一个机器人的名字;15:49:58,同一 IP 登录了“Steve”。IP 归属地是俄罗斯伏尔加格勒(88.87.xx.xx),一座以坚韧著称的城市。这份坚韧,从冒充者捡到白来的 OP 开始,全部倾注在了六十二分钟的行为艺术上:

  • 用 /team 把自己的名字改成一行 Discord 广告;
  • 在屏幕侧边栏刷出巨幅字符画:“trolled! by …”(就是截图里那片紫色,已经打码的部分);
  • 在世界里盖了一幅巨型像素涂鸦;
  • 召唤凋灵天团,专职追杀我们的 AI;
  • 顺手改了世界出生点,动机不明,大概是想给作品引流。

简单来说:离线模式(offline-mode)、全网开放、机器人有 OP,这三样放在一起,基本就等于挂了个“欢迎行为艺术”的门牌。但事情并没有这么简单。即便开了离线模式、全网可连,他又是怎么登录我的 Steve 和 xiaozhi 账号的?Steve 是默认的烂大街名字,可 xiaozhi 是中文拼音,一般人不会这样去碰撞吧?

查了一些资料后,完整故事拼凑出来了:冒充者需要密码吗?完全不需要。原版 Minecraft 服务端根本没有“登录密码”这个概念。正常世界里,身份认证外包给 Mojang 官方会话服务器——开启正版验证(online-mode)时,客户端要先向官方证明“我是本人”,服务器再和官方核对。我们为了方便机器人操作,把这道验证关了。

关掉之后,“你是谁”取决于一次纯数学运算:

UUID = MD5("OfflinePlayer:" + 用户名)

这串 UUID 决定了你的一切:背包、家,以及最关键的——管理员权限(服务器的 ops.json 按 UUID 认人)。看出问题了吗?这是一个确定性函数:名字相同,UUID 必然相同;UUID 相同,权限必然相同。冒充不需要任何黑客技术,只需要在登录框里输入五个字母:S-t-e-v-e。我们当场验证:手动算了一遍 MD5("OfflinePlayer:Steve"),再和服务器 ops.json 里的 UUID 比对,一字不差。那一刻的心情,就像出门旅游十年,回家才发现钥匙一直压在门口垫子下面,而全世界每本《入室指南》第一页都印着“先翻垫子”。

也就是说,只要攻击者知道用户名,就能正常登录任何 offline-mode 的 Minecraft 服务器。很扯,但确实如此。那下一个问题是:攻击者怎么知道用户名?

FOFA 就是干这个的。我们很早就支持了 Minecraft 协议,随便找一台就能看到,比如这样:

FOFA 早期 Minecraft 协议识别字段截图

不过当时协议字段里并没有展示当前在线的玩家名。

后来定位发现,Minecraft 协议里有一个“服务器列表查询”:任何人不用登录、不用密码,发一个查询包,服务器就会热情地返回自己的 MOTD、版本和当前在线玩家名单。而且这与游戏版本无关——任何版本的离线服务器都是这样,这是模式设计,不是某个版本漏洞。正因为 FOFA 很早就上线了这个协议,早期 pre-1.7 legacy ping 还能用,只是数据字段较少;用最新 1.7+(2013 年至今)的现代 SLP 响应里就有在线玩家字段,还增加了 icon 图标。

后来的事情就比较简单了:提 issue 让同事们更新,最新 FOFA 中 Minecraft 协议的显示就变成了这样:

FOFA Minecraft 协议更新后显示 PlayerNames

与此同时,AI 告诉我,为了控制游戏玩家,它用的是 source-rcon 协议。于是 FOFA 又补上了这个协议的详细字段,效果如下:

FOFA source-rcon 协议字段详情

这两件事落实后,心里踏实多了。我已经忘了当初为什么让 AI 控制 Minecraft,只记得我们又让 FOFA 的协议识别能力变强了一点。也许对世界上 99.9% 的人来说,不会关心世界上还有一种协议叫 Minecraft,也不知道还有一种协议叫 RCON,更不知道 offline-mode 下会有一批人盯着这些服务器。但对于另一部分真正喜欢 Minecraft 的玩家来说,遇到行为艺术几乎是成长必经之路。等他们碰到问题时,就能通过 FOFA 快速搞清楚发生了什么。

FOFA 之所以还在持续运营,是因为每隔一段时间,我们都能遇到几次类似的故事。有时是一场热点漏洞爆发(比如 PHP2Shell 漏洞),有时是一款爆款产品(比如幻兽帕鲁),有时是一次 APT 情报追踪拓线,有时只是一次单纯的商业产品调研。我们无法预知未来会发生什么,但知道一件事:只要把公开数据整理清楚,它就是一个高价值宝矿,一定会给特定用户带来特定价值。最重要的是,FOFA 这个产品开发起来很好玩,能满足我们的好奇心,也能把好奇心传递给用户。当大家一起玩起来,成就感自然就起来了。

类似的故事还有很多。最近这几天我们也在处理一系列相关事情,不断涌入的好奇心逼着我们去寻找更深层的答案。以前可能要摸索几个月,现在有了 AI,一两天甚至实时就能找到答案。技术门槛很快就能迈过去,人类真正要做的是找到需要解决的问题、发挥创意。

最后,向 GeekCon 致敬,这是国内网络安全技术的天花板。“火眼金睛没有否决权,就是一种眼病”,我希望未来不说否决权,至少大家能正视网络安全,不要用公关手段对付技术问题,平等尊重就好。毕竟大家的好奇心有利于社会安全发展。现在做成一件好事需要大家共同支持,而毁掉一件事,真的只需要拆掉一块小积木——信任一旦崩塌,网络安全最后往往还是由国家来买单。




上一篇:Every Joule:一个人用 Claude 和 Three.js 做了本可交互的 3D 物理课本
下一篇:Manim 数学动画渲染慢?ManimGX 基于 Rust 快 90 倍还支持 Agent 创作
您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-10-30 02:58 , Processed in 0.069971 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表