Slide 1

Slide 1 text

Pythonで作るDNSリゾルバ PyFukuoka #6 発表者:井上 信之 2019/07/18(Tue)

Slide 2

Slide 2 text

自己紹介  なまえ 井上 信之  仕事 ネットワーク/インフラ系エンジニア 2 公開用資料では、非公表です。

Slide 3

Slide 3 text

公開ソフト一覧 https://www.vector.co.jp/vpack/browse/person/an060626.html 3

Slide 4

Slide 4 text

名前解決【 name resolution 】 名前解決とは、ソフトウェアなどが扱う対象の識別名(ホスト名やコンピュータ名 など)と、その名前が指し示している実体(IPアドレスなど)を対応付ける処理や 操作のこと。 4 www.hackerzlab.com xx.xxx.25.115 正引き 逆引き FQDN IPアドレス

Slide 5

Slide 5 text

DNSリゾルバとは… DNSサーバへホスト名+ドメイン名を照会して対応するIPアドレスを調べたり、 その逆(IPアドレス→ドメイン名)を調べたりするソフトウェア。 つまり、DNSクライアントのこと 5

Slide 6

Slide 6 text

DNSリゾルバの例 TCP/IPが実装されているOSでは、各種TCP/IPの通信処理の作成のためにAPIが提供 さている。代表的なものとして BSD Socket(UNIX系OS) や WinSock(MS-Windows) などがある。 Pythonでは、これらのAPI呼び出しをモジュール化したsocketモジュールが提供さ れている。 名前解決の関数例) 正引き gethostbyname() 逆引き gethostbyaddr()  単独のコマンドとして提供されているもの  nslookupコマンド(そのうち無くなるかもと言われ続け10年以上…)  digコマンド(BIND9での推奨。ただし、MS-Windowsには入っていない) 6

Slide 7

Slide 7 text

Nslookup(dig)テスト用サイト 7

Slide 8

Slide 8 text

