NEWS.ALL
Ruizhao's News Reader

Citrix Gateway/ADC 远程代码执行漏洞分析

FreeBuf /2020-04-07

事件背景

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的描述

Template::Manual::Variables

模板中可以使用=来代替=>

所以这时候 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 – 小胖虎