Operation GhostMail: Russische APT nutzt Zimbra Webmail aus, um ukrainische Staatsagentur anzugreifen
Inhalte
- Einführung
- Ziel
- Phishing-E-Mail
- Infektionsanalyse
- Phase 1: JavaScript-Ladegerät
- Phase 2: Browserdiebstahl
- Infrastruktur und Attribution
- CVE-Bewertung
- Fazit
- Seqrite Abdeckung
- IOCs
- MITRE ATT & CK
Einführung
Seqrite Die Labore identifizierten eine gezielte Phishing-Kampagne, die eine Cross-Site-Scripting-Schwachstelle (XSS) ausnutzt. Zimbra-Zusammenarbeit (ZCS) zur Kompromittierung einer ukrainischen Regierungsbehörde. Die Phishing-E-Mail enthält keine schädlichen Anhänge, keine verdächtigen Links und keine Makros. Die gesamte Angriffskette ist im HTML-Text einer einzigen E-Mail enthalten; es gibt keine schädlichen Anhänge.
Eine durch Social Engineering manipulierte Praktikumsanfrage dient dazu, einen verschleierten JavaScript-Code direkt in den E-Mail-Text einzubetten. Öffnet das Opfer die E-Mail in einer anfälligen Zimbra-Webmail-Sitzung, wird eine Sicherheitslücke ausgenutzt. CVE-2025-66376 Es handelt sich um eine gespeicherte XSS-Schwachstelle, die durch unzureichende Bereinigung von CSS-@import-Anweisungen im HTML-Inhalt verursacht wird. Das Skript läuft unbemerkt im Browser und sammelt Anmeldeinformationen, Sitzungstoken, Backup-Codes für die Zwei-Faktor-Authentifizierung, im Browser gespeicherte Passwörter und den Inhalt des E-Mail-Postfachs des Opfers der letzten 90 Tage. Alle Daten werden sowohl über DNS als auch über HTTPS exfiltriert.
Aufgrund technischer Überschneidungen mit der Ausnutzung von Zimbra-Operationen und der geopolitischen Zielausrichtung gehen wir mit mäßiger Sicherheit davon aus, dass diese Kampagne mit zuvor dokumentierten Methoden übereinstimmt. vom russischen Staat gefördert Es wurden Einbruchsversuche auf ukrainische Regierungsstellen gemeldet. Dies wurde CERT-UA gemeldet.
Ziel
- Land auswählen: Ukraine
- Einsatzbereiche: Regierung
Der E-Mail-Empfänger ist Mitarbeiter der ukrainischen staatlichen Hydrologiebehörde, die in einem als kritische nationale Infrastruktur eingestuften Sektor tätig ist und für die Navigation, die maritime und hydrographische Unterstützung der Schifffahrt zuständig ist. Sie untersteht dem Infrastrukturministerium (genauer gesagt dem Staatlichen Dienst für See- und Flussverkehr der Ukraine). Der Angriff steht im Einklang mit umfassenderen Cyberoperationen gegen ukrainische Institutionen des öffentlichen Sektors im Kontext der anhaltenden regionalen Konfliktdynamik.
Phishing-E-Mail
Die Phishing-E-Mail wurde am 22. empfangen.nd Im Januar 2026 schickte ein Student der Nationalen Akademie für Innere Angelegenheiten (NAVS) eine E-Mail an die ukrainische Hydrologiebehörde (die Studenten-E-Mail-Adresse ist vermutlich kompromittiert, wie die Absender-IP im Header vermuten lässt). Die auf Ukrainisch verfasste E-Mail gibt sich als routinemäßige Praktikumsanfrage aus. Der Student stellt sich als Student im vierten Studienjahr vor und fragt nach Praktikumsmöglichkeiten oder Ansprechpartnern. Zusätzlich entschuldigt er sich für den Fall, dass die E-Mail im falschen Posteingang landet – eine gängige Taktik, um Vertrauen aufzubauen.

Wichtige Beobachtungen:
- Gesendet von der mit NAVS verbundenen Infrastruktur.
- Scheint auf den ersten Blick legitim zu sein
- Keine schädlichen Anhänge, keine verdächtigen externen Links
- Schadcode direkt im HTML-Body eingebettet
- Keine Nachweise auf VirusTotal, wo es ursprünglich am 26. Februar in der Ukraine entdeckt und hochgeladen wurde.

