
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 de 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, veja --help.
Você pode usar iocitrix.py para verificar Indicadores de Comprometimento conhecidos em um alvo Dissect do 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. Veja também a seção Criando imagens de disco do 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 ao Citrix NetScaler foi adicionado neste PR: https://github.com/fox-it/dissect.target/pull/357
Aviso legal: Embora esta ferramenta busque precisão, é possível que 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 imprimirá 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 consiga 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 disco RAM, 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 Dissect Target.
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 disco RAM/dev/da0 ou /dev/ada0: O disco que contém os diretórios /var e /flash. Este é um disco persistente.O diretório raiz (/) do Citrix NetScaler é um disco RAM, o que significa que este é 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 ou /dev/ada0 como duas partições separadas e são persistentes.
Os seguintes comandos podem ser usados em uma máquina Linux local para criar cópias de disco do seu NetScaler via SSH. Se você estiver usando Windows, pode usar o WSL (wsl.exe) ou Git Bash (git-bash.exe) para usar os mesmos comandos. Evite usar comandos nativos do PowerShell, pois o PowerShell não lida adequadamente com streaming de dados binários brutos via SSH.
Isso mostrará os discos disponíveis, incluindo se o seu disco persistente é /dev/da0 ou /dev/ada0.
Em seguida, verifique o tamanho exato:
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell diskinfo /dev/da0
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell diskinfo /dev/ada0
Para o disco RAM:
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell diskinfo /dev/md0
O da0.img ou ada0.img resultante terá aproximadamente o tamanho do respectivo dispositivo, e md0.img aproximadamente o tamanho de /dev/md0.
local ~ $ df -h .
Certifique-se de que há espaço suficiente disponível para acomodar os arquivos de imagem de disco, cujos tamanhos foram calculados no passo anterior.
/dev/da0 ou /dev/ada0 para sua máquina localDependendo do nome do seu disco, execute
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/da0 bs=10M | tail -c +7 | head -c -6 > da0.img
ou
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/ada0 bs=10M | tail -c +7 | head -c -6 > ada0.img
Observe que isso pode levar algum tempo para ser concluído. Nenhum progresso é mostrado ao usar dd.
Recomenda-se aguardar até recuperar o controle do prompt. Isso é um indício de que o dd terminou.
Os comandos tail e head são usados para remover os banners SSH do NetScaler do fluxo de bytes. Esteja ciente de que os banners SSH do NetScaler podem mudar com o tempo, caso em que você deve editar o comando manualmente.