跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

渗透技巧——获取Exchange GlobalAddressList的方法


风尘剑心

推荐的帖子

0x00 前言

Exchange的GlobalAddressList包含Exchange组织中所有邮箱用户的电子邮件地址。只要获得Exchange组织中任何邮箱用户的凭据,就可以通过全局地址列表导出其他邮箱用户的电子邮件地址。

本文将介绍渗透测试中不同条件下获取Exchange GlobalAddressList的常用方法,分享程序实现细节,最后介绍禁用GlobalAddressList的方法。

0x01 简介

本文将介绍以下内容:

一种获取Exchange全局地址列表的方法

程序实现

禁用GlobalAddressList的方法

0x02 获得Exchange GlobalAddressList的方法

1.通过Outlook Web Access(OWA)

要获得邮件用户的明文密码,在登录OWA后,选择联系人-所有用户。

2.通过Exchange Web Service(EWS)

对于Exchange 2013和更高版本,可以使用FindPeople操作。

参考资料:

https://docs . Microsoft . com/en-us/exchange/client-developer/we B- service-reference/find people-operation?重定向自=MSDN

这里需要注意的是,在FindPeople操作过程中必须指定搜索条件,不能通过通配符直接获得所有结果。

变通解决方案:

遍历26个字母a-z作为搜索条件,可以覆盖所有结果。

对于Exchange2010和早期版本,只能使用ResolveName操作。

参考资料:

https://docs . Microsoft . com/en-us/dot net/API/Microsoft . exchange . web services . data . exchangeservice . resolve name?redirectedfrom=MSDNview=exchange-EWS-API

这里应该注意的是,ResolveName操作一次最多只能得到100个结果。如果GlobalAddressList中的邮箱用户大于100,则无法直接获得完整的结果。

变通解决方案:

在使用ResolveName操作时,添加搜索条件以确保每次获得的结果可以少于100,然后通过多次搜索覆盖所有结果。

常用方法:

搜索条件是任意两个字母的组合,如aa,ab,ac…zz,总共26*26=676次搜索,大体上可以覆盖所有结果。

3.通过Outlook客户端使用的协议(MAPI OVER HTTP和RPC over HTTP)

登录,选择联系人-通讯录。

Outlook客户端通常使用的协议有RPC、RPC over HTTP(也称为Outlook Anywhere)和MAPI over HTTP。

Ruler可以通过MAPI OVER HTTP读取GlobalAddressList(暂时不支持RPC over HTTP)。

注:

MAPI over HTTP是在exchange server 2013 service pack 1(SP1)中实现的新传输协议,用于取代RPC OVER HTTP(也称为Outlook Anywhere)。

Exchange2013默认情况下不启用MAPI OVER HTTP,而是使用RPC OVER HTTP,需要手动打开。

Exchange2016中默认情况下启用HTTP上的MAPI。

可以使用ptswarm的Exchanger.py通过RPC over HTTP读取GlobalAddressList。

参考资料:

https://swarm . pt security . com/attaming-ms-exchange-we B- interfaces/

流程如下:

(1)列出AddressList

命令示例:

python exchange . py 192 . 168 . 1 . 1/test1:domain user 123!@test.com nspi列表-表格

结果如下

4-1.png

从图中可以得到,所有用户对应的guid是5cb 80229-e2b 4-4447-b224-dc2c 12098835。

(2)读取AddressList

命令示例:

python exchange . py 192 . 168 . 1 . 1/test1:domain user 123!@ test . com nspi dump-tables-guid 5cb 80229-e2b 4-4447-b224-dc2c 12098835

结果如下

4-2.png

4.通过Offline Address Book (OAB)

流程如下:

(1)读取Autodiscover配置信息

要访问的URL:https:///auto discover/auto discover . XML

注:

你需要寄一个特定的邮包。详情请参考文章《渗透基础——Exchange Autodiscover的使用》。

从配置信息中获取OABUrl

(2)读取OAB文件列表

要访问的URL:OA burl/OAB . XML

结果包括多个OAB文件的列表,如下图所示

3-1.png

找到默认全局通讯录对应的lzx文件名,lzx文件名为4667 c322-5c 08-4c da-844 a-253 ff 36 B4 a6 a-data-5 . lzx。

(3)下载lzx文件

要访问的URL:OA burl/xx . lzx

对于上面的例子,lzx文件的下载地址是:https://192 . 168 . 1 . 1/OAB/9 e3fa 457-EB f1-40 E4-B265-21d 09 a 62872 b/4667 c322-5c 08-4c da-844 a-253 ff 36 B4 A6A。

(4)对lzx文件解码,还原出Default Global Address List

这里需要使用工具oabextract。

下载后需要安装。

编译Kali下可以直接使用的版本。下载地址:http://x2100.icecube.wisc.edu/downloads/python/python 2.6 . Linux-x86 _ 64 . gcc-4 . 4 . 4/bin/oaba xtract

