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/

利用MailSniper越权访问Exchange邮箱的更多相关文章

  1. 逻辑漏洞介绍 & 越权访问攻击 & 修复建议

    介绍逻辑漏洞 逻辑漏洞就是指攻击者利用业务的设计缺陷,获取敏感信息或破坏业务的完整性.一般出现在密码修改.越权访问.密码找回.交易支付金额等功能处.其中越权访问又有水平越权和垂直越权两种,如下所示. ...

  2. (原创)AD账户误删导致Exchange邮箱被删 莫苦恼

    由于人员变动,离职人员AD账户和邮箱经常要删除.但是在删除AD账户的时候难免会犯错,将在用的用户给删除了,这是个痛苦的事情, 然后你会发现Exchange邮箱也会跟着删除,抓狂了..,还好,幸亏这里进 ...

  3. sharepoint获取exchange邮箱报错:该帐户无权模拟所请求的用户

    现象: sharepoint获取exchange邮箱报错:该帐户无权模拟所请求的用户 处理办法: 1.Open the Exchange Management Shell 2.输入: New-Mana ...

  4. [转]Thunderbird 使用 Exchange 邮箱

    [转]Thunderbird 使用 Exchange 邮箱 http://my.oschina.net/MaTech/blog/295238#OSC_h3_1 公司最近邮箱只支持Exchange模式, ...

  5. Winform 利用 Oracle.ManagedDataAccess访问Oracle数据库

    Winform 利用 Oracle.ManagedDataAccess访问Oracle数据库时出现以下错误: Message = "每个配置文件中只允许存在一个 <configSect ...

  6. 网络基础 利用vnc viewer访问在vmware虚拟机上的linux

    利用vnc viewer访问在vmware虚拟机上的linux by:授客 QQ:1033553122 Linux服务器为架设在VMware之上的虚拟机,那么可以直接使用VMware自带的vnc,而不 ...

  7. 【转】Java利用反射机制访问私有化构造器

    Java利用反射机制访问私有化构造器 博客分类: java   我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...

  8. 通达OA 越权访问-2013/2015版本

    漏洞参考 http://wiki.0-sec.org/0day/%E9%80%9A%E8%BE%BEoa/9.html 复现 根据⽹上的通达 OA的源码找这些敏感地址,如: /general/syst ...

  9. exchange邮箱的”单点登陆“

    在跟exchange集成登陆时,通常有这样的需求,用户需要点击邮件链接的时候直接打开,不再需要输入用户名密码,实现所谓的单点登陆. 通常有两种方式 1.form认证 登陆原理:用js模拟表单登陆 代码 ...

随机推荐

  1. 《算法图解》——第十章 K最近邻算法

    第十章    K最近邻算法 1 K最近邻(k-nearest neighbours,KNN)——水果分类 2 创建推荐系统 利用相似的用户相距较近,但如何确定两位用户的相似程度呢? ①特征抽取 对水果 ...

  2. Zabbix自动发现之fping

    原文发表于cu:2016-06-21 Zabbix自动发现功能从配置流程上比较简单:Discovery与Action. 在做Zabbix的自动发现验证时,使用"ICMP ping" ...

  3. Node2vec 代码分析

    Node2vec 代码从Github上clone到本地,主要是main.py和node2vec.py两个文件. 下面把我的读代码注释放到上面来, import numpy as np import n ...

  4. Alpha发布—文案+美工展示

    目录 团队简介 项目进展 组内分工 队员总结 后期计划 一.团队简介 二.项目进展 从选题发布到今天的Alpha发布,我们团队经历了许许多多的磨难.我们最终设计了如下的功能:首页.班级.个人.更多.打 ...

  5. 20172305 2018-2019-1 《Java软件结构与数据结构》第八周学习总结

    20172305 2018-2019-1 <Java软件结构与数据结构>第八周学习总结 教材学习内容总结 本周内容主要为书第十二章内容: 堆(附加属性的二叉树) 完全二叉树 (最小堆)对于 ...

  6. c# 消息机制

    1.windows系统是一个消息驱动的系统,windows本身有自己的消息队列. 系统传递消息给应用程序. 应用程序的消息机制:应用程序的执行是通过消息驱动的.消息是整个应用程序的工作引擎. 2.c# ...

  7. MacOS下安装BeautifulSoup库及使用

    BeautifulSoup简介 BeautifulSoup库是一个强大的python第三方库,它可以解析html进行解析,并提取信息. 安装BeautifulSoup 打开终端,输入命令: pip3 ...

  8. Hash开散列 拉链法

    #include<iostream> #include<cstdio> using namespace std; const int maxn=1000007; struct ...

  9. HttpCookie Class

    提供创建和操作各 HTTP Cookie 的类型安全方法. #region 写入指定Cookie的值 +static void WriteCookie(string cookieName, strin ...

  10. .net 错误处理

    第一步在页面中写OnError方法: protected override void OnError(EventArgs e) { Exception ex = Server.GetLastError ...