Überlistungsversuch an meinen Mailscripts

In den letzten Wochen bekam ich seltsame Logeinträgevon meinen Mailscripten auf den diversen Kundenpages. Obwohl die Zustelladressen fix im Script hinterlegt sind, hatte jemand versucht, an eine zufällig generierte Adresse der jeweiligen Domain ein Mail zu versenden. Ausserdem war es dem Angreifer gelungen, seine eigene Adresse als Bcc: unterzubringen. Die Angriffe zielen darauf, Felder im Mailheader zu finden, die ungeprüft ans darunterliegende Mailsystem übergeben werden (etwa From:, To:, Subject: und dergleichen). Durch das Anhängen eines Zeilenvorschubs und einiger schlau zusammengestellter Mailheader-Angaben könnte es dem Angreifer gelingen, das Mailscript als Spam-Basis zu missbrauchen. Daher die eigene Adresse im Bcc: – wenn die Mail dorthin weitergeleitet wird, funktioniert der Trick. Diese Art des Angriffs ist im Netz unter dem Namen Mail Header Injection zu finden und es sind mittlerweile hunderte Fälle bekannt, wo dieser Angriff probiert wurde.
Information für meine Kunden: die von mir verwendeten Scripts sind bereits dicht, es sind also von Ihrer Seite keine Modifikationen nötig!


Hier ein Beispieleintrag aus meinen Logfiles:

[—-Beginn—-]

Der Formmailer wurde von der Adresse https://www.egm.at/ (bwzlty@egm.at) aufgerufen und ein Mail von bwzlty@egm.at an
bwzlty@egm.at
Content-Type: multipart/mixed;
boundary=“===============1727932643==“
MIME-Version: 1.0
Subject: b597db78
To: bwzlty@egm.at
bcc: mhkoch321@aol.com
From: bwzlty@egm.at
This is a multi-part message in MIME format.
–===============1727932643==
Content-Type: text/plain;
charset=“us-ascii“ MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
fog
–===============1727932643==– versendet:

[—-Ende—-]

Man beachte, daß nach der Empfängermailadresse ein Zeilenumbruch und ein kompletter Mailheader ans Script übergeben wurde! Das war z.B. ein Versuch, ein Mail an mhkoch321@aol.com durchzubringen – wenn der Versuch gelungen wäre, hätte man meinen Server hervorragend als Spambot missbrauchen können, indem man einfach mehrere Mailadressen als Bcc einträgt und ein komplettes Mail ans Script übergibt. Wenn das Formularscript keine Reply-to-Adresse im Mailheader setzt oder wenn keine Logfiles angelegt werden, merkt der Serverbetreiber gar nicht, daß sein Mailscript als Spamschleuder missbraucht wird. Weitere Mailadressen, die typischerweise als Bcc eingesetzt wurden: wnacyiplay@aol.com, bergkoch8@aol.com, jrubin3546@aol.com.

In einem klassischen Mailformular wird zumindestens die Mailadresse des Seitenbesuchers abgefragt – eine hervorragende Möglichkeit, zusätzliche Headerzeilen einzufügen. Wenn man also statt einer schlichten Mailadresse noch URL-encodet einen Zeilenumbruch und einige Zusatzangaben einfügt, gelingt bei schlechten Scripts die Überlistung:

mailadresse@server.at%0ATo:angreifermailadresse@andererserver.at

Danach sieht der tatsächlich ans Script übergebene Mailheader so aus:

To: empfaenger@laut_script.at
Subject: Bla
From: mailadresse@server.at
To:angreifermailadresse@andererserver.at

Die doppelte Angabe bei To: stört das Script nicht – es sendet einfach ein Mail an BEIDE Adressen! Mit diesem Wissen kann man komplette HTML-Mails ans Script übergeben:

hacker@andererserver.at%0A%0ASubject:Neuer%20Betreff%0AContent-Type:text/html%0A%0ADie%20%neue%0A<u>HTML%20formatierte%20Mail.</u>%0A

Das Ergebnis im Script:

To: zielempfaenger@server.at
Subject: Originalbetreff
From: hacker@andererserver.at
Subject: Neuer Betreff
Content-Type:text/html
 
Die neue
<u>HTML formatierte Mail.</u>
 
Originaltext

Diese Angriffsform funktioniert sowohl auf Perl- als auch auf PHP-Formmailern, sofern die Formularfelder ungeprüft übernommen werden.  Einfache Anhilfe: aus allen Formularfeldern die Steuerzeichen für Zeilenumbruch (\n) und Wagenrücklauf (\r) entfernen. Damit können keine Mailheader mehr mit übergeben werden, weil laut RFC822 die Angaben im Mailheader mit Zeilenschaltungen getrennt werden müssen.

Umsetzung in Perl:

