01نظرة عامة على استطلاع السحابة

ليه استطلاع السحابة مختلف

الاستطلاع التقليدي بيعتمد على فحص IPs وفحص الخدمات وإيجاد منافذ مفتوحة. استطلاع السحابة بيضيف أسطح هجوم جديدة تمامًا.

1واجهات مزوّد السحابة (APIs) متاحة بشكل عام
2الموارد عندها أنماط تسمية متوقَّعة يمكن تخمينها
3Metadata الحساب بتتسرّب من خلال سلوك الـ API نفسه
4الموارد العامة ممكن تكشف البنية الداخلية للمؤسسة

AWS واحدة من أكثر منصات السحابة انتشارًا — وهي التركيز الأساسي لهذا الموديول.

منظوران للتعداد

خارجي
بدون مصادقة
معلومات عامة بس — بدون أي وصول لحساب سحابي: سجلات DNS، WHOIS، ملكية الـ IP، روابط عامة، أدوات متصفح الشبكة، وتعداد الـ Subdomains.
داخلي
بعد المصادقة
بيانات اعتماد أو مفاتيح API متاحة — تفاعل مباشر مع واجهات المزوّد لتعداد الموارد: تحليل IAM، AMIs العامة، Snapshots، وS3 Buckets.
مبدأ أساسي

التعداد دايمًا تكراري — أي وصول أو بيانات اعتماد جديدة لازم تبدأ دورة استطلاع جديدة.


02استطلاع DNS والدومين

البداية من دومين واحد

البصمة التقنية — أوامر عملية

dns fingerprinting
# استعلام سجلات 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
نمط EC2

نمط Reverse DNS الخاص بـ EC2: ec2-X-X-X-X.compute-1.amazonaws.com — بيؤكد وجود جهاز افتراضي على AWS EC2.

تعداد الـ Subdomains


03استطلاع الدومين الخاص بالخدمات

كيف تُنشئ خدمات AWS روابط متوقَّعة

الخدمةنمط الرابط
S3 Bucket<bucket-name>.s3.amazonaws.com
S3 Bucket (بديل)s3.amazonaws.com/<bucket-name>
CloudFront<id>.cloudfront.net
EC2ec2-X-X-X-X.compute-1.amazonaws.com

اكتشاف أي رابط خدمة بيكشف الخدمة السحابية المستخدَمة، وأنماط التسمية بتفضح عادات التنظيم الداخلية — معرفة اسم Bucket واحد بتساعد في تخمين أسماء تانية.

أدوات المتصفح للاستطلاع

أخطاء إعداد S3 Bucket

أخطاء شائعة وخطيرة

حتى من غير صلاحية سرد: رسائل الخطأ بتؤكد وجود الـ Bucket من عدمه — 403 يعني الـ Bucket موجود لكن الوصول مرفوض، و404 يعني الـ Bucket مش موجود أصلًا. جرّب أنماط زي company-dev، company-backup، company-staging.

أدوات اكتشاف Buckets آلية

أنماط تسمية للتجربة

company-name، companyname-public، companyname-static، companyname-assets، companyname-backup، companyname-dev، companyname-staging، companyname-prod — وماتنساش فحص Azure Blob وGCP Storage أيضًا في بيئات Multi-cloud.


04الاستطلاع عبر API

طريقتان للتفاعل مع AWS

أسلوب المهاجم

إنشاء حساب AWS خاص بالمهاجم نفسه للحصول على بيانات اعتماد API شرعية، واستخدامها للاستعلام عن واجهات المزوّد السحابي واكتشاف الموارد اللي المؤسسات الهدف شاركتها علنًا. ده إجراء قانوني — استعلام APIs عامة من حسابك الخاص.

aws cli setup + sts verification
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"
# }

AMIs العامة — كنز استخباراتي

ليه AMIs المخصّصة خطيرة لما تكون عامة

ممكن تحتوي بيانات اعتماد مضمَّنة (مفاتيح API، كلمات مرور في ملفات الإعداد)، تكشف المكدّس البرمجي والبنية الداخلية، وتاغاتها بتفضح أسماء المشاريع والبيئات والفرق. حقل الـ owner بيكشف Account ID صاحب الـ AMI مباشرة.

discovering public amis + snapshots
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 يعني أي حد يقدر يسترجع قاعدة بيانات منه.


