הinjection LDAP - תרגיל¶
תרגיל 1 - bypass אותנטיקציה¶
משימות¶
- הקימו סביבת תרגול מקומית עם OpenLDAP ואפליקציית PHP:
# Setting up OpenLDAP with Docker
docker run -d --name openldap \
-e LDAP_ORGANISATION="TestOrg" \
-e LDAP_DOMAIN="test.local" \
-e LDAP_ADMIN_PASSWORD="admin" \
-p 389:389 \
osixia/openldap
- צרו אפליקציית PHP פשוטה עם טופס התחברות שמשתמשת ב-LDAP
- נסו את הפיילואדים הבאים בשדה שם המשתמש:
- תעדו אילו payloads הצליחו ולמה
תרגיל 2 - extraction עיוור¶
משימות¶
- בהינתן אפליקציה שמחזירה רק "Valid user" או "Invalid user":
- כתבו סקריפט Python שמחלץ שמות משתמשים:
import requests
import string
url = "http://target/search.php"
charset = string.ascii_lowercase + string.digits
def check(payload):
response = requests.post(url, data={"username": payload, "password": "x"})
return "Valid" in response.text
# Complete: extract the username character by character
username = ""
# ...
- הרחיבו את הסקריפט לextraction תכונות נוספות (מייל, מספר טלפון, שם מלא)
- חלצו את רשימת הקבוצות שהמשתמש חבר בהן
תרגיל 3 - ניתוח קוד פגיע¶
משימות¶
בהינתן קטעי הקוד הבאים, מצאו את החולשה וכתבו payload לexploit:
קוד 1 - PHP¶
קוד 2 - Java¶
String filter = "(&(department=" + dept + ")(title=" + title + "))";
NamingEnumeration results = ctx.search(baseDN, filter, controls);
קוד 3 - Python¶
filter_str = "(|(mail=%s)(uid=%s))" % (email, username)
results = conn.search_s(base_dn, ldap.SCOPE_SUBTREE, filter_str)
לכל קוד:
1. זהו את נקודת הinjection
2. כתבו payload לbypass אותנטיקציה
3. כתבו payload לextraction מידע
4. כתבו גרסה מתוקנת של הקוד
תרגיל 4 - גילוי מבנה ה-Directory¶
משימות¶
- בהינתן נקודת injection ב-LDAP, מפו את מבנה הספרייה
- גלו את כל ה-Organizational Units:
# Check if the ou exists
*)(objectClass=organizationalUnit)(ou=A*
*)(objectClass=organizationalUnit)(ou=B*
- גלו את כל הקבוצות ואת החברים שלהן
- גלו את כל המשתמשים בכל OU
- ציירו דיאגרמה של מבנה הספרייה שגיליתם
תרגיל 5 - כתיבת כלי סריקה¶
משימות¶
כתבו כלי Python שמבצע:
- בדיקה האם פרמטר פגיע ל-LDAP injection
- זיהוי סוג הinjection (AND/OR based)
- הextraction אוטומטי של שמות משתמשים
- הextraction אוטומטי של תכונות
class LDAPScanner:
def __init__(self, url, param_name):
self.url = url
self.param_name = param_name
def detect_injection(self):
"""Checks whether the parameter is vulnerable"""
# Complete
pass
def extract_users(self):
"""Extracts usernames"""
# Complete
pass
def extract_attribute(self, username, attr_name):
"""Extracts the value of an attribute"""
# Complete
pass
אתגר מסכם¶
תרחיש¶
מצאתם אפליקציית פורטל ארגוני שמשתמשת ב-LDAP לאותנטיקציה ולחיפוש עובדים.
משימות¶
- מצאו נקודת injection בטופס ההתחברות
- עקפו את האותנטיקציה והתחברו כמנהל
- מצאו נקודת injection בחיפוש העובדים
- חלצו את רשימת כל העובדים
- חלצו מספרי טלפון, כתובות מייל, וחברות בקבוצות
- מצאו את כל חברי קבוצת ה-Admins
- כתבו דוח מסכם עם המלצות תיקון