【最新漏洞预警】Zoho ManageEngine Admanager Plus 任意文件上传漏洞可GetShell
漏洞信息
2021年9月,Zoho官方通报了Zoho ManageEngine ADManager Plus的多个漏洞:
包括:
CVE-2021-37539CVE-2021-37762CVE-2021-37741CVE-2021-37761CVE-2021-37925CVE-2021-37919CVE-2021-37920CVE-2021-37921CVE-2021-37923CVE-2021-37924CVE-2021-37918CVE-2021-37922CVE-2021-37931CVE-2021-37930CVE-2021-37929CVE-2021-37928CVE-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/binclspsql -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
相关定义位于文件`ADSProductAPIs_OMP.xml`:
文件上传
既然漏洞与文件上传有关,重点关注名为`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`:
也是增加后缀名检查,还有一些其他点在原理上也是相同的,这里就不一一赘述了,有兴趣的小伙伴可自行研究。
