knqyf263's blog

自分のためのメモとして残しておくためのブログ。

Certificate Transparencyのログサーバからドメイン名一覧を取得してみた

Certificate TransparencyについてSCT埋め込まれてるんだなーぐらいのふわっとした理解だったので勉強し直していたのですが、ログサーバは誰もでアクセス可能だからログサーバに登録されている証明書からドメイン名の一覧を取得できてしまう、というのを見て自分でも試してみました。

有識者の間では常識みたいなので、特に大した内容ではないです。

概要

Certificate Transparency(CT)の説明は参考ページなどを見てもらうとして、今回はログサーバからドメイン名を取得できてしまう問題について試してみます。 ということで数日前ぐらいからログサーバからひたすらデータを引っ張ってくるやつを作ってみようと思っていたら、既にあることを昨日知りました。

crt.sh

なのでここで検索してみれば終わりって感じなのですが、CLIにしておくといつか使えるかなと思って作りました。

参考

詳細

crt.shというところがCTのログサーバからデータを貯めておいてくれているようです。そしてこいつがどうやらJSONでの出力に対応しているようなので、API的に使ってCLIを作りました。

github.com

以下のように --domain のオプションに渡すと、それにマッチするドメイン名を全て取得してくれます(もちろんログサーバに登録されてるものだけですが)。

$ crtsh search --domain %.example.com
+----------------------+--------------------------------+---------------------+
|         NAME         |             ISSUER             |     NOT BEFORE      |
+----------------------+--------------------------------+---------------------+
| www.example.com      | C=US, O=DigiCert Inc,          | 2014-11-06T00:00:00 |
|                      | OU=www.digicert.com,           |                     |
|                      | CN=DigiCert SHA2 High          |                     |
|                      | Assurance Server CA            |                     |
| www.example.com      | C=US, O=DigiCert Inc,          | 2015-11-03T00:00:00 |
|                      | OU=www.digicert.com,           |                     |
|                      | CN=DigiCert SHA2 High          |                     |
|                      | Assurance Server CA            |                     |
| dev.example.com      | C=US, O=Symantec Corporation,  | 2016-07-14T00:00:00 |
|                      | OU=Symantec Trust Network,     |                     |
|                      | CN=Symantec Class 3 Secure     |                     |
|                      | Server CA - G4                 |                     |
| products.example.com | C=US, O=Symantec Corporation,  | 2016-07-14T00:00:00 |
|                      | OU=Symantec Trust Network,     |                     |
|                      | CN=Symantec Class 3 Secure     |                     |
|                      | Server CA - G4                 |                     |
| support.example.com  | C=US, O=Symantec Corporation,  | 2016-07-14T00:00:00 |
|                      | OU=Symantec Trust Network,     |                     |
|                      | CN=Symantec Class 3 Secure     |                     |
|                      | Server CA - G4                 |                     |
| www.example.com      | C=US, O=Symantec Corporation,  | 2016-07-14T00:00:00 |
|                      | OU=Symantec Trust Network,     |                     |
|                      | CN=Symantec Class 3 Secure     |                     |
|                      | Server CA - G4                 |                     |
| *.example.com        | C=US, O="thawte, Inc.",        | 2016-07-14T00:00:00 |
|                      | CN=thawte SSL CA - G2          |                     |
| m.example.com        | C=US, O="thawte, Inc.",        | 2016-07-14T00:00:00 |
|                      | CN=thawte SSL CA - G2          |                     |
| www.example.com      | C=US, O="thawte, Inc.",        | 2016-07-14T00:00:00 |
|                      | CN=thawte SSL CA - G2          |                     |
| *.example.com        | C=US, O="thawte, Inc.",        | 2016-07-14T00:00:00 |
|                      | CN=thawte SSL CA - G2          |                     |
| www.example.com      | C=US, O="thawte, Inc.",        | 2016-07-14T00:00:00 |
|                      | CN=thawte SSL CA - G2          |                     |
+----------------------+--------------------------------+---------------------+

今までサブドメイン名を探すためにMetasploitやその他のOSINTツールを使ったりしていたかと思いますが、こちらでも似たことができます。 ただし、OSINTツールはGoogle検索の結果なども使っており、HTTPS対応していないドメイン名も取得できるため、必ずしもログサーバからの検索の方が網羅性が高いとは限りません。 今後HTTPS対応のサイトが増えてログサーバに登録される証明書が増えれば検索できるドメイン名はどんどん増えていくと思います。

OSINTツールの紹介をした以下のような記事もあるようです!

qiita.com

VPNサーバを探したりとか、色々と攻撃に使えそうで捗りますね(もちろん自分の管理外のサーバへの攻撃は駄目です)。

また、queryを投げることができるのでOrganization名などでも検索できます。

$ crtsh search --query Facebook
+-------------------------------+---------------------------+----------------------+---------+---------------------------+
|          COMMON NAME          |       ORGANIZATION        |       LOCALITY       | COUNTRY |         NOT AFTER         |
+-------------------------------+---------------------------+----------------------+---------+---------------------------+
| *.ak.fbcdn.net                | Facebook                  | Palo Alto            | US      | May 11 23:59:00 2013 GMT  |
| connect.facebook.net          | Facebook                  | Palo Alto            | US      | May 11 23:59:00 2013 GMT  |
| m.ak.fbcdn.net                | Facebook                  | Palo Alto            | US      | May 11 23:59:00 2013 GMT  |
| facebook.drivebenfield.com    | Benfield Motor Group      | Newcastle upon Tyne  | GB      | Sep 26 23:59:59 2017 GMT  |
| m.ak.fbcdn.net                | Facebook                  | Palo Alto            | US      | Apr 4 14:12:07 2014 GMT   |
| connect.facebook.net          | Facebook                  | Palo Alto            | US      | Apr 1 14:12:51 2014 GMT   |

これは全文検索みたいな感じなので、Organization名じゃなくCommon Nameの方でヒットしたりもしてますね。 ちなみにcrt.shで検索しても一覧にドメイン名は表示されないので、こっちのツールを使うほうが便利です!!

crt.sh | Facebook

少し実装について説明すると、crt.shのGETパラメータに output=json をつけるとJSONで返してくれるのでそれをパースするだけです。簡単!

と思ったのですが、何故かJSONで返してくれないページが多いです。あとJSON内に欲しい情報がないことも多かった。 crt.shのバグじゃないかなーと思ってます。 ということで、裏側ではそれぞれのページをスクレイピングして取ってきていたりします。 なのでレイアウト変わると死にます。 開発時間2時間ぐらいなので仕方ない。

まとめ

自分でログサーバから証明書を定期的に取ってきて貯めようと思ったらすでに存在しました(存在するだろうとは思ってましたが)。 仕方ないので自分でCLI作ってcrt.shから間接的にドメイン名一覧を取得したりして遊びました。 OSINTに使えてしまうので、内部でしか使わないドメイン名に証明書発行するときはログサーバに登録されないようにとか、ちゃんと考えないとなーと思いました。 EV以外はログサーバに登録しないところもあるみたいですが、今後どうなるかは分かりませんね。。