将lzx文件转换为oab文件的命令示例:

OAB extract 4667 c322-5c 08-4c da-844 a-253 ff 36 B4 a6a-data-5 . lzx gal . OAB

提取GAL的命令示例:

字符串gal.oab|grep SMTP

结果如下

3-2.png

5.通过LDAP

需要能够访问域控制器的LDAP服务(端口389)。

通常情况下,Exchange邮箱用户和域用户是有对应关系的,所以可以根据域用户的信息得到Exchange邮箱用户的信息。

(1)从域外进行查询

需要域用户的明文密码。

Kali系统通过ldapsearch获取所有用户电子邮件地址的命令示例:

LDAP search-x-H LDAP://192 . 168 . 1 . 1:389-D ' CN=testa,CN=Users,DC=test,DC=com' -w DomainUser123!-b ' DC=测试,DC=com' |grep邮件:

如下图

1-1.png

Windows系统通过PowerView获取所有用户电子邮件地址的命令示例:

$uname='testa '

$ pwd=convert to-secure string ' domain user 123!'-AsPlainTextForce

$ cred=新对象系统。management . automation . PS credential($ uname,$pwd)

get-net user-Domain test.com-Domain controller 192 . 168 . 1 . 1-ADSpath ' LDAP://DC=test,DC=com' -Credential $cred | fl mail

如下图

1-2.png

Windows系统是用C#实现的:

通过调用名称空间系统可以很容易地实现相同的操作。DirectoryServices,代码已经上传到github,地址如下:

https://github . com/3g student/Homework-of-C-Sharp/blob/master/listusermailbydap . cs

如下图

1-3.png

(2)从域内进行查询

从域外进行查询的所有方法都适用,此时不需要域用户的凭据。

还可以使用PSSession连接到Exchange服务器,然后通过Exchange命令行管理程序进行查询。

命令示例:

$User='测试\管理员'

$ Pass=convert to-secure string-asplaint ext domain admin 123!-力量

$Credential=新对象系统。management . automation . PS credential-argument list $ User,$Pass

$ Session=New-PS Session-configuration name Microsoft。exchange-连接uri http://Exchange01.test.com/PowerShell/-身份验证Kerberos-凭据$Credential

import-PS Session $ Session-allow clobber

get-Mailbox | fl PrimarySmtpAddress

删除-PSSession $Session

如下图

1-4.png

0x03 通过Exchange Web Service(EWS)获得GlobalAddressList的实现代码

1.Powershell

需要明文密码。

https://github.com/dafthack/MailSniper

需要PowerShell版本3.0

支持FindPeople操作和ResolveName操作。

注:

查找操作由owa实现。

ResolveName操作由ews实现。

2.Python

需要明文密码或NTLM哈希

(1)FindPeople操作

参考资料:

https://docs . Microsoft . com/en-us/exchange/client-developer/we B- service-reference/find people-operation?重定向自=MSDN

它只能在Exchange Server 2013或更高版本中使用。

XML格式示例:

?xml版本='1.0 '编码='utf-8 '?

试验

搜索字符串测试,其中最大查询结果数为1000。

为了覆盖所有结果,搜索字符串需要遍历26个字母a-z,并且对返回的结果进行重复数据删除。

完整的代码,请参考我在ewsManage中新增的findallpeople函数。

(2)ResolveName操作

XML格式示例:

?xml版本='1.0 '编码='utf-8 '?

试验

搜索字符串测试,这里返回的查询结果最多100个。

为了覆盖所有结果,搜索条件是两个字母的任意组合,如aa,ab,ac…zz,而搜索总数是26*26=676。一般情况下,可以覆盖所有结果,返回的结果将进行重复数据删除。

这里需要注意的是,如果某个搜索条件得到的返回结果是100,那么代表这个搜索条件的结果可能是不完整的(实际上是大于100的,只得到100),需要再次划分才能进行第三级遍历。通过读取返回内容的TotalItemsInView项可以获得结果。

完整代码请参考我在ewsManage中新增的resolveallname函数。

0x04 禁用GlobalAddressList的方法

您可以选择是否指定用户是否隐藏在GlobalAddressList中。

1.通过Exchange admin center(EAC)

使用Exchange管理员登录到Exchange控制面板(ECP)

选择指定的用户,选择常规,然后选择从地址列表中隐藏,如下图所示

2-1.png

2.通过Exchange Management Shell

隐藏用户的命令:

set-mail contact-hiddenfromdaddresslistsenabledtrue-Identity test1

隐藏所有用户的命令:

get-mail contact | Set-mail contact-hiddenfromdaddresslistsenabled $ true

0x05 小结

介绍了不同情况下获取Exchange GlobalAddressList的常用方法,并分别通过ews的FindPeople操作和ResolveName操作编写程序导出GlobalAddressList。最后,介绍了禁用GlobalAddressList的方法。

留下回复

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...