銘說|針對(duì)新型惡意軟件Redis P2Pinfect的發(fā)現(xiàn)與研究分析 |
來源:聚銘網(wǎng)絡(luò) 發(fā)布時(shí)間:2023-08-16 瀏覽次數(shù): |
近期,我們的研究人員遇到了一種針對(duì)Redis數(shù)據(jù)存儲(chǔ)部署的新型惡意軟件,該惡意軟件被命名為“P2Pinfect”,它由Rust編寫,主要被用來充當(dāng)僵尸網(wǎng)絡(luò)代理。該惡意軟件樣本包括一個(gè)可移植嵌入式文件(PE)以及一個(gè)附加的ELF可執(zhí)行文件,這表明其具有跨平臺(tái)兼容性。 據(jù)進(jìn)一步研究發(fā)現(xiàn),此變體是通過利用CVE-2022-0543進(jìn)行傳播,而CVE-2022-0543是Redis某些版本中存在的LUA沙箱逃逸漏洞。接下來銘說將為您做進(jìn)一步的詳細(xì)闡述。 P2Pinfect功能特性總結(jié):
初始訪問 研究人員在對(duì)蜜罐遙測(cè)進(jìn)行分類時(shí)首次遇到了P2Pinfect。該惡意軟件通過利用復(fù)制功能來破壞Redis數(shù)據(jù)存儲(chǔ)的暴露實(shí)例,復(fù)制功能允許Redis實(shí)例以分布式方式運(yùn)行。而這會(huì)允許追隨者節(jié)點(diǎn)充當(dāng)領(lǐng)導(dǎo)節(jié)點(diǎn)的精確副本,為數(shù)據(jù)存儲(chǔ)和故障轉(zhuǎn)移提供高可用性。 在云環(huán)境中,針對(duì)Redis的常見攻擊模式是使用惡意實(shí)例來啟用復(fù)制,通過連接到一個(gè)公開的Redis實(shí)例并發(fā)出SLAVEOF命令來實(shí)現(xiàn)。當(dāng)復(fù)制完成后,攻擊者就可以加載一個(gè)惡意模塊(Linux共享對(duì)象文件),該模塊擴(kuò)展了Redis本身的功能。這種初始訪問載體于2018年首次展示,此后多次被運(yùn)用于云惡意軟件活動(dòng)中,其中包含H2miner和最近的Headcrab。
圖1 P2Pinfect用于初始訪問的Redis命令(事件排序是非線性的) P2Pinfect使用了多種已知的Redis漏洞進(jìn)行初始訪問,但最終成功破壞Cado蜜罐基礎(chǔ)設(shè)施的正是上述方法。從截圖中可以看出,隨著惡意的SLAVEOF命令被下達(dá),針對(duì)惡意領(lǐng)導(dǎo)者的Cado Redis被部署復(fù)制。 在進(jìn)行復(fù)制后,MODULE LOAD命令開始加載惡意共享對(duì)象文件exp.so。這個(gè)共享對(duì)象擴(kuò)展了Redis的功能,為攻擊者提供了反向shell訪問,并添加一個(gè)新命令system.exec,將允許在主機(jī)上運(yùn)行任意shell命令。 然后system.exec通過/dev/tcp反向shell向C2服務(wù)器發(fā)出命令,最終檢索并執(zhí)行主要的Linux負(fù)載。 P2Pinfect還嘗試通過cron我們之前描述的未經(jīng)身份驗(yàn)證的RCE機(jī)制來危害Redis主機(jī)。
圖2 用于注冊(cè)惡意cronjob的示例Redis命令 這種濫用config set dir命令的方法也可用于攻擊者控制的SSH密鑰,可確保利用后門對(duì)主機(jī)進(jìn)行訪問。P2Pinfect也嘗試此漏洞利用,在其他Redis漏洞利用嘗試失敗時(shí)提供冗余。 主要有效載荷 檢索到的主要有效負(fù)載是使用Rust的外部函數(shù)接口(FFI)庫,是一個(gè)用C語言和Rust語言組合編寫的ELF。有效負(fù)載具有一個(gè)典型的libc_start_main入口和一個(gè)C語言函數(shù),該函數(shù)在其他設(shè)置操作中為進(jìn)程進(jìn)行系統(tǒng)調(diào)用注冊(cè)了許多sigaction。然后它分成一個(gè)典型的Rust lang_start函數(shù),用來執(zhí)行有效負(fù)載的Rust組件。該組件還使用FFI與C函數(shù)進(jìn)行互操作。除此之外,二進(jìn)制文件還使用了UPX進(jìn)行打包。 執(zhí)行后,該二進(jìn)制文件將更新主機(jī)的SSH配置。它使用捆綁的配置文件將sshd_config文件更新到接近默認(rèn)狀態(tài)。而這會(huì)刪除任何可能妨礙作者通過SSH訪問服務(wù)器的配置,并啟用密碼驗(yàn)證。然后重啟SSH服務(wù),并將以下密鑰放入當(dāng)前用戶的authorized_keys文件中: 然后它使用bash運(yùn)行以下命令:
相關(guān)內(nèi)容:
由于Redis服務(wù)器是已知的易受攻擊的,惡意軟件使用iptables表明這是為了防止任何其他威脅行為者破壞Redis服務(wù)器,同時(shí)仍然允許Redis服務(wù)器的合法運(yùn)營(yíng)商仍然訪問服務(wù)器,以免信息泄露。 為了在重新啟動(dòng)后建立持久性,二進(jìn)制文件會(huì)寫入/path/to/binary到.bash_logout.無論是通過TTY還是通過SSH退出任何bash會(huì)話,都會(huì)導(dǎo)致二進(jìn)制文件重新顯示。通常,這可以通過使用.bashrc登錄時(shí)運(yùn)行命令,但使用.bash_logout是在注銷之后生成的,這可以確保任何執(zhí)行系統(tǒng)檢查的分析人員都沒有機(jī)會(huì)發(fā)現(xiàn)該進(jìn)程。 釋放有效載荷 一個(gè)名為bash的二進(jìn)制文件被放入 /tmp ,并使用execv() 運(yùn)行,參數(shù)為-bash。這樣做會(huì)導(dǎo)致ps aux在運(yùn)行后,文件自動(dòng)刪除。bash二進(jìn)制文件掃描 /proc ,并打開stat中的每個(gè)進(jìn)程,并監(jiān)視/proc變更目錄,如果二進(jìn)制文件被終止,它將重新啟動(dòng)主負(fù)載,如下所示:
圖3 被丟棄的bash二進(jìn)制文件重新顯示被終止的負(fù)載的審計(jì)日志 bash還能夠在主二進(jìn)制文件上執(zhí)行升級(jí)。它讀取主二進(jìn)制文件,并驗(yàn)證它與從僵尸網(wǎng)絡(luò)中提取的最新簽名文件是否匹配。如果不匹配(如:篡改或有新版本可用),則舊實(shí)例被終止,新版本以隨機(jī)名稱下載到相同目錄然后執(zhí)行。 主二進(jìn)制文件還將監(jiān)控文件操作的其他進(jìn)程。由于一些不明確的標(biāo)準(zhǔn)(如打開的文件數(shù)量和IOPS),它會(huì)試圖殺死超過閾值的進(jìn)程。據(jù)推測(cè),這是為了嘗試檢測(cè)事件響應(yīng)或分析工具,列舉磁盤或創(chuàng)建內(nèi)存轉(zhuǎn)儲(chǔ)。
圖4 顯示向其他進(jìn)程發(fā)送SIGKILL的示例的內(nèi)核跟蹤日志 除了bash之外,一個(gè)名為miner的二進(jìn)制文件的副本以一個(gè)隨機(jī)的名稱放在當(dāng)前目錄中被執(zhí)行然后刪除。盡管名字如此,但這個(gè)二進(jìn)制文件實(shí)際上并不是一個(gè)加密礦工。唯一觀察到的行為是它重復(fù)進(jìn)行休眠調(diào)用。然而,由于僵尸網(wǎng)絡(luò)操作員可以隨時(shí)更新二進(jìn)制文件,因此該有效負(fù)載可能只是處于休眠狀態(tài),等待僵尸網(wǎng)絡(luò)增長(zhǎng)到特定規(guī)模時(shí)才能被激活。 僵尸網(wǎng)絡(luò) P2Pinfect惡意軟件針對(duì)僵尸網(wǎng)絡(luò)的利用點(diǎn)。每臺(tái)受感染的服務(wù)器都被視為一個(gè)節(jié)點(diǎn),然后該節(jié)點(diǎn)會(huì)連接到其他受感染的服務(wù)器。假設(shè)命令是通過在網(wǎng)絡(luò)上傳播簽名的消息來發(fā)布的,這會(huì)使得整個(gè)僵尸網(wǎng)絡(luò)可以在不使用集中式C2服務(wù)器的情況下互相牽連。 啟動(dòng)后,二進(jìn)制文件開始在0.0.0.0上監(jiān)聽,端口隨機(jī)選擇,通常在60100和60150之間。該端口用于與其他對(duì)等端通信,在一個(gè)簡(jiǎn)單的HTTP服務(wù)器上提供大量有效負(fù)載,并使用HTTPS進(jìn)行實(shí)際的僵尸網(wǎng)絡(luò)協(xié)調(diào)。HTTPS服務(wù)器主要使用硬編碼證書(該證書在所有僵尸網(wǎng)絡(luò)成員中都是相同的),很可能該證書也被用作客戶端證書以向服務(wù)器進(jìn)行身份驗(yàn)證(相互TLS)。 鑒于證書的頒發(fā)日期,該活動(dòng)很可能是在6月29日或之后開始的。 二進(jìn)制文件以逗號(hào)分隔的IP和端口對(duì)列表啟動(dòng),這些IP和端口對(duì)經(jīng)過加密,然后以base64編碼作為其第一個(gè)參數(shù)。它將訪問這些服務(wù)器之一,以獲取以下所有二進(jìn)制文件的副本:
然后使用HTTP服務(wù)器提供這些二進(jìn)制文件(這樣其他新的對(duì)等點(diǎn)可以獲得一個(gè)副本)。 然后,二進(jìn)制文件將自己注冊(cè)給其他僵尸網(wǎng)絡(luò)對(duì)等體。它通過在/ip上發(fā)送HTTP請(qǐng)求來實(shí)現(xiàn)這一點(diǎn),該請(qǐng)求返回正在運(yùn)行的惡意軟件的本地主機(jī)IP。惡意軟件試圖從ipv4.icanhazip.com獲取其IP,但是由于這是惡意軟件的常見TTP,該請(qǐng)求可能會(huì)被阻止或欺騙,因此它可能會(huì)使用其他對(duì)等體進(jìn)行檢查。而這也可以用于驗(yàn)證對(duì)等體是否在線,接著它會(huì)與每個(gè)對(duì)等體建立TLS連接。
圖5 nhazip和/ip的HTTP請(qǐng)求 擴(kuò)散 此時(shí),二進(jìn)制文件將嘗試感染更多的主機(jī)。二進(jìn)制文件將讀取bash_history、ssh config和已知的hosts文件,以收集用戶、IPs和ssh密鑰的列表。然后,使用這些信息來嘗試感染新的實(shí)例。該二進(jìn)制文件還將選擇一個(gè)隨機(jī)的/16網(wǎng)絡(luò)前綴來掃描暴露的SSH和Redis服務(wù)器,并使用密碼列表來嘗試暴力破解它遇到的相關(guān)服務(wù)器。 對(duì)于Redis服務(wù)器,它將嘗試?yán)肔UA沙箱逃逸漏洞或使用和SLAVEOF命令MODULELOAD加載惡意模塊。 一旦獲得對(duì)主機(jī)的訪問權(quán)限,它就會(huì)以與最初受感染的服務(wù)器相同的方式感染該主機(jī),即刪除自身的副本(從內(nèi)置HTTP服務(wù)器獲?。┎⑹褂霉?jié)點(diǎn)列表作為參數(shù)執(zhí)行它。 結(jié)論 P2Pinfect設(shè)計(jì)精良,采用復(fù)雜的復(fù)制和C2技術(shù)。選擇使用Rust還可以更輕松地跨平臺(tái)移植代碼(Windows和Linux二進(jìn)制文件共享許多相同的代碼),同時(shí)也使代碼的靜態(tài)分析變得更加困難。這是由于Rust本身的復(fù)雜性,以至于缺乏可用于分析的工具。 研究人員遇到的樣本與Unit42分析的Windows變體具有類似的功能。盡管如此,我們的研究人員沒有發(fā)現(xiàn)任何證據(jù)表明該惡意軟件專門針對(duì)云環(huán)境。根據(jù)分析期間收集的信息,無論它們是云托管還是本地部署,P2Pinfect可能會(huì)在大多數(shù)Linux主機(jī)上運(yùn)行。 |