こんにちは。NFLabs. Offensive Teamの岩崎です。
本記事はNFLabs. アドベントカレンダー 10日目の記事となります。
近年、多くのWebサービスではCDN(Content Delivery Network)と呼ばれるWebコンテンツ配信サービスが利用されております。CDNは世界中に分散配置されたコンテンツサーバの中から、ユーザに対しネットワーク的に近いロケーションからコンテンツを返すことで効率的なコンテンツ配信(高速配信や多くのユーザへの同時配信など)を実現する技術です。
また、昨今はDDoS攻撃対策を目的としてオリジンサーバを秘匿する用途で利用されるケースも増えております。
本記事ではCDNのオリジンサーバのIPアドレス(以降、オリジンIP)を調査する方法について共有いたします。
特定方法
オリジンIPを特定する方法は多岐に渡りますが、今回は一般的な以下3種類の方法について説明します。
- 特徴的なレスポンスを基にした調査
- 関連するドメイン名の調査
- アプリケーションのコールバック通信を基に調査
各方法について詳細を説明致します。
1. 特徴的なレスポンスを基にした調査
ターゲットとなるサイトのレスポンスに含まれる特徴的な情報を基にしてオリジンIPを調査する方法となります。サーバを特定するために、ShodanやCensys、ZoomEyeなどの検索エンジンが利用される場合が多いです。
検索に利用するキーワードとして以下の特徴的な情報が有用です。これらの情報を基にしてShodanやCensysで調査します。
- SSL証明書
- Google AdsenseやGoogle Tag ManagerなどのID/Token/APIキー
- Favicon
- Titleタグ
一例として、2020/.nttのオリジンIPを調査しました。特徴的なレスポンスとしてGoogle Tag ManagerのID(GTM-5P8CN44)を基にしてオリジンIPを検索しました。
https://www.shodan.io/search?query=http.html%3AGTM-5P8CN44
検索結果としていくつかのIPアドレスが表示される場合もございます。検索結果が多い場合は、特徴的な情報や検索キーワードを検索クエリに追加する場合もございます。
Shodanの検索クエリは以下の資料が参考になります。
OSINT 用検索エンジンあれこれ | ninoseki.github.io
今回のケースでは180.12.186/.212がオリジンIPであると推測しました。118.158.52/.225はコンテンツこそ2020/.nttと同じでしたが、証明書のドメイン名がokdh/.ntt/.shであり、そのドメイン名にはWHOIS Guardが設定されていたため非公式のウェブサイトかと思われます。
その他にも、Faviconを元にしてShodanからオリジンIPを特定するためのツールとしてFav-upがございます。こちらのツールはFaviconのハッシュ値を基にして検索しているようです。
また、SSL証明書情報を基にしてCensysからオリジンIPを特定するためのツールとしてCloudFlairがございます。こちらのツールはCensysの証明書情報検索オプションを利用し、検索対象のドメイン名をCommon Nameに含む証明書を検索しているようです。
2. 関連するドメイン名の調査
この方法では「ドメイン名の抽出」と「ドメイン名の調査」に手順が分かれます。
2.a. ドメイン名の抽出
ドメイン名を抽出するための方法として幾つかの方法があります。
ターゲットウェブサイトをロードした際にアクセスするコンテンツのURL一覧からドメイン名を抽出し、ターゲットに関連するドメイン名を洗い出します。具体的には、FirefoxのNetworkツールなどを利用することで、ウェブページにアクセスした際にロードするURL一覧をエクスポートすることができます。
また、別の方法としてPassive DNSサービス(過去に登録されていたDNSレコードを検索するためのサービス)を利用してサブドメイン名に紐づく情報を収集する場合もあります。
Passive DNSサービスはDNSlyticsやSecurityTrailsが有名です。
https://securitytrails.com/securitytrails.com
例えば、DNSLyticsを利用して`bbc.com`を検索すると下記の様に過去に何度かAレコードが変更されていることが分かります。
各種インテリジェンスサービスを利用してもサブドメイン名を発見できない場合、DNSブルートフォースを利用してサブドメイン名を調査する方法もあります。ただし、DNSブルートフォースはターゲットのドメイン名を管理しているDNS権威サーバに負荷がかかる上、辞書に登録された簡単なサブドメイン名のみしか洗い出せないためお勧めできません。
nmap --script dns-brute target.example.com
2.b.ドメイン名の調査
洗い出したドメイン名を基にして、Passive DNSサービスを利用して過去のDNSレコードとして登録されていたIPアドレスにオリジンIPが含まれていないか確認します。
また、WHOIS Historyサービス(過去も含めたWHOIS情報を蓄積しているサービス)を利用し関連する情報が含まれていないか調査する場合もあります。WHOIS HistoryサービスはWhoisXML APIなどが有名です。
3. アプリケーションのコールバック通信を基に調査
ターゲットのサーバにコールバック通信を促し、コールバック通信が匿名化されていない場合にはオリジンIPを特定できる方法です。
この方法が利用できるかはアプリケーションに依存します。利用可能な一例として、WordPressではピンバック機能(XML-RPC)が存在しており、これが有効化されている場合にはコールバック通信を発生させることが可能です。また、ターゲットサーバ側でアクセスログを保存している場合には、アクセス端末のIPアドレスを逆引きした結果を保存している場合があります。その際のIPアドレス逆引き通信が匿名化されていなければ、オリジンIPを特定できる場合があります。
対策
ここまで、オリジンIPの調査方法について紹介しました。では、オリジンIPを特定されないようにするにはどのような対策をすれば良いのでしょうか?
最も重要なことはCDNを経由しないオリジンサーバへのアクセスを禁止することです。例えば、AレコードをCDNに向けていてもShodanやCensysなどのサービスはオリジンサーバのグローバルIP宛に直接アクセスしてきます。グローバルIP宛に直接アクセスした場合にレスポンスを返す状態になっていると、レスポンスからドメイン名を特定される可能性があります。そのため、外部からのアクセスはCDN事業者のIPにのみ制限しておくことが必要となります。
また、オリジンIPが含まれるDNSレコードを登録しないことも重要です。CDNを経由しない通信をFWでブロックしていたとしても、DDoS攻撃の規模によってはFWのリソースが枯渇する恐れがあるためです。尚、CDNの一部(CloudFlare)にはDNSレコードにオリジンIPが含まれていないか確認するの機能が提供されているそうです。
ShodanやDNSlyticsなど外部サービスに一度オリジンIPを関連付ける情報が掲載されると対策は実質的にできません。その場合、オリジンIPが特定されるリスクを許容するかサーバを別のIPにマイグレーションさせるなどの対応が必要となります。
まとめ
本記事ではCDNのオリジンIPを調査する方法と対策について紹介しました。オリジンIPを調査するのは難しい様に見えるかもしれませんが、ShodanやDNSlyticsなどの外部サービスから検索するだけでも特定できる場合がございます。今回は一部手法に焦点を当てて説明しましたが他にも様々な手法がございます。
もし、DDoS攻撃対策を目的としてCDNなどを利用されているのであれば上記の調査方法を利用して自身のサービスを調査してみてください。
参考資料
- https://pielco11.ovh/posts/cloud-hunting/
- What is an Image CDN - The Complete Guide
- https://nixcp.com/find-real-ip-address-website-powered-by-cloudflare/
- https://blog.detectify.com/2019/07/31/bypassing-cloudflare-waf-with-the-origin-server-ip-address/
- https://infosecwriteups.com/finding-the-origin-ip-behind-cdns-37cd18d5275
- https://www.slideshare.net/SoroushDalili/waf-bypass-techniques-using-http-standard-and-web-servers-behaviour
- https://www.secjuice.com/finding-real-ips-of-origin-servers-behind-cloudflare-or-tor/
- https://geekflare.com/find-real-ip-origin-address-of-website/