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.COM

# 漏洞分析
被以下專輯收錄,發現更多精彩內容
+ 收入我的專輯
評論 按熱度排序

登錄/注冊后在FreeBuf發布內容哦

相關推薦
  • 0 文章數
  • 0 評論數
  • 0 關注者
登錄 / 注冊后在FreeBuf發布內容哦
收入專輯
四月天小说网