Инструмент на Python для расшифровки сохранённых паролей Firefox и Thunderbird (key3.db/key4.db + signons.sqlite/logins.json) без необходимости запускать сам браузер. Полезен при пост-эксплуатации для извлечения credentials с скомпрометированной машины.
git clone https://github.com/lclevy/firepwd.git cd firepwd pip install pycryptodome pyasn1 python firepwd.py -d /path/to/firefox/profile
31oct2025
Этот учебный инструмент был написан для демонстрации того, каким образом защищаются пароли Mozilla (Firefox, Thunderbird)
с использованием содержимого файлов key4.db (или key3.db), logins.json (или signons.sqlite).
Библиотека NSS НЕ используется. Используется только Python (PyCryptodome, pyasn1).
Этот код выпущен под лицензией GPL.
Теперь является частью проекта LaZagne: https://github.com/AlessandroZ/LaZagne
Вы также можете прочитать связанную статью на французском языке: http://connect.ed-diamond.com/MISC/MISC-069/Protection-des-mots-de-passe-par-Firefox-et-Thunderbird-analyse-par-la-pratique
или этот постер о криптографии паролей для key3.db и signons.sqlite.
key3.db, signons.sqlite)key3.db, logins.json)key4.db, logins.json)key4.db, logins.json)logins.json с использованием aes256 вместо 3deskey3.db читается напрямую, сторонний модуль Python bsddb НЕ требуется.
Файл firepwd.py распознается как "HackTool:Python/Stealer!AMTB" средством Microsoft Defender, что НЕ является ложным срабатыванием.
По умолчанию firepwd.py обрабатывает файлы key3.db (или key4.db) и signons.sqlite (logins.json) в текущей директории, но можно указать альтернативную директорию с помощью опции -d. Не забудьте символ '/' в конце.
Если был установлен главный пароль, укажите его с помощью опции -p.
-v) — от 0 (по умолчанию) до 2.$ python firepwd.py -h
Usage: firepwd.py [options]
Options:
-h, --help show this help message and exit
-v VERBOSE, --verbose=VERBOSE
verbose level
-p MASTERPASSWORD, --password=MASTERPASSWORD
masterPassword
-d DIRECTORY, --dir=DIRECTORY
directory
$ python firepwd.py -d /c/Users/lclevy/AppData/Roaming/Mozilla/Firefox/Profiles/o8syoe2h.default/
no stored passwords
$ python firepwd.py -p 'MISC*' -d mozilla_db/
SEQUENCE {
SEQUENCE {
OBJECTIDENTIFIER 1.2.840.113549.1.12.5.1.3
SEQUENCE {
OCTETSTRING a8db682ac51cfad8c06664fe9deb5283073b33ee
INTEGER 01
}
}
OCTETSTRING 72d5636049d4af9eeadaf7eb0dc1710a62d5362fe4086dcc0495e5ec8e96c23c56b72a552e17756141ae80854d6fd03ecdc2c8f83d2c02d4c3f36e7e2b906f2c70a8cf571a06666e53f241780f9e39815e7d840e97e434614ac20ec09002e861
}
decrypting privKeyData
SEQUENCE {
INTEGER 00
SEQUENCE {
OBJECTIDENTIFIER 1.2.840.113549.1.1.1
NULL 0
}
OCTETSTRING 3042020100021100f8000000000000000000000000000001020100021813c1e53d51a1e60bc79419f7d59107ef97976d075832a45b020100020100020100020100020115
}
decoding 3042020100021100f8000000000000000000000000000001020100021813c1e53d51a1e60bc79419f7d59107ef97976d075832a45b020100020100020100020100020115
SEQUENCE {
INTEGER 00
INTEGER 00f8000000000000000000000000000001
INTEGER 00
INTEGER 13c1e53d51a1e60bc79419f7d59107ef97976d075832a45b
INTEGER 00
INTEGER 00
INTEGER 00
INTEGER 00
INTEGER 15
}
decrypting login/password pairs
http://challenge01.root-me.org: 'login\x03\x03\x03' , 'password\x08\x08\x08\x08\x08\x08\x08\x08'
$ python firepwd.py -d /c/Users/laurent/AppData/Roaming/Thunderbird/Profiles/3luvewzm.default/
SEQUENCE {
SEQUENCE {
OBJECTIDENTIFIER 1.2.840.113549.1.12.5.1.3
SEQUENCE {
OCTETSTRING 10540ef85fb7e198d41884c8c9c90cf3bc065482
INTEGER 01
}
}
OCTETSTRING 082fe34f23eae209334d53be2c85ea62d0242a722d452da5b0f27e39dd2733f177c0dc55dd22635d6c8e61fc3e7dc44fe2f1cccef58a8f3138b2822b5a1db3bc39ee8e57c5f4bf05aaed8073eeaf2cd7fddffd6fbc1f5d05ee870f353861c952
}
decrypting privKeyData
SEQUENCE {
INTEGER 00
SEQUENCE {
OBJECTIDENTIFIER 1.2.840.113549.1.1.1
NULL 0
}
OCTETSTRING 3042020100021100f8000000000000000000000000000001020100021875a873cdb39783ecf1fedcea3d010dd9732a01a8b30451e9020100020100020100020100020115
}
decoding 3042020100021100f8000000000000000000000000000001020100021875a873cdb39783ecf1fedcea3d010dd9732a01a8b30451e9020100020100020100020100020115
SEQUENCE {
INTEGER 00
INTEGER 00f8000000000000000000000000000001
INTEGER 00
INTEGER 75a873cdb39783ecf1fedcea3d010dd9732a01a8b30451e9
INTEGER 00
INTEGER 00
INTEGER 00
INTEGER 00
INTEGER 15
}
decrypting login/password pairs
[censored]
$ python firepwd.py -d /c/Users/laurent/AppData/Roaming/Mozilla/Firefox/Profiles/77l7qxfi.default/
SEQUENCE {
SEQUENCE {
OBJECTIDENTIFIER 1.2.840.113549.1.12.5.1.3
SEQUENCE {
OCTETSTRING c6581e1fbdb50b4265ab11f54861fdbb62cb4abd
INTEGER 01
}
}
OCTETSTRING cecb819cb612dccfc2265121aa38ed5d4b7cfc6f06f92f4fb48305f1afb3234f02e25fcb8f3029c0d4aa8c9be7ef292fc3c7d2d446e33f7f80d03a1df35aecb72f843463907786777da8bf1fd47a955fad9eb23e65e0ddff6d1ed0463cc69ed4
}
decrypting privKeyData
[...]
>python firepwd.py -v 2 -p MISC* -d ff50\
globalSalt: b'5ed0adce15d896b84115f530be4e259f72beda91'
SEQUENCE {
SEQUENCE {
OBJECTIDENTIFIER 1.2.840.113549.1.5.13 pkcs5 pbes2
SEQUENCE {
SEQUENCE {
OBJECTIDENTIFIER 1.2.840.113549.1.5.12 pkcs5 PBKDF2
SEQUENCE {
OCTETSTRING b'f92dde91809b8b00c6607b73f3d0321c80f930aa13f13da5293aede76ee92048'
INTEGER b'01'
INTEGER b'20'
SEQUENCE {
OBJECTIDENTIFIER 1.2.840.113549.2.9 hmacWithSHA256
}
}
}
SEQUENCE {
OBJECTIDENTIFIER 2.16.840.1.101.3.4.1.42 aes256-CBC
OCTETSTRING b'd7f6eef452a0becb5227af2e175c'
}
}
}
OCTETSTRING b'9ef5288ba19326df7188f1f0d1811c2a'
}
clearText b'70617373776f72642d636865636b0202'
password check? True
SEQUENCE {
SEQUENCE {
OBJECTIDENTIFIER 1.2.840.113549.1.5.13 pkcs5 pbes2
SEQUENCE {
SEQUENCE {
OBJECTIDENTIFIER 1.2.840.113549.1.5.12 pkcs5 PBKDF2
SEQUENCE {
OCTETSTRING b'86535fdbbc242465d6e8477094b93221c9cc45bb363141e177ae2801e1972b32'
INTEGER b'01'
INTEGER b'20'
SEQUENCE {
OBJECTIDENTIFIER 1.2.840.113549.2.9 hmacWithSHA256
}
}
}
SEQUENCE {
OBJECTIDENTIFIER 2.16.840.1.101.3.4.1.42 aes256-CBC
OCTETSTRING b'4de278f3bc4cf8e503ce0b8672ec'
}
}
}
OCTETSTRING b'62093ca8bb60c0416b5e7bee18402b99c21e780985ff75737fb8a493a858aaf2'
}
clearText b'7f914a642a4552b0e0c7a87061fe5d9437a41968c4a7d35e0808080808080808'
decrypting login/password pairs
[...]
pip install -r requirements.txt
Проверено с Python 3.7.3, PyCryptodome 3.9.0 и pyasn 0.4.8
Необходимые модули: - pyasn1, https://pypi.python.org/pypi/pyasn1/, для декодирования ASN1 - PyCryptodome, https://www.pycryptodome.org/en/latest/, для расшифровки 3DES и AES
Упрощённый скрипт для расшифровки паролей Firefox, хранящихся в файле logins.json,
с использованием master_key из key4.db.
Этот скрипт основан на оригинальной работе @lclevy, но был
переработан для ясности и простоты, с фокусом только на современных версиях Firefox,
использующих key4.db и logins.json.