Zoho ManageEngine ADSelfService Plus如何从bypass到RCE

1.漏洞信息

2021年9月,Zoho官网发布了CVE-2021-40539漏洞补丁。从描述来看,CVE-2021-40539是一个认证绕过漏洞,影响版本包括`ADSelfService Plus builds up to 6113`,漏洞在`ADSelfService Plus build 6114`版本中进行修复(可以bypass)。漏洞脆弱点位于Restful API接口中,攻击者可以构造特殊URL请求,绕过认证后实现RCE,官方给出了漏洞利用的完整示意图:

2.调试配置

下载6113版本,安装完毕后运行自启动命令如下:

修改`wrapper.conf`文件,加入远程调试信息:

重新启动成功打开远程调试端口:

3.Restful API认证绕过

查看`web.xml`,Restful API接口对应的servlet为`action`:

URL以`/RestAPI/*`开头,查看`action`定义:

Restful API接口采用struts架构生成,访问接口的定义位于`*.xml`配置文件中。

`web.xml`定义了一个名为`ADSFilter`的全局过滤器:

定位`com.manageengine.ads.fw.filter.ADSFilter#doFilter`函数:

第65行首先判断如果是Restful API访问,尝试提取认证信息,然后调用`doSubFilters`:

经过一系列判断,进入第136行,对Restful API访问进行检查:

调用`isRestAPIRequest`函数判断是否为Restful API访问,如果为`true`,将调用`RestAPIFilter.doAction`进行认证信息验证等处理,看下`isRestAPIRequest`函数定义:

通过`request.getRequestURI`提取URL信息,这里通过正则表达式`/RestAPI/.*`来判断是否为Restful API访问,因为Zoho ManageEngine ADSelfService Plus使用的是Tomcat容器,下面的两个请求等价:

/RestAPI/LicenseMgr

/./RestAPI/LicenseMgr

`/RestAPI/LicenseMgr`对应的处理类为`LicenseMgr`,打下断点:

请求一:`/RestAPI/LicenseMgr`

可以发现在`com.manageengine.ads.fw.filter.ADSFilter#doSubFilters`没有通过权限检查,返回`false`。

请求二:`/./RestAPI/LicenseMgr`:

绕过了认证检查。

下面继续分析在绕过认证之后,是否存在进一步利用的可能性。


4.任意文件上传

前面提到了Restful API的接口定义位于`*.xml`文件之中,在`struts-config.xml`中找到`LogonCustomization`:

`com.adventnet.sym.adsm.common.webclient.admin.LogonCustomization`:

对参数进行一系列判断后,进入`sCAction.addSmartCardConfig`:

跟进`addSmartCardConfig`:

第94行调用`FileActionHandler.getFileFromRequest`提取`certFileJson`,进入函数:

其中参数`paramName`来源于请求提交的`CERTIFICATE_PATH`参数,实际上就是将上传的文件(来源于参数`CERTIFICATE_PATH`)进行保存。

下面构造一个文件上传的POST请求,根据前面的分析设置参数,最终请求如下:

文件上传至`\ManageEngine\ADSelfService Plus\bin`目录,尝试利用`../`进行穿越,但是`formFile.getFileName`只会提取文件名称,导致前面的`../`无效,无法进行穿越。

5.命令注入

现在可以实现未授权向`bin`目录写入任意文件,文件名称和文件内容完全可控,由于无法实现路径穿越,也就无法直接Getshell。在`struts-config.xml`中找到`ConnectionAction`:

`com.adventnet.sym.adsm.common.webclient.admin.ConnectionAction#openSSLTool`:

进入`SSLUtil.createCSR`:

实例化`JSONObject`对象`sslParams`,其中的参数全部来自于`request`,然后调用`createCSR`,跟进:

实例化字符串`keyCmd`,然后根据`JSONObject`的值完成字符串拼接,最后调用`runCommand`:

猜测可能会调用`runtime`执行命令,在`exec`处打下断点,构造请求进行测试:

确定调用了`Runtime.exec`来执行命令。`keytool.exe`是Java提供的一个生成数字证书的工具:

其中参数`providerclass`和`providerpath`可以用于指定Java字节码class文件的名称和路径,当调用`keytool.exe`时,会自动执行对应Java代码。很自然可以想到结合上面的任意文件上传漏洞,上传一个恶意class文件到bin目录,然后通过构造POST参数实现RCE。

首先构造一个恶意类`evil.java`:

编译evil.class文件后,上传至bin目录:

利用接口`ConnectionAction`构造如下请求:

触发断点,实际执行的命令如下:

成功实现RCE:

6.小结

CVE-2021-40539实现RCE的过程由3个漏洞组成,分别是Restful API认证绕过、任意文件上传以及命令拼接。在深入分析过程中,发现文件上传和命令执行还有其他的触发点,这里不过多赘述。此外,在`ADSelfService Plus build 6114`版本中,补丁更新的地方非常多,但对漏洞的修复并不完善,仍然可以被bypass,直到在更新的版本中,漏洞才得到较为完善的修复,有兴趣的小伙伴可以自行分析。

有需要了解更多漏洞情报小伙伴,请关注微信公众号:且听安全。聪者听于无形,明者见于未形;专注网络安全,关注漏洞态势;拒绝重复搬运,只做精品原创。

7.参考

https://mp.weixin.qq.com/s?__biz=Mzg3MTU0MjkwNw==&mid=2247485533&idx=1&sn=cc6a888c8fcf5c4c24bd12c792572d31&chksm=cefdb149f98a385f275d737c4200608b953b8f9fffad23536a271c4330e5b4265b925f8a99e5&scene=178&cur_album_id=2054199860790083586#rd

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容