freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Citrix Gateway/ADC 远程代码执行漏洞分析
2020-03-01 19:05:35

事件背景

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 – 小胖虎

# 漏洞分析
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者