Pythonのsoketモジュールでの名前解決例 Socketモジュールでの名前解決例 PS Z:¥> python … … >>> import socket >>> result = socket.gethostbyname("www.connpass.com") >>> print(result) xx.xxx.xxx.xx >>> result = socket.gethostbyaddr("xx.xx.xx.xx") >>> print(result) ('ec2-xx-xxx-xxx-xx.ap-northeast-1.compute.amazonaws.com', [], [‘xx.xxx.xxx.xx']) >>> print(result[0]) ec2-xx-xxx-xxx-xx.ap-northeast-1.compute.amazonaws.com >>> 8 入力したコマンドの実際の文字色は白 色ですが、この資料では、見やすいよ うに黄色に変更しています。 gethostbyname()やgethostbyaddr()は、 単純な正引きや逆引きの処理のみで DNSのレコードの種類などは指定できない。

Slide 9

Slide 9 text

DNSで扱うレコードの種類(主なもの) タイプ 値(10進数) 機能 A 1 名前に対するIPv4 IPアドレス NS 2 権威ネームサーバ CNAME 5 別名に対する正式名 SOA 6 ゾーンの権威の開始 PTR 12 IPアドレスに対する名前 MX 15 ドメインのメール転送エージェント(MTA)のリストとドメイン名を マッピングーンのメールサーバ TXT 16 テキスト形式のレコード AAAA 28 名前に対するIpv6 IPアドレス 9

Slide 10

Slide 10 text

DNSで扱うレコードの種類(主なもの) タイプ 値(10進数) 機能 SRV 33 プロトコルに使用される汎用サービスロケーションレコード DS 43 委任ゾーンのDNSSEC署名鍵を識別するために使用されるレコード RRSIG 46 DNSSECで保護されたレコードセットの署名。 DNSKEY 48 DNSSECで使用される鍵レコード。 NSEC3 50 zonewalkingを許可しないで名前のための非存在の証明を可能にする DNSSECへの拡張 NSEC3PARAM 51 NSEC3で使用するためのパラメータレコード * 255 ネームサーバーが保持している全てのタイプのすべてのレコードを回 答する。"ANY"と呼ばれることもある。 CAA 257 ホスト/ドメインに対して許容できるCAを制限する、DNS証明機関の承 認 10

Slide 11

Slide 11 text

digコマンド実行例1(引数なし) digコマンド実行例(引数なしでは . の NSレコードを問い合わせ) PS Z:¥> dig ; <<>> DiG 9.15.1 <<>> ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60625 ;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;. IN NS ;; ANSWER SECTION: . 498445 IN NS g.root-servers.net. . 498445 IN NS b.root-servers.net. . 498445 IN NS f.root-servers.net. . 498445 IN NS m.root-servers.net. . 498445 IN NS d.root-servers.net. . 498445 IN NS h.root-servers.net. . 498445 IN NS a.root-servers.net. . 498445 IN NS i.root-servers.net. . 498445 IN NS j.root-servers.net. . 498445 IN NS l.root-servers.net. . 498445 IN NS k.root-servers.net. . 498445 IN NS c.root-servers.net. . 498445 IN NS e.root-servers.net. ;; Query time: 74 msec ;; SERVER: xx.xx.xx.xx#53(xx.xx.xx.xx) ;; WHEN: Fri Jul 12 20:28:49 東京 (標準時) 2019 ;; MSG SIZE rcvd: 239 11 引数無しだと、Root<.>ゾーンの NSレコードを問い合わせ

Slide 12

Slide 12 text

digコマンド実行例2(dig jp) digコマンド実行例(1階層分を指定。デフォルトは Aレコード) PS Z:¥> dig jp ; <<>> DiG 9.15.1 <<>> jp ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52896 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;jp. IN A ;; AUTHORITY SECTION: jp. 795 IN SOA z.dns.jp. root.dns.jp. 1562917502 3600 900 1814400 900 ;; Query time: 27 msec ;; SERVER: xx.xx.xx.xx#53(xx.xx.xx.xx) ;; WHEN: Fri Jul 12 16:56:47 東京 (標準時) 2019 ;; MSG SIZE rcvd: 78 12 ドメイン名だけだと、Aレコードで問い合わせ “jp.” の Aレコードが見つからなかったので、 回答としてSOAレコードが返されている。

Slide 13

Slide 13 text

指定したドメインの全レコードが見たい んだけど… 昔は、セカンダリサーバ以外からのゾーン転送のリクエストも受け付けていたの で、ゾーンファイルの内容をまるごと取得することができた… が、最近は、セキュリティ対策のため、ゾーン転送の問い合わせには応答しない。 代わりに、*レコード(ANY)を指定する。 13

Slide 14

Slide 14 text

digコマンド実行例4(dig jp any) jp の ANY レコードを問い合わせ PS Z:¥> dig jp any ; <<>> DiG 9.15.1 <<>> jp any ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38158 ;; flags: qr rd ra; QUERY: 1, ANSWER: 18, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;jp. IN ANY ;; ANSWER SECTION: jp. 80507 IN RRSIG DNSKEY 8 1 86400 20190905184500 20190706184500 54004 jp. tynFuindpW5ddt8vNFOEGfWEb tleksHNcVwAAiCh9oGYlmU44p10oMgt oUhzxJawkq5zH0zoN2BCmAaB/FLsxPdNcicMPFhy7OS8vwy5KXgQlAEt aJq/1jInLXsUh4/QuEBdSkVUhlVHED6wAqkgWw8zF SBH3ZupfGY6IR6A PmC5sjGlhK7KyESJ2YMA/tD4zQxH6k/Ek0C0tCHTaUVlf10crySsm3AS p2dKChQ3PBOQ0B5ilMULibhxUyAB8b5xlm+7UsYvg+Pz5X0LB17VF/lR fxCc1Q8G5FzoORSt6pu8Kw7ehiIO6FiuV2kUTDqfpOfkFWpIMLVwLwlO f2Lt/w== jp. 80507 IN DNSKEY 256 3 8 AwEAAdsTPPJFhwoBmjsULoSV5PNXNNs3w0PPlGSfqwdVq5ThANHcXVkV bDsOkyJA8XkOKKt4R oz3U1r7ti6rJvxf/nu7npB2XrUXWqGzBSBXkCUR eTs/sPprOwT3eDGcDPy3ctE/LtLN/1xcy0P0uL23hZHxc9kU8HkVoo9H qmsc5DGR jp. 80507 IN DNSKEY 256 3 8 AwEAAfWRu769ojIHGh0HfbJkSReeVMfvkHNJcUfrEyZoi4CfpfdXwL3A tsfxcslbagHirNacy PciUWAQQEHikPLtHHkAXrF9+0aRBxDYtrPySs49 LYLdZvHdDn7K66dg+347muShmRfpSTHHDz5L1R1W0PX7+pC6Z285/zhe q+KyLGoR jp. 80507 IN DNSKEY 257 3 8 AwEAAda2k1JzUQzBpcWNtstQZj2/TKvFLps5lcGvcaig+GCD8ig/wPZr lJcPP2Nwb/tuXGD9B IoRVF3cfTKHdN7UCmnFd/cPylXSdUdQQetDLgV9 y269GwWPGq4dvMQZeKWW6DQDin1FwPzW+R1jo6EdOu9vMBnIYbgUZ48J jSK5oRxagOLvQN0ypAt/Kt3j/07yAvFbj 6IiNtB4o4hUGXO5KCy2nPrC MjigrNXb8beMOGBw360vMf1V5w8mhUkU1DiXlkFFflJYzz5dg3QWQFtI ctqHSae5os+ucbXIg3fWv2f/aajP7oW9HPTOzNLm5GTEU8bl/ PuGr1ZN eBwdltpjdt8= jp. 75085 IN RRSIG SOA 8 1 86400 20190805174502 20190706174502 378 jp. FXNlqPYsag0ZzEnECINY5+hZ2I2jQx PqimQqtnnM2Q6qRUG1FMmjqYbt M3vwnWTVKbN2klcX+XHbG4wP3igcmCjIA0U2hlAisPSh0by/tmmm10i2 lISHzRw7hW+F2kHlVYxbWnq+YMYk5oD67ehlLuuqa19zYp AkSj2xfPGa jPM= 14 “jp.” の ANYレコード 回答として複数の種類のレコードが返されている。

Slide 15

Slide 15 text

digコマンド実行例4(続き) jp. 75085 IN SOA z.dns.jp. root.dns.jp. 1562906702 3600 900 1814400 900 jp. 72913 IN RRSIG NS 8 1 86400 20190805174502 20190706174502 378 jp. dj4SWB6EO5Br3DkTj+zbrNuVWfcboQW HeZTI646a5/Tjy2rzCsOEx3uz V1Mk/rc0hJOPFQPbWic7Nl7onaT5RC5C+AWxRYMRo9GCkhePCZC6W2D9 eVQhZPD0tcn2k2kemcv6yFXvLESxmjDV6DeM/Qhx+oOcI9g UIp8OKOBa 3wM= jp. 86391 IN DS 54004 8 2 5F4B24F667BC70880720D10DF317DC8FF80C63E586D504E6BBFE53F0 B9ECC040 jp. 86391 IN DS 54004 8 1 0EC348CC7E6D3213CC89E5867088043FC7D5C111 jp. 86391 IN RRSIG DS 8 1 86400 20190725050000 20190712040000 59944 . KruGfTOXw4xuHEUK8866CJM+idIi5Ba E5SwPVdsm+NUsNyWNBTHU5Nse +blxnuAirSGp678WY8ZcgHW9DAYxchtGY5gNEoZ7dPgiRZYAcPCwhv7/ 3GLL9QtfBNlyPQzseKLmXZQvMPMYw9lLKZz+KT5+WwLyMnU zwzClTmUR XsGXZ5ymcy0zs7i/cpF2fDQN0CgmsXeCV8UZm6YWZX62QdlHYWQUWeeQ qaITfWEp4sv5bCDQ8ZDMEfusI0fMoWZFk1f05cPZrFP/Ple6oTcIrB4c Lp7T6k 9IKUMEoPr+QQzPH0fw5ft0fVV6DIieMl/5ArAMP+AG4nkObO2a pY8pig== jp. 72913 IN NS g.dns.jp. jp. 72913 IN NS e.dns.jp. jp. 72913 IN NS d.dns.jp. jp. 72913 IN NS h.dns.jp. jp. 72913 IN NS f.dns.jp. jp. 72913 IN NS a.dns.jp. jp. 72913 IN NS b.dns.jp. jp. 72913 IN NS c.dns.jp. ;; Query time: 34 msec ;; SERVER: xx.xx.xx.xx#53(xx.xx.xx.xx) ;; WHEN: Fri Jul 12 22:07:18 東京 (標準時) 2019 ;; MSG SIZE rcvd: 1763 15

Slide 16

Slide 16 text

digコマンド実行例4(dig ec2-52-1-2-3.compute-1.amazon.com a ) digコマンド実行例(ec2-52-1-2-3.compute-1.amazon.com の Aレコードを問い合わせ) PS Z:¥> dig ec2-52-1-2-3.compute-1.amazonaws.com a ; <<>> DiG 9.15.1 <<>> ec2-52-1-2-3.compute-1.amazonaws.com a ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44659 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;ec2-52-1-2-3.compute-1.amazonaws.com. IN A ;; ANSWER SECTION: ec2-52-1-2-3.compute-1.amazonaws.com. 603946 IN A 52.1.2.3 ;; Query time: 18 msec ;; SERVER: xx.xx.xx.xx#53(xx.xx.xx.xx) ;; WHEN: Fri Jul 12 19:24:40 東京 (標準時) 2019 ;; MSG SIZE rcvd: 81 PS Z:¥> 16 FQDN(ホスト名+ドメイン名)の Aレコード

Slide 17

Slide 17 text

digコマンド実行例4(dig 3.2.1.52.in-addr.arpa ptr) digコマンド実行例(3.2.1.52.in-addr.arpa の PTRレコードを問い合わせ) PS Z:¥> dig 3.2.1.52.in-addr.arpa ptr ; <<>> DiG 9.15.1 <<>> 3.2.1.52.in-addr.arpa ptr ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5458 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;3.2.1.52.in-addr.arpa. IN PTR ;; ANSWER SECTION: 3.2.1.52.in-addr.arpa. 300 IN PTR ec2-52-1-2-3.compute-1.amazonaws.com. ;; Query time: 137 msec ;; SERVER: xx.xx.xx.xx#53(xx.xx.xx.xx) ;; WHEN: Fri Jul 12 19:29:03 東京 (標準時) 2019 ;; MSG SIZE rcvd: 100 Z:¥> 17 逆引きの場合は、 IPアドレスを逆順に並べ、 “in-addr.arpa”を付加して ゾーン名とする。

Slide 18

Slide 18 text

Python3でDNSリゾルバを作ってみよう♪  Dnspython – A DNS toolkit for Python を利用する  Example_dnspython https://github.com/NobuyukiInoue/Example_dnspython  Soketモジュールを利用して、直接パケットを送受信する  pyDNSdump https://github.com/NobuyukiInoue/pyDNSdump せっかくなので、受信結果だけでなく、  先頭からのアドレス  各フィールドの16進数表示  翻訳結果 も表示する 18

Slide 19

Slide 19 text

Dnspython - A DNS toolkit for Python  dnspython http://www.dnspython.org/  dnspython - Example http://www.dnspython.org/examples.html  dnspython - github https://github.com/rthalley/dnspython  DNS Python のインストール pip install dnspython 19

Slide 20

Slide 20 text

Dnspythonを利用した問い合わせ例(“.”, “ns”) 20 PS Z:¥> python … >>> >>> import dns.resolver >>> answers = dns.resolver.query(".", "ns") >>> print(answers) >>> flds = [data for data in answer] >>> print(flds) [, , , , , , , , , , , , ] >>> DnsPythonでは、 DNSの応答パケットのフォーマットに合わせて、 Classが定義されている。 結果は、オブジェクトに格納されて返される。

Slide 21

Slide 21 text

Responseの内容を表示 21 >>> print(answers.response) id 48281 opcode QUERY rcode NOERROR flags QR RD RA ;QUESTION . IN NS ;ANSWER . 492608 IN NS b.root-servers.net. . 492608 IN NS g.root-servers.net. . 492608 IN NS j.root-servers.net. . 492608 IN NS l.root-servers.net. . 492608 IN NS d.root-servers.net. . 492608 IN NS h.root-servers.net. . 492608 IN NS f.root-servers.net. . 492608 IN NS a.root-servers.net. . 492608 IN NS e.root-servers.net. . 492608 IN NS i.root-servers.net. . 492608 IN NS k.root-servers.net. . 492608 IN NS c.root-servers.net. . 492608 IN NS m.root-servers.net. ;AUTHORITY ;ADDITIONAL >>> responseの出力結果

Slide 22

Slide 22 text

Dnspythonを利用した問い合わせ例("ec2-52-1-2-3.compute-1.amazonaws.com", "a") 22 >>> answers = dns.resolver.query("ec2-52-1-2-3.compute-1.amazonaws.com", "a") >>> flds = [data for data in answers] >>> print(flds) [] >>> print(answers.response) id 6129 opcode QUERY rcode NOERROR flags QR RD RA ;QUESTION ec2-52-1-2-3.compute-1.amazonaws.com. IN A ;ANSWER ec2-52-1-2-3.compute-1.amazonaws.com. 604800 IN A 52.1.2.3 ;AUTHORITY ;ADDITIONAL >>> "compute-1.amazonaws.com"ゾーンの Aレコード

Slide 23

Slide 23 text

Dnspythonを利用した問い合わせ例("3.2.1.52.in-addr.arpa", "ptr") 23 >>> answers = dns.resolver.query("3.2.1.52.in-addr.arpa", "ptr") >>> flds = [data for data in answers] >>> print(flds) [] >>> print(answers.response) id 40200 opcode QUERY rcode NOERROR flags QR RD RA ;QUESTION 3.2.1.52.in-addr.arpa. IN PTR ;ANSWER 3.2.1.52.in-addr.arpa. 300 IN PTR ec2-52-1-2-3.compute-1.amazonaws.com. ;AUTHORITY ;ADDITIONAL >>> responseの出力結果

Slide 24

Slide 24 text

Dnspythonを利用した問い合わせ例(“jp”, “a”) 24 >>> answers = dns.resolver.query("jp", "soa") >>> print(answers.response) id 30939 opcode QUERY rcode NOERROR flags QR RD RA ;QUESTION jp. IN SOA ;ANSWER jp. 70753 IN SOA z.dns.jp. root.dns.jp. 1562906702 3600 900 1814400 900 ;AUTHORITY ;ADDITIONAL >>> "jp"ゾーンのSOAレコード

Slide 25

Slide 25 text

Dnspythonを利用した問い合わせ例(“jp”, “dnskey”) 25 >>> answers = dns.resolver.query("jp", "dnskey") >>> print(answers.response) id 38872 opcode QUERY rcode NOERROR flags QR RD RA ;QUESTION jp. IN DNSKEY ;ANSWER jp. 76008 IN DNSKEY 256 3 8 AwEAAfWRu769ojIHGh0HfbJkSReeVMfv kHNJcUfrEyZoi4CfpfdXwL3Atsfxcslb agHirNacyPciUWAQQEHikPLtHHkAXrF9 +0a RBxDYtrPySs49LYLdZvHdDn7K66dg +347muShmRfpSTHHDz5L1R1W0PX7+pC6 Z285/zheq+KyLGoR jp. 76008 IN DNSKEY 257 3 8 AwEAAda2k1JzUQzBpcWNtstQZj2/TKvF … … …

Slide 26

Slide 26 text

Dnspythonを利用した問い合わせ例(存在しないレコード) 26 >>> answer = dns.resolver.query("jp", "a") Traceback (most recent call last): File "C:¥xxxxxx¥AppData¥Local¥Programs¥Python¥Python37¥lib¥site- packages¥dns¥resolver.py", line 213, in __init__ rdclass, rdtype) File "C:¥Users¥sprin¥AppData¥Local¥Programs¥Python¥Python37¥lib¥site- packages¥dns¥message.py", line 341, in find_rrset raise KeyError KeyError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:¥xxxxx¥xxxxx¥Python¥Python37¥lib¥site-packages¥dns¥resolver.py", line 223, in __init__ dns.rdatatype.CNAME) ... ... 指定したレコードがみつからない場合は、 エラーになります。

Slide 27

Slide 27 text

Dnspython - A DNS toolkit for Python そのほか、DynamicDNSにも対応していて、DNSサーバにレコードの登録 リクエストを送ることもできます。 参考記事) Python: dnspythonでAレコードを追加して削除する https://www.hiroom2.com/2017/02/19/python- dnspython%E3%81%A7a%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%8 2%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%A6%E5%89%8A%E9%99%A4% E3%81%99%E3%82%8B/ 27

