小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Windows下用Python3解密Chrome的Cookie值

 中間件 2021-06-30

目錄

 

0. 前言

1.參考文獻

2.分析

3.流程

4.代碼

4.1 代碼結(jié)構

4.2 aesgcm.py

4.3 chromeCookieJar.py

4.4 decrypt.py

4.5 main.py

5.結(jié)果


0. 前言

上篇博客寫了用scrapy去爬取微博的評論,里面說到了不帶cookie值去爬,微博可能會把你當成游客,無法正確爬取數(shù)據(jù)

Cookie(百度百科):Cookie,有時也用其復數(shù)形式 Cookies。類型為“小型文本文件”,是某些網(wǎng)站為了辨別用戶身份,進行Session跟蹤而儲存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密),由用戶客戶端計算機暫時或永久保存的信息

其實就是帶cookie發(fā)起請求,讓服務器識別到你的身份,這樣他就不會當成游客處理了

本來之前一直很反感微博亂點贊,亂關注別人這樣的現(xiàn)象

沒想到,在寫完博客之后,這樣的情況再次又雙叕降臨到了我自己頭上,好家伙我直接好家伙

本來想著忍他幾天,結(jié)果幾天之后還是在給奇怪的人點贊,氣的我直接給他來了一手改密碼,成功制止了這樣的現(xiàn)象繼續(xù)發(fā)生


1.參考文獻

首先參考文獻寫在前面,表示尊重

其次,在這次之前,本人對于算法這一類的東西是十分頭疼的,經(jīng)過這一次學習之后,其實也是知其然而不知其所以然,所以將更好、更有用的參考的鏈接放在前面,要是想學到更多的同學可以直接點擊鏈接學習

我的代碼主要參考Chrome 80.X版本如何解密Cookies文件

其實我只是簡化了他的代碼,刪除了一些我不需要用到的代碼,方便學習

原理類的文章可以看

滲透技巧——導出Chrome瀏覽器中保存的密碼

手把手用C++解密Chrome80版本數(shù)據(jù)庫

CSRF攻擊與防御(寫得非常好)


2.分析

我個人喜歡將這一類問題歸到CSRF下,

CSRF跨站點請求偽造(Cross—Site Request Forgery),跟XSS攻擊一樣,存在巨大的危害性,你可以這樣來理解:攻擊者盜用了你的身份,以你的名義發(fā)送惡意請求,對服務器來說這個請求是完全合法的,但是卻完成了攻擊者所期望的一個操作,比如以你的名義發(fā)送郵件、發(fā)消息,盜取你的賬號,添加系統(tǒng)管理員,甚至于購買商品、虛擬貨幣轉(zhuǎn)賬等

實際上歸屬于哪一類的問題還得看大家是怎么定義的

這一篇文章不打算具體分析是怎么完成攻擊的

因為在試圖溯源的時候,看了有沒有可疑進程在后臺運行,沒有發(fā)現(xiàn)

然后想起了這臺電腦一開始chrome瀏覽器首頁都是一些奇怪的360導航之類的,恢復正常之后,不記得怎么讓他打開這些導航了,這樣就不好復現(xiàn)了

但是個人猜測可能是由于這些惡意程序造成的,可能加載了一些惡意dll啊、或者啟動了一些與惡意服務器通訊的后門,獲取了瀏覽器保存的cookie值

然后拿去給別人點贊

這里就不多猜測了

所以本文主要學習、記錄的內(nèi)容是,假如別人獲得了保存在你本地的cookie文件的內(nèi)容,怎么解密還原出cookie值,并加以利用


3.流程

chrome本地cookie以sqlite的形式保存,用Navicat查看是這樣的

其中encrypted_value就是加密后的值

分析一下chrome保存的cookie的加解密流程,結(jié)合文獻和代碼來看

首先在今年(2020年)更新之前,chrome的cookie可以通過dpapi直接解密

今年改版更新之后的解密流程:

以上截圖引用來自參考文獻中

關于詳細的算法說明我沒有找到詳細的文章,有興趣的同學也許可以查找一下源碼,進一步學習


4.代碼

4.1 代碼結(jié)構

4.2 aesgcm.py

  1. from cryptography.hazmat.backends import default_backend
  2. from cryptography.hazmat.primitives.ciphers import (
  3. Cipher, algorithms, modes
  4. )
  5. NONCE_BYTE_SIZE = 12
  6. def encrypt(cipher, plaintext, nonce):
  7. cipher.mode = modes.GCM(nonce)
  8. encryptor = cipher.encryptor()
  9. ciphertext = encryptor.update(plaintext)
  10. return (cipher, ciphertext, nonce)
  11. def decrypt(cipher, ciphertext, nonce):
  12. cipher.mode = modes.GCM(nonce)
  13. decryptor = cipher.decryptor()
  14. return decryptor.update(ciphertext)
  15. def get_cipher(key):
  16. cipher = Cipher(
  17. algorithms.AES(key),
  18. None,
  19. backend=default_backend()
  20. )
  21. return cipher