05الحصول على Account ID عبر S3

الفكرة الجوهرية

الهدف: اكتشاف Account ID الخاص بـ AWS بتاع الهدف من غير أي وصول مباشر. الحيلة: شروط IAM policy تقدر تتحقّق من Account ID مالك المورد — وAWS بيُقيِّم الشرط ده قبل منح الوصول. استجابة السماح/الرفض بتكشف هل الشرط كان صح أو غلط.

نظام الصلاحيات كـ Oracle

اختبار "هل الـ Account ID بيبدأ بـ 0؟" → رفض. اختبار "هل بيبدأ بـ 1؟" → سماح → الرقم الأول هو '1'! تكرار العملية لكل رقم تالي → إعادة بناء الـ ID الكامل (12 رقم).

1
إنشاء مستخدم IAM مقيَّد

في حساب المهاجم الخاص — مستخدم جديد بدون أي صلاحيات افتراضيًا.

2
تحديد S3 Bucket عام

إيجاد Bucket قابل للقراءة علنًا وتابع للمؤسسة الهدف.

3
إنشاء IAM Policy شرطية

منح صلاحية محدودة (s3:ListBucket) فقط لو Account ID مالك المورد بيطابق بادئة معيّنة.

4
ربط الـ Policy واختبارها

محاولة سرد الـ Bucket — النجاح = الشرط اتحقق = الرقم صح.

5
التكرار لكل رقم

توسيع البادئة رقم رقم — اختبار كل الأرقام العشرة لكل موضع.

6
إعادة بناء الـ ID الكامل

بعد 12 تكرارًا — رقم الحساب الكامل المكوَّن من 12 رقم بيظهر بالكامل.

7
استخدام الـ ID لاستطلاع إضافي

البحث عن AMIs وSnapshots وهويات IAM باستخدام الـ Account ID المكتشَف.

ليه التقنية دي خفيّة جدًا

كل الإجراءات بتحصل جوه حساب المهاجم نفسه — إنشاء المستخدمين والسياسات والاختبار كلها عمليات داخلية. اللوجات بتتسجّل في CloudTrail بتاع المهاجم بس، وحساب الهدف ميشوفش غير وصول عادي للـ Bucket العام. مفيش تنبيهات Brute-force — حجم الطلبات قليل جدًا، والعملية ممكن تُؤتمت بالكامل.


06تعداد مستخدمي وأدوار IAM

كيف يسرّب تحقّق IAM principal البيانات

AWS بيتحقّق من صحة IAM principals قبل حفظ سياسات الموارد. المهاجم بينشئ Resource policy بتمنح وصول لـ ARN مستخدم مُخمَّن — لو الـ Policy اتحفظت بنجاح، المستخدم ده موجود فعلًا في الحساب الهدف؛ لو ظهر خطأ "Invalid principal"، المستخدم مش موجود. ده عمليًا تعداد Brute-force عبر استجابات الـ API — بدون أي محاولات تسجيل دخول، فمفيش Lockouts أبدًا.

أسماء IAM شائعة للتجربة

تعداد الأدوار (Roles) — أهداف أعلى قيمة

الأدوار غالبًا عندها صلاحيات أعلى من المستخدمين — مصمَّمة للخدمات والتطبيقات والوصول عبر الحسابات، وغالبًا بتشمل صلاحيات بمستوى أدمن. نفس تقنية التحقّق بتنطبق: تخمين ARN الدور في Resource policy، وAWS بيتحقّق هل الدور موجود فعلًا. أسماء أدوار مستهدَفة: Admin، Backup، SecurityAudit، PowerUser، DevOps، CICD، CrossAccount، Lambda-Exec.

سوء إعداد AssumeRole

لو دور مكتشَف بيثق في حسابات خارجية، المهاجم يقدر ينادي sts:AssumeRole ويستلم بيانات اعتماد مؤقتة للحساب الهدف — وده بينقل الوضع من استطلاع لـ اختراق أولي فعلي. إعداد سيئ: ثقة في aws:* (كل الحسابات)، وحتى الثقة في حسابات محدَّدة من غير شرط ExternalId فيها خطورة.

خصائص التخفّي

