【小心提防 Minecraft 後門】

Minecraft 伺服器後門,一種會透過「插件」感染 Minecraft 伺服器 及 遠端執行指令 / 腳本 的一種蠕蟲病毒。本文將分為三部分,關於病毒的簡單介紹、解決辦法、如何檢測該插件是否有病毒。
本文章需要使用的部分工具:JD-GUI (反編譯工具)
關於病毒的簡單介紹
這個病毒的作者利用來歷不明或非法網站上載部分含有病毒的插件 (大部分為付費插件),引誘伺服器創作者下載並安裝到自己的伺服器。最後非法獲取權限並破壞 Minecraft 伺服器,並且把部分操作拍攝成為影片,上傳 YouTube,獲取盈利。
病毒的運行及操作模式:
病毒透過 插件 Main Class 當中的 onEnable() 部分初始化病毒代碼,並且創建 Instance。然後透過檢查整個 /plugins/ 目錄,打開 JAR 文件並進行感染程序。最後當完成感染後,生成「.l_ignore」,讓病毒下一次初始化的時候知道相關插件已被成功感染。同時,病毒亦會啟動 Web Socket,並且設定 全域變量 “fym_st”,確保 Web Socket 不會重複初始化,避免出現「java.net.BindException: Port in use」,引起伺服器管理員懷疑。
攻擊者亦可以透過已開啟的 Web Socket,對 Minecraft 伺服器進行操作或執行腳本。
通常攻擊者會對伺服器造成:
- 實體的地圖破壞
- 修改或刪除插件設定
- 嘗試洗版
- 修改伺服器設置 (e.g: Whitelist)
- 刪除地圖
- 重置整個伺服器
解決辦法:
讓我們簡單說明如何防止這類型的攻擊,以下分為數項方法:
- Windows 作業系統 (Server OS / PC OS);
- 修改 host / DNS 伺服器 設定檔[操作難度較高];
- 於已安裝的伺服器插件 JAR 檔案中放置「.l_ignore」文件,用作預防插件遭受感染[操作量較高];
- 在伺服器啟動檔 (start.sh / 伺服器後台的啟動參數) 當中加入「-Dfym_st=true」命令參數,可避免啟動 WebSocket,但仍然會感染其他插件
- 不要使用來歷不明、非法網站(例如:BlackSpigot)下載的插件
- Windows 作業系統 (Server OS / PC OS)
這類病毒並不能感染 Windows 作業系統下的 Minecraft 伺服器。原因是 Windows 作業系統下的 Minecraft 伺服器插件 (JAR) 的 instance 是被鎖定及唯一的,因此在啟動期間無法儲存。同時在程式碼當中亦有避免這個情況導致的 Runtime Exception。

- 修改 host / DNS 伺服器 設定檔
這類病毒會收集關於 Minecraft 伺服器的 Metadata,包括但不限於:伺服器端口、伺服器版本,等等,並且開啟 WebSocket 連接到攻擊者的 CC 伺服器 (域名:client.hostflow.eu,端口:5050)。你可以透過修改伺服器 (不是 Minecraft 伺服器,是主機) 的 HOST 文件,把相應的 域名 對應 127.0.0.1,防止被控制及上傳資料。你亦可以通過修改路由器或主機的防火牆,禁止或關閉端口 5050(此做法有風險,可能導致其他需要使用 5050 端口的設備無法連上)
修改 HOST 文件 (以下連結以 Ubuntu 18.04 | 16.04 作為作業系統)
https://websiteforstudents.com/how-to-edit-the-local-hosts-file-on-ubuntu-18-04-16-04/
修改路由器或主機的防火牆,禁止或關閉端口 5050 (以下連結以 Ubuntu 18.04 作為作業系統)
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-18-04

- 在所有插件當中放置「.l_ignore」文件
你可以使用 WinZIP / WinRAR 這裏壓縮檔軟件打開其他插件 JAR,並且新增一個檔案為「.l_ignore」,讓病毒以為這個插件已經被感染。因為病毒在每次重啟都會檢查是否所有 JAR 都被感染。

- 在伺服器啟動檔 (start.sh / 伺服器後台的啟動參數) 當中加入「-Dfym_st=true」命令參數
在病毒簡介部分,病毒會檢查 全域變量 “fym_st” 的值 決定是否已經初始化 Web Socket 端口。我們可以在伺服器正式啟動並讀取各個插件的 onEnable() 部分前,預先設置全域變量 “fym_st” 的值為 “true”,讓病毒以為已經初始化 Web Socket 端口。以下為 start.sh (啟動檔) 的建議寫法:
java -Xms1024M -Xmx2048M -Dfym_st=true -Dterminal.ansi=true -jar server.jar
server.jar 是你的 Spigot / PaperSpigot / 其他核心 JAR,-Xms 為最少記憶體,-Xmx 為最大記憶體
若果使用伺服器面板,例如「pterodactyl panel」,可以根據以下設定:

如何檢測插件是否有被感染跡象 / 帶有病毒:
你需要首先下載 jd-gui 這裏反編譯工具,對插件的 classes 進行反編譯。
- 開啟反編譯工具,並且把懷疑帶有病毒的插件「拖」進去

2. 檢查 Main Class (若果插件名稱叫 HelloWorld.jar,Main Class 為 HelloWorld.class)

3. 檢查 Main Class onEnable() 是否會載入生成 <MainClass>L10 的 new Instance

若果有以上症狀,請馬上停止伺服器,並且隨機抽取一個插件進行異常檢查 (以上操作),若果均有感染跡象,請馬上對地圖 & 玩家資料進行備份,並且重新到正當網站 (Spigot / Bukkit) 重新下載插件。條件許可的情況下,可以複製一個新的容器,把已經「消毒」的伺服器重新啟動,觀察有沒有其他異常出現。
記緊不要下載不明來歷的插件並安裝到伺服器
Reference:一个Minecraft后门蠕虫的分析 (Bilibili)