Good in study, attitude and health

  • Windows Communication Foundation开发指南2——禁用元数据发布

    0x00 前言 本文将要介绍在禁用元数据发布(MEX)时WCF开发的相关内容,给出文章《Abusing Insecure Windows Communication Foundation (WCF) Endpoints》的完整代码示例。 0x01 简介 本文将要介绍以下内容: 禁用MEX实现WCF 文章完整代码示例 0x02 禁用MEX实现WCF 禁用MEX时,需要根据服务端的代码手动编写客户端代码 本节采用命令行实现WCF的方式作为示例 开发工具:Visual Studio 2015 1.服务端编写 (1)新建项目 选择Visual C#->Console Application,名称为NBTServer (2)新建WCF服务 选择Add->New Item...,选择WCF Service,名称为Service1.cs (3)修改service1.cs 添加DoWork的实现代码,代码示例: namespace NTBServer { public class Service1 : IService1 { public void DoWork() { System.Diagnostics.Process.Start("calc.exe"); } } } (4)修改Program.cs...

  • Windows Communication Foundation开发指南1——启用元数据发布

    0x00 前言 Windows Communication Foundation (WCF)是用于在.NET Framework中构建面向服务的应用程序的框架。本文将要介绍WCF开发的相关内容,为后续介绍的内容作铺垫。 0x01 简介 本文将要介绍以下内容: 使用basicHttpBinding实现WCF 使用NetTcpBinding实现WCF 通过命令行实现WCF 通过IIS实现WCF 通过服务实现WCF 0x02 基础知识 参考资料: https://docs.microsoft.com/en-us/dotnet/framework/wcf/whats-wcf 常用的传输协议: HTTP,http://localhost:8080/ TCP,net.tcp://localhost:8080/ IPC,net.pipe://localhost/ 常用的Binding: BasicHttpBinding WSHttpBinding NetTcpBinding NetNamedPipeBinding 元数据发布(metadata exchange),简称MEX WCF默认禁用MEX,这样能够避免数据泄露 本着逐步深入的原则,本系列文章选择先介绍开启MEX的用法,这样能够提高客户端开发的效率,禁用MEX的用法将放在下篇文章进行介绍。 0x03 使用basicHttpBinding实现WCF 本节采用命令行实现WCF的方式作为示例 开发工具:Visual Studio 2015 1.服务端编写 (1)新建项目 选择Visual C#->Console Application,名称为basicHttpBindingWCFServer (2)新建WCF服务 选择Add->New Item...,选择WCF Service,名称为Service1.cs (3)修改service1.cs 添加DoWork的实现代码,代码示例: using...

  • Java利用技巧——通过JNI加载dll

    0x00 前言 Java可以通过JNI接口访问本地的动态连接库,从而扩展Java的功能。本文将以Tomcat环境为例,介绍通过jsp加载dll的方法,开源代码,记录细节。 0x01 简介 本文将要介绍以下内容: 基础知识 Java通过JNI加载dll的方法 jsp通过JNI加载dll的方法 0x02 基础知识 JNI,全称Java Native Interface,是Java语言的本地编程接口。可以用来调用dll文件 调用JNI接口的步骤: 编写Java代码,注明要访问的本地动态连接库和本地方法 编译Java代码得到.class文件 使用javah生成该类对应的.h文件 使用C++实现函数功能,编译生成dll 通过Java调用dll 0x03 Java通过JNI加载dll的方法 本节将要实现通过Java加载dll,在命令行输出"Hello World" 1.编写Java代码,注明要访问的本地动态连接库和本地方法 HelloWorld.java: public class HelloWorld { private native void print(); static { System.loadLibrary("Hello"); } public static void main(String[] args) { new HelloWorld().print(); } } 注: 也可以使用System.load指定加载dll的绝对路径,代码示例:System.load("c:\\test\\Hello.dll");...

  • 渗透基础——Windows Defender

    0x00 前言 Windows Defender是一款内置在Windows操作系统的杀毒软件程序,本文仅在技术研究的角度介绍Windows Defender相关的渗透方法,分析利用思路,给出防御建议。 0x01 简介 本文将要介绍以下内容: 查看Windows Defender版本 查看已存在的查杀排除列表 关闭Windows Defender的Real-time protection 添加查杀排除列表 移除Token导致Windows Defender失效 恢复被隔离的文件 0x02 查看Windows Defender版本 1.通过面板查看 依次选择Windows Security->Settings->About,Antimalware Client Verions为Windows Defender版本,如下图 2.通过命令行查看 dir "C:\ProgramData\Microsoft\Windows Defender\Platform\" /od /ad /b 数字大的为最新版本 0x03 查看已存在的查杀排除列表 1.通过面板查看 依次选择Windows Security->Virus & theat protection settings->Add or remove exclusions,如下图 2.通过命令行查看 reg query...

  • Java利用技巧——通过反射实现webshell编译文件的自删除

    0x00 前言 我们知道,当我们访问jsp文件时,Java环境会先将jsp文件转换成.class字节码文件,再由Java虚拟机进行加载,这导致了Java服务器上会生成对应名称的.class字节码文件。对于webshell,这会留下痕迹。 为了实现自删除.class字节码文件,我们可以通过反射获得.class字节码文件的路径,再进行删除。本文将以Zimbra环境为例,结合AntSword-JSP-Template,分析利用思路。 0x01 简介 本文将要介绍以下内容: 通过反射实现webshell编译文件的自删除 通过反射实现AntSword-JSP-Template 0x02 通过反射实现webshell编译文件的自删除 根据上篇文章《Java利用技巧——通过反射修改属性》的内容,我们按照映射request->_scope->_servlet->rctxt->jsps,通过多次反射最终能够获得JspServletWrapper实例 查看JspServletWrapper类中的成员,jsps->value->ctxt->servletJavaFileName保存.java编译文件的路径,jsps->value->ctxt->classFileName保存.class编译文件的路径,示例如下图 为了只筛选出当前jsp,可以通过request类的getServletPath()方法获得当前Servlet,如下图 从ctxt对象获取servletJavaFileName可以调用JspCompilationContext类的getServletJavaFileName()方法,如下图 从ctxt对象获取classFileName可以调用JspCompilationContext类的getClassFileName()方法,如下图 综上,由此我们可以得出通过反射获取编译文件路径的实现代码如下: <%@ page import="java.lang.reflect.Field" %> <%@ page import="java.util.concurrent.ConcurrentHashMap" %> <%@ page import="java.util.*" %> <%@ page import="org.apache.jasper.servlet.JspServletWrapper" %> <%@ page import="org.apache.jasper.JspCompilationContext" %> <% Field f = request.getClass().getDeclaredField("_scope"); f.setAccessible(true); Object obj1 = f.get(request); f = obj1.getClass().getDeclaredField("_servlet");...

  • Java利用技巧——通过反射修改属性

    0x00 前言 在上篇文章《Zimbra漏洞调试环境搭建》提到了通过反射枚举JspServletWrapper实例的实现,本文将要以此为例,详细介绍实现的思路和细节,便于以此类推,实现其他功能。 0x01 简介 本文将要介绍以下内容: 反射中的常用操作 获得类的所有字段 获得类的所有方法 调用类的方法 枚举JspServletWrapper实例的实现细节 0x02 反射中的常用操作 1.获得类的所有字段 getField(): 能够获取本类以及父类中的public字段 getDeclaredField(): 能够获取本类中的所有字段 这里以Zimbra环境为例,给出示例代码 (1)获取request对象的所有字段 <%@ page import="java.lang.reflect.Field" %> <% Field[] fields=request.getClass().getDeclaredFields(); for (int i = 0; i < fields.length; i++) { out.println(fields[i].getName() + "<br>"); } %> (2)获取request对象的父类的所有字段 <%@ page import="java.lang.reflect.Field" %> <% Field[] fields=request.getClass().getSuperclass().getDeclaredFields();...

  • Zimbra漏洞调试环境搭建

    0x00 前言 本文记录从零开始搭建Zimbra漏洞调试环境的细节。 0x01 简介 本文将要介绍以下内容: Zimbra服务器开启调试模式 本地使用IDEA进行远程调试 常用知识 0x02 Zimbra服务器开启调试模式 相关资料: https://github.com/Zimbra-Community/zimbra-tools/blob/master/java-debug-zimbra-intellij-ide.md 详细步骤如下: 1.停止Zimbra服务 su zimbra zmcontrol stop 2.开启调试模式 su cp /opt/zimbra/libexec/zmmailboxdmgr /opt/zimbra/libexec/zmmailboxdmgr.old cp /opt/zimbra/libexec/zmmailboxdmgr.unrestricted /opt/zimbra/libexec/zmmailboxdmgr 此处先备份zmmailboxdmgr,再使用zmmailboxdmgr.unrestricted替换zmmailboxdmgr 3.添加调试信息 su zimbra zmlocalconfig -e mailboxd_java_options="`zmlocalconfig -m nokey mailboxd_java_options` -Xdebug -Xnoagent -Djava.compiler=NONE -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000" 注: 也可以直接修改/opt/zimbra/conf/localconfig.xml中的mailboxd_java_options属性值 4.关闭防火墙 sudo ufw disable 5.重启服务 zmcontrol start...

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

    0x00 前言 在之前的文章《渗透基础——Exchange一句话后门的实现》和《渗透基础——Exchange一句话后门的扩展》介绍了通过Webshell内存加载.net程序集的方法。 如果同其他技术相结合,可以达到意想不到的效果。 本文仅在技术研究的角度点到为止,开源一份简单的测试代码,结合利用思路给出防御建议。 0x01 简介 本文将要介绍以下内容: 思路启发 开源代码 检测方法 0x02 思路启发 1.Exchange的端口复用 参考资料: http://www.zcgonvh.com/post/analysis_of_CVE-2020-17144_and_to_weaponizing.html https://docs.microsoft.com/en-us/dotnet/api/system.net.httplistener?view=net-5.0 通过调用HTTP API进行端口复用,劫持EWS某个未被注册的端点供外部访问 这种方法可以在Exchange下建立一个监听器,执行提供的命令 2.通过C Sharp调用JScript 参考资料: https://peterjson.medium.com/some-notes-about-microsoft-exchange-deserialization-rce-cve-2021-42321-110d04e8852 https://docs.microsoft.com/en-us/dotnet/api/microsoft.jscript.vsa?view=netframework-4.8 示例代码test1.cs的内容如下: using System; namespace test { public class Program { public static void Main(string[] args) { string code = "new ActiveXObject(\"WScript.Shell\").exec(\"cmd.exe /c whoami \").stdout.readall()"; Microsoft.JScript.Vsa.VsaEngine...

  • Exchange Web Service(EWS)开发指南6——requests_ntlm

    0x00 前言 在之前的文章《Exchange Web Service(EWS)开发指南4——Auto Downloader》和《Exchange Web Service(EWS)开发指南5——exchangelib》介绍了两种利用hash访问Exchange资源的方法,各有特点。 前者采用了较为底层的通信协议,在功能实现上相对繁琐,但是有助于理解通信协议原理和漏洞利用。后者借助第三方库exchangelib,开发便捷,但是不太适用于漏洞利用。 站在漏洞利用的角度,如果仅使用封装NTLM认证的第三方包,既不影响漏洞利用,又能兼顾效率。 所以本文选取了第三方包requests_ntlm,以自动化下载邮件和提取附件为例,开源代码,介绍用法。 0x01 简介 本文将要介绍以下内容: requests_ntlm用法 开发细节 开源代码 0x02 requests_ntlm用法 说明文档: https://github.com/requests/requests-ntlm 1.两种登录方法 我在低于1.0.0版本的requests_ntlm.py找到了使用Hash登录的方法,代码位置: https://github.com/requests/requests-ntlm/blob/v0.3.0/requests_ntlm/requests_ntlm.py#L16 这里可以找到使用Hash登录的参数格式为ABCDABCDABCDABCD:ABCDABCDABCDABCD 两种登录Exchange的示例代码如下: (1)明文登录 target = "192.168.1.1" username = "administrator@test.com" password = "password1" res = requests.post("https://" + target + "/ews/exchange.asmx", data=POST_BODY, headers=headers, verify=False, auth=HttpNtlmAuth(username, password)) print(res.status_code) print(res.text)...

  • vSphere开发指南6——vCenter SAML Certificates

    0x00 前言 我最近学到的一个利用方法:在vCenter上使用管理员权限,从/storage/db/vmware-vmdir/data.mdb提取IdP证书,为管理员用户创建SAML请求,最后使用vCenter server进行身份验证并获得有效的管理员cookie。 直观理解:从vCenter本地管理员权限到VCSA管理面板的管理员访问权限。 学习资料: https://www.horizon3.ai/compromising-vcenter-via-saml-certificates/ https://github.com/horizon3ai/vcenter_saml_login 本文将要在学习资料的基础上,完善代码,增加通用性,结合利用思路给出防御建议。 0x01 简介 本文将要介绍以下内容: 方法复现 脚本优化 利用思路 防御建议 0x02 方法复现 在Kali系统下进行测试 安装Openssl: apt install python3-openssl 1.从vCenter获得数据库文件 路径:/storage/db/vmware-vmdir/data.mdb 需要vCenter管理员权限 2.运行脚本 下载地址: https://github.com/horizon3ai/vcenter_saml_login/blob/main/vcenter_saml_login.py 命令参数示例: python3 ./vcenter_saml_login.py -t 192.168.1.1 -p data.mdb 命令行返回结果: JSESSIONID=XX533CDFA344DE842517C943A1AC7611 3.登录VCSA管理面板 访问https://192.168.1.1/ui 设置Cookie: JSESSIONID=XX533CDFA344DE842517C943A1AC7611 成功以管理员身份登录管理面板 0x03 脚本优化 通常data.mdb的大小至少为20MB 为了减少交互流量,选择将vcenter_saml_login.py修改成能够直接在vCenter下使用 注: vCenter默认安装Python 在脚本修改上具体需要考虑以下问题:...