发布于2022年11月8日2年前 0x00 前言 本文记录从零开始搭建津布拉漏洞调试环境的细节。 0x01 简介 本文将要介绍以下内容: 津布拉服务器开启调试模式 本地使用想法进行远程调试 常用知识 0x02 Zimbra服务器开启调试模式 相关资料: https://github。com/Zimbra-Community/Zimbra-tools/blob/master/Java-debug-Zimbra-intellij-ide。医学博士 详细步骤如下: 1.停止Zimbra服务 苏津布拉 zm控制停止 2.开启调试模式 苏联(苏联的缩写) CP/opt/zimbra/libexec/zmmailboxdmgr/opt/zimbra/libexec/zmmailboxdmgr。老的 CP/opt/zimbra/lib exec/zmmailboxdmgr。无限制/opt/zimbra/lib exec/zmmailboxdmgr 此处先备份zmmailboxdmgr,再使用zmmailboxdmgr。无限制替换zmmailboxdmgr 3.添加调试信息 苏津布拉 zmlocalconfig-e邮箱d _ Java _ options=' ` zmlocalconfig-m nokey邮箱d _ Java _ options `- Xdebug-xno agent-DJ ava。编译器=无-代理库:jdwp=transport=dt _ socket,server=y,suspend=n,address=*:8000 ' 注: 也可以直接修改/opt/zimbra/conf/local config。可扩展标记语言中的邮箱d _ java _选项属性值 4.关闭防火墙 sudo ufw禁用 5.重启服务 zm控制开始 0x03 本地使用IDEA进行远程调试 1.下载jar文件 本地使用想法进行远程调试时,本地和远程的代码需要保持一致,也就是说,我们需要拿到津布拉相关的冲突文件 津布拉文件位置: /opt/zimbra/common/jetty _ home/lib/ /opt/zimbra/common/jetty _ home/lib/Apache-JSP/ 2.批量导入jar文件 新建Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)工程,依次选择文件-项目结构.在图书馆下选择新项目库-Java,设置为c:\zimbrajar\ 3.添加断点 在外部库-津布拉贾尔下面打开。班级文件,在合适的位置添加断点 4.设置远程调试参数 顶部菜单栏选择添加配置.在弹出的页面中选择远程虚拟机(Java Virtual Machine的缩写)调试,填入远程调试参数,参数示例: -代理库:jdwp=transport=dt _ socket,server=y,suspend=n,address=8000 使用的JDK选择JDK 5-8 5.开启Debug模式 回到想法主页面,选择刚才的配置文件,点击调试图标(快捷键Shift F9) 如果远程调试执行成功,断点图标会发生变化,增加一个对号 此时,控制台页面显示如下: 已连接到目标虚拟机,地址:":",传输:"套接字" 0x04 常用知识 津布拉使用码头框架作为网容器 用户在访问jsp文件时,服务器先将虚拟机(Java虚拟机的缩写)不认识的JSP文件解析成Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)文件,保存路径为:/opt/zimbra/jetty _ base/work/zimbra/JSP/org/Apache/JSP/ 每个jsp文件被成功访问后,都会注册一个JspServletWrapper实例,我们可以通过调试器查看请求变量获得所有已注册的JspServletWrapper实例,也可以通过反射的方式以jsp文件的形式进行枚举 jsp文件代码示例: %@个页面导入='java.lang.reflect.Field' % %@个页面导入=' Java。util。并发。并发哈希表' % %@个页面导入=' Java . util . * ' ' % % 字段f=request.getClass().getDeclaredField(' _ scope '); f。设置可访问性(true); Object obj1=f.get(请求); f=obj1.getClass().getDeclaredField(' _ servlet '); f。设置可访问性(true); object obj 2=f . get(obj 1); f=obj2.getClass().getSuperclass().getDeclaredField(' rctxt '); f。设置可访问性(true); object obj 3=f . get(obj 2); f=obj3.getClass().getDeclaredField(' JSP '); f。设置可访问性(true); 并发hashmap obj 4=(并发hashmap)f . get(obj 3); 枚举enu=obj 4。keys(); while (enu.hasMoreElements()) { out.println(enu.nextElement()' '); } % 整个反射的逻辑来自于跟踪调试的结果,实现逻辑不唯一,枚举JspServletWrapper实例用到了并发哈希表枚举 0x05 小结 在我们搭建好津布拉漏洞调试环境后,接下来就可以着手对漏洞和码头框架进行研究学习。 留下回复
创建帐户或登录后发表意见