Slide 28

Slide 28 text

Soketモジュールを利用して 直接パケットを送受信する(pyDNSdump) https://github.com/NobuyukiInoue/pyDNSdump pyDNSdump This program sends a DNS UDP request and outputs a response.  How to execute pyDNSdump.py python pyDNSdump.py [dnsserver] [target] [recordtype]  Supported record types ANY(255), A(1), NS(2), CNAME(5), SOA(6), PTR(12), HINFO(13), MX(15), TXT(16), AAAA(28), SRV(33), DS(43), RRSIG(46), NSEC(47), DNSKEY(48), NSEC3(50), NSEC3PARAM(51), CAA(257) 28

Slide 29

Slide 29 text

sokectモジュールを使って、直接DNSの パケットを送受信する(主な流れ) Import socket # 送信するデータをbytes型で準備する。 data_s = b'01000001000000…….00' # ソケットを作成 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDPのパケットを送信 s.sendto(data_s, (“xx.xx.xx.xx”, 53)) # UDPのパケットを受信(送信したパケットに対する応答を待つ data_r, address = s.recvfrom(受信バッファサイズ) 29

Slide 30

Slide 30 text

パケットのフォーマットは どうやって調べる??  digやnslookupで送受信した結果を、WireSharkでキャプチャする  各レコードタイプのRFCを探して読む!!!  各種プログラミング言語向けのDNSライブラリのドキュメントを読む 30

