
Инструментарий криминалистической триаж-диагностики для устройств Citrix NetScaler, включающий сканер IOC на основе Dissect для поиска веб-шеллов, подделки временных меток и подозрительных бинарных файлов, а также удалённый сканер версий, выявляющий уязвимости CVE.
Этот репозиторий содержит скрипты для триажа устройств Citrix NetScaler:
iocitrix.py -- скрипт Dissect для триажа образа/цели Citrix NetScaler.scan-citrix-netscaler-version.py -- сканирование и определение версии устройства NetScaler по HTTP(s).Вы можете использовать этот скрипт для сканирования и определения версии устройства Citrix NetScaler по HTTP(s). Он также определит, уязвимо ли устройство NetScaler к конкретным CVE, на основе версии.
scan-citrix-netscaler-version.pyВыполните следующие шаги, если вы используете pip:
В случае использования uv вы можете запустить скрипт напрямую:
Пример использования:
$ 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)
Или получите результаты в формате 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
}
Также можно ограничить проверки статуса уязвимости конкретными CVE с помощью флага --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
}
Чтобы получить результаты в формате CSV, просто используйте флаг --csv.
Дополнительные параметры см. в --help.
Вы можете использовать iocitrix.py для проверки известных индикаторов компрометации на цели Dissect NetScaler. Скрипт проверяет следующее:
Обратите внимание, что этот скрипт предназначен для запуска на криминалистических образах дисков устройств Citrix NetScaler, а не на самом устройстве. Также см. раздел Создание образов дисков Citrix NetScaler о том, как создавать криминалистические образы дисков вашего Citrix NetScaler.
Убедитесь, что у вас установлена последняя версия Dissect; поддержка Citrix NetScaler была добавлена в этом PR: https://github.com/fox-it/dissect.target/pull/357
Отказ от ответственности: Хотя этот инструмент стремится к точности, он может давать ложноположительные или ложноотрицательные результаты. Пользователям рекомендуется перепроверять результаты и использовать собственное суждение перед принятием любых решений на основе выходных данных этого инструмента.
iocitrix.pyВыполните следующие шаги:
Обратите внимание, что шаг 4 выведет следующую ошибку, но вы можете её игнорировать:
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.
Затем вы можете запустить iocitrix.py <TARGETS> для начала проверки IOC одного или нескольких криминалистических образов. Скрипт принимает любой ввод, который dissect может прочитать как Target, например .VMDK или сырой образ диска. Примеры приведены ниже.
python3 iocitrix.py image.vmx
python3 iocitrix.py image.vmdk
Если вы также создали криминалистический образ RAM-диска, вы можете использовать iocitrix.py для включения энергозависимых данных в триаж следующим образом:
python3 iocitrix.py md0.img+image.vmx
python3 iocitrix.py md0.img+image.vmdk
python3 iocitrix.py md0.img+da0.img
Знак + (плюс) загрузит два образа дисков как единую цель Dissect.
Citrix NetScaler предоставляет два важных блочных устройства, которые можно образно скопировать для автономного криминалистического анализа. Эти файлы блочных устройств можно найти по следующим путям:
/dev/md0: Диск, содержащий корневой каталог (/). Это RAM-диск/dev/da0: Диск, содержащий каталоги /var и /flash. Это постоянный диск.Корневой каталог (/) Citrix NetScaler является RAM-диском, то есть это энергозависимый диск. Этот диск можно найти по адресу /dev/md0, когда NetScaler включён и работает, и он будет недоступен, когда NetScaler выключен. Каталоги /var и /flash находятся на диске /dev/da0 как два отдельных раздела и являются постоянными.
Следующие команды можно использовать на локальной машине Linux для создания образа диска вашего NetScaler по SSH:
/dev/da0 на вашей локальной машинеlocal ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/da0 bs=10M | tail -c +7 | head -c -6 > da0.img
Имейте в виду, что это может занять некоторое время. При использовании dd прогресс не отображается.
Рекомендуется подождать, пока вы снова не получите контроль над приглашением. Это признак того, что dd завершился.
Также, если у вас нет /dev/da0, скорее всего это /dev/ada0; вы можете проверить с помощью команды mount или gpart show.
/dev/md0 на вашей локальной машинеlocal ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/md0 bs=10M | tail -c +7 | head -c -6 > md0.img
ПРИМЕЧАНИЕ: Хотя рекомендуется создавать образы дисков как /dev/md0, так и /dev/da0, создание образа /dev/md0 необязательно. Этот шаг можно пропустить, хотя это может привести к тому, что iocitrix.py пропустит некоторые индикаторы компрометации.
iocitrix.py на ваших образахПосле выполнения предыдущих команд на вашей локальной машине будут присутствовать файлы da0.img и md0.img. Вы можете указать iocitrix на эти файлы, чтобы начать триаж ваших образов. Используйте следующую команду:
local ~ $ python3 iocitrix.py md0.img+da0.img
Пример вывода:
(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.