Patrick Andrieu: Seltsame Spam-Attacken

"Mein" Formmailer von nsm-cgi.sourceforge.net habe ich so konfiguriert, dass die Mails die ich über ein Kontaktformular erhalte wie folgt aussehen:

Hier die Auswertung des XYZ-Formulars, gesendet von
  Name (E-Mail) am Datum um Uhrzeit
  ---------------------------------------------------
  Mitteilung: Text text text text
  ---------------------------------------------------
  IP-Adresse: 255.255.255.255
  Referrer: http://www.atomic-eggs.com/formulardatei.blubb

Ich habe zusätzlich einige Sperren eingebaut, bei einigen sendet das Script einen 403. Sieht in etwa so aus:

if ($duverhälstdichwieicheswill) {
  &darfstedeinemitteilungsenden;
} else {
  print header(-Status => 403); exit;
}

Soweit so schlecht. Heute habe ich eine E-Mail erhalten, die insofern seltsam ist, dass sie so aussah:

Hier die Auswertung des XYZ-Formulars, gesendet von
  bdcerdr (bdcerdr@bdcerdr.com) am 10. Juni 2007 um 11:59:42 Uhr
  ---------------------------------------------------
  Jede Menge JavaScript-Code (dessen Anfang fehlt)
  und HTML-Quelltext
  Mitteilung: Haufen
  Links
  auf
  Pornoseiten
  Irgendwann mitten drin ageschnitten
  ---------------------------------------------------
  IP-Adresse: 58.67.60.200
  Referrer: http://www.atomic-eggs.com/impressum.html

Abgesehen vom Code zwischen der ersten Dash-Linie und "Mitteilung:", von dem ich mir nicht erklären kann, wie er da rein kommt - aber dazu komme ich später - haben mich folgende Sachen stutzig gemacht:

  • gefakte Uhrzeit (laut Mail-Client-Zeile steht bei "Erhalten:" 12:10 Uhr, im Mail-Header steht's noch genauer: Date: Sun, 10 Jun 207 12:10:47 +0200)
  • ein Referrer atomic-eggs.com/impressum.html kann es nicht geben. Zwar habe ich eine Umleitung der URI http://www.atomic-eggs.com/impressum.html zu http://www.atomic-eggs.com/formulardatei.blubb, aber bei alle Tests, die ich eben machte, erhalte ich in den E-Mails den richigen Referrer: http://www.atomic-eggs.com/formulardatei.blubb

Also Logs studieren, das gefunden:

58.67.60.200 - - [10/Jun/2007:11:59:30 +0200] "GET /impressum.html HTTP/1.1" 301 258 www.atomic-eggs.com "-" "UA" "-"
  58.67.60.200 - - [10/Jun/2007:11:59:32 +0200] "GET /formulardatei.blubb HTTP/1.1" 200 20039 www.atomic-eggs.com "-" "UA" "-"
  58.67.60.200 - - [10/Jun/2007:12:10:41 +0200] "POST /ordner/script.cgi HTTP/1.1" 403 5 www.atomic-eggs.com "http://www.atomic-eggs.com/impressum.html" "UA" "-"
  58.67.60.200 - - [10/Jun/2007:12:10:47 +0200] "POST /ordner/script.cgi HTTP/1.1" 200 18562 www.atomic-eggs.com "http://www.atomic-eggs.com/impressum.html" "UA" "-"
  58.67.60.200 - - [10/Jun/2007:12:18:34 +0200] "POST /ordner/script.cgi HTTP/1.1" 403 5 www.atomic-eggs.com "http://www.atomic-eggs.com/impressum.html" "UA" "-"

UA = Mozilla/5.0 (Windows; U; Windows NT 5.2; ru-RU; rv:1.7.12) Gecko/20050919 Firefox/1.0.7

2 Mal hat der Spammer einen 403 erhalten, einmal (12:10:47 Uhr) einen 200er (was zwar noch lange nicht bedeuten muss, dass die Mail durch ist, in dem Fall war es aber so, sonst hätte ich sie nicht erhalten, s.o.: Das Script zeigt "normalen" Usern bei manchen Fehleingaben auch mal eine Fehlermeldung, deswegen kann 200 als Antwort durchaus OK sein).

Solche Log-Einträgen wie im obigen Ausschnitt habe ich in der heutigen access_log (tägliche Logs) mehrere. Nur zum Glück sind alle weiteren POST-Aufrufe des Scripts mit einem 403 quittiert worden, ein Blick in die mail.log zeigte ebenfalls, dass es dem Spammer nur einmal gelungen ist, diese eine Mail an mich (vielleicht ging sie auch an andere) zu schicken.

Das alles hat dazu geführt, dass ich eine böse Sicherheitslücke im Script endeckt habe (eine ältere, dumme Änderung von mir), die ist jetzt wieder geschlossen.

Meine Frage - abgesehen natürlich davon, ob andere so was in der Form erlebt haben - ist: wie kommt dieser Quelltext in der E-Mail zustanden:

[...]
} else {
   document.emailForm.action = "http://www.example.com/index.php?option=etwas&Itemid=siebenstelligezahl"
mehr JavaScript-,
mehr HTML-Code
[...]
Mitteilug: Linkliste

Die URL habe ich aufgerufen und festgestellt, dass dieser Quellcode in der von mir erhaltenen E-Mail eben ein Teil des Quelltexts dieser Seite ist (sie bietet ebenfalls ein Kontaktformular an). Wie kommt der Code in die Mail rein, wie kommt er außerhalb von "Mitteilung"? Gefakte Formseite mit gefaktem Referrer abgeschickt?

Viele Grüße aus Frankfurt/Main,
Patrick

--

_ - jenseits vom delirium - _
<hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>
Nichts ist unmöglich? Doch!
  1. Die URL habe ich aufgerufen und festgestellt, dass dieser Quellcode in der von mir erhaltenen E-Mail eben ein Teil des Quelltexts dieser Seite ist (sie bietet ebenfalls ein Kontaktformular an). Wie kommt der Code in die Mail rein, wie kommt er außerhalb von "Mitteilung"? Gefakte Formseite mit gefaktem Referrer abgeschickt?

    Hast du dich mit E-Mail Injection auseinandergesetzt?

    http://www.securephpwiki.com/index.php/Email_Injection

    Ich werd nicht ganz schlau aus deiner Beschreibung. Könntest du die Mail (im Quelltext, mit Header) hier posten?

    1. Hallo splinter!

      Hast du dich mit E-Mail Injection auseinandergesetzt?

      Ist mir nicht gänzlich unbekannt.

      http://www.securephpwiki.com/index.php/Email_Injection

      This is PHP, that's not my home. Der von mir benutzte Formmailer ist in Perl geschrieben. Die E-Mail-Adresse (also meine), an welche die Daten übermittelt werden sollen, steht nur im Perl-Script. Im Formular ist nur ein hidden-Input mit name="blafoo" value="1".

      Die Sicherheitslücke, die in der Tat sowas ermöglichte, habe ich heute (halt danach) behoben.

      Ich werd nicht ganz schlau aus deiner Beschreibung. Könntest du die Mail (im Quelltext, mit Header) hier posten?

      Ungern... Ich mache mir aber Gedanken, in wie weit ich es anonymisieren kann.

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --

      _ - jenseits vom delirium - _
      <hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash>
      Nichts ist unmöglich? Doch!