Slide 31

Slide 31 text

rfc1034 DOMAIN NAMES - CONCEPTS AND FACILITIES 6.2. Example standard queries 6.2.1. QNAME=SRI-NIC.ARPA, QTYPE=A The query would look like: +---------------------------------------------------+ Header | OPCODE=SQUERY | +---------------------------------------------------+ Question | QNAME=SRI-NIC.ARPA., QCLASS=IN, QTYPE=A | +---------------------------------------------------+ Answer | | +---------------------------------------------------+ Authority | | +---------------------------------------------------+ Additional | | +---------------------------------------------------+ 31

Slide 32

Slide 32 text

rfc1034 DOMAIN NAMES - CONCEPTS AND FACILITIES The response from C.ISI.EDU would be: +---------------------------------------------------+ Header | OPCODE=SQUERY, RESPONSE, AA | +---------------------------------------------------+ Question | QNAME=SRI-NIC.ARPA., QCLASS=IN, QTYPE=A | +---------------------------------------------------+ Answer | SRI-NIC.ARPA. 86400 IN A 26.0.0.73 | | 86400 IN A 10.0.0.51 | +---------------------------------------------------+ Authority | | +---------------------------------------------------+ Additional | | +---------------------------------------------------+ 32

Slide 33

Slide 33 text

