OWASPIL Break The Captcha - Nightmare
בדומה לאתגר הקודם, הפעם מפתח האתר חיזק את האבטחה שלו והטמיע מנגנון יותר מסובך ל-Captcha שלו ואף הוסיף תרגיל מתמטי. המטרה שלנו באתגר היא לעקוף את שני המנגנונים ובכל זאת להציף את הטופס שלו באמצעות קוד.
עלינו לפתור 15 אתגרי captcha ב-30 שניות, רק שהפעם מדובר באתגר המשך ודרגת הקושי של האתגר עלתה.
פתרון האתגר:
האתגר נראה כך:

על מנת לפתור את האתגר, שכללנו את הסקריפט מהאתגר הקודם אשר יכול לפענח את התמונה ולהוציא ממנה את הטקסט.
כדי שיהיה ניתן להוציא את הטקסט עלינו תחילה לעבד את ה-captcha, בצענו מספר בקשות ושמרנו את כל תמונות ה-captcha שהורדנו מהשרת.
ניתן היה לראות שכולן מכילות טקסט בצבע ורקע משתנה בכל בקשה ואף מתווספים פסים שחורים על גבי הטקסט על מנת להקשות עלינו.
שכלול הסקריפט התבטא בעיקר בביצוע המרה של הצבעים בתמונה באופן הבא:
1. במידה והפיקסל לבן נחליף אותו לשחור.
2. במידה והפיקסל מכיל צבע כלשהו נחליף אותו ללבן.
חשוב לציין כי המודול pytesseract קורא טקסט באופן מיטבי כאשר הטקסט בצבע שחור על גבי רקע לבן ולכן לשנות רק את הרקע לשחור ולהשאיר את הטקסט לבן לא יעזור לנו. הקוד המרכזי לניתוח התמונה נראה כך:

לינק לקוד ב-Github שלי
הסבר לסקריפט:
לאחר ניתוח התמונה שמנו לב שלפעמים ה-text שחוזר מכיל תווים שאינם אותיות ומספרים ואינם מופיעים בפועל ב-captcha זאת בעיה במנגנון אבחון של pytesseract ולכן כתבנו פקודת lambda שמנקה את הקוד מסימנים מיוחדים ומשאירה רק תווים ומספרים.
אופטימיזציה נוספת שבצענו היא חיתוך התמונה לפי רוחב הטקסט שהינו קבוע בכל התמונות על מנת לאפשר למנגנון ה-OCR של pytesseract לאבחן את הטקסט בצורה מיטבית.
לאחר שהצלחנו לנתח, מכאן הדרך לפתרון האתגר פשוטה:
1. מושכים את התרגיל המתמטי מהדף על ידי שליחת בקשה לכתובת:
`
http://challenges.owaspil.ctf.today:8085/
התרגיל נשלף ע"י ביטוי רגולרי.
2. מושכים את ה-captcha מהדף על ידי שליחת בקשה לדף בכתובת:
`
http://challenges.owaspil.ctf.today:8085/captcha.php
ומורידים את התמונה.
3. מוציאים את הטקסט מהתמונה על ידי שימוש בפונקציה ()fix_captcha אשר משתמשת בקוד שהצגנו קודם לכן.
4. שולחים את הבקשה עם כל הנתונים לשרת ומנתחים את התוצאה.
אם התוצאה מכילה את התווים {} הצלחנו לפתור את האתגר.
הקוד המלא נראה כך:



הרצנו את הקוד:

וכך קבלנו את הדגל:
`
OWASP-IL{I_4M_Th3_0CR_N1nj4!}