
Outil de triage forensique pour les appareils Citrix NetScaler, doté d'un scanner IOC basé sur Dissect pour les webshells, le timestomping et les binaires suspects, ainsi que d'un scanner de versions à distance qui identifie les vulnérabilités CVE.
Ce dépôt contient des scripts de triage pour les équipements Citrix NetScaler :
iocitrix.py -- un script Dissect pour le triage d'une image/cible Citrix NetScaler.scan-citrix-netscaler-version.py -- Scanner et identifier la version d'un équipement NetScaler via HTTP(s).Vous pouvez utiliser ce script pour scanner et déterminer la version d'un équipement Citrix NetScaler via HTTP(s). Il déterminera également si le NetScaler est vulnérable à des CVE spécifiques en fonction de la version.
scan-citrix-netscaler-version.pyUtilisez les étapes suivantes si vous utilisez pip :
Dans le cas de uv, vous pouvez exécuter le script directement avec :
Exemple d'utilisation :
$ 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)
Ou obtenez les résultats au format 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
}
Il est également possible de limiter la vérification du statut de vulnérabilité à des CVE spécifiques en utilisant l'option --cve :
$ 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
}
Pour obtenir les résultats au format CSV, utilisez simplement l'option --csv.
Pour plus d'options, consultez --help.
Vous pouvez utiliser iocitrix.py pour rechercher des indicateurs de compromission connus sur une cible Dissect NetScaler. Il vérifie les éléments suivants :
Notez que ce script est destiné à être exécuté sur des images disque forensiques d'équipements Citrix NetScaler et non sur l'équipement lui-même. Consultez également la section Création d'images disque Citrix NetScaler pour savoir comment créer des images disque forensiques de votre Citrix NetScaler.
Assurez-vous de disposer de la dernière version de Dissect ; la prise en charge de Citrix NetScaler a été ajoutée dans cette PR : https://github.com/fox-it/dissect.target/pull/357
Avertissement : Bien que cet outil vise l'exactitude, il est possible qu'il produise des faux positifs ou des faux négatifs. Il est conseillé aux utilisateurs de recouper les résultats et de faire preuve de jugement avant de prendre toute décision sur la base des résultats de cet outil.
iocitrix.pyUtilisez les étapes suivantes :
Notez que l'étape 4 affichera l'erreur suivante, mais vous pouvez l'ignorer :
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.
Vous pouvez ensuite exécuter iocitrix.py <TARGETS> pour lancer une vérification d'IOC sur une ou plusieurs images forensiques. Le script accepte toute entrée que dissect peut lire en tant que Target, comme un .VMDK ou une image disque brute. Quelques exemples sont fournis ci-dessous.
python3 iocitrix.py image.vmx
python3 iocitrix.py image.vmdk
Si vous avez également créé une image forensique du disque RAM, vous pouvez utiliser iocitrix.py pour intégrer les données volatiles dans son triage comme suit :
python3 iocitrix.py md0.img+image.vmx
python3 iocitrix.py md0.img+image.vmdk
python3 iocitrix.py md0.img+da0.img
Le signe + (plus) chargera les deux images disque comme une seule cible Dissect.
Un Citrix NetScaler expose deux périphériques bloc importants qui peuvent être imagés pour une analyse forensique hors ligne. Ces fichiers de périphérique bloc se trouvent aux chemins suivants :
/dev/md0 : Le disque qui contient le répertoire racine (/). Il s'agit d'un disque RAM/dev/da0 ou /dev/ada0 : Le disque qui contient les répertoires /var et /flash. Il s'agit d'un disque persistant.Le répertoire racine (/) de Citrix NetScaler est un disque RAM, ce qui signifie qu'il s'agit d'un disque volatil. Ce disque se trouve à /dev/md0 lorsque le NetScaler est allumé et en fonctionnement, et sera indisponible lorsque le NetScaler est éteint. Les répertoires /var et /flash résident sur le disque /dev/da0 ou /dev/ada0 sous forme de deux partitions distinctes et sont persistants.
Les commandes suivantes peuvent être utilisées sur une machine Linux locale pour créer des copies disque de votre NetScaler via SSH. Si vous utilisez Windows, vous pouvez utiliser WSL (wsl.exe) ou Git Bash (git-bash.exe) pour utiliser les mêmes commandes. Évitez d'utiliser les commandes PowerShell natives, car PowerShell ne gère pas correctement le streaming de données binaires brutes via SSH.
Cela affichera les disques disponibles, y compris si votre disque persistant est /dev/da0 ou /dev/ada0.
Vérifiez ensuite la taille exacte :
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell diskinfo /dev/da0
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell diskinfo /dev/ada0
Pour le disque RAM :
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell diskinfo /dev/md0
Le fichier da0.img ou ada0.img résultant aura approximativement la taille du périphérique respectif, et md0.img approximativement la taille de /dev/md0.
local ~ $ df -h .
Assurez-vous qu'il y a suffisamment d'espace disponible pour accueillir les fichiers d'image disque, dont les tailles ont été calculées à l'étape précédente.
/dev/da0 ou /dev/ada0 sur votre machine localeSelon le nom de votre disque, exécutez soit
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/da0 bs=10M | tail -c +7 | head -c -6 > da0.img
soit
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/ada0 bs=10M | tail -c +7 | head -c -6 > ada0.img
Notez que cela peut prendre un certain temps. Aucune progression n'est affichée lors de l'utilisation de dd.
Il est conseillé d'attendre de reprendre le contrôle de l'invite de commande. C'est une indication que dd a terminé.