歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

深入分析Citrix ADC遠程代碼執行(RCE)漏洞CVE-2019-19781

來源:本站整理 作者:佚名 時間:2020-03-18 TAG: 我要投稿


2019年年底,Citrix ADC和Citrix Gateway被曝出存在遠程代碼執行的高危漏洞CVE-2019-19781,該漏洞最吸引人的地方在于,未授權的攻擊者可以利用它入侵控制Citrix設備,并實現進一步的內網資源訪問獲取。漏洞由安全團隊Positive Technologies 和 Paddy Power Betfair發現上報,但在漏洞公告中卻未給出過多的漏洞利用方式,因此,這是值得來深入研究的地方。
漏洞分析
雖然在Citrix官方的漏洞公告中未透露出漏洞利用細節,但從其中的漏洞緩解措施中,卻側面揭露了該漏洞的相關類型:

從上述緩解措施信息中,我們判斷漏洞可能存在的路徑為/vpns/,且有可能是一個目錄遍歷漏洞。有了這些線索,我們開始在httpd.conf文件中去尋找路徑/vpns的定義方法,之后發現NetScaler::Portal::Handler Perl Module (Handler.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.”);
$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變量文件,還會生成一個新的模板,F在,將我們之前創建的test.xml測試文件放到模板目錄下,觸發模板解析行為看看:

總結來看,為了成功漏洞利用需要進行以下步驟:
1、通過模板機制發現執行Perl代碼的方式(需要繞過);
2、利用目錄遍歷方式,在模板目錄下放入一個經過構造的XML文件;
3、瀏覽放入的XML文件,觸發模板解析,實現XML中的代碼執行。
重點在于最后一步的任意代碼執行,在原本默認的Citrix配置中,是不能實現代碼執行的,只有經過一個特性配置才能實現Perl代碼執行。先前考慮到受漏洞影響的Citrix設備數量,且已有多個團隊已經把該漏洞武器化,因此我們沒有提供針對該漏洞的利用代碼,但后續隨著漏洞的披露以及多個安全研究者的exploit公開,我們也選擇了公布具體的漏洞利用方法。

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.www.hfjixin.com)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱admin@www.hfjixin.com,我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        百度 好搜 搜狗

        警告:本站禁止未滿18周歲訪客瀏覽,如果當地法律禁止請自覺離開本站!收藏本站:請使用Ctrl+D進行收藏