SSRFを利用したメール送信ドメインの乗っ取り

Oct 22, 2018


前回の記事に続き、サイボウズの脆弱性報奨金制度で認定されたSSRFの詳細を開示する。今回はメールワイズに存在したSSRFを現実的な脅威に発展させることに成功した。その経緯をまとめている。

メールワイズの概要

「メールワイズ」はサイボウズが提供する企業向けのメーラーである。クラウド版とパッケージ版の2種類が提供されており、脆弱性はクラウド版だけに影響した。

クラウド版のメールワイズはサイボウズが所有するサーバー上で動作する。企業がメールワイズを利用する場合、まず自社のメールサーバーをメールワイズに登録する必要がある。メールサーバーを登録するには以下のページからサーバー名とポート番号を入力する。脆弱性はメールサーバーの登録処理に存在していた。

mw_server

SSRFの脆弱性

メールサーバーの登録処理を実行すると、メールワイズは入力されたサーバー名とポート番号へ接続を試みる。サーバー名の入力値検証に不備が存在したためSSRFが可能となった。脆弱性は受信メールサーバー(POPまたはIMAPサーバー)と送信メールサーバー(SMTPサーバー)の両方の登録処理に存在しており、SMTPサーバーの登録処理での脆弱性を現実的な脅威につなげられた。以降はSMTPサーバーの登録処理での調査を解説していく。

IPアドレス検証の不備

SSRFの調査では、まずループバックを入力してサーバー自身への接続を試みる。サーバー名に localhost127.0.0.1 を、ポート番号に 25 を入力すると、以下のエラーにより登録を拒否される。

127.0.0.1_25

サーバー名を一般的でないループバックアドレスである 127.0.0.2 に変更するとエラーの内容も変化する。

127.0.0.2_25

127.0.0.2:25 ではSMTPサーバーは動作していないが、接続リクエストは送信できていることがエラーの内容から読み取れる。ポート番号を変更して 127.0.0.2:22 に接続リクエストを送信すると、エラーの内容にサーバーからのレスポンスが含まれる。

127.0.0.2_22

127.0.0.2:22 ではSSHサーバーが動作していることがわかり、バージョン情報も取得できる。また 127.0.0.2:8080 ではWebサーバーも動作している。

127.0.0.2_8080

内部ホスト(サーバー自身)へのリクエストを偽装できることからSSRFの脆弱性といえる。ここまでの挙動を一旦サイボウズへ報告した。

内部ネットワークの調査

内部ネットワークに存在する他のホストに接続するには内部IPアドレスを特定する必要がある。内部IPアドレスの範囲を総当りすることで特定も可能だが、検証環境への高負荷が懸念される。総当たりは実施せず、サーバーの設定不備により漏洩した内部IPアドレスを探すと、検証環境から送信されるシステムメールのヘッダ情報にそれらしき値が見つかる。

recived_header

Receivedヘッダには送信元サーバーの内部IPアドレスである 10.176.64.171 が含まれている¹。さっそく 10.176.64.171:25 をメールワイズのSMTPサーバーとして登録を試みるが、以下のエラーにより失敗に終わる。

10.176.64.171_25

特殊なIPアドレスへの接続

諦めかけてTwitterを眺めているとDNSDumpsterでのSSRFのレポートが流れてきた。報告者である@hacker_氏は調査の中で 0x0.0x0.0x0.0x00000.0000.0000.0000 という見慣れないIPアドレスを使用している。これらはオクテットごとに16進数や8進数に変換された形式のIPアドレスであり、どちらも 0.0.0.0 として解釈される。

Linux上では 0.0.0.0 にpingを打つと 127.0.0.1 にエコーリクエストが送信される。メールワイズはUbuntu上で動作していることがSSHサーバーのバージョン情報から判明している。そのため 0.0.0.0127.0.0.1 として扱われると想定し、0.0.0.0:25 をSMTPサーバーとして入力すると登録に成功する。

0.0.0.0_25

なぜ 127.0.0.2:25 ではSMTPサーバーに接続できず、0.0.0.0:25 では接続できたのか。ブラックボックスであるため原因は不明だが、サイボウズの内部ネットワークに存在するSMTPサーバーをメールワイズに登録できた。

送信ドメインの乗っ取り

