Docker Hub 帳號遭 TeamTNT 集團入侵並用於挖礦

趨勢科技的威脅研究團隊隨時都在密切監控一些經常遭到攻擊的漏洞和組態設定錯誤。其中一個經常遭到攻擊的組態設定錯誤就是暴露在外的 Docker REST API。

2021 年 10 月,我們發現有駭客專門攻擊一些因組態設定不當而暴露在外的 Docker REST API,並啟動一些容器映像來執行惡意腳本,這些腳本會執行以下動作:

  1. 下載或內嵌門羅幣 (Monero) 挖礦程式。
  2. 利用一些已知的技巧從容器逃逸至主機。
  3. 執行網際網路掃描,試圖尋找已遭入侵的容器所暴露的連接埠。
Behavior of attacks targeting vulnerable Docker servers
圖 1:駭客如何攻擊含有漏洞的 Docker 伺服器。


我們發現了一些駭客使用的 Docker Hub 登錄帳號,這些帳號不是被駭客所盜,就是原本就屬於 TeamTNT 所有。駭客集團利用這些帳號來存放惡意的容器映像,還積極參與一些殭屍網路以及使用 Docker REST API 的惡意程式攻擊行動。我們已經將這些狀況通報給 Docker,而相關的帳號也都已經被刪除。

本文討論兩個這類利用 Docker REST API 來散布虛擬加密貨幣挖礦程式的帳號。

在 Docker 映像中發現的惡意腳本

Contents of Docker images
Contents of Docker images
圖 2 和 3:Docker 映像的內容。


這些映像都含有一個名為「pause」的惡意腳本,此腳本在新的容器產生時就會執行。

Contents of source code
Contents of source code
Contents of source code
圖 4 至 6:原始程式碼內容。


INIT_MAIN 會呼叫 SETUP_APPS 函式來更新及新增後續惡意程序所用到的工具。

INIT_MAIN 會建立一個無限迴圈,並使用 curl發送一個 GET 請求至 http://teamtnt[.]red/RangeDA.php。它會收到一個數字作為回應,此數字會傳入後面呼叫的「pwn」作為參數。如果 curl 嘗試連線失敗,就會產生一個 1 至 255 中間的隨機數字,並指派到 $RANGE 變數。

Code of pwn function
圖 7:pwn 函式程式碼。

「pwn」函式是用來包裝「masscan」函式,腳本會使用 pwn 來掃描 2375、2376、2377、4243、4244 連接埠,類似我們在 2020 年討論過的殭屍網路分散式阻斷服務 (DDoS) 攻擊行為。但此處會呼叫另一個函式 (CHECK_INTER_SERVER) 並傳入 IP 位址和連接埠號碼。

CHECK_INTER_SERVER 首先會檢查遠端 IP 位址所在的作業系統是否為「linux」,它使用「info」指令來向暴露在外的 Docker REST API 伺服器要求提供資訊。這個指令可用來查詢有關伺服器的各種基本資訊 (metadata),例如:暫停中與停止中的容器數量、支援的執行環境、伺服器版本、架構等等。 

CHECK_INTER_SERVER function
圖 8:CHECK_INTER_SERVER 函式。

我們發現,這段程式碼會檢查以下屬性來設定一些旗標,並檢查目前正在被掃描的伺服器是否為 Docker 集群 (swarm) 管理員:

  1. OSType:伺服器的作業系統
  2. Repository:使用中的容器登錄
  3. Architecture:伺服器的架構
  4. Swarm:目前的集群參加狀態
  5. CPUs:伺服器的 CPU 核心數

為了取得更多有關目標伺服器的詳細資訊,例如:已運作時間以及所有可用的記憶體容量,駭客還會使用 docker-cli 來啟動容器並執行以下步驟:

  1. 設定「–privileged」旗標。
  2. 使用底層主機的網路命名空間「–net=host」。
  3. 將底層主機的 root 檔案系統掛載到容器的「/host」路徑上。
Code for spinning up containers
圖 9:啟動容器的程式碼。

緊接著,該腳本會啟動一個新的容器,設定「–privileged」旗標、掛載主機的 root 檔案系統、在「alpineos/dockerapi」容器映像上共用主機的網路命名空間,截至 2021 年 11 月 9 日為止,該映像在 Docker Hub 的拉取 (pull) 次數已累積超過一萬。

