风尘剑心 发布于2022年11月8日 分享 发布于2022年11月8日 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列表-表格 结果如下 从图中可以得到,所有用户对应的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.通过Offline Address Book (OAB) 流程如下: (1)读取Autodiscover配置信息 要访问的URL:https:///auto discover/auto discover . XML 注: 你需要寄一个特定的邮包。详情请参考文章《渗透基础——Exchange Autodiscover的使用》。 从配置信息中获取OABUrl (2)读取OAB文件列表 要访问的URL:OA burl/OAB . XML 结果包括多个OAB文件的列表,如下图所示 找到默认全局通讯录对应的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 结果如下 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邮件: 如下图 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 如下图 Windows系统是用C#实现的: 通过调用名称空间系统可以很容易地实现相同的操作。DirectoryServices,代码已经上传到github,地址如下: https://github . com/3g student/Homework-of-C-Sharp/blob/master/listusermailbydap . cs 如下图 (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 如下图 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.通过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的方法。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子