$value =~ s/\r/ /g;
$value =~ s/\n/ /g;
Umsetzung in PHP:

$value = urldecode($value);
$value = ereg_replace(„\n“,““,$value);
$value = ereg_replace(„\r“,““,$value);
Zusätzlich kann man noch nach möglichen Content-type-Angaben in den Mailfeldern suchen und das Script beenden, sofern welche gefunden werden. Was selbstverständlich sein sollte: alle Mailadressen, die ans Script übergeben werden, auf Gültigkeit prüfen (hier in PHP):

eregi („^([a-z0-9_]|-|.)+@(([a-z0-9_]|-)+.)+[a-z]{2,4}$“, $email);
Dieser Ausdruck prüft, ob eine Mailadresse aus alphanumerischen Zeichen, einem @, wiederum alphanumerischen Zeichen, einem Punkt und einer alphabetischen Domainendung zwischen 2 und 4 Zeichen besteht. Mailadressen mit angehängten Zusatzangaben werden damit automatisch als ungültig zurückgewiesen.

Ernst Michalek
Folgen:

11 Gedanken zu „Überlistungsversuch an meinen Mailscripts“

  1. Danke für die Blumen – mir gings genauso. Deshalb hab ich alle Informationsschnipsel zusammengetragen und teilweise übersetzt, damit andere sich leichter tun, diese Spam-Arschlöcher ebenfalls auszusperren.

  2. Scheint sehr aktiv zu sein. Eine Suche in Tante G zeigt dass er es überall und nirgends probiert.

    Nett ist auch, dass man auf AOL nicht mal andeutungsweise eine Möglichkeit findet eine solche Person zu melden.

    Hat jetzt schon 2 Tage hintereinander versucht bei mir zu landen – hoffe mal dass er es noch ein paar Tage versucht, dann seh ich zumindest ob das Script auf ner festen IP läuft ;)

  3. Sorry, hatte das Script vergessen. Hier ist es

    $admin = ‚info@test.de‘;
    $subject = ‚Anfrage über das Kontaktformular‘;
    $message = ‚Nachrichten an ‚.$admin.‘ von ‚.$_POST[‚email‘].“:\n\n\n“;
    $headers = „From: „.$_POST[‚email‘].“\n“;
    $headers.= „Bcc: info@test1.de\n“;
    {
    $message.= „Firma:\t\t“.$_POST[‚firma‘].“\n“;
    $message.= „Nachname:\t\t“.$_POST[’nachname‘].“\n“;
    $message.= „Vorname:\t\t“.$_POST[‚vorname‘].“\n“;
    $message.= „Straße:\t\t“.$_POST[’strasse‘].“\n“;
    $message.= „Ort:\t\t\t“.$_POST[‚plz‘].““;
    $message.= “ „.$_POST[‚ort‘].“\n\n“;
    $message.= „Tel.:\t\t\t“.$_POST[‚telefon‘].“\n“;
    $message.= „Fax:\t\t\t“.$_POST[‚fax‘].“\n\n“;
    $message.= „E-Mail:\t\t“.$_POST[‚email‘].“\n\n“;
    $message.= „Thema:\t\t“.$_POST[‚thema‘].“\n\n\n“;
    $message.= „Kommentar:\t\t“.$_POST[‚kommentar‘].“\n\n\n“;
    }
    mail($admin, $subject, $message, $headers);
    header(‚Location: http://www.test.de/versand.html‚);

  4. Wie erkenne ich, dass der Spammer erfolgreich war? Bisher habe ich nur meine und jeweils die *****@aol.com des Spammer in den E-Mails und gehe davon aus, dass keine Nachrichten an andere gesendet wurden. Sehe ich das Richtig?

  5. Einfach ausprobieren – übergib dem Mailscript einen URL-encodeten Zeilenumbruch und eine Zweitmailadresse von Dir, wie oben beschrieben. Wenn das Mail an der Zweitadresse ankommt, isses undicht.
    Hab meine Scripts dann auch so getestet.

  6. Habe heute mein Formular noch einmal online gehabt. Nach ca. 3Std. kamen vier Mails. Diesmal mit „unbekanntem“ Namen:
    PeiCanteenMc@aol.com
    Ansonsten hat mein Test nicht funktioniert. Bekomme eine Fehlermeldung vom Script aber die Mail bekomme ich trotzdem – allerdings nicht an die zweite Adresse?!
    Dies nur zur Info und nun wünsche ich viel Spaß im Urlaub

  7. 107483 (Ungelogen!) Emails in 1h 50 min…
    seit heute Nacht sind meine 512MB Emailspeicher randvoll. Obwohl ich meine Scripte vom Netz genommen hab gings weiter…
    Werde mich nun mit deiner Version auseinandersetzen – und erstmal schlafen…

Schreibe einen Kommentar