E-Mail-Verschlüsselung austesten

Für Diagnose-Zwecke ist es sehr nützlich, mit dem SMTP- oder IMAP-Server direkt zu sprechen. Wenn Verschlüsselung im Spiel ist, geht das zwar nicht mehr ganz so einfach – aber mit den richtigen Tools ist es kein Hexenwerk.

Lesezeit: 9 Min.
In Pocket speichern
vorlesen Druckansicht
Inhaltsverzeichnis

Fast alle Mail-Server bieten zumindest optional auch verschlüsselte Verbindungen an. Dabei gibt es zwei verschiedene Verfahren. Entweder man schickt das komplette Dienst-Protokoll durch einen SSL-Tunnel oder man verwendet eine Protokollerweiterung namens "StartTLS", um die Verschlüsselung nachträglich zu aktivieren.

Zunächst zu den SSL-Diensten. Die laufen in der Regel auf eigenen, speziell definierten TCP-Ports. Hier eine kurze Liste der wichtigsten:

Dienst Kürzel TCP-Port
HTTP über SSL https 443
IMAP über SSL imaps 993
IRC über SSL ircs 994
POP3 über SSL pop3s 995
SMTP über SSL ssmtp 465

Der am Komunikationsendpunkt lauschende Dienst erwartet dabei direkt eine SSL-Kommunikation. Ein E-Mail-Client, der kein SSL unterstützt, kann mit einem IMAPS-Server auf Port 993 nicht kommunizieren. Erst wenn die Verschlüsselungsparameter ausgehandelt und die Zertifikate ausgetauscht sind, steht der Tunnel, durch den dann das eigentliche Nutz-Protokoll gesprochen wird. Weil der SSL-Vebindungsaufbau zu komplex ist, kommt man bei der Diagnose von Problemen mit Standardwerkzeugen wie telnet und netcat nicht weit.

In die Bresche springt das universelle OpenSSL, das auch einen einfachen SSL-Client mitbringt. Mit dessen Hilfe kann man sich einfach mit einem SSL-Dienst wie dem auf https://www.heise.de verbinden:

$ openssl s_client -host www.heise.de -port 443
CONNECTED(00000003)
[...]
---
Certificate chain
 0 s:/C=DE/ST=Niedersachsen/L=Hannover/O=Heise Zeitschriften Verlag GmbH Co KG/OU=Netzwerkadministration/OU=Terms of use at www.verisign.com/rpa (c)05/CN=www.heise.de
  i:/O=VeriSign Trust Network/OU=VeriSign, Inc./OU=VeriSign International Server CA - Class 3/OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign
 1 s:/O=VeriSign Trust Network/OU=VeriSign, Inc./OU=VeriSign International Server CA - Class 3/OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign
  i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
---
[...]

Mit den von openssl bereitgestellten Informationen kann man zunächst die verwendeten Zertifikate überprüfen. Achtung: Wer das nicht tut, ist im Folgenden anfällig für Man-in-the-Middle-Angriffe. Es soll schon vorgekommen sein, dass technisch versierte Anwender, die ettercap bedienen konnten, auf diesem Weg an ein Admin-Passwort gekommen sind.

Der SSL-Client ver- und entschlüsselt den Eingabe- und Ausgabekanal transparent, so dass man nun direkt mit dem Server sprechen kann:

GET / HTTP/1.1
Host: www.heise.de

HTTP/1.1 302 Found
Date: Wed, 16 Sep 2009 10:24:44 GMT
Server: Apache/1.3.34
Location: http://www.heise.de/
[...]

Die Anmeldung bei einem bei IMAPS-Server ist nur wenig komplizierter:

$ openssl s_client -host imap.irgend.wo -port 993
[...]
* OK IMAP4 Ready 0.0.0.0 0001f994
1 Login user-ju secret
1 OK You are so in
2 LIST "" "*"
* LIST (\HasChildren) "." "INBOX"
* LIST (\HasNoChildren) "." "INBOX.AV"
[...]
2 OK Completed (0.130 secs 5171 calls)
3 logout
* BYE LOGOUT received
3 OK Completed

Wichtig ist dabei die beliebig wählbare Sequenznummer, die dem eigentlichen IMAP-Befehl vorangestellt werden muss. Eine POP3-Anmeldung funktioniert vergleichbar, wenn man sich innerhalb des SSL-Tunnels mit den POP3-Kommandos USER und PASS ausweist:

$ openssl s_client -host pop.irgend.wo -port 995
[...]
+OK POP server ready H mimap3
USER user-ju
+OK password required for user "user-ju"
PASS secret
+OK mailbox "user-ju" has 0 messages (0 octets) H mimap3
quit
+OK POP server signing off

Alternativ kann man auch telnet-ssl oder die Netcat-Weiterentwicklung Ncat einsetzen, die ebenfalls SSL-Funktionen bieten. Bei Diensten, die mit StartTLS arbeiten, muss man jedoch zu anderen Tricks greifen.

Vor allem Internet-Providern setzen bevorzugt den SSL-Nachfolger Transport Layer Security via StartTLS ein. Es hat den Vorteil, dass man es als zusätzliche Option anbieten kann, aber ein Client, der es nicht unterstützt, weiterhin mit dem Server unverschlüsselt kommunizieren kann. Anders herum muss auch ein Mail-Programm damit umgehen können, dass ein Server TLS verweigert.

