
Herramienta de triaje forense para dispositivos Citrix NetScaler, que incluye un escáner de IOC basado en Dissect para webshells, timestomping y binarios sospechosos, además de un escáner remoto de versiones que identifica vulnerabilidades CVE.
Este repositorio contiene scripts de triaje para dispositivos Citrix NetScaler:
iocitrix.py -- un script de Dissect para el triaje de una imagen/objetivo de Citrix NetScaler.scan-citrix-netscaler-version.py -- Escanea y determina la versión de un dispositivo NetScaler a través de HTTP(s).Puedes usar este script para escanear y determinar la versión de un dispositivo Citrix NetScaler a través de HTTP(s). También determinará si el NetScaler es vulnerable a CVE específicos según la versión.
scan-citrix-netscaler-version.pyUsa los siguientes pasos si estás usando pip:
En caso de usar uv, puedes ejecutar el script directamente usando:
Ejemplo de uso:
$ 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)
O obtener los resultados en 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
}
También es posible limitar las comprobaciones del estado de vulnerabilidad a CVE específicos usando el flag --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
}
Para obtener los resultados en formato CSV, simplemente usa el flag --csv.
Para más opciones consulta --help.
Puedes usar iocitrix.py para comprobar Indicadores de Compromiso conocidos en un objetivo de Dissect de NetScaler. Comprueba lo siguiente:
Ten en cuenta que este script está pensado para ejecutarse sobre imágenes forenses de disco de dispositivos Citrix NetScaler y no sobre el dispositivo en sí. Consulta también la sección Creación de imágenes de disco de Citrix NetScaler sobre cómo crear imágenes forenses de disco de tu Citrix NetScaler.
Asegúrate de tener la última versión de Dissect; el soporte para Citrix NetScaler se añadió en este PR: https://github.com/fox-it/dissect.target/pull/357
Aviso: Aunque esta herramienta busca la precisión, es posible que produzca falsos positivos o falsos negativos. Se recomienda a los usuarios que contrasten los resultados y usen su propio criterio antes de tomar cualquier decisión basada en la salida de esta herramienta.
iocitrix.pyUsa los siguientes pasos:
Ten en cuenta que el paso 4 imprimirá el siguiente error, pero puedes ignorarlo:
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.
A continuación puedes ejecutar iocitrix.py <TARGETS> para iniciar una comprobación de IOC contra una o más imágenes forenses. El script acepta cualquier entrada que dissect pueda leer como un Target, como un .VMDK o una imagen de disco en bruto. A continuación se proporcionan algunos ejemplos.
python3 iocitrix.py image.vmx
python3 iocitrix.py image.vmdk
Si también has creado una imagen forense del disco RAM, puedes utilizar iocitrix.py para incorporar datos volátiles en su triaje de la siguiente manera:
python3 iocitrix.py md0.img+image.vmx
python3 iocitrix.py md0.img+image.vmdk
python3 iocitrix.py md0.img+da0.img
El signo + (más) cargará las dos imágenes de disco como un único Target de Dissect.
Un Citrix NetScaler expone dos dispositivos de bloque importantes que pueden ser imageados para análisis forense offline. Estos archivos de dispositivo de bloque se pueden encontrar en las siguientes rutas:
/dev/md0: El disco que contiene el directorio raíz (/). Este es un disco RAM/dev/da0 o /dev/ada0: El disco que contiene los directorios /var y /flash. Este es un disco persistente.El directorio raíz (/) de Citrix NetScaler es un disco RAM, lo que significa que es un disco volátil. Este disco se puede encontrar en /dev/md0 cuando el NetScaler está encendido y en funcionamiento, y no estará disponible cuando el NetScaler esté apagado. Los directorios /var y /flash residen en el disco /dev/da0 o /dev/ada0 como dos particiones separadas y son persistentes.
Los siguientes comandos se pueden usar en una máquina Linux local para crear copias de disco de tu NetScaler a través de SSH. Si estás usando Windows, puedes usar WSL (wsl.exe) o Git Bash (git-bash.exe) para usar los mismos comandos. Evita usar comandos nativos de PowerShell, ya que PowerShell no maneja correctamente la transmisión de datos binarios en bruto a través de SSH.
Esto mostrará los discos disponibles, incluyendo si tu disco persistente es /dev/da0 o /dev/ada0.
Luego comprueba el tamaño exacto:
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell diskinfo /dev/da0
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell diskinfo /dev/ada0
Para el disco RAM:
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell diskinfo /dev/md0
El da0.img o ada0.img resultante tendrá aproximadamente el tamaño del dispositivo respectivo, y md0.img aproximadamente el tamaño de /dev/md0.
local ~ $ df -h .
Asegúrate de que haya suficiente espacio disponible para alojar los archivos de imagen de disco, cuyos tamaños se calcularon en el paso anterior.
/dev/da0 o /dev/ada0 en tu máquina localDependiendo del nombre de tu disco, ejecuta
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/da0 bs=10M | tail -c +7 | head -c -6 > da0.img
o
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/ada0 bs=10M | tail -c +7 | head -c -6 > ada0.img
Ten en cuenta que esto puede tardar un tiempo en completarse. No se muestra ningún progreso al usar dd.
Se recomienda esperar hasta recuperar el control del prompt. Esto es un indicio de que dd ha terminado.