123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- #!/usr/bin/env python
- # -*- encoding: utf-8 -*-
- '''
- @File : chromepass.py
- @Time : 2019/07/11 07:24:03
- @Author : Liuyuqi
- @Version : 1.0
- @Contact : liuyuqi.gov@msn.cn
- @License : (C)Copyright 2019
- @Desc : Chrome密码提取
- pip install pywin32
- python chromepass.py -d
- '''
- import argparse
- import json
- import os
- import sqlite3
- import sys
- try:
- import win32crypt
- except:
- pass
- def args_parser():
- parser = argparse.ArgumentParser(
- description="Retrieve Google Chrome Passwords")
- parser.add_argument("-o", "--output", choices=['csv', 'json'],
- help="Output passwords to [ CSV | JSON ] format.")
- parser.add_argument(
- "-d", "--dump", help="Dump passwords to stdout. ", action="store_true")
- args = parser.parse_args()
- res = main()
- if args.dump:
- for data in res:
- print(data)
- if args.output == 'csv':
- output_csv(res)
- return
- if args.output == 'json':
- output_json(res)
- return
- else:
- parser.print_help()
- def main():
- info_list = []
- path = getpath()
- try:
- connection = sqlite3.connect(path + "Login Data")
- with connection:
- cursor = connection.cursor()
- v = cursor.execute(
- 'SELECT action_url, username_value, password_value FROM logins')
- value = v.fetchall()
- if (os.name == "posix") and (sys.platform == "darwin"):
- print("Mac OSX not supported.")
- sys.exit(0)
- for origin_url, username, password in value:
- if os.name == 'nt':
- password = win32crypt.CryptUnprotectData(
- password, None, None, None, 0)[1]
- if password:
- info_list.append({
- 'origin_url': origin_url,
- 'username': username,
- 'password': str(password)
- })
- except Exception as e:
- e = str(e)
- if (e == 'database is locked'):
- print('[!] Make sure Google Chrome is not running in the background')
- elif (e == 'no such table: logins'):
- print('[!] Something wrong with the database name')
- elif (e == 'unable to open database file'):
- print('[!] Something wrong with the database path')
- elif (e == "name win32crypt is not defined"):
- print("win32crypt error")
- else:
- print(e)
- sys.exit(0)
- return info_list
- def getpath():
- if os.name == "nt":
- # This is the Windows Path
- PathName = os.getenv('localappdata') + \
- '\\Google\\Chrome\\User Data\\Default\\'
- elif os.name == "posix":
- PathName = os.getenv('HOME')
- if sys.platform == "darwin":
- # This is the OS X Path
- PathName += '/Library/Application Support/Google/Chrome/Default/'
- else:
- # This is the Linux Path
- PathName += '/.config/google-chrome/Default/'
- if not os.path.isdir(PathName):
- print('[!] Chrome Doesn\'t exists')
- sys.exit(0)
- return PathName
- def output_csv(info):
- try:
- with open('chromepass-passwords.csv', 'wb') as csv_file:
- csv_file.write('origin_url,username,password \n'.encode('utf-8'))
- for data in info:
- csv_file.write(('%s, %s, %s \n' % (data['origin_url'], data[
- 'username'], data['password'])).encode('utf-8'))
- print("Data written to chromepass-passwords.csv")
- except EnvironmentError:
- print('EnvironmentError: cannot write data')
- def output_json(info):
- try:
- with open('chromepass-passwords.json', 'w') as json_file:
- json.dump({'password_items':info},json_file)
- print("Data written to chromepass-passwords.json")
- except EnvironmentError:
- print('EnvironmentError: cannot write data')
- if __name__ == '__main__':
- args_parser()
|