DNSの通信を体験してきました(セキュリティ・キャンプ勉強会)
2017年10月31日にセキュリティ・キャンプ勉強会があったので行ってきた日記。
講師:金子 正人さん(IPAセキュリティ・キャンプグループ)
DNSについて
よく見るあの図(キャッシュサーバと権威サーバがイチャイチャしてるやつ)が登場。
- UDP通信でありコネクションレスだよ
- キャッシュサーバに再帰問い合わせ
- 権威サーバには反復問い合わせ
- 質問(名前、リソースレコードタイプ、クラス)が必須
- 名前とはドメイン名のこと(例:www.example.com)
- リソースレコードタイプ(例:A, CNAME, MX, NS, SOA, TXT)
- クラスは常にINクラス。インターネットが発達する前に必要かと思われた残骸。
- メッセージフォーマットのセクションは5つ(Headerなど)
ヘッダーやタイプなどの仕様はこちらを見ながら確認しました。
Domain Name System (DNS) Parameters
実際にやってみよう
ブラウジングしながらWiresharkでパケットを観察。フィルターは"udp port 53"。
Questionセクションの様子。3www8facebook3com0,0001,0001より、ドメイン名www.facebook.com、タイプA、クラスINとなっていることが確認できる。
1...000..0..0..1..1..と見えるのはHeaderセクションの様子。RD=1でキャッシュサーバに問い合わせてRCODE=0000と正しく受理されている。
ただし +norec (no recursive : 反復問い合わせ)でキャッシュサーバに問い合わせるとRD=0でRCODE=0101となりRefuseされた。
DNSはバイナリでリクエストを送るためtelnetとかできない。そのためコードを書く必要がある。
このあと、講師の方が書いたコードを使って好きなDNSリクエストを送って楽しんだ。なお、digではできない任意のリクエストも送れてしまうため、扱いには注意が必要である。
セキュリティについて
コネクションレスのUDPを使っているがidで返答を理解している。idは2^16通りしかないので全通り試して偽装できる。これがキャッシュポインズニングできてしまう原因である。
感想
ネットワークスペシャリスト試験の勉強でDNSがまあしょっちゅう出てくるので、そこで知っていたことと結びついて面白かった。あ、ここネスペでやったところだ!実際に手を動かすことでより深く知ることができたと思う。あとチューターの方がめちゃくちゃ詳しかった。頼りになりました。
続き