暴露的 Redis 執行實例,被用來進行遠端程式碼執行跟虛擬貨幣挖礦

我們最近寫了一篇在網路上發現8,000多個沒有保護好Redis執行實例的文章。在本篇文章裡,我們會介紹這些執行實例會如何被用來進行遠端程式碼執行(RCE),就如惡意軟體在真實世界裡所做的。這些惡意程式會將Redis執行實例變成虛擬貨幣挖礦機器人,並且透過”蠕蟲”散播功能來感染其他有漏洞的執行實例。

Redis是設計使用在受信任環境並提供了保護模式設定,而且即將更新到Redis 6.0,在新版本中會導入如存取控制列表(ACL)等新的安全功能。但在目前,如果使用者的Redis執行實例沒有加上TLS加密或密碼保護,一旦攻擊者進入了環境就可以使用超過200個命令來進行攻擊。目前Redis預設並沒有身份認證。即使有設定密碼,也要確認密碼足夠強到抵抗暴力破解攻擊。

我們在蜜罐系統裡觀察到駭客使用了下列情境,這些蜜罐系統是為了吸引和監視真實攻擊而設置:

情境一:利用config命令


攻擊者用Redis資料庫檔設定多個的鍵值來成為cron任務。資料庫值遵循著cron(執行排程命令的守護程序)和crontab(用於排程執行程式的檔案)格式規範。

A screenshot of a cell phone

Description automatically generated
圖1. 將鍵值設成cron任務

攻擊者用config命令將目錄設到/var/spool/cron並將dbfilename設為使用者名稱(如root),然後儲存資料庫(檔名為root)。

A screenshot of a cell phone

Description automatically generated
圖2. 將資料庫儲存到cron目錄

root檔案內容如下面截圖,基本上就是有幾行cron格式的可讀文字夾雜在二進位資料之間。

A screenshot of a cell phone

Description automatically generated
圖3. root檔案內容

儘管檔案內有部分二進位格式內容,但如果有安裝cron,它會找出可用的條目並執行攻擊者所要下載的Shell腳本 – 這些都是因為Redis執行實例沒有受到適當保護所造成。

A close up of text on a white background

Description automatically generated
圖4. 使用cron在暴露的Redis執行實例上執行RCE攻擊的範例

情境二:利用slaveof功能


第二種方法是因為Redis可以作為分散式資料庫。攻擊者會先製作一個惡意Redis執行實例並編譯一個惡意Redis模組。這個特製Redis執行實例成為了主伺服器,並發送slaveof命令到有漏洞的執行實例。接著駭客從主伺服器發起full resync來派送惡意Redis模組。接著觸發module load命令,成功地在有漏洞的Redis模組內載入後門。安全研究員Pavel Toporkov在2018年ZeroNights會議上的”Redis Post-exploitation”演講裡探討了此技術。

要特別說明的是,從2018年10月發布的Redis 5.0開始就不再使用”slave”,而是用replicaof。但為了向下相容,slaveof命令仍可以在早期版本使用。

A picture containing table, bird

Description automatically generated
圖5. 惡意Redis模組註冊三個命令的範例
A screenshot of a cell phone

Description automatically generated
圖6. 惡意Redis模組部署和命令呼叫的範例

此案例裡的惡意Redis模組會下載Kinsing惡意軟體,然後下載並執行XMRig門羅幣挖礦程式

圖7. 在Redis執行的XMRig虛擬貨幣挖礦程式被發現消耗了大量資源

所觀察惡意軟體樣本概述

我們會在此節裡重點介紹一些值得注意的惡意軟體樣本,這些樣本是透過上述兩種方法之一散播到暴露的Redis執行實例,且被蜜罐系統所捕捉到。

案例一:多平台shell蠕蟲安裝虛擬貨幣挖礦病毒

我們在真實世界觀察到的第一個惡意軟體是一種虛擬貨幣挖礦病毒的更新版本,此惡意軟體之前被發現會攻擊搜尋引擎Elasticsearch的已知漏洞。該惡意軟體是一種多平台蠕蟲:它同時有Linux和Windows版本,並具備用Shell和PowerShell撰寫的腳本,而且有些組件是用Golang開發的二進位執行檔。感染方式是透過修改cron檔案(如情境一所示),包含了指向init.sh檔案的連結。

