
Strumento di triage forense per dispositivi Citrix NetScaler, con uno scanner IOC basato su Dissect per webshell, timestomping e binari sospetti, oltre a uno scanner remoto delle versioni che identifica le vulnerabilità CVE.
Questo repository contiene script di triage per dispositivi Citrix NetScaler:
iocitrix.py -- uno script Dissect per eseguire il triage di un'immagine/target Citrix NetScaler.scan-citrix-netscaler-version.py -- Scansiona e identifica la versione di un dispositivo NetScaler tramite HTTP(s).Puoi utilizzare questo script per scansionare e determinare la versione di un dispositivo Citrix NetScaler tramite HTTP(s). Determinerà inoltre se il NetScaler è vulnerabile a specifici CVE in base alla versione.
scan-citrix-netscaler-version.pySegui i seguenti passaggi se utilizzi pip:
Nel caso di uv, puoi eseguire lo script direttamente utilizzando:
Esempio di utilizzo:
$ 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)
Oppure ottieni i risultati in 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
}
È anche possibile limitare i controlli dello stato di vulnerabilità a specifici CVE utilizzando il 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
}
Per ottenere i risultati in formato CSV, utilizza semplicemente il flag --csv.
Per ulteriori opzioni consulta --help.
Puoi utilizzare iocitrix.py per verificare la presenza di noti Indicatori di Compromissione su un target Dissect NetScaler. Verifica i seguenti elementi:
Nota che questo script è pensato per essere eseguito su immagini disco forensi di dispositivi Citrix NetScaler e non sul dispositivo stesso. Consulta anche la sezione Creazione di immagini disco Citrix NetScaler su come creare immagini disco forensi del tuo Citrix NetScaler.
Assicurati di avere l'ultima versione di Dissect; il supporto per Citrix NetScaler è stato aggiunto in questa PR: https://github.com/fox-it/dissect.target/pull/357
Disclaimer: Sebbene questo strumento miri all'accuratezza, è possibile che produca falsi positivi o falsi negativi. Si consiglia agli utenti di verificare i risultati e di usare il proprio giudizio prima di prendere qualsiasi decisione basata sull'output di questo strumento.
iocitrix.pySegui i seguenti passaggi:
Nota che il passaggio 4 stamperà il seguente errore, ma puoi 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.
Puoi quindi eseguire iocitrix.py <TARGETS> per avviare un controllo IOC su una o più immagini forensi. Lo script accetta qualsiasi input che dissect può leggere come Target, come un .VMDK o un'immagine disco raw. Alcuni esempi sono forniti di seguito.
python3 iocitrix.py image.vmx
python3 iocitrix.py image.vmdk
Se hai anche creato un'immagine forense del RAM disk, puoi utilizzare iocitrix.py per incorporare dati volatili nel suo triage come segue:
python3 iocitrix.py md0.img+image.vmx
python3 iocitrix.py md0.img+image.vmdk
python3 iocitrix.py md0.img+da0.img
Il segno + (più) caricherà le due immagini disco come un singolo Target Dissect.
Un Citrix NetScaler espone due importanti dispositivi a blocchi che possono essere sottoposti a imaging per l'analisi forense offline. Questi file di dispositivi a blocchi si trovano nei seguenti percorsi:
/dev/md0: Il disco che contiene la directory root (/). Questo è un RAM disk/dev/da0: Il disco che contiene le directory /var e /flash. Questo è un disco persistente.La directory root (/) di Citrix NetScaler è un RAM disk, il che significa che è un disco volatile. Questo disco si trova in /dev/md0 quando il NetScaler è acceso e in esecuzione e non sarà disponibile quando il NetScaler è spento. Le directory /var e /flash risiedono sul disco /dev/da0 come due partizioni separate ed è persistente.
I seguenti comandi possono essere utilizzati su una macchina linux locale per creare un'immagine disco del tuo NetScaler tramite SSH:
/dev/da0 sulla tua macchina localelocal ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/da0 bs=10M | tail -c +7 | head -c -6 > da0.img
Nota che questo può richiedere del tempo per essere completato. Non viene mostrato alcun progresso quando si utilizza dd.
Si consiglia di attendere fino a quando non si riprende il controllo del prompt. Questo è un'indicazione che dd ha terminato.
Inoltre, se non hai /dev/da0, molto probabilmente è /dev/ada0; puoi verificarlo utilizzando il comando mount o gpart show.
/dev/md0 sulla tua macchina localelocal ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/md0 bs=10M | tail -c +7 | head -c -6 > md0.img
NOTA: Sebbene sia consigliato creare immagini disco sia di /dev/md0 che di /dev/da0, la creazione di un'immagine disco di /dev/md0 è facoltativa. Questo passaggio può essere saltato, anche se ciò può causare che iocitrix.py non rilevi alcuni indicatori di compromissione.
iocitrix.py sulle tue immaginiDopo aver eseguito i comandi precedenti sulla tua macchina locale, i file da0.img e md0.img saranno presenti. Puoi indicare a iocitrix questi file per iniziare il triage delle tue immagini. Utilizza il seguente comando per farlo:
local ~ $ python3 iocitrix.py md0.img+da0.img
Esempio di output:
(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.