אני מלמד מבוא לאבטחת מידע בקריה האקדמית אונו וגם במקומות אחרים ואיכשהו תמיד חסרים לי מאמרים שאני יכול לשלוח לסטודנטים המסבירים למי שלומד מדעי המחשב דברים בסיסיים באבטחת מידע ובעברית. יש לא מעט מאמרים (אשתדל לתת קישורים איפה שיש) עם הסברים אבל רוב ההסברים מיועדים לאנשים שלומדים אבטחת מידע או יודעים כבר תכנות ומכילים כבר מונחים מהתחום שפחות רלוונטיים לאנשים שצריכים ללמוד את המבוא. אז כדי לעזור לעצמי, אני מתחיל בסדרת מאמרים שמסבירים מונחים בסיסיים באבטחת מידע ובדגש על ווב ופיתוח ומה שמפתחים מתחילים צריכים לדעת.
התקפת ברוט פורס (באנגלית Brute Force) היא התקפה בסיסית וקלה להבנה. אני אפרט עליה ואפרט על מתי היא רלוונטית.
בגדול ברוטפורס מאפשרת לתוקף למצוא סיסמה של משאב מסוים. כשאנו אומרים משאב אנו מתכוונים למשל לקובץ שיש לו ומוצפן בסיסמה, לאתר אינטרנט כאשר שם המשתמש ידוע או לממשק גישה אחר שבו יש סיסמה שלא ידועה לתוקף והוא צריך לנחש אותה. ההתקפה נשענת על העובדה שמחשב לא צריך להשתמש ב-UI או במקלדת כדי לנחש סיסמה או פריט מידע מסוים. הוא יכול לבדוק את כל הצירופים האפשריים במהירות. למשל, אם אני יודע שהסיסמה היא ספרות בלבד והיא באורך של 4 ספרות, המחשב יכול ליצור רצף של ססמאות:
0001
0002
0003
0004
0005
…
…
9998
9999
ולנסות את כולן.
זה שימושי במיוחד אם אנו מנסים לפצח סיסמה מקומית. למשל קובץ PDF עם סיסמה. הנה למשל סקריפט פייתון שיכול לפצח את הסיסמה של PDF שאנו יודעים שהסיסמה מורכבת מ-4 ספרות.
from pypdf import PdfReader
filename = 'example.pdf'
# Loop through all possible 4-digit passwords
for i in range(10000):
password = f'{i:04}' # Format the password with leading zeros
print(password)
pdf_file = open(filename, 'rb')
# Create a PDF reader object
pdf_reader = PdfReader(pdf_file)
# Check if the PDF file is encrypted
if pdf_reader.is_encrypted:
# Attempt to decrypt the PDF file using the password
print(password)
if pdf_reader.decrypt(password) != 0:
# If the password is correct, print the password and exit
print(f'The password for {filename} is {password}.')
break
# Close the PDF file
pdf_file.close()
ואם אני אריץ את זה – זה יראה כך:
אני כמובן יכול להפעיל אלגוריתם אחר על מנת לעבוד גם עם ססמאות מסובכות יותר. כאלו המורכבות גם מאותיות וגם מתוים מיוחדים.
התקפה מילונית
ברוט פורס לא חייב להיות עם ניחוש רנדומלי של סיסמה. אני יכול לנסות (למשל) את מיליון הסיסמאות הנפוצות ביותר בעולם. כדי לחסוך בזמן. יש קבצים שונים עם ססמאות מאוד נפוצות ואפשר, במקום לנסות ולנחש, לנסות את הססמאות האלו. כן, אם חשבתם למשל ש Q1W2E3R4 זה משהו שרק אתם חשבתם עליו… אז לא. הנה למשל קובץ של 10,000 הסיסמאות הנפוצות ביותר בעולם. נסו לראות עד כמה אתם יצירתיים.
ההתקפה הזו נקראת התקפת Dictionary, כי אנו משתמשים במילון על מנת לבצע התקפה כזו. כתבתי מאמר בעברית על התקפת מילון שאפשר לקרוא פה.
אפשר להקשות או להפוך את הברוטפורס לקשה עם סיסמה קשה. מדוע? כי סיסמה ארוכה היא קשה יותר לניחוש. באופן אינטואטיבי אפשר להבין שסיסמה מ-6 תוים קלה יותר לניחוש מסיסמה עם 20 תוים. באופן המקצועי אנו קוראים לזה אנטרופיה. ככל שקשה יותר לנחש טקסט מסוים, כך הוא אנטרופי יותר. אפשר לחשב את האנטרופיה באופן פשוט ובמאמר הזה, בעברית, אני מסביר על אנטרופיה ואיך מחשבים אותה.
ברוטפורס בסביבת אינטרנט
ברוטפורס קל להפעלה כאשר אנו מנסים לפרוץ או לתקוף משאב במערכת המקומית שלנו. קובץ PDF למשל הוא קל לתקיפה, כי כדי לנסות אם הסיסמה תקינה, כל מה שאני צריך לעשות זה לנסות לפתוח את הקובץ ואז אני מוגבל למהירות החישוב של המחשב שלי (אם אני שם את הקובץ בזכרון). אבל כשאני מנסה לפצח סיסמה בממשק אינטרנט, אני מוגבל כי אני ניגש למשאב מרוחק – כלומר אתר האינטרנט שבו יש את הסיסמה שאותה אני רוצה לפצח. קריאה לאתר האינטרנט לוקחת זמן, קבלת המידע לוקחת זמן. נכון, למשתמש רגיל הזמן הזה לא נראה בעין (נניח 100 מילישניות באתרים טובים) אבל בואו נראה מה האימפקט של הזמן. נניח ואני צריך לנחש סיסמה במקסימום 100,000 ניחושים. אם המשאב על המחשב שלי (למשל קובץ PDF) ולוקח לי 10 מילישניות לקרוא לקובץ ולפתוח אותו. יקח לי 100 ניחושים בשניה – אלף שניות לפצח את הכל – כלומר 16 דקות. אם זה על אתר אינטרנט ונניח לוקח לי 500 מילישניות לנסות את הסיסמה ולראות אם היא תקינה, הזמן שיקח לי הוא 13.8 שעות. זה הפרש מטורף לגמרי – וזה בהנחה שלא יגלו אותי. 100,000 ניסיונות הם מספר רב של כניסות שעלול לגרום אפילו לאתר להפסיק לעבוד או להסב את תשומת לב בעל האתר שיש פה בעיה כלשהי. זו הסיבה שברוט פורס נחשב כלא ישים בסביבת אינטרנט אלא אם כן הסיסמה קצרה במיוחד.
יש לפעמים מצב שבו אנו נכנסים לאתר עם סמס. אנו מזינים את מספר הטלפון שלנו ונשלח אלינו סמס עם קוד מספרי קצר. זה קוד שניתן לנחש אותו במספר קטן של ניסיונות (אתם מוזמנים לקרוא את המאמר על האנטרוטפיה ולחשב את מספר הססמאות לקוד מספרי בלבד של 5 ספרות למשל). ניתן לבצע ברוט פורס על הסיסמה ״הזמנית״. זו הסיבה שבדרך כלל התוקף של הקוד הוא קצר.
הסיכון שיש בפרצה הזו
הסיכון הוא שתוקף יצליח להשיג גישה למשאב שהוא לא אמור להשיג אליו גישה. קובץ PDF סגור בסיסמה מסיבה מסוימת. אתר גם כן סגור בסיסמה מאותה סיבה – שיש בהם מידע שאנו לא רוצים שיגיע לאדם לא מורשה. התקפת ברוט פורס מאפשרת לתוקף לנחש את הסיסמה. גם ניחוש מוצלח של סיסמה מאפשר להשתמש בה אם הקורבן השתמש בה במקומות נוספים.
איך מונעים ברוטפורס?
באינטרנט:
- אם אדם טועה יותר מכמה פעמים בסיסמתו – מונעים ממנו להכניס ססמאות נוספות ופותחים את הממשק רק אחרי פרק זמן מסוים.
- הוספת CAPTCHA לטופס הזנת הסיסמה על מנת לוודא שמדובר באדם אנושי.
- חיוב המשתמשים להזין סיסמה חזקה.
- ברגע קביעת הסיסמה – בדיקה שהסיסמה שהמשתמש קבע אינה נמצאת בסדרת הססמאות הנפוצות ואם כן למנוע ממנו לקבוע אותה.
- במידה ויש לנו אימות דו שלבי או אימות עם סמס – וידוא שטקסט האימות שנשלח ללקוח מתאפס אחרי פרק זמן קצר.
- הוספת כלי ניטור לממשק האינטרנט על מנת לוודא שאין מישהו ששולח מאה אלף בקשות לממשק הסיסמה.
מקרים של ברוטפורס
המקרה של רמי לוי – שאיפשר באמצעות התקפת ברוט פורס פשוטה כניסה לחשבון של כל לקוח שלהם.
לקריאה נוספת
מאמר על ברוטפורס בבלוג המצוין CamelCase המיועד למפתחים