
HikCentral Professional - تسريب ActiveCode الرخصة قبل المصادقة
قبل تنزيل أي شيء، ما هو متاح للعموم بالفعل:
| المصدر | ما يخبرنا به |
|---|---|
| نشرة أمان Hikvision | "فحوصات مصادقة مفقودة على نقاط النهاية API"، نصيحة بالترقية إلى V2.6.3 / V3.0.1 |
| NVD CVE-2025-39247 | مقاييس CVSS؛ المتجه شبكي، لا مصادقة، نطاق متغير، سرية عالية |
| ملخصات Wiz, ZeroPath, SentinelOne, OffSeq, gbhackers, cybersecuritynews | جميعها تعيد صياغة النشرة؛ لا تفاصيل فنية، ولا PoC، ولا نقطة نهاية متأثرة مسماة |
| مجمعات PoC على GitHub (poc-in-github, 0xMarcio/cve, إلخ) | لا يوجد PoC مفهرس |
| المنتديات (ipcamtalk, cctvforum, reddit)، مفهرسات التورنت | لا PoC، ولا مُثبّتات مسربة؛ في ipcamtalk يوجد موضوع حول استخدام HikCentral لكن لا شيء متعلق بالاستغلال |
إذاً، حتى تاريخ التحليل، لا يوجد أي مستند فني عام يكشف الثغرة. أي عملية إعادة إنتاج تبدأ من المقارنة الثنائية.
بعد نشر CVE-2025-39247 تم إلغاء إدراج صفحة تنزيل V2.6.2، لكن الملف على CDN لم يُحذف أبداً. يمكن استرداد اسم الملف من مرآة خارجية قامت بفهرسة الصفحة قبل الإلغاء (FileHorse — نشر اسم الملف وMD5). بهذا الاسم، يكفي طلب GET بسيط إلى CDN الخاص بـ Hikvision — باستخدام User-Agent عادي للمتصفح ورأس Referer مطابق — ليبقى الملف متاحاً.```bash
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0"
-H "Referer: https://www.hikvision.com/en/support/download/software/hikcentral-professional-v2-6-2/"
-O
"https://www.hikvision.com/content/dam/hikvision/en/support/download/vms/hcp-2-6-2/HikCentral-Professional_Full-Pack_V2.6.2.202501211507_Win_x64_Installer.exe"
النتيجة:
- الحجم: 1,314,043,792 بايت (1.22 جيجابايت)
- MD5: `76d42e7cb16dc0e177b9a35d0fed7ced` — يطابق القيمة المنشورة من FileHorse، مما يؤكد أن المثبت موقع من Hikvision (وليس إعادة حزم من طرف ثالث)
- رؤوس استجابة CDN: `HTTP/2 200`, `content-type: application/x-msdownload`, `eo-cache-status: HIT`, `age: 2520395` (حوالي 29 يومًا في ذاكرة التخزين المؤقت للحافة لـ Tencent EdgeOne دون إخلاء)
**ملاحظة جانبية تستحق الإبلاغ إلى Hikvision PSIRT:** إن "إزالة القائمة" لصفحة V2.6.2 هي تجميلية. الملف المهجور يمكن الوصول إليه على CDN دون مصادقة ودون بوابة URL موقعة. الحزم الكاملة V2.5.1 و V2.6.0 تستجيب بنفس الطريقة.
### 2.2 المثبت المصحح (الحزمة الأساسية V2.6.3)
مرتبط حاليًا من صفحة تنزيل V2.6.3؛ نفس طريقة الاسترجاع:```
https://www.hikvision.com/content/dam/hikvision/en/support/download/vms/hcp-2-6-3/HikCentral-Professional_Base-Pack_V2.6.3.202508280142_Win_x64_Installer.exe
لا يزال مرتبطًا من صفحة تنزيل V2.6.2 (تريد Hikvision من المستخدمين تطبيقه):``` https://www.hikvision.com/content/dam/hikvision/en/support/download/vms/cve-2025-39247-security-vulnerability-patch/HikCentral-Professional_CVE-2025-39247_FixPack_V2.3.1-V2.6.2V3.0.0_20250904.exe
- الحجم: 32,599,504 بايت (31 ميجابايت)
---
## 3. الاستخراج الثابت
جميع الثلاثة عبارة عن أغلفة PE من نمط InstallShield. يقوم `7z` بتقشيرها في خطوتين:```bash
# pass 1 — extract PE resources
7z x -o./extracted/v262/pe downloads/<v2.6.2 installer>
7z x -o./extracted/v263/pe downloads/<v2.6.3 installer>
# pass 2 — extract the nested 7-Zip streams hiding in PE resources
# (note: the resource-type label says "ZIP" but the byte signature is 7-Zip)
for ver in v262 v263; do
for z in extracted/$ver/pe/.rsrc/2052/ZIP/*; do
sz=$(stat -c %s "$z"); [ "$sz" -lt 1048576 ] && continue
7z x -o"extracted/$ver/payload/$(basename $z)" "$z"
done
done
كلا المثبتين يتوسعان إلى حوالي أربعة وعشرين أرشيف حمولة مُسمى. تكشف أدلة المستوى الأعلى عن البنية:
| الأرشيف | المحتويات |
|---|---|
246/Nginx + 246/www | طبقة ويب Nginx (الباب الأمامي) وواجهة مستخدم ويب SPA |
244/bin | ثنائيات خدمة C++ أصلية + شهادات |
240 | PostgreSQL مُجمّع + نصوص تهيئة قاعدة البيانات |
238 | وقت تشغيل Bee* (BeeAgent, BeeGuard, …) |
282 | خدمات التطبيق والإضافات (الجزء الأكبر من كود الخلفية C++) |
281, 283-284, 396, 398-399, 513, 520, 538-541, 573 | إضافات أصغر، مكونات إضافية، ودعامات ترقية/إلغاء التثبيت |
الأهم من ذلك، لا توجد ملفات JARs/WARs لجافا في أي مكان. الخلفية هي C++ على Nginx — مهم لأنه يخبرك مقدمًا أن أي ثغرة في المصادقة ستكون في الثنائيات المُجمّعة، وليس في كود بايت WAR/JAR حيث يكون فك التجميع تافهًا.
for ver in v262 v263: find . -type f -print0 | xargs -0 md5sum | sort -k2 > inv_$ver.txt
v262 = {ln[34:]: ln[:32] for ln in open("inv_v262.txt")} v263 = {ln[34:]: ln[:32] for ln in open("inv_v263.txt")} common = set(v262) & set(v263) changed = [p for p in common if v262[p] != v263[p]]
النتيجة: 239 ملفًا تم تغييرها في المسارات الشائعة. التوزيع:
| الجرافة | العدد | ملاحظة |
|---|---|---|
| `246/www/*.js` (أجزاء واجهة الويب) | ~200 | في الغالب تجزئة أصول محدثة الإصدار؛ تجاهل |
| `246/Nginx/conf/nginx_location.conf` | **1** | **فرق ملف تكوين Nginx أحادي الملف — ابدأ من هنا** |
| `246/Nginx*/install.bat` | 6 | نصوص التثبيت، غير متعلقة |
| `244/bin/*.{exe,dll}` | 6 | ثنائيات أصلية (`DistributionFilter.dll`, `FilterChain.dll`, أدوات الوسائط) |
| `282/*.{exe,dll}` | 55 | خدمات التطبيق (أكبر مجموعة — `platform.dll`, `PersonCredential.dll`, `baseacs.*`, …) |
| `240/bin/pg_*` | 6 | إعادة بناء Postgres، غير متعلقة |
| `284/hplugin/dahua_plugin/*` | 4 | تحديث SDK المورد (+10.97 MB) — غير متعلقة |
| `284/hplugin/onvif_plugin/*` | 4 | تحديث SDK المورد (+0.99 MB) — غير متعلقة |
| upgrade/uninstall stubs, crash reporters | ~30 | إعادة بناء طوابع زمنية PE بنفس الحجم، تجاهل |
بعد تصفية تحديث SDK المورد، وانجراف الطوابع الزمنية لنظام البناء، والارتفاعات التجميلية البحتة للأصول، فإن الفروقات *الفعلية* ذات الصلة بالأمن تقل إلى:
- ملف تكوين Nginx واحد
- عدد صغير من الثنائيات C++ في `282/` (أبرزها `platform.dll`، خدمة الخلفية HCMP، +57 KB)
---
## 5. فرق Nginx: موقع الخلل بدون تكلفة
`diff -u nginx_location.conf` بين V2.6.2 و V2.6.3 ينتج بالضبط رقعة واحدة: كتلة `location =` جديدة تمامًا في V2.6.3.```nginx
#禁止非127.0.0.1和::1的重置密码 ← "Forbid non-127.0.0.1/::1 password reset"
location = /ISAPI/Bumblebee/Platform/V0/Permission/ChangeDefaultUserPassword {
if ($remote_addr ~ ^(127\.0\.0\.1|::1)$) { set $allowed 1; }
if ($allowed != "1") { return 403; }
if ($scheme = "http") { proxy_pass http://http_backend; }
if ($scheme = "https") { proxy_pass http://http2_backend; }
}
هذه الإضافة المكونة من 21 سطرًا هي التصحيح الكامل لـ CVE-2025-39247 على مستوى البوابة الأمامية، وهي تخبرك بكل شيء:
PUT /ISAPI/Bumblebee/Platform/V0/Permission/ChangeDefaultUserPassword/ISAPI/Bumblebee/Platform/V0/* إلى الواجهة الخلفية بدون تقييد لعنوان البعيد وبدون فحص مصادقة على مستوى Nginx.التعليق الصيني مهم: ترجمته الحرفية هي "منع إعادة تعيين كلمة المرور من غير 127.0.0.1/::1".
JavaScript واجهة المستخدم للويب (مصغرة، في 246/www/Portal/*.js) تستدعي نقطة النهاية كالتالي:```js
// API definition (de-minified):
changeDefaultUserPassword: function (sid, payload, opts) {
return http.put({
url: "ISAPI/Bumblebee/Platform/V0/Permission/ChangeDefaultUserPassword",
data: { ChangeDefaultUserPasswordRequest: payload },
params: { SID: sid }
}, opts);
}