1 of 34

DNS改ざん検知ツールの実装とDNSパケットの世界

市川@cakephper

2020/12/12 PHPCON2020

2 of 34

自己紹介

  • 市川 @cakephper
  • 株式会社ビットフォレスト CTO
    • Scutum
    • VAddy
  • 福岡在住

3 of 34

今日伝えたいこと

  • ドメイン名ハイジャックは恐ろしい
  • DNSは面白い!

4 of 34

目次

  • DNSの仕組み
  • ドメインハイジャックの恐ろしさ
  • ドメインハイジャック対策ツール NSchecker
  • DNSプロトコル
  • DNSレスポンスの解析

5 of 34

IPとDNS

  • DNSはIPとドメイン名をマッピング
  • HOSTS.TXTの共有が限界に
  • DNS誕生(1980年代)
    • RFC882, RFC883 (1983)
    • RFC1034, RFC1035 (1987)

インターネット10分講座:DNS

https://www.nic.ad.jp/ja/newsletter/No22/080.html

6 of 34

DNSの仕組み

ROOTサーバ

TLD(.com, .jp)

権威サーバ

ns1.bitforest.jp

route53, etc

フルリゾルバ

(キャッシュサーバ)

www.bitforest.jpは?

www.bitforest.jpは?

jpの権威サーバ(a.dns.jp)に問い合わせて!

www.bitforest.jpは? (a.dns.jp宛)

ns1.bitforest.jpサーバに問い合わせて!

www.bitforest.jpは?(ns1.bitforest.jp宛)

www.bitforest.jp は 169.254.1.3

169.254.1.3

7 of 34

ドメイン登録

ROOTサーバ

TLD(.com, .jp)

権威サーバ

ns1.bitforest.jp

route53, etc

レジストラ

ドメイン取得

bitforest.jpはns1.bitforest.jp

bitforest.jpはns1.bitforest.jp

レコード登録

A www 169.254.1.3

フルリゾルバ

(キャッシュサーバ)

www.bitforest.jpは?

8 of 34

ドメイン名

ハイジャック

ROOTサーバ

TLD(.com, .jp)

権威サーバ

ns1.bitforest.jp

レジストラ

ドメイン改竄

bitforest.jpはns99.example.jp

bitforest.jpはns99.example.jp

ns99.example.jp

フルリゾルバ

(キャッシュサーバ)

www.bitforest.jpは?

9 of 34

目次

  • DNSの仕組み
  • ドメインハイジャックの恐ろしさ
  • ドメインハイジャック対策ツール NSchecker
  • DNSプロトコル
  • DNSレスポンスの解析

10 of 34

ドメイン名ハイジャックの恐ろしさ

  • レジストラ経由で変更されてしまうため気付きにくい
  • MXが変更されるとメールが乗っ取られる
    • クラウドサービスのパスワードリセット
  • 悪意あるWebサーバへの誘導(HTTPSもOK)
  • 徐々にやられていくと気付きにくい
    • 例えば10回に1回だけ悪意あるサーバIPを返す

11 of 34

ドメイン名ハイジャック事件 1

  • Coincheck (2020年6月)
    • Webトラフィック減少・遅延から発覚
    • レジストラの脆弱性により改ざん
      • ns-1515.awsdns-61.org (正)
      • ns-1515.awsdns-061.org (誤)
    • MX変更でメール乗っ取り

12 of 34

ドメイン名ハイジャック事件 1

  • Coincheck (2020年6月1日)の流れ
    • 正午ごろに異変に気付く
    • 午後にレスポンス悪化、AWSサポートに連絡
    • 夕方に原因が判明
    • 深夜ドメイン回復

13 of 34

ドメイン名ハイジャック事件 2

  • Liquid (2020年11月)
    • レジストラ経由でドメイン情報が変更
    • メール乗っ取り
    • インフラに不正アクセス

14 of 34

防御方法

  • レジストラの問題が起点となる場合は防げない
  • 改ざん検知して早めに対応するしかない
    • 改ざん検知できれば状況がすぐに把握できる

15 of 34

目次

  • DNSの仕組み
  • ドメインハイジャックの恐ろしさ
  • ドメインハイジャック対策ツール NSchecker
  • DNSプロトコル
  • DNSレスポンスの解析

16 of 34

DNS改ざん検知ツール NSchecker

  • 正直怖くなってツールを作成してOSSで公開
  • TLD権威サーバ(com, net, jp)に登録しているNS情報をチェック
  • 改ざん検知するとコマンドが異常終了
    • Slack通知機能搭載
    • コマンドの結果からメール通知や他の連携が可能

17 of 34

改ざん検知ツール NSchecker

18 of 34

NSchecker 7月

  • ver0.01公開
    • dig NS bitforest.jp と同じことをして結果をチェック
    • フルリゾルバ(DNSキャッシュサーバ)を使っていた
    • 権威サーバのNS情報は最大48時間キャッシュ

19 of 34

NSchecker 8月

  • ver0.03公開
    • dig NS bitforest.jp @a.dns.jp
    • TLDの権威サーバにDNSパケットを送信して確認
    • 検知まで48時間 -> 数秒

20 of 34

NSchecker 9月

  • ver 1.0公開
    • 全てのドメインに対応
    • LinuxとmacOSの実行ファイルを配布
    • https://github.com/ichikaway/nschecker/releases

21 of 34

目次

  • DNSの仕組み
  • ドメインハイジャックの恐ろしさ
  • ドメインハイジャック対策ツール NSchecker
  • DNSプロトコル
  • DNSレスポンスの解析

22 of 34

DNSは面白いぞ!

23 of 34

DNSプロトコル

  • 30年以上の歴史!
  • UDP上の512バイト以内のデータ
    • TCPフォールバックあり
  • 権威サーバの数が制限
    • comは a.gtld-servers.net … m.gtld-servers.netの13
  • 1bit単位でフォーマットが決まっている

24 of 34

DNSヘッダ(バイトなんて贅沢だ!)

25 of 34

DNSプロトコルフォーマット

ヘッダ (トランザクションID, 再帰クエリフラグなど)

Question (NAME, Type(NS, A), CLASS)

Answer (AレコードのIP、NSサーバ名など)

Authority (委任先サーバのレコード)

Additional (NSのIPアドレス)

NAME

Type

Class

TTL

Length

Data

26 of 34

27 of 34

目次

  • DNSの仕組み
  • ドメインハイジャックの恐ろしさ
  • ドメインハイジャック対策ツール NSchecker
  • DNSプロトコル
  • DNSレスポンスの解析

28 of 34

見えるDNSデータ (dig NS vaddy.net)

29 of 34

DNSレスポンス

  • 名前はラベルで区切られてる
    • vaddy.net -> 5vaddy3net\0
  • 同じ文字のデータは圧縮する
    • オフセット

30 of 34

オフセットでデータ量を無駄にしない

31 of 34

ラベル文字数かオフセットかの判定

  • ラベルの文字数を表す1バイトの中で、上位2bitが11だった場合はオフセット、それ以外はラベル文字数になる
    • 11000000 の場合はオフセット
    • 00111111 以下の場合はラベル
  • ラベル文字数に使えるのは6bit(63文字)までの制約があるのはこのため

32 of 34

まとめ

  • ドメイン名ハイジャックは恐ろしい
  • 改ざん検知で早めに対応しよう
    • NSchecker
  • DNSは面白いぞ

33 of 34

ありがとうございました

34 of 34

PHPのUDPパケット送信例

socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)

socket_sendto()

socket_recvfrom()