
Forensisches Triage-Toolkit für Citrix-NetScaler-Geräte, mit einem auf Dissect basierenden IOC-Scanner für Webshells, Timestomping und verdächtige Binärdateien sowie einem Remote-Versionsscanner, der CVE-Schwachstellen identifiziert.
Dieses Repository enthält Triage-Skripte für Citrix NetScaler-Geräte:
iocitrix.py -- ein Dissect-Skript zur Triage eines Citrix NetScaler-Images/-Ziels.scan-citrix-netscaler-version.py -- Scannt und ermittelt die Version eines NetScaler-Geräts über HTTP(s).Sie können dieses Skript verwenden, um die Version eines Citrix NetScaler-Geräts über HTTP(s) zu scannen und zu bestimmen. Es ermittelt außerdem, ob der NetScaler anfällig für bestimmte CVEs ist, basierend auf der Version.
scan-citrix-netscaler-version.pyVerwenden Sie die folgenden Schritte, wenn Sie pip verwenden:
Bei Verwendung von uv können Sie das Skript direkt ausführen mit:
Beispielverwendung:
$ python3 scan-citrix-netscaler-version.py 192.168.1.10 192.168.1.12
192.168.1.10 (*.local.domain) is running Citrix NetScaler version 13.1-51.15 (VULNERABLE)
192.168.1.12 (*.local.domain) is running Citrix NetScaler version 12.1-55.330 (NOT VULNERABLE)
Oder die Ergebnisse im JSON-Format abrufen:
$ python3 scan-citrix-netscaler-version.py https://192.168.1.11 --json | jq
{
"scanned_at": "2025-09-03T23:11:36.864228+00:00",
"target": "https://192.168.1.11",
"tls_names": "my-first-netscaler.local",
"rdx_en_stamp": 1702886392,
"rdx_en_dt": "2023-12-18T07:59:52+00:00",
"version": "12.1-55.302",
"error": null,
"vulnerable": {
"CVE-2025-5349": true,
"CVE-2025-5777": true,
"CVE-2025-6543": false,
"CVE-2025-7775": true,
"CVE-2025-7776": true,
"CVE-2025-8424": true
},
"is_vulnerable": true
}
Es ist auch möglich, die Prüfung des Verwundbarkeitsstatus auf bestimmte CVEs zu beschränken, indem Sie das Flag --cve verwenden:
$ python3 scan-citrix-netscaler-version.py https://192.168.1.11 --cve CVE-2025-6543 --json | jq
{
"scanned_at": "2025-09-03T23:16:36.573016+00:00",
"target": "https://192.168.1.11",
"tls_names": "my-first-netscaler.local",
"rdx_en_stamp": 1702886392,
"rdx_en_dt": "2023-12-18T07:59:52+00:00",
"version": "12.1-55.302",
"error": null,
"vulnerable": {
"CVE-2025-6543": false
},
"is_vulnerable": false
}
Um die Ergebnisse im CSV-Format zu erhalten, verwenden Sie einfach das Flag --csv.
Weitere Optionen finden Sie unter --help.
Sie können iocitrix.py verwenden, um ein NetScaler Dissect-Ziel auf bekannte Indicators of Compromise zu prüfen. Es prüft auf die folgenden Dinge:
Beachten Sie, dass dieses Skript für die Ausführung auf forensischen Datenträgerabbildern von Citrix NetScaler-Geräten und nicht auf dem Gerät selbst gedacht ist. Siehe auch den Abschnitt Erstellen von Citrix NetScaler-Datenträgerabbildern zur Erstellung forensischer Datenträgerabbilder Ihres Citrix NetScaler.
Stellen Sie sicher, dass Sie die neueste Version von Dissect verwenden; die Unterstützung für Citrix NetScaler wurde in diesem PR hinzugefügt: https://github.com/fox-it/dissect.target/pull/357
Haftungsausschluss: Obwohl dieses Tool nach Genauigkeit strebt, kann es zu falsch-positiven oder falsch-negativen Ergebnissen kommen. Benutzern wird empfohlen, die Ergebnisse zu überprüfen und ihr eigenes Urteilsvermögen zu nutzen, bevor sie Entscheidungen auf der Grundlage der Ausgabe dieses Tools treffen.
iocitrix.pyVerwenden Sie die folgenden Schritte:
Beachten Sie, dass Schritt 4 den folgenden Fehler ausgibt, den Sie jedoch ignorieren können:
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
Sie können dann iocitrix.py <TARGETS> ausführen, um eine IOC-Prüfung gegen ein oder mehrere forensische Abbilder zu starten. Das Skript akzeptiert jede Eingabe, die dissect als Target lesen kann, wie z. B. eine .VMDK oder ein Rohdatenträgerabbild. Einige Beispiele sind unten aufgeführt.
python3 iocitrix.py image.vmx
python3 iocitrix.py image.vmdk
Wenn Sie auch ein forensisches Abbild des RAM-Datenträgers erstellt haben, können Sie iocitrix.py verwenden, um flüchtige Daten in seine Triage einzubeziehen, wie folgt:
python3 iocitrix.py md0.img+image.vmx
python3 iocitrix.py md0.img+image.vmdk
python3 iocitrix.py md0.img+da0.img
Das + (Plus)-Zeichen lädt die beiden Datenträgerabbilder als ein einzelnes Dissect-Target.
Ein Citrix NetScaler stellt zwei wichtige Blockgeräte bereit, die für die Offline-Forensik abgebildet werden können. Diese Blockgerätedateien befinden sich an den folgenden Pfaden:
/dev/md0: Der Datenträger, der das Root-Verzeichnis (/) enthält. Dies ist ein RAM-Datenträger/dev/da0 oder /dev/ada0: Der Datenträger, der die Verzeichnisse /var und /flash enthält. Dies ist ein persistenter Datenträger.Das Root-Verzeichnis (/) von Citrix NetScaler ist ein RAM-Datenträger, was bedeutet, dass dies ein flüchtiger Datenträger ist. Dieser Datenträger befindet sich unter /dev/md0, wenn der NetScaler eingeschaltet und in Betrieb ist, und ist nicht verfügbar, wenn der NetScaler ausgeschaltet ist. Die Verzeichnisse /var und /flash befinden sich auf dem Datenträger /dev/da0 oder /dev/ada0 als zwei separate Partitionen und sind persistent.
Die folgenden Befehle können auf einem lokalen Linux-Rechner verwendet werden, um Datenträgerkopien Ihres NetScaler über SSH zu erstellen. Wenn Sie Windows verwenden, können Sie WSL (wsl.exe) oder Git Bash (git-bash.exe) verwenden, um dieselben Befehle zu nutzen. Vermeiden Sie die Verwendung nativer PowerShell-Befehle, da PowerShell das Streaming von rohen Binärdaten über SSH nicht ordnungsgemäß verarbeitet.
Dies zeigt die verfügbaren Datenträger an, einschließlich ob Ihr persistenter Datenträger /dev/da0 oder /dev/ada0 ist.
Prüfen Sie dann die genaue Größe:
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell diskinfo /dev/da0
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell diskinfo /dev/ada0
Für den RAM-Datenträger:
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell diskinfo /dev/md0
Die resultierende da0.img oder ada0.img wird ungefähr die Größe des jeweiligen Geräts haben, und md0.img ungefähr die Größe von /dev/md0.
local ~ $ df -h .
Stellen Sie sicher, dass genügend Speicherplatz verfügbar ist, um die Datenträgerabbilddateien aufzunehmen, deren Dateigrößen im vorherigen Schritt berechnet wurden.