Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    86371931

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

一、概述近期,我們發現一種新型的Linux惡意軟件Symbiote被報導出來,該惡意軟件被描述為“幾乎不可能被檢測到”。之所以被命名為Symbiote(中文含義:共生體),也是基於該樣本的攻擊性質:作為非獨立運行的共享庫文件加載到其他正在運行的進程中。其目的是竊取遠程主機的登錄憑證以及後門訪問。

下面將對該惡意軟件的其中一個樣本進行詳細分析。

二、詳情分析1加載方式

LD_PRELOAD是Linux系統的一個環境變量,它可以影響程序的運行時的鏈接(Runtime linker),允許你定義在程序運行前優先加載的動態鏈接庫。通過這個環境變量,可以在主程序和其動態鏈接庫的中間加載別的動態鏈接庫。通過覆蓋正常的庫函數,注入到正在運行的進程,從而達到特定的目的。

該樣本使用同名、同參數的自定義函數,通過LD_PRELOAD的方式加載到其他進程中,進而覆蓋掉同名的系統函數,優先調用自定義函數,達到調用過程劫持效果。

所有的劫持函數都如下圖邏輯:

图片圖1

2進程隱藏

該樣本會隱藏自身加載到其他程序中的共享庫痕跡,以及隱藏一起部署的其他惡意程序。

隱藏其他惡意程序

實現方式為,掛鉤readdir、readdir64、stat、statx、fstatat、fstatat64等函數,目標文件在/proc下時,獲取執行命令,判斷是否為需要隱藏的進程,若是,則跳過該條目信息,繼續執行返回下一個無需隱藏的文件條目信息。

图片圖2

图片圖3

本樣本隱藏的進程名

certbotx64

certbotx86

javautils

隱藏共享庫痕跡

除了隱藏一起部署的其他惡意程序,還會隱藏自身模塊。如用戶可通過ldd命令輸出指定的每個程序或共享對象所需的共享對象(共享庫)。如下圖所示,ldd命令會調用execve函數,該樣本就通過掛鉤execve的方式劫持返回結果。

图片圖4

通過LD_TRACE_LOADED_OBJECTS環境變量判斷是否為列出其動態庫依賴項(ldd命令)。

图片圖5

具體隱藏過程如下,fork一個子進程去執行命令,返回結果到管道。

图片圖6

在本進程中,使用後面的字符串數據覆蓋掉需要隱藏的自身庫字符串再輸出,達到隱藏效果。

图片

圖7

運行效果圖如下,該樣本目前只是過濾硬編碼寫入的文件名,改名後就會顯示出來,不排除後續版本會更新為自動獲取名稱。

图片圖8

3文件隱藏

除了隱藏進程相關的文件,還會隱藏其他非進程的信息存儲文件。在Linux系統中,使用ls、dir、tree等命令顯示出目錄下的文件信息,通過掛鉤文件相關函數readdir、readdir64就可以實現文件隱藏。

具體細節如下,讀取到需隱藏的文件流時,繼續讀取下一個,直至該文件流為非隱藏文件或為空才返回。這樣就跳過了惡意文件,達到隱藏目的。

图片

圖9

图片圖10

隱藏的文件列表

certbotx64

certbotx86

javautils

bancodobrasildev

search.so

certbot.h

cert.h

4網絡隱藏

該樣本採用了三種流量隱藏的方法,分別是劫持fopen函數、劫持注入eBPF、劫持libpcap庫函數。

劫持fopen函數

檢測到程序使用fopen讀取\proc\net\目錄下的文件時,便會生成一個臨時文件,讀取源文件的每一行並將過濾掉指定端口的數據寫入臨時文件,最後將過濾後的臨時文件句柄返回調用者,達到隱藏效果。

图片

圖11

图片

圖12

劫持注入eBPF

BPF(Berkeley Packet Filter), 中文翻譯就是伯克利包過濾器。從字面意思可以知道它的主要功能是用來過濾數據包的。根據介紹,BPF 鉤子位於網絡驅動中盡可能早的位置,無需進行原始包的複制就可以實現最佳的數據包處理性能,掛載的BPF程序是運行過濾的理想選擇。

下面是BPF流程圖:

图片圖13

劫持方法是掛鉤函數setsockeopt,該函數用於設置socket狀態。

檢測到使用SO_ATTACH_FILTER方式調用時,表示該調用用於數據包過濾。此時就會先將自身的BPF字節碼添加到其他軟件的BPF字節碼前,先一步過濾掉需隱藏的流量,再執行其他軟件注入的BPF字節碼進行過濾。

本樣本用此方法過濾TCP連接中指定端口的流量(包括入站出站)。

图片圖14

劫持libpcap庫函數

實現方法是掛鉤函數pcap_loop、pcap_stats這兩個函數。

掛鉤函數pcap_loop、pcap_stats這兩個函數,在函數pcap_loop中,劫持捕獲流量後執行的回調函數,在惡意回調函數中,匹配流量中需要過濾的域字符串,通過包數計數器加一,丟掉這個流量包。

本樣本中用此方法隱藏UDP流量數據。

图片圖15

图片圖16

5惡意功能

該樣本的主要目的有:竊取用戶登入憑證,後門遠程訪問、文件下載命令執行。

憑證記錄

當用戶使用ssh或者scp並通過公私密鑰key進行遠程主機訪問時,掛鉤後的read便會獲取調用程序命令行參數,獲取遠程主機的地址、連接RSA私鑰等信息。

图片

圖17

图片

圖18

使用簡化的CR4算法加密後,存放在/usr/include/cerbot.h文件中,並通過DNS 地址(A) 記錄請求洩露到攻擊者的控制的域名。

图片

圖19

图片圖20

後門遠程訪問

該樣本劫持Linux系統上可插拔認證模塊(PAM)的關鍵函數pam_set_item、pam_authenticate、pam_acct_mgmt。其中pam_set_item函數用於截取用戶登入密碼,pam_authenticate函數用於校驗密碼。

图片

圖21

图片

圖22

這意味著攻擊者可以使用寫入的硬編碼口令,以任意用戶遠程訪問受害者服務器。

而當其他用戶使用遠程訪問工具(ssh)訪問受害者服務器時,便會獲取遠程主機ip、登入口令等信息,作為憑證竊取的一部分發送至攻擊者域名。

文件下載命令執行

在使用pam_authenticate函數進行身份驗證時,若不是攻擊者訪問,還會向其命令與控制域CC發送DNS 地址(TXT) 記錄請求。 TXT 記錄的格式為%MACHINEID%.%C2_DOMAIN%。

如果收到響應,惡意軟件使用base64 解碼內容,使用Ed25519算法檢查內容鑰簽名,使用RC4解密內容,並在生成的bash 進程中執行shell 腳本。

6CR4

在該樣本中,所有的字符串都是通過簡化的CR4算法獲取,該CR4算法核心如下:

index=0j=0forOdrTextinrange(textlen):j=(j+1)%256index=(index+S[j])%256S[j],S[index]=S[index],S[j]hexList[OdrText]^=S[(S[j]+S[index])%256]三、檢測思路底層函數繞過:該樣本是通過掛鉤用戶層的一些關鍵函數進行隱藏,可以通過更底層的文件操作函數進行檢測。

特殊工具:還可以使用完全靜態編譯的工具,如busybox,該工具靜態編譯Linux常用命令,不依賴共享庫,此方式可以破解該樣本的隱藏手段。

行為特徵檢測:該樣本目前還未隱藏export與環境變量顯示相關的命令結果,所以還可以檢測環境變量LD_PRELOAD,進而發現問題。

流量特徵檢測:既然在終端上不好檢測流量,那就在在網絡出口處進行流量檢測。

欺騙檢測:針對蒐集到的隱藏文件信息,創建同名文件判斷是否被隱藏,也可以檢測。

內存特徵匹配:經過測試,可以使用yara規則掃描進程內存檢測╭( `∀′ )╯。

四、IOC用於接收憑證記錄數據

x3206.caixa.cx

dev42.bancodobrasil.dev

用於下發命令執行數據

x4206.caixa.cx

dev21.bancodobrasil.dev

憑證存儲路徑

/usr/include/cerbot.h

/usr/include/java.h

/etc/mpt64.h