Init.sh

這惡意軟體是用shell編寫的啟動或初始化腳本。它的重要功能是移除、終止和強制終止各種會耗費資源或競爭對手的程序。該腳本會執行下列工作:

  1. 移除阿里雲服務(靈感來源可能來自此儲存庫)。
  2. 移除騰訊代理(靈感來源可能來自此儲存庫)。
  3. 刪除多個檔案並終止多種程序和Docker執行實例。
A screenshot of a cell phone

Description automatically generated
  • 終止跟特定惡意軟體所用模組同名的程序:
  • sysguerd
  • sh
  • sysupdata
  • networkservics
  • 如果是root,會下載並安裝惡意軟體到/etc/,否則會用/tmp/。這些檔案是minerminer configwatchdogupdatescanner
  • 透過updata.sh達到持續性能力,其內容與init.sh相同並會加進crontab。
  • 將新的SSH授權金鑰安裝到/root/.ssh/authorized_keys:
A screenshot of a cell phone

Description automatically generated
  • iptables命令iptables -A OUTPUT -p tcp -dport ???? -j DROP來封鎖對外到端口3333、5555、7777和9999的流量。
  • 清除bash歷史記錄。
  • 如果/root/.ssh/id_rsa.pub檔案存在(含有之前產生SSH金鑰對中公鑰的檔案),會試著用SSH透過ssh -oBatchMode=yes -oConnectTimeout=5 -oStrictHostKeyChecking=no連到/root/.ssh/known_hosts內的所有已知主機(擁有之前存取過的伺服器公鑰)。它會讓每個成功連上的執行實例下載並執行http://<server>/<path>/is.sh
  1. 在受感染電腦下載並執行http://<server>/<path>/is.sh

Is.sh

用來執行下列工作的安裝腳本:

  1. 終止下列執行中的程序:
    1. redisscan(遞歸掃描Redis 2.8鍵空間(keyspace)的程序)
    1. ebscan(使用masscan工具的掃描程序)
    1. redis-cli(Redis的命令列介面,可以發送命令到Redis並從終端機直接讀取伺服器的回覆)
    1. barad_agent(雲端相關的服務)
    1. masscan(大規模IP端口掃描器)
    1. .sr0
    1. clay
    1. udevs
    1. .sshd(可以接收連線的OpenSSH伺服器程序)
    1. xig
  2. 透過apt-get或yum套件管理程式安裝所需的軟體,包括了redis-toolsiptableswgetcurlunhide
  3. 終止隱藏的程序。
  4. 下載並安裝masscanpnscan
  5. 下載並執行rs.sh

Rs.sh

這個客製化惡意腳本用來掃描Redis執行實例並執行下列動作。Redis執行實例使用端口6379。兩個公開可取得的掃描器被用來進行Redis掃描工作。

  1. 用iptables命令封鎖所有傳入到端口6379的流量,只允許來自本機的流量。
  2. 建立一個包含以下內容的.dat檔。這方法在情境一介紹過。
A screenshot of a cell phone

Description automatically generated
  • pnscan掃描端口6379。pnscan會送出字元*1\r\n$4\r\ninfo\r\n並等待被掃描電腦回應os:Linux
  • masscan掃描端口6379。使用分享的參數進行掃描,隨機從22,000組IP地址範圍中選擇。
  • masscan掃描端口6379。這次會用私有IP地址以及阿里雲、Chinanet上海和中國聯通所用的IP地址範圍。
  • masscan掃描端口6379,從現行網路介面取得已知IP地址(透過ip a命令)。
  • 對活著的Redis執行實例(從步驟3到6的掃描工作找到)執行:

redis-cli -h HOST -p PORT –raw -a PASSWORD –raw <content of .dat>

使用的弱密碼列表包括:

  • 空密碼
  • redis
  • root
  • oracle
  • password
  • p@aaw0rd
  • abc123
  • abc123!
  • 123456
  • admin

成功連上新找到Redis執行實例後,會用情境一執行init.sh腳本,並重複整個感染過程。

除了上面所分析的腳本外,該惡意軟體還使用了一些二進位檔。

Watchdog程序是個用Golang開發的檔案,主要用來啟動四個watchdog執行緒:

  • main_dog_protect_cron_thread

