الاستطلاع التقليدي بيعتمد على فحص IPs وفحص الخدمات وإيجاد منافذ مفتوحة. استطلاع السحابة بيضيف أسطح هجوم جديدة تمامًا.
AWS واحدة من أكثر منصات السحابة انتشارًا — وهي التركيز الأساسي لهذا الموديول.
التعداد دايمًا تكراري — أي وصول أو بيانات اعتماد جديدة لازم تبدأ دورة استطلاع جديدة.
*.awsdns-*.com / .org / .net / .co.uk — ده لوحده بيؤكد استخدام AWS# استعلام سجلات NS:
nslookup -type=NS badglitch.io
# → ns-XXX.awsdns-XX.com
# تحويل الدومين لـ IP:
nslookup badglitch.io
# → 52.x.x.x (نطاق AWS العام)
# Reverse DNS lookup:
nslookup 52.x.x.x
# → ec2-52-x-x-x.compute-1.amazonaws.com
# WHOIS على الـ IP:
whois 52.x.x.x | grep -i 'amazon\|aws'
# يؤكد: AMAZON-EC2
نمط Reverse DNS الخاص بـ EC2: ec2-X-X-X-X.compute-1.amazonaws.com — بيؤكد وجود جهاز افتراضي على AWS EC2.
site:domain.com)amass، subfinder، dnsx، وضع DNS في gobuster| الخدمة | نمط الرابط |
|---|---|
| S3 Bucket | <bucket-name>.s3.amazonaws.com |
| S3 Bucket (بديل) | s3.amazonaws.com/<bucket-name> |
| CloudFront | <id>.cloudfront.net |
| EC2 | ec2-X-X-X-X.compute-1.amazonaws.com |
اكتشاف أي رابط خدمة بيكشف الخدمة السحابية المستخدَمة، وأنماط التسمية بتفضح عادات التنظيم الداخلية — معرفة اسم Bucket واحد بتساعد في تخمين أسماء تانية.
*.s3.amazonaws.com — بتكشف أسماء الـ Buckets، ومسار الرابط غالبًا بيكشف البنية الداخلية للملفاتحتى من غير صلاحية سرد: رسائل الخطأ بتؤكد وجود الـ Bucket من عدمه — 403 يعني الـ Bucket موجود لكن الوصول مرفوض، و404 يعني الـ Bucket مش موجود أصلًا. جرّب أنماط زي company-dev، company-backup، company-staging.
company-name، companyname-public، companyname-static، companyname-assets، companyname-backup، companyname-dev، companyname-staging، companyname-prod — وماتنساش فحص Azure Blob وGCP Storage أيضًا في بيئات Multi-cloud.
إنشاء حساب AWS خاص بالمهاجم نفسه للحصول على بيانات اعتماد API شرعية، واستخدامها للاستعلام عن واجهات المزوّد السحابي واكتشاف الموارد اللي المؤسسات الهدف شاركتها علنًا. ده إجراء قانوني — استعلام APIs عامة من حسابك الخاص.
aws configure --profile attacker
AWS Access Key ID: AKIA...
AWS Secret Access Key: ...
Default region: us-east-1
aws --profile attacker sts get-caller-identity
# {
# "Account": "123456789012",
# "UserId": "AIDAXXXXXXX",
# "Arn": "arn:aws:iam::123...:user/attacker"
# }
ممكن تحتوي بيانات اعتماد مضمَّنة (مفاتيح API، كلمات مرور في ملفات الإعداد)، تكشف المكدّس البرمجي والبنية الداخلية، وتاغاتها بتفضح أسماء المشاريع والبيئات والفرق. حقل الـ owner بيكشف Account ID صاحب الـ AMI مباشرة.
aws --profile attacker ec2 describe-images \
--filters 'Name=name,Values=*badglitch*' --owners self amazon
aws ec2 describe-images --executable-users all \
--filters 'Name=name,Values=*company*'
# OwnerId: 123456789012 ← Account ID الهدف!
# Name: badglitch-web-prod-2024
# بعد معرفة الـ Account ID:
aws ec2 describe-snapshots --owner-ids
aws rds describe-db-snapshots --snapshot-type public
Snapshots الـ EBS نسخ احتياطية لأقراص كاملة — Public EBS snapshot يعني أي حد يقدر ينشئ Volume منه ويوصّله. Snapshots الـ RDS نسخ قاعدة بيانات كاملة في لحظة معيّنة — Public RDS snapshot يعني أي حد يقدر يسترجع قاعدة بيانات منه.
الهدف: اكتشاف Account ID الخاص بـ AWS بتاع الهدف من غير أي وصول مباشر. الحيلة: شروط IAM policy تقدر تتحقّق من Account ID مالك المورد — وAWS بيُقيِّم الشرط ده قبل منح الوصول. استجابة السماح/الرفض بتكشف هل الشرط كان صح أو غلط.
اختبار "هل الـ Account ID بيبدأ بـ 0؟" → رفض. اختبار "هل بيبدأ بـ 1؟" → سماح → الرقم الأول هو '1'! تكرار العملية لكل رقم تالي → إعادة بناء الـ ID الكامل (12 رقم).
في حساب المهاجم الخاص — مستخدم جديد بدون أي صلاحيات افتراضيًا.
إيجاد Bucket قابل للقراءة علنًا وتابع للمؤسسة الهدف.
منح صلاحية محدودة (s3:ListBucket) فقط لو Account ID مالك المورد بيطابق بادئة معيّنة.
محاولة سرد الـ Bucket — النجاح = الشرط اتحقق = الرقم صح.
توسيع البادئة رقم رقم — اختبار كل الأرقام العشرة لكل موضع.
بعد 12 تكرارًا — رقم الحساب الكامل المكوَّن من 12 رقم بيظهر بالكامل.
البحث عن AMIs وSnapshots وهويات IAM باستخدام الـ Account ID المكتشَف.
كل الإجراءات بتحصل جوه حساب المهاجم نفسه — إنشاء المستخدمين والسياسات والاختبار كلها عمليات داخلية. اللوجات بتتسجّل في CloudTrail بتاع المهاجم بس، وحساب الهدف ميشوفش غير وصول عادي للـ Bucket العام. مفيش تنبيهات Brute-force — حجم الطلبات قليل جدًا، والعملية ممكن تُؤتمت بالكامل.
AWS بيتحقّق من صحة IAM principals قبل حفظ سياسات الموارد. المهاجم بينشئ Resource policy بتمنح وصول لـ ARN مستخدم مُخمَّن — لو الـ Policy اتحفظت بنجاح، المستخدم ده موجود فعلًا في الحساب الهدف؛ لو ظهر خطأ "Invalid principal"، المستخدم مش موجود. ده عمليًا تعداد Brute-force عبر استجابات الـ API — بدون أي محاولات تسجيل دخول، فمفيش Lockouts أبدًا.
الأدوار غالبًا عندها صلاحيات أعلى من المستخدمين — مصمَّمة للخدمات والتطبيقات والوصول عبر الحسابات، وغالبًا بتشمل صلاحيات بمستوى أدمن. نفس تقنية التحقّق بتنطبق: تخمين ARN الدور في Resource policy، وAWS بيتحقّق هل الدور موجود فعلًا. أسماء أدوار مستهدَفة: Admin، Backup، SecurityAudit، PowerUser، DevOps، CICD، CrossAccount، Lambda-Exec.
لو دور مكتشَف بيثق في حسابات خارجية، المهاجم يقدر ينادي sts:AssumeRole ويستلم بيانات اعتماد مؤقتة للحساب الهدف — وده بينقل الوضع من استطلاع لـ اختراق أولي فعلي. إعداد سيئ: ثقة في aws:* (كل الحسابات)، وحتى الثقة في حسابات محدَّدة من غير شرط ExternalId فيها خطورة.
كل التعداد بيحصل في حساب المهاجم الخاص — إنشاء السياسات واختبارها مبيولّدش أي لوجات في حساب الهدف. الاستثناء الوحيد: انتحال الدور (Role Assumption) الناجح — استدعاءات AssumeRole بتظهر في CloudTrail الخاص بالهدف.
أول أمر لازم تنفّذه مع بيانات اعتماد مخترَقة: aws sts get-caller-identity — بيكشف Account ID، UserID، وARN الكامل. مثال: arn:aws:iam::123456789:user/support/clouddesk-plove — المسار "/support/" بيلمّح لغرض الحساب، وحتى عادات التسمية بتكشف الصلاحيات المحتملة.
aws iam list-groups-for-user --user-name clouddesk-plove
# GroupName: support
aws iam list-attached-group-policies --group-name support
# SupportUser (AWS Managed Policy)
aws iam get-policy-version \
--policy-arn arn:aws:iam::aws:policy/SupportUser --version-id v8
# يعرض كل الأفعال المسموحة!
بيمنح وصول للقراءة فقط عبر خدمات AWS كتيرة جدًا — كل عمليات Get*، Describe*، List* على كل خدمة تقريبًا. مينفعش ينشئ أو يعدّل موارد — لكن قيمته الاستطلاعية هائلة: رسم خريطة البنية التحتية بالكامل، قراءة الإعدادات والشهادات وسياسات التوسّع، وتحديد أهداف للتصعيد. القراءة فقط ≠ غير مؤذٍ في أمن السحابة.
aws iam get-account-summary بيرجّع أعداد عامة وإعدادات: عدد المستخدمين والمجموعات والأدوار والسياسات، حالة أجهزة MFA (هل Root محمي بـ MFA؟)، قوة سياسة كلمة المرور، وعدد Instance profiles.
حساب Root بدون MFA — عنده وصول غير محدود، ولو مش محمي بـ MFA ده خطر حرج جدًا.
aws iam list-users > users.json
aws iam list-groups > groups.json
aws iam list-roles > roles.json
aws iam list-policies --scope Local > policies.json
# الخطوة الأقوى — كل حاجة في استدعاء واحد:
aws iam get-account-authorization-details > full_iam_dump.json
استدعاء API واحد بيرجّع كل المستخدمين وسياساتهم، كل المجموعات وأعضائها، كل الأدوار وسياسات الثقة بتاعتهم، وكل السياسات المُدارة بالكامل. استدعاءات أقل = إدخالات CloudTrail أقل = كشف أصعب، وتحليل أوفلاين بدون استعلامات متكررة.
AWS CLI بيرجّع البيانات بصيغة JSON — غالبًا ضخمة جدًا، مئات أو آلاف الأوبجكتس في الاستجابة الواحدة. JMESPath لغة استعلام مخصّصة لمستندات JSON، مدمجة في AWS CLI عبر --query لفلترة وإعادة تشكيل البيانات من جهة العميل.
--query من جهة العميل — بدون أي استدعاءات API إضافية. --filter من جهة السيرفر — بيقلّل البيانات المرسلة من AWS. مع بعض: أقل استدعاءات API، أقصى استخبارات.
# استخراج كل أسماء المستخدمين:
aws iam get-account-authorization-details \
--query 'UserDetailList[].UserName'
# إيجاد المستخدمين المرتبطين بـ admin:
aws iam get-account-authorization-details \
--query 'UserDetailList[?contains(UserName,`admin`)].UserName'
# النتيجة: ["admin", "cloudadmin"]
# المستخدمين مع السياسات المرفقة بيهم:
aws iam get-account-authorization-details \
--query 'UserDetailList[].[UserName,AttachedManagedPolicies[].PolicyName]'
# معالجة ملفات JSON محفوظة محليًا:
jp -f full_iam_dump.json 'expression'
AWS CloudTrail بيسجّل كل نشاط API افتراضيًا — كل أمر aws بتشغّله = إدخال لوج في حساب الهدف (اسم الفعل، IP المصدر، User Agent اللي ممكن يكشف awscli أو boto3 أو pacu، الوقت، والمعاملات). Pacu بيشغّل استدعاءات API كتير وبسرعة = طفرة واضحة في CloudTrail، وUser Agent بتاعه مميَّز في اللوجات.
python3 pacu.py
Pacu (v1.x) - Main Menu
Pacu (No Session) > new_session
assessment1
Pacu (assessment1) > import_keys clouddesk
Pacu (assessment1) > run iam__enum_users_roles_policies_groups
[*] Enumerating IAM users...
[*] 14 users found, 8 roles found...
Pacu (assessment1) > data iam
# يعرض كل بيانات IAM المُجمَّعة!
البيانات الخام مجرد بداية — القيمة الحقيقية في التحليل. بعد أي تعداد (يدوي أو آلي)، ركّز على:
Action: '*'، Resource: '*')iam:CreateUser، iam:AttachUserPolicy، iam:AddUserToGroupsts:AssumeRolenslookup -type=NS
nslookup
nslookup
whois | grep -i 'amazon\|aws'
gobuster dns -d -w wordlist.txt
curl https://.s3.amazonaws.com/
aws configure --profile attacker
aws --profile attacker sts get-caller-identity
aws ec2 describe-images --executable-users all --filters 'Name=name,Values=*company*'
aws ec2 describe-snapshots --owner-ids
aws iam get-account-summary
aws iam get-account-authorization-details > full_iam_dump.json
--query 'UserDetailList[].UserName'
--query 'UserDetailList[?contains(UserName,`admin`)].UserName'
--query 'UserDetailList[].[UserName,GroupList[].GroupName]'
jp -f full_iam_dump.json 'expression'
python3 pacu.py
new_session assessment1
import_keys
run iam__enum_users_roles_policies_groups
data iam
| # | التحقق | الأمر | النتيجة المحتملة |
|---|---|---|---|
| 1 | سجلات NS بتشاور لـ awsdns؟ | nslookup -type=NS | تأكيد استخدام AWS |
| 2 | فيه S3 bucket مكشوف في مصدر HTML؟ | DevTools Network tab | اسم Bucket معروف |
| 3 | AMI عام بيحمل اسم الشركة؟ | describe-images --filters | Account ID الهدف |
| 4 | بيانات اعتماد مخترَقة بصلاحية IAM قراءة؟ | get-account-authorization-details | خريطة كاملة للحساب |
| 5 | دور بيثق في حسابات خارجية بدون ExternalId؟ | sts:AssumeRole | اختراق أولي فعلي |
الموديول ده غطّى تعداد بنية AWS السحابية من اسم دومين واحد بدون أي وصول، مرورًا باستغلال سلوك IAM كـ Oracle، ووصولًا لتعداد وتحليل صلاحيات IAM الكامل يدويًا وآليًا عبر JMESPath وPacu.
كل تقنيات الموديول ده مبنية على فكرة واحدة: سلوك واجهات AWS نفسها بيسرّب معلومات حتى لما الهدف من التصميم رفض الوصول. المختبر اللي بيفهم إن كل استجابة — سماح، رفض، أو حتى رسالة خطأ — بتحمل معنى، هو اللي بيحوّل واجهة سحابية مغلقة لخريطة كاملة للحساب الهدف.
في الـ Engagement الحقيقي: ابدأ دايمًا بالاستطلاع الخارجي الصامت (DNS، WHOIS، S3 المكشوف، أدوات المتصفح) → استخرج أي Account ID متاح عبر S3 أو AMIs العامة → لو عندك بيانات اعتماد ولو منخفضة الصلاحية، نفّذ get-account-authorization-details فورًا وحلّلها أوفلاين بـ JMESPath → استخدم الأتمتة (Pacu) بس لما السرعة أهم من التخفّي، وراقب أثرك في CloudTrail. وثَّق كل خطوة، حتى الفاشلة.
نهاية نوتس الموديول الثاني والعشرين — Enumerating AWS Cloud Infrastructure