كل التعداد بيحصل في حساب المهاجم الخاص — إنشاء السياسات واختبارها مبيولّدش أي لوجات في حساب الهدف. الاستثناء الوحيد: انتحال الدور (Role Assumption) الناجح — استدعاءات AssumeRole بتظهر في CloudTrail الخاص بالهدف.


07صلاحيات IAM وتحليل السياسات

تقييم بيانات اعتماد مخترَقة

أول أمر لازم تنفّذه مع بيانات اعتماد مخترَقة: aws sts get-caller-identity — بيكشف Account ID، UserID، وARN الكامل. مثال: arn:aws:iam::123456789:user/support/clouddesk-plove — المسار "/support/" بيلمّح لغرض الحساب، وحتى عادات التسمية بتكشف الصلاحيات المحتملة.

كيف تُورَّث الصلاحيات في IAM

  1. سياسات مضمَّنة (Inline): مدمجة مباشرة في المستخدم — خاصة بهوية معيّنة
  2. سياسات مُدارة مرفقة: سياسات مستقلة مربوطة مباشرة بالمستخدم
  3. سياسات المجموعات: المستخدم بيرث كل صلاحيات كل مجموعة هو عضو فيها — وده غالبًا بيتم تجاهله وبيكون واسع جدًا
mapping user permissions
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
# يعرض كل الأفعال المسموحة!
SupportUser — للقراءة فقط لكنه خطير

بيمنح وصول للقراءة فقط عبر خدمات AWS كتيرة جدًا — كل عمليات Get*، Describe*، List* على كل خدمة تقريبًا. مينفعش ينشئ أو يعدّل موارد — لكن قيمته الاستطلاعية هائلة: رسم خريطة البنية التحتية بالكامل، قراءة الإعدادات والشهادات وسياسات التوسّع، وتحديد أهداف للتصعيد. القراءة فقط ≠ غير مؤذٍ في أمن السحابة.


08تعداد موارد IAM

البداية بملخص الحساب

aws iam get-account-summary بيرجّع أعداد عامة وإعدادات: عدد المستخدمين والمجموعات والأدوار والسياسات، حالة أجهزة MFA (هل Root محمي بـ MFA؟)، قوة سياسة كلمة المرور، وعدد Instance profiles.

اكتشاف عالي القيمة

حساب Root بدون MFA — عنده وصول غير محدود، ولو مش محمي بـ MFA ده خطر حرج جدًا.

سرد كل هويات IAM

listing identities — iam
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
ميزة get-account-authorization-details

استدعاء API واحد بيرجّع كل المستخدمين وسياساتهم، كل المجموعات وأعضائها، كل الأدوار وسياسات الثقة بتاعتهم، وكل السياسات المُدارة بالكامل. استدعاءات أقل = إدخالات CloudTrail أقل = كشف أصعب، وتحليل أوفلاين بدون استعلامات متكررة.


09معالجة البيانات بـ JMESPath

ليه JMESPath مهم

AWS CLI بيرجّع البيانات بصيغة JSON — غالبًا ضخمة جدًا، مئات أو آلاف الأوبجكتس في الاستجابة الواحدة. JMESPath لغة استعلام مخصّصة لمستندات JSON، مدمجة في AWS CLI عبر --query لفلترة وإعادة تشكيل البيانات من جهة العميل.

ميزة أساسية للتخفّي

--query من جهة العميل — بدون أي استدعاءات API إضافية. --filter من جهة السيرفر — بيقلّل البيانات المرسلة من AWS. مع بعض: أقل استدعاءات API، أقصى استخبارات.

jmespath practical examples
# استخراج كل أسماء المستخدمين:
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'

10التعداد الآلي بـ Pacu

ما هو Pacu؟

CloudTrail — القلق الأساسي للكشف

AWS CloudTrail بيسجّل كل نشاط API افتراضيًا — كل أمر aws بتشغّله = إدخال لوج في حساب الهدف (اسم الفعل، IP المصدر، User Agent اللي ممكن يكشف awscli أو boto3 أو pacu، الوقت، والمعاملات). Pacu بيشغّل استدعاءات API كتير وبسرعة = طفرة واضحة في CloudTrail، وUser Agent بتاعه مميَّز في اللوجات.

pacu — basic workflow
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 المُجمَّعة!

يدوي مقابل آلي

