
أداة فرز جنائي لأجهزة Citrix NetScaler، تتضمن ماسح مؤشرات الاختراق (IOC) القائم على Dissect للكشف عن القشرة الويب (webshells)، والتلاعب بالطوابع الزمنية (timestomping)، والملفات الثنائية المشبوهة، بالإضافة إلى ماسح إصدارات عن بُعد يحدد ثغرات CVE.
يحتوي هذا المستودع على نصوص برمجية للفرز (triage) لأجهزة 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 للتحقق من مؤشرات الاختراق (Indicators of Compromise) المعروفة على هدف NetScaler Dissect. يتحقق من الأمور التالية:
لاحظ أن هذا النص البرمجي مخصص للتشغيل على صور الأقراص الجنائية لأجهزة 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 أو /dev/ada0: القرص الذي يحتوي على دليلي /var و /flash. هذا قرص دائم.الدليل الجذر (/) لـ Citrix NetScaler هو قرص RAM، مما يعني أن هذا قرص متطاير. يمكن العثور على هذا القرص في /dev/md0 عندما يكون NetScaler قيد التشغيل والعمل، وسيكون غير متاح عندما يكون NetScaler مغلقًا. يوجد دليلا /var و /flash على قرص /dev/da0 أو /dev/ada0 كقسمين منفصلين وهما دائمين.
يمكن استخدام الأوامر التالية على جهاز Linux محلي لإنشاء نسخ أقراص من NetScaler الخاص بك عبر SSH. إذا كنت تستخدم Windows، يمكنك استخدام WSL (wsl.exe) أو Git Bash (git-bash.exe) لاستخدام نفس الأوامر. تجنب استخدام أوامر PowerShell الأصلية، لأن PowerShell لا يتعامل بشكل صحيح مع بث البيانات الثنائية الخام عبر SSH.
سيعرض هذا الأقراص المتاحة، بما في ذلك ما إذا كان قرصك الدائم هو /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 لإزالة لافتات SSH الخاصة بـ NetScaler من تدفق البايتات. كن على علم بأن لافتات SSH الخاصة بـ NetScaler قد تتغير بمرور الوقت، وفي هذه الحالة يجب عليك تحرير الأمر يدويًا.
/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>>