Die bei vielen Clients zur Verschlüsselung voreingestellte Option "TLS nur, wenn möglich" birgt allerdings eine große Gefahr. Ein Angreifer in einer Man-In-The-Middle-Position könnte etwa aus dem Befehl StartTLS, der die Verschlüsselung aktivieren soll, unbemerkt ein XtartTLS machen. Das führt dann dazu, dass der Server sagt: "XtartTLS kann ich nicht" und manche Mail-Programme die Daten dann eben unverschlüsselt über die Leitung schicken, ohne dass der Anwender das bemerkt. Deshalb sollte man besser einmal testen, ob der Server StartTLS beherrscht und es dann zur Pflicht machen. Wenn dann eine Fehlermeldung erscheint, weiß man, dass etwas schief läuft.

Auf welchem Port ein TLS-fähiger Dienst läuft, hängt vom Anbieter ab. Prinzipiell kann man diese Form der Verschlüsselung transparent in den normalen Betrieb einbetten. Ob ein Mail-Server das unterstützt, verrät

$ nc smtp.irgend.wo smtp
220 Mailserver ESMTP Exim 4.69 Wed, 16 Sep 2009 13:05:15 +0200
ehlo test
250-Mailserver Hello loki [10.1.2.73]
250-SIZE 78643200
250-PIPELINING
250-STARTTLS
250 HELP
quit
221 Mailserver closing connection

In dieser Liste sollte der Befehl STARTTLS auftauchen, der die Verschlüsselung via Transport Layer Security aktiviert:

STARTTLS
220 TLS go ahead

Ab hier wird's mit netcat wieder schwierig, aber openssl springt erneut in die Bresche. Die Entwickler haben nämlich dem SSL-Client die notwendige Intelligenz spendiert, um in SMTP, POP3, IMAP und FTP nach TLS-Verschlüsselung zu fragen, was aber leider nicht mit allen Servern funktioniert.

$ openssl s_client -host mail.irgend.wo -port 25 -starttls smtp
CONNECTED(00000003)
[...]
250 HELP
ehlo test
250-Mailserver Hello loki [10.1.2.73]
250-SIZE 52428800
250-PIPELINING
250-AUTH PLAIN LOGIN
250 HELP

Allerdings ist die Authentifizierung bei SMTP etwas komplizierter. Die meisten Server unterstützen wie der in diesem Beispiel das Verfahren AUTH PLAIN, beim dem die Zugangsdaten Base64-kodiert werden müssen. Das erledigt der Perl-Befehl

$ perl -MMIME::Base64 -e 'print encode_base64("\000user-ju\000secret")'
AHVzZXItanUAc2VjcmV0

dessen Ausgabe man an den SMTP-Server verfüttert:

AUTH PLAIN AHVzZXItanUAc2VjcmV0
235 Authentication succeeded

womit die Bahn frei ist, für weitere Mail-Kommandos. Bei Protokollen oder Servern, die der openssl-Client nicht unterstützt, hilft das Tool gnutls-cli aus dem Paket gnutls-bin weiter. Es baut zunächst eine Klartext-Verbindung zu einem Service auf:

$ gnutls-cli -s -p submission smtp.heise.de
Resolving ...
Connecting to '10.1.2.41:587'...
 
- Simple Client Mode:
 
220 Mailserver ESMTP Exim 4.69 Wed, 16 Sep 2009 18:03:01 +0200
ehlo test
250-Mailserver Hello loki.ct.heise.de [10.10.22.75]
250-SIZE 78643200
250-PIPELINING
250-STARTTLS
250 HELP
starttls
220 TLS go ahead

Dann sucht man in einer zweiten Shell nach der Prozess-ID und schickt dem Tool ein SIGALARM:

$ ps aux | grep gnutls
ju 6103 pts/3 S+ 18:03 0:00 gnutls-cli [...]
$ kill -s SIGALRM 6103

Das veranlasst gnutls-cli dazu, die TLS-Verbindung auszuhandeln und dann Standard-in und Standard-Out durch den damit aufgebauten Tunnel umzuleiten. [Update: Torsten Krah wies uns darauf hin, dass die Eingabe von CTRL-D im Terminalfenster von gnutls-cli schneller geht und den gleichen Effekt hat /].

Umsonst dazu geliefert bekommt man ein paar nützliche Informationen über die soeben ausgehandelte TLS-Verbindung:

*** Starting TLS handshake
- Certificate type: X.509
- Got a certificate list of 1 certificates.
 
- Certificate[0] info:
# The hostname in the certificate matches 'smtp.heise.de'.
# valid since: Thu Dec 14 14:08:41 CET 2006
# expires at: Sun Dec 11 14:08:41 CET 2016
# fingerprint: 28:8C:E0:29:B9:31:9B:96:F6:3D:B4:49:10:CD:06:80
# Subject's DN: C=DE,ST=Niedersachsen,L=Hannover,O=Heise Zeitschriften Verlag GmbH Co KG,OU=Netzwerkadministration,CN=smtp.heise.de,EMAIL=admin@heise.de
# Issuer's DN: C=DE,ST=Niedersachsen,L=Hannover,O=Verlag Heinz Heise GmbH & Co KG,OU=Netzwerkadministration,CN=admin@heise.de,EMAIL=admin@heise.de
 
- Peer's certificate issuer is unknown
- Peer's certificate is NOT trusted
- Version: TLS 1.0
- Key Exchange: DHE RSA
- Cipher: AES 256 CBC
- MAC: SHA
- Compression: NULL
quit
221 Mailserver closing connection
- Peer has closed the GNUTLS connection

Damit kann man quasi beliebige, interaktive TLS-Verbindungen herstellen. Wer weiter mit SSL herumexperimentieren will, den interessiert vielleicht noch, dass openssl mit s_server und das gnutls-Paket mit gnutls-serv auch einfache Server anbieten, die auf Wunsch sogar einen sehr simplen WWW-Server emulieren. (ju)