Back to Blog

31. Juli 2026

Dieselben Angreifer, einen Monat später - und sie hatten mitbekommen, dass ich den Hoster gewechselt habe

Tobias Wilke

Tobias Wilke

@wilketob

Dieselben Angreifer, einen Monat später - und sie hatten mitbekommen, dass ich den Hoster gewechselt habe
#phishing#html-smuggling#netcup#credential-phishing#kmu-security#phishing-as-a-service

Im Juni habe ich hier eine Rücklastschrift-Mail auseinandergenommen, deren "PDF-Beleg" in Wahrheit ein verschlüsseltes Phishing-Kit war. Die Login-Seite, die sich aus dem Anhang entschlüsselte, war im Design von ISPGateway gebrandet, dem Kundenportal von df.eu. Das passte, denn dort lag das Postfach damals.

Am 24. Juli kam die nächste. Gleicher Kit, gleiche Sammelstelle, gleicher Schlüssel. Nur brandet die Login-Seite jetzt auf netcup. Und das ist der Punkt: Das Postfach ist zwischen den beiden Wellen tatsächlich zu netcup umgezogen. Die Angreifer haben ihre Opferdatenbank aktualisiert. (IOCs sind defangt, damit hier niemand aus Versehen klickt.)

Die Phishing-Mail im Mailclient: Absender "Jürgen Hofmann , Bilanzbuchhalter/in", die Absenderadresse ist unkenntlich gemacht. Betreff "Vertrag 973533817 – SEPA-Rücklastschrift-Status", darunter die Erfassungsdaten eines angeblichen Scan-Vorgangs und ein Anhang namens Sepa-Zahlung-7960651619-2026-07-24.html mit 152 KB.

Der Köder: Scan-to-Mail

Der Absender heißt diesmal "Jürgen Hofmann , Bilanzbuchhalter/in" (das verirrte Leerzeichen vor dem Komma ist Originalzustand). Die echte Adresse dahinter gehört zu <weinkellerei-ro>[.]ro, einer rumänischen Weinkellerei. Deren Hosting-Konto wurde gekapert und verschickt jetzt Post im Namen einer deutschen Kanzlei.

Der Rahmen ist gut gewählt. Eine Kanzlei übermittelt "im Auftrag unseres Mandanten" eine Vorgangsakte, die das kanzleiinterne Multifunktionsgerät eingescannt hat. Es folgen die Erfassungsdaten: Gerät MFP-EG-237, Zeitstempel, Umfang "4 Seiten (PDF)", Aktenzeichen, Rechnungsnummer, Vertragsnummer. Gegenstand ist eine stornierte SEPA-Lastschrift über 20,28 Euro, dazu Verzug nach § 288 BGB, Mahnkosten und die Aussicht auf ein gerichtliches Mahnverfahren.

Scan-to-Mail ist der eigentliche Trick. Es erklärt in einem Satz, warum ein Dokument als Datei kommt statt als Link, und im Büroalltag ist genau das normal. Dass "4 Seiten (PDF)" in Wirklichkeit eine 152 KB große HTML-Datei sind, fällt in der Anhangszeile nicht auf.

Handwerkliche Fehler gibt es trotzdem drei. Die Anrede lautet "Hallo Herr/Frau ," mit leerem Namensfeld. Die erste Body-Zeile nennt einen anderen Betreff als der Mail-Header. Und im Kernsatz steht "eine seitens des Zahlungspflichtigen storniert SEPA-Lastschrift".

Eine IBAN steht nirgends. Die stecke "im beigefügten Dokument". Das ist der ganze Zweck der Mail.

Warum die Filter nichts gesehen haben

SpamAssassin gab der Mail 1,6 von 7 nötigen Punkten. Rspamd kam auf -3,39 von 15. Beide haben sie durchgewunken, obwohl SPF fehlt, DKIM nicht validiert und DMARC nicht existiert.

