DNS - Domain Name System

DNS - Domain Name System #

  • DNS basiert auf UDP und deshalb ohne erweiterten Sicherheitsmassnahmen (Source Port Randomization und
  • Query ID Randomzation) einfach zu spoofen.
  • Bei der rekursiven DNS Server fragt der Namensserver rekursiv alle benötigten externen Nameserver an, um die Adresse aufzulösen.
  • Der Source Port ist im Standard nicht definiert.
  • Der Destination Port von DNS ist immer 53
  • Die QID (16 Bit Query ID) identifiziert einen DNS Request. Sie muss gleich wie die DNSResponse Transaction ID sein.
  • Die Query ID und der Source Port müssen korrekt sein, damit ein DNS Server einen Request beantwortet.

Ablauf des DNS Protokolls #

  1. Der Computer fragt den rekursiven DNS Server an, ob er die IP von elsensohn.ch kennt. Wenn er sie kennt, würde er sofort in den Step 8 springen und antworten.
  2. Der rekursive DNS Server fragt den Root DNS Server an.
  3. Der Root DNS Server antwortet mit einem Verweis auf den Top Level Domain Server.
  4. Der rekursive DNS Server fragt den Country Level DNS Server an.
  5. Dieser antwortet mit einem Verweis auf den authoritativen DNS Server.
  6. Der rekursive DNS Server fragt den authoritative DNS Server an, ob der die IP kennt.
  7. Er antwortet mit der IP.
  8. Der DNS Server gibt die IP an den Computer.

Ablauf DNS Spoofing #

Im Wesentlichen muss nur die Source Port Nummer vom DNS Server des Opfers bekannt sein sowie die Query Id des DNS Requests. Wenn der Fake Service dann schneller ist als der autoritative DNS Server hat das Spoofing funktioniert.

Der Fake Service muss auch den Source Port des originalen DNS Request finden, um auf diesem Port dann zu antworten, denn sonst verwirft das Betriebssystem des Opfers schlicht die DNS Antwort. Der Source Port kann gefunden werden, indem der Angreifer einen authoritativen DNS Server für eine seiner Domains erstellt und eine Anfrage für diese Domain beim Opfer erstellt. Der DNS Server des Opfert kontaktiert nun den DNS Server des Angreifers, womit dann der Quellport bekannt ist.

Es gibt 2 Gegenmassnahmen:

  1. Für jeder DNS Request soll ein anderer Source Port verwendet werden.
  2. Die Query Id muss randomisiert werden.

DNSSEC #

DNSSEC steht für Domain Name System Security Extensions und garantiert die Echtheit sowie Unversehrtheit der abgefragten Daten. Zu beachten ist also, dass die Daten nicht verschlüsselt übertragen werden. Sie basieren im Wesentlichen auf einer “Chain of Trust”. Dabei wird dem Root Key vertraut, der dann wiederum den Key im tieferliegenden Baum signiert. Genauer signiert er den Hash (DS) des Keys. Das wird bis zur untersten Zone wiederholt, die das Ende der “Chain of Trust” bildet. Um das ganze Key Handling zu vereinfachen, wird zwischen einem “Key Signing Key” (KSK) und einem “Zone Signing Key” (ZSK) unterschieden. Der KSK signiert den ZSK, was den Vorteil hat, dass nur der Hash des KSK in der übergeordneten Zone hinterlegt werden muss. Der KSK hat auch eine längere Laufzeit als der ZSK.

Das sieht als Grafik dann so aus (von dnsviz.net):

Die Keys und DS können auch via bash erhalten werden.

Root Zone:

$ dig @8.8.8.8 -4 . DNSKEY +multiline +rrcomments

; <<>> DiG 9.16.18 <<>> @8.8.8.8 -4 . DNSKEY +multiline +rrcomments
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46929
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;.			IN DNSKEY

;; ANSWER SECTION:
.			72954 IN DNSKEY	256 3 8 (
				AwEAAbDEyqdwu2fqAwinPCFwALUCWfYYaLrNhnOrMxDo
				rLBYMipEE1btlK1XnigTRMeb0YQ8/LCopb3CN73hYDhC
				HFsNk+GtukBB+gWLcg+2FZXbhLXIheQm8x2VfOHy2yYQ
				G+18wjx3HY9Mj/ZEhXbZNrDMvpFKKVihWXa0/cHNg4Zc
				IHD9KkMlKzK+my1K/vz8fq5cFCFOu7wgM+kKbOikdcRB
				m7Uf/wRXZItFg2uhUijUb56gEN8uCUgmuEw6wQ5ZBuR7
				UT/FLyyAUeAH87oxF4im2DXK6J+JA7IAs2UHJ16uTqvd
				serUU8NIosislaXIZCvz+NTDb3SJcxs6bvCikeU=
				) ; ZSK; alg = RSASHA256 ; key id = 26838
