echter Spaß mit DNS – Jenseits des Wahnsinns

Da ich gestern Nacht sehr enttäuscht wurde, weil mir in einem Blogartikel Spaß mit DNS angekündigt wurde, aber gar kein Spaß drin war, dachte ich mir, zeigt den Leuten doch mal was wirklich mit DNS geht 😀

Spaß mit DNS – Jenseits des Wahnsinns

Zunächst mal, man sollte sich mit DNS auskennen um dem Artikel folgen zu können. Wer noch nie Begriffe wie Delegation Nameserver, TTL und TXT-Records gehört hat, liest jetzt bitte erstmal auf der Wikipedia weiter. Das war übrigens kein Vorschlag!

Was macht DNS nochmal?

Richtig, es löst Namen zu IP Adressen auf ( IN A ) oder IPS zu Namen ( PTR ) … ODER DOCH NICHT ???? 😀

Was brauchen wir?

Wir brauchen DIG, eine BASH, ein PERLSCRIPT und das Wissen, daß DNS durch praktisch jede Firewall auf diesem Planeten geht, weil es ohne DNS nicht ganz so gut klappt mit dem Surfen. Dazu brauchen wir einen Server, einen Clienten ( das sind wir 😉 ) und einen Domainnamen.

Den Server habe ich einfach mal auf meinem Desktoprechner installiert, der hört dann auf die IP 127.0.0.1 . Als Domainnamen kann was echtes nehmen, ich habe mal test.de genommen.

Jetzt die Abteilung: „Ich hab es Euch vorher gesagt“

WARNUNG:

DAS SCRIPT HAT SICHERHEITSLÜCKEN – NICHT PRODUKTIV EINSETZEN !

WARNING:

WHATEVER GOT YOU HERE, DO NOT USE THIS SCRIPT WITHOUT FURTHER SECURITY IMPROOVEMENTS!  YOU WILL GET HACKED!

 

Wer das jetzt in freier Wildbahn ausprobiert, ist selbst Schuld. Wenn Ihr gehackt werdet, ist das nicht meine Schuld oder mein Problem! Ihr seid gewarnt worden!

#!/usr/bin/perl

use strict;
use warnings;
use Net::DNS::Nameserver;

sub reply_handler {
        my ($qname, $qclass, $qtype, $peerhost,$query,$conn) = @_;
        my ($rcode, @ans, @auth, @add);

        print "Received query from $peerhost to ". $conn->{sockhost}. "\n";
#        $query->print;

        if ($qtype eq "TXT" ) {

        # ACHTUNG  SANITIZING NICHT VERGESSEN 
        my $name = $qname;
        $name =~ s/\.test\.de//;
        my ($cmd,$url) = split(/\./, $name, 2);
        my $payload ="";

        print "cmd=$cmd and url=$url\n";

        if ( $cmd eq "help" ) {
            $payload = "help get ls"  
        }

        if ( $cmd eq "ls" ) {

            $url =~ s/[\\n;\|]//g;

            print "URL = $url\n";

            $payload = readpipe("ls -la $url");
        }

        if ( $cmd eq "get") {
            $payload = readpipe("curl \"http://$url\"");
        }

                my ($ttl, $rdata) = (1, $qname);
                my $rr = new Net::DNS::RR("$qname 1 IN TXT \"$payload\"");
                push @ans, $rr;
                $rcode = "NOERROR";
    }


        # mark the answer as authoritive (by setting the 'aa' flag
        return ($rcode, \@ans, \@auth, \@add, { aa => 1 });
    }

my $ns = new Net::DNS::Nameserver(
        LocalAddr    => "127.0.0.1",
        LocalPort    => 53,
        ReplyHandler => \&reply_handler,
        Verbose      => 1
        ) || die "couldn't create nameserver object\n";

$ns->main_loop;

Herzlichen Dank erst einmal an „Shell & Co“, auch wenn der das Beispielscript vom Perlentwickler nur leicht modifiziert hat 🙂 Mit der Vorlage war es kein Problem, daß Serverscript zu schreiben.

Das Script starten wir auf dem Server, also z.b. auf meinem Desktop :

# perl ./perl-nameserver.pl
Creating TCP socket 127.0.0.1#53 – done.
Creating UDP socket 127.0.0.1#53 – done.
Waiting for connections…
Waiting for connections..

Der Server wartet einfach auf Verbindungen und antwortet, wenn ich ein Kommando schicke 🙂

