「電幕行動」(Bvp47)技術細節報告(二)——關鍵元件深度揭秘

概述

在報告「Bvp47-美國NSA方程式組織的頂級後門」(參考1)的描述中,Bvp47本身像是一個巨大的殼或壓縮包,共包含了18個分片,盤古實驗室展示了對於Bvp47後門程序的歸屬分析和部分技術細節的描述,比如BPF隱蔽隧道,但依然還有部分其他模組值得深入探究,這些模組既可以作為Bvp47的一部分一起執行任務,也可以被獨立使用。

在2015年對國內某國家重要關鍵資訊基礎設施的Solaris系統取證中,盤古實驗室提取到了一份獨立存活於Solaris平臺看起來與Bvp47關係密切的樣本,後經確認,樣本檔案內容與「影子經紀人」(The Shadow Brokers)揭露出的「飲茶」(Suctionchar_Agent)木馬程序原檔案一致。該木馬程序搭配Bvp47中的Dewdrop、Incision等模組和控制程序tipoff,可以輕鬆竊取目標系統使用者在執行ssh、passwd、sudo等命令時的賬號密碼,隨即將其隱蔽保存在目標系統中。這些被加密隱藏的密碼檔案同樣也需要RSA演算法的私鑰來解密。

基於特徵的入侵分析取證發現,國內大量重要組織機構受到了這個美國國家安全局(NSA)來源的「飲茶」(Suctionchar_Agent)木馬程序的侵襲,其中就包括了近期披露的被網路滲透的西北工業大學。有證據顯示, NSA利用「飲茶」(Suctionchar_Agent)木馬程序竊取了世界各國難以確切估量的賬號密碼,在美國各地建立了多個高度機密的賬號密碼海量資料儲存中心,供NSA的行動部門TAO隨時查詢並「合法」進入受害者的資訊系統。

追蹤Bvp47的過程更像是在摸索一張迷霧下的拼圖,在奇安盤古實驗室與國家計算機病毒應急處理中心的通力合作下,這份報告將會通過對「飲茶」(Suctionchar_Agent)、Dewdrop、Bvp47_loader等程序和系統模組的技術分析來進一步理解Bvp47這個頂級後門平臺的部分工作方式和執行邏輯。

「飲茶」嗅探木馬(Suctionchar_Agent)攻擊場景還原

攻擊場景

經過全面而深入的技術模擬分析,盤古實驗室還原了「飲茶」嗅探木馬(Suctionchar_Agent)與Bvp47後門程序其他元件配合實施聯合攻擊的場景,具體執行過程如下圖所示:

  1. 運行於核心層的sum會輔助「飲茶」嗅探木馬(Suctionchar_Agent)竊取passwd、telnet、su等進程中的賬號密碼;

  2. 竊取到的賬號密碼會同步發送給運行於Ring3的「飲茶」嗅探木馬(Suctionchar_Agent);

  3. 「飲茶」嗅探木馬(Suctionchar_Agent)會將賬號密碼保存到名為「/var/tmp/.xxxxxxxx」的隱藏目錄中;

  4. 美國國家安全局(NSA)的攻擊實施者遠端發送執行ish反彈的觸發包到核心層的BPF過濾程序;

  5. BPF過濾器捕獲到特徵包後傳送給Ring3的Dewdrop程序模組;

  6. Dewdrop進行資料包解密並收到ish反彈指令,隨即轉送給Incision程序;

  7. Incision程序主動回聯到callback地址,美國國家安全局(NSA)的攻擊實施者利用ish接受竊取的密碼檔案;

  8. 美國國家安全局(NSA)的攻擊實施者將被RSA公鑰加密的密碼檔案進行私鑰解密並還原密碼檔案;

場景復現

1. 運行tipoff控制端程序,功能列表如下:

2. 具體功能列表如下:

2. 具體功能列表如下:

類別

功能說明

觸發協議支持

支持TCP、UDP、ICMP協議

非常規TCP標誌支持

syn、fin、ack、rst、push、urg

防火牆穿透支持

PIX或其它;默認支持防火牆穿透,ACL穿透;

支持應用協議

SMTP、SIP、DNS等應用層協議

後門功能1

支持遠端啟動檔案進程

後門功能2

支持遠端Shell查看

支持各協議的擴展定製

包括SMTP、DNS、TCP等協議的標記位自定義

3. 支持UDP包的遠端shell獲取

