CVE-2019-19781: Citrix ADC RCE漏洞分析
导语:上个月,研究人员在Citrix ADC和Citrix网关设备中发现一个严重漏洞——CVE-2019-19781。未授权的攻击者可以利用该漏洞来入侵设备。
上个月,研究人员在Citrix ADC和Citrix网关设备中发现一个严重漏洞——CVE-2019-19781。未授权的攻击者可以利用该漏洞来入侵设备。但Positive Technologies和Paddy Power Betfair在发现该漏洞后并没有公布漏洞相关的细节。
漏洞分析
虽然没有公布漏洞相关的细节,但Citrix仍然发布的公告中仍然给出了该漏洞类型的一些线索。
从以上信息可以发现,漏洞存在于路径/vpns/中,因此这可能是一个目录遍历漏洞。因此,研究人员开始在 httpd.conf 文件中寻找路径/vpns的定义,发现/vpn/portal/scripts/ 是由NetScaler::Portal::Handler Perl Module (Handler.pm)模块处理的。
研究人员发现该目录中包含多个脚本,但因为该漏洞可能是一个目录遍历漏洞,因此研究人员选择分析文件写操作的可能的代码路径。最终在UsersPrefs perl模块中发现了下面的代码:
sub csd { my $self = shift; my $skip_read = shift || ""; # Santity Check my $cgi = new CGI; print "Content-type: text/html\n\n"; // Username variable initialized by the NSC_USER HTTP Header my $username = Encode::decode('utf8', $ENV{'HTTP_NSC_USER'}) || errorpage("Missing NSC_USER header.”); {username} = $username; ... $self->{session} = %session; // Constructing the path from the username. $self->{filename} = NetScaler::Portal::Config::c->{bookmark_dir} . Encode::encode('utf8', $username) . '.xml’; if($skip_read eq 1) { return; }
可以看出,以上代码在没有经过任何处理的情况下从NSC_USER HTTP header中构建了一个路径。最后,调用csd函数的任意脚本都可以触发该目录遍历漏洞。
几乎所有的脚本都使用该函数,但吸引研究人员的是newbm.pl脚本文件:
my $cgi = new CGI; print "Content-type: text/html\n\n"; my $user = NetScaler::Portal::UserPrefs->new(); my $doc = $user->csd(); ... my $newurl = Encode::decode('utf8', $cgi->param('url')); my $newtitle = Encode::decode('utf8', $cgi->param('title')); my $newdesc = Encode::decode('utf8', $cgi->param('desc')); my $UI_inuse = Encode::decode('utf8', $cgi->param('UI_inuse')); ... my $newBM = { url => $newurl, title => $newtitle, descr => $newdesc, UI_inuse => $UI_inuse, }; ...
该脚本创建一个含有来自许多参数的信息的数组,然后调用了将该内容写入XML文件的 filewrite函数。
if ($newBM->{url} =~ /^\/){ push @{$doc->{filesystems}->{filesystem}}, $newBM; } else { # bookmark push @{$doc->{bookmarks}->{bookmark}}, $newBM; } // Writing XML file to disk $user->filewrite($doc);
最后,研究人员得到了一个可以控制路径和XML文件部分内容但不能控制文件扩展的部分文件写原语。至此还无法利用该漏洞,但研究人员发现了Craig Yong 的文章https://www.tripwire.com/state-of-security/vert/citrix-netscaler-cve-2019-19781-what-you-need-to-know/。
研究人员进一步分析发现可以插入特定指令到XML文件中,如果模板引擎分析后就会用来执行命令。模板分析示例如下:
有了部分文件写原语后就可以用来注入Perl Template Toolkit指令,但仍然需要强制脚本分析模板的方法。
研究人员在代码中找了所有使用模板的引用,发现了Handler.pm模块:
变量$tmplfile是从HTTP Request Path构建的,新版本构建后就会用来处理该文件。复制前面创建模板目录的 test.xml 文件,就可以触发模板分析。
为了利用该漏洞,需要通过以下步骤:
· 找到一种通过模板执行perl代码的方法
· 使用路径遍历方法将伪造的XML文件写入模板目录;
· 浏览上传的XML文件,触发模板分析。
最后一步是使用模板来执行任意命令,但这在默认配置中是不可能的。允许任意perl代码执行是一个没有记录的特征。但使用该信息研究人员有足够的信息来重新该问题。由于有大量的设备受到影响,MDSec决定不为该漏洞提供漏洞利用,但同时也有多个攻击者开始武器化该漏洞。
PoC
PoC代码见:
https://github.com/projectzeroindia/CVE-2019-19781
漏洞利用PoC视频如下:
https://www.youtube.com/embed/5U5Hk2CzIAk
解决办法
Citrix也发布了缓解CVE-2019-19781漏洞的公告,研究人员建议Citrix ADC用户遵循该步骤。同时,可以对含有 “/vpns/”和“/../”字符串的POST请求的URL和为以xml扩展中含有@buffaloverflow的GET请求发出告警来实现对漏洞利用的检测。
发表评论