Damit wir Daten zum und vom DNS Server bekommen, müssen wir ihn was fragen, das machen wir mit „dig“. DNS Records haben unterschiedliche Typen, für unterschiedliche Anwendungen. Wenn man TEXTE haben will, sollte man TXT Records benutzen. Das „@127.0.0.1“ das gleich zusehen ist, weist dig an, den localhost zu fragen, also meinen eigenen Server.

Das erste Kommando das ich an den Fake-DNS Server schicke ist „HELP“ :

[marius@eve ~]$ dig TXT help.test.de @127.0.0.1

; <<>> DiG 9.10.4-P2-RedHat-9.10.4-1.P2.fc23 <<>> TXT help.test.de @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28307
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;help.test.de.            IN    TXT

;; ANSWER SECTION:
help.test.de.        1    IN    TXT    "help get ls"

;; Query time: 36 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mi Aug 31 11:33:48 CEST 2016
;; MSG SIZE  rcvd: 58

Wie man sieht, bekommt man eine Antwort „help get ls“. Das sind die Kommandos, die ich meinem DNS Server schicken kann. Probieren wir doch mal „get“ aus 😀

[marius@eve ~]$ dig TXT get.benderirc.de.test.de @127.0.0.1

; <<>> DiG 9.10.4-P2-RedHat-9.10.4-1.P2.fc23 <<>> TXT get.benderirc.de.test.de @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 376
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;get.benderirc.de.test.de.    IN    TXT

;; ANSWER SECTION:
get.benderirc.de.    1    IN    TXT    "<!DOCTYPE HTML PUBLIC " "-//IETF//DTD" "HTML" "2.0//EN" ">\010<html><head>\010<title>302 Found</title>\010</head><body>\010<h1>Found</h1>\010<p>The document has moved <a href=" "https://benderirc.de/" ">here</a>.</p>\010</body></html>\010"

;; Query time: 115 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mi Aug 31 11:34:40 CEST 2016
;; MSG SIZE  rcvd: 274

Jetzt ist das Ganze immer eine sehr lange Ausgabe, mit unnötigen Infos, also kürzen wir das etwas :

[marius@eve ~]$ dig +short TXT get.benderirc.de.test.de @127.0.0.1 | sed -e "s/\\\\010/\n/g"
"<!DOCTYPE HTML PUBLIC " "-//IETF//DTD" "HTML" "2.0//EN" ">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href=" "https://benderirc.de/" ">here</a>.</p>
</body></html>
"

Schon besser… Leider meint diese Ausgabe, daß ich HTTPS benutzen soll 😀 Äh ja.. Natürlich könnte man den Server so umbauen, daß er auch HTTPS nimmt, aber für das Experiment muß das nicht sein.  Man könnte einfach https eintragen:

        if ( $cmd eq "get") {
            $payload = readpipe("curl --insecure \"https://$url\"");
        }

oder ein eigenes Kommando für HTTPS einbauen 🙂  Wofür man das braucht , diskutieren wir am Ende des Artikels.

[marius@eve ~]$ dig +short TXT ls./tmp.test.de @127.0.0.1 | sed -e "s/\\\\010/\n/g"
"insgesamt 12
drwxrwxrwt  12 root root  260 31. Aug 12:06 .
dr-xr-xr-x. 23 root root 4096  5. Mai 11:40 ..
drwxrwxrwt   2 root root   40  1. Apr 13:07 .font-unix
drwxr-xr-x   2 root root   60 31. Aug 12:13 hsperfdata_root
drwxrwxrwt   2 root root   40  1. " "Apr 13:07 .ICE-unix
drwx------   3 root root   60 31. Aug 03:43 systemd-private-395b74a138f9476e84b5f710a90a117f-dovecot.service-tHODyP
drwx------   3 root root   60 21. Aug 14:01 systemd-private-395b74a138f9476e84b5f710a90a117f-exim.service-hJkbDr
drwx--" "----   3 root root   60 21. Aug 14:01 systemd-private-395b74a138f9476e84b5f710a90a117f-mariadb.service-gPa10y
drwx------   3 root root   60  1. Apr 13:07 systemd-private-395b74a138f9476e84b5f710a90a117f-munin-node.service-AhKKmo
drwxrwxrwt   2 root root  " " 40  1. Apr 13:07 .Test-unix
-rw-r--r--   1 root root 4256 16. Jul 14:35 warning
drwxrwxrwt   2 root root   40  1. Apr 13:07 .X11-unix
drwxrwxrwt   2 root root   40  1. Apr 13:07 .XIM-unix
"

