Am 11. November 2021 veröffentlichte Google TAG einen Blogpost über Watering-Hole-Angriffe, die über Exploits für den Safari-Webbrowser unter macOS laufen. In der Woche vor dieser Veröffentlichung hatten ESET-Forscher diese Kampagne untersucht und zusätzliche Details zu den Zielen sowie zur kompromittierenden Malware herausgefunden. In diesem Blogpost untersuchen wir den WebKit-Exploit, der zur Kompromittierung von Mac-Nutzern eingesetzt wird, und wir analysieren den ausgelieferten Schadcode, der zu einer neuen Malware-Familie für macOS gehört. Zuerst betrachten, wie die Opfer überhaupt mit dem Schadcode in Kontakt gekommen sind.
Ziele
Zuerst betrachten, wie die Opfer überhaupt mit dem Schadcode in Kontakt gekommen sind. Laut Felix Aimé von SEKOIA.IO war eine der Websites, die zur Verbreitung der Exploits verwendet wurden, eine gefälschte Website, die auf Aktivisten aus Hongkong abzielte. Auf der Homepage ist unter anderem zu lesen: „Liberate Hong Kong, the revolution of our times“. Das sehr aktuelle Registrierungsdatum der fightforhk[.]com-Domain, der 19. Oktober 2021, und die Tatsache, dass die Website nicht mehr zugänglich ist, unterstützt diese Idee. Wir konnten auch bestätigen, dass das Internet Archive am 13. November eine Kopie der Webseite zwischengespeichert hat. Diese Kopie enthält den bösartigen Iframe, wie in Abbildung 1 zu sehen.
ESET-Forscher fanden eine weitere Website, diesmal eine legitime, die aber ebenfalls kompromittiert war. Sie verbreitete denselben Exploit in den wenigen Monaten vor der Veröffentlichung von Google TAG. Es ist die Seite des demokratiefreundlichen Online-Radiosenders D100 aus Hongkong. Wie in Abbildung 2 zu sehen, wurde zwischen dem 30. September und dem 4. November 2021 ein iFrame in Seiten eingefügt, die in bc.d100[.]net – dem von Abonnenten genutzten Bereich der Website – bereitgestellt wurden.
Beide Verteilungsmethoden haben etwas gemeinsam: Sie ziehen Besucher aus Hongkong an, die sich für die Demokratiebewegung interessieren. Es scheint, dass sie das primäre Ziel dieser Bedrohung waren.
Die Exploit-Kette
Wie in Abbildung 3 zu sehen, sucht die Seite, die auf der bösartigen Domain amnestyhk[.]org gehostet wird, nach der installierten macOS-Version und leitet zur nächsten Stufe weiter, wenn der Browser unter macOS 10.15.2 oder neuer läuft.
Die nächste Stufe namens 4ba29d5b72266b28.html (siehe Abbildung 4) lädt einfach das JavaScript mit dem Exploit-Code – mac.js.Beachten Sie, dass das script-Tag zum Laden von caps.js auskommentiert wurde. Die vorherige Version des Exploits lud Capstone.js aus dieser Datei, während in der neuen Version Capstone.js dem Exploit-Code in mac.js vorangestellt wird.
Der WebKit-Exploit
Der verwendete Exploit zur Ausführung von Code im Browser ist ziemlich komplex und hatte, sobald er schön formatiert war, mehr als 1.000 Codezeilen. Es ist interessant, dass ein Teil des Codes auskommentiert wurde. Er deutet darauf hin, dass die Schwachstelle auch auf iOS und sogar auf PAC-fähigen (Pointer Authentication Code) Geräten wie dem iPhone XS und neueren Geräten ausgenutzt worden sein könnte (siehe Abbildung 5).
Wir können bestätigen, dass der von Google TAG identifizierte Patch die Schwachstelle behebt. Es ist möglich, dass dieser Schwachstelle die CVE-2021-1789 zugewiesen wurde, aufgrund des Mangels an öffentlich verfügbaren technischen Details konnten wir dies jedoch nicht bestätigen. Im Folgenden skizzieren wir, wie sich die Schwachstelle nach unseren Erkenntnissen auf Safari-Versionen vor 14.1 auswirkt.
Der Exploit implementiert zwei Primitive, um Lese- und Schreibzugriff auf den Speicher zu erhalten: Das erste dient dazu die Adresse eines Objekts zu herauszufinden (addrof). Das zweite dient der Erstellung eines gefälschten JavaScript-Objekt aus einer bestimmten Speicheradresse (fakeobj). Mit diesen beiden Funktionen erstellt der Exploit zwei Arrays unterschiedlichen Typs, die sich im Speicher überlappen. Dadurch ist er in der Lage, in einem von ihnen einen Wert zu setzen, der als Zeiger behandelt wird, wenn mit dem anderen darauf zugegriffen wird. Die Technik wird von Samuel Groß in seinen zahlreichen Veröffentlichungen zu diesem Thema gut beschrieben. Im Folgenden erläutern wir die Schwachstelle, die das Durchsickern von Objektadressen möglich gemacht hat.
Der Exploit beruht auf einem Nebeneffekt, der durch die Änderung einer Objekteigenschaft verursacht wird, damit sie über eine „Getter“-Funktion zugänglich ist, während die Eigenschaften des Objekts in JIT-kompiliertem Code aufgelistet werden. Die JavaScript-Engine spekuliert fälschlicherweise, dass der Wert der Eigenschaft in einem Array zwischengespeichert wird und nicht das Ergebnis des Aufrufs der Getter-Funktion ist. Wir haben den relevanten Teil des Codes extrahiert, der das addrof-Primitive aktiviert, das Sie in Abbildung 6 sehen können. Kommentare, die mit (e)r beginnen, stammen von ESET Research.
Die erste Veränderung, die hier passiert, ist das Ergebnis von bar(vic). Die Funktion gibt einen Zeiger auf ein JSCell-Objekt (genauer gesagt ein GetterSetter) zurück, auf das niemals vom JavaScript-Code aus zugegriffen werden sollte. Hier ist das Ergebnis von describe(bar(vic)) in einer JavaScriptCore-Konsole:
Zelle: 0x7fffb34dc080 (0x7ffff38cc4c8:[0x3af5, GetterSetter, {}, NonArray, Leaf]), Struktur-ID: 15093
Diese JSCell wird dann durch Aufrufen der JavaScript-Object-Funktion in ein JSObject konvertiert. Intern führt dies zum Aufruf der toObject-Methode von JSCell. Es gibt keine Implementierung zum Konvertieren eines GetterSetter in ein JSObject, und der Code wird schließlich zurückfallen und davon ausgehen, dass sein Typ ein Symbol ist. Der GetterSetter wird fälschlicherweise in ein Symbol umgewandelt. Möglicherweise ist Ihnen die Behauptung aufgefallen, dass der Zelltyp ein Symbol ist, bevor Sie die Umwandlung im Code ausführen. Das ASSERT-Makro in WebKit wird jedoch aus Release-Builds kompiliert.
Im Speicher ist die Position von getter[0] dieselbe wie der Wert dieses beschädigten Symbols. Wenn Sie getter[0] also einen Wert neu zuweisen, ändert sich der Wert des Symbols. Sein Wert wird mithilfe seiner toString-Methode aus JavaScript abgerufen.
Der aktualisierte JavaScriptCore-Code prüft nun, ob das Objekt Eigenschaften mit GetterSetter - nach der Property-Enumeration - enthält. Danach wird erwogen, ob auf das Attribut des Objekts „schnell“ zugegriffen werden kann.
Die detaillierte Erstellung der gefälschten Objekte würde einen eigenen Artikel erfordern. Kurz gesagt, es missbraucht denselben Fehler, obwohl dieses Mal das Objekt so manipuliert wird, dass der JIT-kompilierte Code auf ein Element zugreift, das außerhalb der Grenzen liegt, und eine Adresse zurückgibt, die vor dem Abrufen sorgfältig auf den Heap gesprayt wurde.
Der Rest des Codes ermöglicht das Umgehen von Eindämmungsmaßnahmen wie Gigacage und lädt die nächste Stufe.
Wie von Google TAG erklärt, lädt das JavaScript eine ausführbare Mach-O-Datei in den Speicher. Der rudimentäre Loader implementiert keine Importsymbole aus externen Bibliotheken; stattdessen werden die Adressen von dlopen und dlsym in das geladene Mach-O gepatcht. Diese können dann aus der ausführbaren Datei verwendet werden, um die Adressen von Funktionen aus externen Bibliotheken dynamisch zu laden und abzurufen.
Rechteausweitung auf root
Nachdem die Codeausführung erreicht wurde, ist die nächste Stufe ein Mach-O, das in den Speicher geladen und ausgeführt wird. Dieser Mach-O nutzt eine lokale Schwachstelle bei der Rechteausweitung aus, um die nächste Stufe als Root auszuführen. Unsere Untersuchung bestätigt die Analyse von Google, dass die ausgenutzte Schwachstelle von Xinru Chi und Tielei Wang in einer Präsentation auf der zer0con 2021 beschrieben, aber auch auf der MOSEC 2021 von Tielei Wang ausführlicher vorgestellt wurde. Der Schwachstelle wurde CVE-2021-30869 zugewiesen. Abbildung 7 zeigt einen Aufruf einer Funktion, die Tielei Wang in seiner letzten Präsentation adjust_port_type genannt hat. Diese Funktion, die für die Änderung des internen Typs eines Mach-Ports verantwortlich ist, ist im Mach-O genauso implementiert, wie es auf der MOSEC vorgestellt wurde. Das Ändern des Typs eines Mach-Ports sollte nicht möglich sein, es sei denn, es besteht eine Schwachstelle.
Zusammenfassend macht der Mach-O Folgendes:
- Lädt eine Datei von der als Argument angegebenen URL herunter
- Entschlüsselt diese Datei mit AES-128-EBC und TEA mit einem benutzerdefinierten Delta
- Schreibt die resultierende Datei nach $TMPDIR/airportpaird und macht sie ausführbar
- Verwendet den Privilege Escalation Exploit, um das Attribut com.apple.quarantine aus der Datei zu entfernen, um zu vermeiden, dass der Benutzer aufgefordert wird, den Start der unsignierten ausführbaren Datei zu bestätigen
- Verwendet die gleiche Rechteausweitung, um die nächste Stufe mit Root-Rechten zu starten
Bei der entschlüsselten Nutzlast unterscheidet sich unsere Analyse am meisten von der Beschreibung von Google TAG: Die Nutzlast, die an gefährdete Besucher der D100-Site geliefert wurde, war eine neue macOS-Malware, die wir DazzleSpy genannt haben.
DazzleSpy
DazzleSpy ist eine voll funktionsfähige Backdoor, die Angreifern eine Vielzahl von Funktionen bietet, um einen kompromittierten Computer zu kontrollieren und Dateien von diesem zu exfiltrieren. Unser Beispiel ist eine Mach-O-Binärdatei, die für die x86_64-CPU-Architektur kompiliert wurde.
Persistenz
Um auf dem kompromittierten Gerät persistent zu werden, fügt die Malware dem LaunchAgents-Ordner eine Eigenschaftslistendatei (plist; siehe Abbildung 8) namens com.apple.softwareupdate.plist hinzu. Die ausführbare Malware-Datei heißt softwareupdate und wird im Ordner $HOME/.local/ gespeichert.
C&C-Kommunikation
DazzleSpy stellt eine Verbindung zu einem fest codierten Command&Control-Server (C&C) her. Die IP-Adresse und der Port, die in dem von uns entschlüsselten Schadcode gefunden wurden, waren 88.218.192[.]128:5633. Zuerst führt die Malware einen TLS-Handshake durch und verwendet dann ein benutzerdefiniertes Protokoll, um per JSON-Objekten Befehle vom C&C-Server an kompromittierte Macs weiterzugeben. Die Binärdatei von DazzleSpy enthält ein X.509-Zertifikat, das als Zertifizierungsstelle (CA) verwendet wird. Es überprüft, ob das Zertifikat des Servers von dieser Zertifizierungsstelle ausgestellt wurde. In der Praxis wird dasselbe selbstsignierte Zertifikat sowohl für die CA als auch für den C&C-Server verwendet. Die Technik schützt die Kommunikation der Malware vor potenziellem Abhören, indem sie das Senden von Daten verweigert, wenn keine Ende-zu-Ende-Verschlüsselung möglich ist.
Tabelle 1 enthält die Liste der von DazzleSpy unterstützten Befehle. Die erste Spalte ist der Name des Befehls, der im vom C&C-Server empfangenen JSON-Objekt vorhanden sein muss. Viele Befehle unterstützen optionale oder obligatorische Parameter.
Tabelle 1. DazzleSpy C&C-Befehle
Command name | Purpose |
---|---|
heartbeat | Sends heartbeat response. |
info | Collects information about compromised computer, including: |
searchFile | Searches for the specified file on the compromised computer. |
scanFiles | Enumerates files in Desktop, Downloads, and Documents folders. |
cmd | Executes the supplied shell command. |
restartCMD | Restarts shell session. |
restart | Depending on the supplied parameter: restarts C&C command session, shell session or RDP session, or cleans possible malware traces (fsck_hfs.log file and application logs). |
processInfo | Enumerates running processes. |
keychain | Dumps the keychain using a CVE-2019-8526 exploit if the macOS version is lower than 10.14.4. The public KeySteal implementation is used. |
downloadFileInfo | Enumerates the supplied folder, or provides creation and modification timestamps and SHA-1 hash for a supplied filename. |
downloadFile | Exfiltrates a file from the supplied path. |
file | File operations: provides information, renames, removes, moves, or runs a file at the supplied path. |
uninstall | Deletes itself from the compromised computer. |
RDPInfo | Provides information about a remote screen session. |
RDP | Starts or ends a remote screen session. |
mouseEvent | Provides mouse events for a remote screen session. |
acceptFileInfo | Prepares for file transfer (creates the folder at the supplied path, changes file attributes if it exists). |
acceptFile | Writes the supplied file to disk. With additional parameters, updates itself or writes files required for exploiting the CVE-2019-8526 vulnerability. |
socks5 | Starts or ends SOCKS5 session (not implemented). |
recoveryInfo | These seem like file recovery functions that involve scanning a partition. These functions do not seem to work and are probably still in development; they contain lots of hardcoded values. |
recovery | #rowspan# |
Artefakte
Bei der Analyse der DazzleSpy-Binärdatei haben wir eine Reihe interessanter Artefakte gefunden, die auf einen internen Namen für die Malware und die Herkunft der Autoren hindeuten könnten.
An mehreren Stellen (siehe z. B. Abbildung 9) verweist die Malware auf osxrk, und die Zeichenfolge 1.1.0 scheint wahrscheinlich eine interne Versionsnummer zu sein.
Darüber hinaus scheinen die Autoren von DazzleSpy nicht so besorgt über die Betriebssicherheit gewesen zu sein, da sie den Benutzernamen in Pfaden hinterlassen haben, die in die Binärdatei eingebettet sind. Abbildung 10 enthält Pfade, die diesen Benutzernamen und interne Modulnamen offenbaren.
Sobald die Malware das aktuelle Datum und die aktuelle Uhrzeit auf einem kompromittierten Computer erhält, wie Sie in Abbildung 11 sehen, konvertiert sie das erhaltene Datum in die Zeitzone Asien/Shanghai (auch bekannt als China Standard Time), bevor sie es an den C&C-Server sendet.
Darüber hinaus ist zu beachten, dass die DazzleSpy-Malware eine Reihe interner Nachrichten in chinesischer Sprache enthält, wie beispielsweise in Abbildung 12 zu sehen ist.
Fazit
Angesichts der Komplexität der in dieser Kampagne verwendeten Exploits, gehen wir davon aus, dass die Gruppe hinter dieser Operation über starke technische Fähigkeiten verfügt. Während online Informationen über die hier verwendete Schwachstelle Local Privilege Escalation (LPE) veröffentlicht wurden, konnten wir nichts über die spezifische WebKit-Schwachstelle finden, die verwendet wird, um die Codeausführung in Safari zu erreichen. Es ist auch interessant, dass DazzleSpy eine Ende-zu-Ende-Verschlüsselung erzwingt und nicht mit seinem C&C-Server kommuniziert, wenn jemand versucht, die unverschlüsselte Übertragung zu belauschen, indem er einen TLS-Inspektions-Proxy zwischen das kompromittierte System und den C&C-Server einfügt.
Die Watering-Hole-Operationen, die diese Gruppe durchführt, zeigen, dass ihre Ziele wahrscheinlich politisch aktive, demokratiefreundliche Personen in Hongkong sind. Diese Kampagne hat Ähnlichkeiten mit einem Angriff aus dem Jahr 2020, bei der LightSpy iOS-Malware (beschrieben von TrendMicro und Kaspersky) auf die gleiche Weise verbreitet wurde, indem sie iFrame-Injektion auf Websites für Bürger Hongkongs einsetzte, was zu einem WebKit-Exploit führte. Wir können an dieser Stelle nicht bestätigen, ob beide Kampagnen von derselben Gruppe stammen, aber ESET Research wird weiterhin solche bösartigen Aktivitäten verfolgen und darüber berichten.
Indicators of Compromise (IoCs)
Samples
SHA-1 | Filename | ESET detection name | Description |
---|---|---|---|
F3772A23595C0B51AE32D8E7D601ACBE530C7E97 | mac.js | JS/Exploit.Agent.NQK | JavaScript code with WebKit exploit launching an LPE. |
95889E0EF3D31367583DD31FB5F25743FE92D81D | N/A | OSX/Exploit.Agent.C | Mach-O file with LPE launching next stage. |
EE0678E58868EBD6603CC2E06A134680D2012C1B | server.enc | OSX/DazzleSpy | DazzleSpy Mach-O after decryption of server.enc. |
Filenames
- $HOME/Library/LaunchAgents/com.apple.softwareupdate.plist
- $HOME/.local/softwareupdate
- $HOME/.local/security.zip
- $HOME/.local/security/keystealDaemon
- $HOME/.local/security/libkeystealClient.dylib
Network
URLs of Safari exploit
- https://amnestyhk[.]org/ss/defaultaa.html
- https://amnestyhk[.]org/ss/4ba29d5b72266b28.html
- https://amnestyhk[.]org/ss/mac.js
- https://amnestyhk[.]org/ss/server.enc
DazzleSpy C&C server
- 88.218.192[.]128:5633
DazzleSpy CA certificate
SHA-256: 1F862B89CC5557F8309A6739DF30DC4AB0865668193FDFF70BA93F05D4F8C8B8
Certificate:
Data:
Version: 1 (0x0)
Serial Number: 10557282746731470350 (0x928300b9284a1e0e)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=11, ST=11, L=11, O=11, OU=11, CN=11/emailAddress=11@qq.com
Validity
Not Before: May 18 07:26:17 2021 GMT
Not After : May 16 07:26:17 2031 GMT
Subject: C=11, ST=11, L=11, O=11, OU=11, CN=11/emailAddress=11@qq.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus: …
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
-----BEGIN CERTIFICATE-----
MIIDTDCCAjQCCQCSgwC5KEoeDjANBgkqhkiG9w0BAQsFADBoMQswCQYDVQQGEwIx
MTELMAkGA1UECAwCMTExCzAJBgNVBAcMAjExMQswCQYDVQQKDAIxMTELMAkGA1UE
CwwCMTExCzAJBgNVBAMMAjExMRgwFgYJKoZIhvcNAQkBFgkxMUBxcS5jb20wHhcN
MjEwNTE4MDcyNjE3WhcNMzEwNTE2MDcyNjE3WjBoMQswCQYDVQQGEwIxMTELMAkG
A1UECAwCMTExCzAJBgNVBAcMAjExMQswCQYDVQQKDAIxMTELMAkGA1UECwwCMTEx
CzAJBgNVBAMMAjExMRgwFgYJKoZIhvcNAQkBFgkxMUBxcS5jb20wggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDFfrP+LbCk9KhPH2gQ3V5lBWCpuM+yzBzn
ofL2RJiTMedP467Js4wzrP+qCkXs9STaOZCvYRFaCmfY9bG7PsrgqG90OHfVkttG
5xIdEpd5XPl+GYl/48ridpE7mgw+KO0oRxoyUO1if9nRXvHNGmx0C3i9Rb6ahynv
dEBAZVxeX20fDHMr0dvVe4TKst9g5W02o31zU54mx2f7m2Kgit+n+UsDA/uBRF/c
GcWsvQFVlcguFmBDt58t98BO5nEmI3iDEfUi8FTf2HVSS0LAYC83IkwZyWpML9Jn
uVg67KFKprNMmzBxDK0eDa9ZHObohj3iscM3IYXlCnicbOLYTCvRAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBAAvkJC5Fi8+Kz8roBhzCY3ayPLMMMj49aHGU/JDLZwsh
WSng5/eY7LrGkTqP0tKay/rrxQvyMeZftvB0DMCbxu0vndK/jTqruxS+ZXDkqyOb
ykU0Z6TqRZ/ltgcK9ii4R6PgUEynrJVZHtUHDtemulpHgPRjkFDA4emOui1kFdNT
gnUr0vgh12KlVNAm64UVh9kkneCTFZtYeCAGNw5kFknv5OgsjcaueqCsm3a3dxFq
7JqReIV1WDx+QEBXgM4itvQRY+d5pv5eOlz8sBzxFR7+Gh/Q9aJoPL+ZX7kouMEU
bKwsEwNCrWZWQu41ghFi/8MdqBxb2Nb9H4gCupqKdiI=
-----END CERTIFICATE-----
MITRE ATT&CK techniques
This table was built using version 10 of the MITRE ATT&CK framework.
Tactic | ID | Name | Description |
---|---|---|---|
Resource Development | T1583.001 | Acquire Infrastructure: Domains | Domain names such as amnestyhq[.]org were acquired to use on compromised web servers. |
T1583.004 | Acquire Infrastructure: Server | Servers (or virtual servers) were rented to serve WebKit exploits and used as C&C servers for DazzleSpy. | |
T1584.004 | Compromise Infrastructure: Server | A legitimate website was compromised to add an iframe loading malicious JavaScript code. | |
T1587.001 | Develop Capabilities: Malware | DazzleSpy is macOS malware developed to steal information from its victims. | |
T1587.003 | Develop Capabilities: Digital Certificates | DazzleSpy verifies the authenticity of its C&C server using an X.509 certificate. | |
T1587.004 | Develop Capabilities: Exploits | An undocumented Safari exploit was used to compromise the targets. | |
T1608.004 | Stage Capabilities: Drive-by Target | This operation compromised a website that is likely to be visited by its targets, to distribute malware. | |
Initial Access | T1189 | Drive-by Compromise | The compromised website served the exploit to visitors using Safari on a Mac. |
Execution | T1569 | System Services | The exploit sends Mach messages to launchd to remove the quarantine flag and to kuncd to launch the malware. |
Persistence | T1543.001 | Create or Modify System Process: Launch Agent | DazzleSpy persists by installing a Launch Agent. |
Privilege Escalation | T1068 | Exploitation for Privilege Escalation | An LPE exploit for macOS is used to elevate privileges to root. |
Defense Evasion | T1620 | Reflective Code Loading | The LPE exploit downloading the next stage is loaded and executed in memory only. |
Credential Access | T1555.001 | Credentials from Password Stores: Keychain | DazzleSpy can steal credentials from the macOS keychain. |
Discovery | T1083 | File and Directory Discovery | DazzleSpy can be used to enumerate files in specific folders. |
T1057 | Process Discovery | DazzleSpy can obtain the list of running processes. | |
T1082 | System Information Discovery | DazzleSpy can obtain the macOS version. | |
T1016 | System Network Configuration Discovery | DazzleSpy can obtain the IP address and Wi-Fi SSID. | |
T1033 | System Owner/User Discovery | DazzleSpy can obtain the current username from a compromised Mac. | |
T1124 | System Time Discovery | DazzleSpy can obtain the system time on a compromised Mac. | |
Collection | T1005 | Data from Local System | DazzleSpy can search for documents on the compromised system. |
T1113 | Screen Capture | DazzleSpy has the ability to record screen activity. | |
Command and Control | T1071 | Application Layer Protocol | DazzleSpy uses a custom JSON-based protocol for its C&C communications. |
T1132.001 | Data Encoding: Standard Encoding | DazzleSpy uses base64 to encode parts of its C&C communications. | |
T1573 | Encrypted Channel | DazzleSpy uses TLS encryption. | |
T1571 | Non-Standard Port | DazzleSpy uses TCP port 5633. | |
Exfiltration | T1041 | Exfiltration Over C2 Channel | DazzleSpy exfiltrates data over its C&C communications channel. |