
Citrix NetScalerデバイス向けのフォレンジックトリアージツールキットで、DissectベースのIOCスキャナーを備え、Webシェル、タイムスタンピング、不審なバイナリを検出します。さらに、CVE脆弱性を特定するリモートバージョンスキャナーも搭載しています。
このリポジトリには、Citrix NetScaler デバイス用のトリアージスクリプトが含まれています:
iocitrix.py -- Citrix NetScaler のイメージ/ターゲットをトリアージするための Dissect スクリプト。scan-citrix-netscaler-version.py -- HTTP(s) 経由で NetScaler デバイスのバージョンをスキャンしてフィンガープリントするスクリプト。このスクリプトを使用すると、HTTP(s) 経由で Citrix NetScaler デバイスのバージョンをスキャンして特定できます。 また、バージョンに基づいて 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 を使用すると、NetScaler Dissect ターゲット上の既知の侵害指標 (IOC) をチェックできます。以下の項目をチェックします:
このスクリプトは、Citrix 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> を実行して、1 つ以上のフォレンジックイメージに対して IOC チェックを開始できます。このスクリプトは、dissect が Target として読み取れる任意の入力 (.VMDK や raw ディスクイメージなど) を受け付けます。いくつかの例を以下に示します。
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
+ (プラス) 記号は、2 つのディスクイメージを単一の Dissect Target として読み込みます。
Citrix NetScaler は、オフラインフォレンジック分析のためにイメージ化できる 2 つの重要なブロックデバイスを公開しています。これらのブロックデバイスファイルは以下のパスにあります:
/dev/md0: ルート (/) ディレクトリを保持するディスク。これは RAM ディスクです/dev/da0 または /dev/ada0: /var および /flash ディレクトリを保持するディスク。これは永続ディスクです。Citrix NetScaler のルートディレクトリ (/) は RAM ディスクであり、これは揮発性ディスクであることを意味します。このディスクは、NetScaler の電源が入って実行されているときに /dev/md0 に存在し、NetScaler の電源が切れているときは利用できません。/var および /flash ディレクトリは、/dev/da0 または /dev/ada0 ディスク上に 2 つの別々のパーティションとして存在し、永続的です。
以下のコマンドは、ローカルの Linux マシンで SSH 経由で NetScaler のディスクコピーを作成するために使用できます。Windows を使用している場合は、WSL (wsl.exe) または Git Bash (git-bash.exe) を使用して同じコマンドを実行できます。ネイティブの PowerShell コマンドは使用しないでください。PowerShell は SSH 経由のストリーミング raw バイナリデータを適切に処理できません。
これにより、永続ディスクが /dev/da0 か /dev/ada0 かを含め、利用可能なディスクが表示されます。
次に、正確なサイズを確認します:
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell diskinfo /dev/da0
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell diskinfo /dev/ada0
RAM ディスクの場合:
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell diskinfo /dev/md0
結果として得られる da0.img または ada0.img はそれぞれのデバイスとほぼ同じサイズになり、md0.img は /dev/md0 とほぼ同じサイズになります。
local ~ $ df -h .
前の手順で計算したディスクイメージファイルのサイズを収容するのに十分な空き容量があることを確認してください。
/dev/da0 または /dev/ada0 ディスクのディスクイメージをローカルマシンに作成しますディスク名に応じて、次のいずれかを実行します
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/da0 bs=10M | tail -c +7 | head -c -6 > da0.img
または
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/ada0 bs=10M | tail -c +7 | head -c -6 > ada0.img
これは完了するまでに時間がかかる場合があることに注意してください。dd を使用しているときは進行状況が表示されません。
プロンプトの制御が戻るまで待つことをお勧めします。これは dd が終了したことを示す指標です。
tail および head コマンドは、バイトストリームから NetScaler の SSH バナーを取り除くために使用されます。NetScaler の SSH バナーは時間の経過とともに変更される可能性があることに注意してください。その場合はコマンドを手動で編集する必要があります。
/dev/md0 ディスクのディスクイメージをローカルマシンに作成しますこの手順は省略できますが、省略すると iocitrix.py が特定の侵害指標を見逃す可能性があります。したがって、/dev/md0 と /dev/da0 または /dev/ada0 の両方のディスクイメージを作成することをお勧めします。
local ~ $ ssh nsroot@<YOUR-NETSCALER-IP> shell dd if=/dev/md0 bs=10M | tail -c +7 | head -c -6 > md0.img
iocitrix.py を実行するローカルマシンで前述のコマンドを実行すると、da0.img または ada0.img および md0.img ファイルが作成されます。iocitrix をこれらのファイルに向けて、イメージのトリアージを開始できます。これを行うには、以下のコマンドを使用します:
local ~ $ python3 iocitrix.py md0.img+da0.img
または
local ~ $ python3 iocitrix.py md0.img+ada0.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 ***