Spawning of new container
圖 10:啟動新的容器。

以上完成之後,接下來試著在同一台伺服器上啟動另一個容器,但目的不同。

Spawning a container, with base64-encoded string
圖 11:啟動一個容器並導入一串 base64 編碼的字串。

這個容器是使用官方的「alpine」作業系統映像所產生,並在執行時指定了一些旗標來讓容器擁有底層主機的 root 權限,不過會將一個 base64 編碼的字串解碼之後藉由 Linux 的命令管道 (pipe) 導入「bash」。

以下是這個字串解碼之後的內容:

Decoded string
圖 12:解碼後的字串。

接著產生一對新的 Secure Shell (SSH) 金鑰,然後變更資料夾的屬性,設定不可變更 (immutable)屬性。TeamTNT 的公開金鑰會加入「/root/.ssh/authorized_keys」當中,現在駭客就能使用新產生的這對公開/私密金鑰登入。隨後,公開金鑰會被移除。

TeamTNT-related encryption key
圖 13:TeamTNT 相關的加密金鑰。


駭客使用的門羅幣挖礦腳本是從 TeamTNT 伺服器上下載,並使用一個底層主機的 SSH 導入「bash」,提供位於「/tmp/TeamTNT」的私密金鑰來以「root」權限執行腳本。隨後,「/tmp/TeamTNT」的金鑰也被移除。

我們很快看了一下容器映像 {帳號名稱已隱藏} (左) 和「alpineos/docker2api」(右) 的歷史記錄。這裡,我們可以看到使用這些映像來產生容器時會執行的指令。另一個值得注意的是「pause」腳本。

Docker image code
圖 14:Docker 映像程式碼。

在比較這兩個映像的「pause」腳本時,我們看到兩者的程式碼極為相似,只有幾個地方不同:

The “pause” scripts from images
圖 15:兩個映像的「pause」腳本。

其中較特別的是 masscan 的使用方式不同,此外,某些程式碼也被標了註解,這顯示駭客正在進行試驗來測試他們的工具和武器。

尤其是,45[.]9[.]148[.]182 這個 IP 位址一直裡來都被發現與 TeamTNT 的基礎架構有關,因為有多個網域都用到這個位址:

  • dl.chimaera[.]cc
  • githb[.]net (inactive)
  • github-support[.]com (inactive)
  • irc.borg[.]wtf
  • irc.chimaera[.]cc
  • irc.teamtnt[.]red

2021 年 7 月,我們在針對 TeamTNT 的一份 報告中指出該集團會利用登入憑證竊取程式來從一些組態設定檔案蒐集登入憑證。這很可能就是 TeamTNT 如何取得此攻擊中所用到的一些資訊。

我們根據駭客執行的腳本與使用的工具來研判,這起攻擊應該是 TeamTNT 所為:

  1. 「alpineos」是 TeamTNT 最主要使用的一個 Docker Hub 帳號 (其累計拉取的映像次數超過 150,000 次)。
  2. TeamTNT 會使用一些已入侵的 Docker Hub 帳號來散播挖礦惡意程式。

我們已經將這些狀況通報給 Docker,所有涉及這起攻擊的帳號都已經刪除。未來我們將在另一篇部落格中深入探討駭客所用的一些技巧。

結論

暴露在外的 Docker API 目前已成為駭客經常攻擊的目標,因為這些 API 能讓駭客在資安措施不足的主機上以 root 權限執行惡意程式碼。這起近期的攻擊突顯出暴露在外的伺服器正遭到日益精密的攻擊,尤其是像 TeamTNT 這樣強大的駭客集團,會使用一些被盜的使用者登入憑證來從事惡意攻擊。

入侵指標資料

類型識別碼/雜湊碼
指令列腳本79ed63686c8c46ea8219d67924aa858344d8b9ea191bf821d26b5ae653e555d9
指令列腳本497c5535cdc283079363b43b4a380aefea9deb1d0b372472499fcdcc58c53fef
指令列腳本a68cbfa56e04eaf75c9c8177e81a68282b0729f7c0babc826db7b46176bdf222
網域teamtnt[.]red
IP 位址45.9[.]148.182

原文出處:Compromised Docker Hub Accounts Abused for Cryptomining Linked to TeamTNT