介绍MailSniper:搜索每个用户邮箱中敏感数据的工具
Beau Bullock //
内容提要
MailSniper是一款针对Microsoft Exchange环境的渗透测试工具,用于通过特定术语(密码、内部情报、网络架构信息等)搜索电子邮件。它可以作为非管理员用户搜索自己的电子邮件,也可以由Exchange管理员搜索域中每个用户的邮箱。
MailSniper可在此处下载:https://github.com/dafthack/MailSniper
概述
在渗透测试中,我们经常发现自己在一个组织内获得了提升的访问权限(域管理员)。有些公司认为获取域管理员权限就是最终目标而停止测试。但事实并非如此。如果你无法向高管层展示这种权限带来的风险,那么"获取域管理员权限"对大多数高管来说毫无意义。向组织展示风险的最佳方式之一是展示获取敏感数据的能力。不同组织的敏感数据差异很大,常见示例包括:客户信息、信用卡号、社会安全号码、员工信息、知识产权、工业控制系统/SCADA、医疗保健数据等。
根据2016年Mandiant M-Trends报告(PDF),2015年组织在被检测到入侵前的中位天数为146天。在如此长的时间内,攻击者可以缓慢而隐蔽地获得操作意识,确定组织认为的敏感数据,定位网络上的敏感数据,破坏敏感数据并最终将其外泄。作为渗透测试人员,当我们通常只有不到5天的时间完成评估时,如何向组织提供相同的风险展示?
在这篇博客文章中,我将详细介绍我开发的一个新工具,通过搜索每个员工的电子邮件中的特定术语来协助定位网络上的敏感数据。这个工具叫做MailSniper。
为什么要搜索电子邮件?
首先,已经有一些很好的工具可用于定位网络上的敏感数据。我在几乎每次参与中使用的我最喜欢的工具之一是Will Schroeder(@harmj0y)开发的PowerView(PS1)。PowerView能够定位网络上的可用共享(Invoke-ShareFinder),并搜索其中的文件(Invoke-FileFinder)以查找文件名中的特定术语。
搜索网络共享以查找包含敏感数据的文件对我来说多次证明是富有成果的。但情况并非总是如此。偶尔,我测试的网络规模太大,无法在测试窗口内完成每个网络共享的扫描。其他时候,可能存活主机的攻击面非常小,或者敏感数据根本没有存储在网络共享上。在这些情况下,以前我会采用更手动的方法来定位敏感数据,但这并不总是能让我获得它。
这让我开始思考我们还能做些什么来快速定位网络中的敏感数据。去年在DerbyCon与Derek Banks(@0xderuke)和Ethan Robish(@ethanrobish)讨论时,我们想到了搜索组织内部电子邮件的想法。电子邮件在大多数组织内部通常是最主要的消息系统,并且是日常业务闲聊、密码重置甚至企业战略的首选媒介。
在寻找敏感数据时,能够搜索电子邮件是非常强大的。例如,简单地在每封电子邮件的正文和主题中搜索术语"password“可能会返回如何访问某些系统以及使用什么凭据的说明。在能源公司,搜索”scada“或”industrial control system“可能会返回详细说明敏感ICS设备位置的对话。在金融机构,搜索”credit card“可能会揭示员工通过电子邮件以明文发送信用卡号码的位置。在医疗保健组织,搜索”SSN“或”Social Security number“可能会返回潜在的医疗保健数据。
这是一个真实世界的例子,在电子邮件中搜索术语”database“揭示了一个对话,其中系统管理员告诉他的团队他们内部KeePass数据库迁移到的位置以及密钥文件。
我将数据库和密钥文件复制到我的测试系统,并用KeePass打开它(当然不需要第二个因素)。我只需要与数据库在同一目录中的密钥文件。./facepalm)。这是一个金矿,几乎包含了你想要的组织中的所有凭据。所有数据库的’sa’密码、所有网络设备密码、登录其安全产品的密码、Windows管理密码、VPN组ID/密码等。
我们看到的大多数环境通常运行Microsoft Exchange作为电子邮件服务。Microsoft Exchange已经在服务器本身内置了一些搜索电子邮件的工具。从服务器上的Exchange Management Shell中,Search-Mailbox cmdlet具有一些搜索功能,但没有达到我想要的水平。因此,我开始构建一个新工具来实现我的目标,即能够搜索域中所有邮箱的特定术语。
MailSniper.ps1
可在此处获取:https://github.com/dafthack/MailSniper
为了实现我的目标,我决定开始构建一个名为MailSniper的工具,用PowerShell编写,原因如下:
- PowerShell脚本非常便携
- 已经存在一些用于连接到Exchange Web Services的基本脚本
从2007版开始的Microsoft Exchange Server实现了一个称为Exchange Web Services(EWS)的Web API。EWS允许对Exchange服务器进行远程Web调用以收集各种数据,包括日历、联系人和消息。从网络上的任何系统远程连接到Exchange的能力提供了高度灵活的搜索功能。
我希望这是一个可以从网络上的任何主机完全远程操作到Exchange服务器的工具,这意味着不需要交互式会话(RDP、VNC等)。在研究Exchange Web Services时,我发现了一些有趣的事情,这些最终导致开发了第二个功能。
我的最初目标是创建一个工具来搜索域中每个邮箱的特定术语。我没有考虑的Exchange Web Services的另一个非常有用的功能是仅搜索当前用户的电子邮件。由于这种可能性,我在MailSniper中创建了一个单独的功能。
MailSniper中的两个主要功能是Invoke-GlobalMailSearch和Invoke-SelfSearch。
Invoke-SelfSearch
Invoke-SelfSearch是一个功能,将简单地搜索当前用户邮箱中的术语。在渗透测试情况下搜索自己的电子邮件起初可能看起来并不那么有用。但当你开始考虑我们在参与过程中获得其他用户凭据的频率,并将其与从PowerShell脚本搜索他们的电子邮件的能力结合起来时,它就变得强大得多。它成为一个全新的权限提升向量。
例如,假设通过密码喷洒我们能够获得10个用户凭据的访问权限,但其中没有一个具有任何管理访问权限。通过搜索他们每个人的邮箱中的术语"password”、“creds"或"credentials”,我们很可能会找到许多包含允许我们访问其他帐户或系统的信息的对话。
要搜索当前用户的邮箱,首先使用’-exec bypass’选项打开PowerShell终端以绕过执行策略。然后,将MailSniper.ps1模块导入PowerShell终端,并运行以下Invoke-SelfSearch命令,其中包含你的用户的电子邮件地址:
|
|
此命令将连接到从输入的电子邮件地址自动发现的Exchange服务器,使用Exchange Web Services,默认情况下,将从"邮箱"中搜索100封最新电子邮件中的术语"pass"、"creds"、"credentials"。
默认情况下,Invoke-SelfSearch唯一必需的选项是-Mailbox选项。可以使用的完整选项列表包括:
- ExchHostname – 如果自动发现失败,要连接的Exchange服务器的主机名。
- Mailbox – 当前运行PowerShell进程的用户的电子邮件地址(即帐户可以搜索的唯一邮箱)。
- Terms – 要搜索每封电子邮件主题和正文的特定术语。默认情况下,脚本查找"password"、"creds"、"credentials"。
- ExchangeVersion – 为了与Exchange Web Services通信,必须指定正确版本的Microsoft Exchange Server。默认情况下,此脚本尝试"Exchange2010"。其他可尝试的选项是Exchange2007_SP1、Exchange2010、Exchange2010_SP1、Exchange2010_SP2、Exchange2013或Exchange2013_SP1。
- OutputCsv – 将搜索结果输出到CSV文件。
- MailsPerUser – 要在邮箱中搜索的最新电子邮件总数。默认设置为收件箱中的最新100封电子邮件。
Invoke-GlobalMailSearch
Invoke-GlobalMailSearch是一个功能,将搜索Exchange服务器上的所有邮箱。搜索每个邮箱的过程比仅搜索当前用户的邮箱要复杂一些。首先,仅获得域管理员帐户并不一定意味着你现在可以访问每个人的邮箱。默认情况下,“域管理员"组没有对Exchange上邮箱的"完全访问"权限。
对与Exchange相关的所有事物具有完全和绝对控制的帐户组是"Exchange组织管理员"组。(注意:此组名称在Exchange版本之间有所不同。在Exchange 2013中,该组称为"组织管理”)。为了使此脚本工作,你将需要该组中的一个帐户。在我运行的少数测试中,似乎"域管理员"有能力将此访问权限授予任何帐户。因此,如果典型的用户搜寻没有产生Exchange管理员帐户,你总是可以使用域管理员将自己的用户添加到该组。在域的工作站上,可以以域管理员身份运行以下命令将用户添加到"Exchange组织管理员"组:
|
|
在深入研究访问其他用户邮箱的过程中,我遇到了所谓的"ApplicationImpersonation"角色。“ApplicationImpersonation"角色是一个Microsoft Exchange服务器角色,当授予用户时,允许他们在访问邮箱时模拟其他用户。此角色可以在Exchange Management Shell中使用以下命令授予:
|
|
将此角色分配给我控制的用户允许访问其他用户的邮箱。需要Exchange Management Shell来进行此更改。这安装在Exchange服务器本身上。为了远程执行此操作,Invoke-GlobalMailSearch设置了一个PowerShell远程会话到Exchange服务器作为Exchange管理员,然后导入包括所有Exchange Management Shell命令的Microsoft.Exchange配置。
建立PS-Remoting会话后,Invoke-GlobalMailSearch授予通过-ImpersonationAccount选项传入的特定用户ApplicationImpersonation角色。授予此角色后,Invoke-GlobalMailSearch功能使用Exchange Management Shell命令’Get-Mailbox | Select Name -ExpandProperty EmailAddresses’创建Exchange数据库中所有邮箱的列表。也可以使用-MailList标志传入自定义电子邮件地址列表。
然后,Invoke-GlobalMailSearch使用具有模拟角色的帐户连接到Exchange Web Services,以从每个邮箱收集一定数量的电子邮件,并最终搜索它们以查找特定术语。默认情况下,脚本搜索”password"、"creds"、"credentials"。
要搜索Exchange服务器上的所有邮箱,将MailSniper.ps1模块导入PowerShell终端,然后运行以下命令,更改选项以匹配目标环境:
|
|
此命令将连接到位于’Exch01’的Exchange服务器,并提示输入管理凭据。输入管理凭据后,将设置到Exchange服务器的PS远程会话,然后将ApplicationImpersonation角色授予"current-username"用户。然后收集域中所有电子邮件地址的列表,随后作为"current-username"连接到Exchange Web Services,默认情况下,将从每个邮箱搜索100封最新电子邮件中的术语"pass"、"creds"、"credentials",并输出到名为global-email-search.csv的CSV文件。
输出的CSV应类似于下面的屏幕截图。
Invoke-GlobalMailSearch的另一个命令示例是:
|
|
此命令将连接到从输入的电子邮件地址自动发现的Exchange服务器,并使用命令行上传入的管理凭据自动登录。然后设置到Exchange服务器的PS-Remoting会话,然后将ApplicationImpersonation角色授予"current-username"用户。然后收集域中所有电子邮件地址的列表,随后使用Exchange版本’Exchange2010’作为"current-username"连接到Exchange Web Services,其中将从每个邮箱搜索1,000封最新电子邮件中的术语"passwords"、"super secret"、"industrial control systems"、"scada"、"launch codes",并输出到名为example2search.csv的CSV。
可以与Invoke-GlobalMailSearch一起使用的完整选项列表包括:
- ImpersonationAccount – 当前运行PowerShell进程的用户帐户的用户名。此用户将被授予Exchange上的ApplicationImpersonation角色。
- ExchHostname – 如果自动发现失败,要连接的Exchange服务器的主机名。
- AutoDiscoverEmail – 将用于自动发现Exchange服务器位置的有效电子邮件地址。
- AdminUserName – 包括域的Exchange管理员的用户名(即domain\adminusername)。
- AdminPassword – 使用AdminUserName指定的Exchange管理员帐户的密码。
- Terms – 要搜索每封电子邮件主题和正文的特定术语。默认情况下,脚本查找"password"、"creds"、"credentials"。
- ExchangeVersion – 为了与Exchange Web Services通信,必须指定正确版本的Microsoft Exchange Server。默认情况下,此脚本尝试"Exchange2010"。其他可尝试的选项是Exchange2007_SP1、Exchange2010、Exchange2010_SP1、Exchange2010_SP2、Exchange2013或Exchange2013_SP1。
- OutputCsv – 将搜索结果输出到CSV文件。
- MailsPerUser – 要在邮箱中搜索的最新电子邮件总数。默认设置为收件箱中的最新100封电子邮件。
- EmailList – 列出要搜索的电子邮件地址的文本文件(每行一个)。
演示视频
结论
现在能够搜索域中的每个邮箱,使我们作为渗透测试人员能够更快地发现网络上的敏感数据。它也可能被证明对提升权限有用。从蓝队的角度来看,它甚至可以定期用于检查员工是否在发送违反公司政策的敏感信息。截至此博客文章,MailSniper仍处于测试阶段,正在开发中。该工具的一些未来目标也已经规划出来。
在此处下载MailSniper:https://github.com/dafthack/MailSniper