Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863106809

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.

微信截图_20230814171206.png

SugarCRM 零日身份驗證繞過和遠程代碼執行漏洞(CVE-2023-22952)像是一個典型的漏洞。因為它是一個web應用程序,如果沒有正確配置或保護,幕後的基礎設施可以允許攻擊者增加其影響。當攻擊者了解雲服務提供商使用的底層技術時,如果他們能夠獲得對具有正確權限的憑證的訪問權限,就可以進行大量的操作。

在過去的一年中,Unit 42發現SugarCRM漏洞CVE-2023-22952是一個初始攻擊向量,允許攻擊者訪問AWS賬戶。這不是由於AWS中的漏洞造成的,它可能發生在任何云環境中。初始攻擊後,攻擊者利用錯誤的配置擴大了他們的訪問權限。

本文根據MITRE ATTCK Matrix框架列出了針對AWS環境的各種攻擊,並總結了組織可以設置的多種預防機制來保護自己。其中一些保護措施包括利用AWS提供的控制和服務、雲最佳實踐,以及確保足夠的數據保留以應對全面攻擊。

這些攻擊的複雜性表明,設置日誌記錄和監控以檢測任何未經授權的AWS API調用是多麼重要,即使它們看起來無害。如果允許攻擊者獲得一個攻擊立足點,這可能導致更可怕的活動,而這些活動並不總是可追踪的。

MITRE ATTCK MatrixMITRE ATTCK Matrix由14種不同的策略組成,這些策略描述了網絡安全攻擊的不同組成部分。

初始訪問:CVE-2023-22952這些AWS賬戶洩露的最初攻擊載體是零日SugarCRM漏洞CVE-2023-22952。 Sugar是一個價格合理並且容易使用的企業級CRM,Sugar的設計初衷是為了幫助您的企業於千載客戶溝通,共享銷售信息,促成交易以及保持客戶開心。

CVE-2023-22952由NIST國家漏洞數據庫於2023年1月11日發布,得分為8.8。由於缺少輸入驗證,此漏洞允許攻擊者通過SugarCRM電子郵件模板模塊注入自定義PHP代碼。

要理解攻擊者為什麼針對SugarCRM進行這些攻擊,了解SugarCRM客戶數據庫中存在大量敏感數據(如電子郵件地址、聯繫信息和帳戶信息)是很有幫助的。如果它被洩露,攻擊者要么選擇直接出售這些信息,要么勒索受害者以獲得更多經濟利益。

通過利用SugarCRM中的此漏洞,攻擊者可以通過該漏洞的遠程執行組件直接訪問運行此應用程序的底層服務器。在發現的示例中,這些服務器是Amazon Elastic Cloud Compute (EC2)實例,主機上存儲有長期的AWS訪問密鑰,允許攻擊者擴展其訪問權限。由於這些組織將其基礎設施託管在雲中,因此與本地託管相比,它為攻擊者提供了不同的攻擊載體。

憑證訪問一旦攻擊者獲得了對EC2實例的訪問權限,他們就成功地盜取了主機上存在的長期AWS訪問密鑰。無論計算機是位於本地還是雲中,如果用戶使用AWS命令行界面(CLI),他們都可以選擇將用於身份驗證的臨時或永久憑證存儲在存儲在主機上的憑證文件中,具體如下圖所示,其中包括文件路徑。

在我們觀察到的情況下,這些明文憑證存在於受攻擊的主機上,這允許攻擊者竊取它們並開始使用訪問密鑰開始攻擊活動。

1.png

憑證文件位置的文件路徑

發現過程在攻擊者執行任何掃描活動之前,他們首先運行命令GetCallerIdentity。 GetCallerIdentity是AWS版本的whoami。它返回關於執行調用目標的各種信息,例如與用於簽署請求的憑證相關聯的

的用戶ID、帳戶和Amazon Resource Name (ARN),如下圖所示。用戶ID是執行調用的實體的唯一標識符,帳戶是憑證所屬的AWS帳戶的唯一12位標識符,ARN包括執行調用的目標帳戶ID和人類可讀的名稱。

2.png

GetCallerIdentity響應

一旦攻擊者竊取了足夠多的憑證,他們就開始了掃描活動。他們利用Pacu和Scout Suite工具來更好地了解AWS賬戶中存在哪些資源。 Pacu是一個開源的AWS開發框架,它被設計成雲中的Metasploit。 Scout Suite是一個用於雲環境安全狀態評估的安全審計工具。

根據檢測結果,Pacu已經存在於主機上。雖然Scout Suite並不是我們看到下載到受感染的EC2實例上的工具,但我們知道它是基於與攻擊者活動相關的用戶代理使用的。這兩種工具都為攻擊者提供了大量信息,以了解他們所破壞的AWS賬戶的情況。

在本文的示例中,這些工具掃描了各種傳統服務,例如:

EC2

IAM

RDS

S3

SNS

SES

Lambda

攻擊者還對服務(例如Organizations服務和Cost and Usage服務)執行其他發現調用,這些服務不一定會為攻擊者提供有用的信息。

AWS組織為公司提供了一個集中的場所來管理多個AWS帳戶和資源。在查看CloudTrail日誌中的攻擊者活動時,有三個組織API調用非常突出。第一個調用是ListOrganizationalUnitsForParent,它列出了所有的組織單元(OU)。

這樣,攻擊者就可以運行ListAccounts,它返回與每個ou關聯的所有帳戶id,並向攻擊者提供最有用信息的最後一個調用是descripbeorganization API調用。此事件返回主帳戶ID以及與該帳戶關聯的主帳戶電子郵件地址。有了這些信息,攻擊者就有足夠的能力嘗試以Root用戶的身份登錄目標帳戶。最後一個感興趣的發現調用涉及成本和使用服務。如下圖所示,攻擊者執行各種GetCostandUsage調用,響應返回關於受攻擊帳戶中的一般成本的信息。

防御者需要意識到,攻擊者可以通過了解雲帳戶內的成本來確定帳戶的活躍程度。如果一個帳戶的總成本很大,他們可能更容易在不被發現的情況下增加新資源,因為成本可能不會突出。

另一方面,如果帳戶中的支出很少,一些新資源可能會更加突出。支出較少的帳戶所有者可能也有更嚴格的成本通知,這可能會在攻擊者創建新資源時觸發警報。

3.png

GetCostandUsage請求參數示例

4.png

GetCostandUsage響應示例

通過使用這些看似無害的API調用,攻擊者獲得了大量關於賬戶結構和使用情況的信息,而無需執行大量可能觸發警報的可疑活動。

橫向移動、執行、滲透在我們觀察到的事件中,一旦攻擊者完成了對環境的掃描,他們就有足夠的信息來縮小他們的活動範圍,從發現整個帳戶到對從關係數據庫服務(RDS)開始的各種服務採取行動。攻擊者從受攻擊的SugarCRM EC2實例橫向移動到RDS服務,並開始執行命令,從各種SugarCRM RDS數據庫創建新的RDS快照。創建這些快照不會導致原始RDS數據庫停機。

這樣,攻擊者就修改了已經允許SSH入站的預先存在的安全組規則,並為MySQL流量添加了端口3306。然後,攻擊者開始進行滲透,從快照中創建全新的數據庫,將其公開,並附加修改後的安全組。最後,他們通過更改主用戶密碼修改了新創建的RDS數據庫,這將允許他們登錄數據庫。

為了了解是否發生了任何數據洩露,在啟用了虛擬私有云(VPC)流日誌的情況下,我們可以使用日誌查看有多少字節的數據離開了環境。在沒有啟用VPC流日誌的情況下,我們發現的數據洩露受到限制。

橫向移動/執行在RDS活動之後,攻擊者再次橫向移動回EC2服務並進行了一些更改。攻擊者做的第一件事是從正在運行的SugarCRM EC2實例中創建新的Amazon Machine Images(AMI),然後從那裡運行ImportKeyPair命令導入他們使用第三方工具創建的公鑰對。完成這些任務後,攻擊者繼續創建新的EC2實例。攻擊者還將現有的安全組附加到允許從任何IP地址訪問入站端口22的EC2實例,如下圖所示。

5.png

允許端口22訪問的安全組示例

攻擊者在組織用於其正常基礎設施的其餘部分的相同區域中創建了EC2實例。他們還將區域切換到地理上的新區域,並創建了一個新的安全組,允許來自任何IP地址的端口22 SSH流量。然後,攻擊者導入另一個密鑰對。由於攻擊者切換到不同的區域,即使密鑰對與其他區域使用的密鑰對相同,也必須重新導入該密鑰對。

完成設置後,攻擊者們創建了一個新的EC2實例,但這次他們使用了AWS Marketplace上的公共AMI。此EC2實例活動顯示了在所有區域啟用GuardDuty等安全服務的重要性,以便能夠查看AWS帳戶內發生的所有事情。為了增加主動防禦,組織也可以禁用未使用的區域。

權限升級對於這些攻擊的權限升級部分,攻擊者並沒有像我們在其他情況下看到的那樣試圖創建新的IAM用戶。相反,他們選擇嘗試以Root用戶身份登錄。儘管使用了他們在發現階段從組織調用中獲得的信息,攻擊者仍然未能成功地以Root用戶登錄。 Root登錄嘗試非常嘈雜,因此這些失敗的Root登錄在CloudTrail日誌中非常突出,如下圖所示。

6.png

從CloudTrail日誌中查看Root登錄失敗

持久性除了嘗試使用Root帳戶登錄之外,攻擊者並沒有嘗試太多持久性。最明顯的持久性嘗試是在不同的區域創建EC2實例,而不是通常用於託管其基礎設施的組織。與Root登錄嘗試類似,這些新的EC2實例在CloudTrail日誌中很突出。然而,在檢查控制台中的資源時很容易遺漏一些內容,因為隨著雲環境變得更大,切換區域和跟踪所有創建的資源非常耗時。

逃避檢測一旦攻擊者攻擊了AWS賬戶,在賬戶所有者發現問題之前,他們只有有限的時間來逃避。為了不被發現,攻擊者在非標準地區部署了資源。但是,他們還在環境中打開和關閉了EC2實例。

攻擊者這樣做有幾個原因。第一個原因是降低他們的可見度。在AWS控制台中EC2實例頁面上,它默認只顯示正在運行的EC2實例。除非用戶積極地嘗試查看未運行的EC2實例,否則,一旦將攻擊者創建的新EC2實例處於停止狀態,用戶就不可能檢測到他們。

第二個原因是,停止這些資源也可以避免在組織帳戶中產生額外的成本。如果組織對成本有嚴格的通知,攻擊者停止他們創建的資源可以最大限度地降低成本,並有助於防止觸發成本警報,這是他們逃避檢測的另一種方式。除了在不同區域創建資源並停止他們創建的資源外,攻擊者沒有嘗試其他防禦規避技術,例如停止CloudTrail日誌記錄或禁用GuardDuty。

通過訪問密鑰進行緩解組織可以採取四種主要的補救措施來保護自己在未來免受這類型的攻擊。第一個是關於訪問密鑰的,對於組織來說,保護他們的訪問密鑰是至關重要的,因為我們經常看到它們是AWS被攻擊的根本原因。

在EC2實例上使用長期訪問密鑰從來都不是一個好的理由。相反,應該使用實例元數據服務(IMDS)中的EC2角色和臨時憑證。另外,請確保只使用IMDSv2,它可以防止服務器端請求偽造(SSRF)攻擊。

我們建議為存儲在主機憑證文件中的任何長期訪問密鑰創建一個清理過程。這可以通過要求用戶在完成工作後清理這些文件來實現,或者通過創建一個流程來自動清理這些文件。

我們還建議定期輪換和刪除訪問密鑰。訪問密鑰的壽命越長,它被洩露的可能性就越大。持續地輪換它們並主動刪除未使用的密鑰可以保護AWS帳戶。整個過程可以自動化,並有助於檢查訪問密鑰的安全性。

最低權限IAM策略攻擊者能夠完成攻擊唯一原因是,組織在SugarCRM主機上給予IAM用戶主體廣泛的權限。這些主機上的IAM用戶需要一些AWS權限,但是這些權限應該被限定得很窄,只包括使用這些權限的應用程序所需要的權限。這些組織並不是唯一遇到這種情況的組織,99%的雲用戶、角色、服務和資源被授予了過多的權限,而這些權限沒有被使用。

建議組織可以使用AWS Access Analyzer檢查特定IAM主體對API的歷史使用情況,並自動生成訪問策略,將其訪問權限限制為僅在你選擇的時間段內使用過的API。

編寫過於寬鬆的策略可能更容易,但是編寫範圍狹窄的權限以更好地保護AWS帳戶肯定是值得的。

通過監控Root進行緩解還有一個預防措施是圍繞Root帳戶設置監控,此帳戶應該只用於需要Root的幾個帳戶管理任務的環境中,並進行精心維護。我們還建議始終在Root上啟用多因素身份驗證,並確保使用長密碼對其進行保護。

日誌記錄和監控最後一項防禦措施是確保它們配置了正確的日誌記錄。 CloudTrail和GuardDuty都應該在所有區域中啟用,並將日誌發送到集中位置。

當涉及到GuardDuty時,攻擊警報應該被發送到一個團隊,該團隊將根據警報的嚴重性做出響應。在本文的示例中,組織啟用了GuardDuty,我們看到GuardDuty在攻擊的早期就發現了這些訪問密鑰洩露。

我們還建議組織啟用VPC流量日誌,以幫助捕獲可能發生的任何數據洩露。這些日誌在解決網絡連接問題時非常有用。對於所有這些不同的服務,確保保留好操作記錄是很重要的。無論環境如何,任何地方都可能發生攻擊,確保日誌保留足夠長的時間對於捕獲完整的攻擊至關重要。

總結儘管攻擊者能夠在這些攻擊中完成很多任務,但我們發現組織可以採取一些很好的補救措施來更好地保護自己。由於訪問密鑰是最常見的初始攻擊向量,因此盡可能避免使用長期訪問密鑰。在AWS中,這意味著為開發人員工作站使用EC2角色、IAM Roles Anywhere或Identity Center集成。保護這些密鑰的另一個方式是設置異常使用監控。對於這些攻擊,攻擊者執行異常API調用,這些調用都可以通過日誌分析檢測到。

還必須進行基本的最低權限分析,以便在雲內部或外部運行的代碼只具有完成其工作所需的權限。

除了監控訪問密鑰外,還需要確保監控雲帳戶的異常活動。在AWS中,這看起來像是監控各種服務,如CloudTrail、VPC流程日誌和S3服務器訪問日誌。如果你的雲帳戶中的服務正在通過異常端口訪問新的和不尋常的IP地址,則需要確保監控配置可以發出警報。此外,如果組織在S3桶中有敏感數據,則監控S3服務器訪問日誌以記錄對存儲桶的異常調用有助於主動發現攻擊。

攻擊者NOBELIUM最近加強了通過基於電子郵件的攻擊,郵件釣魚攻擊自2021 年初以來一直在進行。我們將繼續監視這種主動攻擊活動,並發布更多詳細信息。在本文中,我們重點介紹了代表NOBELIUM 使用的獨特感染鏈的四個工具:EnvyScout、BoomBox、NativeZone 和VaporRage。據觀察,這些工具早在2021 年2 月就在野外使用,試圖攻擊各種敏感的外交和政府目標。

本文中討論的每個NOBELIUM 工具都是為靈活性而設計的,使使用者能夠隨著時間的推移適應場景。 NOBELIUM 的安全能力可能影響了該工具集的設計,該工具集為在潛在高風險和高對抗環境中的使用者提供了更好的隱藏功能。這些安全功能是:

使用可信通道:BoomBox是一款獨特開發的下載程序,用於從攻擊者控制的Dropbox帳戶獲取後期有效負載。所有初始通信都通過HTTPS利用Dropbox API。

環境分析:與NOBELIUM、BoomBox、VaporRage 和一些NativeZone 變體使用的其他工具一致,樣本會對受影響的系統環境進行一定程度的分析。

混淆:VaporRage 是一個獨特的shellcode 加載器,被視為第三階段的有效載荷。 VaporRage 可以完全在內存中下載、解碼和執行任意負載。這種設計和部署模式,其中還包括在受感染網站上暫存有效載荷,阻礙了傳統的工件和取證調查,允許獨特的有效載荷不被發現。

儘管自2020 年底SolarWinds 攻擊事件曝光以來,社區知名度不斷提高,但NOBELIUM 仍繼續以全球政府和外交實體為目標。我們預計,隨著這些業務的進展,NOBELIUM 將繼續完善其工具和策略,以面向全球目標。

0x01 EnvyScout:NV.html(惡意HTML 文件)NV.html被Microsoft 跟踪為EnvyScout,最好將其描述為一個能夠對惡意ISO 文件進行反混淆並將其寫入磁盤的惡意投放器。 EnvyScout 主要通過魚叉式網絡釣魚電子郵件的附件發送給NOBELIUM 的目標。

NV.html的HTML

組件#1:跟踪和憑據收集URL

img

在EnvyScout 的一種變體中,

第一個以file://協議處理程序為前綴,表示試圖誘使操作系統通過端口445 將敏感的NTLMv2 信息發送到指定的攻擊者控制的IP 地址。 攻擊者很可能正在運行憑據在這些事務的另一端捕獲服務,例如Responder。

第二個URL 在分析時解析為與前者相同的IP 地址,遠程獲取作為HTML 誘餌一部分的圖像。這種技術有時被稱為“網絡錯誤”,作為對NOBELIUM 的各種讀取返回,驗證預期目標是否已打開惡意附件。

組件#2:FileSaver JavaScript 幫助程序代碼

img

EnvyScout 的第二部分是開源工具FileSaver的修改版本,旨在幫助通過JavaScript 將文件寫入磁盤。該代碼直接從公開可用的變體中藉用,並進行了細微改動,包括去除空格、將十六進制參數轉換為十進制以及重命名變量。通過將此代碼與下面詳述的組件#3 和#4 相結合,NOBELIUM 有效地實現了HTML 走私方法。這種方法可以通過在執行時在動態更改的內容中隱藏已知惡意文件類型來規避對已知惡意文件類型的靜態分析。

https://github.com/eligrey/FileSaver.js

https://outflank.nl/blog/2018/08/14/html-smuggling-explained/組件#3:混淆的ISO 文件

img

EnvyScout 的第三部分包含存儲為編碼blob 的有效負載。此有效負載通過使用單字節密鑰對每個字符進行異或來解碼,然後生成Base64 有效負載,然後通過組件#2 和#4 解碼並寫入磁盤。

組件#4:去混淆器和釋放器腳本

img

EnvyScout 的最後一個組件是一個簡短的代碼片段,負責解碼Base64 編碼/XOR'd blob 中的ISO,並將其作為NV.img保存到磁盤,並使用mime 類型“application/octet-stream”。在感染的這個階段,用戶應該通過雙擊打開下載的ISO NV.img。

EnvyScout 變體#1:

img

在攻擊者的網絡釣魚活動的某些迭代版本中,EnvyScout 包含被window.location.pathname調用的守護進程,並利用其值來確保返回的字符數組中的前兩個條目是“C”和“:”。如果不滿足這個條件,表明樣本不是從C:驅動器執行,那麼嵌入的ISO 就不會寫入磁盤。

img

EnvyScout 變體#2:

img

在至少一個EnvyScout 實例中,我們觀察到了對正在執行的瀏覽器環境的進一步枚舉,其中用戶代理用於確定Windows 機器是否收到了ISO 負載。

1.NV.img(惡意ISO 文件)當目標用戶通過雙擊打開NV.img時,Windows 10 上的默認行為是在下一個可用驅動器上安裝ISO 映像。 Windows 資源管理器隨後會在一個窗口中顯示已安裝ISO 的內容,類似於用戶打開文件夾或壓縮檔案時看到的內容。

img

如上所示,掛載的ISO 包含一個可見文件,一個名為NV的快捷方式文件。但是,在Windows 中調整文件和文件夾設置以顯示隱藏文件和文件夾會暴露一個名為NV的隱藏文件夾和一個名為BOOM.exe的隱藏可執行文件:

img

用戶很可能會與NV.lnk進行交互,但是手動執行隱藏文件BOOM.exe也會導致系統被感染。下面詳細介紹了每個文件的各個內容。

2.NV.pdf(釣魚文件)掛載的ISO 中隱藏的NV 目錄包含一個名為NV.pdf的誘餌PDF 文件:

img

如本分析稍後所述,NV目錄的內容通過BOOM.exe顯示給用戶。

3.NV.lnk(惡意快捷方式)NV.lnk是隱藏文件BOOM.exe的快捷方式、啟動器。如下所示,該快捷方式利用了一個二進製文件(LOLBin) 來使用以下硬編碼的快捷方式目標值來代理BOOM.exe的執行:C:\Windows\System32\rundll32.exe c:\ windows\system32\advpack.dll,註冊OCX BOOM.exe。

img

還發現了此LNK 文件的變體,其中包含以下快捷方式目標值:C:\Windows\System32\cmd.exe /c start BOOM.exe。

圖標通常是文件夾,旨在誘使目標用戶認為他們正在打開文件夾的快捷方式。

還觀察到已知LNK 文件的以下目標:

C:\Windows\System32\rundll32.exe IMGMountingService.dll MountImgHelper

C:\Windows\System32\rundll32.exe diassvcs.dll InitializeComponent

C:\Windows\System32\rundll32.exe MsDiskMountService.dll DiskDriveIni

C:\Windows\system32\rundll32.exe data/mstu.dll,MicrosoftUpdateService

0x02 BoomBox:BOOM.exe(惡意下載器)BOOM.exe被微軟追踪為“BoomBox”,可以說是一個惡意下載程序。下載器負責下載和執行感染的下一階段組件。這些組件是從Dropbox 下載的(使用硬編碼的Dropbox Bearer/Access 令牌)。

執行時,BoomBox 確保在其當前工作目錄中存在名為NV 的目錄。如果該目錄存在,BoomBox 會在新的Windows 資源管理器窗口中顯示NV目錄的內容(讓用戶打開PDF 文件)。

img

接下來,BoomBox 確保系統上不存在以下文件:%AppData%\Microsoft\NativeCache\NativeCacheSvc.dll(此文件將在本分析的後面部分介紹)。 BoomBox 會枚舉受害者係統的各種受害者主機信息,例如受害者係統的主機名、域名、IP 地址和用戶名,以編譯以下字符串:

img

接下來,BoomBox 使用硬編碼的加密密鑰“123do3y4r378o5t34onf7t3o573tfo73”和初始化向量(IV) 值“1233t04p7jn3n4rg”對上面的主機信息字符串進行加密。為了將數據偽裝成PDF 文件的內容,BoomBox 將PDF 的magic標記添加到上面的AES 加密主機信息字符串中:

img

BoomBox 繼續將上述數據(偽裝成PDF 文件)上傳到Dropbox 中的一個專門針對每個受害者的系統文件夾。出於演示目的,下麵包含用於將文件/數據上傳到Dropbox 的示例HTTP(s) POST 請求。

img

為確保文件已成功上傳到Dropbox,BoomBox 使用一組正則表達式值來檢查來自Dropbox 的HTTP 響應。如下所示,正則表達式用於檢查從Dropbox 收到的HTTP 響應中是否存在is_downloadable、path_lower、content_hash和size字段。值得注意的是,即使上傳操作不成功,BoomBox 也會忽略此檢查的結果並繼續進行。

img

接下來,BoomBox 從Dropbox 下載加密文件。出於演示目的,下面顯示了用於從Dropbox 下載加密文件的示例HTTP(s) POST 請求。

img

從Dropbox 成功下載加密文件後,BoomBox 丟棄加密文件頭部的前10 個字節和尾部的7 個字節,然後使用硬編碼的加密密鑰“123do3y4r378o5t34onf7t3o573tfo73”和IV 值對文件的其餘部分進行AES 解密“1233t04p7jn3n4rg”。 BoomBox 將解密後的文件寫入文件系統%AppData%\Microsoft\NativeCache\NativeCacheSvc.dll。然後,它通過創建名為MicroNativeCacheSvc的Run 註冊表值來為NativeCacheSvc.dll建立持久性:

HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MicroNativeCacheSvc

Run 註冊表值使用以下命令填充,該命令用於使用rundll32.exe並通過調用其名為“ _configNativeCache ”的導出函數來執行NativeCacheSvc.dll:

rundll32.exe %AppData%\Microsoft\NativeCache\NativeCacheSvc.dll _configNativeCache

接下來,BoomBox 從Dropbox 路徑/tmp/readme.pdf下載第二個加密文件,丟棄加密文件頭部的前10 個字節和結尾的7 個字節,然後對文件的其餘部分進行AES 解密(使用與上述相同的AES IV 和密鑰)。它在%AppData%\SystemCertificates\CertPKIProvider.dll 中寫入解密文件,然後使用與上面相同的rundll32.exe命令繼續執行先前刪除的文件NativeCacheSvc.dll。

如果系統已加入域,BoomBox 會執行LDAP 查詢以通過過濾器((objectClass=user)收集所有域用戶的專有名稱、SAM 帳戶名稱、電子郵件和顯示名稱等數據) (objectCategory=person))。

img

枚舉數據經過AES 加密(使用與之前相同的IV 和密鑰),封裝在偽造的PDF 文件中,並上傳到Dropbox 路徑/new/

0x03 NativeZone:NativeCacheSvc.dll(惡意加載器)NativeCacheSvc.dll,被稱為“NativeZone”,最恰當的描述是一個惡意加載器,它負責利用rundll32.exe加載惡意下載組件CertPKIProvider.dll。

NativeCacheSvc.dll的惡意功能位於configNativeCache的DLL 導出函數中。

img

如上所示,導出函數通過調用名為eglGetConfigs的導出函數執行rundll32.exe來加載*%AppData%\SystemCertificates\Lib\* CertPKIProvider.dll。

0x04 VaporRage:CertPKIProvider.dll(惡意下載器)CertPKIProvider.dll,被稱為“VaporRage”,被描述為一個shellcode 下載器。此版本的VaporRage 包含11 個導出函數,包括eglGetConfigs,它包含DLL 的惡意功能。

img

正如前面所提到的,NativeZone利用RUNDLL32.EXE執行eglGetConfigs的導出功能CertPKIProvider.dll。執行時,導出函數首先確保系統上存在NativeZone DLL %AppData%\Microsoft\NativeCache\NativeCacheSvc.dll(否則會終止)。接下來,導出功能向合法但受到攻擊的WordPress 站點holescontracting[.]com發出HTTP(s) GET 請求。 GET 請求由動態生成和硬編碼的值組成,例如:

img

GET 請求的目的是首先將系統註冊為受到威脅,然後從WordPress 站點下載XOR 編碼的shellcode blob。成功下載後,導出函數XOR 對shellcode blob 進行解碼(使用硬編碼的多字節XOR 密鑰“346hrfyfsvvu235632542834”)。

img

然後通過跳轉到可執行內存區域中shellcode blob 的開頭,繼續在內存中執行解碼的shellcode。下載、解碼、執行過程無限期地重複,大約每小時一次,直到從內存中卸載DLL。 VaporRage 可以執行其C2 服務器提供的任何兼容shellcode,包括Cobalt Strike 階段shellcode。

定制Cobalt Strike 加載器NOBELIUM 使用了多個自定義Cobalt Strike Beacon 加載器(可能使用自定義Artifact Kit 模板生成)來啟用其惡意活動。其中包括TEARDROP、Raindrop 和其他自定義加載器。

img

新的加載器DLL 包含誘餌導出名稱和函數,以及從合法應用程序借用的代碼和字符串。新的NativeZone 加載器可以分為兩種變體:

變體#1:這些加載器嵌入了編碼/加密的Cobalt Strike Beacon shellcode

變體#2:這些加載器從另一個附帶文件(例如,RTF 文件)加載編碼/加密的Cobalt Strike Beacon shellcode。

在接下來的部分中,我們將討論我們在調查中觀察到的一些新的NativeZone Cobalt Strike Beacon 變體。

NativeZone 變體#1與之前的NOBELIUM 自定義Cobalt Strike 加載器(例如TEARDROP 和Raindrop)類似,這些NativeZone 加載器負責解碼/解密嵌入式Cobalt Strike Beacon 階段shellcode 並在內存中執行它。一些NativeZone 加載程序具有反分析反調試功能以阻止對樣本的分析。

在這些版本的NativeZone 中,攻擊者使用了各種編碼和加密方法來混淆嵌入的shellcode。例如,在下面的示例中,NativeZone 變體使用簡單的字節交換解碼算法來解碼嵌入的shellcode:

img

img

另一個示例採用不同的解碼方法來解碼嵌入式shellcode,如下所示:

img

另一個示例採用去混淆方法,利用AES 加密算法解密嵌入的shellcode,如下所示:

img

下面顯示了另一個利用AES 解密嵌入式Cobalt Strike shellcode blob 的NativeZone 示例:

近日,ESET 研究人員深入研究了Donot組織在2020 年和2021 年期間針對多個南亞國家的政府和軍事對象實施的攻擊。

Donot組織(也稱為APT-C-35 和SectorE02)是一個至少從2016年開始運營的威脅組織,並以使用Windows和Android惡意軟件攻擊南亞的組織和個人而聞名。 Amnesty International最近的一份報告將該組織與一家印度網絡安全公司聯繫起來,後者可能正在向該地區的政府出售間諜軟件或提供黑客出租服務。

我們一直在密切關注Donot組織的活動,並追踪了幾起利用源自該組織的簽名yty 惡意軟件框架的Windows 惡意軟件的活動。根據我們的發現,這個組織非常執著地攻擊者一個目標,至少在過去的兩年裡一直以相同的組織為目標。

我們會在本文介紹最近活動中使用的惡意軟件的兩種變體——DarkMusical 和Gedit。對於每一種變體,我們都會分析整個攻擊鏈,並深入了解該組織如何更新其工具、策略和技術。

攻擊目標分析Donot組織的活動以間諜活動為主要載體,使用他們的簽名惡意軟件:“yty”惡意軟件框架,其主要目的是收集和洩露數據。根據我們的追踪,Donot組織專注於南亞的幾個目標——孟加拉國、斯里蘭卡、巴基斯坦和尼泊爾——如下圖所示。

1.png

Donot組織專注的目標國家

這些攻擊集中在:

政府和軍事組織;

外交部;

大使館;

除了南亞的幾個國家之外,如中東、歐洲、北美和拉丁美洲的國家也在Donot組織的攻擊範圍之內。

對於APT運營商來說,在某些情況下,這是通過部署一個更隱蔽的後門來實現的,該後門在攻擊者需要它之前一直保持安靜。在其他情況下,他們只是用新的惡意軟件或以前使用過的惡意軟件的變體重新啟動操作。後者是Donot組織操作人員的情況,只是他們在嘗試中非常堅持。

根據ESET的分析,Donot組織每隔兩到四個月就會針對同一對象發送一波又一波帶有惡意附件的釣魚郵件。有趣的是,我們能夠檢索和分析的電子郵件並沒有顯示出被誘騙的跡象。一些電子郵件是從受到攻擊的同一組織發送的。攻擊者可能已經在早期的活動中攻擊了一些受害者的電子郵件帳戶,或者這些組織使用的電子郵件服務器。

通過魚叉式網絡釣魚電子郵件,攻擊者使用惡意Microsoft Office 文檔來部署他們的惡意軟件。我們已經看到Donot組織至少使用了三種技術。一種是Word、Excel 和PowerPoint 文檔中的宏,如下圖所示。

2.png

PowerPoint 文檔中的惡意宏,它刪除了一個下載器可執行文件並創建了一個計劃任務來運行它

第二種技術是具有.doc擴展名的RTF文件,該文件利用方程編輯器中的內存破壞漏洞CVE-2017-11882,如下圖所示。這些RTF 文檔還包含兩個作為OLE 對象的嵌入式DLL,用於安裝並下載更多組件(這兩個DLL 都在Gedit 部分中進行了描述)。這允許攻擊者執行shellcode 並且不需要用戶交互,shellcode 部署了惡意軟件的主要組件。 CVE-2017-11882是微軟公佈的一個遠程執行漏洞,通殺目前市面上的所有office版本及Windows操作系統。該漏洞的成因是EQNEDT32.EXE進程在讀入包含MathType的ole數據時,在復制公式名稱名稱時沒有對名稱長度進行校驗,從而造成棧緩衝區溢出,是一個非常經典的棧溢出漏洞。上次出現這麼典型的office棧溢出漏洞是著名的CVE-2012-0158。

3.png

RTF 文檔用於加載公式編輯器的COM 對象的CLSID,隨後的OLE 對象包含CVE-2017-1182 漏洞利用

4.png

DLL 的OLE 對象標頭也嵌入在RTF 文檔中

第三種技術是遠程RTF 模板注入,它允許攻擊者在打開RTF 文檔時從遠程服務器下載有效負載。這是通過在RTF 文件格式的可選\*\template 控製字中插入URL 而不是本地文件資源的位置來實現的。 Donot組織使用的有效負載是另一個利用CVE-2017-11882 的文檔,下載後會自動加載,如下圖所示。

5.png

當Word 打開帶有遠程模板的RTF 文件時,它會自動嘗試下載資源

yty惡意軟件框架由NetScout 在2018 年發現的yty 惡意軟件框架是舊框架EHDevel 的一個不太複雜且開發不佳的變體。 yty框架由一系列下載程序組成,這些下載程序最終會下載一個帶有最小功能的後門程序,用於下載和執行Donot組織工具集的其他組件。

其中包括基於文件擴展名和創建年份的文件收集器、屏幕捕獲器、鍵盤記錄器、反向shell 等。如下圖所示,用於滲透的組件從暫存文件夾收集收集的情報,並將每個文件上傳到僅用於此目的的指定服務器。

6.png

解析暫存JPEG 屏幕截圖的文件夾名稱的組件(左)和在暫存文件夾中查找所有文件的滲透組件(右)

幾乎每個新的攻擊活動都會更改暫存文件夾的名稱和位置,以及一些組件的文件名。但是,在某些情況下,組件的名稱保持不變,例如:gedit.exe、wuaupdt.exe、lmpss.exe、disc.exe 等。如下圖所示,似乎對於每個新的活動,為了設置新的路徑和文件名,必須在源代碼中更改這些值然後重新編譯,因為這些組件都沒有使用配置塊或文件。

7.png

包含經常更改的位置和文件名的加密字符串(頂部)和用於構建CC URL 的未加密值(底部)

該惡意軟件使用計劃任務進行持久化攻擊,並在活動之間交替使用DLL 和EXE 文件。對於DLL,計劃任務執行rundll32.exe 以加載它們並執行導出的函數之一。

yty框架的開發人員主要依賴c++編程語言,可能是為了逃避檢測,他們還將其組件移植到其他語言,例如VBScript、Python(與PyInstaller 一起打包)、Visual C# 和AutoIt 等。然而,自2019 年以來,我們只看到他們利用C++和Go編程的組件。

8.png

捕獲屏幕截圖的組件的反編譯代碼,最初是用c++編寫的

9.png

用於用Go編寫的版本的組件截圖的反編譯代碼

該惡意軟件在部署過程中有時會使用兩到三個服務器。它可能在其下載鏈中使用一個服務器,而後門可能會使用另一台服務器來接收其命令並下載更多組件,或者將同一台服務器用於這兩種目的。總是使用不同的服務器上傳收集的信息。在一些攻擊中,Donot組織重用了以前攻擊的CC域——用於下載和滲透。如下圖所示,這些組件(後來被認為是DarkMusical 的變體)在同一攻擊中使用,採用了三個不同的CC 域。

10.png

第一個下載器解密服務器的URL,從該服務器下載鏈的下一個階段

11.png

在後期階段,後門使用不同的服務器進行CC 通信

12.png

滲透組件使用第三個服務器上傳收集的文件時間軸的攻擊

我們在本文中描述了從2020 年9 月到2021 年10 月的Donot組織在活動中使用的惡意軟件變體,重點關注他們的Windows 惡意軟件。為清楚起見,我們將它們分為yty 惡意軟件框架的兩個變體:Gedit 和DarkMusical,其中一個使用Gedit的特定活動,我們將其命名為Henos。

根據我們的追踪分析,攻擊的時間線如下圖所示。統計時,還包括了來自另一個變體的攻擊,稱為“Jaca框架”。然而,我們不會在本文描述它,因為它已在CN-SEC中進行過介紹。

13.png

從2020年9月到2021年10月,Donot組織的攻擊時間線

DarkMusical根據ESET 的分析,使用此變體的第一波攻擊發生在2021 年6 月,針對孟加拉國的軍事組織。我們只能恢復其下載鍊及其主要後門。鑑於受害者人數很少,我們認為這可能是一次針對性很強的攻擊。

9 月,針對尼泊爾軍事組織的第二波攻擊使用了新的CC 服務器以及文件和暫存文件夾名稱。我們能夠恢復一些從後門下載的組件,進而分析這些攻擊。

魚叉式釣魚郵件發送的PowerPoint文檔中包含一個宏,該宏部署了下載鏈的第一個組件,並使用一個計劃任務進行持久化。當潛在的受害者打開這些文檔時,他們將看到一條虛假的錯誤消息,如下圖所示,這些文檔將仍然沒有任何可見的內容。

14.png

一個空白的惡意PowerPoint 文檔的屏幕截圖

