מעבדות האקינג
למה להשתמש ב-NotHoly ל-CTF ולמעבדות
מודל שכותב את ה-exploit לאתגר שלכם ומסביר למה הוא עובד, triage סטטי לבינארי, ו-solve שרץ במעבדה שלכם, לא אצלנו.
מריצים את OWASP Juice Shop בקונטיינר Docker שקשור למחשב שלך, מוודאים שהוא מגיב ועוצרים אותו בצורה נקייה.
OWASP Juice Shop היא אפליקציית ווב פגיעה בכוונה. אפשר להריץ אותה בקונטיינר Docker על המחשב שלך, לפתוח אותה בדפדפן בכתובת http://127.0.0.1:3000, ולתרגל עליה אבטחת ווב בלי לגעת במערכות של אף אחד אחר. לפי הפרויקט, היא כוללת חולשות מכל ה-OWASP Top Ten, וגם אחרות שנמצאו באפליקציות אמיתיות. בהמשך מופיעות הפקודות, מה לבדוק אחרי כל אחת, איך שומרים על הפורט פרטי ואיך עוצרים את המעבדה.
Juice Shop מכילה ליקויים בכוונה. צריך להשאיר אותה על מחשב ורשת שבשליטתך, ולעולם לא לחשוף אותה לאינטרנט.
מריצים בטרמינל את שתי הפקודות האלה:
docker --version
docker infoהפקודה הראשונה מדפיסה את גרסת ה-CLI של Docker. השנייה פונה למנוע של Docker ומדפיסה את התצורה שלו. אם הפקודה docker info מדווחת שאין לה חיבור ל-daemon, מפעילים את Docker Desktop או את שירות Docker ומריצים שוב. הנוסח המדויק של השגיאה תלוי בפלטפורמה, ולכן אם התיקון לא ברור, כדאי לעבור לתיעוד ההתקנה של Docker.
תיעוד הפרויקט נוקב ב-image בשם bkimminich/juice-shop. ה-README של הפרויקט מריץ אותו בלי תגית, ואז נמשכת התגית latest. למעבדה שאפשר לשחזר, בוחרים תגית של גרסה בעמוד ה-Docker Hub ומוסיפים אותה לשם ה-image (bkimminich/juice-shop:<tag>), וכך ברור איזו גרסה נבדקת.
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 כדי שהדף ייטען. ההגדרה הזו חושפת את המעבדה למכשירים אחרים ברשת שלך.
לפני שמנסים אתגר כלשהו, כדאי לראות איך הדפדפן והשרת מדברים. פותחים את כלי המפתחים, עוברים ללשונית Network וטוענים מחדש את הדף. בוחרים בקשה אחת ורושמים:
Content-Type;אפשר לקבל את אותו מידע מהטרמינל:
curl -I http://127.0.0.1:3000ב-Windows PowerShell 5.1, הפקודה curl היא כינוי לפקודה אחרת, ולכן צריך להקליד curl.exe במקומה.
האפשרות -I שולחת בקשת HEAD ומדפיסה רק את כותרות התגובה. RFC 9110 מגדיר את המתודות, קודי הסטטוס ושדות הכותרת שרואים כאן. אלה השורות הראשונות של מה שה-image ללא התגית החזיר בהרצה אחת (2026-11-08). גרסאות אחרות עשויות להיות שונות:
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. היכרות מוקדמת עם מחזור הבקשה והתגובה מקלה על הערכת תוצאות של סורקים בהמשך, כי אפשר לראות את התעבורה שהכלים האלה שולחים ומקבלים.
אם הקונטיינר רץ ב-foreground, לוחצים Ctrl+C בטרמינל שלו. מאחר שהשתמשת בדגל --rm, Docker מסיר את הקונטיינר ברגע שהוא נעצר.
אם הטרמינל הזה אבד, עוצרים את הקונטיינר מטרמינל אחר:
docker stop juice-shop-labDocker שולח אות עצירה ומחכה שהקונטיינר יצא. מוודאים שהמעבדה ירדה:
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 הוא מקום אחד להריץ את זה. הוא גם יכול לטעות לגבי המשמעות של תגובה, והוא לא מחליף הרשאה בכתב או אימות ידני. מדביקים רק פלט מהמעבדה שלך, ולעולם לא עוגיות סשן, טוקנים או נתונים מיעד אמיתי.
כותבים את ההערות לפי מה שנצפה בפועל, ואז משווים אותן למקורות שלמטה.
מעבדות האקינג
מודל שכותב את ה-exploit לאתגר שלכם ומסביר למה הוא עובד, triage סטטי לבינארי, ו-solve שרץ במעבדה שלכם, לא אצלנו.
מעבדות האקינג
בניית רשת Docker בלי גישה לאינטרנט, הרצת OWASP Juice Shop עליה ופרסום עותק לדפדפן רק על 127.0.0.1, עם אימות של כל שלב.
מעבדות האקינג
מבנה של דוח פנטסט וכתיבת ממצא אחד שמישהו אחר יכול לשחזר, עם ראיות, השפעה, וקטור CVSS v4.0 ותיקון.