Das liegt daran, dass es nichts zu bewerten gibt. Kein Link, kein Tracking-Pixel, kein nachgeladenes Bild, kein ausführbarer Anhang. Nur Fließtext in gutem Juristendeutsch und eine HTML-Datei. Reputationsfilter, Link-Rewriting und Sandbox-Klicks laufen alle ins Leere, weil der komplette Angriff im Anhang steckt und offline im Browser abläuft.

Was im Anhang passiert

Die Datei enthält keinen einzigen <script>-Tag. Stattdessen liegen zwei CSS-Variablen in einem style-Block: eine mit 1.062 Zeichen Hex, eine mit 139.224 Zeichen Base64. Gestartet wird das Ganze von einem unsichtbaren SVG mit einem <set ... onend="...">, das nach einer Millisekunde feuert. Für viele Sanitizer ist eine SMIL-Animation kein Script.

Der Handler liest die Hex-Variable per getComputedStyle, dekodiert sie zeichenweise und führt sie mit [].constructor.constructor(...)() aus. Das ist ein eval, das nicht eval heißt. Der so entstandene Loader holt sich die Base64-Variable, nimmt die ersten 16 Bytes als AES-Schlüssel, die nächsten 16 als Counter, und entschlüsselt den Rest über crypto.subtle. Heraus kommen 104 KB JavaScript, die per document.write() die Phishing-Seite in dieselbe Seite schreiben.

Der Schlüssel liegt also im Blob selbst. Das ist keine Geheimhaltung, sondern Signatur-Vermeidung: Jede Mail bekommt einen eigenen Schlüssel und damit einen eigenen Datei-Hash. Auf VirusTotal war dieser Anhang schlicht unbekannt.

Nachbauen lässt sich das in einer Zeile, sobald man Key und Counter hat:

openssl enc -d -aes-128-ctr \
  -K 60dd196f00aae6bb88f5a1d6f558c2a8 \
  -iv c5e7c7e69294b0a3cee6ee8a99c68d43 \
  -in ct.bin -out stage3.js

Das Kit ist ein Mietprodukt

Im entschlüsselten Code steht ein Block, der wörtlich so benannt ist:

// ===== INJECTION MARKER START =====
// Variables will be injected here by the API
var EMAIL = 'info@[redigiert]';
var IS_TAKEN = false;
var CAMPAIGN_ID = 515364;
var EMAIL_ID = 12244051;
var LOCALE = 'de';
var BASE_URL = 'http://email-internal.facem.money';
var PROVIDER_NAME = 'netcup';   // Provider name for [%%Provider%%]
var SERVER_PUBKEY_B64 = 'RNPrsgy+AMJQ5VIu4YdiXURtakJbhjmHBBiFrtof+Q4=';
// ===== INJECTION MARKER END =====

Im Juni stand an derselben Stelle PROVIDER_NAME = 'ISPGateway', dazu ein Logo-Link und das blaue Theme. SERVER_PUBKEY_B64, BASE_URL und EMAIL_ID sind in beiden Wellen identisch. Es ist derselbe Betreiber, dieselbe Plattform und derselbe Opfer-Datensatz. Nur die CAMPAIGN_ID ist von 459939 auf 515364 gesprungen, in dreißig Tagen.

Das Kit bringt vier Themes mit, deren Namen der Autor selbst in die Kommentare geschrieben hat: purple als Default, blue als "IONOS Style", orange als "cPanel Style" und green als "Dubai/UAE Style - Etisalat". Übersetzt ist es nach Deutsch, Englisch und Spanisch. Und die Variable IS_TAKEN sorgt dafür, dass ein bereits abgegriffenes Opfer direkt auf einen Erfolgs-Screen springt: Kontostatus aktiv, offener Betrag 0,00 Euro, alles bezahlt. Kein zweiter Abgriff, kein Verdacht.

Wohin die Passwörter gehen

Die Seite fragt in zwei Schritten E-Mail-Adresse und Passwort ab, im Namen der "netcup Rechnungsabteilung". Abgeschickt wird nicht im Klartext. Der Kit lädt libsodium von jsDelivr und versiegelt die Eingaben mit crypto_box_seal gegen den eingebetteten Server-Public-Key. Der Base64-Brocken wandert dann in einem POST-Feld namens utmstream an hxxp://email-internal[.]facem[.]money/api/public/emails/verify.