Ich denke mal, weiter müssen wir hier nicht gehen, aber wer etwas Fantasie hat, der kann sich jetzt leicht ausmalen, was man damit noch so treiben könnte !

Jetzt gibt es natürlich eins zu bedenken, daß ich bislang unterschlagen hatte: Das geht nur, wenn Root den DNS Server gestartet hat, weil Port 53 zu den restriktiven Ports gehört, die nur Rootdaemons benutzen dürfen. Wer also bei einem Hack soweit gekommen ist, kann das als RemoteShellzugang benutzen.

Wenn man jetzt die Payload ( Ausgabe ) und die URLS ( Eingabe ) verschlüsselt, kann auch ein NIDS hier nicht mitlesen. Es fallen allenfalls komische DNS Anfragen auf und natürlich der Umstand, daß die Abfragen reinkommen ins Netz, statt rausgehen 😀

Wofür ist das Beispiel dann gut ?

Natürlich hat das alles einen praktischen Nutzen, fangen wir mal mit was ganz legalem an :

Stellen wir uns mal vor, daß das Großbritanien  nicht nur Passwörter für Festplatten und Handies erpresst, sondern einfach mal alles überwacht und zensiert, was geht.. hmm.. vergeßt daß, die machen das ja schon 😀

Wenn ich an freie Informationen kommen will OHNE das ich gleich am Arsch bin, könnte ich TOR nutzen. TOR verschiebt meine Anfrage zu jemand anderem, so daß es für einen Überwacher so aussieht, als wenn ich gar nicht nach der Info gefragt habe. Aus Sicht der Queen ist TOR böse und sie ist not amused, also wird der Macher von TOR geköpft und TOR verboten.  Es muß folglich ein Ersatz her:  das DNS-GATEWAY 😉

Die Leute im freien Internet stellen also nun so einen Server auf, wie wir ihn oben gesehen haben, nur ohne „LS“ 😉

Zeitgleich wird das Script noch verbessert, weil es diverse Probleme hat. z.b. URL Parameter , die müssen alle mit % kodiert werden, die Rückgabe von Bildern, Zusätzliche Header, Kompression usw. könnte ein Problem sei. Da müßte man also etwas mehr Logik einbauen um das alles abzufedern. Nehmen wir mal an, das wäre der Fall (und es geht wirklich, das ist nicht so schwer ). Ein valider per DNS auflösbarer Domainname, ergo registrierter Domainname, ist auch noch nötig. Da gibt es über hundert Millionen von 😉

Was hätten wir jetzt?

Wir haben ein Proxy, daß Anfragen auf DNS annimmt, in HTTP umwandelt und zum Server X schickt,die Antwort wieder in DNS umwandelt und zurückschickt.

Was wollen wir noch?

Wir wollen unserem Überwachungsstaat nicht in die Hände spielen, deswegen dürfen wir diese ProxyServer nicht direkt fragen. OK.. Fragen wir doch einfach ein DNS-Cache !

DNS ist cachebar. Also speichern alle Caches die Informationen, die wir bei den ProxyServern angefragt haben und zwar für die Zeit, die im TTL der Antwort angegeben ist. Eine kurze TTL von 1 Sekunde, würde z.b. gleich bedeutend sein mit „Nicht cachen“, weil das DNS Cache nach 1 Sekunden vergessen hätte, was der ProxyServer geschickt hatte und folglich die Anfrage nochmals schickt. Damit kann ich also LIVE Webseiten abfragen! Bietet sich bei GoogleNews an, oder Twitter.

Jetzt könnte man z.B. als Proxyserver einfach zwei Domainnamen haben, der eine für LIVE Anfragen mit kurzer TTL, der andere für langfristige Speicherung, also z.b. Wikipediainhalte usw. .

Da jetzt im ProxyServer Logfile eine IP vom DNS Cache auftaucht, und beim Webserver von dem die Infos stammen, die IP des Proxys steht, kann niemand mehr einen direkten Zusammenhang herstellen. öffentliche DNS-Caches gibt es zu dem wie Sand am Meer in Netz, da stehen hunderttausende rum, deutlich mehr als TOR Nodes existieren. Um Überwacher noch weiter täuschen, kann man auch laufend von einem DNS Cache zum Nächsten wechseln. Außerdem ist DNS nicht zwangsweise TCP Datenverkehr, sondern UDP und UPD kann z.b. nicht mit gefakten FIN Paketen unterbinden/unterbrechen, so wie das die große Firewall in China und anderen Überwachungswahnstaaten tut.

