
أداة فرز جنائي لأجهزة Citrix NetScaler، تتضمن ماسح مؤشرات الاختراق (IOC) القائم على Dissect للكشف عن القشرة الويب (webshells)، والتلاعب بالطوابع الزمنية (timestomping)، والملفات الثنائية المشبوهة، بالإضافة إلى ماسح إصدارات عن بُعد يحدد ثغرات 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
}
من الممكن أيضاً تقييد فحوصات حالة الثغرات الأمنية إلى CVEs محددة باستخدام علامة --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> لبدء فحص مؤشرات الاختراق ضد صورة أو أكثر من الصور الجنائية. يقبل السكربت أي إدخال يمكن لـ 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.