
Ferramenta de triagem forense para dispositivos Citrix NetScaler, com um scanner de IOC baseado em Dissect para webshells, timestomping e binários suspeitos, além de um scanner remoto de versões que identifica vulnerabilidades CVE.
Este repositório contém scripts de triagem para dispositivos Citrix NetScaler:
iocitrix.py -- um script Dissect para triagem de uma imagem/alvo Citrix NetScaler.scan-citrix-netscaler-version.py -- Escaneia e identifica a versão de um dispositivo NetScaler via HTTP(s).Você pode usar este script para escanear e determinar a versão de um dispositivo Citrix NetScaler via HTTP(s). Ele também determinará se o NetScaler é vulnerável a CVEs específicas com base na versão.
scan-citrix-netscaler-version.pyUse os seguintes passos se você estiver usando pip:
No caso do uv, você pode executar o script diretamente usando:
Exemplo 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)
Ou obtenha os resultados em 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
}
Também é possível limitar as verificações de status de vulnerabilidade a CVEs específicas usando a 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 obter os resultados em formato CSV, basta usar a flag --csv.
Para mais opções, consulte --help.
Você pode usar iocitrix.py para verificar Indicadores de Comprometimento conhecidos em um alvo Dissect NetScaler. Ele verifica os seguintes itens:
Observe que este script foi feito para ser executado em imagens forenses de disco de dispositivos Citrix NetScaler e não no próprio dispositivo. Consulte também a seção Criando imagens de disco Citrix NetScaler sobre como criar imagens forenses de disco do seu Citrix NetScaler.
Certifique-se de ter a versão mais recente do Dissect; o suporte para Citrix NetScaler foi adicionado neste PR: https://github.com/fox-it/dissect.target/pull/357
Aviso: Embora esta ferramenta busque precisão, é possível que ela produza falsos positivos ou falsos negativos. Recomenda-se que os usuários verifiquem os resultados e usem seu próprio julgamento antes de tomar qualquer decisão com base na saída desta ferramenta.
iocitrix.pyUse os seguintes passos:
Observe que o passo 4 exibirá o seguinte erro, mas você pode ignorá-lo:
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.
Você pode então executar iocitrix.py <TARGETS> para iniciar uma verificação de IOC contra uma ou mais imagens forenses. O script aceita qualquer entrada que o dissect possa ler como um Target, como um .VMDK ou uma imagem de disco bruta. Alguns exemplos são fornecidos abaixo.
python3 iocitrix.py image.vmx
python3 iocitrix.py image.vmdk
Se você também criou uma imagem forense do RAM disk, você pode utilizar iocitrix.py para incorporar dados voláteis em sua triagem da seguinte forma:
python3 iocitrix.py md0.img+image.vmx
python3 iocitrix.py md0.img+image.vmdk
python3 iocitrix.py md0.img+da0.img
O sinal + (mais) carregará as duas imagens de disco como um único Target Dissect.
Um Citrix NetScaler expõe dois dispositivos de bloco importantes que podem ser imageados para análise forense offline. Esses arquivos de dispositivo de bloco podem ser encontrados nos seguintes caminhos:
/dev/md0: O disco que contém o diretório raiz (/). Este é um RAM disk/dev/da0: O disco que contém os diretórios /var e /flash. Este é um disco persistente.O diretório raiz (/) do Citrix NetScaler é um RAM disk, o que significa que é um disco volátil. Este disco pode ser encontrado em /dev/md0 quando o NetScaler está ligado e em execução, e ficará indisponível quando o NetScaler estiver desligado. Os diretórios /var e /flash residem no disco /dev/da0 como duas partições separadas e são persistentes.
Os seguintes comandos podem ser usados em uma máquina linux local para criar uma imagem do seu NetScaler via SSH:
/dev/da0 para sua máquina locallocal ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/da0 bs=10M | tail -c +7 | head -c -6 > da0.img
Observe que isso pode levar algum tempo para ser concluído. Nenhum progresso é exibido ao usar dd.
É recomendado aguardar até recuperar o controle do prompt. Isso é uma indicação de que o dd terminou.
Além disso, se você não tiver /dev/da0, provavelmente será /dev/ada0; você pode verificar usando o comando mount ou gpart show.
/dev/md0 para sua máquina locallocal ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/md0 bs=10M | tail -c +7 | head -c -6 > md0.img
NOTA: Embora seja recomendado criar imagens de disco de ambos /dev/md0 e /dev/da0, criar uma imagem de disco de /dev/md0 é opcional. Esta etapa pode ser ignorada, embora isso possa fazer com que iocitrix.py deixe de detectar certos indicadores de comprometimento.
iocitrix.py em suas imagensApós executar os comandos anteriores em sua máquina local, os arquivos da0.img e md0.img estarão presentes. Você pode apontar o iocitrix para esses arquivos para iniciar a triagem de suas imagens. Use o seguinte comando para fazer isso:
local ~ $ python3 iocitrix.py md0.img+da0.img
Exemplo de saída:
(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.