Der Angreifer verfasste diese E-Mail manuell über die Zimbra-Weboberfläche in Chrome 132 (stabile Version vom 14. Januar 2026) und nicht mithilfe eines automatisierten Tools.
- 8.15_GA_4717 – Zimbra-Serverversion des Senders
- 10.1.7_GA_4200002 – Buildnummer der ZimbraWebClient-Frontend-Benutzeroberfläche

Die E-Mail enthält versteckten, bösartigen JavaScript-Code, der eingebettet ist in Es handelt sich um einen großen, Base64-kodierten Codeblock innerhalb des HTML-Bodys. Die Umgehung des @import-Tags ist so konzipiert, dass sie bei einer Regex-basierten Prüfung wie fehlerhaftes HTML aussieht, während sie für die Browseranalyse gültig bleibt.

Der Exploit in diesem Beispiel entspricht CVE-2025-66376, einer gespeicherten XSS-Schwachstelle in der Zimbra Collaboration Suite, die in ZCS 10.0.18 / 10.1.13 (November 2025) behoben wurde. Die CVE-Beschreibung lautet: „Unzureichende Bereinigung von HTML-Inhalten, insbesondere durch manipulierte Tag-Strukturen und Attributwerte, die eine @import-Direktive und andere Skript-Injection-Vektoren enthalten. Die Schwachstelle wird ausgelöst, wenn ein Benutzer eine manipulierte E-Mail-Nachricht in der klassischen Benutzeroberfläche öffnet.“
Der Bypass beruht darauf, dass das @import-Token aus Tag-Namen und Attribut-Schlüssel/Wert-Paaren entfernt wird. Die E-Mail enthält außerdem sekundäre Köder, die nach demselben Prinzip funktionieren und fehlerhaft sind. and tags with @import noise injected into the tag name itself, and an HTML comment inserted mid-tag-name. This tag-name bypass causes AntiSamy to reconstruct from fragmented tokens, and executes the outer Base64 decoded code and the self-executing function runs.
Infektionsanalyse
Das Opfer erhält eine Phishing-E-Mail in seinem Zimbra-Webmail-Konto. Zur Ausführung muss das Opfer die E-Mail in der browserbasierten Zimbra-Oberfläche mit einer aktiven, authentifizierten Sitzung öffnen. Der JavaScript-Code wird innerhalb dieses Sitzungskontexts ausgeführt und übernimmt dessen Zugriff auf Cookies, localStorage und die Same-Origin-SOAP-API-Rechte.

Phase 1: JavaScript-Ladegerät
Der Loader ist in eine selbstausführende Funktion eingebettet, die zunächst Mehrfacheinspeisungen verhindert, indem sie prüft, ob das Skript mit der ID „zmb_pl_v3_„läuft bereits oder nicht.“ Der nächste kritische Schritt ist das Dekodieren der Base64-Nutzdaten mit A nach B() und anschließend eine XOR-Operation mit dem Schlüssel „twichcba5e„um die endgültige JavaScript-Nutzlast zu laden. Der Code wird in das Dokument der obersten Ebene eingefügt, da er den Sitzungskontext, den Zugriff auf Cookies und die Möglichkeit zum Verlassen der Webmail-iFrame-Sandbox enthält.“

Phase 2: Browserdiebstahl
Die finale Payload ist ein Stealer, der im Browserspeicher ausgeführt wird. Dieser erfasst Anmeldeinformationen, SOAP-Session-Token, E-Mail-Inhalte und -Anhänge, Cookies usw. Zu Beginn wird für jede Ausführung ein Session-Token generiert. Dieses zufällige, 12-stellige alphanumerische Token dient als eindeutiger Opferidentifikator in jeder C2-Anfrage. Die fest codierte C2-Domäne lautet: zimbrasoft[.]com[.]uaJede im Payload abgefangene Ausnahme löst eine POST-Anfrage an /v/p mit dem Phasennamen, der Fehlermeldung und dem Stacktrace aus. Der C2-Operator sieht auf jedem Zielrechner genau, welcher Schritt fehlgeschlagen ist und warum. Um Fehler zu isolieren und zu verhindern, dass eine fehlerhafte Operation die anderen abbricht, ist jede Aufgabe in einen try/catch-Block eingeschlossen.