يدوي
AWS CLI + JMESPath
تحكّم كامل في كل استدعاء API، يقلّل ضجيج CloudTrail، OPSEC أفضل (توقيت عشوائي)، فهم أعمق لكل استعلام. أبطأ ومحتاج خبرة أكتر — الأنسب للتقييمات اللي تركّز على التخفّي.
آلي
Pacu / enumerate-iam
سريع — بيغطي خدمات كتيرة بسرعة، بيمسك صلاحيات ممكن تفوتها يدويًا، تنظيم جلسات وبيانات. ضجيج عالي، توقيعات الأدوات قابلة للكشف في CloudTrail، وممكن يفعّل تنبيهات أمنية — الأنسب للتقييمات محدودة الوقت.

--تحليل النتائج ومسارات التصعيد

البيانات الخام مجرد بداية — القيمة الحقيقية في التحليل. بعد أي تعداد (يدوي أو آلي)، ركّز على:

استطلاع خارجيDNS / S3 / AMIsAccount IDOracle Techniqueتعداد IAMUsers / Rolesتحليل الصلاحياتJMESPath / Pacuمسار تصعيدAssumeRole
من دومين واحد بدون وصول، وحتى مسار تصعيد كامل جوه حساب AWS الهدف

مسارات تصعيد شائعة في AWS


--Cheat Sheet مرجعي

بصمة DNS واكتشاف S3

quick reference
nslookup -type=NS 
nslookup 
nslookup 
whois  | grep -i 'amazon\|aws'
gobuster dns -d  -w wordlist.txt
curl https://.s3.amazonaws.com/

استطلاع AWS CLI الأساسي

quick reference
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

استعلامات JMESPath مفيدة

quick reference
--query 'UserDetailList[].UserName'
--query 'UserDetailList[?contains(UserName,`admin`)].UserName'
--query 'UserDetailList[].[UserName,GroupList[].GroupName]'
jp -f full_iam_dump.json 'expression'

Pacu الأساسي

quick reference
python3 pacu.py
new_session assessment1
import_keys 
run iam__enum_users_roles_policies_groups
data iam

Quick Wins — أسرع المسارات في تعداد AWS

#التحققالأمرالنتيجة المحتملة
1سجلات NS بتشاور لـ awsdns؟nslookup -type=NSتأكيد استخدام AWS
2فيه S3 bucket مكشوف في مصدر HTML؟DevTools Network tabاسم Bucket معروف
3AMI عام بيحمل اسم الشركة؟describe-images --filtersAccount ID الهدف
4بيانات اعتماد مخترَقة بصلاحية IAM قراءة؟get-account-authorization-detailsخريطة كاملة للحساب
5دور بيثق في حسابات خارجية بدون ExternalId؟sts:AssumeRoleاختراق أولي فعلي

الخلاصة العامة للموديول

الموديول ده غطّى تعداد بنية AWS السحابية من اسم دومين واحد بدون أي وصول، مرورًا باستغلال سلوك IAM كـ Oracle، ووصولًا لتعداد وتحليل صلاحيات IAM الكامل يدويًا وآليًا عبر JMESPath وPacu.

$ cat ./module22_summary.txt

كل تقنيات الموديول ده مبنية على فكرة واحدة: سلوك واجهات AWS نفسها بيسرّب معلومات حتى لما الهدف من التصميم رفض الوصول. المختبر اللي بيفهم إن كل استجابة — سماح، رفض، أو حتى رسالة خطأ — بتحمل معنى، هو اللي بيحوّل واجهة سحابية مغلقة لخريطة كاملة للحساب الهدف.

Professional Mindset

في الـ Engagement الحقيقي: ابدأ دايمًا بالاستطلاع الخارجي الصامت (DNS، WHOIS، S3 المكشوف، أدوات المتصفح) → استخرج أي Account ID متاح عبر S3 أو AMIs العامة → لو عندك بيانات اعتماد ولو منخفضة الصلاحية، نفّذ get-account-authorization-details فورًا وحلّلها أوفلاين بـ JMESPath → استخدم الأتمتة (Pacu) بس لما السرعة أهم من التخفّي، وراقب أثرك في CloudTrail. وثَّق كل خطوة، حتى الفاشلة.


نهاية نوتس الموديول الثاني والعشرين — Enumerating AWS Cloud Infrastructure