【小心提防 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)
  • 刪除地圖
  • 重置整個伺服器

解決辦法:

讓我們簡單說明如何防止這類型的攻擊,以下分為數項方法:

  1. Windows 作業系統 (Server OS / PC OS);
  2. 修改 host / DNS 伺服器 設定檔[操作難度較高];
  3. 於已安裝的伺服器插件 JAR 檔案中放置「.l_ignore」文件,用作預防插件遭受感染[操作量較高];
  4. 在伺服器啟動檔 (start.sh / 伺服器後台的啟動參數) 當中加入「-Dfym_st=true」命令參數,可避免啟動 WebSocket,但仍然會感染其他插件
  5. 不要使用來歷不明、非法網站(例如:BlackSpigot)下載的插件

  • Windows 作業系統 (Server OS / PC OS)

這類病毒並不能感染 Windows 作業系統下的 Minecraft 伺服器。原因是 Windows 作業系統下的 Minecraft 伺服器插件 (JAR) 的 instance 是被鎖定及唯一的,因此在啟動期間無法儲存。同時在程式碼當中亦有避免這個情況導致的 Runtime Exception。

當檢測到 Windows 作業系統,將會直接 Terminate 操作
  • 修改 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 進行反編譯。

  1. 開啟反編譯工具,並且把懷疑帶有病毒的插件「拖」進去

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

通常位於 xxx.<author>.<plugin_name> (或可以檢查是否有 .l_ignore)

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

(理論上可以直接查看是否有 <MainClass>L10 這一個 Class,但是謹慎一點會更好)

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


記緊不要下載不明來歷的插件並安裝到伺服器

Reference:一个Minecraft后门蠕虫的分析 (Bilibili)

You may also like...

發表回覆

zh_HKChinese