דילוג לתוכן
New

DeepSeek V4.1 Flash free for 7 days: 10M tokens a day after a top-up of $10 or more. Until Nov 30.

How it works

OWASP Juice Shop עם Docker: מעבדת תרגול מקומית

מריצים את OWASP Juice Shop בקונטיינר Docker שקשור למחשב שלך, מוודאים שהוא מגיב ועוצרים אותו בצורה נקייה.

מתחילים4 דקות קריאהמאת NotHoly

OWASP Juice Shop היא אפליקציית ווב פגיעה בכוונה. אפשר להריץ אותה בקונטיינר Docker על המחשב שלך, לפתוח אותה בדפדפן בכתובת http://127.0.0.1:3000, ולתרגל עליה אבטחת ווב בלי לגעת במערכות של אף אחד אחר. לפי הפרויקט, היא כוללת חולשות מכל ה-OWASP Top Ten, וגם אחרות שנמצאו באפליקציות אמיתיות. בהמשך מופיעות הפקודות, מה לבדוק אחרי כל אחת, איך שומרים על הפורט פרטי ואיך עוצרים את המעבדה.

מה צריך

  • מחשב בבעלותך או בניהולך, עם הרשאה להריץ עליו Docker.
  • Docker Engine או Docker Desktop, בהתקנה לפי התיעוד הרשמי של Docker למערכת ההפעלה שלך.
  • דפדפן עם כלי מפתחים. Chrome, Firefox ו-Edge כוללים אותם.
  • מספיק מקום בדיסק וזיכרון לקונטיינר אחד. גודל ה-image תלוי בתגית שבוחרים, ולכן כדאי לבדוק קודם את העמוד שלה ב-Docker Hub.

Juice Shop מכילה ליקויים בכוונה. צריך להשאיר אותה על מחשב ורשת שבשליטתך, ולעולם לא לחשוף אותה לאינטרנט.

1. בדיקה ש-Docker עובד

מריצים בטרמינל את שתי הפקודות האלה:

bash
docker --version
docker info

הפקודה הראשונה מדפיסה את גרסת ה-CLI של Docker. השנייה פונה למנוע של Docker ומדפיסה את התצורה שלו. אם הפקודה docker info מדווחת שאין לה חיבור ל-daemon, מפעילים את Docker Desktop או את שירות Docker ומריצים שוב. הנוסח המדויק של השגיאה תלוי בפלטפורמה, ולכן אם התיקון לא ברור, כדאי לעבור לתיעוד ההתקנה של Docker.

2. הפעלת המעבדה על loopback בלבד

תיעוד הפרויקט נוקב ב-image בשם bkimminich/juice-shop. ה-README של הפרויקט מריץ אותו בלי תגית, ואז נמשכת התגית latest. למעבדה שאפשר לשחזר, בוחרים תגית של גרסה בעמוד ה-Docker Hub ומוסיפים אותה לשם ה-image (bkimminich/juice-shop:<tag>), וכך ברור איזו גרסה נבדקת.

bash
docker run --rm --name juice-shop-lab \
  -p 127.0.0.1:3000:3000 \
  bkimminich/juice-shop

הדגל -p מפרסם פורט של הקונטיינר על המארח. לערך 127.0.0.1:3000:3000 יש שלושה חלקים: כתובת המארח, פורט המארח ופורט הקונטיינר. לפי התיעוד של Docker על פרסום פורטים, מיפוי בלי כתובת יכול להאזין בכל ממשקי המארח. כשהכתובת 127.0.0.1 מופיעה ראשונה, המעבדה נגישה רק מהמחשב שלך.

הדגל --rm מסיר את הקונטיינר כשהוא נעצר. הפקודה רצה ב-foreground, כך שהטרמינל ממשיך להדפיס לוגים עד שעוצרים אותה. ההרצה הראשונה מורידה את ה-image, וזה יכול לקחת זמן.

פותחים את http://127.0.0.1:3000 בדפדפן באותו מחשב. אמור להופיע דף הבית של Juice Shop. אם הוא לא נטען, קוראים את השגיאות בטרמינל, ואז מריצים docker ps בטרמינל שני כדי לוודא שהקונטיינר רץ ושמיפוי הפורטים נכון. לקוחות VPN, פרוקסים ורשתות של מכונות וירטואליות יכולים לשנות את התנהגות התעבורה המקומית, ולכן כדאי לבדוק גם אותם לפני שמשנים דגלים.

אין להחליף את 127.0.0.1 בכתובת 0.0.0.0 כדי שהדף ייטען. ההגדרה הזו חושפת את המעבדה למכשירים אחרים ברשת שלך.

3. צפייה בטעינת דף תמימה אחת