4.UDP報文如下

4.UDP報文如下

4.UDP報文如下

5. 在獲取到的shell中可以看到被隱藏的進程和檔案

6. 「/var/tmp/」目錄下被加密的檔案如下:

7.使用suctionchar_decode對「/var/tmp/」目錄下被加密的檔案解密:

「飲茶」嗅探木馬(Suctionchar_Agent)技術細節

檔案資訊

樣本關聯溯源發現,盤古實驗室2015年提取到的樣本為「影子經紀人」(The Shadow Brokers)洩漏的檔案之一,即suctionchar_agent__v__3.3.7.9_sparc-sun-solaris2.9 ,檔案相關資訊如下:

樣本資訊概要說明

檔案名稱

未知

檔案哈希(MD5)

a633c1ce5a4730dafa8623a62927791f

檔案大小(位元組)

47,144

The Shadow Brokers具體包名稱

suctionchar_agents.tar.bz2

原始檔案名稱

suctionchar_agent__v__3.3.7.9_sparc-sun-solaris2.9

功能目標

竊取SSH、TELNET、FTP、PASSWD、SU、RSH、LOGIN、CSH等程序中的賬號密碼資訊。

CPU架構

SPARC

隱藏路徑2

/var/tmp/.xxxxxxxxxxxx

鑑於盤古實驗室提取的樣本本身為SPARC架構,比較少見,為方便讀者理解並採取有效措施進行防範,我們選擇基於x86架構、功能相同的木馬程序樣本進行分析,具體x86架構的檔案資訊如下:

樣本資訊概要說明

檔案名稱

suctionchar_agent__v__2.0.28.2_x86-linux-centos-5.1

檔案哈希(MD5)

4a5b7a9c5d41dbe61c669ed4cf2975e5

檔案大小(位元組)

31,649

The Shadow Brokers具體包名稱

suctionchar_agents.tar.bz2

原始檔案名稱

suctionchar_agent__v__2.0.28.2_x86-linux-centos-5.1

功能目標

竊取SSH、TELNET、FTP、PASSWD、SU、RSH、LOGIN、CSH等程序中的賬號密碼資訊。

CPU架構

X86

Bvp47對應分片

0x0E

隱藏路徑2

/var/tmp/.xxxxxxxxxxxx

樣本關聯

根據盤古實驗室提取的「飲茶」嗅探木馬樣本(Suctionchar_Agent),研究人員從「影子經紀人」(The Shadow Brokers)揭露出的檔案中找到了對應的原始檔案為「linux/bin/suctionchar_agents.tar.bz2/suctionchar_agent__v__3.3.7.9_sparc-sun-solaris2.9」,二者完全一致。相關壓縮包中還包含了適合多個平臺和版本的「suctionchar」木馬程序,檔案最早可追溯到2007年:

技術分析

技術分析

字串解密

如下圖所見,字串加密也就是「Bvp47」研究報告中所描述的0x47函數加密:

解密後的字串列表如下

解密後的字串列表如下:

相關解密腳本如下

相關解密腳本如下:

功能模組設計

功能模組設計

檔案「Linux\etc\opscript.txt」中對Suctionchar_Agent的功能作了相關說明,即駐留竊取SSH、TELNET、FTP、PASSWD、SU、RSH、LOGIN、CSH等程序中的賬號密碼資訊。「飲茶」(Suctionchar_Agent)程序是這個木馬程序的應用層代理,它與相關聯的核心模組通訊,接收所需資訊並加密寫入檔案。核心模組sum檔案(The Shadow Brokers Leaks未包含該檔案)可由modload程序載入,成功載入核心模組後會清空落地的檔案,防止內容被恢復:

