深入研究Citrix ADC远程执行代码 CVE-2019-19781

2020-02-17 13:59:41 浏览数 (1)

0x00:前言

CVE-2019-19781下发布了Citrix ADCCitrix 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文件复制到模板目录,即可触发模板解析。

概括地说,为了利用此漏洞,应遵循以下步骤:

  1. 探索通过模板执行Perl代码的方法(需要绕过),
  2. 使用路径遍历将精心制作的XML文件写入模板目录,
  3. 浏览到上载的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/

0 人点赞