Was bietet das System von Haus auch noch?

Es kann beliebig skaliert werden, weil es kein Limit für die Anzahl von ProxyServern und ProxyDomainnamen gibt.
Es damit abzuschalten ist fast aussichtslos, da die einzelnen Proxys nicht in einem Land stehen müssen.

;benderirc.de.            IN    NS

;; ANSWER SECTION:
benderirc.de.        86400    IN    NS    ns1.proxyserver.net.
benderirc.de.        86400    IN    NS    ns2.proxyserver.net.
benderirc.de.        86400    IN    NS    ns3.proxyserver.net.
benderirc.de.        86400    IN    NS    ns4.proxyserver.net.
benderirc.de.        86400    IN    NS    ns5.proxyserver.net.
benderirc.de.        86400    IN    NS    ns6.proxyserver.net.
benderirc.de.        86400    IN    NS    ns7.proxyserver.net.
benderirc.de.        86400    IN    NS    ns8.proxyserver.net.

Die Ips der Proxyserver könnten auch gleich noch per RoundRobin bei jeder Auflösung wechseln, es könnten also deutlich mehr Proxies im Spiel sein, als Nameserver ausgegeben werden. Noch ein Pluspunkt 🙂

Für dieses kleine Gedankenspiel soll es nun mal genug sein. Ich bin gespannt ob das einer in die Tat umsetzt 😀

Kann man mit DNS noch mehr machen ????

Ja, na klar. Es gibt doch Subdomains 😀

Obiger Server könnte z.b. MP3 Livestreaming durch DNS umleiten, wäre kein Problem, weil jedes Datensegment eine eigene Subdomain sein könnte. Man fragt einfach genug Sudomains ab, bekommt eine Menge X an Base64 kodierten Daten , dekodiert das, baut es zu einem Stream zusammen, synct das mit dem Datenstrom den man schon hat, kehrt zum Anfang des Loops zurück, und spielt ab, was man bekommen hat. Fertig ist das Livestreaming per DNS 😀

Man muß halt nur Ideen und einen ausgeprägten Spieltrieb haben!

Auf die illegalen Nutzungen des obigen DNS Serverscripts möchte ich verständlicherweise nicht näher eingehen, aber im Prinzip ist es ja deutlich geworden, das DNS für alles benutzt werden kann, weil es einfach wahnsinnig robust und redundant gebaut wurde. Daten von A nach B zu bekommen, ist einfach nur eine Frage von „Was ist die Frage“ und „Was ist eigentlich in der Antwort“ drin.

Und jetzt will ich kreative Lösungen rund um und mit DNS sehen ! DAS WAR KEIN VORSCHLAG, Leser ! 😀

Und von Florian erwarte ich noch viiiiieeelll mehr, als nur einen Artikel, das man DIG irgendwo eintippen kann 🙂

Update: 24.3.2024  Rechtschreibkorrektur

Wie man PHPMyAdmin beschleunigen kann

Habt Ihr auch einen „modernen“ PHPMyAdmin installiert, der bei einigen Anzeigen gefühlte Äonen braucht, um den banalen Inhalt der Datenbank anzuzeigen ?

Ja ? Habt Ihr auch schon gedacht, daß es an der DNS Auflösung liegen könnte ?
Ja ? und es hat so gar nichts gebracht ein schnelleres Cache  einzustellen ?
Ja ? Na dann schaltet doch mal auf ENGLISCH als PMA Sprache um, Ihr werdet Euch wundern !

Es ist einen :facepalm: wert, denn für jede popplige Seite, sei es per AJAX oder per URL Link, lädt PHP die komplette, wirklich MB große Übersetzung, wenn man Deutsch eingestellt hat. Da hilft auch kein Filecache mehr um das zu beschleunigen!

Wie man sowas findet

Sehen tut man das erst, wenn man mit STRACE den Apachen und die ausgeführten PHP Programme traced.

strace -e open,read -f -p `pidof httpd | sed -e "s/ /,/g"`

Es folgt so etwas, in einer schieren Unzahl von Zugriffen, weil PHP echt groß ist und ne Menge einlesen muß.

[pid 10052] open(„/usr/lib/php/modules/intl.so“, O_RDONLY|O_CLOEXEC) = 3
[pid 10052] read(3, „…………………………….jede Menge Text ………………“, 512) = 512

