网站建设、公众号开发、微网站、微商城、小程序就找牛创网络 !

7*24小时服务专线: 152-150-65-006 023-68263070 扫描二维码加我微信 在线QQ

漏洞公告团结互助,让我们共同进步!

当前位置:主页 > 技术资讯 > 网络安全 > 漏洞公告 >

我们的优势: 10年相关行业经验,专业设计师量身定制 设计师一对一服务模式,上百家客户案例! 企业保证,正规流程,正规合作 7*24小时在线服务,售后无忧

CVE-2019-19781漏洞分析:Citrix ADC和Citrix Gateway远程执行代码(RCE)高风险漏洞,Citrix设备的入侵控制以及对内网资源访问获取

文章来源:重庆网络安全 发布时间:2020-03-18 15:31:01 围观次数:
分享到:

摘要:CVE-2019-19781漏洞分析:Citrix ADC和Citrix Gateway远程执行代码高风险漏洞,Citrix设备的入侵控制以及对内网资源访问获取。

  Citrix ADC和Citrix Gateway被暴露为高风险的远程执行代码漏洞CVE-2019-19781。此漏洞最吸引人的功能是未经授权的攻击者可以使用它来控制Citrix设备并实现对内部网络资源的进一步访问。安全团队Positive Tec

hnologies和Paddy Power Betfair发现并报告了该漏洞,但漏洞公告中没有太多利用这些漏洞的方法。因此,这是一个值得进一步研究的地方。


漏洞分析


  尽管该漏洞的详细信息并未在Citrix的官方漏洞公告中披露,但从漏洞缓解措施的角度揭示了该漏洞的相关类型:

blob.png

  根据上面的缓解信息,我们判断该漏洞的可能路径为/vpns/,并且可能是目录遍历漏洞。有了这些线索,我们开始在httpd.conf文件中寻找path/vpns定义方法,后来发现NetScaler::Portal::Handler Perl Module (Han

dler.pm)模块在/vpn/portal/scripts/目录下负责生成了一些方法定义。

blob.png

 /vpn/portal/scripts/包含一些脚本文件。因为我们在早期阶段就判断该漏洞是由目录遍历引起的,所以我们将分析重点放在具有文件写操作的那些代码路径上。之后,我们在perl模块的UsersPrefs脚本中找到以下代码:

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.”); <- 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方法的脚本来触发目录遍历漏洞。经过分析,发现/vpn/portal/scripts/下的所有脚本都将调用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,

};

...

newbm.pl将首先创建一个包含各种参数信息的数组,然后调用filewrite方法将数组中的信息写入XML文件:

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撰写的《关于CVE-2019-19781你需要知道的》,其中特别提到了Perl Template Toolkit模板工具可用于实施漏洞利用。


  经过深入研究,我们发现可以在XML文件中插入一些特定的指令,如果模板引擎对这些指令进行了解析,则可以触发命令执行。以下是模板引擎解析test.xml之后的命令执行示例:

blob.png

  总而言之,我们现在有了Perl Template Toolkit,这是一种用于插入指令的文件编写方法,但我们还需要一种方法来强制脚本解析模板。之后,我们在模板参考代码中发现Handler.pm可用于实现模板解析:

blob.png

 变量$tmplfile是从HTTP Request Path构造的,并且将生成一个新模板来处理此$tmplfile变量文件。现在,将我们先前创建的test.xml测试文件放入模板目录,并触发模板解析行为以查看:

blob.png

总而言之,需要以下步骤才能成功利用:


  1.探索通过模板机制执行Perl代码的方式(需要绕过);


  2.使用目录遍历将结构化的XML文件放在模板目录下;


  3.浏览放置的XML文件,触发模板解析,并以XML实施代码执行。

  重要的一点是,最后一步中的任意代码执行无法在原始默认Citrix配置中实现。Perl代码执行只能通过一个特性配置来实现。以前曾考虑过受该漏洞影响的Citrix设备的数量,并且多个团队已对该漏洞武器化,因此我们没有提供该漏洞的利用代码。


  第一种方法:模板注入引起的远程代码执行


  有两种方法可以执行代码执行。第一种是大多数公开exploit中使用的BLOCK模板注入方法。我们在Perl Template Toolkit的GitHub中找到了其他用户提交的bug,可以在这里利用此bug:

blob.png

 bug问题介绍了执行任意perl代码的方法。目前,似乎所有公开的exploit利用此方法都可以在上述漏洞中执行任意命令执行。让我们仔细研究漏洞实现中这种利用方法的细节。


  根据Perl Template Toolkit文档描述,模板变量是一个特殊变量,在调用处理期间它将包含对主模板的对象引用。此处的对象类型可以通过print方法打印显示,该方法是Template :: Document:


  使用该对象引用,可以调用具有受控参数的方法。通过研究类代码,我们发现可以基于上述特征成功调用新方法:

# new(\%document)

#

# Creates a new self-contained Template::Document object which

# encapsulates a compiled Perl sub-routine, $block, any additional

# BLOCKs defined within the document ($defblocks, also Perl sub-routines)

# and additional $metadata about the document.

#------------------------------------------------------------------------

sub new {

my ($class, $doc) = @_;

my ($block, $defblocks, $variables, $metadata) = @$doc{ qw( BLOCK DEFBLOCKS VARIABLES METADATA ) };

$defblocks ||= { };

$metadata ||= { };

# evaluate Perl code in $block to create sub-routine reference if necessary

unless (ref $block) {

local $SIG{__WARN__} = \&catch_warnings;

$COMPERR = '';

# DON'T LOOK NOW! - blindly untainting can make you go blind!

$block = each %{ { $block => undef } } if ${^TAINT}; #untaint

$block = eval $block;

return $class->error($@)

unless defined $block;

}

 新方法可以获取BLOCK模板中的参数并调用eval方法,从而实现任意的perl代码执行。另外,我们还发现另一个方法component也可以达到相同的攻击效果。

blob.png

  第二种方法:DATAFILE插件中的命令注入


  在源代码的方法调用安全性分析中,我们在DATAFILE插件中找到了以下代码:

sub new {

my ($class, $context, $filename, $params) = @_;

my ($delim, $line, @fields, @data, @results);

my $self = [ ];

local *FD;

local $/ = "\n";

$params ||= { };

$delim = $params->{'delim'} || ':';

$delim = quotemeta($delim);

return $class->fail("No filename specified")

unless $filename;

open(FD, $filename)

|| return $class->fail("$filename: $!");

# first line of file should contain field definitions

while (! $line || $line =~ /^#/) {

$line =

chomp $line;

$line =~ s/\r$//;

}sub new {

my ($class, $context, $filename, $params) = @_;

my ($delim, $line, @fields, @data, @results);

my $self = [ ];

local *FD;

local $/ = "\n";

$params ||= { };

$delim = $params->{'delim'} || ':';

$delim = quotemeta($delim);

return $class->fail("No filename specified")

unless $filename;

open(FD, $filename)

|| return $class->fail("$filename: $!");

# first line of file should contain field definitions

while (! $line || $line =~ /^#/) {

$line =

chomp $line;

$line =~ s/\r$//;

}

 如果您有Perl代码审核的经验,将知道仅使用两个参数来使用open函数打开文件进行操作是不安全的。如果添加管道命令|,则open函数会将其其余部分解释为命令调用。另外,由于我们可以控制文件名变量$filename,因此该方法可用于实现命令执行。


  通过构造一个模板文件,在调用DATAFILE插件后,可以执行任何命令,如下所示:

blob.png

  您可以看到构造文件中的命令成功创建了预期的/tmp/COMMAND_INJECTION/目录:

blob.png

 漏洞被相继发现披露后出现了各种exploit,但是正如Craig Yong在文章中所说:“必须注意,某些Payload可能导致Citrix NetScaler过度记录错误,直到填充/ var分区为止。”


  错误修复


  目前,Citrix已发布详细的漏洞缓解措施,包括特定的实施步骤,我们建议Citrix ADC用户及时参考此措施以对其进行修复。


  另外,在设备的外部POST请求中,如果涉及“/ vpns /”和“/../”样式字符串,然后是xml文件的GET请求,则可以直接将其放置为漏洞攻击。


本文由 重庆网络安全 整理发布,转载请保留出处,内容部分来自于互联网,如有侵权请联系我们删除。

相关热词搜索:CVE-2019-19781 漏洞 Citrix ADC Citrix Gateway 远程执行代码漏洞 入侵控制 获取内网访问 重庆网络安全公司

上一篇:CVE-2019-17016 Firefox浏览器漏洞:使用单个注入点提取CSS数据
下一篇:CVE-2020-0688漏洞模拟、复现、分析和利用:Microsoft Exchange Server远程执行代码漏洞

热门资讯

鼠标向下滚动