メールサーバーの登録後にメールアカウントを作成することで、メールワイズ上からメールを送信できるようになる。メールアカウントにはメール送信時のFromヘッダの値(メールアドレスと表記名)を設定できる。メールアドレスには検証環境のドメインを含めた [email protected] を、表記名には セキュリティ事務局 を入力してメールアカウントを作成する。

mw_account

これにより "セキュリティ事務局" <[email protected]> から任意の宛先にメールを送信できるようになる。試しに私が所有するGmail宛にメールを送信する。

mw_send

Gmailには セキュリティ事務局 から差し出されたメールが届く。メールの送信元IPアドレスは 103.79.13.22 であり、このIPアドレスは cybozu-dev.com のSPFレコードに含まれているため送信ドメイン認証に成功する。受信したメーラーで不正なメールと判定されない本物のメールを偽装できる状態だった。

mw_spf

標的型攻撃への応用

サイボウズの管理者やセキュリティ部門が使いそうなメールアドレスから送られたメールであれば、サイボウズ製品の利用者は何の疑いもなく開くだろう。メールワイズではファイルを添付したメールも送信できるため、以下のようなメールを利用者に送りつけることで高い添付ファイル開封率が期待できる。

targeted_mail

サイボウズに所属する特定の人物になりすますことで、サイボウズ自体や関連企業への標的型攻撃の成功率も高くなる。本番環境の送信ドメインは cybozu.com であるため "青野 久慶" <[email protected]> にもなりすませる状態だった。

所感

送信ドメインの乗っ取りについても追加情報として報告し、メールワイズでのSSRFは「メールサーバの設定機能を利用した SSRF(CyVDB-1686)」として認定された。サイボウズが提供する他のサービスでも同様の脆弱性を発見し、CyVDB-1687CyVDB-1689²で認定されている。IPアドレスやURLの検証不備によるSSRFは過去にも何度か見つけたが、XSPAの実証だけで報告していた³。さらなる脅威に発展させるための調査は目的によって要否の判断が分かれる。脆弱性の洗い出しが目的の脆弱性診断では不要だが、内部ネットワークへの侵入を目的としたペネトレーションテストでは必要になる。

バグバウンティでは、内部ネットワークのサービスや他の脆弱性と組み合わせて、より深刻な問題を報告することが評価されるのであれば、入念に調査する価値はある。成功例として、台湾のバグハンターである@orange_8361氏が発見したGitHubでのSSRFが挙げられる。氏はSSRFによりGitHubの内部ネットワークを調査することで、4つの脆弱性を組み合わせたRCEを実証し、合計で12,500ドルの報奨金を獲得した。ただし全ての企業がこのような高評価をしてくれるとは限らない。内部ネットワークの調査を禁止している企業もあるので、入念な調査に取り掛かる前に報奨金制度の方針を再確認したい。

今回発見したCyVDB-1686は初めCVSS 3.8と評価されたが、送信ドメインを乗っ取れた事実に基づいた評価を依頼し、CVSS 5.5に変更された。変更理由についてサイボウズは「偽装したメールを送信可能であるという点は被害がコンポーネントの外に拡大していると判断した」と述べている。影響範囲を広げられて高評価にもつながったので、入念な調査に費やした時間が報われた。

時系列

2017年12月19日 - SSRFを発見
2017年12月20日 - SSRFをサイボウズへ報告
2017年12月21日 - 送信ドメインの乗っ取りをサイボウズへ追加報告
2018年2月13日 - サイボウズからCVSS 3.8で認定との連絡
2018年3月16日 - CVSSの再評価をサイボウズへ依頼
2018年3月22日 - サイボウズからCVSS 5.5に変更との連絡
2018年8月31日 - サイボウズから110,000円が入金
2018年10月18日 - サイボウズが脆弱性の開示を承諾


¹ 内部IPアドレスの漏洩は別の脆弱性として報告したが、既にCyVDB-1179で認定されておりサイボウズはこれを許容していた。
² Garoonのパッケージ版では一部機能に脆弱性が残存しているが、サイボウズは製品の性質上の理由からリスクを許容している。
³ サイボウズは2018年9月にXSPAを認定対象外としたため、現在はポート開閉の特定だけでは脆弱性として認定されない可能性がある。