Das oben ist keiner der verdächtigen Zugriffe, zeigt aber, wie man die READs den Dateien zuordnet. Das Orangerote ist der FILEDESCRIPTOR, kurz FD.  Jede Datei die man öffnet als Programm, bekommt einen eindeutigen FD, damit man das als Programm zuordnen kann.

Typisch für PHP und die Übersetzungen sind diese Zeilen :

[pid  9436] lseek(4, 93205, SEEK_SET)   = 93205
[pid  9436] lseek(4, 93205, SEEK_SET)   = 93205
[pid  9436] read(4, „Database %s has been dropped.\0Database Log\0Database client version:\0Database comment\0Database for user account\0Database level tabs\0Database name\0Database name template\0Database operations\0Database seems to be empty!\0Database server\0Database structure\0Database system or older MySQL server to maximize output compatibility with:\0Database tree separator\0Database used for relations, bookmarks, and PDF features. See [a@http://wiki.phpmyadmin.net/pma/pmadb]pmadb[/a] for complete information. Leave blank for no support. Suggested: [kbd]phpmyadmin[/kbd].\0Database-level tabs\0Database-specific privileges\0Database:\0Databases\0Databases display options.\0Databases statistics\0Databases:\0Date\0Deactivate now\0Deactivate tracking for %s\0Debug SQL\0Dec\0December\0Default\0Default database tab\0Default format; be aware that this list depends on location (database, table) and only SQL is always available.\0Default language\0Default server\0Default server tab\0Default sort order for tables with a primary key.\0Default sorting order\0Default ta“…, 8192) = 8192

Warum PHP 8KB Blöcke einliest, statt min. 64KB wird ewig ein Geheimnis bleiben, scheint aber ein Relikt aus den Anfängen zu sein 🙂

Es gilt, wenn der einzulesende Datenblock, der Blockgröße auf im Filesystem entspricht, dann kann das OS den Datenstrom am effizientesten einlesen. Der Datenzugriff sollte nicht größer als die Blockgröße sein, wobei ganze Mehrfache der Blockgröße ok wären. Wenn jetzt wie bei PHP 8KB eingelesen werden, die Datenblockgröße aber 64 KB ist, braucht das OS schon 8x soviele Filezugriffe nebst Performanceoverhead durch die Lesefunktionen, um den gleichen Inhalt eines Blockes einzulesen. Dazu muß die Platte den Kopf 8x zu dem Datenblock fahren, falls auf einem System noch mehr los ist, als nur dieses einzige Programm. Was man getrost annehmen kann.

Sowas ist einfach ineffizient. Ganz besonders ineffizient, wenn die Datei, die man da einlesen will, mehrere MB groß ist.

Ich hoffe, es hilft Euch ein bisschen bei Euren eigenen Problemen.

 

 

TLS: Wie man sich selbst austrickst

Nicht das einer meiner geneigten Leser glaubt, ich hätte zuviel Phantasie oder mir wäre das selbst passiert und ich würde es jetzt in einer netten Story schön reden wollen, vergeßt es, es ist tatsächlich so passiert.

Was ist TLS ?

Um zu verstehen was genau passiert ist, muß ich etwas ausholen, da nicht jeder Leser wissen wird, was TLS genau macht.

Erstmal TLS ist die Transport Layer Verschlüsselung(Security) für Emailserver und Webseiten und hat SSL ( Secure Socket Layer ) abgelöst, weil es a) ein paar Vorteile gegenüber SSL hat und b) nicht komplett gebrochen ist wie SSL. (Ja, SSL ist tod, wer noch SSL 1-3 benutzt, kann es auch abschalten und die Rechenleistung anderweitig nutzen 😉 ).

Wenn ein Mailprogramm einen Mailserver mit TLS Unterstützung kontaktiert, tut er das auf den an sich unverschlüsselten Port 25. Der Mailserver meldet dem sich verbindenden Programm/Client/Server welche Möglichkeiten der Server anbietet, z.B. den Befehl STARTTLS . Finden ein sich verbindendes Programm diesen Befehl, wird es diesen Aufrufen und damit die Verbindung von unverschlüsselt auf verschlüsselt „upgraden“ .  Damit man das machen kann, sendet der Mailserver seinen öffentlichen Schlüssel in einem Zertifikat an das verbindende Programm und das baut daraus ein passendes Antwortpaket mit einem Sessionkey, der nur für diese eine Datenübertragung existiert. (Idealerweise)