「飲茶」(Suctionchar_Agent檔案本身既可以使用默認配置,也可以從外部讀取配置檔案,檔案格式主要包括3.x以上版本的xml格式和早期的conf格式。

3.x以上版本的xml格式(「Linux\bin\suctionchar_configure.xml」):

「Linux\doc\old\etc\suctionchar.sample.filter.conf」 :

「飲茶」(suctionchar_configure)將生成「dc9cb44a723d0e75201d933159834173「檔案,該檔案供Suctionchar_Agent使用:

密碼獲取執行緒

密碼獲取執行緒

在「飲茶」(Suctionchar_Agent)中存在一個獨立的執行緒,與核心模組sum保持通訊,接收賬號密碼並寫入到/var/tmp/檔案夾中,即sub_8049EF0函數內部:

回呼函式sub_8049A00:

密碼保存檔案的路徑生成演算法

密碼保存檔案的路徑生成演算法

在函數get_hidden_path_0804BDF0中描述了隱藏檔案」 /var/tmp/.e33ff11cb8e3b4ff/a0b973925e397d9acd80e85e2eaa6e60/d5373a146ff9f200a2376054dde25677」的生成演算法:

還原的程式碼大致如下

還原的程式碼大致如下:

還原的程式碼大致如下

「飲茶」木馬(suctionchar_decode)程序中的私鑰

正如攻擊場景一章中所描述的那樣,檔案「/var/tmp/.e33ff11cb8e3b4ff/a0b973925e397d9acd80e85e2eaa6e60/d5373a146ff9f200a2376054dde25677」可以被「linux\bin\suctionchar_decode」程序所解密,加密演算法需要用RSA私鑰解密RC6對稱金鑰後才能解密出檔案,同Dewdrop模組中的私鑰一樣,這個RSA私鑰也可以佐證該後門與「影子經紀人」(The Shadow Brokers)洩露資料包的關聯關係。

Dewdrop version 3.x 技術細節

Dewdrop模組承擔了最主要的隱蔽後門功能,即BPF過濾功能,本章節主要討論BPF引擎通訊對應的實現過程。

BPF隱蔽通訊初始化過程

1. BPF隱蔽後門的初始化是從函數_554a7941開始的;

2. 其中sec_bpf_init返回了bpf_program的結構體

3. stru_8008300結構具體值如下:

4. bpf_program和bpf_insn結構分別如下:

5. 經過bpf反彙編過後的程式碼如下:

6. 實際運行時的bpf偽程式碼如下,即滿足該規則的payload資料會被捕獲進入到下一個處理流程;

BPF隱蔽通訊資料處理過程

BPF隱蔽通訊資料處理過程

在滿足BPF的捕獲規則後,資料包會進入下一個流程來進行處理。

1. 在函數sec_f_9b510b03中可以看到Dewdrop使用select模型來處理對應的資料包

2. sec_f_6a42f4c9_allinone執行偽程式碼如下:

3. 在 sec_decode_packet 中就開始了payload資料包的解密工作,內部涉及到一處作了變形處理的RSA解密演算法。

BPF隱蔽通訊資料格式與加密演算法

1. Dewrop模組v3系列的載荷(payload)資料包格式如下:

2. tipoff中對Dewdrop模組的載荷(payload)資料包流程如下:

3. payload資料包中的RSA資料加密

Bvp47_loader技術細節

loader模組的入口函數圖具體如下,中間會涉及到:

1. 檢測運行時環境是否正常;

2. 讀取檔案尾部的payloads;

2. 對映和校驗payload有效性;

4. 解密payload,如果需要解密;

5. 解壓縮payload,如果需要解壓縮;

6. 裝載核心模組;

7. 調用通知隱藏核心模組的ELF檔案頭;

8. fork執行Dewdrop模組後門;

9. fork執行「飲茶」(Suctionchar_Agent)程序後門;

字符加密函數

字符加密函數

在樣本分析過程中,首先需要處理應對的是一系列的字串加密函數,共8處。

1. 異或0x47函數類型1:

2. 異或0x47函數類型2

2. 異或0x47函數類型2:

3. 變序加密函數

3. 變序加密函數:

4. 異或0x47函數類型3

4. 異或0x47函數類型3:

5. 異或0x47類型4

5. 異或0x47類型4:

6. 異或0x47

6. 異或0x47

7. 加密函數

7. 加密函數

8. 異或0x47函數類型5

8. 異或0x47函數類型5

8. 異或0x47函數類型5

載荷(payload)相關的加密方式

載荷(payload)在被裝載過程中主要有5種解密方式。

方式一:

方式二

方式二:

方式三

方式三:

方式四

方式四:

方式五

方式五:

載荷(payload)解密流程

載荷(payload)解密流程

如前面所見到的main函數主體流程,載荷(payload) 解析過程是一個相對複雜的循環體流程,且伴隨了諸多加密對抗。

對映和載入:

解析流程

解析流程:

涉及到的解壓縮流程

涉及到的解壓縮流程:

linux_gzip函數:

linux_gzip函數:

linux_gzip函數:

linux_gzip_inflate_fixed函數:

linux_gzip_inflate_dynamic函數:

linux_gzip_inflate_codes函數:

linux_gzip_fill_buf函數:

linux_gzip_huft_build函數:

整體抽象出來的大致C語言程式碼如下(未能完全覆蓋):

已知的payload檔案格式如下:

在實際樣本運行過程中,在上述Decode回調調用過程中也會直接開始嘗試載入so類型的檔案:

在試圖載入後也會去嘗試補丁elf檔案格式的plt:

Bvp引擎初始化與核心模組載入

Bvp引擎初始化與核心模組載入

核心模組的解密與載入也會在main流程裡執行,會經歷如下的幾個步驟:

1. 解密payload包;

2. 初始化Bvp引擎,適配對應核心版本結構;

3. 開始嘗試裝載ko模組,主要用於進程、檔案、網路的隱藏等;

具體如下:

1. 嘗試解密ko的payaload;

2. Bvp整體處理函數;

2. Bvp整體處理函數;

對應的偽程式碼

對應的偽程式碼:

對應的偽程式碼

3. Bvp引擎的初始化serial_bvp函數

對應的偽程式碼

對應的偽程式碼:

4. serial_bvp流程

4. serial_bvp流程

5. 載入第一個模組qmr

5. 載入第一個模組qmr

6. 校驗發行版

6. 校驗發行版:

6. 校驗發行版

7. 該發行版對應了TSB中的版本:

8.校驗2

8.校驗2:

8.校驗2

9. 核心模組載入時的參數驗證1:

10. 核心模組2載入時的參數驗證2:

11. 最終開始裝載核心模組

11. 最終開始裝載核心模組:

自刪除的一種繞過手段

自刪除的一種繞過手段

在main函數中有2處unlink函數的調用,實際調試過程中可以暴力修改流程繞過unlink所出現的自刪除:

基於Hash的API函數調用

基於Hash的API函數調用

在Bvp47的運行過程會有製作一張類似作基於Hash值的API函數查找的查找表。

1. 面對如下的一張Hash表;

2. 在sub_804C2E0函數中嘗試初始化

3. 在serial_bind_0x7bbf2c88_函數中進一步初始化

偽C語言程式碼

偽C語言程式碼:

部分shellcode

部分shellcode

在loader模組中還有部分是部分不太完整的加密ELF檔案,經過解密後是幾個shellcode形式的程式碼。

1. 對應的ELF頭部格式定義如下:

2. 中間的幾段shellcode會互相跳轉

3. 共6段 shellcode

結論

結論

「飲茶」嗅探木馬(Suctionchar_Agent)程序的功能專一,綜合分析Bvp47_loader、Dewdrop等模組可以看出,「電幕行動」(Bvp47)在設計上體現了良好的架構能力。美國國家安全局(NSA)的攻擊實施者可以通過Bvp47各個功能模組的靈活組合,隱蔽完成攻擊任務,同時大幅降低該木馬程序的暴露幾率。儘管美國國家安全局(NSA)實施的攻擊竊密活動具有高度的隱密性,但盤古實驗室通過自有資料視野範圍內的分析取證材料,結合對來源資料的深度挖掘,仍然完整地還原了世界頂級駭客組織「方程式」的攻擊竊密手法。

通過現有證據可以斷定,遍佈國際網際網路的無數伺服器和網路終端,以及交換機、路由器、閘道器、防火牆等設備,正在被美國國家安全局(NSA)的 「飲茶」嗅探木馬(Suctionchar_Agent)類似程序實時監測,數以億計的賬號密碼被竊取並儲存到美國國家安全局(NSA)的資料庫中,變成你工作生活中的重大安全隱患。

參考

1. Bvp47-美國NSA方程式組織的頂級後門

https://www.pangulab.cn/post/the_bvp47_a_top-tier_backdoor_of_us_nsa_equation_group/

2. The Shadow Brokers: x0rz-EQGRP

https://github.com/x0rz/EQGRP/blob/master/Linux/up/suctionchar_agents.tar.bz2

4. jtcriswell/bpfa

https://github.com/jtcriswell/bpfa

5. bpf-asm-explained

https://github.com/Igalia/pflua/blob/master/doc/technical/bpf-asm-explained.md

6. cloudflare/bpftools

https://github.com/cloudflare/bpftools

點選閱讀原文至ALPHA 5.0

即刻助力威脅研判

相關文章