CVE-2021-20873-MovableType XMLRPC 远程命令执行漏洞分析
漏洞信息
近日看到MovableType爆出多个版本存在远程命令执行漏洞CVE-2021-20873,影响版本如下:
- Movable Type <= 7 r.5002(V7.8.1)
- Movable Type <= 6.8.2
- Movable Type Advanced 7 <= r.5002
- Movable Type Advanced <= 6.8.2
- Movable Type Premium Advanced <= 1.46
- Movable Type Premium <= 1.46
MovableType分为开源版本和商业版本,开源版本代码托管在Github中。可以直接下载开源版本进行部署安装。安装完毕后访问登录页面为`http://localhost/cgi-bin/mt/mt.cgi`。
也可以通过官方注册后,下载商业试用版本。
漏洞分析
MovableType基于`PERL+PHP`混合开发,使用PERL调用部分php代码。首先查看cgi-bin目录下的CGI文件,不同CGI返回结果,其中mt-xmlrpc.cgi返回411错误。
在`mt-xmlprc.cgi`中引用`MT::XMLRPCServer`包。
发送POST请求显示参数错误。
在`XMLRPC.pm->ping_update`方法中找到XML请求类似的报文,返回`testfunc`函数访问错误,说明XML格式初步正常。
跟踪到`extlib/SOAP/Lite.pm`第2750行,使用`class`和`method_name`定位代码,成功后执行`eval`调用。在`testfunc`前加上一个`test`类名,提示`Failed to access class test`。
perl的INC变量包含了所有perl module的查找路径,@INC则为从模块路径中查找模块,通过打印得到@INC列表。
- /var/www/cgi-bin/mt/extlib
- /var/www/cgi-bin/mt/lib
- /usr/local/lib64/perl5
- /usr/local/share/perl5
- /usr/lib64/perl5/vendor_perl
- /usr/share/perl5/vendor_perl
- /usr/lib64/perl5/usr/share/perl5
以`/var/www/cgi-bin/mt/lib/MT.pm`为例,打印出`$VERSION`变量。
继续搜索 `MT.pm`源代码,发现`handelr_to_codefef`可调用`eval`执行命令。
执行PERL代码,但没有回显,执行CURL语句示例如下。
最后通过bash命令返回回显结果。
漏洞修复
在新版本(6.8.3)中,删除了`XMLRPC`的调用。
最后记得更新`MovableType`到最新版本。
