מבוא לאבטחת מידע: Brute force

טכניקת פריצה שמשמשת לגילוי סיסמאות.

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

במאמר הקודם דיברנו על XSS

התקפת ברוט פורס (באנגלית 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()

ואם אני אריץ את זה – זה יראה כך:

4315
4315
4316
4316
4317
4317
4318
4318
4319
4319
4320
4320
4321
4321
The password for example.pdf is 4321.

אני כמובן יכול להפעיל אלגוריתם אחר על מנת לעבוד גם עם ססמאות מסובכות יותר. כאלו המורכבות גם מאותיות וגם מתוים מיוחדים.

התקפה מילונית

ברוט פורס לא חייב להיות עם ניחוש רנדומלי של סיסמה. אני יכול לנסות (למשל) את מיליון הסיסמאות הנפוצות ביותר בעולם. כדי לחסוך בזמן. יש קבצים שונים עם ססמאות מאוד נפוצות ואפשר, במקום לנסות ולנחש, לנסות את הססמאות האלו. כן, אם חשבתם למשל ש Q1W2E3R4 זה משהו שרק אתם חשבתם עליו… אז לא. הנה למשל קובץ של 10,000 הסיסמאות הנפוצות ביותר בעולם. נסו לראות עד כמה אתם יצירתיים.

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

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

ברוטפורס בסביבת אינטרנט

ברוטפורס קל להפעלה כאשר אנו מנסים לפרוץ או לתקוף משאב במערכת המקומית שלנו. קובץ PDF למשל הוא קל לתקיפה, כי כדי לנסות אם הסיסמה תקינה, כל מה שאני צריך לעשות זה לנסות לפתוח את הקובץ ואז אני מוגבל למהירות החישוב של המחשב שלי (אם אני שם את הקובץ בזכרון). אבל כשאני מנסה לפצח סיסמה בממשק אינטרנט, אני מוגבל כי אני ניגש למשאב מרוחק – כלומר אתר האינטרנט שבו יש את הסיסמה שאותה אני רוצה לפצח. קריאה לאתר האינטרנט לוקחת זמן, קבלת המידע לוקחת זמן. נכון, למשתמש רגיל הזמן הזה לא נראה בעין (נניח 100 מילישניות באתרים טובים) אבל בואו נראה מה האימפקט של הזמן. נניח ואני צריך לנחש סיסמה במקסימום 100,000 ניחושים. אם המשאב על המחשב שלי (למשל קובץ PDF) ולוקח לי 10 מילישניות לקרוא לקובץ ולפתוח אותו. יקח לי 100 ניחושים בשניה – אלף שניות לפצח את הכל – כלומר 16 דקות. אם זה על אתר אינטרנט ונניח לוקח לי 500 מילישניות לנסות את הסיסמה ולראות אם היא תקינה, הזמן שיקח לי הוא 13.8 שעות. זה הפרש מטורף לגמרי – וזה בהנחה שלא יגלו אותי. 100,000 ניסיונות הם מספר רב של כניסות שעלול לגרום אפילו לאתר להפסיק לעבוד או להסב את תשומת לב בעל האתר שיש פה בעיה כלשהי. זו הסיבה שברוט פורס נחשב כלא ישים בסביבת אינטרנט אלא אם כן הסיסמה קצרה במיוחד.

יש לפעמים מצב שבו אנו נכנסים לאתר עם סמס. אנו מזינים את מספר הטלפון שלנו ונשלח אלינו סמס עם קוד מספרי קצר. זה קוד שניתן לנחש אותו במספר קטן של ניסיונות (אתם מוזמנים לקרוא את המאמר על האנטרוטפיה ולחשב את מספר הססמאות לקוד מספרי בלבד של 5 ספרות למשל). ניתן לבצע ברוט פורס על הסיסמה ״הזמנית״. זו הסיבה שבדרך כלל התוקף של הקוד הוא קצר.

הסיכון שיש בפרצה הזו

הסיכון הוא שתוקף יצליח להשיג גישה למשאב שהוא לא אמור להשיג אליו גישה. קובץ PDF סגור בסיסמה מסיבה מסוימת. אתר גם כן סגור בסיסמה מאותה סיבה – שיש בהם מידע שאנו לא רוצים שיגיע לאדם לא מורשה. התקפת ברוט פורס מאפשרת לתוקף לנחש את הסיסמה. גם ניחוש מוצלח של סיסמה מאפשר להשתמש בה אם הקורבן השתמש בה במקומות נוספים.

איך מונעים ברוטפורס?

באינטרנט:

  1. אם אדם טועה יותר מכמה פעמים בסיסמתו – מונעים ממנו להכניס ססמאות נוספות ופותחים את הממשק רק אחרי פרק זמן מסוים.
  2. הוספת CAPTCHA לטופס הזנת הסיסמה על מנת לוודא שמדובר באדם אנושי.
  3. חיוב המשתמשים להזין סיסמה חזקה.
  4. ברגע קביעת הסיסמה – בדיקה שהסיסמה שהמשתמש קבע אינה נמצאת בסדרת הססמאות הנפוצות ואם כן למנוע ממנו לקבוע אותה.
  5. במידה ויש לנו אימות דו שלבי או אימות עם סמס – וידוא שטקסט האימות שנשלח ללקוח מתאפס אחרי פרק זמן קצר.
  6. הוספת כלי ניטור לממשק האינטרנט על מנת לוודא שאין מישהו ששולח מאה אלף בקשות לממשק הסיסמה.

מקרים של ברוטפורס

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

לקריאה נוספת

התקפת Brute Force עם Node.js

מאמר על ברוטפורס בבלוג המצוין CamelCase המיועד למפתחים

פוסטים נוספים שכדאי לקרוא

פתרונות ומאמרים על פיתוח אינטרנט

רינדור של קליינט סייד עם SSR

הסבר קצר על SSR מול רינדור קלאסי ולא. לא תמיד זה טוב להשתמש בו. אין כדור כסף שיכול לפתור הכל.

גלילה לראש העמוד