DNSパケットを直接送受信(“jp” の “any”レコード)(1) 33 PS Z:¥pyDNSdump> python .¥pyDNSdump.py xx.xx.xx.xx jp any ============================================================================================ DNS Server = xx.xx.xx.xx:53 resolv string = jp record type = ANY ============================================================================================ Reply from : xx.xx.xx.xx:53 length : 0x0136(310) bytes. Response time : 19.001007[ms] ============================================================================================ 0000: Header: 0000: 0001 Transaction ID: 1 0002: 8380 Flags: 0b1000001110000000 /* [bit 0] QR (1) ... Response [bit 1-4] OPCODE (0) ... standard query [bit 5] AA (0) ... Not Authoritative [bit 6] TC (1) ... Flagment occur [bit 7] RD (1) ... Repeat Query [bit 8] RA (1) ... Recursion Available is False [bit 9] Reserve (0) [bit 10] Authentic Data(0) [bit 11] Checking Disable(0) [bit 12-15] RCODE (0) ... No Error */

Slide 34

Slide 34 text

DNSパケットを直接送受信(“jp” の “any”レコード)(2) 34 0004: 0001 Questions: 1 0006: 0001 Answer RRS: 1 0008: 0000 Authority RRS: 0 000a: 0000 Additional RRS: 0 000c: Querys: 000c: 026a7000 Name: jp 0010: 00ff Type: ANY(255) 0012: 0001 Class: IN(1) 0014: Answers: 0014: c00c Name: jp 0016: 002e Type: RRSIG(46) 0018: 0001 Class: IN(1) 001a: 0001227d Time to live: 0 day 20:39:25(74365) 001e: 0116 data_length: 278 0020: 0030 Type covered: 48 0022: 0008 Algorithm: SHA256(8) 0023: 01 Labels: 1 0024: 00015180 Original TTL: 1 day 00:00:00(86400) 0028: 5d7157ac fld_Signature_expiration: 1567709100 002c: 5d20ec2c Time signed: 1562438700 0030: 0000d2f4 Id of signing key: 54004

