漏洞信息
2021年9月,Zoho官方通报了Zoho ManageEngine ADManager Plus的多个漏洞:
包括:
CVE-2021-37539
CVE-2021-37762
CVE-2021-37741
CVE-2021-37761
CVE-2021-37925
CVE-2021-37919
CVE-2021-37920
CVE-2021-37921
CVE-2021-37923
CVE-2021-37924
CVE-2021-37918
CVE-2021-37922
CVE-2021-37931
CVE-2021-37930
CVE-2021-37929
CVE-2021-37928
CVE-2021-37926
这些漏洞以文件上传类型为主,影响v7111及以下版本。其实这个产品和前期分析的Zoho ManageEngine ADSelfService Plus有很多类似的代码,相关文章链接如下:
CVE-2021-40539
QCyber,公众号:且听安全CVE-2021-40539-Zoho ManageEngine ADSelfService Plus如何从bypass到RCE
下面将Zoho Manageengine Admanager Plus其中一处认证后的任意文件上传漏洞分享给大家。
进程分析
系统使用Tomcat容器进行构建,查看服务配置:
8080端口对应`ADMP`服务,找到对应进程并获取启动命令:
加入调试信息并重启,成功打开远程调试端口:
数据库分析
在`bin`目录有一个连接数据库脚本`connectDB.bat`:
cd ../pgsql/bin
cls
psql -h127.0.0.1 -Uadmanager -p33306 -dadsm
默认情况下数据库配置信息位于`database_params.conf`:
利用上面的配置信息,成功连接数据库:
合法API URL分析
查看`web.xml`,找到一个名为`FWServletAPI`的`servlet`:
同时定义了多个针对全部URL请求的过滤器,比如`ADSFilter`:
我们随意构造一个URL请求:
http://***:8080/RestAPI/WC/NotificationTemplate/test
在`ADSFilter#doFilter`打下断点:
进入`doSubFilters`:
经过一系列参数提取和身份认证验证后,第136行调用函数`RestAPIUtil.isRestAPIRequest`来验证URL:
然后调用`RestAPIFilter.doAction`:
第61行通过`RestAPIUtil.getAPIDetails`来获取API接口的信息,跟进:
发现这里是从数据库中来寻找合法的API URL规则:
一共有607个合法URL规则:
寻找`/RestAPI/WC/NotificationTemplate/*`合法的URL列表,共计13个:
/RestAPI/WC/NotificationTemplate/getDefaults
/RestAPI/WC/NotificationTemplate/getTemplate
/RestAPI/WC/NotificationTemplate/saveTemplate
/RestAPI/WC/NotificationTemplate/deleteTemplates
/RestAPI/WC/NotificationTemplate/copySettings
/RestAPI/WC/NotificationTemplate/attachFiles
/RestAPI/WC/NotificationTemplate/removeFileAttachment
/RestAPI/WC/NotificationTemplate/getShareSettings
/RestAPI/WC/NotificationTemplate/saveShareSettings
/RestAPI/WC/NotificationTemplate/getShareableUsers
/RestAPI/WC/NotificationTemplate/getModuleDetails
/RestAPI/WC/NotificationTemplate/getTemplates
/RestAPI/WC/NotificationTemplate/addRemoveColumns
文件上传
既然漏洞与文件上传有关,重点关注名为`attachFiles`的URL,替换HTTP请求为:
/RestAPI/WC/NotificationTemplate/attachFiles
定位函数`attachFiles`:
提取请求的相关参数后没有进行任何检查,直接将上传的文件内容进行写入操作。构造如下请求:
直接GetShell:
修复方式
v7111版本中函数`attachFiles`中增加了对文件后缀名的判断:
文件后缀名判定通过新增的`FileUtil.validateImageFileExtension`函数完成:
将文件类型限制为:
public static final String DEFAULT_IMAGE_EXTENSION[] = {
"jpg", "png", "gif", "jpeg", "tiff", "pjp", "pjpeg", "jfif", "tif", "svg",
"bmp", "svgz", "webp", "ico", "xbm", "dib"
};
写在最后
通过补丁对比发现还存在多处文件上传漏洞的修复,比如`com.manageengine.ads.fw.ssl.SSLAPI#addNewCertificate`:
同样对文件后缀进行了过滤,通过研究发现这个触发点是对压缩包进行解压,但是没有对文件后缀进行检查,可以实现任意文件上传,但是在处理完压缩包后,程序会自动删除文件,但是存在条件竞争的问题,仍可GetShell。
再比如`com.manageengine.ads.fw.sso.ADSSAMLAPI#saveSAMLConfig`:
也是增加后缀名检查,还有一些其他点在原理上也是相同的,这里就不一一赘述了,有兴趣的小伙伴可自行研究。
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。
点关注,不迷路!
原文始发于微信公众号(且听安全):【最新漏洞预警】Zoho ManageEngine Admanager Plus 任意文件上传漏洞可GetShell