SMTP Blackhole

Bei Einrichten von Mailservern brauche ich manchmal eine Test-Gegenstelle, die Mails einfach nur annimmt und verwirft. Nicht immer will ich dazu einen Windows SMTP-Server richtig einrichten. Ein Trivial-Skript muss einfach auf Port 25 lauschen und gerade so viel liefern, damit ein SMTP-Sender zufrieden ist. Vor allem finde ich es dabei interessant auf bestimmte Anfragen von Gegenstellen mit anderen Antworten zu reagieren und. z.B. XOORG und Exchange zu testen.

SMTP-State Diagramm

Mit PowerShell ist es sehr einfach mal schnell einen TCP-Port zu öffnen und Pakete zu übertragen. Kniffliger wird es natürlich, wenn mehrere parallele Verbindungen zu handhaben wären. Darauf habe ich bei meinem "Blackhole" erst mal keinen Wert gelegt. Multitasking und Multithreading ist aber natürlich möglich. Sie finden passende Quellen auf verschiedenen Webseiten. Für meine Basisfunktion habe ich aber erst mal überlegt, welchen Status das Programm an den verschiedenen Stellen haben kann. Nicht jeder Mailserver hält sich ja direkt an die Reihenfolge, die ich auf SMTP-Telnet beschrieben habe.

Der Empfang einer Mail per SMTP ist nämlich mitnichten eine lineare Angelegenheit. ein Code kann also nicht linear ausgelegt werden, sondern sollte die verschiedenen Zustände verwalten und die möglichen Veränderungen möglich machen.

Code

Ich möchte hier nun nicht alle Einzelheiten des Code beschreiben. Dazu ist er doch überschaubar kurz und jeder professionelle Entwickler wird die Hände über dem Kopf zusammenschlagen, weil er sicher mit Klasse, Prozeduren und vor allem Objekten verarbeitet hätte. Damit wöre es dann auch deutlich einfacher mehrere parallele Verbindungen zu handhaben. Aber mein Skript soll ja gar kein Mailserver sein, sondern einfach nur Verbindungen annehmen und die Daten "schlucken und wegschreiben". Es implementiert daher nur eine minimale SMTP-Kompatibilität

smtpblackhole.20190609.ps1.txt

Denken Sie daran, dass dieses Skript ein "Server" ist, der einen eingehenden Port 25/TCP öffnet und Sie dies in der Firewall zulassen müssen. Das Skript nimmt auch immer nur genau eine Verbindung an und beendet sich dann. Es ist aktuell nicht für einen Dauerbetrieb oder parallele Threads ausgelegt und unterstütze noch kein STARTTLS.

Beifang

Das Skript hat mir schon einige gute Dienste geleitet, wenn es drum geht das Verhalten bestimmter SMTP-Servers auf bestimmte Antworten zu prüfen. Wenn ich allerdings so einen Server mit einer öffentlichen IP-Adresse betreibe, dann bleibt es nicht aus, dass auch andere "unerwünschte" Systeme eine Verbindung versuchen. Das kann dann wie folgt aussehen.

Recht schnell ist klar, dass 103.207.39.104 nicht zu einer italienischen Firma gehört, da Sie von APNIC verwaltet wird. Auch ein TraceRoute mit dem Blick auf die Laufzeiten zeigt, dass dieses Netzwerk schon weiter weg ist.

PS C:\> tracert 103.207.39.104

Routenverfolgung zu 103.207.39.104 über maximal 30 Hops
  1    <1 ms    <1 ms    <1 ms  fritz.box [192.168.178.1]
  2     4 ms     4 ms     4 ms  62.155.242.220
  3    11 ms    10 ms    10 ms  hh-ea8-i.HH.DE.NET.DTAG.DE [62.154.32.126]
  4    10 ms    10 ms    10 ms  hh-ea8-i.HH.DE.NET.DTAG.DE [62.154.32.126]
  5     9 ms     8 ms     8 ms  80.150.168.162
  6   189 ms   186 ms   185 ms  hbg-bb4-link.telia.net [62.115.141.110]
  7   185 ms   184 ms   185 ms  ffm-bb4-link.telia.net [62.115.138.172]
  8    29 ms    28 ms    29 ms  mei-b2-link.telia.net [62.115.133.181]
  9   183 ms   183 ms   188 ms  hnk-b2-link.telia.net [62.115.138.209]
 10   255 ms   255 ms   255 ms  vnpt-ic-319643-hnk-b2.c.telia.net [62.115.44.31]
 11   273 ms   273 ms   273 ms  static.vnpt.vn [113.171.31.250]
 12   266 ms   266 ms   266 ms  static.vnpt.vn [113.171.33.46]
 13     *        *        *     Zeitüberschreitung der Anforderung.

Der Hop 10 ist schon mal 255ms entfernt und scheint vom Namen her in Hongkong zu sein und spätestens bei Hop 11 ist dann schon vnpt.pn als Provider klar

Über mehrere Tage wurde mehrfach versucht, von verschiedenen Servern bei diesem Provider mein System zu missbrauchen. Die vorgebliche Absenderadresse "tiscali.it" hat zwar einen SPF-Record aber leider nur mit "~all", so dass ein Spamfilter allein aufgrund der IP-Adresse eine Verbindung nicht ablehnen würde. Vielleicht sollte ich mal ein PowerShell Honeypot bauen und die Folgeaktionen zu bewerten. Denn mehr als gelegentliche "Probe"-Versuche wurden nicht gestartet. Vielleicht ist es ja auch nur ein aktiver Spamfilterm der Subnetze abprüft um offene Relays zu erkennen und zu blocken.

Offen: STARTTLS

Aktuell hatte noch nicht die Notwendigkeit auch STARTTLS umzusetzen. Bislang reichte es mir die SMTP-Kommandos und Antworten passend zurecht zu schneiden. Aber sobald dies erforderlich sein sollte, werde ich die Funktion addieren. Das bedeutet natürlich hauch, dass Skript auch ein passende Zertifikat mit privatem Schlüssel verwalten müsste.

Weitere Links