CVE-2019-19781漏洞分析:Citrix ADC和Citrix Gateway远程执行代码(RCE)高风险漏洞,Citrix设备的入侵控制以及对内网资源访问获取
摘要:CVE-2019-19781漏洞分析:Citrix ADC和Citrix Gateway远程执行代码高风险漏洞,Citrix设备的入侵控制以及对内网资源访问获取。
Citrix ADC和Citrix Gateway被暴露为高风险的远程执行代码漏洞CVE-2019-19781。此漏洞最吸引人的功能是未经授权的攻击者可以使用它来控制Citrix设备并实现对内部网络资源的进一步访问。安全团队Positive Tec
hnologies和Paddy Power Betfair发现并报告了该漏洞,但漏洞公告中没有太多利用这些漏洞的方法。因此,这是一个值得进一步研究的地方。
漏洞分析
尽管该漏洞的详细信息并未在Citrix的官方漏洞公告中披露,但从漏洞缓解措施的角度揭示了该漏洞的相关类型:
根据上面的缓解信息,我们判断该漏洞的可能路径为/vpns/,并且可能是目录遍历漏洞。有了这些线索,我们开始在httpd.conf文件中寻找path/vpns定义方法,后来发现NetScaler::Portal::Handler Perl Module (Han
dler.pm)模块在/vpn/portal/scripts/目录下负责生成了一些方法定义。
/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之后的命令执行示例:
总而言之,我们现在有了Perl Template Toolkit,这是一种用于插入指令的文件编写方法,但我们还需要一种方法来强制脚本解析模板。之后,我们在模板参考代码中发现Handler.pm可用于实现模板解析:
变量$tmplfile是从HTTP Request Path构造的,并且将生成一个新模板来处理此$tmplfile变量文件。现在,将我们先前创建的test.xml测试文件放入模板目录,并触发模板解析行为以查看:
总而言之,需要以下步骤才能成功利用:
1.探索通过模板机制执行Perl代码的方式(需要绕过);
2.使用目录遍历将结构化的XML文件放在模板目录下;
3.浏览放置的XML文件,触发模板解析,并以XML实施代码执行。
重要的一点是,最后一步中的任意代码执行无法在原始默认Citrix配置中实现。Perl代码执行只能通过一个特性配置来实现。以前曾考虑过受该漏洞影响的Citrix设备的数量,并且多个团队已对该漏洞武器化,因此我们没有提供该漏洞的利用代码。
第一种方法:模板注入引起的远程代码执行
有两种方法可以执行代码执行。第一种是大多数公开exploit中使用的BLOCK模板注入方法。我们在Perl Template Toolkit的GitHub中找到了其他用户提交的bug,可以在这里利用此bug:
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也可以达到相同的攻击效果。
第二种方法: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插件后,可以执行任何命令,如下所示:
您可以看到构造文件中的命令成功创建了预期的/tmp/COMMAND_INJECTION/目录:
漏洞被相继发现披露后出现了各种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远程执行代码漏洞
人机验证(Captcha)绕过方法:使用Chrome开发者工具在目标网站登录页面上执行简单的元素编辑,以实现Captcha绕过
牛创网络: " 人机身份验证(Captcha)通常显示在网站的注册,登录名和密码重置页面上。 以下是目标网站在登录页面中排列的验证码机制。 从上图可以
2020-01-26 12:44:09 )8872( 亮了
自动发现IDOR(越权)漏洞的方法:使用BurpSuite中的Autozie和Autorepeater插件来检测和识别IDOR漏洞,而无需手动更改每个请求的参数
牛创网络: "自动发现IDOR(越权)漏洞的方法:使用BurpSuite中的Autozie和Autorepeater插件来检测和识别IDOR漏洞,而无需手动更改每个请求的参数
2020-01-30 14:04:47 )6288( 亮了
Grafana CVE-2020-13379漏洞分析:重定向和URL参数注入漏洞的综合利用可以在任何Grafana产品实例中实现未经授权的服务器端请求伪造攻击SSRF
牛创网络: "在Grafana产品实例中,综合利用重定向和URL参数注入漏洞可以实现未经授权的服务器端请求伪造攻击(SSRF)。该漏洞影响Grafana 3 0 1至7 0 1版本。
2020-08-12 14:26:44 )4301( 亮了
Nginx反向代理配置及反向代理泛目录,目录,全站方法
牛创网络: "使用nginx代理dan(sui)是http响应消息写入服务地址或Web绝对路径的情况。 写一个死的服务地址是很少见的,但它偶尔也会发生。 最棘手的是写入web绝对路径,特别是如果绝对路径没有公共前缀
2019-06-17 10:08:58 )3858( 亮了
fortify sca自定义代码安全扫描工具扫描规则(源代码编写、规则定义和扫描结果展示)
牛创网络: "一般安全问题(例如代码注入漏洞),当前fortify sca规则具有很多误报,可通过规则优化来减少误报。自带的扫描规则不能检测到这些问题。 需要自定义扫描规则,合规性角度展示安全风险。
2020-02-12 10:49:07 )3505( 亮了
整理几款2020年流行的漏洞扫描工具
牛创网络: "漏洞扫描器就是确保可以及时准确地检测信息平台基础架构的安全性,确保业务的平稳发展,业务的高效快速发展以及公司,企业和国家 地区的所有信息资产的维护安全。
2020-08-05 14:36:26 )2536( 亮了
微擎安装使用技巧-微擎安装的时候页面显示空白是怎么回事?
牛创网络: "我们在公众号开发中,有时候会用到微擎,那我们来看一下微擎安装的时候页面显示空白是怎么回事吧
2019-06-08 15:34:16 )2261( 亮了
渗透测试:利用前端断点拦截和JS脚本替换对前端加密数据的修改
牛创网络: " 本文介绍的两种方法,虽然断点调试比JS脚本代码替换更容易,但是JS脚本代码替换方法可以实现更强大的功能,测试人员可以根据实际需要选择适当的测试方法
2020-01-07 09:34:42 )1995( 亮了
从工业界到学界盘点SAS与R优缺点比较
牛创网络: "虽然它在业界仍然由SAS主导,但R在学术界广泛使用,因为它的免费开源属性允许用户编写和共享他们自己的应用程序 然而,由于缺乏SAS经验,许多获得数据分析学位的学生很难找到工作。
2019-07-13 22:25:29 )1842( 亮了
41款APP侵犯用户隐私权:QQ,小米,搜狐,新浪,人人均被通报
牛创网络: "随着互联网的不断发展,我们进入了一个时代,每个人都离不开手机。 但是,APP越来越侵犯了用户隐私权。12月19日,工业和信息化部发布了《关于侵犯用户权益的APP(第一批)》的通知。
2019-12-20 11:28:14 )1775( 亮了