如下圖所示,下載程序鏈旨在下載最終組件,該組件用作具有最少功能的後門:它下載獨立組件,使用ShellExecute Windows API 執行它們,獲取並保存新的CC URL。 ShellExecute的功能是運行一個外部程序或者是打開一個已註冊的文件、打開一個目錄、打印一個文件等,並對外部程序有一定的控制。

後門將處理信息收集和洩露的組件下載到專用服務器。這些組件不與後門或CC 通信以報告其活動。相反,它們使用指定的文件夾來暫存數據,一個單獨的滲透組件將收集所有內容並上傳。

15.png

觀察到的DarkMusical攻擊鏈

我們決定將此活動稱為DarkMusical,因為攻擊者為其文件和文件夾選擇名稱時,許多是西方名人或電影中的角色。下表簡要描述了攻擊鏈中每個組件的用途。

DarkMusical 攻擊活動鏈中的組件:

16.png

我們在下表中描述了攻擊者工具集的每個組件的用途。

攻擊者DarkMusical 工具集中的組件描述:

16加.png

geditgedit是一個GNOME桌面環境下兼容UTF-8的文本編輯器,它使用GTK+編寫而成,它十分的簡單易用,有良好的語法高亮,支持包括gb2312、gbk在內的多種字符編碼,是一個自由軟件。

我們在2020 年9 月使用Gedit 檢測到該活動的首次攻擊,攻擊對像是巴基斯坦的一些組織,這些組織已經成為安裝了Jaca框架的魚叉式釣魚和惡意RTF文件的目標。從那時起,Donot組織開始將目標定位在孟加拉國、尼泊爾和斯里蘭卡。雖然該惡意軟件顯然源自yty 惡意軟件框架,但它們是截然不同的,與DarkMusical是兩個獨立的程序。

我們能夠檢索到與2021年2月發生的Gedit活動對應的魚叉式釣魚電子郵件,如下圖所示。第一個附件包含一份來自孟加拉國軍事對象的人員名單(沒有惡意內容)。在執行惡意代碼時,第二個附件只顯示了一個空白頁面。

17.png

攻擊者發送的魚叉式釣魚電子郵件的屏幕截圖

我們可以看到第二個文件的大小大於2 MB,這是一個利用CVE-2017-11882 刪除文檔中包含的兩個DLL 文件並執行其中一個的RTF 文件。其他組件在各個階段下載到受感染的計算機上。此攻擊鍊及其惡意軟件組件的概述如下圖所示。

18.png

Gedit 活動中的攻擊鏈

這些組件是用Go 和C++(使用MinGW 和Visual Studio 編譯器)編寫的。我們選擇描述2021 年2 月該活動中使用的組件,如下表所示。

對Gedit 變體的組件描述19.png

Henos攻擊活動

最後,值得一提的是,在2021年2月至3月間發生了一系列針對孟加拉國和斯里蘭卡軍事組織的攻擊。這些攻擊使用了Gedit惡意軟件的變體,但進行了一些小的修改。因此,我們決定將這個活動以它的後門DLL – henos.dll 命名命名為Henos。

去年2月,網上也公開了屬於這波攻擊的組件的樣本,這可能解釋了為什麼該組織不再使用這些組件的原因。

雖然我們沒有找到相應的魚叉式釣魚郵件或惡意文檔,但攻擊鏈與我們上面描述的大致相同,只是在組件的執行方式上存在一些細微差別。下圖對此進行了概述。

20.png

Henos 活動的攻擊鏈

雖然該活動的某些組件被命名為javatemp.exe 和pytemp.exe,但選擇這些文件名可能只是為了模仿Java 或Python 等合法軟件。 pytemp.exe 和plaapas.exe 是用Go 語言編碼的,而javatemp.exe 是用C++ 編碼的(用MinGW 編譯的)。

最後一點是執行文件洩漏的組件pytemp.exe 會執行檢查以查看gedit.exe 是否正在運行。如果找到兩個或更多實例,則退出。我們認為這是開發時候的錯誤,因為它應該檢查pytemp.exe。然而,這個簡單的錯誤幫助我們將Henos 活動與惡意軟件的Gedit 變體(添加到代碼相似性中)聯繫起來。

Broadcom是全球無線設備的主要供應商之一。由於這些芯片用途廣泛,因此構成了攻擊者的高價值目標,因此,在其中發現的任何漏洞都應視為帶來了很高的風險。在此博客文章中,我記錄了我在Quarkslab實習的情況,其中包括獲取,反轉和Fuzzing固件,以及發現一些新漏洞。

0x00 介紹Broadcom是全球無線設備的主要供應商之一,他們生產帶有43系列標籤的無線芯片,從智能手機到筆記本電腦,智能電視和物聯網設備,你幾乎可以在任何地方找到這些芯片。你可能會在不知道的情況下就使用了它,例如,如果你有戴爾筆記本電腦,則可能正在使用bcm43224或bcm4352卡;如果你擁有iPhone,Mac筆記本,Samsumg手機或Huawei手機等,也可能使用Broadcom WiFi芯片。

由於這些芯片用途廣泛,因此變成了攻擊者的高價值目標,因此,在其中發現的任何漏洞都應視為會帶來很高的風險。

我研究了很長一段時間的Broadcom芯片,將已知漏洞複製並移植到其他易受攻擊的設備,以學習和改進幾種常見的信息安全慣例,在此文章中,我記錄了我的研究過程,包括獲取,逆向和Fuzzing固件,以及分析發現的一些新漏洞。

0x01 關於WLAN和Linux在開始之前,讓我們看一下802.11無線標準。

1997年創建的第一個IEEE 802.11標準[1]標準化了PHY和MAC層,這是最低的兩個OSI層。

對於PHY層,選擇了兩個頻帶:紅外(IR)頻帶和微波頻帶(2.4GHz);之後,其他標準(例如802.11a [2])帶來了另一個頻率範圍(5GHz)。

MAC層使用三種類型的幀:管理,數據和控制;802.11標頭幀的幀控製字段標識任何給定幀上的類型。spacer.gif 1584961556518.png

管理幀由MLME(MAC子層管理實體)實體進行管理。根據處理MLME的內核的位置,我們可以得到兩種主要類型的無線芯片實現:SoftMAC(其中MLME在內核驅動程序中運行)和HardMAC(也稱為FullMAC),其中MLME在固件中嵌入在嵌入式固件中。芯片並不是像生活中看到的那麼簡單,存在一些混合實現,例如,探測響應和請求由驅動程序管理,而關聯請求和身份驗證則由芯片的固件處理。

FullMAC設備在功耗和速度方面提供了更好的性能,這就是為什麼它們在智能手機中得到大量使用,並且往往成為市場上使用最多的芯片的原因。它們的主要缺點是限制了用戶發送特定幀或將其設置為監視模式的能力,為此,將需要直接編輯芯片上運行的固件。

從Linux操作系統的角度來看,以上內容為我們提供了無線堆棧中組件的兩種主要佈局:當無線設備是SoftMAC設備時,內核將使用稱為'mac80211'的特定Linux內核模塊(LKM)。該驅動程序公開MLME API以便管理管理幀,否則內核將直接使用硬件驅動程序並將MLME處理卸載到芯片的固件中。

spacer.gif 1584961578973.png

0x02 Broadcom 的bcm43xxx芯片Broadcom bcm43xxx系列同時具有HardMAC和SoftMAC卡。不幸的是,我們找不到所分析所有芯片的所有數據表,賽普拉斯收購Broadcom的“ IoT業務”分支後,已經發布了一些可用的數據表;但是,有些芯片同時集成了WLAN和藍牙函數,例如bcm4339或bcm4330。

分析的所有芯片都將ARM Cortex-M3或ARM Cortex-R4用作非關鍵時間操作的主要MCU,因此我們需要處理兩個類似的指令集:armv7m和armv7r。這些MCU具有一個ROM和一個RAM,其大小取決於芯片組的版本。

所有時間緊迫的操作都由D11內核的Broadcom專有處理器實現,該處理器主要負責PHY層。

這些芯片使用的固件分為兩部分:一部分寫入ROM,不能修改,另一部分由驅動程序上傳到芯片的RAM。這樣,供應商僅通過更改固件的RAM部分就可以為其芯片添加新函數或編寫更新。

1584961611277.png

FullMAC芯片非常有趣,首先如在固件代碼中實現MLME層之前所述,但是它們還提供卸載函數,例如ARP緩存,mDNS,EAPOL等。這些芯片還具有一些硬件加密模塊,可以加密和解密密碼,流量,管理密鑰等。

所有卸載函數都增加了攻擊面,為我們提供了一個不錯的研究空間。

為了與主機(應用處理器)進行通信,b43系列使用了幾種總線接口:USB,SDIO和PCIe。

1584961638947.png

在驅動程序方面,我們可以將bcm43xxx驅動程序集分為兩類:開源和專有。

開源:

马云惹不起马云b43 (reversed from proprietary wl/old SoftMAC/Linux)

马云惹不起马云brcmsmac(SoftMAC/Linux)

马云惹不起马云brcmfmac(FullMAC/Linux)

马云惹不起马云bcmdhd(FullMAC/Android)

專有:

马云惹不起马云broadcom-sta aka'wl'(SoftMAC FullMAC/Linux) spacer.gif 1584961665277.png

“ wl”驅動程序在諸如路由器之類的嵌入式系統上最常用。它通常也用在筆記本電腦上,而筆記本電腦的驅動程序不支持brcmfmac/brcmsmac,例如Dell XPS上的bcm4352芯片。另外,wl驅動程序使用其自己的MLME,不需要LKM'mac80211'處理管理幀,從而為攻擊者擴大了攻擊面。

Broadcom發行的版本通常稱為“混合”驅動程序,因為代碼的主要部分來自兩個已編譯的ELF(在編譯時使用的對象)。為什麼兩個?因為一個用於x86_64體系結構,另一個用於i386。這些對象保存了驅動程序的主要代碼,因此公開了許多Broadcom API的函數。

芯片的固件和wl驅動程序共享許多代碼,因此在一個中發現的漏洞也可能在另一個中存在。

0x03 獲取固件1)第一部分:RAM固件

如前所述,固件分為兩部分。最容易抓住的部分是RAM部分,該部分由驅動程序加載到RAM中,這部分包含主MCU使用的代碼和數據,以及D11內核使用的微代碼。

固件的此部分未簽名,並且使用CRC32校驗和“驗證”完整性。這導致了一些固件修改,以便添加諸如監控器模式之類的函數;例如,SEEMO Lab發布了NEXMON項目[3],這是一個了不起的框架,用於通過用C編寫補丁來修改這些固件。

在我們的研究中,我們遇到了兩種可能的RAM固件映像格式:第一個也是最常遇到的是沒有特定結構的簡單二進制blob;第二種是TRX格式,在bcm43236芯片上工作時很容易解析。

使用.bin RAM固件時,通常在文件末尾有一個字符串,用於顯示:

马云惹不起马云芯片版本

马云惹不起马云芯片用於主機進行加密狗通信的總線

马云惹不起马云固件提供的函數;p2p,TDLS等

马云惹不起马云固件版本

马云惹不起马云CRC校驗和

马云惹不起马云創建日期。

當使用的驅動程序是brmfmac或bcmdhd時,我們可以直接從主機文件系統獲取RAM固件。在Linux上,我們可以在/lib/firmware/brcm中找到它,在Android上可以在/system/vendor/firmware中找到它。

在其他情況下,它會根據我們使用的系統而有所不同:

1584961691355.png

如果使用的驅動程序是專有wl,我們可以在LKM的.data部分中找到固件的RAM部分,可以使用LIEF輕鬆提取[8]。

wl=lief.parse('wl.ko')

data=wl.get_section('.data')

forsymbolinwl.symbols:

.if'dlarray_'insymbol.name:

.print(symbol.name)

.

dlarray_4352pci

dlarray_4350pci

b4352=wl.get_symbol('dlarray_4352pci')

bcm4352_fw=data.content[b4352.value:b4352.value+b4352.size]

withopen('/tmp/bcm4352_ramfw.bin','wb')asf:

.f.write(bytes(bcm4352_fw))

.

442233

$strings/tmp/bcm4352_ramfw.bin|tail-n1

4352pci-bmac/debug-ag-nodis-aoe-ndoeVersion:6.30.223.0CRC:ff98ca92Date:Sun2013-12-1519:30:36PSTFWID01-9413fb21發布的bcm4352固件最新採用WL上的Linux驅動程序的日期2013年

2)第二部分:ROM簡介

固件的ROM部分是了解這些芯片內部的最重要的部分。

為了拿到ROM部分,我們需要知道它的映射位置。查找基址的最佳方法是讀取驅動程序的頭文件,例如在bcmdhd的頭文件/include/hndsoc.h 中;另一種替代方法是讀取Nexmon項目README,該項目根據我們的MCU型號為我們提供了其他基址,精明的讀者可能會發現這些地址不同。 Nexmon項目指定具有Cortex-M3的芯片的ROM加載為0x800000,bcmdhd的標頭顯示為0x1e000000,兩者都是正確的,似乎ROM和RAM映射了兩次。此外,知道基址可以為我們提供有關所使用的MCU的線索,例如,如果將ROM轉儲到0x000f0000,則表明該芯片正在使用ARM Cortex-R4。

1584961734791.png

3)在Android系統上獲取ROM

在Android上,我們可以使用dhdutil工具,該工具是舊wlctl實用程序的Android開源改進分支,通過使用此工具的“內存字節”函數,我們可以轉儲芯片組的RAM,在某些情況下還可以轉儲ROM。

adbshell/data/local/tmp/dhdutil-iwlan0membytes-r0x00xa0000rom.bin例如,在依賴Cortex-R4的Nexus 5中使用的bcm4339芯片上,ROM被直接轉儲。不幸的是,在較舊的bcm4330(Cortex-M3)上,此函數無效;但是,只要你可以與RAM交互,就可以Hook一個函數,該存根將把ROM逐片複製到RAM中的空區域,之後,我們可以轉儲所有ROM的分片。

spacer.gif 1584961798349.png

4)恢復Linux系統上的ROM

在具有brcmfmac驅動程序的Linux上,我們無法直接訪問ROM。因此,我們需要找到一種直接在ROM或RAM中與芯片內存交互的方法。幸運的是,當芯片使用SDIO總線與主機進行通信時,開源brcmfmac驅動程序將公開brcmf_sdiod_ramrw函數,此函數使我們可以從主機讀取和寫入芯片組的RAM。

如果我們修改驅動程序以便在此函數周圍添加一個ioctl包裝器,則可以從一個很小的userspace實用程序讀取和寫入芯片組的RAM。

在調用brcmf_sdiod_ramrw之前,我們必須調用sdio_claim_host以便回收SDIO總線的利用率;請注意,如果該設備未連接到任何接入點,則該設備可能處於低功耗模式,並且總線可能處於空閒狀態,因此我們需要通過調用bcmf_sdio_bus_sleep和brcmf_sdio_clkctl來確保設備的總線正常運行。

intbrcmf_ioctl_entry(structnet_device*ndev,structifreq*ifr,intcmd)

{

.

sdiobk-alp_only=true;

sdio_claim_host(sdiobk-sdiodev-func[1]);

brcmf_sdio_bus_sleep(sdiobk,false,false);

brcmf_sdio_clkctl(sdiobk,CLK_AVAIL,false);

res=brcmf_sdiod_ramrw(sdiobk-sdiodev,margs-op,margs-addr,buff,margs-len);

if(res)

{

printk(KERN_DEFAULT'[!]Dumpmemfailedforaddr%08x.\n',margs-addr);

sdio_release_host(sdiobk-sdiodev-func[1]);

kfree(buff);

return(-1);

}

if(copy_to_user(margs-buffer,buff,margs-len)!=0)

printk(KERN_DEFAULT'[!]Can'tcopybuffertouserland.\n');

.

}我們需要編寫一個小程序來與用戶領域的ioctl進行交互,有了它,我們能夠讀寫設備RAM:

.

memset(margs,0,sizeof(t_broadmem));

margs.addr=strtol(ar[1],NULL,16);

margs.op=1;

if(errno==ERANGE)

prt_badarg(ar[1]);

len=strtol(ar[2],NULL,10);

if(errno==ERANGE)

prt_badarg(ar[2]);

margs.buffer=hex2byte((unsignedchar*)ar[3],len);

if((s=socket(AF_INET,SOCK_DGRAM,0))0)

return(-1);

strncpy(ifr.ifr_name,ar[0],IFNAMSIZ);

margs.len=len;

ifr.ifr_data=(char*)margs;

if(!(ret=ioctl(s,SIOCDEVPRIVATE,ifr)))

printf('[+]Writesuccesfull!\n');

else

printf('[!]Failedtowrite.\n');

close(s);

free(buf);

return(ret);

.現在我們可以讀寫芯片的RAM,我們可以通過以下方式轉儲ROM:

马云惹不起马云Hook位於RAM中並由動作X調用的函數

马云惹不起马云將ROM逐片複製到RAM中的空白區域

马云惹不起马云轉儲所有新復制的ROM片並將其串聯。

此協議與我們在芯片的MCU是Android上的Cortex-M3時使用的協議相同;但是,這次我們不得不修改驅動程序並構建自己的工具以使用新驅動程序的ioctl。

在RPI3芯片(bcm43430)上工作時,我們選擇了這種方法。

5)在特定情況下獲取ROM部分

還有許多其他可能的方案:

如果你的芯片將brcmfmac驅動程序與PCIe總線一起使用怎麼辦?如果你的芯片使用專有驅動程序“ wl”在嵌入式系統中怎麼辦?如果主機操作系統上沒有shell,該怎麼辦?或者,如果你沒有權限?等等.

在所有其他情況下,你都有幾種可能:如果可以訪問硬件,則可以尋找UART訪問,或者可以掛接wl驅動程序,在“ SFR微型解碼器”(bcm43236)上工作時,我們選擇了UART訪問。

RTE(usbrdl)v5.90(TOB)runningonBCM43235r3@20/96/96MHz.

rdl0:BroadcomUSBRemoteDownloadAdapter

ei1,ebi2,ebo1

RTE(USB-CDC)6.37.14.105(r)onBCM43235r3@20.0/96.0/96.0MHz

000000.007ei1,ebi2,ebo1

000000.054wl0:BroadcomBCM43235802.11WirelessController6.37.14.105(r)

000000.060nodisconnect

000000.064reclaimsection1:Returned91828bytestotheheap

000001.048bcm_rpc_buf_recv_mgn_low:HostVersion:0x6250e69

000001.054ConnectedSession:69!

000001.057revinfo

000063.051rpcuptime1minutes

?

000072.558reboot

000072.559rmwk

000072.561dpcdump

000072.563wlhist

000072.564rpcdump

000072.566md

000072.567mw

000072.569mu

000072.570?

波特率為115200 b/s,命令md允許將內存轉儲到特定地址,你應該指定地址以及要轉儲的DWORD數,有了一個很小的PySerial腳本,我們就能夠轉儲ROM並獲得實時RAM。

#!/usr/bin/envpython3

importserial

importbinascii

nb=65535

baseaddr=0

uart=serial.Serial('/dev/ttyUSB0',115200)

uart.write(b'md0x%08x4%d\n'%(baseaddr,nb))

i=0

dump=b''

whilei!=nb:

read=uart.readline().split(b'')

ifb''inread[0]:

continue

ifb'rpc'inread[2]:

continue

print('Dump%s%s\r'%(read[1][:-1],read[2]),end='')