.			72954 IN DNSKEY	257 3 8 (
				AwEAAaz/tAm8yTn4Mfeh5eyI96WSVexTBAvkMgJzkKTO
				iW1vkIbzxeF3+/4RgWOq7HrxRixHlFlExOLAJr5emLvN
				7SWXgnLh4+B5xQlNVz8Og8kvArMtNROxVQuCaSnIDdD5
				LKyWbRd2n9WGe2R8PzgCmr3EgVLrjyBxWezF0jLHwVN8
				efS3rCj/EWgvIWgb9tarpVUDK/b58Da+sqqls3eNbuv7
				pr+eoZG+SrDK6nWeL3c6H5Apxz7LjVc1uTIdsIXxuOLY
				A4/ilBmSVIzuDWfdRUfhHdY6+cn8HFRm+2hM8AnXGXws
				9555KrUB5qihylGa8subX2Nn6UwNR1AkUTV74bU=
				) ; KSK; alg = RSASHA256 ; key id = 20326

;; Query time: 23 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Jul 26 17:59:37 CEST 2021
;; MSG SIZE  rcvd: 578

.ch. Zone:

$ dig @8.8.8.8 -4 ch. DNSKEY +multiline +rrcomments

; <<>> DiG 9.16.18 <<>> @8.8.8.8 -4 ch. DNSKEY +multiline +rrcomments
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22510
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;ch.			IN DNSKEY

;; ANSWER SECTION:
ch.			16771 IN DNSKEY	256 3 13 (
				+K7BOD21mQNNv4S+3vq01c2aPBI9thhyl8uzVUOMwh32
				rj8mZz+FLN8Ia1wJ3L3IUBy+jv44zCXCri3XMR0O/g==
				) ; ZSK; alg = ECDSAP256SHA256 ; key id = 59794
ch.			16771 IN DNSKEY	257 3 13 (
				kr4o4HQBltkJbi/uQ03HU9DY4eKY9gVHyHJk/Qw1ZRYe
				Cb/QMQ8hx0gN5o0lTBEqO/H5DwCWxM33aUwBBZostw==
				) ; KSK; alg = ECDSAP256SHA256 ; key id = 1053
ch.			16771 IN DNSKEY	256 3 13 (
				aRltdCO9+rUkM35hRQtCsZYPKM4w7Q6MyEsY2l50383m
				DtQw5i0miGj/mZEv+/G39/fkanDQbokuw2HL8EzIAQ==
				) ; ZSK; alg = ECDSAP256SHA256 ; key id = 12530

;; Query time: 26 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Jul 26 17:59:56 CEST 2021
;; MSG SIZE  rcvd: 271

elsensohn.ch. Zone:

$ dig @8.8.8.8 -4 elsensohn.ch. DNSKEY +multiline +rrcomments

; <<>> DiG 9.16.18 <<>> @8.8.8.8 -4 elsensohn.ch. DNSKEY +multiline +rrcomments
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20501
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;elsensohn.ch.		IN DNSKEY

;; ANSWER SECTION:
elsensohn.ch.		3599 IN	DNSKEY 257 3 13 (
				vz97nfOMzU2lDNcs4SBQC6tH/AuIswt+5vT0tPNw9ilm
				RFUOshPYWwt2VzMFf+LvSyzvto+5ersY4FMeE+hN1A==
				) ; KSK; alg = ECDSAP256SHA256 ; key id = 20963

;; Query time: 26 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Jul 26 18:00:07 CEST 2021
;; MSG SIZE  rcvd: 121

Der signierte A record von elsensohn.ch:

$ dig @8.8.8.8 -4 elsensohn.ch. +dnssec +multiline +rrcomments

; <<>> DiG 9.16.18 <<>> @8.8.8.8 -4 elsensohn.ch. +dnssec +multiline +rrcomments
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40983
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 512
;; QUESTION SECTION:
;elsensohn.ch.		IN A

;; ANSWER SECTION:
elsensohn.ch.		197 IN RRSIG A 13 2 300 (
				20210805000000 20210715000000 20963 elsensohn.ch.
				iCWpDAJ7m1TxJFXwrF5nQtf1CH3aRbJ9EkFqQSqdK3yS
				1gOGVbVv7rOiWVcqBog/LftYjpb3e/V0fbV0k5hMBQ== )
elsensohn.ch.		197 IN A 116.203.219.190

;; Query time: 26 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Jul 26 18:00:30 CEST 2021
;; MSG SIZE  rcvd: 165
Calendar December 26, 2021