לפני שמנסים אתגר כלשהו, כדאי לראות איך הדפדפן והשרת מדברים. פותחים את כלי המפתחים, עוברים ללשונית Network וטוענים מחדש את הדף. בוחרים בקשה אחת ורושמים:

  • את מתודת הבקשה, למשל GET;
  • את קוד הסטטוס של התגובה;
  • כותרת תגובה אחת, למשל Content-Type;
  • את ההבדל בין מסמך ה-HTML לקובץ JavaScript.

אפשר לקבל את אותו מידע מהטרמינל:

bash
curl -I http://127.0.0.1:3000

ב-Windows PowerShell 5.1, הפקודה curl היא כינוי לפקודה אחרת, ולכן צריך להקליד curl.exe במקומה.

האפשרות -I שולחת בקשת HEAD ומדפיסה רק את כותרות התגובה. RFC 9110 מגדיר את המתודות, קודי הסטטוס ושדות הכותרת שרואים כאן. אלה השורות הראשונות של מה שה-image ללא התגית החזיר בהרצה אחת (2026-11-08). גרסאות אחרות עשויות להיות שונות:

text
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Content-Type: text/html; charset=UTF-8

רושמים מה השרת שלך מחזיר ומשווים.

תיעוד הפרויקט מתאר את אתגרי התרגול ואת הרמזים שלהם. כדאי לקרוא את החומר הזה לפני שמנסים אקספלויט, ולכוון כל בדיקה אל 127.0.0.1. היכרות מוקדמת עם מחזור הבקשה והתגובה מקלה על הערכת תוצאות של סורקים בהמשך, כי אפשר לראות את התעבורה שהכלים האלה שולחים ומקבלים.

4. עצירה והסרה של המעבדה

אם הקונטיינר רץ ב-foreground, לוחצים Ctrl+C בטרמינל שלו. מאחר שהשתמשת בדגל --rm, Docker מסיר את הקונטיינר ברגע שהוא נעצר.

אם הטרמינל הזה אבד, עוצרים את הקונטיינר מטרמינל אחר:

bash
docker stop juice-shop-lab

Docker שולח אות עצירה ומחכה שהקונטיינר יצא. מוודאים שהמעבדה ירדה:

bash
docker ps

אם שם הקונטיינר לא מופיע ברשימה, המעבדה עצורה. סגירת לשונית הדפדפן לא עוצרת את הקונטיינר, ולכן צריך לבדוק עם docker ps בכל פעם.

בעיות נפוצות

אם הפורט כבר תפוס, הפקודה docker run נכשלת עם Bind for 127.0.0.1:3000 failed: port is already allocated. בוחרים פורט מארח אחר, למשל -p 127.0.0.1:3001:3000, ופותחים במקום זאת את http://127.0.0.1:3001. את החלק 127.0.0.1 משאירים.

אם הקונטיינר יוצא מיד, קוראים את הלוגים בטרמינל. צריך לחפש את שורת השגיאה הראשונה, ולא את האחרונה.

אם ההרצה הראשונה לוקחת הרבה זמן, Docker מוריד את ה-image ואת השכבות שלו. הרצות מאוחרות יותר מתחילות מהר יותר כי Docker שומר את ה-image מקומית.

איפה מודל שפה נכנס לתמונה

מודל שפה יכול להסביר קוד סטטוס או לעזור לסדר את ההערות שלך, ו-NotHoly הוא מקום אחד להריץ את זה. הוא גם יכול לטעות לגבי המשמעות של תגובה, והוא לא מחליף הרשאה בכתב או אימות ידני. מדביקים רק פלט מהמעבדה שלך, ולעולם לא עוגיות סשן, טוקנים או נתונים מיעד אמיתי.

כותבים את ההערות לפי מה שנצפה בפועל, ואז משווים אותן למקורות שלמטה.

מקורות

מקורות

  1. OWASP Juice Shop project
  2. OWASP Juice Shop documentation
  3. Docker port publishing
  4. docker container run reference
  5. docker container stop reference
  6. RFC 9110, HTTP Semantics
  7. OWASP Top 10

עוד בנושא מעבדות האקינג

מעבדות האקינג

למה להשתמש ב-NotHoly ל-CTF ולמעבדות

מודל שכותב את ה-exploit לאתגר שלכם ומסביר למה הוא עובד, triage סטטי לבינארי, ו-solve שרץ במעבדה שלכם, לא אצלנו.

ביניים2 דקות קריאה

מעבדות האקינג

איך ליצור רשת Docker מבודדת למעבדה שלך

בניית רשת Docker בלי גישה לאינטרנט, הרצת OWASP Juice Shop עליה ופרסום עותק לדפדפן רק על 127.0.0.1, עם אימות של כל שלב.

מתחילים10 דקות קריאה

מעבדות האקינג

איך כותבים דוח פנטסט טוב

מבנה של דוח פנטסט וכתיבת ממצא אחד שמישהו אחר יכול לשחזר, עם ראיות, השפעה, וקטור CVSS v4.0 ותיקון.

ביניים7 דקות קריאה