我們最近寫了一篇在網路上發現8,000多個沒有保護好Redis執行實例的文章。在本篇文章裡,我們會介紹這些執行實例會如何被用來進行遠端程式碼執行(RCE),就如惡意軟體在真實世界裡所做的。這些惡意程式會將Redis執行實例變成虛擬貨幣挖礦機器人,並且透過”蠕蟲”散播功能來感染其他有漏洞的執行實例。
Redis是設計使用在受信任環境並提供了保護模式設定,而且即將更新到Redis 6.0,在新版本中會導入如存取控制列表(ACL)等新的安全功能。但在目前,如果使用者的Redis執行實例沒有加上TLS加密或密碼保護,一旦攻擊者進入了環境就可以使用超過200個命令來進行攻擊。目前Redis預設並沒有身份認證。即使有設定密碼,也要確認密碼足夠強到抵抗暴力破解攻擊。
我們在蜜罐系統裡觀察到駭客使用了下列情境,這些蜜罐系統是為了吸引和監視真實攻擊而設置:
情境一:利用config命令
攻擊者用Redis資料庫檔設定多個的鍵值來成為cron任務。資料庫值遵循著cron(執行排程命令的守護程序)和crontab(用於排程執行程式的檔案)格式規範。
攻擊者用config命令將目錄設到/var/spool/cron並將dbfilename設為使用者名稱(如root),然後儲存資料庫(檔名為root)。
root檔案內容如下面截圖,基本上就是有幾行cron格式的可讀文字夾雜在二進位資料之間。
儘管檔案內有部分二進位格式內容,但如果有安裝cron,它會找出可用的條目並執行攻擊者所要下載的Shell腳本 – 這些都是因為Redis執行實例沒有受到適當保護所造成。
情境二:利用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命令仍可以在早期版本使用。
此案例裡的惡意Redis模組會下載Kinsing惡意軟體,然後下載並執行XMRig門羅幣挖礦程式。
所觀察惡意軟體樣本概述
我們會在此節裡重點介紹一些值得注意的惡意軟體樣本,這些樣本是透過上述兩種方法之一散播到暴露的Redis執行實例,且被蜜罐系統所捕捉到。
案例一:多平台shell蠕蟲安裝虛擬貨幣挖礦病毒
我們在真實世界觀察到的第一個惡意軟體是一種虛擬貨幣挖礦病毒的更新版本,此惡意軟體之前被發現會攻擊搜尋引擎Elasticsearch的已知漏洞。該惡意軟體是一種多平台蠕蟲:它同時有Linux和Windows版本,並具備用Shell和PowerShell撰寫的腳本,而且有些組件是用Golang開發的二進位執行檔。感染方式是透過修改cron檔案(如情境一所示),包含了指向init.sh檔案的連結。
Init.sh
這惡意軟體是用shell編寫的啟動或初始化腳本。它的重要功能是移除、終止和強制終止各種會耗費資源或競爭對手的程序。該腳本會執行下列工作:
- 終止跟特定惡意軟體所用模組同名的程序:
- sysguerd
- sh
- sysupdata
- networkservics
- 如果是root,會下載並安裝惡意軟體到/etc/,否則會用/tmp/。這些檔案是miner、miner config、watchdog、update和scanner。
- 透過updata.sh達到持續性能力,其內容與init.sh相同並會加進crontab。
- 將新的SSH授權金鑰安裝到/root/.ssh/authorized_keys:
- 用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內的所有已知主機(擁有之前存取過的伺服器公鑰)。它會讓每個成功連上的執行實例下載並執行https://<server>/<path>/is.sh。
- 在受感染電腦下載並執行https://<server>/<path>/is.sh。
Is.sh
用來執行下列工作的安裝腳本:
- 終止下列執行中的程序:
- redisscan(遞歸掃描Redis 2.8鍵空間(keyspace)的程序)
- ebscan(使用masscan工具的掃描程序)
- redis-cli(Redis的命令列介面,可以發送命令到Redis並從終端機直接讀取伺服器的回覆)
- barad_agent(雲端相關的服務)
- masscan(大規模IP端口掃描器)
- .sr0
- clay
- udevs
- .sshd(可以接收連線的OpenSSH伺服器程序)
- xig
- 透過apt-get或yum套件管理程式安裝所需的軟體,包括了redis-tools、iptables、wget、curl和unhide。
- 終止隱藏的程序。
- 下載並安裝masscan和pnscan。
- 下載並執行rs.sh。
Rs.sh
這個客製化惡意腳本用來掃描Redis執行實例並執行下列動作。Redis執行實例使用端口6379。兩個公開可取得的掃描器被用來進行Redis掃描工作。
- 用iptables命令封鎖所有傳入到端口6379的流量,只允許來自本機的流量。
- 建立一個包含以下內容的.dat檔。這方法在情境一介紹過。
- 用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
如果有新版本可用,更新miner、config、scanner和watchdog等二進位檔。
- main_dog_protect_cc_thread
檢查命令和控制(C&C)伺服器是否活著。如果沒有,它會透過以太坊區塊鏈瀏覽器尋找一個寫死在程式內的地址。
這區塊鏈資料接著會轉換成新的C&C伺服器地址,這是個非常有用的功能,尤其是在攻擊者失去對現行C&C伺服器的控制權時。取得新C&C地址後,執行緒會檢查伺服器是否活著。如果是,執行緒會在網址路徑後加上寫死的字串,並下載init.ps或init.sh初始化腳本,然後整個感染過程會從頭開始。
截至本文發表時,沒有與寫死在程式內的以太坊地址相關的交易。
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的版本;利用工作排程器做到持續性機制,使用netsh和net 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
函式main_minerRunningCheck與main_getMinerPid、main_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模組的大小。
趨勢科技的雲端安全解決方案
- 趨勢科技Hybrid Cloud Security為組織簡化了安全防護,讓組織在移轉到雲端或採用DevOps時可以專注於安全性和合規性。它提供了雲端安全所需具備廣度、深度和創新的多合一解決方案,透過單一主控台獲得對主要雲端環境(如Amazon Web Services(AWS)、Microsoft Azure、Google Cloud和Docker)的能見度。
- 趨勢科技Cloud One軟體即服務(SaaS)平台為組織提供針對工作負載、應用程式、容器、無伺服器環境、檔案儲存系統和網路的即時安全防護,為組織的混合雲環境提供單一管理平台。
- Cloud One平台還包含了Cloud One – Conformity,它提供了給AWS ElasticCache(Redis的記憶體內資料存放區)的自動化控制。可以確保Redis不是使用預設端口,並且對傳輸和靜止時的資料都進行了加密。
- 對於需要執行時工作負載和容器安全防護或容器映像安全防護即軟體的組織,Deep Security和Deep Security Smart Check解決方案可以在預部署期間和執行時掃描容器映像。
趨勢科技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伺服器
- https://178[.]157[.]91.26
- https://45[.]137[.]151.106
Kinsing C&C伺服器
- https://45[.]10[.]88.102
- https://91[.]215[.]169.111
- https://139[.]99[.]50.255
- https://193[.]33[.]87.220
- https://195[.]123[.]220.193
@原文出處:Exposed Redis Instances Abused for Remote Code Execution, Cryptocurrency Mining 作者:David Fiser和Jaromir Horejsi(趨勢科技威脅研究人員)