介绍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个用户凭据,但 none of them have any administrative access。通过搜索他们每个邮箱中的“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服务器上的所有邮箱。搜索每个邮箱的过程比仅搜索当前用户的邮箱复杂一些。首先,仅获得域管理员账户并不一定意味着你现在可以访问每个人的邮箱。默认情况下,“Domain Admins”组没有对Exchange上邮箱的“完全访问”权限。
对Exchange相关一切具有完全控制的账户组是“Exchange Organization Administrators”组。(注意:此组名称因Exchange版本而异。在Exchange 2013中,该组称为“Organization Management”)。为了使此脚本工作,你需要该组中的一个账户。在我运行的少数测试中,似乎“Domain Admins”有能力将此访问权限授予任何账户。因此,如果典型的用户狩猎没有 yield you an Exchange admin account,你总是可以 resort to adding your own user to the group with a DA。从域上的工作站,可以以域管理员身份运行以下命令将用户添加到“Exchange Organization Administrators”组:
|
|
在深入研究访问其他用户邮箱时,我遇到了所谓的“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服务器,并提示输入管理凭据。输入管理凭据后,将设置一个PS远程会话到Exchange服务器,其中ApplicationImpersonation角色 then granted to the “current-username” user。然后收集域中所有电子邮件地址的列表,随后作为“current-username”连接到Exchange Web Services,默认情况下,将搜索每个邮箱中最新的100封邮件,查找“pass”、“creds”、“credentials”等术语,并输出到名为global-email-search.csv的CSV文件。
输出的CSV应类似于下面的屏幕截图。
Invoke-GlobalMailSearch的另一个示例命令是:
|
|
此命令将连接到从输入的电子邮件地址自动发现的Exchange服务器,并使用命令行上传入的管理凭据自动登录。然后设置一个PS-Remoting会话到Exchange服务器,其中ApplicationImpersonation角色 then granted to the “current-username” user。然后收集域中所有电子邮件地址的列表,随后使用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