以前にサブドメインの乗っ取りを行ったことがない、または新しくやりたいと思っている人のため、
基本的な説明に役立つシナリオ例を考案しました。
このシナリオでは、example.comがターゲットであり、example.comを運営するチームにバグバウンティプログラムがあると仮定します。
example.comに属しているすべてのサブドメイン(後で検討するプロセス)を列挙している間に、
ハッカーはsubdomain.example.comというGitHubページを指し示すサブドメインを見つけます。
サブドメインのDNSレコードを確認することでこれを判断できます。
この例では、subdomain.example.comには、GitHubのカスタムページ用の専用IPアドレスを指す複数のAレコードがあります。
$ host subdomain.example.com
subdomain.example.com has address 192.30.252.153
subdomain.example.com has address 192.30.252.154
$ whois 192.30.252.153 | grep "OrgName"
OrgName: GitHub, Inc.
ほとんどのハッカーはこの時点でうずきが始まります。この404ページは、トップレベルのディレクトリの下にコンテンツが提供されていないこと、およびこのサブドメインを個人のGitHubリポジトリに追加しようとする必要があることを示しています。これは、すべてのアプリケーションでテイクオーバーが可能であることを示しているわけではありません。一部のアプリケーションタイプでは、テイクオーバーのためにHTTPとHTTPSの両方の応答をチェックする必要があり、他のタイプは脆弱ではない可能性があります。
カスタムサブドメインがGitHubプロジェクトに追加されると、リポジトリの内容がsubdomain.example.comに配信されていることがわかります。サブドメインを正常に要求しました。デモの目的で、インデックスページにカエルの画像が表示されるようになりました。
セカンドオーダーサブドメイン乗っ取りは、「壊れたリンクハイジャック」と呼ばれます。これは、ターゲットに必ずしも属していないが、ターゲットのウェブサイトにコンテンツを提供するために使用されている脆弱なサブドメインです。これは、リソースがターゲットページにインポートされていることを意味します。たとえば、JavaScriptのblobによって、リソースがインポートされているサブドメインを要求できます。ページのどこかで使用されているホストを乗っ取ってしまうと、最終的に、クロスサイトスクリプティングが保存される可能性があります。敵対者はターゲットページに任意のクライアントサイドコードを読み込むことができるからです。このガイドでこの問題を挙げたい理由は、ハッカーとしてターゲットホスト上のサブドメインに自分自身を限定したくないという事実を強調することです。ソースコードを調べ、ターゲットが依存するすべてのホストをマッピングすることで、スコープを簡単に拡張できます。
また、サブドメインをハイジャックすると、サブドメインからアセットをインポートするページがあるかどうかを調べる価値があります。
ここでは、誤って設定されたサブドメイン上のコンテンツを提供するために必要なものの概要を説明しました。
次に、脆弱なサブドメインを見つけるために使用される膨大な技術、トリック、ツールを把握します。
これらのプロセスはサブドメインの検出に役立ちますが、異なる結果をもたらす可能性があるため、ダイビングする前に、まずスクレイピングとブルートフォースを区別する必要があります。スクレイピングは、外部サービスとソースを使用して特定のホストに属するサブドメインを収集する、受動的な偵察手法です。 DNS DumpsterやVirusTotalなどの一部のサービスでは、過去にクロールされたサブドメインのインデックスを作成して、結果をすばやく収集して並べ替えることができます。
スクレイピングは、インデックスページを使用するだけでなく、ターゲットのgitリポジトリ、コンテンツセキュリティポリシーヘッダ、ソースコード、issueトラッカーなどをチェックすることを忘れないでください。ソースのリストは無限で、私は常に結果を増やすための新しい方法を発見します。しばしば、あなたのテクニックがより独特であればあるほど、誰にも出てこないものを見つける可能性が高くなります。創造性を持ち、脆弱性公開プログラムに対して実際にあなたのアイデアをテストしてください。
Ahmed Aboul-ElaのSublist3rは間違いなく、最も簡単なサブドメインスクレイピングツールです。この軽量Pythonスクリプトは、多数の検索エンジン、SSL証明書、およびDNS DumpsterなどのWebサイトからサブドメインを収集します。私のパーソナルマシンのセットアッププロセスは、次のように簡単でした。
$ git clone https://github.com/aboul3la/Sublist3r.git
$ cd Sublist3r
$ sudo pip install -r requirements.txt
ブルートフォースのサブドメインを強制すると、ハッカーはワードリストを反復し、応答に基づいてホストが有効かどうかを判断できます。ターゲットにワイルドカードが有効になっているかどうかを常に確認することは非常に重要です。そうしないと、多くの誤検出が発生します。ワイルドカードは、すべてのサブドメインが結果を歪ませる応答を返すことを意味します。ターゲットが設定していない可能性があるランダムなホスト名を要求することで、ワイルドカードを簡単に検出できます。
$ host randomifje8z193hf8jafvh7g4q79gh274.example.com
ブルートフォースサブドメインの最善の結果を得るには、あなたが過去に出会った用語や興味のあるサービスによくリンクしている用語を使って、自分の個人的な単語リストを作成することをお勧めします。例えば、キーワード「jira」と「git」は、時には脆弱なAtlassian JiraとGITインスタンスを検出するためです。
あなたがブルートフォースサブドメインを計画しているなら、Jason Haddixの単語リストを見てみることを強くお勧めします。 Jasonは、サブドメイン発見ツールのリストを1つの広範なリストにマージすることに全面的に悩まされました。
サブドメインを見つける際に結果を増やすために、スクレイピングやブルートフォースだけでなく、フィンガープリンティングと呼ばれる手法を使用することができます。フィンガープリンティングを使用すると、ターゲットのカスタム単語リストを作成し、一般単語リストを使用して見つからないターゲットに属するアセットを表示できます。
サブドメインの買収にはさまざまなツールがあります。このセクションにはこれまでに言及されていない注目すべきものがいくつか含まれています。
-Altdns 再帰的にブルートフォースでサブドメインを作るために、Shubham ShahのAltdnsスクリプトを見てください。 Altdnsを使ってターゲットを指紋採取した後にカスタム単語リストを実行することは、非常に有益です。私はAltdnsを使って単語リストを生成し、他のツールを実行するのが好きです。
-Commonspeak Shubhamのさらに別のツールであるCommonspeakは、GoogleのBigQueryを使って単語リストを生成するツールです。目標は、テクノロジが急速に進化する今日の傾向を反映する単語リストを生成することです。このツールの仕組みやキーワードの収集場所をよりよく理解したい場合は、https://pentester.io/commonspeak-bigquery-wordlists/ を読む価値があります。
-SubFinder スクレイピングとブルートフォースを美しく組み合わせたツールがSubFinderです。私は自分の汎用サブドメイン発見ツールとしてSublist3r以上のSubFinderを使用しています。より良い結果を得るには、SubFinderがサブドメインを見つけるために拾い読みするさまざまなサービスにAPIキーを含めるようにしてください。
-Massdns Massdnsは驚異的な高速サブドメイン列挙ツールです。いくつかのツールでは何時間もかかりますが、Massdnsは1分で完了できます。 Massdnsの運用を計画している場合は、有効なリゾルバのリストを提供していることを確認してください。 https://public-dns.info/nameservers.txt を見て、リゾルバで遊んで、どれが最良の結果を返すか見てみましょう。リゾルバのリストを更新しないと、多くの偽陽性が発生します。
$ ./scripts/subbrute.py lists/names.txt example.com | ./bin/massdns -r lists/resolvers.txt -t A -o S -w results.txt
サブドメインの乗っ取りを捜すときは、自動化が重要です。トップバグバウンティハンターは常に変更のターゲットを監視し、見つけられるすべての単一サブドメインを常に監視しています。このガイドでは、セットアップの監視に焦点を当てる必要はないと私は考えています。
代わりに、私はあなたに時間を節約することができ、簡単に自動化できる簡単なトリックに固執したいと思います。
while read subdomain; do
if host "$subdomain" > /dev/null; then
# If host is live, print it into
# a file called "live.txt".
echo "$subdomain" >> live.txt
fi
done < subdomain-list.txt
だから、これまでに持っていたものすべてをまとめると、次のワークフローが完成します。
次のステップは、さまざまなサブドメインの概要を取得することです。次の2つのオプションがあります。1つは、すべてのサブドメインでスクリーンショットスクリプトを実行することです。 2番目の方法では、ページの内容をテキストファイルに保存する必要があります。
スクリーンショットを撮るために、私のgo-toツールは現在EyeWitnessです。このツールは、あなたのホストのリストからすべてのスクリーンショット、レスポンスボディー、ヘッダーを含むHTML文書を生成します。
$ ./EyeWitness -f live.txt -d out --headless
EyeWitnessは場合によっては重すぎる可能性があります。
単純なGETリクエストを使用してページのコンテンツをサブドメインの最上位ディレクトリに保存したい場合があります。
このような場合は、トム・ハドソンのmegを使用します。 megは同時に要求を送信し、出力をプレーンテキストファイルに保存します。
これにより、サブドメインをふるい分けるための非常に効率的で軽量なソリューションとなり、キーワードをgrepすることができます。
$ meg -d 10 -c 200 / live.txt
私たちが注目しなければならない特別なケースがあります。その1つは、FransRosénが講演の中で強調しているものです。
「クラウドプロバイダーを使ったDNSハイジャック - 検証不要No verification needed」です。
デッドDNSレコードに遭遇するたびに、そのサブドメインをハイジャックすることはできないと仮定しないでください。
Fransが指摘するように、hostコマンドはエラーを返すかもしれませんが、digを実行するとデッドレコードが表示されます。
そうですね、ターゲットに属するサブドメインを制御するので、次に何をすることができますか?
誤設定されたサブドメインの攻撃シナリオを決定する際には、サブドメインがベース名とターゲットのコアサービスとどのように対話するかを理解することが重要です。
subdomain.example.comでは、example.comにスコープされているCookieを変更できます。
これは、潜在的にあなたがベース名で被害者のセッションをハイジャックすることを可能にする可能性があるので、覚えておくことが重要です。
output.jsbin.comから、jsbin.comのクッキーを設定できます。
ベース名がセッション固定に対して脆弱でHTTPOnly Cookieを使用する場合は、Cookieを設定してからブラウザを再起動すると、Cookieが経過時間によってソートされるため、新しく生成されたCookieより悪意のあるCookieが優先されます。
Cross-Origin Resource Sharing(CORS)は、ホストがクロスオリジンのコンテンツを共有することを可能にするテクノロジーです。
アプリケーションは、認証されたデータを含むデータをホストが抽出できるようにする一連のルールを使用してスコープを作成します。
一部のアプリケーションでは、サブドメインが信頼できるエンティティであるという前提で、サブドメインがクロスオリジンHTTPリクエストを行うことができます。
CORSヘッダーのサブドメインの外観をハイジャックすると、Burp Suite Proのスキャナが通常それらをピックアップし、アプリケーションがサブドメインをホワイトリストに登録するかどうかを確認します。これにより、メインアプリケーション上の認証されたユーザーからのデータを盗み出すことができます。
Cross-Origin Resource Sharingと同様に、Oauthフローにはホワイトリスト方式があり、開発者はどのコールバックURIを受け入れるべきかを指定できます。ここでもまた、サブドメインがホワイトリストに登録されているため、Oauthフロー中にサブドメインにユーザーをリダイレクトし、Oauthトークンが漏洩する可能性があります。
コンテンツセキュリティポリシー(CSP)は、アプリケーションが信頼するホストの別のリストですが、ここでの目的は、アプリケーションのコンテキストでクライアント側のコードを実行できるホストを制限することです。このヘッダーは、クロスサイトスクリプティングの影響を最小限に抑えたい場合に特に便利です。サブドメインがホワイトリストに含まれている場合は、サブドメインを使用してポリシーをバイパスし、アプリケーション上で悪意のあるクライアント側のコードを実行することができます。
$ curl -sI https://hackerone.com | grep -i "content-security-policy"
content-security-policy: default-src 'none'; base-uri 'self'; block-all-mixed-content; child-src www.youtube-nocookie.co
m; connect-src 'self' www.google-analytics.com errors.hackerone.net; font-src 'self'; form-action 'self'; frame-ancestor
s 'none'; img-src 'self' data: cover-photos.hackerone-user-content.com hackathon-photos.hackerone-user-content.com profi
le-photos.hackerone-user-content.com hackerone-us-west-2-production-attachments.s3-us-west-2.amazonaws.com; media-src 's
elf' hackerone-us-west-2-production-attachments.s3-us-west-2.amazonaws.com; script-src 'self' www.google-analytics.com;
style-src 'self' 'unsafe-inline'; report-uri https://errors.hackerone.net/api/30/csp-report/?sentry_key=61c1e2f50d21487c
97a071737701f598
「Cure53ブラウザセキュリティホワイトペーパー」に記載されているように、Internet Explorer、Edge、およびSafariは、X-Frame-OptionsヘッダーのALLOW-FROMディレクティブをサポートしています。つまり、サブドメインがホワイトリストに登録されている場合、ターゲットページをフレーム化し、クリックジャック攻撃を実行することができます。
これは必ずしもレポートに含めるものではありませんが、パスワード管理者の中には、メインアプリケーションに属するサブドメインのログインフォームに自動的に記入することに注意する価値があります。