Slide 35

Slide 35 text

DNSパケットを直接送受信(“jp” の “any”レコード)(3) 35 Signer's name: jp 0036: b729c5ba29dda56e5d76df2f34538419f5846ed95e92c1cd715c000220a1f68198966538e29d74a0c82da14873c496b092ae731f4ce8376042980681fc 52 ecc4f74d72270c3c5872ece4bcbf0cb929781094012d689abfd632272d7b14878fd0b8405d4a4554865547103eb002a9205b0f33152047dd9ba97c663a 211e803e 60b9b231a584aecac84489d98300fed0f8cd0c47ea4fc49340b4b421d36945657f5d1caf24ac9b7012a7674a0a14373c1390d01e6294c50b89b8715320 01f1be71 966fbb52c62f83e3f3e57d0b075ed517f9517f109cd50f06e45ce83914adea9bbc2b0ede86220ee858ae5769144c3a9fa4e7e4156a4830b5702f094e7f 62edff Signature: b7 29 c5 ba 29 dd a5 6e 5d 76 df 2f 34 53 84 19 f5 84 6e d9 5e 92 c1 cd 71 5c 00 02 20 a1 f6 81 98 96 65 38 e2 9d 74 a0 c8 2d a1 48 73 c4 96 b0 92 ae 73 1f 4c e8 37 60 42 98 06 81 fc 52 ec c4 f7 4d 72 27 0c 3c 58 72 ec e4 bc bf 0c b9 29 78 10 94 01 2d 68 9a bf d6 32 27 2d 7b 14 87 8f d0 b8 40 5d 4a 45 54 86 55 47 10 3e b0 02 a9 20 5b 0f 33 15 20 47 dd 9b a9 7c 66 3a 21 1e 80 3e 60 b9 b2 31 a5 84 ae ca c8 44 89 d9 83 00 fe d0 f8 cd 0c 47 ea 4f c4 93 40 b4 b4 21 d3 69 45 65 7f 5d 1c af 24 ac 9b 70 12 a7 67 4a 0a 14 37 3c 13 90 d0 1e 62 94 c5 0b 89 b8 71 53 20 01 f1 be 71 96 6f bb 52 c6 2f 83 e3 f3 e5 7d 0b 07 5e d5 17 f9 51 7f 10 9c d5 0f 06 e4 5c e8 39 14 ad ea 9b bc 2b 0e de 86 22 0e e8 58 ae 57 69 14 4c 3a 9f a4 e7 e4 15 6a 48 30 b5 70 2f 09 4e 7f 62 ed ff ============================================================================================ PS Z:¥Example_dnspython>