檢查cron內的持續性機制並在必要時加入持續性機制。

  • main_dog_protect_process_thread

檢查所需程序是否在執行中,如果沒有則加以啟動。

  • main_dog_update_thread

如果有新版本可用,更新minerconfigscannerwatchdog等二進位檔。

  • main_dog_protect_cc_thread

檢查命令和控制(C&C)伺服器是否活著。如果沒有,它會透過以太坊區塊鏈瀏覽器尋找一個寫死在程式內的地址。

A screenshot of a cell phone

Description automatically generated

這區塊鏈資料接著會轉換成新的C&C伺服器地址,這是個非常有用的功能,尤其是在攻擊者失去對現行C&C伺服器的控制權時。取得新C&C地址後,執行緒會檢查伺服器是否活著。如果是,執行緒會在網址路徑後加上寫死的字串,並下載init.psinit.sh初始化腳本,然後整個感染過程會從頭開始。

截至本文發表時,沒有與寫死在程式內的以太坊地址相關的交易。

A screenshot of a social media post

Description automatically generated

scanner是用Golang開發的執行檔,包含了一組針對各種線上服務和裝置的漏洞攻擊碼。

main_scan會呼叫下列掃描方法:

  • scan_exp_Cctv_exploit
  • scan_exp_Redis_exploit
  • scan_exp_Drupal_exploit
  • scan_exp_Hadoop_exploit
  • scan_exp_Spring_exploit
  • scan_exp_Thinkphp_exploit
  • scan_exp_Weblogic_exploit
  • scan_exp_Sqlserver_exploit
  • scan_exp_Elasticsearch_exploit

阿里雲安全對掃描模組進行了分析,列出了幾乎與上面列表一樣的漏洞攻擊碼,另外還增加了一個新的CCTV漏洞攻擊程序。

要注意的是,案例一還有一個用PowerShell來針對Windows的版本;利用工作排程器做到持續性機制,使用netshnet user來將備份條目加入系統。

案例二:Kinsing惡意軟體

Kinsing惡意軟體支援多種命令和功能,並同時具備掃描有漏洞電腦和後門功能。函式main_getTask會查詢<server>/get/並啟用工作執行。

函式main_doTask接著實現以下命令:

命令 功能
scan TCP掃描程式
update 下載新版本bot並執行
exec 從命令列執行
masscan 用masscan下載和掃描
exec_output 從命令列執行; 輸出用POST送到<server>/o
Socks Socks代理
backconnect 用TCP連接另一台機器
request 進行HTTP request
tcp 進行TCP request
download_and_exec 下載和執行
redis_brute 暴力破解Redis執行實例

與C&C伺服器的通訊用寫死的RC4密碼加密,而網址路徑則取決於其發送請求的類型:

  • /get = 取得任務
  • /h = 健康
  • /getT = 取得目標
  • /l = 日誌
  • /o = 執行輸出
  • /r = 任務結果
  • /s = 發送socks
  • /mg = 取得虛擬貨幣挖礦程式的程序ID(PID),如{“Pid”:110}
  • /ms = 發送虛擬貨幣挖礦程式的PID
A screenshot of a cell phone

Description automatically generated
圖8. 解密所收到對/get路徑的回應

函式main_minerRunningCheckmain_getMinerPidmain_isMinerRunning和main_minRun會依序執行,會先終止執行中的程序kdevtmpfsi,然後植入並執行挖礦程式。這惡意軟體會安裝XMRig惡意軟體並命名為kdevtmpfsi

函式main_healthChecker會定期將GET請求發送到<server>/h來檢查C&C伺服器是否存在。如果一切正常則會用RC4加密回應返回OK

函式main_resultSender會試著用POST將任務完成結果送到<server>/r。通訊也是經過RC4加密。

結論和安全建議

應該要採取適當的安全防護措施,特別是在DevOps的環境裡。沒有保護好Redis執行實例可能會導致RCE攻擊,這是駭客會積極地搜尋和利用的攻擊手法。我們在本文裡探討了如何利用暴露的Redis執行實例來進行虛擬貨幣挖礦,這是個相對容易被發現的程序,因為受感染裝置使用了大量資源。但暴露的Redis執行實例並不只會帶來這樣的損害,因為可以執行程式碼是攻擊者所追求的事情。一旦RCE攻擊成為可能,駭客就可以在此基礎上進行更加隱蔽和更具針對性的攻擊。