dump+=binascii.unhexlify(read[

sl-malicious-pos-terminal-payment-transaction-phone-1200x600.jpg

ATM 惡意軟件組織Prilex自2014 年起就開始活躍,不過在2016 年,該組織決定放棄ATM 業務,將所有註意力集中在PoS 系統。很快,他們採用了惡意軟件即服務模式,並將攻擊範圍擴大至巴西以外的地方,以模塊化的方式創建了一套包括後門、上傳程序和竊取程序的工具。

Prilex PoS惡意軟件從一個簡單的內存抓取器演變為非常先進和復雜的惡意軟件,直接處理PIN pad硬件協議而不是使用更高級別的API,在目標軟件中進行實時修補,掛鉤操作系統庫,擾亂回复、流量和端口,以及從基於重放的攻擊切換到為其GHOST 交易生成密碼,即使是使用CHIP 和PIN 技術保護的信用卡。

在2016 年的狂歡節期間,一家巴西銀行意識到他們的ATM 已被黑客入侵,其中的所有現金都被盜了。根據事後報告,策劃此次攻擊的攻擊者能夠在同一起事件中感染屬於一家銀行的1000多台機器,這使他們得以在巴西複製2.8萬張獨特的信用卡。

攻擊者沒有進入ATM的物理權限,但他們能夠通過一個包含4G路由器和樹莓派的DIY設備訪問銀行的網絡。通過打開後門,他們能夠劫持該機構的無線連接,並隨意攻擊ATM。在獲得初始網絡訪問權限後,攻擊者將運行網絡識別過程以查找每個ATM 的IP 地址。有了這些信息,攻擊者將啟動橫向移動階段,使用默認的Windows 憑據,然後在所需的系統中安裝定制的惡意軟件。後門將允許攻擊者通過啟動惡意軟件界面並輸入攻擊者提供的代碼來清空ATM 套接字,每個被黑客攻擊的ATM的代碼都是自定義的。

1.png

感染了Prilex 的ATM

攻擊中使用的惡意軟件名為Prilex,它是通過使用特權信息和ATM 網絡的高級知識從零開始開發的。該惡意軟件能夠從插入受感染ATM 的信用卡和借記卡上的磁條中捕獲信息。之後,這些有價值的信息可用於克隆銀行卡並從銀行客戶那裡竊取更多資金。

演變成PoS 惡意軟件的過程Prilex 已經從專注於ATM 的惡意軟件演變為針對巴西國內的支付系統的模塊化惡意軟件,即所謂的EFT/TEF 軟件。它們的ATM 和PoS 版本之間有許多相似之處。他們的第一個PoS 惡意軟件於2016 年10 月在野外被發現。前兩個樣本的編譯日期為2010/2011,如下圖所示。但是,研究人員認為由於不正確的系統日期和時間設置而設置了無效的編譯日期。在後來的版本中,時間戳對應於發現樣本的時間。我們還注意到,在2022 年開發的軟件中,開發人員開始使用Subversion 作為版本控制系統。

2.png

Prilex PoS 惡意軟件的版本:2022 年的3 個新版本

如上所示,Prilex 在2020 年非常活躍,但在2021 年突然消失,並在2022 年重新出現並發布了三個新變體。

Prilex的PoS版本是用Visual Basic編寫的,但本文中描述的竊取模塊是用p-code編寫的。簡而言之,這是Visual Basic 程序中的高級指令與CPU 執行的低級本機代碼之間的中間步驟。 Visual Basic在運行時將p-code語句轉換為本機代碼。

Prilex 並不是唯一起源於巴西的PoS 惡意軟件,研究人員發現它與原來的Trojan-Spy.Win32.SPSniffer 存在某種聯繫,兩個家族都能夠攔截PIN pad的信號,但使用的方法不同。

PIN pad配備硬件和安全功能,以確保在有人試圖篡改設備時擦除安全密鑰。事實上,PIN在進入設備時使用各種加密方案和對稱密鑰進行加密。大多數情況下,這是一個三重DES編碼器,使它很難破解PIN。

但是有一個問題:這些設備總是通過USB 或串行端口連接到計算機,這些端口與EFT 軟件進行流量。原來的PIN pad設備使用過時和弱加密方案,使得惡意軟件很容易安裝USB 或串行端口嗅探器來捕獲和解密PIN pad和受感染系統之間的流量。這就是SPSniffer 獲取信用卡數據的方式。有時流量甚至沒有加密。

3.png

SPSniffer:允許捕獲非加密流量的串口嗅探器

Prilex 用於捕獲信用卡數據的主要方法是使用PoS 系統庫中的補丁,允許惡意軟件收集軟件傳輸的數據。惡意軟件將尋找一組特定的可執行文件和庫的位置,以便應用補丁,從而覆蓋原始代碼。安裝補丁後,惡意軟件會從TRACK2 收集數據,例如帳號和到期日期,以及執行欺詐交易所需的其他持卡人信息。

初始感染載體Prilex 不是一種廣泛傳播的惡意軟件,因為它不是通過電子郵件垃圾郵件活動傳播的。它具有高度針對性,通常通過社會工程傳播,例如,目標企業可能會接到自稱是“技術人員”的電話,他堅持認為該公司需要更新其PoS軟件。假冒技術人員可能會親自訪問目標,或要求受害者安裝AnyDesk,並為其提供遠程訪問權限,以安裝惡意軟件。

4.png

PoS 供應商關於Prilex 社會工程攻擊的警告

使用EMV標準的漏洞發起攻擊巴西於1999 年開始使用EMV,如今,該國發行的幾乎所有卡都支持芯片。芯片內部有一個基於java的小應用程序,可以很容易地操作以創建一張“金票(golden ticket)”卡,該卡在大多數銷售點系統中都有效。這使攻擊者能夠升級他們的工具集,使他們能夠以這種新技術為特色創建自己的卡片。

最初版本的Prilex能夠執行重放攻擊,在這種攻擊中,它們沒有破壞EMV協議,而是利用了糟糕的實現。由於支付運營商未能執行EMV 標準要求的某些驗證,攻擊者可以利用該過程中的這一漏洞為自己謀取利益。

在這種攻擊中,欺詐者通過卡片網絡推送常規磁條交易作為EMV購買,因為他們控制著支付終端,並有能力操縱通過該終端進行交易的數據字段。後來他們轉而從真正的基於EMV 的芯片卡交易中獲取流量。攻擊者可以將被盜的卡數據插入交易流程,同時動態修改商家和收購方的銀行賬戶。

至少從2014年起,巴西網絡攻擊者已經成功發起重放攻擊,比如2019 年對一家德國銀行的攻擊,該銀行損失了150 萬歐元,Prilex團伙聲稱對此負責。從名稱字段和工具的功能來看,他們很可能使用了他們在黑市上銷售的軟件。

為了使用克隆的信用卡自動進行攻擊,Prilex 攻擊者使用了Xiello 等工具,這是研究人員在2020 年通過遙測技術發現的。該工具允許網絡攻擊者在進行欺詐性購買時批量使用信用卡。它將購買數據發送給信用卡購買者,然後由他們批准或拒絕交易。

5.png

Prilex 用於自動化交易的Xiello 工具

隨著支付行業和信用卡發行商修復EMV 中的漏洞被修復,重放攻擊變得過時且無效,這促使Prilex 團伙採用其他新的信用卡欺詐方式。

從“Replay”技術到“Ghost”技術的演進最新版本的Prilex在攻擊方式上與之前的版本有所不同:該組織已從重放攻擊轉變為使用受害者卡在店內支付過程中生成的密碼進行欺詐交易,攻擊者將其稱為“GHOST 交易”。

在這些攻擊中,Prilex 樣本作為RAR SFX 可執行文件安裝在系統中,將所有必需的文件提取到惡意軟件目錄並執行安裝腳本(VBS 文件)。從已安裝的文件中,我們可以突出顯示該活動中使用的三個模塊:一個後門,在這個版本中除了用於流量的C2服務器外沒有改變;一個竊取模塊和一個上傳模塊。

6.png

維護持久性的Prilex方法

竊取模塊負責攔截銷售點軟件和用於在交易期間讀取卡的PIN pad之間的所有流量。一旦識別出正在運行的交易,惡意軟件將攔截並修改交易內容,以便能夠捕獲卡信息並向受害者的卡請求新的EMV 密碼。這些密碼隨後用於GHOST 交易。

7.png

用於解析發送/接收的密碼鍵盤消息的方法

為了針對一個特定的進程,攻擊者將對機器進行初步篩選,以檢查它是否是具有足夠信用卡交易的有趣目標,並確定他們將針對的流程。

進程被識別後,惡意軟件將繼續安裝攔截交易信息所需的掛鉤。由於PoS 軟件和讀卡器之間的流量是通過COM 端口進行的,因此惡意軟件會在目標進程內安裝許多Windows API 的掛鉤,旨在根據需要監控和更改數據。有趣的是,Prilex 不是為掛鉤程序分配內存,而是在模塊內存中找到空閒空間,這種技術稱為代碼洞穴,這使得一些安全解決方案很難檢測到受感染系統中的威脅。

8.png

添加到CloseHandle進程中的掛鉤代碼

從交易中捕獲的所有信息都被保存到一個加密文件中,該文件位於惡意軟件配置之前設置的目錄中。這些文件隨後會被發送到惡意軟件C2服務器上,允許網絡攻擊者通過以虛假公司名義註冊的欺詐性PoS 設備進行交易。

9.png

捕獲的信用卡數據稍後將被發送到運營商服務器

以前的版本監控交易是為了獲取原始交易生成的密碼,然後使用收集的密碼執行重放攻擊。在這種情況下,密碼具有相同的ATC(應用程序交易計數器),允許通過重複使用ATC 以及密碼內部的日期與提交日期不匹配的事實來識別欺詐交易,因為欺詐交易是在較晚的時間提交的。

在較新版本的Prilex 執行的GHOST 攻擊中,它會在捕獲交易後請求新的EMV 密碼。然後,這些密碼將通過其中一種網絡犯罪工具用於欺詐交易,其輸出日誌如下所示。

10.png

上表顯示了從惡意軟件收集的數據。它包含由卡生成的授權請求密碼(ARQC),現在應該得到發卡機構的批准。剖析響應(80128000AA5EA486052A8886DE06050A03A4B8009000)後,我們得到以下信息。

11.png

卡上應用了多個應用程序密碼,其中交易金額(藍色)、ATC(綠色)和生成的密碼(紅色)在每次交易中都會發生變化。

12.png

簡而言之,這是整個Prilex 方案:

13.png

Prilex:從感染到套現

後門模塊後門有許多命令,除了內存掃描程序常見的內存掃描之外,較老的(ATM) Prilex版本還提供了一個命令,用於調試進程和查看其內存。這很可能被用於了解目標軟件行為並對惡意軟件或環境進行調整以執行欺詐交易。舊版本的Prilex 對特定軟件庫進行了修補,而較新的示例不再依賴特定軟件,而是使用Windows api來執行它的工作。

14.png

Prilex 調試器

下面是在ATM版本的Prilex中使用的命令列表,其中包括調試:

Reboot,SendKeys,ShowForm,Inject,UnInject,HideForm,Recursos,GetZip,SetStartup,PausaProcesso,LiberaProcesso,Debug,SendSnapShot,GetStartup,CapRegion,CapFerro,KillProcess,Shell,Process,GetModules,GetConfi g,StartSendScreen,StopSendScreen,ReLogin,StartScan,GetKey,SetConfig,RefreshScreen,Download,TakeRegions,EnviarArquivo,ScanProcessStart,ScanProcessStop,StartRegiao,StopRegiao,StartDownload,StopDownload.

即使在PoS 版本中添加了一組新命令,我們仍然可以發現一些來自ATM 攻擊的命令仍在使用中。許多可用的命令都是通用的,這允許攻擊者收集有關受感染機器的信息。

15.png

上傳模塊

該模塊負責檢查配置文件中CABPATH參數指定的目錄,並將所有被盜交易生成的cab文件發送到服務器,這些文件是通過HTTP POST 請求發送的。模塊使用的終端也在上傳器配置文件中提到。

16.png

該模塊的使用表明該組織的操作結構發生了變化,因為在之前的版本中,收集到的信息被發送到服務器,該服務器的地址被硬編碼為竊取代碼,並且該模塊使用與後門相同的協議。該上傳程序允許操作人員根據配置文件中的指示設置所收集信息的終端,從分析的樣本來看,可以看到該過程涉及不同的基礎設施。

17.png

捕獲的數據存儲在上傳器C2 中

惡意軟件即服務早2019年,一家聲稱與Prilex有關聯的網站開始提供據稱是該組織創建的惡意軟件包。研究人員認為這是不可能的,因為該網站可能由試圖冒充該組織的模仿者運營,並利用Prilex 多年來贏得的聲譽來賺錢。

在撰寫本文時,該網站仍在運行中。

18.png

據稱是Prilex PoS 套件的要價是3500 美元

19.png

該網站稱其所有者過去曾與俄羅斯網絡攻擊者合作,不過該說法還無法被驗證。值得一提的是,研究人員在地下渠道發現了通過Telegram 聊天銷售的Prilex 惡意軟件包被引用,價格在10000 歐元到13000 美元之間。研究人員無法確認所提供的是真正的Prilex 惡意軟件。

同時,Prilex 現在使用Subversion 清楚地表明他們正在與多個開發人員合作。

總結Prilex 組織非常擅長對信用卡和借記卡交易發起攻擊,並開髮用於支付處理的軟件。這使攻擊者能夠不斷更新他們的工具,以找到繞過授權策略的方法,從而允許他們執行攻擊。

經過多年的活動,該組織已經迭代了很多攻擊技術。但是,它總是濫用與PoS 軟件相關的流程來攔截和修改與PIN pad的流量。考慮到這一點,研究人員強烈建議PoS 軟件開發人員在其模塊中實施自我保護技術。

sl_monster_head_code_abstract-1200x600.jpg只要攻擊者想賺錢,他們就會不斷開發惡意程序,只要他們不斷開發惡意程序,研究人員就會不斷分析。例如,研究人員發布了一份關於在地下論壇上發現的新惡意程序的報告,研究人員稱之為ASMCrypt,它與DoubleFinger加載程序有關。

但攻擊事件層出不窮,研究人員發布了關於新版Lumma竊取程序和Zanubis Android銀行木馬的報告。 Lumma通過從受感染的設備和已安裝的應用程序中收集敏感信息,LummaC2 是輕量級的,大小僅為150-200 KB,可以感染從Windows 7 到Windows 11 的所有操作系統。

LummaC2 惡意程序能夠從用戶的計算機收集密碼、信用卡號、銀行賬戶和其他個人信息。它還可以訪問存儲在Web 瀏覽器(例如Chrome 和Firefox)中的數據,此外,LummaC2 可以在用戶不知情的情況下截取用戶的桌面或活動窗口,這使攻擊者能夠訪問可用於經濟利益或身份盜用的敏感數據。

Zanubis 木馬是一種針對Android 設備的惡意程序,屬於銀行木馬,這是一種旨在盜取銀行憑證的程序。之後,攻擊者可以訪問被攻擊的賬戶並將受害者的資金轉移到他們自己的賬戶中, 與大多數銀行木馬一樣,Zanubis 也利用Android 無障礙服務來執行其操作。

這一合法的Android 功能旨在幫助殘障用戶更輕鬆、更充實地操作他們的智能設備, 此外,Zanubis 還會收集各種設備詳細信息,包括製造商、設備型號、已安裝應用程序列表、受害者的聯繫人列表、指紋等。另外,它還可以獲得電池權限,以避免在用戶激活任何電池優化過程時被強制進入“睡眠”模式。 Zanubis 的運營商還可以向受害者發送SMS 消息或顯示選定的通知,他們甚至可能刪除特定應用程序或鎖定受感染設備的屏幕。

ASMCrypt研究人員監控著許多地下論壇,在其中一個網站上,他們看到了一則廣告,上面正在宣傳一種名為ASMCrypt的新密碼/加載程序變體。這種類型的惡意程序背後的想法是,在沒有加載過程或有效負載本身被AV/EDR等檢測到的情況下加載最終有效負載。這聽起來很像之前介紹的DoubleFinger加載程序。

事實上,經過仔細分析,研究人員高度相信ASMCrypt是DoubleFinger的迭代版。然而,ASMCrypt的工作方式略有不同,它更像是運行在TOR網絡上的實際服務的“前台”。

那麼它是如何工作的呢?首先,購買者獲得ASMCrypt二進製文件,該二進製文件通過TOR網絡使用硬編碼憑據連接到惡意程序的後端服務。如果一切正常,將顯示選項菜單:

1.png

買方可以從以下選項中進行選擇:

隱形或隱形注射方式;

有效負載應注入的進程;

用於啟動持久性的文件夾名稱;

Stub類型:要么是偽裝成Apple QuickTime的惡意程序本身,要么是側加載惡意DLL的合法應用程序。

選擇所有所需選項並按下構建按鈕後,應用程序將創建一個隱藏在.png文件中的加密blob,此圖像必須上傳到圖像託管網站。最後一點提到的惡意DLL或二進製文件也會被創建並被傳播。

當惡意DLL在受害系統上執行時,它會下載.png文件,對其進行解密,將其加載到內存中,然後執行。

LummaArkei竊取程序是用c++編寫的,於2018年5月首次出現,在過去幾年中已經多次被迭代或重新命名。它曾被稱為Vidar, Oski, Mars和現在的Lumma,與Arkei有46%的重疊。隨著時間的推移,所有變體的主要功能均保持不變,從加密錢包竊取緩存文件、配置文件和日誌,它可以通過充當瀏覽器插件來實現這一點,但它也支持獨立的Binance應用程序。

但首先是感染媒介。 Lumma是通過一個模仿合法.docx到.pdf網站的偽造網站傳播的。上傳文件時,返回的文件擴展名為.pdf.exe。

Lumma於2022年8月首次被發現,當時研究人員是在新檢測到的樣本中被發現的。大約在同一時間,網絡安全愛好者Fumik0_tweeted發現,Lumma是Mars的“迭代/重構”。從那時起,Lumma經歷了許多變化。

截至目前,研究人員只發現一個樣本(MD5 6b4c224c16e852bdc7ed2001597cde9d)具有收集系統進程列表的功能,同一個樣本還使用了不同的URL與C2通信(/winsock而不是/socket.php)。

研究人員還發現了一個樣本(MD5 844ab1b8a2db0242a20a6f3bbeedf6 b),它似乎是一個調試版本,當到達某些代碼片段時,將向C2發送一個通知。同樣,它使用了一個不同的URL(/wwindg)。

在最近的一個樣本(MD5 a09daf5791d8fd4b5843cd38ae37cf97)中,攻擊者將User-Agent字段更改為“HTTP/1.1”。目前尚不清楚為什麼要這樣做。

儘管之前的所有樣本(包括上面提到的三個樣本),都從C2下載了用於32位系統的附加庫,以便可以解析特定的瀏覽器相關文件(例如密碼等),但MD5 5ac51312dfd99bf4e88be482f734c79只需將整個數據庫上傳到C2。

MD5 d1f506b59908e3389c83a3a8e8da3276具有字符串加密算法。它們現在被十六進制編碼並使用異或密鑰(字符串的前4個字節)加密。

研究人員看到的最大變化之一涉及MD5 c2a9151e0e9f417e555cf90300b45c9,此樣本支持從C2檢索的動態配置文件。此配置是Base64編碼的,並與配置文件的前32個字節進行異或。

2.png

“debugging”樣本的代碼段

ZanubisZanubis是一個Android銀行木馬,最早出現在2022年8月左右,目標是秘魯的金融機構和加密貨幣交易所用戶。 Zanubis的主要感染途徑是通過模仿合法的秘魯Android應用程序,然後欺騙用戶啟用可訪問性權限,從而完全控制設備。

研究人員在2023年4月左右在野外發現了很多Zanubis樣本,該惡意程序偽裝成秘魯政府組織SUNAT的官方Android應用程序。研究人員探索了惡意程序的新設計和功能,它似乎經歷了幾個階段的演變,達到了一個新的複雜程度。

Zanubis是在Obfuscapk的幫助下進行混淆的,Obfuscapk是一個流行的Android APK文件混淆處理程序。在受害者授予惡意應用程序訪問權限後,就可以允許其在後台運行。惡意程序使用WebView加載用於查找債務的合法SUNAT網站,這裡的目的是讓毫無戒心的用戶相信該應用程序是SUNAT服務生態系統的一部分。

與C2的通信依賴於WebSockets和稱為Socket.IO的庫,後者允許惡意程序建立到C2的持久連接,這提供了故障轉移選項(從WebSockets到HTTP,反之亦然)。另一個優點是,它為C2提供了一個可擴展的環境,如果需要,Zanubis的所有新感染都可以大規模地從C2接收命令(也稱為事件)。一旦惡意程序啟動,植入程序就會調用一個函數來檢查與C2的連接,它建立到同一C2服務器的兩個連接,但它們執行不同類型的操作,並且只有在C2請求時才建立第二個連接。

Zanubis沒有使用預先填充和硬編碼的目標應用程序列表。近年來,惡意程序開發人員傾向於在目標列表中添加或刪除應用程序的名稱,為了在植入程序上設置目標應用程序,C2發送事件config_packages。隨事件一起發送的JSON對象包含一個數組,該數組指定惡意程序應監控的應用程序,每當屏幕上發生事件時,惡意程序就會解析目標應用程序的列表,例如惡意程序使用onAccessibilityEvent函數檢測到的應用程序打開。一旦發現列表上的應用程序在設備上運行,Zanubis就會根據其配置採取兩種操作來竊取受害者的信息:記錄事件/密鑰,或錄屏。

之前,研究人員提到初始化來自受感染設備的第二個連接,這為C2提供了更多選項。 Zanubis建立這個新連接後,它會向服務器發送一個VncInit事件,通知它第二個功能集的初始化已經完成,並且它會每秒發送關於屏幕渲染的信息,例如顯示大小。研究人員可以假設這是運營商控製或後門感染手機的一種方式。

第二個集合中一個有趣的功能是bloqueoUpdate事件。這是惡意程序採取的最具攻擊性和說服力的行動之一,它假裝是Android更新,從而阻止手機被使用,隨著“更新”的運行,手機仍然無法使用,以至於無法鎖定或解鎖,因為惡意程序會監控並阻止這些嘗試。

3.png

虛假更新將用戶鎖定在手機之外

根據研究人員的分析,目標申請是秘魯的銀行和金融實體。另外,根據研究人員的監測數據,他們確定Zanubis專門針對該國的用戶,目標應用程序列表包含40多個程序包名稱。截止目前,收集的Zanubis樣本能夠感染任何Android手機,但它們都是以西班牙語作為系統語言編寫的。

總結惡意程序在不斷發展,Lumma竊取程序就是一個例子,它有多種功能各異的變體。

Zanubis目標是成為一個功能齊全的銀行木馬,可以造成經濟損失並竊取移動用戶的個人數據,惡意代碼和攻擊者TTP的不斷變化對防禦團隊來說是一個挑戰。

我們會在本文對一個帶簽名的rootkit進行分析,它的主要二進制函數是一個通用加載程序,使攻擊者能夠直接加載第二階段的未簽名內核模塊。

在趨勢科技最近的一次調查中,研究人員發現了一個有趣的攻擊活動,他們最初認為這是檢測微軟簽名文件時的誤報。然而,追踪發現,這是一個新出現的簽名rootkit,它與一個大型命令和控制(CC)基礎設施通信,用於我們目前正在跟踪的未知攻擊者,我們認為這與rootkit FiveSys背後的攻擊者相同。其攻擊目標是中國的遊戲行業。惡意軟件似乎已經通過了Windows硬件質量實驗室(WHQL)獲得了有效簽名。 WHQL簽章要求確保所有驅動程序是獲得OS廠商驗證及簽章,但這類簽章無法保證出於真正App開發商之手。這顯示惡意程序作者想利用微軟簽章制度,讓用戶誤以為它是合法驅動程序而安裝。研究人員已在2023年6月向微軟安全響應中心(MSRC)報告了他們的發現。

主二進製文件充當通用加載程序,允許攻擊者直接加載第二階段未簽名內核模塊。每個第二階段插件都是針對部署它的受害設備自定義的,有些甚至包含針對每台設備的自定義編譯驅動程序。每個插件都有一組要從內核空間執行的特定操作。

發現的變體由八個主要集群組成,這些集群基於從簽名(Authenticode)中的SPC_SP_OPUS_INFO字段中提取的特定於供應商的元數據,揭示了這些變體代表其簽名的各種發布者。

1.png

每個集群中的示例數量

2.png

2022年和2023年使用微軟門戶網站簽署的驅動程序數量

攻擊者目前使用不同的方法對其惡意內核驅動程序進行簽名,通常包括:

濫用微軟簽名門戶;

使用洩露和被盜的證書;

使用黑市服務;

接下來,我們將介紹一種明顯遵循第一種方法的攻擊:濫用WHQL在惡意驅動程序上獲得有效簽名,該惡意驅動程序可以在最新的Windows版本上成功加載。我們還將提供這種新發現的惡意軟件的技術細節,該惡意軟件是由微軟直接簽名的獨立內核驅動程序,這是一種不斷發展的攻擊技術,現在出現的非常頻繁。儘管構建這樣的能力非常複雜,但當前的攻擊者似乎很熱衷於這些工具、策略和程序(TTP)。

3.png

作為獨立內核驅動程序由Microsoft直接簽名的惡意軟件

WHCP濫用史下圖顯示了Windows硬件兼容性程序(WHCP)濫用史,這些報告導致了Windows內核信任模型的妥協。 2021年6月,Netfilter rootkit被報導,之後微軟發布了一份報告,詳細說明它被用作遊戲社區中地理定位作弊的手段。 Bitdefender隨後在2021年10月披露了FiveSys,這是一個主要用於在線遊戲玩家的rootkit,主要目的是竊取憑證和在遊戲中購買劫持。最後,Mandiant報告了已知的最後一次濫用,揭露了Poortry惡意軟件,該惡意軟件已被用於許多網絡攻擊,包括基於勒索軟件的事件。

4.png

WHCP發生時間表

現代rootkit的檢測方法在引入內核模式代碼簽名(KMCS)策略機制的時代,隨著64位簽名驅動程序的數量增加,現在尋找64位簽名的rootkit並不那麼容易,如下圖所示。由於現代內核rootkit的開發成本更高,而且將內核rootkit納入其惡意軟件庫的技術能力不足,或者可以訪問繞過新Windows版本中添加的安全防御所需的技術,這使得檢測這類攻擊變得更加困難。

5.png

2015年前後檢測到的一次以上已簽名驅動程序總數

如下圖所示,研究人員根據以下內容評估了Windows內核驅動程序示例:

他們簽署的驅動程序簽名被吊銷;

它們有一個或多個基於惡意軟件搜索引擎的誤報檢測,包括VirusTotal惡意軟件存儲庫:

Set 1:未被吊銷且無誤報檢測的已簽名驅動程序;

Set 2:未被吊銷且有一個或多個來自不同引擎的誤報檢測的已簽名驅動程序;

Set 3:已被吊銷且無誤報的簽名驅動程序;

Set 4:已被吊銷的簽名驅動程序,其中包含來自不同引擎的一個或多個誤報。

6.png

Windows內核驅動程序基於其簽名驅動程序被吊銷或以其他方式進行採樣,並且它們具有一個或多個誤報檢測。

從Set 1和Set 2中尋找新的示例提交以查找攻擊這樣就可以研究這個新出現的示例集群和服務於第二階段插件的底層CC基礎設施。

7.png

從2020年到2022年5月,屬於示例Set 2的內核驅動程序提交數量增加

第一階段分析根據從這次活動中收集的示例,我們確定了兩個不同的集群,它們的示例之間有多個相似之處。研究人員觀察到一種模式,即使用VMProtect對一些示例進行模糊處理,然後在沒有任何模糊處理的情況下對具有更多功能的較新示例進行簽名,這表明這些示例背後的攻擊者仍處於測試和開發階段。

8.png

有很多相似之處的兩個不同集群

大多數示例都是“Microsoft Windows Hardware Compatibility Publisher”簽名的驅動程序。下面我們將對第一個集群中的一個示例進行分析。

驅動程序首先檢查加載到內存中的驅動程序上是否有另一個實例,方法是嘗試打開由驅動程序在初始化期間創建的符號名稱“\?\ea971b87”。如果成功打開,DriverEntry返回的錯誤代碼“0FFFFCFC7”將停止加載驅動程序。然後,如果驅動程序尚未加載,它將創建一個符號名稱“\?\ea971b87”,並初始化其處理程序的函數。基於我們觀察到的當前變體,它僅使用“IRP_MJ_DEVICE_CONTROL”和“IRP_J_SHUTDOWN”。

9.png

檢查驅動程序是否已經加載

10.png

初始化IO處理程序

11.png

註冊關閉通知處理程序

然後,驅動程序檢查二進制編譯是調試構建還是發布,如下圖所示。在調試構建的情況下,它在整個執行過程中打印一些調試消息,這表明目前的產品仍在開發和測試中。然後,驅動程序通過編輯註冊表禁用用戶帳戶控制(UAC)和安全桌面模式,並初始化Winsock內核(WSK)對象,以啟動CC服務器的網絡活動。

12.png

檢查編譯是否是調試構建的

13.png

禁用UAC然後初始化WSK對象

14.png

從“IRP_J_DEVICE_CONTROL”設備控制處理程序掛接文件系統堆棧

第一階段網絡初始化第一階段驅動程序負責與CC服務器之間的所有網絡通信。它使用WSK(一種內核模式的網絡編程接口)從內核空間啟動所有通信。使用WSK,內核模式軟件模塊可以使用用戶模式Winsock2支持的相同套接字編程概念執行網絡I/O操作。

它使用域生成算法(DGA)生成不同的域。如果它無法解析地址,它會直接連接到硬編碼在驅動程序內部的輻射ip,它連接到端口80上的驅動程序,並創建一個TCP套接字用於通信。

15.png

wsk創建的套接字類型

16.png

解析DNS

17.png

解析DNS

18.png

來自第一階段驅動程序的DNS請求

19.png

連接CC服務器

然後,它定期連接到CC服務器以獲取配置。它可以選擇作為內核驅動程序加載程序:

它逐字節地接收來自CC服務器的數據;

它對接收到的數據進行解碼和解密;

它將接收到的內核驅動程序直接加載到內存中,而不將其寫入磁盤;

它解析接收到的可移植可執行文件(PE)並執行所有重新定位;

它調用驅動程序入口點;

這樣,內核插件就永遠不會接觸磁盤,只會在內存中,這使得它更隱蔽,並使其能夠繞過檢測。

20.png

解碼從CC服務器接收到的數據

21.png

接收第一階段的配置

22.png

解析用於加載新接收到的驅動程序的函數地址

23.png

獲取驅動程序入口地址

24.png

調用驅動程序入口函數

第二階段插件下載的第二階段驅動程序是自簽名的,因為它完全由第一階段加載程序加載,繞過Windows本機驅動程序加載程序。因此,不需要對這些第二階段的變體進行簽名。它打開文件“C:\WINDOWS\System32\drivers\687ae09e.sys”,然後讀取數據並對其進行編碼。然後,它將數據劃分為內存塊並將其寫入註冊表路徑“\ registry \Machine\Software\PtMyMem”及其大小和MD5。之後,它從磁盤中刪除文件“C:\WINDOWS\System32\drivers\687ae09e.sys”。

25.png

第二階段的自簽名驅動程序

26.png

讀取文件

27.png

文件信息

28.png

註冊表中的編碼文件

29.png

刪除寫入磁盤的文件

實現持久性第一階段關閉通知函數檢查是否已從CC服務器接收到內核插件並將其加載到內存中,以便進行清理。它還檢查註冊表項“\ registry \Machine\Software\PtMyMem”,如果它出現,則迭代其所有子鍵並解碼數據,將其寫入磁盤“C:\WINDOWS\System32\drivers\687ae09e”。 sys”路徑。最後,它創建一個名為“BaohuName”的服務,該服務將在系統再次啟動時運行。

第一階段和第二階段(從CC服務器下載的插件)作為攻擊者自我保護和持久性方法的一部分協同工作。該技術與從CC服務器下載的內核插件相結合,將成為該驅動程序的主要持久性機制。對這個特定的第二階段插件的詳細分析如下:

第一階段驅動程序連接CC服務器並下載第二階段驅動程序;

第二階段驅動程序從磁盤讀取第一階段驅動程序並將其寫入註冊表,然後從磁盤刪除;

第一階段和第二階段的驅動器只存在於內存中;

在重新啟動之前,執行第一階段關閉通知例程;

關機例程將從註冊表中自我讀取,自我寫回磁盤,並創建一個服務,該服務將在下次系統重新啟動時啟動。

Defender停止器插件此驅動程序的主要目標是停止Windows Defender。它首先從註冊表項“HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows Defender”禁用反間諜軟件檢測,禁用“SecurityHealthService”服務,並停止殺毒檢測。

30.png

停止反間諜軟件檢測

31.png

停止“SecurityHealthService”服務

32.png

禁用殺毒檢測

然後在“映像文件執行選項”註冊表中為所有Windows Defender進程添加一個條目,因此當其中任何一個進程崩潰時,另一個進程將啟動。將啟動的可執行文件是“C:\\Users\\Administrator\\Desktop\\111111111.exe”,這表明這些插件是自定義的,攻擊者正在根據需要積極開發新的插件。它最終會終止所有Windows Defender進程。

33.png

將條目添加到映像文件執行選項

34.png

映像文件執行中的調試器值

35.png

映像文件執行中的調試器值

36.png

Windows Defender進程

37.png

終止進程

代理插件此插件負責在設備上安裝代理,並將web瀏覽流量重定向到遠程代理設備。它首先編輯Windows代理配置“hxxp[:]//4dpyplftay8g90qb7l.kkvgsytcw4hsn3g0nc5r[.]xyz:17654/api/pac/PacReback?key=10252”。

38.png

編輯的Windows代理配置

然後,它在瀏覽器中註入一個JavaScript,根據

進程隔離是容器的關鍵組件,容器的關鍵底層機制之一是命名空間(namespaces),下面將分析命名空間(namespaces)是什麼以及命名空間(namespaces)是如何工作的,通過構建自己的隔離容器能夠更好地理解每一部分。

0x01 命名空間(namespaces)是什麼命名空間(namespaces)是2008 年內核版本2.6.24 中發布的Linux 內核特性。它們為進程提供了自己的系統視圖,從而將獨立的進程相互隔離。換句話說, 命名空間(namespaces)定義了一個進程可以使用的資源集,你不能與你看不到的東西交互。在高層次上,它們允許對全局操作系統資源進行細粒度分區,例如安裝點、網絡堆棧和進程間通信實用程序。命名空間(namespaces)的一個強大方面是它們限制了對系統資源的訪問,而正在運行的進程不知道這些限制。在典型的Linux 方式中,它們表示為/proc/

cryptonite@cryptonite:~$echo$$

4622

cryptonite@cryptonite:~$ls/proc/$$/ns-al

total0

dr-x--x--x2cryptonitecryptonite0Jun2915:00.

dr-xr-xr-x9cryptonitecryptonite0Jun2913:13.

lrwxrwxrwx1cryptonitecryptonite0Jun2915:00cgroup-'cgroup:[4026531835]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:00ipc-'ipc:[4026531839]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:00mnt-'mnt:[4026531840]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:00net-'net:[4026532008]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:00pid-'pid:[4026531836]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:00pid_for_children-'pid:[4026531836]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:00time-'time:[4026531834]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:00time_for_children-'time:[4026531834]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:00user-'user:[4026531837]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:00uts-'uts:[4026531838]'當生成一個新進程時,所有的命名空間(namespaces)都繼承自它的父進程。

#inception

cryptonite@cryptonite:~$/bin/zsh

#fatherPIDverification

╭─cryptonite@cryptonite~

╰─$ps-efj|grep$$

crypton+135604622135604622115:07pts/100:00:02/bin/zsh

╭─cryptonite@cryptonite~

╰─$ls/proc/$$/ns-al

total0

dr-x--x--x2cryptonitecryptonite0Jun2915:10.

dr-xr-xr-x9cryptonitecryptonite0Jun2915:07.

lrwxrwxrwx1cryptonitecryptonite0Jun2915:10cgroup-'cgroup:[4026531835]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:10ipc-'ipc:[4026531839]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:10mnt-'mnt:[4026531840]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:10net-'net:[4026532008]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:10pid-'pid:[4026531836]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:10pid_for_children-'pid:[4026531836]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:10time-'time:[4026531834]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:10time_for_children-'time:[4026531834]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:10user-'user:[4026531837]'

lrwxrwxrwx1cryptonitecryptonite0Jun2915:10uts-'uts:[4026531838]'命名空間(namespaces)是使用帶有以下參數之一的clone系統調用創建的:

CLONE_NEWNS - 創建新的掛載命名空間(namespaces);

CLONE_NEWUTS - 創建新的UTS 命名空間(namespaces);

CLONE_NEWIPC - 創建新的IPC 命名空間(namespaces);

CLONE_NEWPID - 創建新的PID 命名空間(namespaces);

CLONE_NEWNET - 創建新的NET 命名空間(namespaces);

CLONE_NEWUSER - 創建新的USR 命名空間(namespaces);

CLONE_NEWCGROUP - 創建一個新的cgroup 命名空間(namespaces)。

命名空間(namespaces)也可以使用unshare系統調用來創建。 clone和unshare的區別在於,clone會在一組新的名稱空間中生成一個新進程,而unshare會在一組新的namespaces中移動當前進程。

0x02 為什麼要使用命名空間(namespaces)如果我們將命名空間(namespaces)想像為包含一些抽象全局系統資源的進程的盒子,這些盒子的一個好處是你可以從一個盒子中添加和刪除內容,並且不會影響其他盒子的內容。或者,如果一個盒子(一組命名空間namespaces)中的進程A 發瘋並決定刪除該盒子中的整個文件系統或網絡堆棧,它不會影響為放置在不同盒子中的另一個進程B 提供的這些資源的抽象。此外,命名空間(namespaces)甚至可以提供細粒度的隔離,允許進程A 和B 共享一些系統資源(例如共享掛載點或網絡堆棧)。當必須在給定機器上執行不受信任的代碼而不影響主機操作系統時,通常會使用命名空間(namespaces)。 Hackerrank、Codeforces、 Rootme等編程競賽平台使用命名空間(namespaces)環境,以便安全地執行和驗證參賽者的代碼,而不會使他們的服務器面臨風險。 PaaS(平台即服務)提供商,例如穀歌云引擎使用命名空間(namespaces)環境在同一硬件上運行多個用戶服務(例如網絡服務器、數據庫),而不會干擾這些服務。因此,命名空間(namespaces)也可以被視為對有效的資源共享很有用。 Docker 或LXC 等其他雲技術也使用命名空間(namespaces)作為進程隔離的手段。這些技術將操作系統進程置於容器隔離環境中。例如,在Docker 容器中運行進程就像在虛擬機中運行一樣。容器和虛擬機之間的區別在於容器直接共享和使用主機操作系統內核,因此由於沒有硬件仿真,它們比虛擬機輕量得多。整體性能的提高主要是由於使用了直接集成在Linux 內核中的命名空間(namespaces)。

0x03 命名空間(namespaces)的類型在當前穩定的Linux Kernel 5.7 版中,有七種不同的命名空間(namespaces):

PID命名空間(namespaces):系統進程樹的隔離;

NET 命名空間(namespaces):主機網絡堆棧的隔離;

MNT 命名空間(namespaces):主機文件系統掛載點的隔離;

UTS 命名空間(namespaces):主機名的隔離;

IPC 命名空間(namespaces):進程間通信實用程序(共享段、信號量)的隔離;

USER 命名空間(namespaces):系統用戶ID 的隔離;

CGROUP 命名空間(namespaces):隔離主機的虛擬cgroup 文件系統。

命名空間(namespaces)是每個進程的屬性。每個進程最多可以感知一個命名空間(namespaces)。換句話說,在任何給定時刻,任何進程P 都恰好屬於每個命名空間(namespaces)的一個實例。例如,當一個給定的進程想要更新系統上的路由表時,內核會向它顯示它當時所屬命名空間(namespaces)的路由表副本。如果進程在系統中詢問其ID,內核將以其當前命名空間(namespaces)中的進程ID 響應(在嵌套命名空間(namespaces)的情況下)。我們將詳細查看每個命名空間(namespaces),以了解它們背後的操作系統機制。了解這一點將幫助我們找到當今容器化技術的本質。

1.PID命名空間(namespaces)歷史上,Linux 內核一直維護著一個單一的進程樹。樹數據結構包含對當前在父子層次結構中運行的每個進程的引用。它還枚舉操作系統中所有正在運行的進程。這個結構在procfs文件系統中維護, 它是實時系統的一個屬性,即它僅在操作系統運行時存在。這種結構允許具有足夠特權的進程附加到其他進程、檢查、通信和kill它們。它還包含有關進程的根目錄、當前工作目錄、打開的文件描述符、虛擬內存地址、可用安裝點等的信息。

#anexampleoftheprocfsstructure

cryptonite@cryptonite:~$ls/proc/1/

arch_statuscoredump_filtergid_mapmountspagemapsetgroupstask

attrcpu_resctrl_groupsiomountstatspatch_statesmapstimens_offsets

cgroupenvironmap_filesnuma_mapsrootstatuid_map

clear_refsexemapsoom_adjschedstatm

.

#anexampleoftheprocesstreestructure

cryptonite@cryptonite:~$pstree|head-n20

systemd-+-ModemManager---2*[{ModemManager}]

|-NetworkManager---2*[{NetworkManager}]

|-accounts-daemon---2*[{accounts-daemon}]

|-acpid

|-avahi-daemon---avahi-daemon

|-bluetoothd

|-boltd---2*[{boltd}]

|-colord---2*[{colord}]

|-containerd---17*[{containerd}]在系統啟動時,大多數現代Linux 操作系統上啟動的第一個進程是systemd(系統守護進程),它位於樹的根節點上。它的父進程是PID=0,它是OS 中不存在的進程。此進程之後負責啟動其他服務/守護進程,這些服務/守護進程表示為其子進程,並且是操作系統正常運行所必需的。這些進程的PID 1,樹結構中的PID 是唯一的。

隨著Process 命名空間(namespaces)(或PID 命名空間(namespaces))的引入可以製作嵌套的流程樹。它允許除systemd (PID=1) 以外的進程通過在子樹的頂部移動來將自己視為根進程,從而在該子樹中獲得PID=1。同一子樹中的所有進程也將獲得與進程命名空間(namespaces)相關的ID。這也意味著某些進程可能最終擁有多個ID,具體取決於它們所在進程命名空間(namespaces)的數量。然而,在每個命名空間(namespaces)中,至多一個進程可以擁有一個給定的PID(進程樹中節點的唯一值)成為每個命名空間(namespaces)的屬性)。這是因為根進程命名空間(namespaces)中的進程之間的關係保持不變。或者換句話說,新PID 命名空間(namespaces)中的進程仍然附加到其父級,因此是其父級PID 命名空間(namespaces)的一部分。所有進程之間的這些關係可以在根進程命名空間(namespaces)中看到,但在嵌套進程命名空間(namespaces)中它們是不可見的。這意味著嵌套進程命名空間(namespaces)中的進程不能與其父進程或上層進程命名空間(namespaces)中的任何其他進程交互。這是因為,在新的PID 命名空間(namespaces)的頂部,進程將其PID 視為1,並且在PID=1 的進程之前沒有其他進程。

img

在Linux 內核中,PID 表示為一個結構。在內部,我們還可以找到進程所屬的命名空間(namespaces)作為upid struct數組的一部分。

structupid{

intnr;/*thepidvalue*/

structpid_namespace*ns;/*thenamespacethisvalue

*isvisiblein*/

structhlist_nodepid_chain;/*hashchainforfastersearchofPIDSinthegivennamespace*/

};

structpid{

atomic_tcount;/*referencecounter*/

structhlist_headtasks[PIDTYPE_MAX];/*listsoftasks*/

structrcu_headrcu;

intlevel;//numberofupids

structupidnumbers[0];//arrayofpidnamespaces

};要在新的PID 命名空間(namespaces)內創建新進程,必須使用特殊標誌CLONE_NEWPID調用clone()系統調用。而下面討論的其他命名空間(namespaces)也可以使用unshare()系統調用創建,PID 命名空間(namespaces)只能在使用clone()或fork()系統調用產生新進程時創建。

#Let'sstartaprocessinanewpidnamespace;

cryptonite@cryptonite:~$sudounshare--pid/bin/bash

bash:fork:Cannotallocatememory[1]

root@cryptonite:/home/cryptonite#ls

bash:fork:Cannotallocatememory[1]shell卡在兩個命名空間(namespaces)之間。這是因為unshare在執行後沒有進入新的命名空間(namespaces)(execve()調用)。當前的“unshare”進程調用了unshare系統調用,創建了一個新的pid命名空間(namespaces),但是當前的“unshare”進程不在新的pid命名空間(namespaces)中。進程B創建了一個新的命名空間(namespaces),但進程B本身不會被放入新的命名空間(namespaces),只有進程B的子進程才會被放入新的命名空間(namespaces)。創建命名空間(namespaces)後,`unshare程序將執行/bin/bash。然後/bin/bash將分叉幾個新的子進程來做一些工作。這些子進程將有一個相對於新命名空間(namespaces)的PID,當這些進程完成時,它們將退出,退出命名空間(namespaces)但是PID沒有置1。 Linux 內核不喜歡沒有PID=1 進程的PID 命名空間(namespaces)。因此,當命名空間(namespaces)為空時,內核將禁用與該命名空間(namespaces)內的PID 分配相關的一些機制,從而導致此錯誤。

我們必須指示unshare程序在創建命名空間(namespaces)後派生一個新進程。然後這個新進程將設置PID=1 並將執行我們的shell 程序。這樣當/bin/bash的子進程退出時,命名空間(namespaces)仍然會有一個PID=1 的進程。

cryptonite@cryptonite:~$sudounshare--pid--fork/bin/bash

root@cryptonite:/home/cryptonite#echo$$

1

root@cryptonite:/home/cryptonite#ps

PIDTTYTIMECMD

7239pts/000:00:00sudo

7240pts/000:00:00unshare

7241pts/000:00:00bash

7250pts/000:00:00ps但是當我們使用ps時,為什麼我們的shell 沒有PID 1呢?為什麼我們仍然可以從根命名空間(namespaces)看到進程?該PS程序使用的procfs虛擬文件系統,以獲取有關係統中的電流進程的信息。該文件系統安裝在/proc 目錄中。但是,在新命名空間(namespaces)中,該掛載點描述了root PID 命名空間(namespaces)中的進程。有兩種方法可以避免這種情況:

#creatinganewmountnamespaceandmountinganewprocfsinside

cryptonite@cryptonite:~$sudounshare--pid--fork--mount/bin/bash

root@cryptonite:/home/cryptonite#mount-tprocproc/proc

root@cryptonite:/home/cryptonite#ps

PIDTTYTIMECMD

1pts/200:00:00bash

9pts/200:00:00ps

#Orusetheunsharewrapperwiththe--mount-procflag

#whichdoesthesame

cryptonite@cryptonite:~$sudounshare--fork--pid--mount-proc/bin/bash

root@cryptonite:/home/cryptonite#ps

PIDTTYTIMECMD

1pts/100:00:00bash

8pts/100:00:00ps正如我們之前提到的,一個進程可以有多個ID,這取決於該進程所在的命名空間(namespaces)的數量。現在檢查嵌套在兩個命名空間(namespaces)中的shell 的不同PID。

╭cryptonite@cryptonite:~$sudounshare--fork--pid--mount-proc/bin/bash

#thisprocesshasPID4700intherootPIDnamespace

root@cryptonite:/home/cryptonite#unshare--fork--pid--mount-proc/bin/bash

root@cryptonite:/home/cryptonite#ps

PIDTTYTIMECMD

1pts/100:00:00bash

8pts/100:00:00ps

#Let'sinspectthedifferentPIDs

cryptonite@cryptonite:~$sudonsenter--target4700--pid--mount

cryptonite#ps-aux

USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND

root10.00.0184764000pts/0S

sl-tropical-beach-cuba-binary-1200-1200x600.jpg

完整分析cuba勒索軟件(上)

Veeamp過了一段時間,研究人員發現一個惡意進程在相鄰主機上啟動;研究人員稱之為“SRV_Service”:

18.png

惡意進程啟動

Veeam.exe是一個用C#編寫的定制數據轉儲程序,它利用Veeam備份和恢復服務中的安全漏洞連接到VeeamBackup SQL數據庫並獲取帳戶憑據。

19.png

Veeamp分析Veeamp利用以下Veeam漏洞:CVE-2022-26500、CVE-2022-206501、CVE--2022-26504。前兩個允許未經身份驗證的用戶遠程執行任意代碼,第三個允許域用戶執行相同的代碼。三個中的任何一個被利用後,惡意軟件會在控制面板中輸出以下內容:

使用者名稱;

加密的密碼;

解密的密碼;

Veeam憑據表中的用戶描述:組成員資格、權限等;

該惡意軟件並非cuba組織獨有,Conti和yanlowang種也會出現這些內容。

研究人員在SRV_Service上看到的活動與他們在SRV_STORAGE上使用Bughatch觀察到的類似:

20.png

SRV_Service上的Bughatch活動

與SRV_STORAGE的情況一樣,惡意軟件將三個文件放入臨時文件夾,然後以相同的順序執行這些文件,連接到相同的地址。

Avast Anti-Rootkit驅動程序在Bughatch成功建立了與C2的連接後,該組織使用了一種日益流行的技術:Bring Your Own Vulnerable Driver (BYOVD)。

21.png

利用易受攻擊的驅動程序

攻擊者在系統中安裝易受攻擊的驅動程序,然後將其用於各種目的,例如終止進程或通過權限升級到內核級別來逃避防禦。

攻擊者被易受攻擊的驅動程序所吸引,因為它們都在內核模式下運行,具有高級別的系統訪問權限。此外,擁有數字簽名的合法驅動程序不會在安全系統中引發任何危險信號,從而幫助攻擊者在更長時間內不被發現。

在攻擊過程中,惡意軟件在臨時文件夾中創建了三個文件:

aswarpot.sys:Avast的合法反rootkit驅動程序,有兩個漏洞:CVE-2022-26522和CVE-2022-206523,允許權限有限的用戶在內核級別運行代碼。

KK.exe:被稱為Burntcigar的惡意軟件。目前發現的文件是一個新的變體,它使用有漏洞的驅動程序來終止進程。

av.bat批處理腳本:一個幫助內核服務運行Avast驅動程序並執行Burntgigar的stager。

對BAT文件和样本數據的分析表明,av.BAT使用sc.exe實用程序創建一個名為“aswSP_ArPot2”的服務,在С\windows\temp\目錄中指定驅動程序的路徑,並將服務類型指定為內核服務。然後,BAT文件在同一sc.exe實用程序的幫助下啟動服務,並運行KK.exe,它連接到易受攻擊的驅動程序。

22.png

.bat文件的內容

Burntcigar在查看Burntcigar時,研究人員注意到的第一件事是PDB文件的路徑,其中包含一個名為“Musor”(俄語中“垃圾”的意思)的文件夾,這更表明cuba組織的成員可能會說俄語。

23.png

KK.exe PDB文件的路徑

找到的樣本是Burntcigar的新版本,在事件發生時安全系統無法檢測到。攻擊者顯然更新了惡意軟件,因為在之前的攻擊之後,許多供應商能夠很容易地檢測到舊版本運行的邏輯。

在下面示例的截屏中,關於要終止的進程的所有數據都是加密的,而舊版本公開顯示了攻擊者想要停止的所有進程的名稱。

24.png

Burntcigar新舊版本的比較

惡意軟件搜索與流行AV或EDR產品有關的進程名,並將其進程ID添加到堆棧中,以便稍後終止。

Burntgigar使用DeviceIoContol函數訪問易受攻擊的Avast驅動程序,將包含安全問題的代碼的位置指定為執行選項。該段代碼包含ZwTerminateProcess函數,攻擊者使用該函數終止進程。

25.png

Burntcigar的分析

之後,研究人員在Exchange服務器和SRV_STORAGE主機上發現了利用Avast anti-rootkit驅動程序的類似活動。在這兩種情況下,攻擊者都使用BAT文件安裝不安全的驅動程序,然後啟動Burntgigar。

26.png

相鄰主機上的BurntChigar活動

SRV_MAIL host (Exchange server)去年12月20日,客戶批准了研究人員將Exchange服務器添加到監控範圍的請求。主機一定是作為客戶網絡的入口點使用的,因為服務器缺少關鍵更新,而且它很容易受到初始訪問的影響。特別是,SRV_MAIL的ProxyLogon、ProxyShell和Zerologon漏洞仍未被修復。這就是為什麼研究人員認為攻擊者通過Exchange服務器滲透到客戶網絡的原因。

27.png

分析數據開始傳入

在SRV_MAIL上,SqlDbAdmin用戶顯示的活動與研究人員在以前的主機上觀察到的活動相同。

28.png

SqlDbAdmin的惡意活動

研究人員發現攻擊者使用合法的gotoassistui.exe工具在受感染的主機之間傳輸惡意文件。

GoToAssist是技術支持團隊經常使用的RDP支持實用程序,但在系統之間移動文件時,該應用程序經常被濫用以繞過任何安全防禦或響應團隊。

29.png

通過gotoassistui.exe發送惡意文件

研究人員還發現新的Bughatch樣本正在執行中。這些使用了略有不同的文件名、回調函數和C2服務器,因為研究人員的系統當時成功地阻止了舊版本的惡意軟件。

30.png

Bughatch活動

SqlDbAdminSqlDbAdmin是一個可疑的DLL addp.DLL,研究人員在一個受攻擊的主機上手動找到了它。

31.png

可疑動態庫

研究人員發現它使用WIN API函數NetUserAdd來創建用戶。名稱和密碼在DLL中進行了硬編碼。

32.png

addp.dll分析

當研究人員進一步研究該庫時,研究人員發現它使用RegCreateKey函數通過修改註冊表設置為新創建的用戶啟用RDP會話。然後,庫將用戶添加到Special Account註冊表樹中,以將其隱藏在系統登錄屏幕之外,這是一種有趣且少見的持久化技術。在大多數情況下,攻擊者在腳本的幫助下添加新用戶,而安全產品很少會遺漏這些腳本。

33.png

addp.dll分析

Cobalt Strike研究人員發現Exchange服務器上運行了一個可疑的DLL ion.DLL,該DLL是rundll32進程的一部分,具有異常的執行選項。起初,研究人員認為這種活動與之前在Bughatch中看到的類似。然而,進一步的分析表明,該庫實際上是一個Cobalt Strike。

34.png

執行可疑的ion.dll文件

當研究人員查看ion.dll代碼時,引起研究人員注意的是執行設置和使用Cobalt Strike配置的函數。該庫使用VirtualAlloc函數來分配進程內存,以便稍後執行Cobalt Strike Beacon負載。

35.png

對ion.dll的分析

所有的配置數據都是加密的,但研究人員確實找到了用於解密的函數。為了找到Cobalt Strike C2服務器,研究人員檢查了加載了ion.dll的rundll32內存轉儲,並使用與受害者主機相同的設置運行。

36.png

rundll32內存轉儲

找出C2的名稱有助於研究人員在監測數據中定位與該服務器的通信歷史。惡意軟件連接到C2後,它將兩個可疑文件下載到受感染服務器上的Windows文件夾中,然後執行這些文件。不幸的是,研究人員無法獲得這兩個文件進行分析,因為攻擊者未能在上一步禁用安全功能,這些文件被從受感染的主機上刪除。不過,研究人員確實相信,他們正在處理的是勒索軟件本身。

37.png

與攻擊者的C2服務器通信

客戶立即隔離了受影響的主機,並將事件轉發給卡巴斯基事件響應團隊,以便進一步調查和搜索可能的工件。這是研究人員最後一次在客戶系統中看到攻擊者的活動。由於客戶遵循了研究人員的建議和指示,並及時對事件做出了響應,主機避免了加密。

新惡意軟件研究人員發現VirusTotal包含cuba惡意軟件的新樣本,其文件元數據與上述事件中的文件元數據相同。其中一些樣本成功地躲過了所有網絡安全供應商的檢測。研究人員對每個樣本進行了分析。正如你從下面的屏幕截圖中看到的,這些是Burntcigar的新版本,使用加密數據進行反惡意軟件規避。研究人員已經制定了檢測這些新樣本的Yara規則。

38.png

新的惡意軟件樣本

BYOVD (Bring Your Own Vulnerable Driver)BYOVD,全稱為Bring your own vulnerable driver,即攻擊者向目標環境植入一個帶有漏洞的合法驅動程序,再通過漏洞利用獲得內核權限以殺死/致盲終端安全軟件等,這項技術最初主要被如Turla和方程式這樣的頂級APT組織所使用,而隨著攻擊成本的降低,其它攻擊組織也逐漸開始使用這項技術,以BYOVD為標籤進行檢索可以發現在更早些時候就已經有不同的攻擊組織在真實攻擊活動中使用此項技術

研究人員在調查該事件時觀察到了這種攻擊,隨著各種APT和勒索軟件組織將其添加到他們的武器庫中,這種攻擊目前越來越受歡迎。

Bring Your Own Vulnerable Driver (BYOVD)是一種攻擊類型,攻擊者使用已知包含安全漏洞的合法簽名驅動程序在系統內執行惡意操作。如果成功,攻擊者將能夠利用驅動程序代碼中的漏洞在內核級別運行任何惡意操作。

要理解為什麼這是最危險的攻擊類型之一,需要快速復習一下驅動程序是什麼。驅動程序是一種軟件,它充當操作系統和設備之間的中介。驅動程序將操作系統指令轉換為設備可以解釋和執行的命令。驅動程序的進一步用途是支持操作系統最初缺乏的應用程序或功能。從下圖中可以看到,驅動程序是介於用戶模式和內核模式之間的一層。

39.png

用戶模式和內核模式交互圖

在用戶模式下運行的應用程序控制系統的權限較少。他們所能訪問的只是一個與系統其他部分隔離和保護的虛擬內存區域。驅動程序在內核內存中運行,它可以像內核本身一樣執行任何操作。驅動程序可以訪問關鍵的安全結構並對其進行修改。這樣的修改使系統容易受到使用權限提升、禁用操作系統安全服務以及任意讀寫的攻擊。

2021年,Lazarus組織利用這一技術,通過濫用包含CVE-2021-21551漏洞的戴爾驅動程序,獲得了對內核內存的寫訪問權限,並禁用了Windows安全功能。

2021年,Dell 被爆出一個潛藏12年的驅動漏洞,CVE編號CVE-2021-21551,漏洞可能引發系統權限提升,預計超過數億Dell 台式機和筆記本電腦受到該漏洞的的影響。

CVE-2021-21551漏洞實際上是5個漏洞的集合,是Dell計算機在BIOS 更新過程中安裝和加載的驅動DBUtil 中的安全漏洞。

沒有針對合法驅動程序的萬無一失的防禦,因為任何驅動程序都可能被證明存在安全漏洞。微軟發布了一份針對此類技術的保護建議列表:

啟用管理程序保護的代碼完整性。

啟用內存完整性。

啟用驅動程序數字簽名驗證。

使用易受攻擊的驅動程序列表。

然而,研究表明,即使啟用了所有Windows保護功能,這些建議也無關緊要,而且這樣的攻擊無論如何都會發生。

為了對抗這種技術,許多安全供應商開始在他們的產品中添加一個自衛模塊,以防止惡意軟件終止進程,並阻止每一次利用易受攻擊的驅動程序的嘗試。研究人員的產品也具有這一功能,在事件中證明是有效的。

總結cuba組織使用了大量的公開和定制工具,並不斷通過最新的各種技術和方法,包括相複雜的技術和方法(如BYOVD)。預防這種複雜程度的攻擊需要能夠檢測高級威脅並保護安全功能不被禁用的複雜技術,以及有助於手動檢測惡意工件的大規模、持續更新的威脅知識庫。

本文中詳細介紹的樣本表明,對真實網絡攻擊的調查和事件響應,如管理檢測和響應(MDR),是有關惡意策略、技術和程序的最新信息的來源。特別是,在這次調查中,研究人員發現了cuba惡意軟件的新樣本和以前未被發現的樣本,以及表明至少有一些組織成員會說俄語的工件。

我們會在本文詳細介紹cuba組織的歷史及其攻擊戰術、技術和程序。

cuba勒索軟件組織於2020年末首次被卡巴斯基殺毒軟件發現。當時,還沒有採用“cuba”這個名字,而是被稱為“Tropical Scorpius”。

cuba主要針對美國、加拿大和歐洲的組織。該組織對石油公司、金融服務、政府機構和醫療保健提供者發動了一系列攻擊。

與最近大多數網絡勒索組織一樣,cuba組織對受害者的文件進行加密,並要求贖金以換取解密密鑰。該組織使用複雜的戰術和技術來滲透受害者網絡,例如利用軟件漏洞和社會工程。已知它們使用受攻擊的遠程桌面(RDP)連接進行初始訪問。

cuba組織的確切起源和成員身份目前尚不清楚,儘管一些研究人員認為它可能是另一個臭名昭著的勒索組織Babuk的繼承者。與許多其他同類組織一樣,cuba組織是一家勒索軟件即服務(RaaS)機構,允許其合作夥伴使用勒索軟件和相關基礎設施,以收取一定比例的贖金。

該組織自成立以來已多次更名,先後使用了:

ColdDraw

TropicalScorpius

Fidel

Cuba今年2月,又發現了這個組織的另一個名字——“V Is Vendetta”,這與攻擊者們最喜歡的cuba主題不同,很可能是一個分支機構或附屬公司使用的綽號。該組織與cuba組織有一個明顯的聯繫。這個新發現的組織的網站託管在cuba域:

http[:]//test[.]cuba4ikm4jakjgmkezytyawtdgr2xymvy6nvzgw5cglswg3si76icnqd[.]onion/。

2.png

V IS VENDETTA網站

截止發文時,cuba仍然很活躍。

受害者分析該組織攻擊了世界很多地區的公司,包括零售商、金融和物流服務、政府機構和製造商等。就地理位置而言,大多數受攻擊的公司都位於美國,但在加拿大、歐洲、亞洲和澳大利亞也有少數受害者。

3.png

cuba受害者的地理分佈

勒索軟件cuba勒索軟件是一個沒有外掛庫的單一文件。樣本通常有偽造的編譯時間戳:2020年發現的樣本蓋有2020年6月4日的印章,而最近的樣本卻是1992年6月19日。

cuba勒索模式4.png

勒索模式

就用於向受害者施壓的工具而言,目前存在四種勒索模式。

單一勒索:加密數據並索要贖金。

雙重勒索:除了加密,攻擊者還竊取敏感信息。這是當今勒索軟件組織中最流行的模式。

三重勒索:在雙重勒索的基礎上實施DDoS攻擊。在LockBit組織受到DDoS攻擊後,該模型開始廣泛傳播。在成為攻擊目標後,攻擊者意識到DDoS是一種有效的勒索手段。

第四種模式是最不常見的,威脅最大,但成本也最高。它利用了投資者、股東和客戶中對數據洩露消息新聞的缺乏信任。在這種情況下,沒有必要進行DDoS攻擊。這種模式的例證是最近弗吉尼亞州布魯菲爾德大學(Bluefield University)遭遇的攻擊者攻擊,AvosLocker勒索軟件團伙劫持了學校的緊急廣播系統,向學生和員工發送短信和電子郵件提醒,告知他們的個人數據被盜。攻擊者們敦促不要相信學校的管理層,他們說校方隱瞞了入侵的真實規模,並敦促他們盡快將情況公之於眾。

cuba組織使用經典的雙重勒索模型,用Xsalsa20對稱算法加密數據,用RSA-2048非對稱算法加密密鑰。這被稱為混合加密,一種加密安全的方法,可以防止在沒有密鑰的情況下解密。

cuba勒索軟件示例避免加密具有以下擴展名的文件:exe、dll、sys、ini、lnk、vbm、Cuba,以及以下文件夾:

马云惹不起马云\windows\

马云惹不起马云\programfiles\microsoftoffice\

马云惹不起马云\programfiles(x86)\microsoftoffice\

马云惹不起马云\programfiles\avs\

马云惹不起马云\programfiles(x86)\avs\

马云惹不起马云\$recycle.bin\

马云惹不起马云\boot\

马云惹不起马云\recovery\

马云惹不起马云\systemvolumeinformation\

马云惹不起马云\msocache\

马云惹不起马云\users\allusers\

马云惹不起马云\users\defaultuser\

马云惹不起马云\users\default\

马云惹不起马云\temp\

马云惹不起马云\inetcache\

马云惹不起马云\google\勒索軟件通過搜索和加密%AppData\Microsoft\Windows\Recent\目錄中的Microsoft Office文檔、圖像、檔案和其他文件而不是設備上的所有文件來節省時間。它還終止所有SQL服務以加密任何可用的數據庫。它在本地和網絡共享內部查找數據。

5.png

cuba勒索軟件終止的服務列表

除了加密,該組織還竊取受害者組織內部發現的敏感數據。大多數情況下,他們會盯著以下文件:

马云惹不起马云 財務文件

马云惹不起马云銀行對賬單

马云惹不起马云公司賬戶明細

马云惹不起马云源代碼,如果該公司是軟件開發人員

cuba使用的攻擊工具該組織使用了經典憑據訪問工具,如mimikatz,也採用了自寫應用程序。它利用了受害公司使用的軟件中的漏洞,大多數是已知的漏洞,例如ProxyShell和ProxyLogon組合攻擊Exchange服務器,以及Veeam數據備份和恢復服務中的安全漏洞。

6.png

惡意軟件

Bughatch

Burntcigar

Cobeacon

Hancitor(Chanitor)

Termite

SystemBC

Veeamp

Wedgecut

RomCOMRAT 7.png

工具

Mimikatz

PowerShell

PsExec

RemoteDesktopProtocol 8.png

漏洞

ProxyShell:

CVE-2021-31207

CVE-2021-34473

CVE-2021-34523

ProxyLogon:

CVE-2021-26855

CVE-2021-26857

CVE-2021-26858

CVE-2021-27065

Veeamvulnerabilities:

CVE-2022-26501

CVE-2022-26504

CVE-2022-26500

ZeroLogon:

CVE-2020-1472 9.png

將攻擊武器庫映射到MITRE ATTCK®戰術

利潤攻擊者在勒索通知中提供了比特幣錢包的標識符,這些比特幣錢包的進出款總額超過3600個比特幣,按1個比特幣兌換28624美元的價格換算,價值超過1.03億美元。該團伙擁有眾多錢包,不斷在這些錢包之間轉移資金,並使用比特幣混合器,通過一系列匿名交易發送比特幣的服務,使資金的來源更難追踪。

10.png

部分BTC網絡中交易

樣本分析Host: SRV_STORAGE去年12月19日,研究人員在客戶主機上發現了可疑活動,將其稱之為“SRV_STORAGE”。數據顯示了三個可疑的新文件:

11.png

卡巴斯基SOC發現的可疑事件

對kk65.bat的分析表明,它充當了一個stager,通過啟動rundll32並將komar65庫加載到其中來啟動所有進一步的活動,該庫運行回調函數DLLGetClassObjectGuid。

12.png

.bat文件的內容

讓研究人員看看可疑的DLL內部。

Bughatchkomar65.dll庫也被稱為“Bughatch”,這是Mandiant在一份報告中給出的名字。

首先可疑的是PDB文件的路徑。裡面有個文件夾叫“mosquito”,俄語翻譯為“komar”,它是DDL名稱的一部分,表明該團伙可能包括說俄語的人。

13.png

komar65.dll PDB文件的路徑

當連接到以下兩個地址時,DLL代碼將Mozilla/4.0作為用戶代理:

Com,顯然用於檢查外部連接;

該組織的指揮控制中心,如果初始ping通過,惡意軟件將嘗試回調。

14.png

komar65.dll分析

以上就是在受感染的宿主身上觀察到的活動。在Bughatch成功地與C2服務器建立連接後,它開始收集網絡資源上的數據。

15.png

Bughatch活動

通過查看C2服務器,研究人員發現除了Bughatch之外,這些模塊還擴展了惡意軟件的功能。其中一個從受感染的系統收集信息,並以HTTPPOST請求的形式將其發送回服務器。

16.jpeg

在cubaC2服務器上找到的文件

攻擊者可以將Bughatch視為某種後門,部署在進程內存中,並在Windows API(VirtualAlloc、CreateThread、WaitForSingleObject)的幫助下,在分配的空間內執行shellcode,然後連接到C2並等待進一步的指令。特別是,C2可以發送命令下載進一步的惡意軟件,例如Cobalt Strike Beacon、Metasploit或進一步的Bughatch模塊。

17.png

Bughatch運行流程圖

趨勢科技移動應用信譽服務(MARS)團隊最近發現了一種全新的、完全未被發現的安卓銀行木馬,名為MMRat,自2023年6月底以來一直針對東南亞的移動用戶。

研究人員將此惡意Android銀行木馬命名為MMRat (趨勢科技檢測為AndroidOS_MMRat.HRX),自2023年6月下旬以來一直針對東南亞的移動用戶。該惡意軟件以其獨特包名com.mm.user命名。可以捕獲用戶輸入和屏蔽內容,還可以通過各種技術遠程控制受害者設備,使其運營商能夠在受害者的設備上實施銀行欺詐。

此外,MMRat使用基於協議緩衝區(又名Protobuf)的特殊自定義命令與控制(CC)協議,這是一種用於序列化結構化數據的開源數據格式。這個功能在Android銀行木馬中很少見到,它在傳輸大量數據時提高了性能。

技術分析分析顯示,大多數MMRat樣本都是從一系列偽裝成官方應用商店的類似網絡釣魚網站下載的。這些網站主要在語言上有所不同,這表明了MMRat運營商的目標受害者範圍。然而,這些網絡釣魚鏈接到達受害者設備的確切方法目前尚不清楚。

1.1.png

1.2.png

越南語和泰語的應用商店頁面示例,包含提到應用程序安裝提示的文本,第二張截圖是對泰國政府實體的惡搞

在撰寫本文時,該惡意軟件在VirusTotal上完全未被發現,這表明用於使其隱蔽技術是成功的。類似的惡意軟件,如GigabudRat和Vultur,也利用類似的技術,如鍵盤記錄和屏幕捕獲,在攻擊階段取得了顯著的反規避效果。

MMRat如何被用於銀行欺詐MMRat攻擊流程如下:

1.受害者下載並安裝MMRat;

2.受害者授予MMRat必要的權限;

3.MMRat開始與遠程服務器通信,並發送大量數據,包括設備狀態、個人數據和鍵盤記錄數據。

當目標設備未被使用時,攻擊者可以遠程喚醒設備,解鎖屏幕,並執行銀行欺詐。同時,攻擊者還可以啟動屏幕捕獲,以實現設備屏幕的服務器端可視化。

在最後一步,MMRat自行卸載,從系統中刪除惡意軟件的所有痕跡。

2.png

MMRat攻擊流程

MMRat分析如前所述,MMRat能夠捕獲用戶輸入、屏幕內容並遠程控制其受害者的設備。它在很大程度上依賴於Android輔助功能服務和MediaProjection API來正常工作。

模擬和持久化為了避免被發現,MMRat經常偽裝成官方政府或約會應用程序,然後在啟動時向受害者展示一個網絡釣魚網站。隨後,它註冊一個接收器,該接收器可以接收系統事件,包括檢測系統何時打開和關閉以及重新啟動等。在收到這些事件後,惡意軟件啟動一個1x1大小的像素活動以確保其持久性。

3.png

WebView顯示的虛假登錄網站

與遠程服務器的網絡通信在啟動可訪問性服務時,MMRat與攻擊者控制的服務器建立連接。值得注意的是,MMRat在單個服務器上使用不同的端口來實現不同的功能:

4.png

MMRat在單個服務器上使用的端口

CC協議特別獨特,因為它基於Netty(一種網絡應用程序框架)和前面提到的Protobuf進行自定義,並配有精心設計的消息結構。

對於CC通信,攻擊者使用一個總體結構來表示所有消息類型,並使用“oneof”關鍵字來表示不同的數據類型。研究人員仔細地重構了CC通信中使用的主要Protobuf模式,如下圖所示。

5.1.png

5.2.png

用於CC通信的Protobuf模式

“PackType”是一個枚舉結構,可用於表示CC命令,而“pack”字段包含不同CC命令對應的詳細數據。

下圖顯示了惡意軟件使用的已定義的CC命令及其相應的描述。由於涉及雙向通信,我們將CC命令分為服務器命令和客戶端命令。服務器命令發送給客戶端,客戶端命令發送給服務器。

6.png

MMRat CC命令及其描述

收集設備狀態和個人信息MMRat收集大量的設備狀態和個人數據,其中包括網絡數據、屏幕數據、電池數據、安裝的應用程序和聯繫人列表。

1.網絡數據包括信號強度、網絡類型等信息。

2.屏幕數據包括屏幕是否被鎖定、當前正在使用的應用程序以及當前屏幕上顯示的活動等信息。

3.電池數據提供有關設備電池狀態的信息。

4.聯繫人包括用戶的聯繫人列表。

5.已安裝應用包括設備上安裝的應用。

為了及時收集這些數據,MMRat安排了一個每秒執行一次的計時器任務,同時還使用一個每60秒重置一次的計數器來確定何時執行不同的任務。

7.png

用於根據計數器執行不同任務的計時器任務

MMRat專門針對受害者的聯繫人和已安裝的應用程序列表進行收集。研究人員認為,攻擊者的目標是盜取個人信息,以確保受害者符合攻擊目標的設定。例如,受害者可能有符合特定地理條件的聯繫人,或者安裝了特定的應用程序。然後,這些信息可以用於進一步的惡意活動。

8.png

收集並上傳受害者的聯繫人名單和已安裝應用程序的詳細信息

自動權限審批一旦授予了可訪問性權限,MMRat就可以濫用它來授予自己其他權限並修改設置。例如,在前面的數據收集階段,MMRat可以自動授予自己READ_CONTACTS權限來收集聯繫人數據。

上圖中的代碼片段顯示了MMRat如何自動獲得權限。它通過啟動系統對話框並自動批准傳入的權限請求來實現這一點。自動審批功能是通過在屏幕上找到“ok”或相關關鍵詞,並使用可訪問功能模擬點擊來實現的。這意味著MMRat可以繞過用戶干預,並授予自己執行惡意活動所需的權限。

9.png

請求權限並啟動自動點擊

10.png

關鍵詞,如“ok”和其他類似的單詞和短語

操作和捕獲用戶輸入MMRat濫用可訪問性服務,通過鍵盤記錄捕獲用戶輸入和操作。這些數據可用於獲取受害者的憑證,並記錄受害者的操作,以便稍後在設備上回放。

與其他專注於特定場景的鍵盤記錄惡意軟件不同,例如只在受害者使用銀行應用程序時記錄鍵盤操作,MMRat記錄用戶操作的每個動作,並通過CC通道將它們上傳到服務器。 MMRat背後的攻擊者似乎想要從受害者那裡收集大量的操作日誌,以確定惡意軟件的下一步行動。

11.png

記錄用戶操作並將其上傳到命令與控制服務器

每個日誌都是一個LogInfo結構,通過Protobuf序列化。

12.png

除了傳統的鍵盤記錄外,該惡意軟件還對鎖屏模式特別感興趣。如果檢測到用戶正在解鎖設備,惡意軟件會收集模式值,並通過命令與控制通道上傳到服務器。這使得攻擊者可以訪問受害者的設備,即使它是鎖定的。

13.png

在鎖定屏幕上進行鍵盤登錄以獲取模式值

捕獲屏幕內容MMRat可以捕獲受害者設備的實時屏幕內容,並將內容流程傳輸到遠程服務器。為了捕獲屏幕內容,惡意軟件主要依賴於MediaProjection API來記錄受害者的屏幕。然而,我們還發現惡意軟件使用另一種方法獲取屏幕內容並繞過FLAG_SECURE保護,惡意軟件將其稱為“用戶終端狀態”。

根據觀察,我們認為屏幕內容捕獲功能與遠程控制功能結合使用,因此攻擊者可以在進行銀行欺詐時查看設備的實時狀態。我們發現,惡意軟件不會捕獲憑證,而是會不斷檢查命令,如果在30秒內沒有收到命令,它會停止屏幕內容流程。

14.png

如果沒有收到命令,則停止屏幕內容流程

Android MediaProjection API為了方便地使用MediaProjection API並將視頻數據流式傳輸到遠程服務器,MMRat濫用了一個名為rtmp-rtsp-stream-client-java的開源框架。這使得它可以記錄屏幕並通過實時流媒體協議(RTSP)將實時視頻數據流傳輸到遠程服務器。在接收到MEDIA_STREAM命令後,MMRat可以根據發布的配置記錄兩種類型的數據:屏幕和相機數據。

例如,當記錄屏幕數據時,MMRat啟動一個名為DisplayActivity的活動。該活動通過調用createScreenCaptureIntent請求記錄權限,該操作會觸發系統對話框彈出窗口以授予權限。如上所述,系統對話框是通過自動點擊自動批准的。

15.png

請求權限和錄屏

一旦錄製請求獲得批准,MMRat就開始錄製屏幕,並通過調用開源框架存儲庫提供的API startStream將數據流式傳輸到CC服務器。

16.png

Strat記錄和數據流

用戶終端狀態捕獲屏幕內容的所謂“用戶終端狀態”方法與使用MediaProjection API的方法大不相同。顧名思義,MMRat並不將錄屏為視頻。相反,它濫用可訪問服務,每秒遞歸地轉儲窗口中的所有子節點,並通過CC通道上傳轉儲的數據。因此,結果只包含文本信息而沒有圖形用戶界面,因此類似於“終端”。

17.png

轉儲所有窗口並遍歷根節點以遞歸方式獲取所有子節點

儘管該方法有些粗糙,並且需要攻擊者在服務器端進行額外的工作來重建數據,但它在收集遠程檢查和控制所需的信息(例如,用於點擊和輸入的節點信息)方面非常有效。由於這種方法不依賴於MediaProjection API,它可以繞過FLAG_SECURE的保護,FLAG_SECURE是一個可以添加到窗口參數以防止截屏和錄屏的標誌。

此外,使用Protobuf和基於Netty的自定義協議增強了性能。這在及時傳輸大量屏幕數據時特別有用,為攻擊者提供類似視頻流的效果。

遠程控制MMRat惡意軟件濫用無障礙服務來遠程控制受害者的設備,執行諸如手勢、解鎖屏幕和輸入文本等操作。這可以被威脅行為者用來進行銀行欺詐,再加上被盜的憑據。

18.png

執行動作

正如“MMRat如何執行銀行欺詐”一節所述,研究人員認為,即使在執行其遠程訪問例程之前,MMRat也會執行逃避流程:

1.喚醒:惡意軟件利用可訪問性服務來模擬屏幕上的雙擊來喚醒設備。

2.解鎖屏幕:惡意軟件使用之前竊取的解鎖模式解鎖屏幕。

19.png

喚醒並解鎖屏幕

最後,MMRat可以在受害者不積極使用手機時遠程控制設備。

隱藏痕跡MMRat惡意軟件具有在接收到CC命令UNINSTALL_APP時將其自身刪除的能力。這種行為通常發生在銀行欺詐實施之後,使追踪其活動變得更加困難。

20.png

自動從受害者的設備中自我刪除

總結MMRat是一個強大的Android銀行木馬,對手機用戶構成了相當大的威脅,特別是在東南亞。它的關鍵功能,包括鍵盤記錄、錄屏和遠程控制訪問,使它能夠有效地執行銀行欺詐。

緩解建議1.只從官方商店下載應用程序,MMRat通常是從冒充官方應用商店的釣魚網站下載的。

2.始終使用可靠的平台,如Google Play Store或Apple App Store。

3.定期更新設備軟件。更新通常包括防範MMRat等新安全功能。

4.在授予可訪問性權限時要謹慎。 MMRat利用Android的無障礙服務來進行惡意活動,始終仔細檢查應用程序請求的權限。

5.在設備上安裝信譽良好的安全解決方案,這有助於提前預防。

6.對你的個人和銀行信息保持警惕,MMRat的目標是實施銀行欺詐,所以要小心你在網上分享的信息和你提供給應用程序的數據。

本文將介紹SKPG的數據結構和組件,更具體地說,是它被激活的方式。 SKPG 初始化的過程請您點擊這裡了解。

內部HyperGuard激活在SKPG 初始化一文中,我介紹了HyperGuard並描述了它的不同初始化途徑。無論我們怎麼選擇,最終都會在普通內核完成初始化時到達SkpgConnect。此時內核中所有重要的數據結構已經初始化,可以開始受到PatchGuard 和HyperGuard 的監控和保護。

經過幾次標準輸入驗證後,skpgconect獲得SkpgConnectionLock並檢查SkpgInitialized全局變量,以告訴HyperGuard是否已經被初始化。如果設置了變量,函數將根據接收到的信息返回STATUS_ACCESS_DENIED或STATUS_SUCCESS。在任何一種情況下,它都不會做任何其他事情。

如果SKPG 尚未被初始化,SkpgConnect 將開始對其進行初始化。首先,它計算並保存多個隨機值,以便稍後在多個不同的檢查中使用。然後它分配並初始化一個背景結構,保存在全局SkpgContext 中。在我們繼續討論其他SKPG 領域之前,有必要花點時間討論一下SKPG 的背景。

SKPG背景這個SKPG背景結構在SkpgConnect中被分配和初始化,並將在所有SKPG檢查中使用。它包含HyperGuard監控和保護系統所需的所有數據,如NTPTE信息、加密算法、KCFG範圍等,以及另一個計時器和回調,與我們在SKPG 初始化一文看到的計時器和回調不同。不幸的是,像HyperGuard的其他部分一樣,這個結構(我將稱之為SKPG_CONTEXT)沒有文檔記錄,因此我們需要盡最大努力弄清楚它包含什麼以及如何使用它。

首先,需要分配背景。這個背景具有一個動態大小,它取決於從普通內核接收到的數據。因此,它是在運行時使用函數SkpgComputeContextSize計算的。結構的最小大小是0x378字節(隨著背景結構獲得新字段,這個數字往往會隨著Windows構建的次數增加而增加),並且根據從普通內核發送的數據,該結構將被添加一個動態大小。

只有在通過PatchGuard代碼路徑初始化SKPG時才發送的輸入數據是一個名為Extents的結構數組。這些範圍描述了HyperGuard保護的不同內存區域、數據結構和其他系統組件。我將在後面的文章中更詳細地介紹所有這些,但是有幾個例子包括GDT和IDT、某些受保護模塊中的數據部分和具有安全含義的MSR。

計算出所需的大小後,分配SKPG_CONTEXT結構,並在SkpgAllocateContext中設置一些初始字段。其中兩個字段包括另一個安全計時器和一個相關的回調,其函數被設置為SkpgHyperguardTimerRoutine和SkpgHyperguardRuntime。它還設置了與PTE地址相關的字段和其他與分頁相關的屬性,因為很多HyperGuard檢查都驗證了正確的Virtual-Physical頁面轉換。

然後,調用SkpgInitializeContext來使用普通內核提供的範圍完成背景的初始化。這基本上意味著遍歷輸入數組,使用數據初始化內部結構, 我將調用SKPG_EXTENT,並將它們粘貼在SKPG_CONTEXT 結構的末尾,我選擇調用ExtentOffset 的字段指向范圍數組(請注意,這些結構都沒有記錄,因此所有結構和字段名稱都是由組成的):

1.png

SKPG範圍有許多不同類型的範圍,每個SKPG_EXTENT結構都有一個Type字段指示其類型。每個範圍還具有一個哈希,在某些情況下,該哈希用於驗證對所監控的內存區域沒有做任何更改。然後是被監控內存的基址和字節數的字段,最後是包含每個範圍類型特有數據的聯合。作為參考,下面是反向工程的SKPG_EXTENT結構:

2.png

我提到過,HyperGuard使用的輸入區是由普通內核中的PatchGuard初始化器函數提供的。但是SKPG會初始化另一種類型的範圍,同樣安全的範圍。為了初始化這些,SkpgInitializeContext調用SkpgCreateSecureKernelExtents,提供SKPG_CONTEXT結構和當前範圍數組結束的地址,因此可以將安全範圍放置在那裡。安全範圍使用與常規範圍相同的SKPG_EXTENT結構,並保護安全內核中的數據,例如加載到安全內核和安全內核內存範圍中的模塊。

3.png

範圍類型如前所述,有許多不同類型的範圍,HyperGuard使用每種範圍來保護系統的不同部分。然而,我們可以將他們分成幾個具有相似特徵的組,並以相似的方式處理。為了清晰並將正常範圍與安全範圍分離,我將使用命名約定SkpgExtent用於正常範圍類型,SkpgExtentSecure用於安全範圍類型。

我想要介紹的第一個範圍非常簡單,它總是被發送到SkpgInitializeContext,而不管其他輸入。

初始化範圍有一個範圍不屬於任何組,因為它不涉及任何HyperGuard驗證。這是0x1000: SkpgExtentInit,此範圍不會復製到背景結構中的數組中。相反,這個範圍類型是由SkpgConnect創建的,並發送到SkpgInitializeContext,以設置背景結構本身中以前未填充的一些字段。這些字段具有與熱補丁相關的附加哈希值和信息,例如是否啟用熱補丁以及retpoline代碼頁的地址。它還在背景結構中設置一些標誌,以反映設備中的一些配置選項。

內存和模塊範圍這個組包括以下範圍類型:

4.png

所有這些範圍類型的共同點是,它們都表示HyperGuard要保護的內存範圍。其中大多數包含正常內核中的內存範圍,但是SkpgExtentSecureMemory和SkpgExtentSecureModule有VTL1內存範圍和模塊。儘管如此,不管內存類型或VTL如何,所有這些範圍類型都以類似的方式處理,所以我將它們組合在一起。

當向SKPG Context添加普通內存範圍時,將驗證所有普通內核地址範圍,以確保頁面具有用於SKPG保護的有效映射。為了使普通內核頁對SKPG保護有效,這個頁是不可寫的。 SKPG將監控所有請求頁面的更改,因此內容可以隨時更改的可寫頁面不是此類保護的有效“候選”頁面。因此,SKPG只能監控保護為“讀”或“執行”的頁面。顯然,只有有效的頁面(如PTE中的valid位所示)才能受到保護。當啟用HVCI時,與某些內存範圍有一些細微的差別,因為在這些條件下SKPG無法處理某些頁麵類型。

一旦映射和驗證,每個應該被保護的內存頁將被哈希,並將哈希保存到SKPG_EXTENT結構中,它將在未來的HyperGuard檢查中使用,以驗證頁面沒有被修改。

一些內存範圍描述了一個通用的內存範圍,還有一些,比如SkpgExtentImagePage,描述了一個特定的內存類型,需要稍微區別對待。這種範圍類型提到了普通內核中的特定映像,但是HyperGuard不應該保護整個映像,而應該保護其中的一部分。因此,輸入範圍包括映像基礎、映像中保護應該開始的頁面偏移量以及請求的大小。這裡要保護的內存區域也將被哈希,哈希值將被保存到SKPG_EXTENT中,以便在將來的驗證中使用。

但是寫入SKPG背景的SKPG_EXTENT結構通常只描述單個內存頁面,而係統可能希望保護映像中更大的區域。對於HyperGuard來說,一次處理一個頁面的內存驗證更簡單,這樣可以獲得更可預測的處理時間,避免在哈希大內存範圍時佔用太多時間。因此,當接收到請求大小大於頁面(0x1000字節)的輸入範圍時,SkpgInitializeContext遍歷請求範圍中的所有頁面,並為每個頁面創建一個新的SKPG_EXTENT。只有描述範圍中的第一個頁面的第一個範圍接收類型SkpgExtentImage。描述以下頁面的所有其他類型都接收不同的類型0x1014,我選擇調用SkpgExtentPartialMemory,並且原始的範圍類型位於SKPG_EXTENT結構中特定類型數據的前2個字節中。

數組中的每個範圍都可以用不同的標誌來標記。其中一個是Protected標誌,它只能應用於普通的內核區,這意味著SKPG應該保護指定的地址範圍不受更改。在這種情況下,SkpgInitializeContext將在請求的地址範圍上調用SkmmPinNormalKernelAddressRange來固定並防止它被VTL0代碼釋放:

5.png

安全內存範圍本質上與普通內存範圍非常相似,主要區別在於它們由安全內核本身初始化以及它們所保護的內容的詳細信息。

生成SkpgExtentSecureModule類型的範圍來監控加載到安全內核空間中的所有映像。這是通過迭代SkLoadedModuleList全局列表來完成的,它和普通內核的PsLoadedModuleList一樣,是一個KLDR_DATA_TABLE_ENTRY結構的鍊錶,表示所有加載的模塊。對於其中的每個模塊,都調用SkpgCreateSecureModuleExtents來生成範圍。

為此,SkpgCreateSecureModuleExtents 一次接收一個加載的DLL 的KLDR_DATA_TABLE_ENTRY,驗證它是否存在於PsInvertedFunctionTable(包含所有加載的DLL 的基本信息的表,主要用於快速搜索異常處理程序),然後枚舉模塊。安全模塊中的大多數部分都使用SKPG_EXTENT 進行監控,但不受修改保護。只有一個部分受到保護,TABLERO 部分:

6.png

TABLERO 部分是僅存在於少數二進製文件中的數據部分。在普通內核中,它存在於Win32k.sys 中,其中包含win32k 系統服務表。在安全內核中,securekernel.exe 中存在TABLERO 部分,其中包含全局變量,例如SkiSecureServiceTable、SkiSecureArgumentTable、SkpgContext、SkmiNtPteBase 等:

7.png

當SkpgCreateSecureModuleExtents 遇到TABLERO 部分時,它會調用SkmmProtectKernelImageSubsection 將部分頁面的PTE 從默認的讀寫更改為只讀。

然後,對於每個範圍,無論其類型如何,都會創建一個類型為SkpgExtentSecureModule的範圍。如果段是可執行的,則每個內存區域將被哈希成範圍標記中的一個標誌。每個範圍生成的範圍數量可能不同:如果在計算機上啟用了hotpatch,將為受保護映像範圍中的每個頁面生成單獨的範圍。否則,每個受保護的部分會生成一個可能覆蓋多個頁面的範圍,所有這些範圍都使用SkpgExtentSecureModule類型:

8.png

如果啟用了hotpatch,則為每個安全模塊創建最後一個安全模塊區。變量SkmiHotPatchAddressReservePages將指示在模塊末尾有多少個頁面被預留給HotPatch使用,並為每個頁面創建一個範圍。與前面描述的普通內核模塊範圍的方式類似,每個範圍描述一個頁面,範圍類型是SkpgExtentPartialMemory,類型SkpgExtentSecureModule被放置在範圍的一個類型特定的字段中。

另一個安全範圍類型是SkpgExtentSecureMemory。這是一個通用範圍類型,用於指示安全內核中的任何內存範圍。但是,目前它僅用於監控由安全內核處理器塊(SKPRCB)指向的GDT。這是一個內部結構,其目的類似於普通內核的KPRCB(類似地,它們的數組存在於SkeProcessorBlock中)。對於系統中的每個處理器,都有一個這種類型的範圍。此外,該函數在每個KGDTENTRY64結構的Type字段中設置一個位,以表明這個條目已經被訪問,並防止它在以後被修改,但是在偏移量0x40處的TSS條目將被跳過:

9.png

這基本上涵蓋了內存區的初始化和使用。

持續的遠程工作趨勢使企業組織嚴重依賴虛擬基礎架構與虛擬專用網絡(VPN)。它們在今天是非常常見的解決方案,但微調VPN 仍然是一項棘手的任務。

網絡管理員必須選擇相關工具並手動構建一個網絡,以滿足其組織在網絡安全、用戶匿名性和網絡複雜性方面的需求。有時,VPN 無法滿足組織的需求,組織不得不尋找軟件定義網絡(SDN) 等更複雜的技術。

在本文中,我們展示瞭如何設置可在現實場景中使用的安全虛擬專用網絡,以提供對本地和雲資源的訪問。我們還將了解SDN 的功能、優勢和關鍵應用。

本文對希望增強VPN 技術及其發展方向知識的團隊領導和產品經理很有用。

什麼是VPN? VPN是一種允許多台機器通過虛擬網絡連接的技術。與需要實際的電線和/或無線電發射器到位的物理網絡不同,虛擬網絡利用現有的物理基礎設施並純粹通過軟件方式定義其拓撲。

為了解釋VPN 的工作原理,讓我們定義一些術語,考慮我們期望常規網絡具有的屬性,並了解它們通常如何在VPN 中實現:

image.png

這些東西的工作方式在真實網絡和虛擬網絡中幾乎是一樣的。主要區別在於,在虛擬網絡中,分配了IP 地址的網絡接口是虛擬的,即在操作系統視為接口的背後沒有實際的物理設備。路由到此接口的流量由實現VPN 協議的軟件處理。

由於虛擬接口沒有與其關聯的物理設備,它不能直接將數據包發送到網絡中,因此它要求其他接口為它這樣做。當虛擬接口接收到數據包時,它會確定其在虛擬網絡中的目的地(接收方的IP 地址)。然後,接口背後的軟件檢查VPN 的配置,以找到與接收方網絡節點對應的物理接口的IP 或可以將數據包路由到它的節點的IP。這是這個過程的樣子:

image.png

物理接口不轉發原始數據(即VPN 數據包的有效負載),而是傳輸整個數據包和標頭。當接收方的節點收到數據包時,其虛擬接口可以解析它並確定下一步要做什麼。

VPN 本質上混淆了兩個對等點之間的物理網絡,使它們認為它們直接相互連接並在幕後傳輸流量。此屬性允許組織為其用戶提供從本地網絡外部對敏感資源的安全遠程訪問。此外,他們不需要根據物理網絡接口的IP 地址配置複雜的路由規則。

現在,讓我們通過實際示例詳細探討如何保護您的虛擬網絡。

使用VPN 增強網絡安全VPN 實現在數據離開虛擬接口之前對所有數據進行加密,並利用VPN 網關屏蔽網絡客戶端的實際IP。讓我們看看真實世界的VPN 協議Wireguard如何確保在虛擬網絡中保護傳輸中的數據和用戶匿名。

Wireguard 是一款開源軟件,可為您的VPN 添加加密功能。以下是我們如何使用Wireguard 配置文件表達上一節中的方案:

Device1configuration:

[Interface]

Address=10.0.0.1

PrivateKey=%device1's

key%

[Peer]

PublicKey=%device2的

公鑰

%

Endpoint=%device2的IP%:

51820AllowedIPs=10.0.0.2/32

Device2配置:

[Interface]

Address=10.0.0.2

PrivateKey=%device2的

私鑰

%

ListenPort=51820

[Peer]

PublicKey=%device1's

public

key%

AllowedIPs=10.0.0.1/32這兩種配置看起來幾乎相同。兩者都定義了一個具有特定IP 地址和關聯私鑰的虛擬接口,並相互交換公鑰。第二個設備承擔服務器的角色,定義其虛擬網絡對等點可以連接到的偵聽端口。如果未定義此端口,則入站數據包將被丟棄,從而阻止任何通信的發生。

但是,對等點不必公開偵聽端口,因為服務器將使用在它們連接後創建的套接字來響應它們。所有在10.0.0.1 和10.0.0.2 之間傳輸的數據包都將由Wireguard 加密,並使用UDP 傳輸協議通過物理網絡發送到它們的目的地。

現在讓我們擴展上面描述的簡單拓撲並在網絡中引入更多對等點:

image.png

在網絡中,Device1 和Device3 之間沒有直接連接,它們必須依靠Device2 來中繼它們的數據包。這是此設置的Wireguard 配置的外觀:

Device1configuration:

[Interface]

Address=10.0.0.1

PrivateKey=%device1'sprivatekey%

[Peer]

PublicKey=%device2'spublickey%

Endpoint=%device2'sIP%:51820

AllowedIPs=10.0.0.0/24

Device2configuration:

[Interface]

Address=10.0.0.2

PrivateKey=%device2'sprivatekey%

ListenPort=51820

[Peer]

PublicKey=%device1'spublickey%

AllowedIPs=10.0.0.1/32

[Peer]

PublicKey=%device3'spublickey%

AllowedIPs=10.0.0.3/32

Device3configuration:

[Interface]

Address=10.0.0.3

PrivateKey=%device3'sprivatekey%

[Peer]

PublicKey=%device2'spublickey%

Endpoint=%device2'sIP%:51820

AllowedIPs=10.0.0.0/24現在Device2的配置和原來的有很大的不同。它有兩個[Peer] 部分,對應於Device1 和Device2。每個部分都包含給定對等點的公鑰及其虛擬IP,以便Device2 知道將哪些數據包路由到哪裡。 Device1 和Device3 配置也有點不同:它們的AllowedIPs 字段現在包含的不是單個IP,而是10.0.0.0/24 子網。這意味著此子網中的所有IP 都將路由到Device2。

這種將一台設備用作網關的設置非常普遍。 Device1可以是員工在家訪問辦公室的電腦,Device3可以是連接公司內網的目標電腦,Device2可以是外部客戶端訪問本地設備的網關,例如Device3。

在Wireguard 接口之間流動的所有流量都經過加密,連接到此VPN 的設備(網關除外)都不知道對等方的物理IP。這種連接既安全又匿名。

為什麼簡單的虛擬網絡會演變成SDN?我們上面討論的示例拓撲可用於不需要復雜網絡的小型組織。大型公司、國際組織和雲計算採用者需要更複雜和精細的解決方案。複雜的虛擬網絡是許多現代組織的支柱,這些組織允許其員工遠程工作或在多個地點開展業務。

軟件定義的網絡方法在網絡交換機、負載平衡器、網關和其他元素之上添加專用網絡服務。這些服務充當網絡基礎設施和您的業務架構之間的附加控制層。通過這一層,您可以方便地配置和管理網絡中的端點,以及建立虛擬網絡安全性能監控。

軟件定義的網絡正在迅速流行,因為它允許組織:

image.png

簡化和集中網絡管理。網絡管理員可以使用軟件定義的網絡從一個地方管理他們的網絡,而不是分別處理每個基礎設施元素和VPN 協議。中間層幫助他們方便地編排網絡端點、配置流量優先級並添加安全機制,同時節省時間。

保持網絡配置一致。當從一個地方配置和管理所有基礎架構元素時,它們會一致地工作,並且不會在虛擬專用網絡安全性和性能方面留下任何差距。

加強網絡保護。 SDN 引入了額外的可能性來保護您的網絡,例如選擇性流量阻塞和路由到特定服務、網絡分段、自動安全更新以及所有網絡元素的識別。

優化負載均衡。配置有VPN 的簡單虛擬網絡為負載平衡提供的靈活性很小,因為它專注於在虛擬元素和真實元素之間傳遞流量。 SDN 控制器可以查看整個網絡中資源的可用性,並根據負載動態將流量重新路由到各個端點。

構建更複雜的網絡。網絡服務層允許您向網絡添加任意數量的虛擬資源、雲計算服務和基礎設施元素。使用SDN對於構建大型數據中心、國際企業基礎設施、雲服務等至關重要。

請記住,建立SDN 是一個複雜的過程,仍然需要您投入大量精力來設計和規劃您的網絡。但如果實施得當,軟件定義網絡可為您提供改進虛擬網絡的可能性。

現在,讓我們看看如何通過使用軟件定義額外的端點,將上面示例中的簡單網絡轉變為高級網絡。

配置高級網絡路由具有多個內網和雲服務的網絡需要更多的網關來管理不同的子網,平衡負載,並使虛擬網絡容錯。在物理網絡中,無數網關通過Internet 路由數據包。為了有效地做到這一點,他們使用了邊界網關協議(BGP)。該協議設計用於在網關之間共享路由和可達性信息。

讓我們探索擴展網絡拓撲的示例模式:

scheme_-_3(1).jpg

物理網絡接口上的特定IP 在這裡並不重要,因為所有設備都連接到不同的LAN。 Device1 和Device2 連接到Gateway1,而Device3 和Device4 連接到Gateway2。但是,例如,當Device1 試圖訪問Device3 時會發生什麼?

當Device1 將數據包發送到IP 地址10.0.0.4 時,它們被路由到Gateway1,因為該IP 屬於10.0.0.0/24 子網並且Wireguard 配置指示將這些數據包重定向到10.0.0.2 對等方。但是Gateway1 的配置不包含IP 為10.0.0.4 的任何對等點,因此它必須將接收到的數據包中繼給知道如何到達目的地的人。

這就是BGP 發揮作用的地方。 Gateway1 和Gateway2 建立BGP 連接並共享路由信息。要創建這樣的連接,您可以使用BIRD Internet Routing Daemon。 BIRD 守護進程的相應配置如下:

Gateway1config

protocolbfd{

interface'wg*'{

minrxinterval10ms;

mintxinterval100ms;

idletxinterval1000ms;

multiplier5;

};

neighbor10.0.0.5;

}

protocolstatic{

route10.0.0.1/32;

route10.0.0.3/32;

}

Gateway2config

protocolbfd{

interface'wg*'{

minrxinterval10ms;

mintxinterval100ms;

idletxinterval1000ms;

multiplier5;

};

neighbor10.0.0.2;

}

protocolstatic{

route10.0.0.4/32;

route10.0.0.6/32;

}每個配置的第一部分——protocol bfd——定義了向鄰居通告路由的條件。鄰居本身應該可以通過雙向轉發檢測(BFD) 協議訪問,該協議可以快速檢測兩個鄰居之間的鏈路是否斷開。

第二部分——靜態協議——定義了向鄰居通告的靜態路由。 Gateway1 共享到Device1 和Device2 的路由,而Gateway2 共享到Device3 和Device4 的路由。因此,當網關接收到一個IP 未出現在其配置中的數據包時,它可以檢查路由表以查看BIRD 守護程序是否接收到任何相關的路由信息並將數據包轉發到下一個網關。數據包將在網關之間傳輸,直到到達目的地。

為了獲得額外的可靠性,每個對等點都可以運行BFD 客戶端來檢測它們所連接的網關是否可達。如果對等點本身不可達,則可以指示BIRD 守護進程根據其BFD 連接狀態不通告其路由。我們可以通過將此代碼添加到上面的代碼而不是protocol static來實現:

protocolstatic{

route%peervirtualIP%/32multipath

via%wireguardinterface%bfd;

}有了這個,您將擁有一個可行的虛擬軟件定義網絡,該網絡連接多個端點,保護其中的數據,並提供一些擴展空間。

結論借助Wireguard 和BIRD 等現代工具,組織可以構建跨越多個內聯網的虛擬網絡,整合雲服務,並允許用戶通過精細控制安全地訪問所有必需的資源。

Nokoyawa勒索軟件即服務(RaaS)的運營商是一夥被稱為“farnetwork”的威脅組織,多年來通過幫助JSWORM、Nefilim、Karma和Nemty等勒索軟件團伙開發惡意軟件和管理運營積累了經驗。

網絡安全公司Group-IB近日的一份報告深入剖析了farnetwork的活動,以及闡述他們是如何逐漸成為勒索軟件行當中異常活躍的玩家。

farnetwork向威脅情報分析師們披露了細節,這些細節可以將他們與2019年開始的多起勒索軟件活動和一個可以訪問多個企業網絡的殭屍網絡聯繫起來。

據Group-IB向IT安全外媒體出示的報告顯示,這夥威脅組織擁有多個用戶名(比如farnetworkl、jingo、jsworm、razvrat、piparkuka和farnetworkitand),並活躍於多個俄語黑客論壇,試圖招募加盟團伙從事各種勒索軟件活動。

1.png

圖1. 威脅分子情況簡介(圖片來源:Group-IB)

今年3月,farnetwork開始為其基於Nokoyawa加密惡意軟件的勒索軟件即服務項目尋找加盟團伙。然而,Group-IB的威脅情報分析師表示,這夥威脅組織明確表示,他們沒有參與開發Nokoyawa的工作。

開展RaaS業務並沒有持續多久,farnetwork宣布將退出該領域,並在10月份關閉了Nokoyawa RaaS項目,此前該項目洩露了35名受害者的數據。

2.png

圖2. Nokoyawa公佈受害者(圖片來源:Group-B)

然而Group-IB認為,這夥威脅組織的策略是改變方向,以一個新的品牌重新開始,而這個舉動正是其中的一部分。

攻擊活動管理方在Nokoyawa勒索軟件中,farnetwork扮演了項目負責人、加盟團伙招聘者、暗網論壇上RaaS的推廣者和殭屍網絡管理方等多重角色。

該殭屍網絡使加盟團伙能夠直接訪問已經受到攻擊的網絡。為此,加盟團伙將向殭屍網絡的所有者支付所收取贖金的20%,而勒索軟件的所有者將獲得15%的分成。

考慮到其他項目支付高達85%的贖金作為分成,對勒索軟件加盟團伙來說,65%的分成是糟糕的交易,但成本已涵蓋了找到一個合適的目標並闖入其中所耗費的精力。

farnetwork測試加盟團伙候選對象的辦法是,向它們提供從地下日誌雲(UCL)服務獲得的幾個公司賬戶憑據,UCL服務出售由RedLine、Vidar和Raccoon等信息竊取惡意軟件竊取的日誌。

預計這些加盟團伙會升級其在網絡上的權限,竊取文件,運行加密程序,並要求支付贖金。

3.png

圖3. 網絡訪問憑據面板(圖片來源:Group-IB)

以往活動時間表Group-IB已經能夠追踪到farnetwork早在2019年1月的活動,發現了它與JSWORM、Nemty、Nefilim和Karma等勒索軟件團伙有關聯。

2019年4月,farnetwork在Exploit黑客論壇上大肆推廣JSWORM RaaS項目,這夥威脅組織對RazvRAT惡意軟件大打廣告。

4.png

圖4. 推銷RazvRAT惡意軟件(圖片來源:Group-IB)

2019年8月,在JSWORM關閉後,這夥威脅組織轉而在至少兩個地下論壇上推廣Nemty。

2020年3月,Nefilim勒索軟件浮出水面,這時它作為一個新的加盟項目示人,擁有名為Corporate Leaks的數據洩露網站。次月,farnetwork宣布Nemty將私有化。

5.png

圖5. Nefilim公佈受害者名單(圖片來源:Group-B)

2021年6月,改頭換面的Nefilim(名叫Karma)出現在世人面前,2021年7月Nefilim又悄無聲息。在此期間,farnetwork在尋找有關思傑VPN零日漏洞的信息。

2023年2月,farnetwork轉向RAMP論壇,聲稱他們與Nokoyawa勒索軟件合作,充當對方的招聘者和訪問管理方。

6.png

圖6. 在RAMP上推廣RaaS(圖片來源:Group-IB)

從Group-IB的研究結果來看,farnetwork被懷疑參與了開發上述幾種勒索軟件的工作,或至少參與了這幾種勒索軟件的改進和管理。它與Nefilim和Karma的關係最緊密,它們都被認為是Nemty的進化版。

7.png

圖7. farnetwork活動時間表(Group-IB)

Group-IB將不同的用戶名與這同一夥威脅組織聯繫了起來,他們換個新名字,繼續重操舊業。

建議雖然勒索軟件團伙以攻擊關鍵行業的公司而臭名昭著,但它們對所有行業的組織都構成了威脅。除了其網絡增加新成員外,farnetwork的勒索軟件聯盟計劃還為成員提供了經過升級的工具和技術,甚至提供勒索軟件投放機制。企業必須立即採取具體的步驟,以確保關鍵任務操作和數據的安全。我們的建議如下:

•增加更多層安全:多因素身份驗證(MFA)和基於憑據的訪問解決方案可以幫助企業保護其關鍵資產和高風險用戶,使攻擊者更難得逞。

•通過早期檢測阻止勒索軟件:充分利用端點檢測和響應(EDR)解決方案的行為檢測功能,幫助識別跨管理端點上的勒索軟件指標,及時提醒團隊注意任何可疑活動,以便進一步審查。這種主動的方法有助於對端點上已知和未知的威脅進行靈活地檢測、調查和補救。

•有“備份”策略:數據備份過程應該定期進行,因為它們可以減少破壞,並幫助組織在遭到勒索軟件攻擊後避免數據丟失。

•利用先進的惡意軟件引爆解決方案:組織應該充分利用結合人工智能的先進的基於分析的解決方案來實時檢測入侵。

•修補漏洞:漏洞未修補的時間越長,被網絡犯罪分子利用的風險就越大,因此,應該優先考慮安全補丁。組織還應該建立一個流程,定期審查和部署最新的補丁。

•培訓員工:教育員工,了解與組織的網絡、資產、設備和基礎設施相關的風險。人為因素仍然是網絡安全的最大漏洞之一。組織應開展培訓計劃和安全演習,以幫助員工識別和報告網絡犯罪的跡象(比如網絡釣魚電子郵件)。

•控制漏洞:不要對新出現的漏洞視而不見。每年進行一次技術審計或安全評估,以檢查你的基礎設施,這不僅是好習慣,還增加了亟需的保護層,持續監測基礎設施的完整性和數字衛生流程。

•永遠不要支付贖金:在97%的勒索軟件攻擊中,如果不解密軟件,就不可能重新獲得數據訪問權。 Group-IB的事件響應專家不建議急於支付贖金。

以牟利為動機的威脅組織會讓你支付更多錢。即使一個攻擊者返還了你的數據,另一個攻擊者也會明白你願意支付贖金,這將導致對公司的攻擊次數增加,此時你能做的最正確的事情就是盡快聯繫事件響應專家。

111.png

1.概述2024年2月12日,美國網絡安全公司SentinelOne在其官網上發布題為“China’s Cyber Revenge/Why the PRC Fails to Back Its Claims of Western Espionage”的報告[1],(以下簡稱“SentinelOne報告”),對“中國三家知名網絡安全企業360、奇安信、安天及中國網絡安全產業聯盟(CCIA)”等機構揭露美方情報機構網絡攻擊的相關報告進行解讀。我們先直接概括其報告中的觀點和關鍵邏輯。

SentinelOne報告對我們公開的分析報告基於時間線進行了梳理,並引述一些美方人士觀點,設定瞭如下觀點:

1、中方報告是對國際其他機構對美方分析的跟進,存在長期滯後;

2、中方分析工作嚴重依賴美方自身的信息洩露;

3、中方報告沒有“PCAP包”級別的技術實證。

SentinelOne報告的邏輯並不是應答全球網絡安全業界和研究者過去二十年來對美方情報機構攻擊活動和能力的持續分析曝光,包括在美方多次信息洩露中所暴露出來的觸目驚心的真相,而是試圖把國際關注度轉移到中國網絡安全工作者的技術能力和水平是否能夠支撐其持續獨立發現、分析、研究、溯源美方的攻擊上,並將實證的概念窄化為一種具體的技術格式。美西方此前長時間習慣性地從宏觀層面誇大中國網絡安全能力,以便為其情報機構和軍工複合體爭取巨額的網絡安全預算,而此時,突然又在微觀層面開啟一波認為中國分析溯源能力很差的“嘲諷”流,並宣判:作為被霸凌者,你們反抗無效!

對SentinelOne報告所提及的中國安全企業的分析報告,有很大比例來自安天安全研究與應急處理中心(安天CERT),我們當然承認:作為一個企業級別的安全分析團隊,分析美國情報機構這種超級網空威脅行為體的網絡攻擊活動和支撐體系,是非常艱苦的工作。我們知道其中有巨大的能力、資源等方面的落差。我們就如同一隻警覺的白兔,努力睜大雙眼去發現和分析在迷霧森林中吞噬咀嚼各種弱小動物的巨型鷹鷲,我們希望努力畫出它的樣貌,提醒森林裡的其他動物警惕它的襲擊。

2015年,我們提出了A2PT(即高級的高級持續性威脅)這一名詞,以此明確其空前的能力和威脅,也提醒我們自己,對抗和分析這種攻擊能力會有多麼困難。

分析、溯源APT攻擊本身是一個長期、複雜、需要大量資源,需要高度嚴謹的科學態度和耐心定力的工作,對於更為複雜的A2PT的分析則需要付出更大的代價。我們的工作過程基本不為常人所知,分析成果又只有專業人士才能充分理解。所以儘管SentinelOne報告整體邏輯如此之荒謬,但如果我們不向SentinelOne(我們願意稱呼他們為美國同行)點破若干他們視而不見的真相,包括向他們分享一點我們(也包括國際網絡安全業界)對APT分析工作的真正理解,就不足以讓人們看清SentinelOne報告貌似專業、甚至“公正”的梳理和分析下面隱藏的對世界的欺騙。

因此我們很感謝SentinelOne報告,讓我們有機會以自己的回憶視角串聯若干歷史分析工作,包括促成我們公佈這些工作中的一些未出現在歷史報告中的過程線索。由於這段歷程過於漫長,我們一度認為若干有價值的分析成果已經覆滿塵土,但SentinelOne報告讓我們可以把它們重新摘選出來,重新對世界發出告知與提醒。讓所有尋求真相的人們,把我們的這份報告與SentinelOne報告擺放在一起,看看何為詭辯,何為邏輯與真相!

我們並不自詡正確,但我們總還有講述自己經歷的權力!

2.接力追踪鷹鷲的足跡美方情報機構的網絡攻擊不是孤立的行動,而是基於0day漏洞、高級惡意代碼持久化和基於人力、電磁和網空混合作業的長期佈局,並有龐大的工程體係作為支撐。在長期作業過程中可能經歷大型惡意代碼工程的多次迭代,這使得國際網絡安全業界的分析曝光工作看起來像一場工作接力。

第一個接力高峰期,2010年由“震網”事件所觸發,並沿著“火焰”“毒曲”“高斯”等複雜的惡意代碼展開。 SentinelOne的時間線開始就選錯了起點,包括中國網絡安全工作者在內的國際網安業界分析工作起跑於2010年,我們的工作和國際業內同仁是基本同步啟動的,而不是2012年。 2010年7月13日國際網絡安全企業最早曝光相關消息後,我們在7月15日依托設定的關鍵字符串守候到了樣本,並著手搭建“震網”的模擬分析環境,開始模擬分析相關機理。

2-1.jpg

圖2‑1安天搭建的“震網”簡易模擬分析沙盤(2010.7)

針對“震網”的接力分析,是由很多複雜而瑣碎的工作組成的。例如幾乎所有參與分析的機構,都在其中找到了感染USB設備的擺渡感染代碼。但多數沒有成功觸發復現USB擺渡行為。安天的分析貢獻之一是對其擺渡的關鍵機理進行了深入分析,指出了其擺渡傳播的控制條件,從而解釋了其與其他蠕蟲差異明顯的受控傳播特性。在2010年10月11日的《对Stuxnet的后续分析》 [2]中,我們解讀了:

Stuxnet是否感染到U盤,取決於配置數據中的多個域,包括:

马云惹不起马云偏移0x6c、0x70、0xc8處的標記位;

马云惹不起马云偏移0x78、0x7c處的時間戳;

马云惹不起马云偏移0x80、0x84處的數值。

只有當每個域對應的條件都滿足時,才會感染U盤。其中,偏移0xc8處的位默認設置為不感染。

2-2.png

圖2‑2“震網”文件釋放結構和USB傳播邏輯圖(2010.10)

但我們對當時的分析精細度並不滿意,在九年後的“震網”事件最終報告[3]中,我們對完整的標誌位做了更新:

2-3.png

圖2‑3震網擺渡配置內容解析(2019.9)

2010年面對如此復雜的攻擊時,我們承認自己匱乏資源與經驗,作為從病毒分析組轉型的應急分析團隊,我們太習慣於代碼功能逆向的視角,而並未將其所使用的多個0day漏洞進行逐一驗證,也就留下了一個嚴重的分析錯誤,把針對Windows打印後台程序漏洞的利用當作了對打印機的攻擊,還留下瞭如下帶有錯誤的圖示。這也間接導致了多份國內外的文獻由於引用了我們的圖示而產生關聯錯誤。

2-4.png

圖2‑4 Stuxnet蠕蟲突破物理隔離環境的傳播方式的錯誤圖示(2010.9)

儘管對“震網”事件的深入分析了解是全球所有APT分析研究者的基本功,但我們篤定的是:SentinelOne不會比我們更了解“震網”,因為如果他們分析過樣本,恐怕就不會不知道“震網”會提取主機信息並追加於Payload尾部。顯然,基於我們樣本庫中大量的“震網”樣本對主機信息的還原,會提取出大量中國計算機被感染的證據。而這恰恰就是SentinelOne報告所說的實證。

2-5.png

圖2‑5安天基於樣本提煉整理的感染中國計算機節點的部分數據

當美方領導人和政府人士不僅在多次場合中暗示承認“震網”與其情報機構的關係,甚至明顯以此作為擁有強大網絡攻擊威懾的一種宣示時,對事件的分析就已經不能停留在樣本分析和技術實證層面,而必須更深入的判斷打開信息戰“潘多拉魔盒”的影響。在對“震網”的分析中,安天量化對比了“震網”事件與二十年前的凋零利刃與巴比倫行動,明確提出“震網”的災難性里程碑意義,在於其證明了網絡攻擊能達成傳統作戰行動的局部等效性。

表2‑1兩次針對主權國家核計劃所採用的軍事行動與準軍事行動的對比分析(2015)

凋謝利刃與巴比倫行動(傳統作戰行動)

震網行動(網絡戰行動)

發起攻擊者

以色列、伊朗、美國

美國、以色列

被攻擊目標

伊拉克核反應堆

伊朗鈾離心設施

時間週期

1977-1981年

2006-2010年

人員投入

以色列空軍、特工人員、伊朗空軍、美國空軍和情報機構

美、以情報和軍情領域的軟件和網絡專家,工業控制和核武器的專家

產出

多輪前期偵查和空襲,核反應堆情報

戰場預製、病毒的傳播和伊朗核設施情報

各方裝備投入

伊:2架F-4鬼怪式以12枚MK82減速炸彈-轟炸核反應堆假設工地;10架F-4襲擊伊拉克H-3空軍基地。

以:2架F-4E(S)-偵查任務;8架F-16A(美方提供)、4架F-15A、2架F-15B、16枚MK84炸彈-空襲反應堆

模擬搭建反應堆

特工人員暗殺伊拉克關鍵人員

美方:戰略衛星和情報、空中加油機

震網病毒

模擬搭建離心機和控制體系

效費比

打擊快速,準備期長,耗資巨大,消耗大,行動複雜,風險高

週期長,耗資相對軍事打擊低,但更加精準、隱蔽,不確定性後果更低

訓練成本

18個月模擬空襲訓練,2架F-4鬼怪攻擊墜毀,3名飛行員陣亡

跨越兩位總統任期,經歷了5年的持續開發和改進

消耗

人力、軍力、財力、裝備力、情報

人力、財力、情報

毀傷效果

反應堆被炸毀,嚇阻了法國供應商,伊拉克核武器計劃永久遲滯

導致1000台至2000台離心機癱瘓,鈾無法滿足武器要求,幾乎永久性遲滯了伊朗核武器計劃

在“震網”之後,全球網絡安全業界陸續發現了“毒曲”“火焰”“高斯”並發布報告,並陸續證明它們與“震網”的相關性。在面對“火焰”時,卡巴斯基指出,其攻擊是當時發現的最為複雜的攻擊之一,要對其完全分析清楚可能要耗費數年時間。我們意識到國際安全企業和從業者需要進行分工協同,我們嘗試開啟了一段馬拉松式的分析賽跑,嘗試完成更多的工作,對“火焰”主樣本進行了分析[4],並提取了子模塊清單,對其中重點模塊進行了分析。從目前的公開資料檢索看,在業內完成“火焰”的分析成果中,安天在模塊層面的分析貢獻佔比是最高的。

2-6.png

圖2‑6“火焰”病毒主模塊與子模塊啟動加載順序(2012.5)

我們對“毒曲”和“震網”的同源分析報告晚於國際廠商[5],這的確是一個事實。 “震網”“火焰”“毒曲”“高斯”系列存在同源關聯是當時參與這些樣本深度分析的各廠商的共同的猜測與判斷。卡巴斯基的工作最為敏捷和堅決,而我們則沒有把找到的相似點在第一時間沉澱為公開的分析成果,但如果比較這兩份同源分析,其實也可以看到:安天所提供的同源點大部分與卡巴斯基並不相同,將分析成果疊加起來可以為APT樣本體系間的同源性到代碼復用佔比分析提供更完整的線索和依據。

2-7.png

圖2‑7 安天公佈的震網、毒曲同源關鍵代碼基因對比(2012.5)

APT分析是一個社會協同過程,其中有大量的疑問是需要長時間的分析積累、關聯回溯才能解決的,“震網”就是一個例子。例如在非常長的時間內都沒有組織機構正式解答:作為高度定向的攻擊所使用的樣本,且大版本只有兩個,總模塊數只有數十個,但為什麼其樣本數量多達數千個,包括為什麼在技術驗證中,USB擺渡開關是默認關閉的,卻能形成一條從中東到東南亞並滲透到中國的感染擴散鏈。我們在《震网事件的九年再复盘与思考》 [3]對上述問題進行了分析解答,儘管這個解答遲來了九年,但這是中國網絡安全工程師的獨創內容。相比之下,急功近利的組織機構和研究者很難取得深度和系統的成果。

同樣的,我們以軟件工程的視角,梳理“震網”“火焰”“高斯”“毒曲”之間的代碼復用關係,並輸出了一個完整的圖譜:2-8.png

圖2‑8 安天發布Stuxnet和Duqu、Flame、Fanny、Flowershop關係圖(2019.9)

既與時間賽跑,又在時間面前保持定力;既尊重他人的分析成果,又有自己的獨創貢獻,這就是中國網絡安全工作者在這場接力中扮演的角色。

3.破解斯芬克斯之謎A2PT組織攻擊裝備的重要特點是惡意代碼和漏洞利用工具攻擊武器幾乎覆蓋所有平台與場景。把這個全貌完整繪製出來,成為全球優秀的網絡安全研究機構攜手共同努力才能破解的斯芬克斯之謎。

在2013年之後,針對“方程式組織”(NSA下屬的TAO團隊)的分析協同就是一次集體解謎歷險。 “方程式組織”的新攻擊活動與此前“震網”“火焰”系列攻擊至關重要的差異是,“震網”是面向隔離網絡的攻擊作業,所以Payload必須包含所有的功能模塊組件,這就便於完整的關聯分析。

而新的攻擊波次主要是依托互聯網側的高度模塊化,針對場景按需投放。由於各國的IT基礎環境、各安全企業服務的客戶場景都有很大不同,任何一家網絡安全廠商都不可能在短時內完整捕獲其各平台樣本和各種功能模塊。如果說我們看到“震網”“火焰”“毒曲”“高斯”是依靠同源線索關聯所形成的分析接力的研究,那麼對“方程式組織”的分析實際上就是依靠自身的感知捕獲能力,逐個解開其在各個平台上的免殺,直到最終完整解開它全平台覆蓋能力。每一個平台捕獲、分析、拼接到最終曝光,都走過了很長的過程。其中我們將iOS樣本的曝光,與我們正式捕獲完成分析的時間,已經相隔了8年。我們依靠自身的捕獲能力,先後捕獲了其Windows、Solaris、Linux、iOS平台的攻擊樣本,破解了樣本加密機制。和國際產業界協同完成了其全操作系統平台覆蓋能力的分析,並最終使其完整曝光。

3-1.png

圖3‑1全球網絡安全廠商披露的方程式組織平台覆蓋能力

2015年初,卡巴斯基率先開始公佈了方程式組織對硬盤固件的攻擊能力,安天跟進公佈了分析報告[6],針對攻擊組件結構、通信指令代碼和控制結構提供了有價值的成果。

3-2.png

圖3‑2 安天公佈的捕獲的C2和通信密鑰(2015.3)

安天該報告中還對硬盤固件寫入模塊進行了分析和過程研究,並在當時對可能被持久化主機硬盤進行了固件提取比對分析。

3-3.png

圖3‑3 安天分析硬盤固件升級流程(2015.3)

我們在2013年對“方程式”組織的捕獲分析中,就監測發現大量回連攻擊者C2的機器,確定國內存在被攻擊目標。

3-4.png

圖3‑4國內回連方程式組織C2監測流量

2015年5月,安天發布報告,公開了“方程式”組織內置的數據加密和網絡通信加密算法,公佈了解密密鑰和解密算法[7]。

3-5.png

圖3‑5方程式組織通信加解密算法分析(2015.4)

2016年,安天的報告首度曝光了“方程式”組織針對Linux系統和SPARC架構的Solaris系統的攻擊樣本[8],分析了樣本的主要功能、通信模式和指令特點。與卡巴斯基等廠商報告疊加,構成了A2PT攻擊組織的全平台惡意代碼能力圖譜。

3-6.png

圖3‑6方程式攻擊組織多平台操作系統覆蓋能力(2016.11)

2023年,安天曝光了“方程式”組織針對iOS的樣本[9],報告與卡巴斯基報告“三角測量行動”互動,分別曝光了美方通過“量子”系統劫持投放和基於手機iMessage服務漏洞投放攻擊iOS手機的攻擊方式。安天在報告中還發布了“量子”系統的攻擊能力圖譜和美方支撐攻擊系統運行的關係圖譜。

3-7.png

圖3‑7 “量子”系統可攻擊場景圖譜化分析(2023.6)

顯然,SentinelOne報告的編寫者可能沒有認真閱讀過中國企業發布的任何一篇APT分析報告,其研究習慣是:依托各安全機構報告的發佈時間來進行關聯推理,他們並未意識到(或者不願意正視)在每一次的連鎖接力中,中國網絡安全廠商與其他國家同行所發布的是不同的成果;而且顯然,他們缺乏深入分析APT事件的經驗和形成重量級分析報告的能力,從而意識不到中國廠商能夠在其他國際同行發布分析成果後迅速跟進、發布具有相關性的成果,其實是由於這些報告的主體部分早已形成,只是在等待發布的時機。我們篤定:對於2023年6月1日卡巴斯基所發布的“三角測量”行動報告和安天在6月9日所發布的“量子系統擊穿蘋果手機”報告,他們沒有讀懂。

因為很顯然,除了目標都是iOS之外,卡巴斯基和安天講述的是兩組完全不同的攻擊活動。卡巴斯基所曝光的攻擊是基於iMessage投放的,而安天曝光的攻擊是基於“量子”系統通過流量劫持投放的。在2023年6月1日發布報告時,卡巴斯基還沒有展開樣本分析,進行的是攻擊流量和行為分析(卡巴斯基真正的樣本分析成果發佈於2023年12月),而安天曝光的是一個早期捕獲的iOS樣本的儲備報告。這是兩組獨立的分析成果,我們只是為國際同行打了一個助攻而已。

4.攔截失控的分身帶給全球網絡安全工作者巨大壓力和乾擾的,並不只是A2PT攻擊本身。如果從事件的數量、攻擊的範圍這種統計學指標來看,美方對網絡軍備擴散的縱容和網絡軍火管理失控導致的網絡黑產與犯罪給全球帶來了更大的麻煩。

2015年,我們發現一例針對中國某機構的APT攻擊事件[10]。從最開始捕獲的加密數據包,到後來發現其利用註冊表數據塊完成的持久化,我們都以為這是一起A2PT組織發起的攻擊,但直到將其導入到安天賽博超腦平台進行同源性比對後才發現:這是由美國企業發布的自動化攻擊測試平台Cobalt Strike生成的攻擊載荷,被利用來對我們發動攻擊。

4-1.png

圖4‑1樣本模塊與Beacon生成模塊的對比分析圖(2015.5)

4-2.png

圖4‑2對Cobalt Strike創始人軍事背景的分析(2015.5)

安天在報告中指出“網絡空間已經存在嚴峻的網絡軍備擴散風險,超級大國能否合理控制自身網絡軍備發展的速度和規模,並對因自身未有效履行責任而使網絡領域發生可能的軍備擴散,進行有效的干預和控制,是我們能否達成一個更安全的網絡世界的關鍵因素。”

結果一語成讖。時隔兩年,美方便帶給全球一次更大的麻煩,因美方的影子經紀人洩露事件導致使用“永恆之藍”漏洞的WannaCry蠕蟲事件,該蠕蟲僅利用美國NSA“網絡軍火”中的“永恆之藍”(Eternalblue)漏洞,就製造了一場遍及全球的巨大網絡災難。

儘管我們在2016年的網絡安全威脅年報[11]中,對勒索病毒有可能和蠕蟲合流的趨勢做了預判,但我們並沒有想到幾個月後就以如此迅猛的方式表現。儘管如此,在針對WannaCry的溯源判斷上,我們還是堅持了中國網絡安全工作者的客觀和嚴謹。雖然其使用的高級漏洞利用工具毫無疑問的來自美方的武器洩露,我們依然依靠WannaCry的歷史樣本同源等多組線索,向中國網絡安全應急組織給出了我們對於WannaCry的來源判斷,以及其並非由美方開發的結論。但這一結論並不意味著,包括中國用戶在內的WannaCry受害者不需要追究美方網絡軍備失控的責任,包

01.png

“Rug Pull”是一種常見的加密騙局,往往發生於DeFi領域。 DeFi,即“去中心化金融(Decentralized Finance)”,也被稱為“開放式金融”,是以比特幣和以太幣為代表的加密貨幣,區塊鍊和智能合約結合的產物。 DeFi有兩大支柱,一是以比特幣和以太幣為代表的穩定幣,二是實現交易、借貸和投資的智能合約。

Rug Pull騙局通常是指加密行業項目方突然放棄某一個項目或撤出流動性池子,捲走用戶投資資金的詐騙行為,通俗的講就是捲款跑路。

詐騙者在“Rug Pull”之前,會先創建一個加密項目,通過各種營銷手段吸引加密用戶投資,並在合適的時機突然捲走用戶投資的資金,拋售加密資產,投資該項目的用戶也將蒙受巨大損失。

Rug Pull事件回顧FairWin (2019):FairWin 是在以太坊區塊鏈上運作的龐氏騙局,它承諾通過名為FairWin 智能合約的去中心化應用程序(dApp)獲得高回報。然而,該項目的開發商最終捲走了投資者的資金,造成估計數百萬美元的損失。

PlusToken(2019):PlusToken 是一種影響全球的加密貨幣龐氏騙局。它聲稱可以提供高收益的投資回報,並吸引了大量參與者。然而,在2019 年中期,該計劃的運營商消失了,帶走了估計價值20 億美元的加密貨幣。

YAM Finance(2020):YAM Finance 是一個建立在以太坊區塊鏈上的DeFi 項目。它旨在創建一個去中心化的穩定幣和流動性挖礦平台。然而,啟動後不久,就發現了一個編碼缺陷,導致該項目無法持續。 YAM代幣價值暴跌至零,導致投資者遭受重大損失。

Meerkat Finance(2021):Meerkat Finance 是幣安智能鏈(BSC)上的去中心化流動性挖礦項目。它聲稱通過其金庫提供高回報。然而,項目啟動後48小時內,開發商就耗盡了該項目的資金,造成約3100萬美元的損失。

最近,又有攻擊者利用Rug Pull計劃成功竊取了近100萬美元。我們將在本文深入研究這個精心設計的加密騙局的細節,並了解它是如何詐騙的?

Check Point最近識別出了以下地址0x6b140e79db4d9bbd80e5b688f42d1fcf8ef97798涉及Rug Pull活動,威脅識別系統已經開始監控與錢包地址相關的活動:

1.png

這是詐騙錢包的餘額,這個地址操作了40個不同的Rug,已經被盜了近100萬美元。

2.png

詐騙(0x6b140e79db4d9bbd80e5b688f42d1fcf8ef97798)的策略是根據最新的炒作來創建代幣,以引誘受害者購買他的代幣,例如,代幣名稱GROK 2.0 (0xd4b726c5b5e6f63d16a2050ee3ac4a0f0f81f1d4),可能來源於一個知名的人工智能係統(X GROK),旨在吸引買家。幾週前,受埃隆马云惹不起马云馬斯克AI 項目啟發的原始Grok 代幣的推動,根據DEXTools 的數據,交易量超過600,000 美元。

這個精心設計的騙局是如何運作的,它是如何成功捲走大批量錢的?下面是詳細分析。

創建假令牌:騙局始於創建欺騙性令牌,以令牌GROK 2.0為例,名字的選擇通常反映了熱門話題,以吸引毫無戒心的買家。

向流動性池中添加資金:為了製造合法性假象,詐騙向代幣池中註入資金,創造了一個充滿活力和活躍的代幣的假象。

精心策劃的交易活動:利用合約中的專門功能(0x521da65d),詐騙者執行模擬交易,使其看起來好像真正的買賣正在發生。然而,這只是詐騙精心策劃的一個詭計。

增加交易量:另一個功能(0xf029e7cf)開始發揮作用,促進了WETH加密貨幣和GROK令牌之間的大規模交易。這種人為的通貨膨脹創造了一種高需求和高價值的感覺,吸引投資者加入。

吸引買家:利用代幣的吸引力,用戶開始購買,沒有意識到即將發生的欺騙。

卷錢:一旦代幣充分吸引了投資者,詐騙就會執行最後一步——從代幣池中撤出流動性,讓代幣購買者空手而歸。

5.png

技術分析詐騙者使用兩種不同的智能合約進行交易並增加代幣數量。他使用的第一個合約地址是0x2ef3216e95e2b7c8e378ae64534100e69598f955,其中包含模擬交易功能(0x521da65d)。

函數0 x521da65d函數0x521da65d負責為詐騙出售和購買令牌,這個函數已經為這個令牌執行了226次。函數的行為取決於布爾值varg7,它決定了函數的運行路線,導致了兩個獨立的執行路線。

4.png

第一條路線(0x306b)是從WETH加密貨幣交換到GROK 2.0(購買),如下圖所示:

5.png

第二條路由(0x2bac)表示從GROK 2.0到WETH(銷售)的交換。

6.png

對於第二個智能合約,詐騙者使用地址0x4b2a0290e41623fbfeb5f6a0ea52dc261b65e29b進行操作,在那裡他執行函數0xf029e7cf來人為地提高令牌的數量。

函數0 xf029e7cf這個函數接收五個參數:

7.png

解碼發送給此函數的以下數據,揭示以下參數:

8.png

Varg0是Uniswap路由器地址,詐騙將使用它來交換令牌。

Varg1是WETH加密貨幣地址,將用於與GROK令牌進行交換。

Varg2是GROK 2.0令牌地址。

Varg3是要交換的令牌的數量。

Varg4是交換這個令牌的次數。

9.png

深入研究該函數,我們發現詐騙者使用了來自Uniswap Router (varg0)的“swapExcatToekensSupportingFeeOnTransferTokens”函數,從WETH(varg1)到GROK(varg2)以及從GROK到WETH交換了9次(varg4),總金額為420,000美元,這增加了令牌的數量並吸引交易者和機器人購買它。

swap循環可以在下面的截圖中看到:

1.png

在騙局的最後階段,詐騙在吸引了足夠數量的買家和令牌價格上漲後,從令牌的流動性池中提取了資金。事實證明,他們有81次從他們的欺騙性代幣中去除流動性。

11.png

總結隨著加密領域的不斷發展,保持警惕和了解情況對投資者來說至關重要。最近的Rug Pull事件提醒我們,有必要提高安全意識。通過了解詐騙所採用的策略,我們可以共同努力創造一個更安全、更可靠的加密環境。

如何避免Rug Pull事件的發生:1.在投入資金之前認真研究任何分析投資機會。了解團隊成員、他們的背景以及他們之前的項目。投資者應該對未公開信息的項目抱有質疑態度,要通過項目官網、社交媒體賬戶、社區熱度質量以及白皮書等信息。

2.評估項目團隊的可信度和合法性。尋找與該項目相關的開發人員的信息和知名度。

3.評估項目的社區參與度。團隊積極、透明的溝通至關重要,如果缺乏參與或團隊迴避回答重要問題,請務必謹慎。

4.正規且高質量的項目都會由信譽良好的第三方機構進行代碼審計,外部審計對於去中心化的加密項目格外重要,如果一個項目始終沒有進行代碼外部審計,這個項目就有很多潛在性的風險。投資者應該多方驗證項目外部審計結果,並只認可權威第三方出具的代碼審計報告,代碼中沒有發現任何惡意的項目才值得考慮投資與否。

5.驗證項目的流動性是否鎖定,流動性鎖定減少了撤資的可能性。識別大部分“Rug Pull”騙局最簡單也十分有效的方式是檢查流動性池是否被鎖定,流動性池鎖定的項目安全性較高,有權威第三方參與的鎖定流動性池的項目安全性更高,而流動性池未鎖定的項目極為危險,因為項目方可以輕而易舉地竊取流動性池子裡的所有加密貨幣。

投資者還應檢查流動性池被鎖定的比例,鎖定的比例和項目安全性成正比,一般而言,鎖定的比例應該在80%到100%之間,此外,鎖定的時間也是很重要的指標,流動性池應當受基於時間函數的限制,這意味著沒有人可以在時間限制範圍內移動池子裡的加密貨幣。

6.不要把所有雞蛋放在一個籃子裡。將投資分散到多個項目和資產類別。

7.賣盤控制。賣盤控制是通過惡意代碼實現的,這種方式較為隱秘,投資者可以通過小額購買代幣然後出售的方式來進行測試,如果無法出售,該項目就可判定為騙局。

8.異常暴漲。一個新的項目代幣在沒有重大利好情況下,突然異動暴漲,往往就是利用散戶普遍的“追漲殺跌”心態吸引散戶入局,而代幣價格拉高之後就是大量拋售,也就是常說的“割韭菜”。

投資者可以通過區塊瀏覽器來檢查代幣持有者的數量,數量過少的代幣價格容易被操縱,騙局的可能性極大。

9.可疑的高收益。 “Rug Pull”騙局很多時候就是龐氏騙局,這類騙局就是通過極具誘人的高收益來誘騙投資者,進而欺詐投資者投入的本金,也可以說,收益越高,風險就越大,投資者應該始終保持清醒的頭腦,進而做出明智的判斷。

01.jpg

在微軟最近的一篇文章中,他們介紹了最新的安全保護策略以保護用戶免受NOBELIUM活動的影響,該活動針對的是技術服務提供商。

早在5 月,微軟就認定有俄羅斯背景的NOBELIUM 黑客組織要對持續數月的SolarWinds 網絡攻擊事件負責,並同企業、政府和執法機構達成了合作,以遏制此類網絡攻擊的負面影響。早些時候,微軟更進一步地剖析了NOBELIUM 使用的一套更加複雜的惡意軟件傳送方法。可知其用於造成破壞,並獲得“HTML Smuggling”系統的訪問權。微軟表示,HTML Smuggling 是一種利用合法HTML5 和JavaScript 功能、以高度規避安全系統檢測的惡意軟件傳送技術。近年來,這項技術已被越來越多地用於部署網銀惡意軟件、遠程訪問木馬(RAT)、以及其它有針對性的釣魚郵件活動。

Microsoft 365 和Microsoft Azure 中存在多種類型的信任鏈,包括委派管理權限(DAP)、Azure 代表管理員(AOBO)、Microsoft Azure Active Directory (Azure AD) 企業對企業(B2B) 、多租戶Azure AD 應用程序以及客戶用戶。其中許多信任鏈可以授予對Azure 資源和Microsoft 365 的高級訪問權限,這需要密切監視。

委託管理特權DAP是一種方法,通過它,服務提供商可以管理Microsoft 365環境,而不需要維護本地身份。 DAP 對服務提供商和最終客戶都有好處,因為它允許服務提供商使用他們自己的身份和安全策略管理下游租戶。

使用DAP的服務提供商可以在Microsoft 365管理中心通過導航到“設置”,然後到“合作夥伴關係”來識別。在合作夥伴關係中,你可以查看與租戶建立計費關係的所有服務提供商的列表,以及服務提供商是否分配了任何角色。

1.png

將DAP 識別為下游客戶

雖然終端客戶無法看到服務提供商租戶中所有可以對最終客戶租戶進行管理更改的用戶的列表,但他們可以通過查看Azure Active Directory 登錄日誌來查看服務提供商的登錄並過濾服務提供商的跨租戶訪問類型。可以通過單擊“下載”導出結果,並利用這些結果進一步針對Azure 和Microsoft 365 進行分類。

2.jpg

服務提供商的登錄

AzureAOBOAzure AOBO在本質上類似於DAP,儘管訪問的範圍僅限於針對個人Azure訂閱和資源的Azure資源管理器(ARM)角色分配,以及Azure Key Vault訪問策略。 Azure AOBO帶來了與DAP類似的管理效益。

要全面評估你訂閱中的AOBO權限,請確保已授予全局管理員訪問權限,後者將評估服務提供商對每個租戶中的所有訂閱的訪問權限。

Azure AOBO訪問是在創建訂閱時添加的,可以在給定Azure訂閱的訪問控制(IAM)中看到。

3.png

如果你有多個訂閱,請考慮運行以下命令來識別服務提供商可能訪問資源的訂閱:

Get-AzSubscription|%{Set-AzContext-Subscription$_;Get-AzRoleAssignment-Scope'/subscriptions/$($_.Id)'|Where-Object{$_.DisplayName-like'ForeignPrincipalfor*inRole'TenantAdmins'(*)'}|SelectDisplayName,Scope|Format-Table}也可以授予csp直接訪問Key Vault的權限。下面的PowerShell命令可以用來識別允許通過AOBO訪問的訪問策略Key vault:

Get-AzKeyVault|%{$vault=Get-AzKeyVault-VaultName$_.VaultName;if($vault.AccessPolicies|Where-Object{$_.DisplayName-like'ForeignPrincipalfor'*'inrole'TenantAdmins'(*)'}){$vault|selectVaultName,ResourceId|Format-Table}}除了上述命令之外,Azure Red Team工具Stormspotter也可以用於大型環境。

從前面的步驟中收集的信息將用於在分類期間進行日誌審查。

Azure AD B2BAzure AD B2B帳戶(客戶)可用於管理Azure和Microsoft 365資源。這種管理訪問方法利用了另一個租戶中的個人現有身份,由於對身份控制的限制,Microsoft通常不推薦這種方法。調查人員應注意授予客戶訪問Microsoft 365 中資源的多種方式,其中可能包括Exchange Online 角色和SharePoint Online 角色。

Azure訂閱為了全面評估你的訂閱中的B2B權限,請確保你已授予用戶訪問權限,這些用戶將根據以下指導評估服務提供商對每個租戶中所有訂閱的訪問:提升訪問權限以管理所有Azure 訂閱和管理組。

授予Azure 角色的Azure AD B2B 身份顯示在Azure 門戶的訪問控制邊欄選項卡中。

7.png

在訂閱中具有所有者角色的客戶用戶

可以使用以下命令系統地識別Azure AD B2B 身份,該命令將生成可用於定位初始分類的身份和資源列表。

Get-AzSubscription|%{Set-AzContext-Subscription$_;Get-AzRoleAssignment-Scope'/subscriptions/$($_.Id)'|Where-Object{$_.SignInName-like'*#EXT#@*'}|SelectDisplayName,SignInName,Scope|Format-Table}.Microsoft 365 (Azure AD)可以在Azure AD 特權身份管理邊欄選項卡的分配邊欄選項卡中查看已在Azure AD 中授予角色的Azure AD B2B 身份。過濾“#EXT#”將允許你查看分配給管理角色的所有訪客用戶。

9.png

過濾客戶用戶

下面的PowerShell還可以用於識別具有管理角色的客戶帳戶。這些身份信息將用於幫助目標分類。

Get-AzureADDirectoryRole|Get-AzureADDirectoryRoleMember|Where-Object{$_.UserPrincipalName-like'*#EXT#@*'}.調查信任鏈在Microsoft 365和Microsoft Azure中,通過信任鏈的活動可以看到多個活動,包括Azure AD審計日誌、Azure activity日誌、Intune審計日誌和統一審計日誌。使用在“識別”階段收集的數據,可以執行有針對性的日誌檢查,以識別信任鏈濫用。應審查每個日誌的來自信任鏈的活動,特別是重點關注促進持久性、數據收集和偵察的活動。

11.png

Azure AD攻擊者通常會使用各種方法來建立持久性,這些方法包括創建新的服務主體、向現有應用程序註冊中添加新的秘密、服務主體、創建新的特權用戶以及接管現有的特權帳戶。你可以通過查看Azure AD 審核日誌並篩選在“識別”階段識別為最近登錄的用戶,來識別通過信任鏈對Azure AD 所做的修改,比如:

密碼重置;

修改服務主體;

將用戶添加到特權角色;

對多因素身份驗證(MFA)的更改;

創建新用戶;

統一審計日誌統一審核日誌可用於識別通過SharePoint Online、Exchange Online、Azure AD 和其他Microsoft 365 產品中的信任鏈執行的活動。

統一審核日誌從Azure AD 和Office 365 中提取數據並將這些數據保留至少90 天,使其成為非常有價值的集中信息來源,如果應用E5 許可證,此數據將保留1 年,使用高級審計的最長可配置保留期為10 年。

Search-UnifiedAuditLog cmdlet 可用於搜索在“識別”階段識別的用戶執行的操作。或者,可以使用Microsoft 365 Defender 門戶中的GUI 搜索日誌。

Azure活動攻擊者對Azure資源的訪問使他們能夠竊取數據並橫向移動到連接到目標Azure環境的其他環境。有權訪問訂閱的攻擊者可以部署新資源、通過虛擬機擴展訪問現有資源,或者直接從Azure 訂閱中竊取數據和密鑰。對Azure資源的訪問和操作可以通過檢查每個訂閱中存在的Azure Activity日誌進行審計。

微軟終端管理器

攻擊者可能通過各種信任鏈訪問Microsoft終端管理器,由於Microsoft終端管理器管理設備的配置,因此它是另一個需要查看的重要審核日誌。可以在微軟終端管理器門戶的租戶管理邊欄選項卡下訪問微軟終端管理器審核日誌。在審計日誌中,啟動器“Partner”可用於過濾由Partner發起的操作。在“身份識別”階段被識別為具有特權的客戶用戶所採取的操作將需要通過用戶主體名稱進行搜索。應該檢查這些日誌事件,以確保沒有通過識別的信任鏈發生惡意活動。

12.png

緩解措施如果在調查過程中發現並確認惡意活動或發現不需要的和過度放任的信任鏈,則應採取果斷措施阻止或最小化訪問。根據信任鏈的類型,可能需要採取不同的步驟來阻止訪問。在任何正在進行的調查結束之前,不建議完全刪除工件;刪除某些工件可能會延遲或增加完成調查的難度。客戶應該與他們的服務提供商交流以了解他們有哪些保護措施,並且在發生潛在惡意活動時,通知他們的服務提供商以獲得他們在活動驗證方面的幫助。

委託管理權限如果服務提供商對租戶的日常活動管理不需要DAP,則應該刪除它。在某些情況下,需要權限以方便服務提供商的管理。在這些情況下,微軟將引入細粒度的委派管理員權限(GDAP),這將允許合作夥伴控制對其客戶工作負載的更細粒度和有時間限制的訪問。

微軟建議服務提供商利用客戶租戶中的命名帳戶來降低風險。如果存在來自服務提供商關係的攻擊證據,建議至少在調查結束之前從關係中刪除被委派的管理員權限。

要刪除委託的管理員權限,請在Microsoft 365管理中心導航到“設置”,然後到“合作夥伴關係”。在夥伴關係中,點擊該關係,然後在詳細信息選項中選擇“刪除角色”。採取此操作將阻止服務提供商以全局管理員或幫助台管理員的身份訪問租戶。刪除此訪問權限不會更改或更改當前通過服務提供商購買的計費關係或許可證。

AzureAOBO如果Azure 訂閱的有效日常管理不需要Azure AOBO 訪問權限,則應刪除它。如果服務提供商需要訪問Azure 訂閱,則應該通過添加具有適當角色和權限的外部主體來應用最小權限。如果有證據表明來自服務提供商的攻擊,那麼應該從每個Azure訂閱中刪除外部主體。

可以利用Azure 策略監控通過AOBO 授予的權限。你可以在Tenant Root Group部署Azure 策略,如果將外部主體的權限分配給Azure中的資源,則該策略將引發不合規。雖然Azure 策略不能阻止使用外國主體創建訂閱,但它簡化了關於訂閱存在的報告,並允許在需要時自動刪除或阻止創建。

可以通過導航到受影響訂閱上的訪問控制(IAM) 邊欄選項卡,為服務提供商選擇外部主體,然後刪除Azure AOBO 權限

13.jpg

刪除外部主體的Azure AOBO 權限

安全檢測日誌記錄的集中可用性對於響應和調查潛在事件至關重要,並且是此類DART 調查的首要障礙。如果組織正在監控其云環境的特權訪問和管理更改,則應該可以發現並警告涉及授權管理特權濫用的惡意活動。

應將雲活動日誌提取到安全信息和事件管理器(SIEM) 中並保留以供分析。包括:

Office 365 統一審核日誌;

Azure AD 管理員審核日誌和登錄日誌;

Microsoft終端管理器審計日誌。

可以利用Azure活動日誌和特定的數據平面日誌(如Azure Key Vault和Storage Azure 策略)來強制執行一致的日誌標準。

作為事件響應者,當有數量和質量都豐富的可用數據時,DART 最有效。一種感興趣的日誌類型是登錄日誌;身份事件可以告訴我們很多關於攻擊活動的信息。通常可以在這些日誌中識別模式,這些模式可以像IP 地址匹配一樣簡單,也可以像UserAgent 字符串、時間和應用程序ID 匹配一樣複雜。

話雖如此,最關鍵的日誌記錄是管理活動的日誌記錄。管理帳戶的任何使用或執行的操作都非常重要,應受到監控,在企業環境中,大多數更改通常是在批准的更改窗口期間進行的,應評估此範圍之外的更改的有效性和完整性。

日誌本身是很有用的,但對於及時顯示不尋常或惡意活動,警報是至關重要的。 Microsoft 365 Defender 門戶有一些有用的內置警報來識別可疑活動。比如:

提升Exchange管理權限;

啟動或導出eDiscovery搜索;

創建轉發或重定向規則;

還可以創建自定義警報以提醒其他類型的活動,另一個比較好用的警報工具是Microsoft Defender for Cloud Apps(以前稱為Microsoft Cloud App Security)。此工具可以從Azure AD、Office 365、Azure、Defender for Endpoint、Defender for Identity 以及許多第三方服務中提取數據。策略引擎可用於基於內置模板或自定義定義創建警報策略。以下是一些模板化策略的例子:

來自非公司IP地址的管理活動;

可疑的管理活動;

向OAuth應用程序添加可疑憑證;

可疑的OAuth應用程序文件下載活動;

多個虛擬機創建活動;

微軟安全建議微軟建議客戶定期與服務提供商進行交流,以了解為訪問其租戶設置的安全控制。應該密切監視服務提供商對資源的訪問,如果一段時間未使用,則應按照嚴格的最低權限流程進行刪除。

保護管理訪問的一些具體方法包括使用即時管理解決方案,例如特權身份管理,包括定期審查管理員以確保仍然需要他們的訪問。 MFA 也很關鍵,不僅是啟用MFA,還要確保所有管理員都註冊了MFA 方法。

引子上個月,一位企業客戶報告說,他們使用的第三方瀏覽器擴展無法正常工作。對該擴展的調查表明,該瀏覽器擴展依賴於一個在瀏覽器沙箱之外運行的NativeMessaging Host(NMH)組件。在審查客戶提供的進程監控日誌時,我們發現,Native Host可執行程序在啟動數十分鐘後就意外退出。並且,在這次意外退出後,下一次瀏覽器內擴展試圖調用它時,瀏覽器到本地的調用就會失敗,從而導致瀏覽器擴展無法提供其預期功能。

不幸的是,我既沒有NMH可執行文件的源代碼(甚至沒有二進製文件),在進程監控器日誌中也沒有找到明顯的線索(例如,註冊表讀取或寫入失敗),所以,我們很難搞清楚問題到底出在哪裡。我對支持工程師說,要是能看到瀏覽器擴展和NMH之間交換的JSON信息,也許就能幫我們找到問題的根源所在。

'我們需要像Fiddler這樣的工具來監視NMH信息,而不是HTTPS信息。 '

這有什麼難的?從技術上講,我並不熟悉與瀏覽器擴展有關的東西,所以,在排除了我能想到的幾個可能的根源問題後,我就忙其他的事情去了。

但這一構想一直縈繞在我的腦海裡:像Fiddler一樣的工具,但用於檢查本地信息傳遞。

建立這個系統有多難?會有多大用處?

自從2015年底“拋棄”Fiddler和Telerik後,我就沒寫過多少C#代碼;偶爾寫一點,大多也是Fiddler的插件,而不是獨立的應用程序。不過,Native Messaging遠沒有HTTPS那麼複雜,所以應該不會太難,對吧?

我們希望在調試器中實現以下功能:

顯示從瀏覽器擴展到Native Host的信息

允許將這些信息記錄到一個文件中

允許在任何方向上註入任意的消息

(擴展目標)允許修改這些消息

在接下來的幾個晚上,我打開塵封多年的Visual Studio IDE,努力回憶C#異步編程的工作方式。

關於NativeMessaging MeddlerNativeMessaging Meddler的源代碼和編譯版本都可以從GitHub下載。

NativeMessaging Meddler(NMM)是一個基於.NET 4.8的Windows應用程序。它的底部提供了一行選項卡,以便於我們在不同的選項卡之間進行切換;在默認情況下,直接運行.exe程序的話,它僅顯示幫助文本:

1.png

NMM工具可以響應來自瀏覽器擴展本身的NativeMessages,也可以代理現有擴展和現有NMH可執行文件之間的消息。

安裝Demo擴展要測試該工具的基本功能,您可以安裝Demo Extension:

在Chrome或Edge中訪問about://extensions

啟用開發者模式

按下Load Unpacked按鈕

選擇sample-ext文件夾

一個新的'N '圖標將出現在工具欄上

安裝完演示擴展後,還必須註冊演示的Native Host應用。為此,請更新其清單,以反映您放置它的位置。

使用記事本或類似編輯器打開manifest.json文件

將path字段設置為.exe的完整路徑。確保反斜杠都是成對使用的。

將allowed_origins字段設為來自about:extensions頁面中的擴展的ID值。

1.png

接下來,更新註冊表,以便瀏覽器能夠找到您的主機:

在記事本中編輯installregkeys.reg文件,更新文件路徑以指向manifest.json文件的位置。確保反斜杠都是成對使用的。

雙擊InstallRegKeys.reg文件將其導入註冊表。

運行演示擴展安裝好了主機和擴展後,現在就可以測試該工具了。從工具欄中的擴展點擊“N”圖標,導航到它的演示頁面。這時,NMM的實例應自動打開。

在Outgoing Messages框中鍵入“Hello World!”,單擊Post Message to port按鈕。這時,該消息應該出現在NMM應用程序內的Monitor選項卡上:

1.png

如果你勾選右上方的“Reflect to extension”選項,然後再次發送消息,應該會看到NMM工具收到消息,並將其發回該擴展的頁面,並展示在“Incoming Messages”部分。

1.png

“Reflect to extension”將收到的信息複製給發送方

如果我們想通過NMM注入我們選擇的新信息,該怎麼辦?

進入NMM的Injector選項卡,在底部輸入框中輸入一個簡單的JSON信息。然後,點擊“Send to Browser/Extension”按鈕。這時,我們會看到該信息出現在瀏覽器內的“Incoming Messages”部分。

1.png

注意:你的信息必須是格式正確的JSON,否則它將永遠無法到達。

好了,我們現在已經能夠成功地使用NMM工具來接收和發送來自Demo擴展的消息了。

代理消息雖然我們的演示擴展很適合測試Native Messaging功能,而且如果我們正在開發一個使用Native Messaging功能的新擴展,它可能會對模擬有所幫助,但本文的重點是監視現有擴展與主機之間的通信。

好了,那就開幹吧。

首先,轉到Configure Hosts選項卡,該選項卡在註冊表中搜索您的PC上當前註冊的所有本機主機(Native Host):

1.png

我們的計劃是最終讓攔截本機主機成為一種點擊式體驗,但目前,我們只是使用該選項卡來查找我們要攔截的本機主機的文件系統位置。如果某個條目多次出現,請選擇優先級最低的實例。

例如,假設我們對Chrome瀏覽器中一些Windows-to-Web身份驗證場景中使用的BrowserCore主機感興趣。我們可以看到清單文件的位置,以及從清單文件中提取的EXE的名稱:

1.png

在某些情況下,您可能會發現Exe字段顯示“?”,如上面的vidyo條目那樣。這是因為,如果清單文件無法解析為合法的JSON,就會出現這種情況。 Chromium在寬鬆模式下使用定制的JSON解析器來解析清單,它允許JavaScript風格的註釋。但是NMM工具使用嚴格的JSON解析器,無法解析這些註釋。不過,這對我們的目的來說並不重要。

注意清單文件的位置,並在您選擇的編輯器中打開它。注意:如果該文件在特權位置,您可能需要以更高的權限來打開您的編輯器(以管理員身份)。

提示:您可以通過Alt+DblClick選擇一個項目,或者在選擇該項目時點擊Alt+Enter,以打開Windows資源管理器,找到清單的位置。

在清單中,通過在文件名末尾的.exe前引入.proxy一詞來改變路徑字段。

1.png

然後,請保存該文件。

注意:在某些情況下,即使是管理員也無法在默認情況下寫入該文件。在這種情況下,你需要使用管理員的權限來取得文件的所有權,以授予自己修改文件的權限。

1.png

當然,也還有其他不需要改變文件系統權限的方法,但我們在這裡就不做介紹了。

接下來,將nmf-view.exe文件複製到包含Native Host的文件夾中,並將其重命名為前面寫入清單的文件名。

1.png

現在,我們已經成功安裝了NMM代理。每當瀏覽器擴展下次試圖啟動Native Host時,它就會激活我們的NMM調試器,而NMM調試器又會生成原始的Native Host(在本例中是BrowserCore.exe),並代理兩者之間的所有信息。

現在,請訪問一個您可以登錄的網站,如https://office.microsoft.com。然後,點擊右上方的登錄按鈕,監視我們的調試器生成的Native Host,收集來自Windows 10 Accounts擴展的請求,將其傳遞給BrowserCore.exe,讀取Host的回复,並將其傳回擴展。我們的調試器允許我們從兩個方向讀取JSON消息的全文。

1.png

注意:這個截圖是經過編輯的,因為它包含秘密令牌。

幹的漂亮,是吧?

篡改消息當我完成所有這些工作時,我很興奮。同時,我也很失望……JSON的純文本渲染並不具有很好的可讀性,而且建立一個編輯消息的用戶界面工作量也很大。我感嘆……我在15年前就已經為Fiddler寫好了我想要的所有代碼。它同時具有JSON渲染和消息編輯功能……但是,現在我已經不再使用Fiddler,所以不能直接複製其源代碼了。

然後,我突然想明白了。我不需要在NMM中重新實現Fiddler的部分功能。我可以讓這些工具協同工作:NMM可以把它從瀏覽器擴展和Native Host收到的信息傳遞給Fiddler,如果Fiddler修改了信息,NMM就可以用修改後的信息來替代。

太棒了!

配置篡改過程首先,重新編輯manifest.json文件,在路徑中添加一個.fiddler組件,並將.proxy.exe文件重命名為.proxy.fiddler.exe,具體如下所示:

1.png

這段新的文字預示著你希望NMM開始使用Tamper using Fiddler選項設置。為了調試像BrowserCore.exe這樣的“single-shot”本地主機,我們不能直接使用NMM的監控選項卡右上方的複選框,因為調試器和本地主機生成和完成事務的速度比我們這些弱小的人類點擊鼠標的速度快得多。注意:您也可以指定字符串.log.以啟用將流量日誌寫到桌面上的選項。

現在,啟動Fiddler;可以使用-noattach命令行參數,這樣它就不會註冊為系統代理。在Web Sessions列表下的QuickExec框中輸入bpu ToApp並按回車鍵。

1.png

這將創建一個請求斷點,對所有包含ToApp字符串的請求都會觸發該斷點,NMM用它來記錄發送到原始Native Host的請求。

1.png

通過Fiddler的檢查器,我們可以使用JSON Treeview、TextView或SyntaxView檢查器來檢查消息的JSON。

1.png

如果我們對消息感到滿意,請點擊Run to Completion按鈕,這時,NMM應用程序就會把未經修改的原始消息發送到原始的Native Host。然而,如果我們想篡改消息,可以從下拉菜單中挑選一個成功響應,如200_SimpleHTML.dat:

1.png

這時,模板響應將出現在響應文本視圖中:

1.png

現在,請用您想要使用的文本覆蓋模板文本:

1.png

……然後按綠色“Run to Completion”按鈕。這時,Fiddler將修改後的文本返回給NMM代理,然後NMM代理將修改後的消息傳遞給原始Native Host:

1.png

就這裡來說,原始Native Host並不知道如何處理GetFiddledCookies請求,所以,它會返回一個錯誤,而該錯誤將傳回瀏覽器。

提示:如果您的目標是篡改從Native Host發送到擴展的消息,請在Fiddler的QuickExec框中輸入bpu ToExt。或者,您也可以使用Fiddler的其他篡改功能,比如讓它只攔截包含某些文本的消息,自動重寫某些消息,等等。

祝您閱讀愉快!

如何發現信標(一)

我們在上一篇文章介紹了對C2 框架執行威脅追踪的通用方法以及針對Cobalt Strike 的實際示例。接下來,我們將分析由Dark Vortex 開發的命令和控制框架Brute Ratel。其C2如下所示:

1.png

在過去的幾個月裡,該框架受到了密切關注,據稱最近被APT29 和勒索軟件組織BlackCat 濫用。因此,了解如何在基礎設施中普遍地檢測這個新興的C2對於防御者來說是有用的。

最初,所有分析都是在Brute Ratel v1.0.7上執行的,但是,我們進行了粗略的更新,討論了與v1.1 相關的發現,該發現是在我們最初的x33fcon 演示後不久發布的。 Brute Ratel 應該注意的一件事是,badger 的擴展性有限,主要從c2 通道的角度來看,除了v1.1 ,它增加了休眠混淆技術的擴展性。因此,它可以為工具創建非常具體的檢測。

Brute Ratel 的加載器Brute Ratel 的badger有多種形式,包括exe、DLL 和shellcode。當badger 被注入時,它的反射加載器將立即加載badger 所需的所有依賴項。由於badger 捆綁了大量的後利用功能,這導致在初始化時加載大量DLL:

2.png

如上所示,突出顯示的DLL 是注入badger 時加載的所有DLL。此列表包括winhttp.dll 和wininet.dll 的加載,它們不一定是惡意的,而是輸出信標的傳統加載。然而,還有一些不太常見的dll被加載,比如dbghelp.dll、credui.dll samcli.dll和logoncli.dll等。

這種行為允許我們為圖像加載創建一個簽名,並產生一個高信號指示器,可以通過圖像加載檢測來尋找。

例如,使用彈性查詢語言,我們可以搜索credui.dll、dbghelp.dll和winhttp.dll在一個進程中相互間隔60秒內發生的加載事件序列:

3.png

使用EQL 工具或Elastic 的雲,我們可以搜索我們的事件數據,例如從sysmon 日誌中提取的以下內容。請注意,我們明確排除了badger 可執行文件本身,因此我們只能識別注入的badger:

4.png

這將導致以下顯示檢測到被注入notepad.exe 的badger:

5.png

這個查詢特別強大,因為它允許我們在網絡中追溯尋找Brute Ratel badger的指標,而無需直接在終端上運行代碼。

內存中的Brute Ratel由於大多數信標仍然駐留在內存中,因此了解留下的足跡以尋找它們非常重要。查看1.0 版本的Brute Ratel 文檔,它詳細介紹了它自己的混淆和休眠實現:

6.png

這個查詢特別強大,因為它允許我們在網絡中追溯尋找Brute Ratel badger的指標,而無需直接在終端上運行代碼。

由於大多數信標仍然駐留在內存中,因此為了尋找它們,了解留下的足跡是很重要的。回顧一下Brute Ratel 1.0版本的文檔,它詳細介紹了它自己的混淆和休眠實現:

7.png

一旦badger進入休眠狀態,我們就可以使用Process Hacker 從進程中恢復字符串。有趣的是,當badger休眠時,我們可以看到如下字符串:

8.png

鑑於前面提到的在Brute Ratel 博客上描述的所謂的休眠和混淆策略,這最初是相當令人驚訝的。

深入挖掘後,我們可以發現一些有趣的設計決策,其中顯示在操作員UI 中的許多字符串都是從badger本身填充的。例如,我們可以在badger休眠時的內存中看到以下內容:

9.png

然後這些字符串返回到UI,如下所示:

10.png

深入研究badger,很快就發現只有.text 部分在休眠時被混淆,使得badger容易受到針對字符串和數據的各種簽名的影響。

為了說明這一點,反轉badger,我們可以將加載程序的入口點視為“bruteloader”:

11.png

在badger休眠時在內存中搜索這個字符串,我們可以在記事本進程中快速找到它:

12.png

這些字符串為內存掃描的Yara 規則提供了一個很好的基礎。例如,以下規則將在進程的內存中搜索bruteloader 或bhttp_x64.dll 字符串:

13.png

我們可以在badger休眠時針對我們的記事本進程測試這些以證明其有效性:

14.png

字符串不太可能存在於其他進程中,使用簡單的一行代碼就可以快速找到測試系統中所有被注入的badger:

15.png

使用Yara 規則,我們可以快速找到其他樣本,例如:

16.png

頁面權限通過對Brute Ratel混淆和睡眠策略的分析,可以觀察到badger在休眠期間對badger的頁面權限進行調整,以試圖逃避badger休眠時延長的可執行權限。

下面,我們可以看到badger 在sleep 0 上運行,badger 的頁面權限在未映射的頁面上為PAGE_EXECUTE_READ,這對於執行任務是必要的。

17.png

讓badger進入休眠狀態,我們可以看到混淆和休眠策略混淆了.text 部分並將badger的頁面權限重置為PAGE_READWRITE:

18.png

有趣的是,我們注意到在執行SMB 數據透視時不會復制此行為,即當兩個badger被關聯時。在這裡,我們可以看到我們的兩個badger相互關聯,並且都處於60 秒的休眠狀態:

19.png

對兩個badger 關聯時的頁面權限分析表明,無論休眠時間如何,兩者都保持PAGE_EXECUTE_READ:

20.png

結論是混淆和休眠策略僅適用於.text 部分。

出於對模糊處理和睡眠功能如何工作的好奇,我們開始對其進行逆向工程。通過windbg 中的sleep 例程,我們可以初步了解正在發生的事情,badger正在使用WaitForSingleObjectEx 在一系列異步過程調用(APC) 期間延遲執行,並利用間接系統調用來執行NtTestAlert 並在線程上強制發出警報:

21.png

深入了解IDA,我們可以更好地了解正在發生的事情。首先,它創建一個新線程,其起始地址被欺騙到TpReleaseCleanupGroupMembers+550 的固定位置:

22.png

然後為NtWaitForSingleObject、NtProtectVirtualMemory、SystemFunction032、NtGetContextThread 和SetThreadContext 的多個函數調用創建一系列上下文結構:

23.png

接下來,許多APC 排隊等待NtContinue,目的是使用它來代理對上述上下文結構的調用,這種技術是ROP的基本形式:

24.png

在對睡眠技術進行逆向工程後,我們很快意識到它與@ilove2pwn_的Foliage項目非常相似,只是硬編碼的線程起始地址不同。

儘管對badger進行了大量的調試和逆向工程,但我們無法揭示v1.0 博客文章中引用的“Windows 事件創建、等待對象和計時器”技術的任何實證,事實上,這些技術所需的API 似乎並沒有通過badger 的哈希導入來輸入。

Brute Ratel線程為了分析Brute Ratel 線程在內存中的外觀,我們將badger 注入到記事本的新副本中。隨即,我們可以看到休眠的badger使用的線程中有一些可疑的指標。

首先,我們注意到有一個看起來可疑的線程,其起始地址為0x0,並且在調用堆棧中有一個調用WaitForSingleObjectEx 的單獨的幀:

25.png

根據對線程調用堆棧的分析,我們可以推測該線程用於HTTP 通信,而badger現在正在休眠:

26.png

根據我們從對混淆和休眠策略進行逆向工程獲得的信息,我們注意到新線程是使用硬編碼的欺騙起始地址ntdll!TpReleaseCleanupGroupMembers+0x550 創建的:

27.png

我們無法找到任何作為起始地址自然發生的實例,因此導致了一個用於尋找Brute Ratel 線程的微不足道的指標。實際上,我們注入的記事本進程如下所示:

28.png

線程的調用堆棧也略有不規則,因為它不僅包含延遲執行的調用,而且第一幀指向ntdll.dll!NtTerminateJobObject+0x1f。深入了解為什麼使用NtNerminateJobObject 會突出顯示這只是NtTestAlert 的ROP 小工具,用於在線程上執行掛起的APC:

29.png

內存掛鉤在第一篇文章中,我們詳細介紹了兩種基於內存掛鉤檢測內存信標的潛在方法,通過查找已知補丁的簽名(例如ret to ntdll.dll!EtwEventWrite)並通過檢測寫入操作的副本。

將這些概念應用到Brute Ratel中,我們注意到,在操作員使用其開發後功能之前,badger不會應用任何內存掛鉤。一個例子是Sharpinline 命令,它在當前進程中運行一個.NET 程序集:

30.png

一旦組裝完成並且信標重新進入休眠狀態,我們可以通過附加調試器並反彙編ntdll.dll!EtwEventWrite 和amsi.dll!AmsiScanBuffer 的值來更好地了解發生了什麼:

31.png

如上所示,這些是禁用.NET ETW 數據和禁止AMSI 的簡單且持久的補丁。由於補丁是持久的,我們可以通過上述任何一種技術來檢測它們,因為我們不僅會因為EtwEventWrite 的第一條指令是ret 而收到高信號檢測,而且還會因為EtwEventWrite所在的頁面由於共享位的清除而被修改。

使用BeaconHunter,我們可以通過解析修改頁面上的導出信息,快速檢測出這些掛鉤,為惡意篡改提供了強有力的指示:

32.png

Brute Ratel C2 服務器遠離終端,作為防御者,我們也有興趣檢測命令和控制基礎設施,因為這可能有助於為我們提供足夠的智能來檢測基於網絡檢測的信標。

Brute Ratel的C2服務器是用golang開發的,默認情況下只允許操作員修改C2的默認登錄頁面。為了識別C2服務器,我們發現在向任何URI發送包含base64的POST請求時,都可能生成未處理的異常。例如,考慮下面base64 POST數據與明文數據的比較:

33.png

這很可能是因為base64 解碼POST 數據的預期輸入應符合C2 通信格式。一個簡單的Nuclei 規則可能會幫助我們掃描這種基礎設施:

34.png

除了與C2 的直接交互之外,還可以檢測C2 基礎設施,其中操作員沒有根據HTML 的哈希(http.html_hash=-1957161625) 手動重新定義默認登錄頁面。

使用一個簡單的Shodan查詢,我們可以快速找到暴露在互聯網上的實時基礎設施:

35.png

雖然只確定了大約40 個組織服務器,但根據地理分佈,我們可以更好地了解這些服務器的位置:

36.png

其中一些技術很可能已經為人所知,因為根據針對我們測試基礎設施的報告,防御者正在積極尋找這些C2 服務器:

37.png

蠻橫的Ratel 配置對Badger 的分析表明,Brute Ratel 在內存中維護了一個加密的配置結構,其中包括C2 終端的詳細信息。能夠從工件或正在運行的進程中提取這一點對防御者很有幫助。我們的分析表明,此配置保存在base64 和RC4 加密的blob 中,使用badger的工件中的固定密鑰“bYXJm/3#M?XyMBF”,而配置以明文形式存儲在內存中供休眠的badger使用。

我們開發了以下配置提取器,可用於

MDSec 提供了一個商業命令和控制框架,可以避免隱蔽的活動被檢測到,不過這已經不是什麼秘密了。考慮到這一點,我們一直在研發可以檢測到它們的方法。有些人會認為,建立一個難以捉摸的信標的最佳方法是,不僅要了解你的對手發現你的方式,還要嘗試找到他們將來可以檢測到你的新方法。

在這項研究中,我們將介紹一些尋找信標的有效策略,這些策略由我們為執行這些策略而開發的BeaconHunter 工具提供支持,並且我們打算在適當的時候將其開源。

信標檢測方法雖然有各種不同的方法來檢測在網絡中運行的信標,但我們將較少地關注特定的開發後功能的功能,而更多地關注識別駐留或加載到內存中的信標的一般方法。

行為信標在運行和加載時的行為可以為防御者帶來檢測機會。許多商業框架是封閉源代碼的,因此某些行為無法輕易更改,從而允許防御者創建與這些行為一致的簽名。

一個很好的例子是信標如何加載自身及其依賴項,讓我們看看與圖像加載相關的行為如何為防御者提供檢測機會。

為了讓信標提供豐富的利用後框架,它通常嚴重依賴操作系統原生的庫,允許開發人員通過避免靜態地綁定許多依賴項,使信標的大小盡可能小。

通過分析大量的信標框架,我們已經註意到,它們中的許多會在加載時加載核心信標所需的所有依賴項,而不是在使用時。在某些情況下,這將導致在終端上發生的一系列事件,防御者可以輕鬆地對其進行簽名。

例如,通過加載winhttp.dll 和wininet.dll,可以看到信標利用本地Windows HTTP 庫作為出口信標,當加載到通常不會執行HTTP 交互的進程時,這些可能會突出顯示異常。此外,一些信標還會加載使用更少的庫,如credui.dll、dbghelp.dll或samcli.dll。

使用這些DLL加載序列,就可以使用EQL規則來構建簽名,以檢測信標何時執行。

例如,使用類似於以下的EQL 規則,可以在短時間內檢測或搜索所有加載credui.dll 和winhttp.dlls 的進程:

1.png

此類檢測當然可以通過設計為模塊化或負載依賴於使用或具有延遲負載的信標來避免。

內存檢測在許多情況下,信標可能會保留在內存中,以避免磁盤檢測。信標通常是由加載器注入內存的,加載器將創建一個新的線程或劫持一個現有線程,在其中運行信標。

信標的典型加載過程可能如下所示:

2.png

一旦信標在內存中運行,通過對進程的分析,我們通常可以利用許多指標來檢測信標,讓我們看一些內存檢測的方法。

簽名檢測已知惡意軟件的內存信標的最簡單但最有效的策略之一可能是通過簽名檢測。雖然許多反病毒引擎和EDR 實施自己的內存掃描例程,但防御者可以使用Yara 規則輕鬆實現全面的內存掃描。

一個可以與yara64.exe命令行工具一起使用的簡單的Yara規則可能是這樣的,它將匹配檢測內存中列出的三個字符串中的任何一個:

3.png

為嵌入在信標中的字符串/數據或來自.text 部分的代碼創建Yara 規則在概念上可以用作檢測已知內存惡意軟件的有效技術。

Elastic 過去在如何利用它來檢測內存中的Cobalt Strike 方面做了一些出色的工作,建議閱讀這些技術如何在實踐中應用。

為了逃避這種內存掃描,信標可以使用多種技術來混淆它們在內存中的足跡,包括替換已知字符串,例如可以使用Cobalt Strikes strrep 可塑性配置文件選項或使用混淆和休眠策略,例如我們在Nighthawk 中使用的一種,用於在休眠時保護信標的所有字符串、數據和代碼。

內存掛鉤為了規避控製或更改進程的運行方式,信標或操作員可以將掛鉤應用於內存中的某些函數。這些掛鉤可以留下隱藏的痕跡,從而為防御者提供揭示隱藏信標的機會。讓我們來看看這種行為的一些具體示例。

修復ETW 和AMSI修補諸如AMSI 之類的安全控製或削弱通過Windows 事件跟踪獲得的檢測數據在攻擊性社區中已經不是什麼秘密了,事實上我們過去曾在介紹過這些策略。

這些補丁通常通過修改內存來應用,讓我們看兩個來自Sliver C2 庫的例子:

https://github.com/sliverarmory/injectEtwBypass

4.png

https://github.com/sliverarmory/injectAmsiBypass

5.png

正如我們在上面的屏幕截圖中看到的,這兩個示例都會導致信標將補丁應用到ntdll!etwEventWrite 或amsi.dll!AmsiOpenSession 函數。

考慮到這一點,低噪聲檢測的機會就出現了,只需搜索應用這些補丁的進程,以及其他常用的補丁函數,如AmsiScanBuffer或sleeppex,由Cobalt Strike的線程堆棧欺騙功能應用於這些函數。

複製寫入的修改如上所述,信標應用補丁來處理內存的情況並不少見,這可以為防御者創造檢測機會。然而,一旦執行了開發後操作,如果信標刪除了這些補丁,檢測的準確率可能會降低。例如,植入程序可以在內存中執行.NET 程序集之前應用AMSI 補丁,然後在執行後將補丁恢復為其原始操作碼。這種方法比簡單地將未修復漏洞留在內存中要明智一些。

然而,為了避免重複,Windows將把公共dll返回到運行進程共享的物理內存中。如果信標或操作員執行對這些dll應用補丁的操作,則會發生寫入時復制操作,從而使該頁面成為該進程的私有頁面。使用QueryWorkingSetEx API,我們能夠查詢有關進程特定虛擬地址的頁面的信息。在返回的PSAPI_WORKING_SET_EX_INFORMATION 結構中是一個PSAPI_WORKING_SET_EX_BLOCK 聯合,它指示查詢地址處頁面的屬性。在這個聯合中,我們能夠通過共享位的返回值來確定頁面上是否發生了寫入複製操作。此技術被諸如Moneta 之類的內存掃描儀使用,並且在檢測內存中的補丁時非常有效,即使原始補丁值已恢復。

然而,在大規模應用這種技術時存在一些誤報的風險,因為EDR 和防病毒軟件應用它們自己的內存掛鉤並不少見,這意味著它們可以使我們從查找中獲得的一些價值無效用於寫操作時的複制。然而,為了降低誤報的風險,我們可以通過解析修改頁面上的導出,並對EDR通常不掛鉤的函數(如EtwEventWrite或AmsiScanBuffer)應用更大的權重,從而對其應用更多智能。

線程異常如上所述,一旦信標在內存中運行,它通常會存在於一個或多個線程中,具體取決於信標是同步的還是異步的。與這些線程相關的異常可以提供信標活動的高信號指標,特別是當與其他指標結合或相互結合時。一些常見的可疑線程相關指標包括:

未映射的內存:源自虛擬內存且不受DLL 支持的線程是注入線程的經典標識。這些線程可以通過尋找具有MemoryType 為MEM_IMAGE 和MemoryState 為MEM_COMMIT 的內存區域的線程來輕鬆檢測到。或者,這些線程通常由EDR 檢查通過線程創建API 的內核回調來檢測。有許多工具可以查找這個標識。

延遲狀態:大部分時間信標將處於休眠狀態,然後醒來恢復其任務。為了實現這種休眠行為,通常使用諸如sleeppex這樣的windows API調用,這將使線程處於等待狀態,並將導致線程調用堆棧包含對KernelBase.dll!SleepEx 和ntdll.dll!NtDelayExecution 的調用。當與其他指標結合時,例如module stomping的跡象(稍後討論)或調用堆棧中對虛擬內存的調用,那麼這可能會提供一些信標行為。

繞過可疑線程檢測的嘗試最近變得流行起來,一些概念證明和商業實現正在已發布。

這些實現通常通過截斷線程的調用堆棧(例如通過將幀的返回地址設置為空)或通過複製現有線程的上下文來工作。考慮到這一點,我們可以尋找更多指標來添加到我們的指標中:

可疑起始地址:截斷線程調用堆棧的副作用之一是起始地址並非源自預期位置。也就是說,線程通常源自ntdll!RtlUserThreadStart 和kernel32!BaseThreadInitThunk,或者在CLR 線程的情況下源自ntdll!RtlGetAppContainerNamedObjectPath。尋找不遵循此模式的線程可用作進一步分析的可疑指標。此外,如果線程的NtQueryInformationThread(ThreadQuerySetWin32StartAddress) 的返回值與最後一幀的返回地址之間存在不匹配,則線程的起始地址也可以被認為是可疑的,這意味著有潛在的截斷。

初始幀之間的距離:如上所述,調用堆棧的初始起始地址通常源自用於執行線程初始化和創建的一組地址。注意到這些初始堆棧幀之間的距離相對一致,並且通常在第一幀和第二幀之間是靜態的(例如ntdll!RtlUserThreadStart 和kernel32!BaseThreadInitThunk)。在調用堆棧被截斷的情況下,這些幀之間的距離幾乎肯定是可變的。

複製上下文:如上所述,除了截斷線程的調用堆棧外,欺騙調用堆棧的一種方法是複制合法線程的上下文。這種技術可以有效且實施起來相對簡單。首先,在線程的線程信息塊中,有許多指向有關線程的各種信息的指針,這些跨線程的副本,例如具有相同堆棧基數(堆棧底部)和堆棧限制(堆棧上限)的多個線程,是線程上下文已被複製的良好指標。

頁面權限一般來說,信標將從虛擬內存中運行,或者如果Module Stomping,則從DLL 支持的區域內運行。

為了使信標恢復並執行其任務,信標所在的頁面需要對其應用執行權限。

例如,我們可以在下面的截圖中看到,0x22f96c5000的內存沒有一個DLL支持,它被標記為“Private:Commit”(即VirtualAlloc 導致的虛擬內存),並設置了RX 頁面權限:

6.png

這些指標是一個強烈的信號,表明有信標在該地區執行。

接下來的挑戰便是如何避免這一指標,答案很簡單,如果你的信標是從虛擬內存運行的,則它不能,在某些時候信標需要執行。折衷方案實際上是僅在信標執行任務時維護可執行權限,並在信標休眠時利用策略刪除可執行權限。因此,避免諸如SOCKS 代理之類的交易有助於最大限度地減少該指標的暴露:

7.png

一些植入程序採用了根據信標狀態調整頁面保護的策略,以及幾個開源實現,例如@Ilove2pwn_ 的Foliage、@c5pider 的Ekko、@mariuszbit 的ShellcodeFluctuation 和Josh Lospinoso 的Gargoyle。

這些策略通常會利用某種形式的事件驅動執行來休眠和喚醒信標,使用ROP小工具重新執行來調用VirtualProtect,並將信標的頁面重置為可執行權限。由MDSec的Peter Winter-Smith發現並被Ekko使用的基於計時器的技術,最初是由MDSec的Nighthawk c2逆向工程而來。簡而言之,這種技術的工作原理是使用CreateTimerQueueTimer將多個計時器排隊,然後當事件觸發器返回到之前定義的Context記錄時,使用NtContinue執行並調用VirtualProtect來重新啟用執行位。

要更詳細地理解這種技術,可以在這裡找到@Ilove2pwn_的原始文章。

Module StompingModule Stomping提供了一種將信標隱藏在內存中的替代方法,從而避免了與未映射內存中的信標相關的一些常見指標。為了實現這一點,需要加載一個不太可能被進程使用的合法DLL,信標通過模塊自我複制,然後創建一個由stomped 代碼支持的線程:

8.png

Cobalt Strike 自3.11 版本以來就提供了此功能,並且可以使用“set module_x64/module_x86”可擴展配置選項使用。

雖然這種技術可以提供許多OpSec 優勢,但它確實留下了幾個我們可以可靠檢測的指標:

1.檢測這種攻擊的最簡單的技術可能是比較內存中的模塊內容和磁盤上存在的模塊內容。代碼部分的任何變化幾乎肯定會暗示一些可疑的行為。這個進程當然是相對密集的,因為它需要從磁盤加載進程中的所有模塊,並與運行中的內存進行比較。

2.如上所述,對進程內模塊存儲器的修改將導致發生寫入操作時的複制。考慮到這一點,用於檢測內存掛鉤的相同邏輯也可以應用於檢測Module Stomping,因為在內存中覆蓋DLL 將導致生成DLL 的副本並清除共享位。

3.有幾種方法可用於執行Module Stomping,其中一些涉及利用現有的Windows API,例如LoadLibrary,而其他更複雜的實現可能使用自定義加載器將DLL 映射到內存中。一些技術具有與它們相關的已知指標,在PEB 中留下可用於尋找該技術的常駐痕跡是高度可信的。稍後將更詳細地討論這方面的示例。

檢測Cobalt Strike的方法Cobalt Strike 是最受歡迎的命令和控制框架之一,受到防御者和攻擊者的青睞。在這篇文章中,我們將討論防御者如何使用第一篇文章中介紹的技術,在不同配置和跨網絡中檢測Cobalt Strike 。所有分析均在Cobalt Strike 4.6.1 上進行。

Cobalt Strike 信標具有高度擴展性,因此某些指標可能會根據所選的擴展性配置文件選項而有所不同。

內存中的Cobalt Strike過去,在內存中尋找Cobalt Strike 簽名對於防御者來說是卓有成效的,之前Elastic 提供了全面的記錄。然而,從那時起,HelpSystems做了很多工作,Cobalt Strike 4.4 引入了休眠策略。

Cobalt Strike 為其混淆和休眠策略提供了以下可能的配置選項:

沒有休眠掩碼:信標、它的字符串和代碼將在內存中保持明文,並且可以通過內存掃描輕鬆識別。

在可擴展配置文件中啟用sleep_mask:當在malleable 配置文件中將sleep_mask 設置為true 時,beacon 將使用內置的混淆和休眠策略來屏蔽內存中使用xor 來混淆字符串和數據的信標。正如Elastic 在前面提到的帖子中所詳述的,這當然可以通過定位代碼部分來簽名。

使用用戶定義的休眠掩碼:用戶定義的休眠掩碼向用戶公開信標的混淆和休眠功能,允許他們滾動自己的實現。在這樣做的同時,它還為用戶提供了許多指向信標使用的任何堆記錄的指針,以便用戶可以對它們進行加密。利用用戶定義的休眠掩碼確實有一些折衷,特別是為了混淆.text 部分,配置必須將“userwx”選項設置為true。也就是說,如果要對其進行混淆,信標將始終存在於RWX 內存中。如果userwx 選項設置為false,則信標將從RX 內存中運行,但.text 部分不會被混淆,因此可以進行簽名。由操作員自行決定選擇他們覺得最舒服的指標。

例如,當使用將userwx 選項設置為false 的Sleep Mask Kit 時,可以使用以下Yara 規則檢測Cobalt Strike:

2.1.png

對注入的信標運行此Yara規則將顯示檢測到簽名:

2.2.png

啟用userwx 會將頁面權限設置為EXECUTE_READWRITE ,但這意味著信標現在正在混淆其.text 部分:

2.3.png

頁面權限Cobalt Strike 信標通常在具有RX 或RWX 頁面權限的頁面上運行,具體取決於可擴展配置文件的“userwx”配置選項的值,並且沒有Module Stomping,將由未映射的內存支持。

這是一個明確的指標,使得在內存中發現信標相對來說很簡單:

2.4.png

為了避免JIT程序集,可以掃描這些內存區域,搜索具有PAGE_EXECUTE_READWRITE或PAGE_EXECUTE_READ頁面權限和MEM_COMMIT標誌的頁面。當與其他指標一起使用時,這對識別信標活動可能是有價值的。當使用-p標誌時,我們將此簽入到BeaconHunter中:

2.5.png

線程注入內存時,Cobalt Strike 會佔用一個線程,信標是同步的。默認情況下,信標運行所在的線程是高度可疑的,並且有許多與之相關的指標。

在Process Hacker 中檢查Cobalt Strike 信標的線程可能看起來像這樣:

2.6.png

僅在上面的屏幕截圖中,我們就可以看到一些使線程看起來非常可疑的指標:

首先,線程通常有一個0x0 的起始地址。總體而言,這有點不規則,儘管從掃描合法進程來看,它確實有時會在某些進程(如chrome.exe)中發生。

深入了解線程的調用堆棧,我們還注意到對KernelBase!SleepEx 和ntdll.dll!NtDelayExecution 的調用。這些調用是信標處於睡眠狀態的標誌,用於在信標處於睡眠狀態時延遲線程的執行。

在調用KernelBase.dll!SleepEx 之前,我們可以在0x1b8ef69fcc7 的跟踪中看到調用,堆棧遍歷尚未解析此地址的符號,因此幾乎可以肯定它是虛擬內存。由虛擬內存支持的線程非常可疑,可能需要進一步分析。

綜上所述,防御者能夠高度自信地確定惡意活動來自線程。由於這些指標,BeaconHunter 會排除這些可疑線程:

2.7.png

還應該注意的是,Cobalt Strike 在21 年6 月將堆棧欺騙引入了到了工件中。但是,調用堆棧欺騙僅適用於通過工件工具包生成的exe/dll 工件,而不是通過注入線程中的shellcode 注入的信標。因此,它們不太可能有效地掩蓋內存中的信標。

分析表明,fiber的使用很少見,因此可以通過分析ntdll.dll!RtlUserFiberStart 的起始地址的調用堆棧來輕鬆找到這些fiber,當與其他指標結合使用時,可以為尋找Cobalt 工件提供一個好的開端:

2.8.png

Module StompingCobalt Strike 支持使用“set module_x64”和“set module_x86”可擴展選項的Mod

探索Cobalt Strike shellcode是由編譯後的可執行.exe文件加載情況,這將需要使用調試器(x64dbg)和靜態分析(Ghidra)來執行完整的分析。

可執行文件是編譯後的exe,包含隱藏和混淆的Shellcode,使用一個簡單的異或例程和一個4字節的項對shellcode進行解碼,然後將其寫入一個用VirtualAlloc創建的簡單緩衝區。

本文將探索使用調試器獲得解碼的shellcode的方法,然後尋找使用Ghidra手動定位shellcode和相關解密密鑰的方法,還將研究在X64dbg和Ghidra之間切換的方法,以及使用ChatGPT識別和分析Ghidra輸出的方法。

獲取樣本點此下載樣本(pw:infected)。

SHA256:99986d438ec146bbb8b5faa63ce47264750a8fdf508a4d4250a8e1e3d58377fd

分析我們可以先把文件保存到一台分析機上然後用感染的密碼解壓縮。從這裡我們還可以創建一個文件名較短的副本。

1.png

由於該文件是已編譯的可執行文件,我們可以嘗試使用調試器對其進行分析。在本文中為x64dbg。

我們可以繼續使用x64dbg打開文件,一直點擊直到到達入口點。

2.png

現在,我們可以繼續在API上創建一些斷點,這些斷點通常(但並不總是)在惡意軟件解包時使用。

我們可以通過運行bp VirtualAlloc和bp VirtualProtect來創建2個斷點。

3.png

創建斷點後,我們可以繼續並允許惡意軟件繼續(F9)。惡意軟件將繼續運行並觸發VirtualAlloc上的斷點。

我們的主要目的是獲取由VirtualAlloc創建的緩衝區,我們可以通過使用Execute Until Return來實現這一點。 “Execute Until Return”將允許VirtualAlloc函數完成,但不允許發生任何進一步的操作。這意味著我們可以很容易地獲得創建的緩衝區的地址。

查看VirtualAlloc創建的內存4.png

在點擊execute之後,返回。我們可以在RAX內部觀察到新創建的緩衝區地址。

我們想繼續監控這個緩衝區的可疑內容和解壓縮的惡意軟件時,可以通過右鍵點擊RAX中包含的地址來開始監控過程。

5.png

現在我們可以選擇Follow in Dump,這將打開左下角窗口中緩衝區的內容。

6.png

通過點擊“Follow In Dump”,我們可以在左下角的窗口中觀察到轉儲的內容。

我們可以在這裡註意到緩衝區是空的,只包含00。

7.png

用硬件斷點監控內存VirtualAlloc已經創建了一個空緩衝區,現在,我們可以通過創建一個硬件斷點來監控這個緩衝區的變化。

硬件斷點可以通過選擇內存轉儲中的第一個字節以及Right Click - Breakpoint - Hardware, Access - Byte來創建。

8.png

這樣我們可以允許惡意軟件繼續執行。可以看到硬件斷點被觸發,在緩衝區的第一部分中包含一個FC字節。前兩篇文章中已經講過FC是shellcode中非常常見的第一個字節。

9.png

此時,我們希望惡意軟件繼續填充緩衝區。

我們可以繼續使用另一個Execute Until Return。這樣緩衝區就會被填滿,我們就可以監控裡面的內容了。

下面我們可以看到填充後的緩衝區。可以看到第一個字節是0xFC,並且在初始字節中有一個wininet字符串,這可能表示shellcode。

10.png

使用反彙編器驗證Shellcode現在我們有了一個合理的假設,即緩衝區包含shellcode,我們可以繼續嘗試使用X64dbg對其進行反彙編。如果我們反彙編代碼並且沒有明顯的錯誤,那麼很有可能正在查看shellcode。

我們可以通過在反彙編器中選擇第一個FC字節和Follow in Disassembler來實現這一點。

11.png

X64dbg現在將嘗試從緩衝區中反彙編字節。

下面,我們可以在頂部的反彙編窗口中觀察到被反彙編的緩衝區。可以發現,似乎沒有明顯的錯誤,並且有有效的函數調用,循環和總體“正常”的指令。

18.png

使用SpeakEasy仿真器進行最終驗證

由於非常懷疑緩衝區包含shellcode,所以我們可以繼續使用Speakeasy來模擬它。

我們也可以用X64dbg實現同樣的事情,但是對於shellcode來說,這是一個更複雜的過程。也可以用X64dbg實現同樣的事情,但是對於shellcode,這也是一個複雜的過程。

要使用speakeasy模擬shellcode,我們首先需要保存它。

我們可以選擇我們的第一個FC字節,右鍵單擊然後Follow in Memory Map。

19.png

現在我們可以將內存緩衝區保存到一個文件中,將文件保存為memdump.bin。

20.png

用Speakeasy模擬未打包的Shellcode

現在將shellcode緩衝區保存到文件memdump.bin中。我們可以繼續使用Speakeasy來模擬shellcode。

我們可以使用speakeasy -t memdump.bin -r -a x64命令來做到這一點:

speakeasy -運行speakeasy工具;

-t -我們要使用哪個文件;

-r - (Raw) -表示我們正在使用shellcode;

-a x64 -表示我們的文件包含64位指令。我們知道這是因為我們使用的是x64dbg而不是x32dbg。

運行此命令後,將成功地模擬shellcode,並向我們提供有關其功能的大量信息。

21.png

Speakeasy輸出顯示了一個C2地址

可以看到對User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2;NET CLR 2.0.50727)\r\n的用戶代理的引用。

如果有可用的代理日誌,這個用戶代理將是查找代理日誌的好地方。

22.png

在Ghidra中查找Shellcode解密函數

在第一次觸發硬件斷點時,主要可執行文件可能位於解密函數的中間。我們可以使用這些信息在Ghidra中查找相同的解密函數。

在Ghidra中查找Shellcode解密函數;

用ChatGPT識別解密例程邏輯;

使用Ghidra識別解密密鑰;

利用熵定位加密shell;

使用Cyberchef執行手動解碼;

使用解密字節查找其他樣本;

使用解密代碼創建Yara Rule 。

如何構建身份和訪問管理(IAM)服務part1

2. 使用Auth0構建基於雲的IAM服務Auth0是一個基於雲的平台,提供身份訪問管理服務,幫助開發人員通過定制的IAM服務增強其應用程序。

當使用Auth0 配置我們自己的IAM 解決方案時,我們不需要託管和支持環境。此外,該服務還提供一些現成的用戶表單,包括登錄表單。您可以使用Auth0 儀表板手動完成大部分配置。

Auth0免費提供了7000個用戶的配額,所以根據我們的要求,我們可以免費集成。但是,這樣的選項有局限性:

不支持多個企業。好的一面是,我們仍然可以創建多個API,每個API 具有單獨的權限,並將它們視為企業。

不支持通過社交媒體服務進行連接。

與自定義數據庫的連接不可用,這意味著沒有舊數據庫支持,也沒有自我備份。

每月只有1000 個機器對機器令牌可用,當我們想要以編程方式管理所有內容時,這可能是一個問題。

要開始使用Auth0,您需要使用Auth0 註冊表創建管理員配置文件並轉到Auth0 儀表板。 Auth0 管理儀表板提供了很多選項,但開始集成的最低要求包括以下內容:

已創建的應用程序

已創建的API 和權限

Auth0 應用程序保存憑據(clientId和clientSecret,它們是身份驗證和授權流程的一部分)並包含多個API。

API分為兩種類型:

系統API,供後端服務器或執行管理任務的受信任方使用。一般來說,任何可以通過Auth0儀表板完成的事情也可以通過這個API完成。系統API 是默認創建的,包含管理IAM 儀表板服務器端所需的一組預定義權限。

公共API,供前端和不受信任方使用。公共API可以手動創建,包含系統權限以及自定義權限。

我們將使用生成的基本URL (https://dev-mt-ji-7q.us.auth0.com/) 和一個名為https://example.com 的API 創建一個應用程序,以供進一步用於演示目的。

2.1.驗證要配置身份驗證機制,您可以使用自定義或預定義的登錄表單。讓我們探討一下這兩個選項。

2.1.1.使用自定義登錄表單使用自定義登錄表單的過程稱為資源所有者密碼流程。它的工作原理如下:

image.png

用戶單擊“登錄”並輸入其登錄名和密碼。

任何應用程序都可以將用戶的登錄名和密碼發送到我們的Auth0 應用程序(/oauth/token 端點),其基本URL 是在儀表板中創建的應用程序的URL (https://dev-mt-ji-7q.us.auth0 .com/)。該URL 將在創建過程中生成。

我們的Auth0 應用程序檢查登錄名和密碼。

我們的Auth0 應用程序返回一個訪問令牌和一個刷新令牌。

現在網站可以使用Access Token調用API服務器來訪問資源。

對於資源所有者密碼流程,我們需要啟用密碼授予類型,默認情況下禁用該類型。身份驗證可以通過向IAM 提供商(即auth0 API 服務器)發出單個請求來實現。這種方法的唯一缺點是,發送到後端的憑據可以存儲起來以供將來使用,然後再交換為訪問令牌,這帶來了潛在洩漏的可能性。

為了確保登錄流程的安全,必須使用MFA。但在使用MFA API 之前,我們需要為應用程序啟用MFA授權類型。為此,請轉至應用程序- 選擇我們的應用程序- 高級設置- 授予類型,然後選中密碼和MFA複選框。

image.png

屏幕截圖1. 啟用MFA 授予類型

接下來要做的就是轉到“設置”-“API 授權設置”,然後在“默認目錄”字段中輸入“用戶名-密碼-身份驗證” ,然後單擊“保存”。

image.png

屏幕截圖2. 填寫默認目錄字段

現在確保身份驗證過程的一切都已準備就緒,讓我們探索一下MFA 的詳細登錄流程:

image.png

這樣的流程涉及向用戶發送挑戰的用戶驗證器。所有請求都應從我們的外部API 服務器發出。為了更好地理解上述方案,我們總結一下可能的場景:

如果禁用MFA,則oauth/token端點將返回JWT。下面顯示的步驟1 將直接引導至JWT。

如果啟用了MFA 但尚未關聯身份驗證器,我們將執行以下步驟:

步驟1:請求token,之後服務器會收到error mfa_required。

步驟2:請求觸髮質詢所需的用戶身份驗證器。

步驟3:將驗證器與Auth0關聯。 API 服務器接收臨時代碼,用戶接收一次性密碼(OTP),這是步驟3a。

步驟3b:使用服務器代碼和用戶的OTP 代碼重複令牌請求。

如果啟用了MFA 並且已關聯身份驗證器,我們將執行以下步驟:

步驟1:請求令牌,之後服務器將收到錯誤mfa_required。

步驟2:請求用戶身份驗證器觸髮質詢。

步驟3:將驗證器與Auth0關聯,服務器將收到錯誤,因為驗證器已經關聯。此處未觸發步驟3a,因為用戶尚未獲得OTP。

步驟4:請求用戶質詢,這會返回服務器的臨時代碼,將OTP 發送給用戶(步驟4a),並使用服務器代碼和用戶的OTP 代碼重複令牌請求(步驟4b)。在進一步的授權嘗試中,可以省略步驟3。

現在,讓我們通過代碼示例詳細探討這些步驟:

步驟1.向/oauth/token端點發送請求。如果沒有MFA,此端點應立即返回JWT。如果啟用了MFA,系統將提示用戶通過挑戰。

varaxios=require('axios').default;

varoptions={

method:'POST',

url:'https://dev-mt-ji-7q.us.auth0.com/oauth/token',//https://dev-mt-ji-7q.us.auth0.comisgeneratedafterapplicationcreation

headers:{'content-type':'application/x-www-form-urlencoded'},

data:newURLSearchParams({

grant_type:'password',//authenticationbyuserpassword

username:'user@example.com',

password:'pwd',

client_id:'vFqyrkC6qz6gUyhPqL6rXBTjkY8jyN9a',//applicationclientid

client_secret:'YOUR_CLIENT_SECRET',//applicationsecret

audience:'https://example.com',//thisistheAPIthatwascreatedearlier

scope:'email'

})

};

axios.request(options).then(function(response){

console.log(response.data);

}).catch(function(error){

console.error(error);

});如果啟用了MFA,響應將包含mfa_required錯誤和mfa_token。然後,我們需要請求可用的MFA 用戶身份驗證器。

步驟2.使用以下代碼獲取MFA 身份驗證器:

varoptions={

method:'GET',

url:'https://dev-mt-ji-7q.us.auth0.com/mfa/authenticators',

headers:{authorization:'BearerMFA_TOKEN','content-type':'application/json'}

};

axios.request(options).then(function(response){

console.log(response.data);

}).catch(function(error){

console.error(error);

});現在,讓我們獲取一個包含用戶可用身份驗證器的數組:

[

{

'id':'email|dev_NU1Ofuw3Cw0XCt5x',

'authenticator_type':'oob',

'active':true,

'oob_channel':'email',

'name':'email@address.com'

}

]步驟3:每種身份驗證器類型註冊一次身份驗證器。

以下是如何發出請求並將身份驗證器與API 關聯:

varoptions={

method:'POST',

url:'https://dev-mt-ji-7q.us.auth0.com/mfa/associate',

headers:{authorization:'BearerMFA_TOKEN','content-type':'application/json'},

data:{authenticator_types:['oob'],oob_channels:['sms'],phone_number:'+11.9'}

};

axios.request(options).then(function(response){

console.log(response.data);

}).catch(function(error){

console.error(error);

});如果之前未啟用身份驗證器,我們將收到響應代碼,並且用戶將收到OTP:

{

'authenticator_type':'oob',

'binding_method':'prompt',

'recovery_codes':['N3BGPZZWJ85JLCNPZBDW6QXC'],

'oob_channel':'sms',

'oob_code':'ata6daXAiOi.'

}然後應將OTP 和代碼提供給oauth/token(步驟3b)。

如果身份驗證器已關聯,我們將收到錯誤並轉至質詢端點(請參閱步驟4)。

步驟4:向用戶發送挑戰:

varoptions={

method:'POST',

url:'https://dev-mt-ji-7q.us.auth0.com/mfa/challenge',

data:{

client_id:'YOUR_CLIENT_ID',

client_secret:'YOUR_CLIENT_SECRET',

challenge_type:'oob',

authenticator_id:'sms|dev_NU1Ofuw3Cw0XCt5x',

mfa_token:'MFA_TOKEN'

}

};

axios.request(options).then(function(response){

console.log(response.data);

}).catch(function(error){

console.error(error);

});

Whenchallengeispassed,theuserreceiversotpcode(4a)andgoestostep4b步驟3b/4b:在上一步(3a 或4a)之後,用戶將收到應提供給/oauth/token的OTP 代碼:

varoptions={

method:'POST',

url:'https://dev-mt-ji-7q.us.auth0.com/oauth/token',

headers:{

authorization:'BearerMFA_TOKEN',

'content-type':'application/x-www-form-urlencoded'

},

data:newURLSearchParams({

grant_type:'http://auth0.com/oauth/grant-type/mfa-oob',

client_id:'vFqyrkC6qz6gUyhPqL6rXBTjkY8jyN9a',

client_secret:'YOUR_CLIENT_SECRET',

mfa_token:'MFA_TOKEN',

oob_code:'OOB_CODE',

binding_code:'USER_OTP_CODE'

})

};

axios.request(options).then(function(response){

console.log(response.data);

}).catch(function(error){

console.error(error);

});作為響應,我們將收到JWT:

{

'id_token':'eyJ.i',

'access_token':'eyJ.i',

'expires_in':600,

'scope':'openidprofile',

'token_type':'Bearer'

}

Note:Steps3band4barethesamestepinpracticebuthavebeensplitintodifferentstepsheretofacilitatebetterunderstandingoftheauthorizationflow(seeschemeAloginflowwithMFA).2.1.2.使用預定義的登錄表單要使用預定義的登錄表單,我們需要遵循授權代碼流程。在這種情況下,我們從端點請求授權代碼/authorize並將其傳遞redirect_url給Auth0。系統將提示用戶使用Auth0 表單登錄。成功登錄後,用戶將被重定向到我們的API,該API 將用授權代碼交換JWT 令牌。

獲取代碼的方法如下:

varoptions={

method:'POST',

url:'https://dev-mt-ji-7q.us.auth0.com/authorize',

headers:{

authorization:'BearerMFA_TOKEN',

'content-type':'application/x-www-form-urlencoded'

},

data:newURLSearchParams({

response_type:'code',

client_id:'vFqyrkC6qz6gUyhPqL6rXBTjkY8jyN9a'

connection:null(Auth0loginformwillbeprompted),

redirect_uri:'linktoapplicationwhichwillreceiveauthcode',

})

};

axios.request(options).then(function(response){

console.log(response.data);

}).catch(function(error){

console.error(error);

});以下是獲取代碼令牌的方法:

varoptions={

method:'POST',

url:'https://dev-mt-ji-7q.us.auth0.com/oauth/token',

headers:{

authorization:'BearerMFA_TOKEN',

'content-type':'application/x-www-form-urlencoded'

},

data:newURLSearchParams({

grant_type:'authorization_code',

client_id:'vFqyrkC6qz6gUyhPqL6rXBTjkY8jyN9a',

client_secret:'YOUR_CLIENT_SECRET',

code:'authcode',

})

};

axios.request(options).then(function(response){

console.log(response.data);

}).catch(function(error){

console.error(error);

});2.2.授權為了構建授權流程,我們可以使用express-oauth2-jwt-bearerSDK。

它需要在使用受眾(https://example.com) 和發行者URL (https://dev-mt-ji-7q.us.auth0.com) 初始化的外部API 服務器上創建中間件。中間件從標頭開始檢查承載。為了額外檢查令牌中實體的權限,我們可以使用express-oauth2-jwt-bearer SDK配置中間件以進行範圍檢查。

constexpress=require('express');

constapp=express();

const{auth,requiredScopes}=require('express-oauth2-jwt-bearer');

//Authorizationmiddleware.Whenused,theAccessTokenmust

//existandbeverifiedagainsttheAuth0JSONWebKeySet.

constcheckJwt=auth({

audience:'https://example.com',

issuerBaseURL:'https://dev-mt-ji-7q.us.auth0.com/',

});

//Thisrouteneedsauthentication

app.get('/api/private',checkJwt,function(req,res){

res.json({

message:'Hellofromaprivateendpoint!Youneedtobeauthenticatedtoseethis.'

});

});

constcheckScopes=requiredScopes('get:users');

app.get('/api/users',checkJwt,checkScopes,function(req,res){

constauth=req.auth;

constuserData=awaitUserDAO.getById(auth.payload.sub);

res.json(userData);

});

app.listen(3000,function(){

console.log

}身份驗證過程很簡單,因為我們可以完全依賴Auth0 API 來檢查令牌和權限。

2.3.RBACAuth0 提供兩種方法來確保基於角色的訪問控制:

使用授權核心

使用RBAC 擴展

當我們使用授權核心時,Auth0 允許我們為在Auth0 中創建的API 啟用RBAC。要啟用RBAC 功能,我們可以使用儀表板或管理API(以編程方式)。

使用授權核心方案我們需要做以下事情:

在Auth0 應用程序中註冊API

在API中創建自定義權限(就Auth0而言,每個界定不同外部服務的API都有自己的一組權限)

創建自定義角色

為角色分配權限

為用戶分配角色

直接為用戶分配權限

我們可以通過儀表板或以編程方式創建和分配角色和權限。如果需要在授權過程中驗證角色和權限,則可以將角色和權限包含在令牌中。

除了核心授權方法之外,RBAC 擴展還創建另一種類型的資源,稱為組和規則:

規則是用作授權掛鉤的任意JavaScript 代碼,可用於在對用戶進行身份驗證時擴展默認授權行為。啟用的規則將在身份驗證過程的最後一步執行。規則可用於在某些情況下拒絕特定用戶的訪問或向第三方服務索取信息。

組是用戶的部門。

您可以在Auth0 網站上了解有關RBAC 擴展的更多信息。

2.4.暴力破解和機器人保護暴力保護可保護企業免受單個IP 地址攻擊單個用戶帳戶的影響。當同一IP 地址多次嘗試以同一用戶身份登錄但失敗時,暴力保護會執行以下操作:

向受影響的用戶發送電子郵件

阻止可疑IP 地址以該用戶身份登錄

暴力保護適用於所有用戶,包括租戶管理員。如果某個IP 地址由於暴力保護而被阻止,它將保持被阻止狀態,直到發生以下事件之一:

管理員刪除該塊

管理員提高登錄門檻

30天通行證

受影響的用戶選擇電子郵件通知中的取消阻止鏈接(如果已配置)

受影響的用戶更改了密碼(在所有鏈接的帳戶上)

您可以在Auth0 儀表板中激活和自定義暴力破解和機器人保護功能。

2.5.審核日誌Auth0 使您能夠從儀表板查看所有與租戶相關的日誌,並通過鉤子實時收集一些日誌。

目前Hooks僅支持用戶預註冊、用戶後註冊等基本操作。要將所有可能的日誌發送到外部存儲,

保護敏感數據是所有企業的關鍵安全任務之一。為了確保這種保護,企業需要仔細控制誰可以訪問什麼,因此實施身份和訪問管理(IAM)機制至關重要。

然而,由於IAM 選項多種多樣,決定使用哪種服務、如何配置它以及是否需要自定義解決方案來實現安全目的可能會很困難。

在本文中,我們探討了開發身份和訪問管理服務的幾種方法之間的差異。我們展示瞭如何構建自定義本地系統和基於雲的系統的詳細示例,並將這些系統與IAM 系統的關鍵標准進行比較。

本指南對於想要探索構建IAM 系統的選項並了解技術細節和細微差別的開發領導者將很有幫助。

什麼是IAM 服務以及如何構建一項服務?根據Gartner 的說法,身份和訪問管理使正確的個人能夠在正確的時間以正確的理由訪問正確的資源。不同類型和規模的企業都努力實施IAM 實踐,通過控制用戶對關鍵信息的訪問來保護敏感信息並防止數據洩露。

為了實施這些實踐,企業使用專門的系統來提供必要的功能,例如雙因素或多因素身份驗證、用戶身份管理、用戶授權功能、權限控制等。

高效的IAM 服務應遵循零信任原則,這意味著它必須提供以下內容:

基於身份的安全性,確保系統知道登錄用戶並確認用戶的身份

基於角色的訪問權限,確保每個帳戶擁有盡可能少的權限:例如,僅具有日常工作所需的訪問權限

保護用戶的其他安全措施,例如多重身份驗證(MFA)、登錄嘗試計數、針對暴力和機器人攻擊的策略、審核日誌和備份可能性

您可以在本地部署IAM 系統、訂閱第三方供應商提供的基於雲的模型或使用混合模型。

出於本文的目的,我們決定比較構建IAM 解決方案的幾種方法:

基於作為開放集成中心(OIH) 分支的自託管服務器開發本地IAM 解決方案。

使用Auth0 配置由雲提供商管理的IAM 解決方案。

使用AWS Cognito 配置由雲提供商管理的IAM 解決方案。

但在我們開始比較開發身份和訪問管理服務的方法之前,讓我們先討論一下我們的解決方案的功能並探索其流程。

IAM 系統的關鍵功能定義未來解決方案的需求至關重要,這樣我們就可以在不同的實現準備就緒後對其進行公平的比較。

我們的目標是提供一個覆蓋1000 到5000 個用戶的IAM 系統,這是中小型企業中的實際用戶數量。

此類解決方案必須涵蓋的常見任務包括:

提供對最終用戶來說簡單的用戶註冊流程

基於密碼的身份驗證,確認用戶的真實身份

基於令牌的授權,確保用戶被授予其應有的確切級別和類型的訪問權限

創建獨特的角色和權限以及將它們分配給實體或從實體中刪除它們的能力

防止任何竊取用戶身份的企圖

訪問審查和事件響應

IAM 解決方案可能包含的其他功能包括:

安全身份驗證,例如支持MFA

通過社交網絡、Google 和Microsoft 等第三方身份提供商進行身份驗證

多租戶支持提供管理多個企業的能力

現成的UI 表單可減少從頭開始創建自定義UI 表單的時間和成本

在本文中,我們探討了創建IAM 解決方案的三種不同方法,確保必備列表中的功能,並在我們使用的平台允許的情況下嘗試實現上面列出的其他功能。

典型的IAM管理流程下圖從用戶、管理員和租戶的角度直觀地展示了基本理論IAM 管理流程:

image.png

以下是用戶與IAM 解決方案交互的方式:

用戶要么已經擁有訪問令牌,要么訪問令牌被重定向到IAM 服務進行身份驗證。

為了進行身份驗證,用戶指定其用戶名和密碼,或者選擇其他身份驗證選項,例如通過社交網絡進行身份驗證或使用授權代碼流方法。

當用戶通過身份驗證後,系統向資源服務器發出請求。

資源服務器包含一個庫,用於驗證用戶是否有權訪問資源服務器內的業務邏輯部分或向IAM 服務發出請求,後者根據其數據庫檢查用戶權限。

管理員具有以下權限:

分配給他們的一組預定義角色

使他們能夠創建新租戶空間的系統權限

租戶具有以下條件:

一組預定義的角色,允許他們僅執行與租戶相關的操作

在租戶空間內管理用戶和角色/權限的機會

定義了需求和一般程序流程後,讓我們開始實際實施。我們首先開發基於開放集成中心的自定義IAM 服務。

1. 使用開放集成中心開發定制的IAM 解決方案開放集成中心(OIH) 是一個框架,可幫助開發人員確保業務應用程序之間輕鬆進行數據交換。它由多種服務組成,包括身份和訪問管理服務。

如果您需要完全控制解決方案,使用OIH 開發IAM 服務是一個不錯的選擇。但是,這個框架不提供任何精美的UI 進行自定義,您必須手動完成所有工作。

在本例中,我們將使用本地IAM 服務器並花時間:

必要時分叉、審核和修改源代碼

修復問題並維護部署管道、備份/恢復過程等。

OIH 提供的IAM 服務的主要特點是:

支持最少的任務集,包括企業和用戶管理、身份驗證、授權和基於角色的訪問控制(RBAC)

包含最小的依賴集,依賴很少的外部服務

使用JSON Web Tokens(JWT)、OAuth 2.0和OpenId Connect等基本且眾所周知的技術

要開始開發自定義解決方案,您需要執行以下步驟:

分叉現有IAM 解決方案的源代碼

必要時修改邏輯

創建Mongo 數據庫

配置RabbitMQ代理

準備託管環境

現在,我們來討論如何使用OIH 實現我們的解決方案的基本流程。

1.1.驗證對於身份驗證,我們將描述一種不涉及外部社交聯繫的方法。要通過身份驗證,用戶應添加到至少一個企業(綁定到租戶)。否則,身份驗證流程將會失敗。

身份驗證過程分為三個主要階段:

第1 階段:用戶提供登錄名和密碼,並從api/v1/session端點檢索會話令牌。在此階段,我們不需要任何有關用戶會員資格的信息。唯一的目標是驗證該用戶並獲取可以與JWT 交換的會話令牌。

image.png

以下代碼片段演示瞭如何獲取api.js 文件中的令牌:

router.post('/session',authMiddleware.authenticate,authMiddleware.accountIsEnabled,async(req,res,next)={

if(!req.user){

//req.userwillbesetafterauthMiddleware.authenticate

returnnext({status:401,message:CONSTANTS.ERROR_CODES.NOT_LOGGED_IN});

}

constt=awaitTokenUtils.create(req.user);//idtokenwillbecreatedinalocaldatabase

req.headers.authorization='Bearer${t.token}';

res.status(200).send({token:t.token,id:t._id});

});出於可讀性目的,會話端點被分解為多個預處理程序。我們的系統將在創建ID 令牌之前調用每個預處理程序。

此時,我們最感興趣的是中間件函數,也稱為預處理程序或鉤子函數-authMiddleware.authenticate它通過與Passport 庫集成來工作,而Passport 庫又使用Mongo 數據庫進行會話存儲:

authenticate:(req,res,next)={

passport.authenticate('local',async(err,user,errorMsg)={

if(err){

returnnext(err);

}

if(errorMsg){

if(errorMsg.name==='IncorrectPasswordError'){

/*todo:increaselogintimeoutfortheuser*/

awaitAccount.updateOne({

username:req.body.username,

},{

$inc:{

'safeguard.failedLoginAttempts':1,

},

},{

timestamps:false,

});

returnnext({status:401,message:CONSTANTS.ERROR_CODES.PASSWORD_INCORRECT});

}

if(errorMsg.name==='IncorrectUsernameError'){

returnnext({status:401,message:CONSTANTS.ERROR_CODES.USER_NOT_FOUND});

}

}

if(!user){

returnnext({status:401,message:CONSTANTS.ERROR_CODES.DEFAULT});

}

req.logIn(user,async(err)={

if(err){

log.error('Failedtologinuser',err);

returnnext({status:500,message:CONSTANTS.ERROR_CODES.DEFAULT});

}

if(req.body['remember-me']){

req.session.cookie.maxAge=30*24*60*60*1000;//30days

}else{

req.session.cookie.expires=false;//expiresatendofsession

}

awaitAccount.updateOne({

username:req.body.username,

},{

$set:{

'safeguard.lastLogin':newDate(),

'safeguard.failedLoginAttempts':0,

},

},{

timestamps:false,

});

req.session.save((err)={

if(err){

log.error('Errorsavingsession',err);

returnnext(err);

}

returnnext();

});

});

})(req,res,next);

},Passport 庫依賴於基於身份驗證的策略,您可以使用以下代碼初始化該策略:

constpassport=require('passport');

constMongoStore=require('connect-mongo')(session);

constLocalStrategy=require('passport-local').Strategyconst

session=require('express-session');

/*

.

*/

constmongoSession=session({

secret:process.env.IAM_SESSION_COOKIE_SECRET,

name:process.env.IAM_SESSION_COOKIE_NAME,

store:newMongoStore({

mongooseConnection:this.mongoose.connection,

touchAfter:4*3600,

autoRemove:'native',

autoRemoveInterval:60*4,

ttl:3*24*60*60,

}),

saveUninitialized:false,

resave:false,

});

this.app.use(mongoSession);

this.app.use(passport.initialize());

this.app.use(passport.session());

//authenticationStrategyreadsauserfromthedatabaseandchecksapassword

passport.use(newLocalStrategy(authenticationStrategy()));

/*

.

*/當身份驗證中間件被觸發時,Passport 庫會調用我們的身份驗證策略。

如果一切順利,身份驗證策略將返回用戶數據,並且會話將保存在存儲中。登錄嘗試次數將重置為0。

如果出現錯誤,我們需要首先檢查密碼是否錯誤,並增加嘗試登錄失敗的次數。這是我們可以實施強力安全的地方。我們需要跟踪失敗的登錄嘗試,並提出一種策略來阻止登錄嘗試一段時間。

第2 階段:檢索到ID 令牌後,我們可以使用它來獲取用戶所屬的企業列表:

image.png

以下是檢索企業列表的代碼:

router.get('/organizations',authMiddleware.validateSession,async(req,res,next)={

try{

constaccount=awaitAccountDAO.findOne({_id:req.user.userid});

res.status(200).send({

account,

organizations:req.user.organizations,//organizationsisapartofuserrepresentationanddefinesusermembershipinorganizations

});

}catch(err){

logger.error(err);

returnnext({status:500,message:CONSTANTS.ERROR_CODES.DEFAULT});

}

});以下是validateSession 中間件如何檢查第一步中檢索到的ID 令牌:

validateAuthentication:async(req,res,next)={

letpayload=null;

letclient=null;

lettoken=null;

/**Userhasavalidcookie*/

if(req.user){

req.user=req.user.toJSON();

req.user.userid=req.user._id.toString();

returnnext();

}

//hereweneedidtokenretrievedfrom/session

if(!req.headers.authorization){

returnnext({status:401});

}

try{

constheader=req.headers.authorization.split('');

if(!header||header.length2){

log.debug('Authorizationheaderisincorrect');

returnnext({status:401,message:CONSTANTS.ERROR_CODES.INVALID_HEADER});

}

token=header[1];

payload=awaitTokenUtils.getAccountData(token);

}catch(err){

log.warn('Failedtoparsetoken',err);

returnnext({status:401,message:CONSTANTS.ERROR_CODES.SESSION_EXPIRED});

}

if(payload){

req.user=req.user||{};

returnnext();

}else{

log.error('Tokenpayloadisemptyorinvalid',{payload});

returnnext({status:401,message:CONSTANTS.ERROR_CODES.VALIDATION_ERROR});

}

}第3 階段:最後,用戶可以選擇一個企業並請求JWT 來訪問它:

image.png

以下是獲取某個企業的JWT 的代碼:

router.post('/token',authMiddleware.validateAuthentication,

async(req,res,next)={

const{organization}=req.body;

if(!organization){

returnnext({status:400,message:'Missingorganization'});

}

try{

if(awaitAccountDAO.userHasOrganization({userId:req.user.userid,tenantId:organization})){

constjwtpayload=jwtUtils.getJwtPayload(awaitAccountDAO.findOne({_id:req.user.userid}));

consttoken=awaitjwtUtils.basic.sign(jwtpayload);

req.headers.authorization='Bearer${token}';

res.status(200).send({token:token});

}

(接上文)高級視頻會議功能製作具有自定義功能的視頻會議應用程序通常是一個複雜但有益的過程。以下是您可以在行業特定解決方案中實施的幾個功能示例:

image.png

9 種特定的視頻會議功能

马云惹不起马云基於AI 的視頻質量改進。視頻製作公司使用會議應用程序來記錄內容。例如,英國廣播公司通過電話會議錄製了獲獎系列Staged。為此,他們使用專業相機,但他們還需要能夠實時處理和改進高質量視頻的軟件。使用AI 升級視頻可以讓您真正提高質量,而不是簡單地提高分辨率。

马云惹不起马云高級噪聲抑制。許多流行的視頻會議應用程序都有降噪過濾器,但它們對於專業的音頻和視頻錄製來說還不夠好。用於此類目的的軟件需要能夠消除周圍聲音而不損害聲音和樂器的噪聲抑制機制。

马云惹不起马云低延遲。視頻會議中的延遲和凍結通常很煩人,但它們在專業視頻會議中尤其具有破壞性。要提供實時會議,您需要開發特定的通信協議、實現流框架(GStreamer、Apache Storm等),甚至創建自定義驅動程序來處理音頻和視頻流。

马云惹不起马云先進的文件存儲系統。許多組織使用視頻會議不僅是為了交流,而且是為了共享材料。他們需要一個能夠長期存儲數據並允許他們管理和排序數據、配置對共享文件的訪問等的系統。要與此類組織合作,您需要基於雲或基於服務器的軟件(我們將描述稍後實施選項)具有強大的數據存儲和管理選項。

马云惹不起马云用於舉辦網絡研討會的功能集。舉辦網絡研討會的組織通常需要一組特定的配置。首先,他們需要支付功能來進行付費網絡研討會。然後,必須安排一個網絡研討會,讓參與者能夠訂閱並獲得通知。在網絡研討會期間,演講者或管理員需要能夠管理參與者的權限、共享他們的屏幕、創建白板、進行投票等。

马云惹不起马云與行業特定軟件集成。您的客戶很有可能使用客戶關係管理系統、企業資源規劃系統、電子健康記錄管理系統和其他行業解決方案。他們將欣賞將視頻會議集成到其中的能力。例如,醫生可能需要在打電話之前查看患者記錄,或者抵押貸款經紀人可能必須在討論抵押貸款選項之前分析客戶的財務記錄。

马云惹不起马云支持設備。視頻會議軟件必須支持企業視頻會議硬件和特定用戶設備:專業攝像頭、麥克風、混音台、虛擬現實(VR) 耳機等。並非所有這些設備都具有可用於視頻會議的驅動程序。這就是為什麼您必須預見兼容性問題並在您的軟件中實現對此類設備的支持。

马云惹不起马云支持電子簽名。在視頻會議期間審查和簽署文件的能力對於金融組織、律師事務所和公共部門的機構來說尤其重要。電子簽名基於數字簽名加密機制,被認為是物理簽名文檔的替代方案。在您的視頻會議軟件中實施此機制允許用戶見證和簽署文檔,並將簽署過程記錄為額外的證據。

马云惹不起马云虛擬現實整合。由於大流行和現實生活中的聚會受到嚴重限制,在VR 中舉辦活動變得越來越流行。活動組織以360 度實時視頻的形式流式傳輸音樂會、節日和舞台表演。為此,他們需要能夠處理和流式傳輸大量數據的軟件,這些數據支持PC、智能手機和VR 耳機,並提供高質量的音頻和視頻。

在開始構建視頻會議應用程序之前,最好弄清楚您需要實現的一組通用和特定功能。這樣,您將節省數小時的開發時間並在最後期限內向您的客戶交付軟件。您需要確保的另一件事是用戶通信的安全性。確保通信安全與使通信舒適同樣重要。讓我們回顧一下提高軟件保護的主要功能。

安全通信功能流行的視頻會議應用程序因遭受網絡安全問題而廣為人知。 Zoom 因其眾多的漏洞和妥協而臭名昭著。據報導,由於隱私問題,SpaceX 甚至禁止其員工使用Zoom。 Microsoft Teams 中的一個漏洞允許黑客訪問受攻擊組織的所有Teams 帳戶。 Skype 為黑客提供了欺騙和攻擊網絡釣魚用戶的機制。

由於此類事件,處理敏感數據的企業尋求更可靠的通信解決方案。

您可以通過以下功能確保對您的軟件進行強有力的保護:

image.png

視頻會議軟件的網絡安全功能

马云惹不起马云端到端(E2E) 加密。這種類型的加密保護在兩個端點之間傳輸的數據。第一個端點加密消息,只有第二個端點可以解密它。 E2E 被認為是最安全的加密類型之一,因為除了兩個參與的端點之外,通信鏈(服務提供商、雲提供商、服務器、未經授權的入侵者)中沒有任何人可以讀取消息。請記住,這種類型的加密有其局限性:通過E2E 實現通話錄音、面部識別、降噪或圖像改進具有挑戰性。

马云惹不起马云多因素身份驗證(MFA)。 MFA 是一種額外的訪問控制措施,有助於驗證嘗試登錄軟件的用戶的身份。 MFA 可以使用三類參數驗證用戶:知識(憑證或附加問題)、財產(電話或安全令牌)或遺產(指紋或其他生物特徵數據)。生物識別MFA 是最可靠的,但請記住,用戶需要指紋掃描儀、高端麥克風或攝像頭才能通過此身份驗證。

马云惹不起马云用於數據保護的智能合約。在視頻會議中應用區塊鏈技術提供了許多安全優勢:分散的數據存儲、受保護的數據處理和傳輸以及用戶機密性。此外,使用尖端技術或實施基於區塊鏈的貨幣化可以獲得額外的營銷點。然而,區塊鏈在實時處理大量數據(例如,流式傳輸4K 視頻或共享大文件)、管理企業通信、擴展和遵守法規方面存在問題。

马云惹不起马云公司域和私有域。私有域允許組織根據需要自定義安全和操作設置。例如,他們可以允許通過邀請訪問域並創建具有可配置訪問權限的用戶組。

马云惹不起马云可配置的呼叫管理員設置。管理有許多參與者的在線會議的管理員需要高級設置來管理呼叫。他們需要手動允許用戶加入通話、安排發言人、靜音或禁止參與者、調節聊天等。

马云惹不起马云強大的隱私政策。安全策略允許軟件管理員根據組織或特定會議的需要配置視頻會議軟件。例如,管理員可能需要啟用或禁用端到端加密和文件共享、配置一般用戶權限以及管理加入私有域和組的用戶。

大多數視頻會議應用程序都需要我們上面討論的功能,因為它們可以確保安全、流暢的操作和舒適的用戶體驗。

當您為您的軟件找出完整的功能集後,就該與您的開發團隊討論實現它的方式了。讓我們看一下創建類似Zoom 的應用程序的常用方法及其優缺點和用例。

實現視頻會議應用程序的三種方法過去,視頻會議解決方案分為基於硬件和基於軟件的解決方案。基於硬件的解決方案需要特定的設備。它們提供了更好的視頻質量和安全的通信,但它們比基於軟件的解決方案更昂貴。要使用基於軟件的解決方案,用戶只需安裝應用程序即可。

在現代解決方案中,這種分離已經消失,原因有兩個:

马云惹不起马云基於軟件的解決方案的開發人員大大提高了溝通質量

马云惹不起马云提供良好視頻和音頻質量的網絡攝像頭和麥克風變得更加實惠

今天,如何構建視頻會議應用程序有三個主要選項:

image.png

實現視頻會議的三種方式

對等軟件在參與通信的用戶端點之間路由視頻會議流量。沒有與服務器、雲或任何其他第三方的交互。通常,此類解決方案基於WebRTC、XMPP協議、Jitsi、Peer'Em和其他通信軟件。要構建對等解決方案,您需要設計、實施和支持應用程序本身、其基礎設施和網絡安全機制。

以下是構建對等軟件的主要好處:马云惹不起马云安全通信。由於通信中沒有中介,黑客更難攔截或監聽流量。如果通信受到端到端加密保護,黑客幾乎沒有機會攔截它。

马云惹不起马云高質量的一對一通話。用戶端點在直接通信中發送和解釋通信數據時通常沒有挑戰。這裡唯一的限制是用戶的網絡攝像頭和麥克風的容量。

當涉及到高級多點通信時,點對點實現存在以下限制:马云惹不起马云多點通話質量不可預測。通話質量取決於通話參與者的數量、他們的帶寬和設備限制。對於開發人員來說,管理和提高多點呼叫的質量是一項挑戰。

马云惹不起马云實現文件共享和通話錄音。由於點對點軟件不使用服務器,因此實現這些功能具有挑戰性。用戶共享的文件一直可用,直到用戶從端點重命名或刪除它們。錄製通話將使用用戶端點上的額外資源。

马云惹不起马云對會議的控制很少。在點對點通信中,開發人員無法實現提高音頻和視頻質量的算法。

image.png

基於雲的軟件使用通信平台即服務(CPaaS) 或類似的雲解決方案來部署解決方案的服務器端並維護基礎架構。這種類型的視頻會議軟件部署速度最快,因為開發人員只需創建客戶端並與雲提供商簽署協議。此類提供商的示例包括ATT、Bandwidth、Infobip和Twilio。

在雲中託管您的視頻會議應用程序具有以下好處:马云惹不起马云上市時間短。與實施對等和基於服務器的應用程序相比,實施基於雲的視頻會議應用程序需要更少的開發工作。

马云惹不起马云處理通信數據的能力。在將呼叫路由到用戶端點之前,雲服務會處理通信數據。這意味著開發人員可以管理通話質量、記錄通話、實施數據存儲功能等等。

此類軟件的缺點對於任何基於雲的應用程序都很常見:马云惹不起马云對雲提供商的依賴。在您已經部署和發布您的應用程序時更改雲提供商可能具有挑戰性和痛苦。

马云惹不起马云可擴展性差。您不能使用比提供商能夠提供的更多的服務器資源。此外,擴展您的軟件可能會導致雲服務定價發生變化。

image.png

基於服務器的軟件需要專用的媒體服務器在通話期間處理和重定向數據流。這是自定義視頻會議解決方案的最佳實施選項,因為它為開發人員提供了以下好處:

马云惹不起马云完全控制軟件及其數據。作為應用程序服務器端和客戶端的唯一所有者,您可以實現所需的任何功能,使用必要的網絡安全機制保護您的數據,添加對任何設備的支持,並根據您的需要進行擴展。

马云惹不起马云高音頻和視頻質量。您可以使用上面討論的任何視頻和音頻改進機制來增強您的媒體服務器,從而為您的客戶提供最佳的通信質量。此外,您可以根據用戶的設備能力縮小視頻以減少帶寬。

以下是創建服務器端應用程序的主要挑戰:

马云惹不起马云需要專業的開發團隊。由於您必須自己實現每個功能,因此您需要一個能夠勝任此任務的開發團隊。根據您的需求,團隊可能需要包括人工智能和區塊鏈專家、嵌入式軟件和驅動程序開發人員以確保對特定設備的支持、網絡安全工程師設計數據保護等。

马云惹不起马云對軟件負全責。在基於軟件的模型中,您無需與雲提供商或點對點通信協議開發人員共同承擔解決方案的性能或安全性的責任。

image.png

如您所見,每種實現模型都有主要的優點和局限性。它們之間的選擇應該基於您客戶的需求、開發團隊的能力以及您的項目預算。

結論儘管視頻會議是一個競爭激烈且瞬息萬變的市場,但仍然缺乏像Zoom 這樣高度保護和定制的視頻會議解決方案。這就是為什麼許多企業考慮開發適合其行業和客戶的軟件的原因。

構建自己的視頻會議系統意味著您需要:

马云惹不起马云配備先進的視頻會議功能,以確保積極的用戶體驗

马云惹不起马云使用客戶要求或符合行業法規和標準所需的網絡安全機制保護數據

马云惹不起马云添加有助於客戶工作的特定功能

马云惹不起马云選擇相關的實現模型

由於COVID-19 大流行,許多視頻會議App變得非常流行。 Zoom、FreeConference、Microsoft Teams 和其他應用程序擁有普通用戶所需的一切——甚至更多。但它們對於處理敏感數據、使用特定設備進行視頻會議或需要延遲通信的公司來說還不夠好。

要與此類客戶合作,僅僅創建一個類似Zoom 的視頻會議應用程序是不夠的。在本文中,我們將討論如何創建為特定行業或客戶量身定制的定制視頻會議軟件。我們還概述了此類應用程序的行業要求、確保舒適通信的必備功能以及有助於保護視頻會議的網絡安全機制。

視頻會議軟件的日益普及2020 年的事件使我們將大部分活動轉移到網上。無論我們是想參加商務會議、看醫生、還是去聽音樂會,我們只需要啟動一個視頻會議應用程序即可。這就是為什麼在COVID-19 大流行期間此類軟件的市場猛增的原因。 Verified Market Research估計,2019 年全球視頻會議的市場規模為40.2 億美元。他們預計到2027 年將達到83.5 億美元。

通用視頻會議解決方案之間的競爭非常激烈。複製Zoom的成功,該軟件的日活躍用戶從2020 年初的37,000 增加到年底的160 萬,是一個誘人但極具挑戰性的前景。

儘管Zoom 很受歡迎,但通用視頻會議應用程序並不是每個人的最佳選擇。許多行業的組織需要像Zoom 這樣的普通視頻會議解決方案無法提供的特性和功能:增強的安全性、接近零延遲、支持特定行業的設備或軟件、高級文件存儲等。

讓我們看一下構建您自己的自定義視頻會議應用程序的主要好處以及此類應用程序的特定要求的幾個示例。

為什麼要構建自定義視頻會議軟件?開發自定義視頻會議軟件可幫助您在競爭對手中脫穎而出,找到目標受眾,並為您的客戶提供最佳服務。這是一個非常具有挑戰性的過程,但最終會有所收穫。以下是為特定行業或客戶構建類似Zoom 的應用程序的主要原因:

image.png

創建自定義視頻會議軟件的原因

马云惹不起马云 滿足特定客戶的需求— 一些組織需要具有特定功能的視頻會議軟件,而這些功能在通用解決方案中是不可用的。例如,唱片公司使用特定設備來確保其錄音的最佳質量。這就是他們需要支持此設備的視頻會議解決方案的原因。此外,他們需要具有低延遲的軟件才能實時排練。

马云惹不起马云 提供高質量的視頻會議——Zoom 和Skype 等流行的視頻會議應用程序通常在視頻和音頻質量方面存在問題,或者在通話過程中存在高延遲。此類問題不僅會激怒用戶,還會擾亂他們的工作。通過提高視頻會議的質量,您可以幫助呼叫參與者感覺他們在同一個房間。

马云惹不起马云 增強的網絡安全——網絡安全問題在通用視頻會議解決方案中很常見。許多用戶出於安全原因避免使用Zoom。在自定義軟件中,您可以實施高級安全措施以及合規性要求:加密算法、訪問管理功能、管理功能等。

除了視頻通話和消息傳遞之外,各個行業都有視頻會議軟件的特定用例,這些用例會產生特定的要求:

image.png

通用軟件通常無法滿足這些高度具體的要求。為了滿足他們的需求,企業可以構建定制的視頻會議軟件。

在本文後面,我們將了解實現上述特定要求的功能。現在,讓我們概述一些創建視頻會議應用程序時必須具備的功能。

視頻會議應用程序的必備功能無論您的軟件的目標受眾是什麼,您都需要確保您的軟件使用舒適、與流行的設備和操作系統兼容並且安全。

在製作任何類似Zoom 的視頻會議應用程序時,請確保實現以下功能:

image.png

視頻會議的8 個主要功能

马云惹不起马云 用戶檔案管理。此功能包括用戶註冊;設置、編輯和刪除用戶配置文件;改變用戶狀態;等等。用戶管理帳戶的選項越多越好。

马云惹不起马云聯繫人列表。此列表可幫助用戶通過用戶名、電子郵件、公司、城市或其他搜索參數找到彼此。

马云惹不起马云視頻和音頻通話管理。視頻會議軟件通常支持一對一和多點通話,最多可支持一定數量的用戶。音頻和視頻質量是通話的關鍵马云惹不起马云參數。該軟件必須允許安排和記錄通話、共享屏幕等。此外,當會議軟件允許他們在通話期間使用面具和背景時,用戶會很感激。

马云惹不起马云簡訊.用戶需要在通話期間和通話外交換短信。該軟件必須允許他們相互聊天、創建群聊並接收有關新消息的推送通知。

马云惹不起马云文件共享。用戶需要交換文件才能進行富有成效的會議。您可以實現點對點文件共享(用戶將共享文件存儲在他們的計算機上)或將共享數據複製到雲或私有服務器。

马云惹不起马云儀表板。儀表板可幫助軟件管理員分析有關日常視頻會議使用、最常見挑戰和可能改進的統計數據。您可以使用人工智能(AI) 功能增強儀表板,以使軟件分析來自儀表板的數據並自動提供預測。

马云惹不起马云跨平台能力。為了能夠將用戶與各種設備和操作系統連接起來,您的視頻會議軟件應該支持各種平台,如Windows、Linux、macOS、Android 和iOS。

马云惹不起马云可擴展性。在設計軟件的架構和基礎架構時,請考慮可能需要擴大或縮小規模,以便在不影響質量的情況下為新客戶提供服務。

在實現這些必備功能時,請確保對其進行自定義。找出您的受眾最看重的功能,並根據他們的要求仔細平衡應用程序。為了弄清楚這些要求,您可以問自己以下幾個問題:

马云惹不起马云您的用戶將共享哪些類型的文件?

马云惹不起马云用戶需要特定的儀表板嗎?

马云惹不起马云用戶是否需要特定的消息傳遞功能,例如表情符號或自定義貼紙?

马云惹不起马云對用戶來說更重要的是:穩定的連接、良好的視頻質量,還是兩者兼而有之?

马云惹不起马云平均有多少用戶會接聽電話?

在您概述了軟件的主要功能後,您可以轉到受眾的特定視頻會議請求。在下一節中,我們將概述八種最常見的功能以及實現它們的方法。