Slide 36

Slide 36 text

DNSパケットを直接送受信(“jp” の “ns”レコード)(1) 36 PS Z:¥pyDNSdump> python .¥pyDNSdump.py xx.xx.xx.xx jp ns ============================================================================================ DNS Server = xx.xx.xx.xx:53 resolv string = jp record type = NS ============================================================================================ Reply from : xx.xx.xx.xx:53 length : 0x0098(152) bytes. Response time : 60.575724[ms] ============================================================================================ 0000: Header: 0000: 0001 Transaction ID: 1 0002: 8180 Flags: 0b1000000110000000 /* [bit 0] QR (1) ... Response [bit 1-4] OPCODE (0) ... standard query [bit 5] AA (0) ... Not Authoritative [bit 6] TC (0) ... Did not Flagment [bit 7] RD (1) ... Repeat Query [bit 8] RA (1) ... Recursion Available is False [bit 9] Reserve (0) [bit 10] Authentic Data(0) [bit 11] Checking Disable(0) [bit 12-15] RCODE (0) ... No Error */

Slide 37

Slide 37 text

DNSパケットを直接送受信(“jp” の “ns”レコード)(2) 37 0004: 0001 Questions: 1 0006: 0008 Answer RRS: 8 0008: 0000 Authority RRS: 0 000a: 0000 Additional RRS: 0 000c: Querys: 000c: 026a7000 Name: jp 0010: 0002 Type: NS(2) 0012: 0001 Class: IN(1) 0014: Answers: 0014: c00c Name: jp 0016: 0002 Type: NS(2) 0018: 0001 Class: IN(1) 001a: 00014716 Time to live: 0 day 23:15:34(83734) 001e: 0008 data_length: 8 0020: 016103646e73c00c Name: a.dns[.jp] 0028: Answers: 0028: c00c Name: jp 002a: 0002 Type: NS(2) 002c: 0001 Class: IN(1) 002e: 00014716 Time to live: 0 day 23:15:34(83734) 0032: 0004 data_length: 4 0034: 0163c022 Name: c[.dns[.jp]] 016103646e73c00c 0x01 … 文字列の長さ(1文字) 0x61 … ‘a’ 0x03 … 文字列の長さ(3文字) 0x64 … ‘d’ 0x6e … ‘n’ 0x7c … ‘s’ 0xc00c 000c … 参照先のオフセットアドレス "a" + "." + "dns" + "." + "jp" ⇓ "a.dns.jp" 026a7000 0x02 … 文字列の長さ(2文字) 0x6a … ‘j’ 0x70 … ‘p’ 0x00 … 文字列の終わり

Slide 38

Slide 38 text

DNSパケットを直接送受信(“jp” の “ns”レコード)(3) 38 0038: Answers: 0038: c00c Name: jp 003a: 0002 Type: NS(2) 003c: 0001 Class: IN(1) 003e: 00014716 Time to live: 0 day 23:15:34(83734) 0042: 0004 data_length: 4 0044: 0168c022 Name: h[.dns[.jp]] 0048: Answers: 0048: c00c Name: jp 004a: 0002 Type: NS(2) 004c: 0001 Class: IN(1) 004e: 00014716 Time to live: 0 day 23:15:34(83734) 0052: 0004 data_length: 4 0054: 0167c022 Name: g[.dns[.jp]] 0058: Answers: 0058: c00c Name: jp 005a: 0002 Type: NS(2) 005c: 0001 Class: IN(1) 005e: 00014716 Time to live: 0 day 23:15:34(83734) 0062: 0004 data_length: 4 0064: 0165c022 Name: e[.dns[.jp]]

Slide 39

Slide 39 text

DNSパケットを直接送受信(“jp” の “ns”レコード)(4) 39 0068: Answers: 0068: c00c Name: jp 006a: 0002 Type: NS(2) 006c: 0001 Class: IN(1) 006e: 00014716 Time to live: 0 day 23:15:34(83734) 0072: 0004 data_length: 4 0074: 0164c022 Name: d[.dns[.jp]] 0078: Answers: 0078: c00c Name: jp 007a: 0002 Type: NS(2) 007c: 0001 Class: IN(1) 007e: 00014716 Time to live: 0 day 23:15:34(83734) 0082: 0004 data_length: 4 0084: 0162c022 Name: b[.dns[.jp]] 0088: Answers: 0088: c00c Name: jp 008a: 0002 Type: NS(2) 008c: 0001 Class: IN(1) 008e: 00014716 Time to live: 0 day 23:15:34(83734) 0092: 0004 data_length: 4 0094: 0166c022 Name: f[.dns[.jp]] ============================================================================================ PS Z:¥pyDNSdump>

