0x01 概述
Microsoft Exchange用户可以授权给其他用户对其邮箱文件夹进行各种级别的访问。例如,用户可以授予其他用户读取访问其收件箱中里面的电子邮件,但是要是用户(或Exchange管理员)不小心设置了不正确的访问权限,那么这将导致所有的用户都能访问读取其的邮箱。
使用MailSniper,可以快速枚举任何用户可访问的邮箱。在这篇文章中,我将说明此问题是如何产生的,如何查找存在权限问题的邮箱,以及在无需获取邮箱管理员许可的情况下阅读邮箱中的邮件。
0x02 使用Outlook设置邮箱权限
更改邮箱权限是所有用户在Microsoft Outlook客户端中都能够轻松完成的事情。如果用户右键单击文件夹“收件箱”,然后单击“属性”,然后文件夹的属性菜单就会打开。
单击“权限”选项卡能看到文件夹当前的设置。这使得事情变得有趣了。单击“添加”按钮,用户可以指定某个账户来授予各种权限。这是非常理想的,因为用户能够限制特定人员的访问。但是你会注意到在“权限”中已经包含了“默认”和“匿名”选项。“默认”项目实质上已经包含了组织中的具有访问邮件权限的每个用户。
如果用户错误地将权限级别“默认”设置为“None”之外的其他选项(除Contributor之外),则这可能允许组织中的每个成员访问该邮件文件夹。
邮箱文件夹的权限也可以由Exchange管理员设置。直接在Exchange服务器上使用Set-MailboxFolderPermission cmdlet,可以修改这些邮箱权限的设置。
0x03 Invoke-OpenInboxFinder
作为渗透测试人员,找到全世界都能访问的邮箱对我们是非常有价值的。这允许进行一些其他有趣的攻击媒介。一方面,我们可以搜索其他用户的电子邮件,来获取某些内容,例如密码或敏感数据,而无需其凭据。另一个攻击方面是,如果该用户的电子邮件地址与密码重置系统相关联,攻击者可以触发密码重置,然后访问包含密码重置链接的用户电子邮件。
我已经在MailSniper中添加了一个名为Invoke-OpenInboxFinder
的功能,以帮助查找具有设置允许其他用户访问的权限的邮箱。想使用它,我们首先要从目标环境中收集一个电子邮件地址列表。MailSniper有一个名为”Get-GlobalAddressList“的模块,可用于从Exchange服务器检索全局地址列表。它将尝试Outlook Web Access(OWA)和Exchange Web服务(EWS)的方法。此命令可用于从Exchange收集电子邮件列表:
Get-GlobalAddressList -ExchHostname mail.domain.com -UserName domain username -Password Spring2017 -OutFile global-address-list.txt
如果你处于可以与目标组织的内部Active Directory
域进行通信的系统上,也可以使用Harmj0y的PowerView来收集电子邮件列表。将PowerView脚本导入PowerShell会话并运行该脚本以获取电子邮件列表:
Get-NetUser | Sort-Object mail | ForEach-Object {$_.mail} | Out-File -Encoding ascii emaillist.txt
收集邮件列表以后,使用Invoke-OpenInboxFinder
功能可以一次检查一个邮箱,以确认当前用户是否可以访问。它还将检查Exchange中是否存在可能被访问的任何公共文件夹。
要使用Invoke-OpenInboxFinder
,需要将MailSniper PowerShell
脚本导入到PowerShell中:
Import-Module MailSniper.ps1
接下来,运行Invoke-OpenInboxFinder
函数:
Invoke-OpenInboxFinder
将尝试自动发现基于邮件服务器电子邮件列表中的第一个条目。如果失败,可以使用-ExchHostname
标志手动设置Exchange
服务器位置。
在下面的示例中,命令终端以名为”jeclipse
“的域名用户名运行。再从域中的电子邮件列表中运行Invoke-OpenInboxFinder
后,发现了两个公用文件夹。此外”jQuery
“可以访问”maximillian.veers@galacticempireinc.com
“的收件箱。Invoke-OpenInboxFinder
将会打印出每个项目的权限级别。在输出中可以看到”Default
“项设置为”Reviewer
“。
0x04 使用MailSniper搜索其他用户的邮箱
发现邮箱具有允许用户访问的过多权限之后,MailSniper可用于读取并搜索目标邮箱中的邮件。MailSniper的Invoke-SelfSearch
功能,以前主要用于搜索正在运行它的用户的邮箱。我稍作修改,以便能够检查另一个用户的电子邮件。这里需要指定一个名为”OtherUserMailbox
“的新标志来访问其他邮箱。该示例命令如下:
Invoke-SelfSearch -Mailbox target-email-address@domain.com -OtherUserMailbox
在下面的截图中,我使用”jeclipse
“账户搜索maximillian.veers@galactiempireinc.com
的邮箱。发现三个结果,其电子邮件的主题或主题中包含了密码或凭证。
0x05 Office365和对外开放的Exchange服务器
如果Exchange Web服务(EWS)可访问,Invoke-OpenInboxFinder
也可以在Internet上的Office365和对外开放的Exchange服务器使用。除非它对外设置了自动发现,否则可能需要使用-ExchHostname
手动指定主机名。要连接到Office365,主机名将是”outlook.office365.com
“,指定-Remote
标志让Invoke-OpenInboxFinder
提示可用于向远程EWS服务进行身份验证的凭据。
用于检查托管在Office365上的邮箱以获得广泛权限的示例命令如下:
Invoke-OpenInboxFinder -EmailList。 emaillist.txt -ExchHostname outlook.office365.com -Remote
以下是客户使用Office365时的实际评估截图。我们可以在组织中访问单个用户的凭据。通过使用从全局地址列表收集的电子邮件列表运行Invoke-OpenInboxFinder
,我们可以确定组织中的三个单独的账户允许我们的用户阅读他们的电子邮件。
0x06 建议
显然,防止攻击者访问有效的用户账户是防御的第一步。问题是,它不会阻止你当前的员工去使用这种技术来访问其他用户“UR”有权限访问的邮箱。另外要注意的是,你必须拥有一个有效的相关域账户,以检查是否可以访问他人的邮箱。
如果可能的话,限制这些类在Outlook客户端上的更改非常有帮助的。我已经找到了几篇旧的文章(2010)说明权限选项卡能够用GPO锁定。我没有尝试过这些文章上面说的任何解决方案,但这值得一试。你可以在这里和这里查看这些文章。
使用MailSniper中的Invoke-OpenInboxFinder功能,或使用Exchange上的 Get-MailboxFolderPermission cmdlet审核组织中所有帐户的设置。
0x07 结论
邮箱权限是红蓝和双方都应该注意的问题。通过Outlook在文件夹属性中包含“默认”权限项的方式,这使得用户更有可能错误地授予组织中的所有人对其邮箱进行访问。在红方角度来看,这可以提供在电子邮件中进一步查找访问网络密码或其他敏感数据的机会。蓝方角度则应该担心其一些高级账户(C-Suite类型)意外地与整个公司共享了邮箱,公司员工窥探其他员工,甚至通过这些渠道合法的进行修改邮箱等。
你可以从Github下载MailSniper: https://github.com/dafthack/mailsniper
exp利用工具:https://github.com/sensepost/ruler
参考文献:
https://sensepost.com/blog/2017/outlook-forms-and-shells/