Dann gibt es noch den Zimbra SOAP-Wrapper, der authentifizierte SOAP-Anfragen an den eigenen Zimbra-Server des Opfers unter „/service/soap/Der X-Zimbra-Csrf-Token-Header enthält das gestohlene CSRF-Token, wodurch Anfragen nicht von legitimen Webmail-Aktivitäten zu unterscheiden sind. Die SOAP-Aufrufe sind so konfiguriert, dass sie im Fehlerfall null zurückgeben, anstatt einen Fehler auszulösen. Dies ermöglicht andere parallele Operationen, selbst wenn ein SOAP-Aufruf abgelehnt wird.

Bei der DNS-Exfiltration werden Werte gemäß RFC 4648 Base32 kodiert, in 60-Zeichen-Segmente unterteilt und daraus ein DNS-Hostname in folgender Form erstellt:
- D- Die Die .i[.]zimbrasoft[.]com[.]ua
Anschließend werden JSON-Objekte als application/octet-stream-Blobs serialisiert und per POST mit einem X-Filename-Header an /v/d gesendet. Dieser Header wird für größere strukturierte Objekte wie den vollständigen Serverkonfigurations-Dump verwendet. Der Beacon ist eine einfache POST-Anfrage an /v/p, die für kleine strukturierte Daten zusätzlich oder anstelle von DNS verwendet wird. Er kann denselben Wert sowohl über DNS als auch über HTTPS senden. DNS funktioniert auch dann, wenn HTTPS blockiert ist; HTTPS überträgt alle Daten, wenn HTTPS nicht blockiert ist.

Zimbra Classic UI speichert das Session-CSRF-Token hier im Klartext: localStorage.getItem(“csrfToken”). Ohne dieses Token würden alle SOAP-Aufrufe abgelehnt. Dieser Vorgang wird synchron ausgeführt, bevor eine SOAP-Operation gestartet wird.

Alle neun parallelen Operationen werden gleichzeitig gestartet mit Promise.allAus Sicht des C2 maximiert dies die Datenausbeute pro Opfersitzung: Wenn sich der Tab nach 10 Sekunden schließt, ist alles, was hätte ausgelöst werden können, bereits ausgelöst worden.
SendStartPing: Benachrichtigt C2 nach Beginn der Payload-Ausführung. Dies ermöglicht dem Angreifer, Start- und Endzeiten pro Opfer zu korrelieren.
E-Mail-Adresse sammelnZwei-Methoden-E-Mail-Erfassung, bei der zunächst Inline-E-Mails extrahiert werden. tags for the batchInfoResponse Die JavaScript-Variable, die Zimbra beim Seitenaufruf einbettet, wird als Fallback verwendet. GetIdentitiesRequest SOAP, das alle konfigurierten Identitäten einschließlich Aliase zurückgibt und Daten über DNS und HTTPS exfiltriert.

gather_environment: Nimmt Fingerabdrücke des Kunden und ruft an GetInfoRequest um die vollständige Serverkonfigurationsantwort abzurufen, und gibt dann das gesamte JSON aus als zimbra_batch_analytics.json. Dieses Objekt enthält die Zimbra-Version, das Kontokontingent, konfigurierte Funktionen, den Server-Hostnamen und Dutzende von Kontoeinstellungen.
- Klassisch (?client=erweitert)
- HTML (/h/)
- Modern (/modern/).
gather_2fa_codes: Es verwendet GetScratchCodesRequest Dadurch werden die Backup-2FA-Wiederherstellungscodes des Kontos zurückgegeben. Dies sind Einmalcodes für den Notfallzugriff, mit denen sich der Angreifer selbst dann authentifizieren kann, wenn das Opfer sein Passwort ändert und alle Sitzungen widerruft. Jeder Code wird einzeln über DNS exfiltriert.

