
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 identifiziert die Version eines NetScaler-Geräts über HTTP(s).Mit diesem Skript können Sie die Version eines Citrix NetScaler-Geräts über HTTP(s) scannen und ermitteln. Es bestimmt außerdem, ob der NetScaler basierend auf der Version anfällig für bestimmte CVEs ist.
scan-citrix-netscaler-version.pyVerwenden Sie die folgenden Schritte, wenn Sie pip verwenden:
Falls Sie uv verwenden, können Sie das Skript direkt ausführen mit:
Beispielhafte Verwendung:
$ 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 erhalten Sie die Ergebnisse als JSON:
$ 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 Schwachstellenstatus 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 auf einem NetScaler-Dissect-Ziel nach bekannten Indikatoren für eine Kompromittierung (Indicators of Compromise) zu suchen. Es prüft auf Folgendes:
Beachten Sie, dass dieses Skript für die forensische Analyse von Festplatten-Images von Citrix NetScaler-Geräten gedacht ist und nicht für den Einsatz direkt auf dem Gerät. Siehe auch den Abschnitt Erstellen von Citrix NetScaler-Festplatten-Images zur Erstellung forensischer Festplatten-Images 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 auf Genauigkeit ausgelegt ist, kann es zu falsch positiven oder falsch negativen Ergebnissen kommen. Benutzer werden gebeten, Ergebnisse gegenzuprüfen und ihr eigenes Urteilsvermögen einzusetzen, bevor sie Entscheidungen auf Grundlage der Ausgabe dieses Tools treffen.
iocitrix.pyVerwenden Sie die folgenden Schritte:
Beachten Sie, dass Schritt 4 die folgende Fehlermeldung ausgibt, die 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 Images zu starten. Das Skript akzeptiert jede Eingabe, die dissect als Target lesen kann, wie z. B. eine .VMDK-Datei oder ein Roh-Festplatten-Image. Einige Beispiele finden Sie unten.
python3 iocitrix.py image.vmx
python3 iocitrix.py image.vmdk
Wenn Sie außerdem ein forensisches Image des RAM-Disks erstellt haben, können Sie iocitrix.py verwenden, um flüchtige Daten in die 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 +-Zeichen (Plus) lädt die beiden Festplatten-Images als ein einziges Dissect-Target.
Ein Citrix NetScaler stellt zwei wichtige Blockgeräte bereit, die für die Offline-Forensik als Image gesichert werden können. Diese Blockgerätedateien finden Sie unter den folgenden Pfaden:
/dev/md0: Das Laufwerk, das das Root-Verzeichnis (/) enthält. Dies ist ein RAM-Disk./dev/da0: Das Laufwerk, das die Verzeichnisse /var und /flash enthält. Dies ist ein persistentes Laufwerk.Das Root-Verzeichnis (/) von Citrix NetScaler ist ein RAM-Disk, d. h. ein flüchtiges Laufwerk. Dieses Laufwerk befindet sich unter /dev/md0, wenn der NetScaler eingeschaltet ist und läuft, und ist nicht verfügbar, wenn der NetScaler ausgeschaltet ist. Die Verzeichnisse /var und /flash befinden sich auf dem Laufwerk /dev/da0 als zwei separate Partitionen und sind persistent.
Die folgenden Befehle können auf einem lokalen Linux-Rechner verwendet werden, um über SSH ein Image Ihres NetScaler zu erstellen:
/dev/da0-Laufwerks auf Ihrem lokalen Rechnerlocal ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/da0 bs=10M | tail -c +7 | head -c -6 > da0.img
Beachten Sie, dass dies einige Zeit in Anspruch nehmen kann. Bei Verwendung von dd wird kein Fortschritt angezeigt.
Es wird empfohlen zu warten, bis Sie die Kontrolle über die Eingabeaufforderung zurückerhalten. Dies ist ein Hinweis darauf, dass dd abgeschlossen ist.
Wenn Sie außerdem kein /dev/da0 haben, handelt es sich höchstwahrscheinlich um /dev/ada0. Sie können dies mit dem Befehl mount oder gpart show überprüfen.
/dev/md0-Laufwerks auf Ihrem lokalen Rechnerlocal ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/md0 bs=10M | tail -c +7 | head -c -6 > md0.img
HINWEIS: Es wird zwar empfohlen, Festplatten-Images sowohl von /dev/md0 als auch von /dev/da0 zu erstellen. Das Erstellen eines Festplatten-Images von /dev/md0 ist jedoch optional. Dieser Schritt kann übersprungen werden, obwohl dies dazu führen kann, dass iocitrix.py bestimmte Kompromittierungsindikatoren übersieht.
iocitrix.py auf Ihren ImagesNachdem Sie die vorherigen Befehle auf Ihrem lokalen Rechner ausgeführt haben, sind die Dateien da0.img und md0.img vorhanden. Sie können iocitrix auf diese Dateien verweisen, um mit der Triage Ihrer Images zu beginnen. Verwenden Sie den folgenden Befehl:
local ~ $ python3 iocitrix.py md0.img+da0.img
Beispielausgabe:
(venv) user@dissect:/data/netscaler/image$ python3 iocitrix.py md0.img+da0.img
<Target md0.img+da0.img>
Disks
- <RawContainer size=555745286 vs=None>
- <RawContainer size=21474836486 vs=<DissectVolumeSystem serial=None>>
Volumes
- <Volume name=None size=555745286 fs=<FfsFilesystem>>
- <Volume name='part_00000000' size=1717567488 fs=<FfsFilesystem>>
- <Volume name='part_66600000' size=4401922048 fs=<FfsFilesystem>>
- <Volume name='part_16cc00000' size=2097152 fs=<FfsFilesystem>>
- <Volume name='part_16ce00000' size=15353200128 fs=<FfsFilesystem>>
Hostname : None
Domain : None
IPs : 10.164.0.39, 10.164.0.10
OS family : citrix-netscaler (CitrixBsdPlugin)
OS version : NetScaler 13.1 build 30 (ns-13.1-30.52)
Architecture : x86_64-citrix-netscaler
Language(s) :
Timezone : None
Install date : 2023-08-08 13:59:38.228043+00:00
Last activity : 2023-08-11 08:51:13.979536+00:00
*** Checking for webshells ***
<ioc/hit type='php-file-permission' alert='Suspicious php permission 0o644' confidence='high' path='/var/netscaler/logon/LogonPoint/uiareas/linux/adminupevents.php'>
<ioc/hit type='php-file-contents' alert="Suspicious PHP code 'b'array_filter(''" confidence='high' path='/var/netscaler/logon/LogonPoint/uiareas/linux/adminupevents.php'>
<ioc/hit type='php-file-permission' alert='Suspicious php permission 0o644' confidence='high' path='/var/vpn/config.php'>
<ioc/hit type='php-file-contents' alert="Suspicious PHP code 'b'array_filter(''" confidence='high' path='/var/vpn/config.php'>
<ioc/hit type='php-file-permission' alert='Suspicious php permission 0o644' confidence='high' path='/var/vpn/themes/config.php'>
*** Checking for timestomped files ***
*** Checking for suspicious cronjobs ***
*** Checking for SUID Binaries (this takes a while) ***
<ioc/hit type='binary/suid' alert='Binary with SUID bit set Observed' confidence='medium' path='/tmp/python/bash'>
********************************************************************************
*** ***
*** There were findings for Indicators of Compromise. ***
*** Please consider performing further forensic investigation of the system. ***
*** ***
********************************************************************************
Confidence Type Alert Artefact Location
------------ ------------------- ------------------------------------------ ---------------------------------------------------------------
high php-file-permission Suspicious php permission 0o644 /var/netscaler/logon/LogonPoint/uiareas/linux/adminupevents.php
high php-file-contents Suspicious PHP code 'b'array_filter('' /var/netscaler/logon/LogonPoint/uiareas/linux/adminupevents.php
high php-file-permission Suspicious php permission 0o644 /var/vpn/config.php
high php-file-contents Suspicious PHP code 'b'array_filter('' /var/vpn/config.php
high php-file-permission Suspicious php permission 0o644 /var/vpn/themes/config.php
medium binary/suid Binary with SUID bit set Observed /tmp/python/bash
All targets analyzed.