底下是一些提供給開發人員保護環境的安全建議:

  • 在執行伺服器端軟體時,確保不是使用root。即使是執行也必須遵循最佳實踐並採用最小權限原則。
  • 將軟體保持在最新版本並使用強密碼。切勿在未採取適當安全措施時就暴露到網路上。
  • 如果你剛好在檢查Redis日誌,可以真實地看到正在進行的攻擊。在下面的螢幕截圖裡,請注意來自主伺服器的完整重新同步請求。副本從主伺服器接收到大約55kB,恰好是惡意Redis模組的大小。
A screen shot of a computer

Description automatically generated

趨勢科技的雲端安全解決方案

趨勢科技Deep Security和Vulnerability Protection HYPERLINK “https://www.trendmicro.tw/tw/enterprise/product-security/vulnerability-protection/”漏洞防護透過以下規則來保護使用者:

  • 1010231 – Redis Cron Remote Code Execution Vulnerability
  • 1009967 – Redis Unauthenticated Code Execution Vulnerability

趨勢科技TippingPoint透過以下規則來保護客戶:

  • 37633: TCP: Redis Crontab Command Injection Vulnerability

入侵指標

檔案 功能 SHA-256
clean.bat 增加使用者腳本 19967f6467f05f1ac286eb8b8bf7e251075b7d288fbe9b719b8de0b6330c8787
config.json 挖礦程式設定檔 2c2438019c10352cc6678474072ce57a4191fd6ce54391d4975012f587bec1a0
init.ps1 初始腳本 d0a28e1f768c524ed3ff962c36ab2861705cdd4fd83ee5b3dc8d897f2034cb05
init.sh 初始腳本 3c7faf7512565d86b1ec4fe2810b2006b75c3476b4a5b955f0141d9a1c237d38
is.sh 安裝腳本 6faa026af253c784ef97ffec3a9953055d394061a9a1fbfdcc5b28445b73ffdc
kdevtmpfsi XMrig 24FDF5B1E1E8086031931F2678D874487316DC1E266581B328D6E34A1FD7748C
kinsingbRiXVrNDJc Bot d247687e9bdb8c4189ac54d10efd29aee12ca2af78b94a693113f382619a175b
networkservics 掃瞄器 ea55a206f7047f54a9e97cc3234848dfd3e49d0b5f9569b08545f1ad0e733286
networkservics.exe 掃瞄器 b6fc454e667081c2add1ffd5a54bafb428a82d8d8a3e34c61fc59075118f4afd
red2.so Redis模組 1fd17076800d993609a8110084f9652d06fe50cd3a279ab709c65a044076fe6d
rs.sh Redis散播程式 e2b982f9540304e31ca8d1cdafb253da7d216d1cc939a281a1a95baaa4be9b2d
sysguerd Watchdog bceee7d9ace363ef2bfb1494a9784a6377fe14c4c5fefa0c180fcec33a5d1716
sysguerd.exe Watchdog 37ecccdfc185615d4452b5c77b7313222b14776c3032c156846258c8f63185fe
sysupdata 挖礦程式 e7446d595854b6bac01420378176d1193070ef776788af12300eb77e0a397bf7
sysupdata.exe 挖礦程式 559a8ff34cf807e508d32e3a28864c687263587fe4ffdcefe3f462a7072dcc74
updata.ps1 更新 d0a28e1f768c524ed3ff962c36ab2861705cdd4fd83ee5b3dc8d897f2034cb05
updata.sh 更新 3c7faf7512565d86b1ec4fe2810b2006b75c3476b4a5b955f0141d9a1c237d38

多平台蠕蟲C&C伺服器

  • http://178[.]157[.]91.26
  • http://45[.]137[.]151.106

Kinsing C&C伺服器

  • http://45[.]10[.]88.102
  • http://91[.]215[.]169.111
  • http://139[.]99[.]50.255
  • http://193[.]33[.]87.220
  • http://195[.]123[.]220.193

@原文出處:Exposed Redis Instances Abused for Remote Code Execution, Cryptocurrency Mining 作者:David Fiser和Jaromir Horejsi(趨勢科技威脅研究人員)