0x00:前言
CVE-2019-19781下发布了Citrix ADC和Citrix Gateway中的一个严重漏洞。该漏洞引起了大家们的注意,因为它表明未经身份验证的对手可以利用它来破坏设备。尽管最初的发现是由Positive Technologies和Paddy Power Betfair做出的,但是没有公开的关于如何利用它的详细信息,因此值得进一步研究。
0x01:漏洞分析
尽管没有有关如何利用此问题的公开详细信息,但Citrix 的缓解咨询建议揭示了此漏洞类型的潜在线索。
从此信息中,我们可以看到漏洞可能存在的路径(/V**s/),并且这可能是目录遍历漏洞.考虑到这一点,开始在httpd.conf文件中查找/V**s路径的定义,并发现
/V**/portal/scripts/由NetScaler :: Portal :: Handler Perl模块(Handler.pm).
此目录中包含几个脚本,但是由于此漏洞是潜在的目录遍历,因此我们选择调查文件写入操作的所有潜在代码路径。
这导致在UsersPrefs perl模块中发现以下代码:
代码语言:javascript复制
sub csd {
my $self = shift;
my $skip_read = shift || "";
# Santity Check
my $cgi = new CGI;
print "Content-type: text/htmlnn";
// Username variable initialized by the NSC_USER HTTP Header
my $username = Encode::decode('utf8', $ENV{'HTTP_NSC_USER'}) || errorpage("Missing NSC_USER header.”); <- MARK THIS
$self->{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标头构建路径的,而无需进行任何处理。因此,任何调用csd函数的脚本都将能够触发目录漏洞。
几乎所有脚本都使用此功能,但是对我们而言最有趣的一个脚本是newbm.pl脚本文件:
代码语言:javascript复制
my $cgi = new CGI;
print "Content-type: text/htmlnn";
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,
};
...
该脚本创建几个参数与信息数组,然后以后,调用FILEWRITE功能将写的内容到磁盘上的XML文件。
代码语言:javascript复制
if ($newBM->{url} =~ /^/){
push @{$doc->{filesystems}->{filesystem}}, $newBM;
} else { # bookmark
push @{$doc->{bookmarks}->{bookmark}}, $newBM;
}
// Writing XML file to disk
$user->filewrite($doc);
通过进一步的研究,我们发现可以在XML文件上插入特定的指令,如果通过模板引擎解析该指令可以执行命令。
模板解析的示例可以在下面找到:
再次探讨我们的漏洞利用,我们现在有了部分文件写入原语,可用于注入Perl Template Toolkit指令,但仍需要一种方法来强制脚本解析模板。
在实际使用模板的代码上找到所有引用,Handler.pm模块看起来很有希望:
该tmplfile $变量是从HTTP请求路径构建一个新的模板是建立与该文件进行处理。
将我们先前创建的test.xml文件复制到模板目录,即可触发模板解析。
概括地说,为了利用此漏洞,应遵循以下步骤:
- 探索通过模板执行Perl代码的方法(需要绕过),
- 使用路径遍历将精心制作的XML文件写入模板目录,
- 浏览到上载的XML文件,触发模板解析。
最后一个难题是使用模板执行任意命令,在默认配置下,这是“不可能”的。有一个未记录的功能,它允许执行任意的perl代码,但是目前,我们不打算记录此技术。但是,使用此信息安全团队应具有足够的详细信息来重现此问题,但没有用于执行代码的详细信息。
由于受影响的设备数量众多,MDSec决定不提供针对此漏洞的现成攻击,但是我们知道多个参与者现在已为该漏洞提供了武器,并认为分享这项研究很重要,以便其他人可以采取适当的措施。
视频链接:https://youtu.be/5U5Hk2CzIAk
效果图
0x02:预防
Citrix发布了缓解措施,以防止利用此问题,如CVE-2019-19781的缓解步骤中所述。强烈建议任何Citrix ADC用户将此缓解措施作为当务之急。
此外,可以通过警告包含带有"/V**s/"和"/../"字符串的POST请求的URL,然后是对以xml扩展名结尾的文件的GET请求(由@突出显示)来识别对利用尝试的检测。
本文翻译至:
代码语言:javascript复制
https://www.mdsec.co.uk/2020/01/deep-dive-to-citrix-adc-remote-code-execution-cve-2019-19781/