4.3 chromeCookieJar.py

  1. import http.cookiejar as cookiejar
  2. import os
  3. import sqlite3
  4. from decrypt import chrome_decrypt
  5. from decrypt import to_epoch
  6. class chromeCookieJar(cookiejar.FileCookieJar):
  7. # 重寫__init__方法
  8. def __init__(self, fileName=None, delayload=False, policy=None):
  9. if fileName is None:
  10. fileName = os.path.join(
  11. os.environ['USERPROFILE'],
  12. r'AppData\Local\Google\Chrome\User Data\default\Cookies')
  13. if not os.path.exists(fileName):
  14. fileName = None
  15. cookiejar.FileCookieJar.__init__(self, fileName, delayload, policy)
  16. def printCookie(self, name, value, host, path):
  17. print(name + '\t' + value + '\t' + host + '\t' + path + '\t')
  18. # 重寫_really_load方法
  19. # ignore_discard: save even cookies set to be discarded.
  20. # ignore_expires: save even cookies that have expired.The file is overwritten if it already exists
  21. def _really_load(self, f, filename, ignore_discard, ignore_expires):
  22. con = sqlite3.connect(filename)
  23. con.row_factory = sqlite3.Row
  24. con.create_function('decrypt', 1, chrome_decrypt)
  25. con.create_function('to_epoch', 1, to_epoch)
  26. cur = con.cursor()
  27. # 這個sql我只查了weibo相關的,如果有其他需要可以修改
  28. sql = """
  29. SELECT
  30. host_key, name, path,encrypted_value as value
  31. FROM
  32. cookies
  33. where host_key like '%weibo%'
  34. """
  35. cur.execute(sql)
  36. for row in cur:
  37. if row['value'] is not None:
  38. name = str(row['name'])
  39. value = str(chrome_decrypt(row['value']))
  40. host = str(row['host_key'])
  41. path = str(row['path'])
  42. self.printCookie(name, value, host, path)
  43. cur.close()

4.4 decrypt.py

  1. import os
  2. import sys
  3. import json, base64
  4. import aesgcm
  5. def get_key_from_local_state():
  6. jsn = None
  7. with open(os.path.join(os.environ['LOCALAPPDATA'],
  8. r"Google\Chrome\User Data\Local State"), encoding='utf-8', mode="r") as f:
  9. jsn = json.loads(str(f.readline()))
  10. return jsn["os_crypt"]["encrypted_key"]
  11. def dpapi_decrypt(encrypted):
  12. import ctypes
  13. from ctypes import wintypes
  14. class DATA_BLOB(ctypes.Structure):
  15. _fields_ = [('cbData', wintypes.DWORD),
  16. ('pbData', ctypes.POINTER(ctypes.c_char))]
  17. p = ctypes.create_string_buffer(encrypted, len(encrypted))
  18. blobin = DATA_BLOB(ctypes.sizeof(p), p)
  19. blobout = DATA_BLOB()
  20. retval = ctypes.windll.crypt32.CryptUnprotectData(
  21. ctypes.byref(blobin), # pDataIn 輸入,一個指向存有加密內(nèi)容DATA_BLOB的指針,
  22. None, # ppszDataDescr
  23. None, # pOptionalEntropy
  24. None, # pvReversed 這個保留參數(shù)must be set to NULL
  25. None, # pPromptStruct
  26. 0, # dwFlags 一個DWORD值指定此函數(shù)特定的選項
  27. ctypes.byref(blobout) # 輸出
  28. )
  29. if not retval:
  30. raise ctypes.WinError()
  31. result = ctypes.string_at(blobout.pbData, blobout.cbData)
  32. ctypes.windll.kernel32.LocalFree(blobout.pbData)
  33. return result
  34. def aes_decrypt(encrypted_txt):
  35. #獲得encode_key
  36. encode_key = get_key_from_local_state()
  37. #解碼
  38. encrypted_key = base64.b64decode(encode_key.encode())
  39. #去除前五個字符
  40. encrypted_key = encrypted_key[5:]
  41. #dpapi解密,得到key
  42. key = dpapi_decrypt(encrypted_key)
  43. #截取Nonce
  44. nonce = encrypted_txt[3:15]
  45. #關于aesgcm加密算法,沒有找到合適詳細的文章
  46. #這里不多展開,有興趣的同學可以自己找一下
  47. #解密key
  48. cipher = aesgcm.get_cipher(key)
  49. return aesgcm.decrypt(cipher, encrypted_txt[15:], nonce)
  50. def chrome_decrypt(encrypted_txt):
  51. try:
  52. if encrypted_txt[:3] == b'v10':
  53. decrypted_txt = aes_decrypt(encrypted_txt)
  54. return decrypted_txt[:-16].decode()
  55. except Exception as e:
  56. print("chrome_decrypt error :" + e)
  57. return None
  58. def to_epoch(chrome_ts):
  59. if chrome_ts:
  60. return chrome_ts - 11644473600 * 000 * 1000
  61. else:
  62. return None

4.5 main.py

  1. from chromeCookieJar import chromeCookieJar
  2. if __name__ == '__main__':
  3. jar = chromeCookieJar()
  4. jar.load()
  5. for cookie in jar:
  6. print(vars(cookie))

5.結(jié)果

經(jīng)過對比,結(jié)果一致

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多