Der Feldname ist gut gewählt. Wer im Proxy-Log utmstream sieht, denkt an Kampagnen-Tracking. Und selbst wer den Traffic vollständig mitschneidet, bekommt das Passwort ohne den privaten Serverschlüssel nicht zurück.

Der unangenehmste Teil kommt danach. Der Client wertet die Antwort aus und sucht nach status: 'LOGIN_OK'. Kommt etwas anderes zurück, zeigt die Seite "Anmeldedaten ungültig" und lässt den Nutzer erneut tippen. Die Plattform prüft die Zugangsdaten also live gegen den echten Provider. Der Betreiber sammelt keine Tippfehler, sondern verifizierte Accounts. Und das Opfer bekommt bei einem Vertipper genau das Verhalten, das es erwartet.

Die Sammelstelle ist übrigens seit Anfang Juli bei 15 von 92 Engines auf VirusTotal als Phishing gelistet. Gelaufen ist die Kampagne trotzdem. Blocklisten für URLs greifen erst, wenn das Opfer schon auf "Anmelden" gedrückt hat.

Woran man es erkennt

Die zuverlässigsten Zeichen brauchen kein Fachwissen. Ein Anhang, der laut Text ein PDF ist und im Dateinamen auf .html endet, ist keins. Eine Anrede mit leerem Namensfeld kommt aus einem Serienbrief. Eine Forderung ohne IBAN will nicht, dass man zahlt, sondern dass man den Anhang öffnet. Und eine deutsche Kanzlei schreibt nicht von der Domain eines rumänischen Weinguts.

Praktisch hilft vor allem eins: Eine echte Rücklastschrift steht im eigenen Kontoauszug, mit Datum, Betrag und Grund. Steht sie da nicht, gibt es nichts zu klären.

Dazu vier Dinge, die man diese Woche erledigen kann. HTML-Anhänge am Mail-Gateway blocken oder in Quarantäne schieben, denn legitime Geschäftspost verschickt praktisch nie HTML-Dateien. MFA für Hosting- und Mail-Account aktivieren, bei netcup im Kundenkonto verfügbar, weil das die einzige Maßnahme ist, die noch greift, wenn das Passwort schon weg ist. Logins nur über das eigene Lesezeichen, weil diese Seite keine prüfbare Adressleiste hat. Und einen Passwortmanager nutzen, der auf einer aus einer lokalen Datei gerenderten Seite schlicht nichts anbietet. Dieses Ausbleiben ist ein besseres Warnsignal als jede optische Prüfung.

Wer Logs auswerten kann, nimmt den Server-Public-Key RNPrsgy+AMJQ5VIu4YdiXURtakJbhjmHBBiFrtof+Q4= als Suchstring für HTML-Anhänge. Der überlebt jeden Hash-Wechsel und ist über beide Wellen identisch.

Was mich daran wirklich stört

Nicht der Kit. Der ist gut gebaut, aber im Kern seit Juni unverändert, bis auf die letzten 174 Bytes.

Es ist die Tatsache, dass jemand dreißig Tage später denselben Datensatz noch einmal anfasst, vorher nachschaut, wo das Postfach inzwischen liegt, und das Branding entsprechend umstellt. Das ist keine Spam-Welle, die über eine gekaufte Adressliste rauscht. Das ist eine gepflegte Datenbank mit Wiedervorlage. Und beim nächsten Mal ist das Logo dann vermutlich auch da.


Die kompromittierte Absender-Domain ist redigiert (<weinkellerei-ro>[.]ro) und im Screenshot unkenntlich gemacht. Der betroffene Betrieb ist hier selbst Opfer: Sein Hosting-Konto wurde übernommen und für den Versand missbraucht - das soll kein Pranger werden. Auch die Empfängeradresse ist redigiert. Die vollständigen IOCs liegen intern.