App-Passwort sammelnDies verwendet CreateAppSpecificPasswordRequest um eine neue dauerhafte Anmeldeinformation mit dem Namen zu erstellen ZimbraWebApp-spezifische Passwörter bleiben auch nach Passwortzurücksetzungen erhalten. Dies ist der langfristige Zugriffsmechanismus des Angreifers: Einmal erstellt, ermöglicht er die direkte IMAP- oder API-Authentifizierung auf unbestimmte Zeit und die Daten werden über DNS exfiltriert.
Gerätestatus sammeln: GetDeviceStatusRequest Der Namespace urn:zimbraSync gibt alle mit ActiveSync verbundenen Mobilgeräte mit Details wie Geräte-IDs, Gerätetypen und Synchronisierungsstatus zurück. Er ist nützlich, um ein Zielprofil zu erstellen und potenziell Folgeangriffe auf Mobilgeräte durchzuführen.
gather_oauth_consumers: GetOAuthConsumersRequest Dient dazu, alle für das Konto autorisierten Drittanbieter-OAuth-Apps aufzulisten. Dadurch werden weitere vom Zielsystem genutzte Plattformen sichtbar und welche davon API-Zugriff auf den Posteingang haben.

Passwort automatisch vervollständigenEs fügt zwei versteckte Formularfelder (autocomplete="username" und autocomplete="current-password") außerhalb des sichtbaren Bereichs in das DOM ein und wartet fünf Sekunden, bis der Passwortmanager des Browsers diese automatisch ausfüllt. Anschließend liest es die angezeigten Daten, extrahiert sie und entfernt alle eingefügten Elemente. Dies ist die einzige Operation, die kein CSRF-Token benötigt, da sie den Browser und nicht Zimbra angreift.
enable_mail_protocols: Der Änderungsanfrage Setzt zimbraPrefImapEnabled: TRUE für das Konto des Opfers. Dadurch wird der IMAP-Zugriff stillschweigend aktiviert, sodass das App-Passwort anschließend für die dauerhafte Überwachung des Postfachs von jedem IMAP-Client aus verwendet werden kann.

Kommen wir nun zum wichtigsten Abschnitt, nämlich: sendArchives Für die 90-tägige E-Mail-Exfiltration durchläuft das Programm die Tage 0 bis 89 und lädt täglich die Nicht-Junk-E-Mails vom integrierten Export-Endpunkt „/home/~/?fmt=tgz“ von Zimbra herunter. Die .tgz-Dateien werden anschließend direkt über js-[token].i.zimbrasoft.com.ua/v/d hochgeladen. Es werden zwei Upload-Modi verwendet:
- Streaming (ReadableStream wird direkt weitergeleitet, kein Speicherpuffer) für moderne Browser.
- Gepufferter Datenspeicher mit einer Kapazitätsgrenze von 500 MB für ältere Modelle.

Hierbei werden localStorage-Schlüssel (zd_comp_YYYY-MM-DD) als Prüfpunkte verwendet. Beim erneuten Öffnen des Tabs werden bereits extrahierte Daten übersprungen. Das Timeout ist auf 24 Stunden pro Tag eingestellt; der Stream läuft also so lange, wie der Tab geöffnet ist.
Schließlich wird der sendFinishPing Beacons dienen der Bestätigung, dass alle Operationen abgeschlossen sind. Das C2-System kann Start- und Enddaten verwenden, um die Dauer einer Sitzung des Opfers zu messen und daraus abzuleiten, welche Daten erfasst wurden.

