Good in study, attitude and health

  • Zimbra-SOAP-API开发指南4——邮件导出和文件夹共享

    0x00 前言 本文将要继续扩充开源代码Zimbra_SOAP_API_Manage的功能,实现邮件导出和文件夹共享,分享开发细节。 0x01 简介 本文将要介绍以下内容: 邮件导出 文件夹共享 开源代码 0x02 邮件导出 Zimbra支持导出当前邮箱的所有邮件,通过Web界面的操作方法如下: 登录邮箱后,依次选择Preferences->Import/Export,如下图 接下来,通过抓包的方式分析实现流程,进而使用程序实现这部分功能 1.默认配置导出邮件 默认配置下,会导出所有邮件,以压缩包的形式保存 访问URL示例: https://192.168.1.1/home/admin%40test.com/?fmt=tgz&filename=All-2022-07-27-181056&emptyname=No+Data+to+Export&charset=UTF-8&callback=ZmImportExportController.exportErrorCallback__export1 参数解析: admin%40test.com为邮箱用户,可以用~替代 filename=All-2022-07-27-181056为存在记录时保存的文件名,2022-07-27-181056对应的时间格式为年-月-日-时分秒,时间为带时区的时间,需要计算时差 emptyname=No+Data+to+Export为空记录时保存的文件名 在程序实现上,需要同Web操作的格式保持一致,代码细节: (1)构造保存的文件名 from time import localtime, strftime exporttime = strftime("%Y-%m-%d-%H%M%S", localtime()) filename = "All-" + str(exporttime) print(filename) (2)保存文件 保存文件时使用binary写入 with open(path, 'wb+') as file_object: file_object.write(r.content) 实现代码示例: def exportmailall_request(uri,token,mailbox):...

  • Java利用技巧——AntSword-JSP-Template的优化

    0x00 前言 在之前的文章《Java利用技巧——通过反射实现webshell编译文件的自删除》曾介绍了通过反射实现AntSword-JSP-Template的方法。对于AntSword-JSP-Template中的shell.jsp,访问后会额外生成文件shell_jsp$U.class。《Java利用技巧——通过反射实现webshell编译文件的自删除》中的方法,访问后会额外生成文件shell_jsp$1.class。 在某些特殊环境下,需要避免额外生成.class文件。本文将以Zimbra环境为例,介绍实现方法,开源代码,记录细节。 0x01 简介 本文将要介绍以下内容: 实现思路 实现代码 0x02 实现思路 基于《Java利用技巧——通过反射实现webshell编译文件的自删除》中的方法,访问后会额外生成文件shell_jsp$1.class,这里可以通过构造器避免额外生成.class文件。 在具体使用过程中,需要注意如下问题: (1)反射机制中的构造器 正常调用的代码: str=new String(StringBuffer); 通过反射实现的代码: Constructor constructor=String.class.getConstructor(StringBuffer.class); String str=(String)constructor.newInstance(StringBuffer); (2)选择合适的defineClass()方法 在ClassLoader类中,defineClass()方法有多个重载,可以选择一个可用的重载 本文选择defineClass(byte[] b, int off, int len) (3)SecureClassLoader 使用构造器时,应使用SecureClassLoader,而不是ClassLoader 示例代码: Constructor c = SecureClassLoader.class.getDeclaredConstructor(ClassLoader.class); 0x03 实现代码 为了方便比较,这里给出每种实现方法的代码: (1)test1.jsp 来自AntSword-JSP-Template中的shell.jsp,代码如下: <%! class U extends ClassLoader { U(ClassLoader c)...

  • Sophos XG防火墙身份验证绕过漏洞(CVE-2022-1040)利用分析

    0x00 前言 CVE-2022-1040是一个Sophos XG防火墙的身份验证绕过漏洞,漏洞细节可参考《CVE-2022-1040 Sophos XG Firewall Authentication bypass》,本文仅在此文章的基础上补全文中未提到的技术细节。 0x01 简介 本文将要介绍以下内容: 本地恢复带有漏洞的调试环境 OpCode的寻找方法 WAN和VPN区域的利用思路 开启login disclaimer切断利用链 0x02 本地恢复带有漏洞的调试环境 在本地搭建漏洞环境时,如果自动更新了补丁,可通过以下方式恢复成带有漏洞的调试环境: 编辑文件/usr/share/webconsole/WEB-INF/web.xml 定位以下内容: <filter> <filter-name>RequestCheckFilter</filter-name> <filter-class>cyberoam.sessionmanagement.RequestCheckFilter</filter-class> </filter> <filter-mapping> <filter-name>RequestCheckFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 这里使用RequestCheckFilter用来过滤request请求中JSON参数是否包含不可见字符 可以手动删除以上代码,恢复成带有漏洞的调试环境 无法直接修改文件/usr/share/webconsole/WEB-INF/web.xml 在修改文件前需要重新挂载:mount -o remount,rw / 再次修改文件即可 0x03 OpCode的寻找方法 原文中提到:CSC端大概有1200种模式在运行,其中有161种模式的响应类型为2 这里可以通过反编译EventBean.class找到如下代码: select opcode,mode,waitforresponse,operationtype,responsetype,requesttype,opcodetype,responsetimeout,entityid,beanname,syncable,comprotocol,query,requestname from tblcrevent order by mode 经过分析后,响应类型对应的应该为requesttype,而不是responsetype...

  • Sophos XG漏洞调试环境搭建

    0x00 前言 Sophos UTM和Sophos XG是两款不同的产品,前者偏向于通用威胁管理,后者偏向于硬件防火墙。本文将要介绍Sophos XG漏洞调试环境的搭建方法。 0x01 简介 本文将要介绍以下内容: 环境搭建 jetty调试环境搭建 csc配置文件解密 Postgresql数据库查询 0x02 基础知识 架构如下图 注: 图片引用自https://codewhitesec.blogspot.com/2020/07/sophos-xg-tale-of-unfortunate-re.html 总的来说,分为以下三部分: Jetty:处理Web数据,将数据转发至csc作进一步处理 csc:主程序:加载Perl Packages,实现主要功能 Postgresql:用来存储数据 我在实际研究过程中,这三部分遇到了以下问题: Jetty:添加调试信息后无法启动java csc:csc加载Perl Packages后会自动删除,无法获得Perl Packages的实现细节 Postgresql:用户权限低,无法查询数据库表 下面将要逐个介绍三个问题的解决方法 0x03 环境搭建 参考资料: https://docs.sophos.com/nsg/sophos-firewall/18.5/Help/en-us/webhelp/onlinehelp/VirtualAndSoftwareAppliancesHelp/VMware/VMwareInstall/index.html 1.下载安装包 官方网站默认只提供最新版本的下载,但是可以通过猜测正确的版本号下载旧版本 例如18.5.3 Virtual Installers: Firewall OS for VMware: https://download.sophos.com/network/SophosFirewall/installers/VI-18.5.3_MR-3.VMW-408.zip 18.5.2 Virtual Installers: Firewall OS for...

  • Zimbra-SOAP-API开发指南3——操作邮件

    0x00 前言 在之前的文章《Zimbra SOAP API开发指南》和《Zimbra-SOAP-API开发指南2》介绍了Zimbra SOAP API的调用方法,开源代码Zimbra_SOAP_API_Manage。 本文将要在此基础上扩充功能,添加邮件操作的相关功能。 0x01 简介 本文将要介绍以下内容: 查看邮件 发送邮件 删除邮件 0x02 查看邮件 Zimbra SOAP API说明文档:https://files.zimbra.com/docs/soap_api/9.0.0/api-reference/index.html 结合Zimbra SOAP API说明文档和调试结果得出以下实现流程: 调用Search命令获得邮件对应的Item id,通过Item id作为邮件的识别标志 获得Item id后可以对邮件做进一步操作,如查看邮件细节、移动邮件、删除邮件等 1.获得邮件对应的Item id 需要使用Search命令 说明文档:https://files.zimbra.com/docs/soap_api/8.8.15/api-reference/zimbraMail/Search.html 需要用到以下参数: (1)query 表示查看的位置,示例如下: 查看收件箱:<query>in:inbox</query> 查看发件箱:<query>in:sent</query> 查看垃圾箱:<query>in:trash</query> (2)limit 表示返回的查询结果数量,示例如下: 指定返回数量为10:<limit>10</limit> 如果不指定该属性,默认为10 测试代码: def searchinbox_request(uri,token): request_body="""<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Header> <context xmlns="urn:zimbra"> <authToken>{token}</authToken>...

  • 渗透基础——Exchange版本探测的优化

    0x00 前言 在上篇文章《渗透基础——Exchange版本探测和漏洞检测》介绍了通过Python进行版本探测的两种方法,在版本识别上,首先从官网获得已知的版本信息,将版本信息存储在列表中,然后通过字符串匹配的方式获得Exchange版本的详细信息。开源的代码Exchange_GetVersion_MatchVul.py反馈很好。但是这个方法存在一个缺点:需要定期访问官网,手动更新扫描脚本中的版本信息列表。 为了进一步提高效率,本文介绍另外一种实现方法,通过访问官网,从返回数据中直接提取出详细的版本信息,优点是不再需要定期更新脚本。 0x01 简介 本文将要介绍以下内容: 通过BeautifulSoup解析网页数据 实现细节 开源代码 0x02 通过BeautifulSoup解析网页数据 BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库,可以提高开发效率 安装: pip install bs4 1.基本使用 在Python实现上,需要先通过requests库获取网页内容,再调用BeautifulSoup进行解析 测试代码: from bs4 import BeautifulSoup import requests import urllib3 urllib3.disable_warnings() url = "https://docs.microsoft.com/en-us/exchange/new-features/build-numbers-and-release-dates?view=exchserver-2019" 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", } response...

  • 渗透技巧——从VMware ESXI横向移动到Windows虚拟机

    0x00 前言 假定以下测试环境:我们获得了内网VMware ESXI的控制权限,发现VMware ESXI上安装了Windows域控服务器。 本文仅在技术研究的角度介绍从VMware ESXI横向移动到该Windows域控服务器的方法,结合利用思路,给出防御检测的方法。 0x02 简介 本文将要介绍以下内容: 利用思路 常用命令 实现方法 0x03 利用思路 通过VMware ESXI管理虚拟机,创建快照文件,从快照文件中提取出有价值的信息。 0x04 常用命令 1.查看虚拟机版本 vmware -vl 2.用户信息相关 (1)查看所有用户 esxcli system account list (2)查看管理员用户 esxcli system permission list (3)添加用户 esxcli system account add -i test1 -p Password@1 -c Password@1 (4)将普通用户添加成管理员用户 esxcli system permission set -i...

  • Lsassy二次开发——添加dump方法

    0x00 前言 在之前的文章《渗透基础——远程从lsass.exe进程导出凭据》介绍了Lsassy的用法,Lsassy能够实现远程从lsass.exe进程导出凭据。本文将要在Lsassy的基础上进行二次开发,添加一个导出凭据的方法,记录细节。 0x01 简介 本文将要介绍以下内容: 二次开发的细节 开源代码 0x02 导出凭据的方法 在之前的文章《渗透基础——从lsass.exe进程导出凭据》提到过使用RPC控制lsass加载SSP的方式向lsass.exe进程注入dll,由dll来实现dump的功能,这个方法是Lsassy缺少的 这个方法共分为两部分: (1)加载器 使用RPC控制lsass进程加载dll文件 可参考XPN开源的代码: https://gist.github.com/xpn/c7f6d15bf15750eae3ec349e7ec2380e 在编译代码时,为了提高通用性,编译选项选择在静态库中使用MFC,在原代码的基础上添加如下代码: #pragma comment(lib, "Rpcrt4.lib") 编译代码生成文件rpcloader.exe (2)dll文件 dll文件实现从lsass.exe进程导出凭据,代码可参考: https://github.com/outflanknl/Dumpert/blob/master/Dumpert-DLL/Outflank-Dumpert-DLL/Dumpert.c dll加载时会将dump文件保存为c:\windows\Temp\dumpert.dmp 编译代码生成文件dumpert.dll 经过以上操作,得到文件rpcloader.exe和dumpert.dll,作为二次开发的准备 0x03 二次开发的细节 1.添加一个需要指定文件路径的dump方法 格式参考:https://github.com/Hackndo/lsassy/blob/master/lsassy/dumpmethod/dummy.py.tpl 根据参考格式写出模块代码,我这里额外做了一些标记,细节如下: from lsassy.dumpmethod import IDumpMethod, Dependency class DumpMethod(IDumpMethod): custom_dump_path_support = False custom_dump_name_support = False dump_name = "dumpert.dmp" //进程dump文件保存的文件名 dump_share...

  • Sophos UTM利用分析——清除Last WebAdmin Sessions记录

    0x00 前言 对于Sophos UTM设备,在web管理页面中,Last WebAdmin Sessions会记录用户每次登录的信息,本文仅在技术研究的角度介绍清除指定Last WebAdmin Sessions记录的方法,记录研究细节。 0x01 简介 本文将要介绍以下内容: 研究过程 实现方法 0x02 Last WebAdmin Sessions简介 在web管理页面中,选中Management后会显示Last WebAdmin Sessions记录,如下图 记录包括以下内容: User:登录用户名 Start:登录时间 State:退出时间 IP address:登录IP Changelog:修改的配置 对于Changelog,点击Show,会显示修改的配置,如下图 默认配置下,Last WebAdmin Sessions会显示最近的20条记录 0x03 研究过程 1.尝试修改/var/confd/var/storage/cfg 在上篇文章《Sophos UTM利用分析——导出配置文件》提到,/var/confd/var/storage/cfg存储Sophos UTM的配置信息,所以猜测通过修改/var/confd/var/storage/cfg文件可以实现Last WebAdmin Sessions记录的清除 /var/confd/var/storage/cfg的文件格式为Perl Storable files,这里使用StorableEdit来编辑文件 向Sophos UTM上传文件storableedit-1.5.pl,执行命令: ./storableedit-1.5.pl cfg 结果如下图 解析出的文件结构同使用SophosUTM_ConfigParser.py导出的结果一致 查看配置信息,命令如下: cd...

  • 渗透基础——获得域用户的登录信息

    0x00 前言 在域渗透中,获得了域控制器权限后,需要获得域用户的登录信息,包括域用户登录的IP地址和登录时间。通常使用的方法是查看域控制器的登录日志(Eventid=4624)。然而,人工从登录日志(Eventid=4624)中筛选出域用户登录的IP地址和登录时间需要耗费大量时间,不仅无效数据多,而且需要多次判断,所以我们需要编写程序来实现这个功能。 在实际使用过程中,为了能够适配多种环境,还需要支持本地和多种协议的远程登录。于是本文将要分享我的实现方法,开源两个工具,记录细节。 0x01 简介 本文将要介绍以下内容: 通过EventLogSession实现 通过WMI实现 开源代码 0x02 通过EventLogSession实现 通过查询资料发现,通过EventLogSession不仅支持解析本地日志内容,还支持通过RPC远程解析日志,下面介绍关于EventLogSession的开发细节 1.输出Eventid=4624的日志内容 C Sharp实现代码: using System; using System.Diagnostics.Eventing.Reader; namespace Test1 { class Program { static void Main(string[] args) { var session = new EventLogSession(); string LogName = "Security"; string XPathQuery = "*[System/EventID=4624]"; EventLogQuery eventLogQuery = new EventLogQuery(LogName, PathType.LogName,...