事件背景
Citrix NetScaler 是优化Web 应用交付的综合解决方案。作为特定用途设备,NetScaler 可将Web 应用交付加速5倍或更多,同时保护Web应用不受如今最危险的安全威胁的攻击。而且,NetScaler 还可提高资源效率,简化策略创建和管理,以及降低管理成本。
Citrix 近日公开修复了一个远程代码执行漏洞CVE-2019-19781, 利用POC已经公开。未经授权的攻击者可以通过精心构造的请求包进行远程代码执行。
影响版本
Citrix ADC/Citrix Gateway 13.0
Citrix ADC/NetScaler Gateway 12.1
Citrix ADC/NetScaler Gateway 12.0
Citrix ADC/NetScaler Gateway 11.1
Citrix NetScaler ADC/NetScaler Gateway 10.5
环境安装
Citrix Gateway (Maintance Phase) 12.1 Build 54.13/54.16 – Citrix
注册一个账号就可以下载了,下载VMware可以使用的版本
安装手册
Citrix桌面虚拟化项目手册-NetScaler基本安装和部署 – 豆丁网Docin
默认用户名密码:
nsroot:nsroot
我们先把所有的文件拷贝出来,方便分析scp -r nsroot@192.168.164.211:/ ./5416
使用idea进行代码分析
IDEA IntelliJ如何配置Perl的运行环境_crazy_kangaroo的博客-CSDN博客
审查 web 配置
已知该服务是运行在80/443端口
通过ssh连接进入后台
输入 shell
进入命令行,lsof -i :80
查找80端口的服务,
知道是使用了httpd,那么配置文件一般在 /etc/httpd.conf
该漏洞有以下几个要点:
httpd的配置,这里决定了后端资源,接口,CGI的访问规则,也是分析这个项目的起点,这里有3处可以直接调用代码的地方
蜜罐信息
根据当日2020.01.10 蜜罐抓取到的在野利用相关信息
A Quick Update on Scanning for CVE-2019-19781 (Citrix ADC / Gateway Vulnerability
这里可以判断漏洞点应该在 newbm.pl
->/vpns/portal/scripts/newbm.pl
存在一个安全问题
Citrix NetScaler CVE-2019-19781: What You Need to Know
所以这里从httpd.conf
看来,这里一定存在问题
PerlSetEnv scriptLoc /vpns/portal/scripts/
Alias /vpns/portal/scripts/ /netscaler/portal/scripts/
# AddHandler treats the extension not as the last dot component,
# but something that can appear anywhere. So, don't use it.
# For example a.pl.xml will match both .pl and .xml.
<LocationMatch "/vpns/portal/scripts/.*\.pl$">
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
Options +ExecCGI
PerlSendHeader On
allow from all
</LocationMatch>
这是一个没有权限校验的接口, 会调用 /netscaler/portal/scripts/
下面的pl脚本
xml文件任意写入可控/目录穿越
查看 newbm.pl
use strict;
use NetScaler::Portal::UserPrefs;
use NetScaler::Portal::Config;
use Encode;
use vars qw (%c);
my $cgi = new CGI;
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'));
$newurl =~ s/&/%26/g;
$newurl =~ s/</%3C/g;
$newurl =~ s/>/%3E/g;
$newurl =~ s/"/%22/g;
$newurl =~ s/'/&apos;/g;
my $newBM = { url => $newurl,
title => $newtitle,
descr => $newdesc,
UI_inuse => $UI_inuse,
};
.............
.............
.............
if ($newBM->{url} =~ /^\\/){
push @{$doc->{filesystems}->{filesystem}}, $newBM;
} else { # bookmark
push @{$doc->{bookmarks}->{bookmark}}, $newBM;
}
undef(@{$doc->{escbk}->{bookmark}});
undef(@{$doc->{escbk}->{filesystem}});
$user->filewrite($doc);
.............
发现这里可以操控文件名写入可控内容
具体原因在看 NetScaler::Portal::UserPrefs→csd(), 这里用户名直接从http header中取值,并未对用户身份进行校验,此处可以伪造
以及 NetScaler::Portal::UserPrefs→writefile(), 文件名就是用户名,来自于http header中的 HTTP_NSC_USER,可以控制,且是拼接,可以进行目录穿越写文件
再来看文件内容可控,这里的url,title,desc,UI_inuse都是可控的,是不能存在 [‘&<>”]这些字符,会被转义
基本可以构造出来如下请求
(Bookmark Added 前面是我调试加的,加不加都不影响结果)
perl的web需要.pl文件的开头加上
print "Content-type: text/html\n\n";
print '<meta charset="utf-8">';
就可以正常调试不报500
可以看到 NSC_USER: ../global
,那就会在 /var/vpn/global.xml
写入如下内容
模板渲染
2020.01.10 晚上10点左右,又发布了如下文章
Deep Dive in to Citrix ADC Remote Code Execution, CVE-2019-19781 – MDSec
文中指出,这个目录下面可以直接以模板形式渲染文件
<Location /vpns/portal/>
SetHandler perl-script
PerlResponseHandler NetScaler::Portal::Handler
PerlSendHeader On
</Location>
根据config.pm
, 可以知道模板目录在 /netscaler/portal/templates/
/vpns/portal/
目录下的请求使用 NetScaler::Portal::Handler
进行处理,
也就是 /netscaler/portal/modules/NetScaler/Portal/Handler.pm
可以看出来,这里直接获取文件地址,然后渲染模板,perl中使用的是 Template-Toolkit, 这个模板可以执行命令
(一开始这里看到了,但是没想到可以这么调用,perl的框架不熟,第一次遇到)
EVAL_PERL 沙盒绕过
但是默认情况下,是不会开启模板中perl代码执行的,但是在issue中发现了一条绕过
You can eval Perl without EVAL_PERL · Issue #245 · abw/Template2
[% template.new({ 'BLOCK' => 'print STDERR "ace.\n"; die' }) %]
前文提到, 这里不能出现 >,会被转义,但是根据template-toolkit官方文档中对HASH的描述
模板中可以使用=
来代替=>
所以这时候 poc 很容易就可以构造出来
其他利用点
同理可得/vpn/../vpns/portal/scripts/picktheme.pl
/vpn/../vpns/portal/scripts/rmbm.pl
这里通过需要将poc写入文件名, 可能会受到特殊字符影响,总体不如newbm.pl
修复方案
暂时屏蔽未授权用户对/vpns/路径的访问
拦截url中包含 /../ 的恶意请求
时间线
2019.12.17 Citrix官方发出CVE-2019-19781漏洞通告
2020.01.09 Twitter用户发出/vpn/../vpns/cfg/smb.conf
相关POC
2020.01.09 斗象应急响应团队发出漏洞通告
2020.01.10 斗象应急响应团队进行漏洞分析, 研究输出EXP
2020.01.11 Twitter用户公开EXP
这个洞有点可惜, 刚分析出来就全网公开了
总的来说,这个漏洞因为公开的信息比较多,所以相对简单
前后花了一天时间,做了以上分析
作者:斗象能力中心 TCC – 小胖虎