Authentizität

Dabei wird geprüft, ob sich der Mailserver mit einem gültigen SSL-Zertifikat ausweist. An dieser Stelle wird es nun interessant. Unser Mailserver, kann wie die meisten Server, genau ein Zertifikat  benutzen, weil alle Domains auf seiner Hauptipadresse liegen. Für Emails ist das auch nicht tragisch, es geht ja nur um die Verschlüsselung des Transports. Also präsentiert der Mailserver sein gültiges Serverzertifikat, daß auf seinen Hostname ausgestellt ist, denn damit meldet sich der Server und damit weiß man, daß dies Zertifikat zum Host paßt. Soweit, so normal.

Die Experten

Jetzt gibt es Leute, die wollen wissen, ob sie abgehört werden, was ein naheliegendes Interesse ist. Deswegen prüfen sie, ob in dem Zertifikat das Ihnen angeboten wird, auch wirklich der Name des Mailserver drinsteht, mit dem sie sich verbinden wollen. Ist das nämlich nicht der Fall, könnte jemand an der Verbindung rumgespielt haben und sich als Man-in-the-Middle-Angreifer betätigt haben, um die Verbindung zu belauschen. Wenn ich jetzt auf Sicherheit und Authentizität wert lege, müßte ich aufhören und die EMail nicht zustellen, weil „irgendwas stimmt nicht“.

Damit Ihr mir folgen könnt, ein paar Beispiele :

$ dig mx bloggt-in-braunschweig.de
;; ANSWER SECTION:
bloggt-in-braunschweig.de. 21599 IN    MX    10 bloggt-in-braunschweig.de.

Das meint, daß die Emails für BIB.de  auf einem Mailserver mit dem Hostnamen „bloggt-in-braunschweig.de“ entgegengenommen werden. Verbindet man sich auf Port 25 dort hin, findet man das vor:

$ nc bloggt-in-braunschweig.de 25
220 s120.resellerdesktop.de ESMTP Exim 4.85_2 Sat, 27 Aug 2016 12:11:04 +0200

das meint, daß sich unser Mailserver mit „s120.resellerdesktop.de“ identifiziert, weil das sein Name ist. Entsprechend präsentiert er ein Zertifikat von s120.resellerdesktop.de . Das ist vollkommen ok so 🙂

Aber genau das ist, was einige Experten als den MITM-Angriff definiert haben, denn die haben erwartet, daß sich der Mailserver mit „bloggt-in-braunschweig.de“ meldet, was er nicht tut, weil er noch hunderte andere Domains beherbergt.

Jetzt der Catch 🙂

Statt jetzt aber die Verbindung zu trennen, wie man es bei einem MITM Angriff erwarten müßte, fällt der Expertenmailserver auf unverschlüsselte Kommunikation zurück und stellt die Email unverschlüsselt auf genau diesem Server zu!  Das ist FAIL² . Er hätte auch gleich das Zertifikat nehmen können, denn dann wäre die Email wenigstens verschlüsselt übers Netz gegangen, statt im Klartext.

Logik ist nicht jedermans Sache, wie es scheint 😀

Den Experten helfen…

Wenn man jetzt mit solchen Experten kommunizieren muß, ohne das man unverschlüsselte Emails haben will, kann man natürlich etwas tun, was allerdings mit Nachteilen daher kommt. Für den Augenblick sind diese aber vernachlässigbar.

Das Problem liegt ja in der Erwartungshaltung des sendenden Mailservers, der in unserem Beispiel bloggt-in-braunschweig.de haben wollte, aber s120.resellerdesktop.de bekommen hat. Der Name ist im DNS MX Eintrag hinterlegt, weil man so bei einem Domainumzug auf einen anderen Server lediglich einen Eintrag ändern muß. Der MX zieht quasi automatisch um.  Unsere Experten würden aber folgendes gerne sehen :

$ dig mx bloggt-in-braunschweig.de
;; ANSWER SECTION:
bloggt-in-braunschweig.de. 21599 IN    MX    10 s120.resellerdesktop.de

Wenn man also seinen MX auf den „echten“ Namen des Mailserver ändert, sind diese Expertenserver zufrieden und schicken einem ab sofort wieder reguläre TLS verschlüsselte EMails zu.

Man darf nur nicht vergessen, daß man bei einem Domainumzug auch den MX ändert, wenn der neue Mailserver anders heißt. Es ist also auch davon abhängig wie der Provider seine Umgebung betreibt.