Infrastruktur und Attribution
Die C2-Domain wurde am 20.01.2026 um 12:10:33 Uhr (UTC+02) erstellt, kurz bevor die Phishing-E-Mail mit dem Registrar ua.drs versendet wurde. Bisher wurden zwei generierte Domains identifiziert:
- js-l1wt597cimk[.]i[.]zimbrasoft[.]com[.]ua
- js-26tik3egye4[.]i[.]zimbrasoft[.]com[.]ua
Mehrere russische APT-Gruppen haben Zimbra bereits in großem Umfang gegen Ziele in Osteuropa eingesetzt: Fancy Bear (APT28), Cozy Bear (APT29) und Winter Vivern (TA473). dokumentiert Zimbra nutzt eine Command-Injection-Schwachstelle aus, die über einen anfälligen Mailserver E-Mail-Zugangsdaten stiehlt. Es handelt sich um einen serverseitigen Angriff, der keine Interaktion mit der E-Mail erfordert. Dies ist eine völlig andere Angriffsart als Phishing-E-Mails, die eine HTML-E-Mail mit XSS-Payload enthalten und das Opfer zwingen, die E-Mail im Webmail-Programm zu öffnen. TA473 Es wurden keine komplexen Tools verwendet, sondern lediglich einfache JavaScript-Credential-Stealer mit einer Zimbra-XSS-Schwachstelle. Es gab keinen strukturierten Missbrauch der SOAP-API und keine Dual-Channel-Datenexfiltration.
Wie im Abschnitt „Betrieb von ESET“ erwähnt. Rundpresse Recherchen im Jahr 2024 ergaben, dass APT28 seine Aktivitäten von Roundcube auf Zimbra, Horde und MDaemon ausweitete und dabei Regierungsbehörden und Rüstungsunternehmen in Osteuropa ins Visier nahm. Die von uns dekodierte Payload-Struktur weist große Ähnlichkeit mit SpyPress.ZIMBRA auf, welches die Kontaktliste des Opfers durch eine SOAP-Anfrage an den Zimbra-API-Endpunkt erfasst und E-Mail-Quellen für den Datenexfiltration abruft. Aufgrund dieser Übereinstimmungen und der Zielauswahl ordnen wir die Operation GhostMail mit mittlerer Wahrscheinlichkeit APT28 zu.
Fazit
Die Operation GhostMail verdeutlicht die kontinuierliche Weiterentwicklung von Webmail-Angriffen, bei denen Angreifer ausschließlich auf browserbasierte Stealer anstatt auf herkömmliche Malware-Binärdateien setzen. Durch das Einbetten von verschleiertem JavaScript direkt in eine HTML-E-Mail und die Ausnutzung einer XSS-Schwachstelle in Zimbra Webmail gelingt es dem Angreifer, die Sitzung vollständig zu übernehmen, ohne Dateien abzulegen, Makros auszunutzen oder Endpunkt-basierte Erkennungsmechanismen auszulösen. Der Missbrauch legitimer SOAP-API-Aufrufe zum Abgreifen von Zugangsdaten und zum Exportieren von E-Mail-Postfächern zeigt, wie plattformeigene Funktionen für die unbemerkte Datensammlung missbraucht werden können.
Der Angriff auf eine ukrainische Regierungsbehörde steht im Einklang mit den anhaltenden geopolitischen Cyberaktivitäten gegen öffentliche Einrichtungen in der Region. Eine eindeutige Zuordnung erfordert zwar weitere Bestätigungen durch Infrastruktur- oder Codeüberschneidungen, die angewandten Techniken stimmen jedoch mit bereits dokumentierten, von russischen Staaten geförderten Gruppen überein, die Webmail-Plattformen in Osteuropa ausnutzen. Die Bedeutung strikter HTML-Bereinigung in Webmail-Umgebungen, zügigem Patch-Management und der Überwachung anomaler SOAP-Aktivitäten deutet auf browserbasierte Sitzungskompromittierungen hin.
Seqrite Abdeckung
Script.Trojan.50486.GC
Empfehlungen
- Migrieren Sie umgehend von Zimbra 8.8.15 auf eine unterstützte Version (mindestens 10.1.x) oder eine alternative Plattform.
- Überprüfen Sie alle Konten auf anwendungsspezifische Passwörter mit dem Namen „ZimbraWeb“ oder auf Passwörter, die etwa zum Zeitpunkt des Erhalts einer verdächtigen E-Mail erstellt wurden. Entziehen Sie diese Passwörter umgehend.
- Überprüfen Sie die Kontoeinstellungen auf unerwartete Änderungen von zimbraPrefImapEnabled: TRUE, insbesondere bei Konten, die keinen geschäftlichen Bedarf an IMAP-Zugriff haben.
- Prüfen Sie die Zimbra-Audit-Logs auf Zugriffe auf /home/~/?fmt=tgz von ungewöhnlichen Quell-IPs oder außerhalb der normalen Geschäftszeiten.
- Implementieren Sie die SOAP-API-Überwachung auf Anwendungsebene. Insbesondere Aufrufe von GetScratchCodesRequest und CreateAppSpecificPasswordRequest sollten im Normalbetrieb nahezu nicht vorkommen und sich leicht erfassen lassen.
- Implementieren Sie eine DNS-Filterung für die IOC-Domänen und erwägen Sie eine Verhaltenswarnung für das Subdomänenmuster d-[a-z0-9]{12}.i.*, das den DNS-Exfiltrationskanal charakterisiert.
- Prüfen Sie, ob IMAP- und POP3-Zugriff standardmäßig für Benutzerkonten aktiviert sein sollten. Durch die Deaktivierung nicht verwendeter Protokolle auf administrativer Ebene wird ein Sicherheitsrisiko beseitigt, selbst wenn Zugangsdaten später kompromittiert werden.
- Weisen Sie die Mitarbeiter darauf hin, dass HTML-E-Mails in Webmail-Umgebungen ausführbare Dateien enthalten können. Das Fehlen von Anhängen und Links ist kein verlässlicher Sicherheitsindikator.
IOCs
E-Mail
c010f64080b0b0997b362a8e6b9c618e
C2
zimbrasoft[.]com[.]ua
js-[a-z0-9]{12}.i.zimbrasoft[.]com[.]ua
MITRE ATT & CK
| Taktik | ZEIT | Technik | Ablauf |
| Ressourcenentwicklung | T1583.001 | Infrastruktur erwerben: Domänen | Die C2-Domäne wurde kurz vor dem Angriff registriert. |
| Ressourcenentwicklung | T1586.002 | Gefährdung von Konten: E-Mail-Konten | Phishing-E-Mail von NAVS-E-Mail gesendet |
| Erster Zugriff | T1566.001 | Phishing: Spearphishing-Anhang | HTML-E-Mail mit eingebetteter XSS-Nutzlast |
| Ausführung | T1059.007 | Befehls- und Skriptinterpreter: JavaScript | Im Browser residente Nutzlast |
| Ausführung | T1203 | Ausbeutung zur Kundenausführung | CVE-2025-66376 XSS ausgenutzt |
| Beharrlichkeit | T1098.001 | Kontomanipulation: Zusätzliche Cloud-Anmeldeinformationen | CreateAppSpecificPasswordRequest erstellt ein neues, dauerhaftes Anmeldeinformationsblatt. |
| Verteidigungsflucht | T1027 | Verschleierte Dateien oder Informationen | XOR + Base64-Mehrschichtkodierung, @import-Token |
| Verteidigungsflucht | T1564.001 | Artefakte ausblenden: Versteckte Dateien und Verzeichnisse | Nutzlast vor visueller Inspektion verborgen |
| Zugang zu Anmeldeinformationen | T1528 | Zugriffstoken für Anwendung stehlen | GetOAuthConsumersRequest |
| Zugang zu Anmeldeinformationen | T1539 | Web-Session-Cookie stehlen | CSRF-Token aus localStorage |
| Zugang zu Anmeldeinformationen | T1111 | Abfangen der Multi-Faktor-Authentifizierung | Backup des Diebstahls von 2FA-Codes über GetScratchCodesRequest |
| Zugang zu Anmeldeinformationen | T1555.003 | Anmeldeinformationen aus Kennwortspeichern: Anmeldeinformationen aus Webbrowsern | Automatische Vervollständigung der DOM-Injektion Ernte |
| Bewertung | T1082 | Systeminformationserkennung | GetInfoRequest-Server-Fingerabdruck |
| Bewertung | T1087.003 | Kontoerkennung: E-Mail-Konto | GetIdentitiesRequest und DOM-Scraping |
| Bewertung | T1069 | Ermittlung von Berechtigungsgruppen | GetOAuthConsumersRequest |
| Bewertung | T1120 | Erkennung von Peripheriegeräten | GetDeviceStatusRequest |
| Kollektion | T1114.002 | E-Mail-Erfassung: Remote | 90-Tage-Sweep |
| Kollektion | T1185 | Browser-Sitzungs-Hijacking | window.top.document iframe escape |
| Kollektion | T1213 | Daten aus Informationsrepositorien | Konfigurationsdump zimbra_batch_analytics.json |
| Exfiltration | T1041 | Exfiltration über C2-Kanal | HTTPS POST /v/d und /v/p |
| Exfiltration | T1071.004 | Anwendungsschichtprotokoll: DNS | Base32-kodierte DNS-Exfiltration |
Autoren
Sathwik Ram Prakki
Kartik Jivani