Slide 40

Slide 40 text

DNSパケットを直接送受信(“ec2-52-1-2-3.compute-1.amazonaws.com”の”A”レコード)(1) 40 PS Z:¥pyDNSdump> python .¥pyDNSdump.py xx.xx.xx.xx ec2-52-1-2-3.compute1.amazonaws.com a ============================================================================================ DNS Server = xx.xx.xx.xx:53 resolv string = ec2-52-1-2-3.compute-1.amazonaws.com record type = A ============================================================================================ Reply from : xx.xx.xx.xx:53 length : 0x0046(70) bytes. Response time : 21.001339[ms] ============================================================================================ 0000: Header: 0000: 0001 Transaction ID: 1 0002: 8180 Flags: 0b1000000110000000 /* [bit 0] QR (1) ... Response [bit 1-4] OPCODE (0) ... standard query [bit 5] AA (0) ... Not Authoritative [bit 6] TC (0) ... Did not Flagment [bit 7] RD (1) ... Repeat Query [bit 8] RA (1) ... Recursion Available is False [bit 9] Reserve (0) [bit 10] Authentic Data(0) [bit 11] Checking Disable(0) [bit 12-15] RCODE (0) ... No Error */

Slide 41

Slide 41 text

DNSパケットを直接送受信(“ec2-52-1-2-3.compute-1.amazonaws.com”の”A”レコード)(2) 41 0004: 0001 Questions: 1 0006: 0001 Answer RRS: 1 0008: 0000 Authority RRS: 0 000a: 0000 Additional RRS: 0 000c: Querys: 000c: 0c6563322d35322d312d322d3309636f6d707574652d3109616d617a6f6e61777303636f6d00 Name: ec2-52-1-2-3.compute- 1.amazonaws.com 0032: 0001 Type: A(1) 0034: 0001 Class: IN(1) 0036: Answers: 0036: c00c Name: ec2-52-1-2-3.compute-1.amazonaws.com 0038: 0001 Type: A(1) 003a: 0001 Class: IN(1) 003c: 00093352 Time to live: 6 day 23:29:22(602962) 0040: 0004 data_length: 4 0042: 34010203 Addr: 52.1.2.3 ============================================================================================ PS Z:¥pyDNSdump>

Slide 42

Slide 42 text

DNSパケットを直接送受信(“3.2.1.52.in-addr.arpa”の”PTR”レコード)(1) 42 PS Z:¥pyDNSdump> python .¥dns_send_udp_request.py xx.xx.xx.xx 52.1.2.3 ptr ============================================================================================ DNS Server = xx.xx.xx.xx:53 Target = 3.2.1.52.in-addr.arpa record type = PTR ============================================================================================ Reply from : xx.xx.xx.xx:53 length : 0x0059(89) bytes. Response time : 45.002699[ms] ============================================================================================ 0000: Header: 0000: 0001 Transaction ID: 1 0002: 8180 Flags: 0b1000000110000000 /* [bit 0] QR (1) ... Response [bit 1-4] OPCODE (0) ... standard query [bit 5] AA (0) ... Not Authoritative [bit 6] TC (0) ... Did not Flagment [bit 7] RD (1) ... Repeat Query [bit 8] RA (1) ... Recursion Available is False [bit 9] Reserve (0) [bit 10] Authentic Data(0) [bit 11] Checking Disable(0) [bit 12-15] RCODE (0) ... No Error */

Slide 43

Slide 43 text

DNSパケットを直接送受信(“3.2.1.52.in-addr.arpa”の”PTR”レコード)(2) 43 0004: 0001 Questions: 1 0006: 0001 Answer RRS: 1 0008: 0000 Authority RRS: 0 000a: 0000 Additional RRS: 0 000c: Querys: 000c: 01330132013102353207696e2d61646472046172706100 Name: 3.2.1.52.in-addr.arpa 0023: 000c Type: PTR(12) 0025: 0001 Class: IN(1) 0027: Answers: 0027: c00c Name: 3.2.1.52.in-addr.arpa 0029: 000c Type: PTR(12) 002b: 0001 Class: IN(1) 002d: 0000012c Time to live: 0 day 00:05:00(300) 0031: 0026 data_length: 38 0033: 0c6563322d35322d312d322d3309636f6d707574652d3109616d617a6f6e61777303636f6d00 Domain Name: ec2-52-1-2-3.compute-1.amazonaws.com ============================================================================================ PS Z:¥pyDNSdump>

Slide 44

Slide 44 text

おしまい ご清聴ありがとうございました! 44