В дополнение к нашей прошлой статье про расшифровку DPAPI-блобов расскажем еще о двух случаях, с которыми нам пришлось столкнуться. Речь пойдет о сохраненных паролях в браузерах MS IE11 и Edge.
Стратегия остается прежней – будем все расшифровывать в режиме offline. Для этого необходимо забрать нужные файлы.
В зависимости от операционной системы (Windows 7 или выше) сохраненные пароли следует искать в двух местах:
В случае Windows 7 это ветка реестра
В случае Windows 8 и выше — хранилище Windows Vault.
Так же следует отметить что на Windows 7 пароли http basic авторизации так же хранятся в Windows Vault, так что забрать его не помешает в любом случае.
Ну и по старой доброй традиции — все это конечно же шифруется через DPAPI-механизмы.
Теперь рассмотрим алгоритм расшифровки более подробно.
Как уже упоминалось выше, пароли хранятся в реестре текущего пользователя и представляют из себя DPAPI-блобы, зашифрованные мастер-ключом пользователя.
Но есть важное отличие — при шифровании пароля применяется энтропия. Энтропия — это URL, по которому вводится пароль в формате
Для расшифровки пароля нужно знать полный URL! Иначе никак.
Но, чтобы IE сам знал как расшифровывать пароль — этот URL хешируется и сохраняется в реестре в качестве имени ключа с DPAPI-blob.
Рассмотрим небольшой пример. Для сайта
где
A88… — это хешированный URL
01000000D08C… — DPAPI-блоб, содержащий username и пароль
Алгоритм хеширования URL незамысловатый. Подробнее о нем можно почитать в ЦРУ-шных наработках Vault7.
На питоне он выглядит следующим образом:
Список последних 50-ти введенных URL можно почерпнуть так же из реестра:
Вернемся к примеру. Допустим нам необходимо найти в реестре сохраненный пароль от
Подставив значение URL в скрипт конвертации — мы получим значение
Ключ с этим наименованием нам необходимо отыскать в реестре
Если такой ключ найден — его необходимо скопировать в файл в виде hex-значений (т.е. интерпретировав значение ключа как hex blob) и произвести расшифровку как DPAPI-blob c применением энтропии:
Для расшифровки можно воспользоваться dpapick, внеся соответствующие изменения для учета энтропии в расшифровке.
В файле examples/filegeneric.py вызов функции
заменить на
и после этого вызвать dpapick как обычно:
Если мастер-ключ расшифровался верно, то на выходе получим сохраненные логин и пароль (после некоторого количества служебных бинарных данных).
В случае сохранения паролей на Win8 и выше пароли от http форм, равно как и http basic авторизации, хранятся в Windows Vault. И что хорошо — вместе с паролем сохраняется и полный URL сайта, к которому он подходит.
Сам Vault шифруется двухступенчато — сначала весь блок данных шифруется AES'ом, а симметричный ключ для расшифровки шифруется DPAPI и сохраняется в файл. Полностью алгоритм по шифровке-расшифровке описан в статье ребят из Zena Forensics.
Ими же разработаны специальные декрипторы для Windows Vault на основе dpapick (dpapilab). Их можно взять на гите ZF или скачать форк с нашего гитхаба.
Хранилище Vault расположено в профиле пользователя:
Внутри файл .vpol — DPAPI-блоб, зашифрованный ключом пользователя, и хранящий AES-key для расшифровки .vcrd
Для расшифровки Vault необходимо запустить:
Вместо пароля можно применить доменный ключ, как было показано в предыдущей статье. Так же следует отметить, что если в машина в домене и включена политика Credential Roaming, то данные Windows Vault будут храниться в ldap. Про это можно прочитать в первой нашей статье про DPAPI.
Маленькое дополнение: для корректной работы скрипта Вам скорее всего потребуется установить старые питоновские либы:
Для расшифровки паролей IE, Edge а так же сохраненных в Windows паролей Вам необходимо забрать:
каталог c Vault
каталог c мастер-ключами
содержимое ключей реестра
Помимо этого, необходимо знать пароль пользователя или доменный dpapi backup-ключ для расшифровки без пароля.
Стратегия остается прежней – будем все расшифровывать в режиме offline. Для этого необходимо забрать нужные файлы.
В зависимости от операционной системы (Windows 7 или выше) сохраненные пароли следует искать в двух местах:
В случае Windows 7 это ветка реестра
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\Storage2
В случае Windows 8 и выше — хранилище Windows Vault.
Так же следует отметить что на Windows 7 пароли http basic авторизации так же хранятся в Windows Vault, так что забрать его не помешает в любом случае.
Ну и по старой доброй традиции — все это конечно же шифруется через DPAPI-механизмы.
Теперь рассмотрим алгоритм расшифровки более подробно.
Windows 7 + IE11 (Edge)
Как уже упоминалось выше, пароли хранятся в реестре текущего пользователя и представляют из себя DPAPI-блобы, зашифрованные мастер-ключом пользователя.
Но есть важное отличие — при шифровании пароля применяется энтропия. Энтропия — это URL, по которому вводится пароль в формате
("https://url"+"\x00").lower().encode("utf-16-le")
.Для расшифровки пароля нужно знать полный URL! Иначе никак.
Но, чтобы IE сам знал как расшифровывать пароль — этот URL хешируется и сохраняется в реестре в качестве имени ключа с DPAPI-blob.
Рассмотрим небольшой пример. Для сайта
https://rdot.org/forum/
сохраненный пароль будет выглядеть так:A88E21329B5372B856CE238B79D1F28D8EA1FD359D REG_BINARY 01000000D08C9DDF0115D1118C7A00C......BC310C51EE0F9B05D
где
A88… — это хешированный URL
https://rdot.org/forum/
01000000D08C… — DPAPI-блоб, содержащий username и пароль
Алгоритм хеширования URL незамысловатый. Подробнее о нем можно почитать в ЦРУ-шных наработках Vault7.
На питоне он выглядит следующим образом:
import hashlib
url = "https://rdot.org/Forum/".lower() + "\x00"
url_utf_16_le = url.encode("utf-16-le")
sha1obj = hashlib.sha1(url_utf_16_le)
urldigest = sha1obj.digest()
checksum = 0
len(urldigest)
for abyte in urldigest:
checksum = (checksum + (ord(abyte))) & 0xFF
hash = sha1obj.hexdigest().upper()
cksum = "%02X" % checksum
reg_value_name = "%s%s" % (hash, cksum)
print reg_value_name
Список последних 50-ти введенных URL можно почерпнуть так же из реестра:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\typedurls
Вернемся к примеру. Допустим нам необходимо найти в реестре сохраненный пароль от
https://rdot.org/forum/
.Подставив значение URL в скрипт конвертации — мы получим значение
A88E21329B5372B856CE238B79D1F28D8EA1FD359D
Ключ с этим наименованием нам необходимо отыскать в реестре
req query "HKEY_USERS\<SID>\Software\Microsoft\Internet Explorer\IntelliForms\Storage2"
Если такой ключ найден — его необходимо скопировать в файл в виде hex-значений (т.е. интерпретировав значение ключа как hex blob) и произвести расшифровку как DPAPI-blob c применением энтропии:
("https://rdot.org/forum/".lower() + "\x00").encode("utf-16-le")
Для расшифровки можно воспользоваться dpapick, внеся соответствующие изменения для учета энтропии в расшифровке.
В файле examples/filegeneric.py вызов функции
probe.try_decrypt_with_password(options.password, mkp, options.sid)
заменить на
probe.try_decrypt_with_password(options.password, mkp, options.sid, entropy=("https://rdot.org/forum/".lower() + "\x00").encode("utf-16-le"))
и после этого вызвать dpapick как обычно:
./filegeneric.py --sid <SID> --masterkey <mk dir> --password <..> --inputfile <dpapi blob from registry>
Если мастер-ключ расшифровался верно, то на выходе получим сохраненные логин и пароль (после некоторого количества служебных бинарных данных).
Windows 8.1 и выше
В случае сохранения паролей на Win8 и выше пароли от http форм, равно как и http basic авторизации, хранятся в Windows Vault. И что хорошо — вместе с паролем сохраняется и полный URL сайта, к которому он подходит.
Сам Vault шифруется двухступенчато — сначала весь блок данных шифруется AES'ом, а симметричный ключ для расшифровки шифруется DPAPI и сохраняется в файл. Полностью алгоритм по шифровке-расшифровке описан в статье ребят из Zena Forensics.
Ими же разработаны специальные декрипторы для Windows Vault на основе dpapick (dpapilab). Их можно взять на гите ZF или скачать форк с нашего гитхаба.
Хранилище Vault расположено в профиле пользователя:
C:\Users\<user>\AppData\Local\Microsoft\Vault\<GUID>\
Внутри файл .vpol — DPAPI-блоб, зашифрованный ключом пользователя, и хранящий AES-key для расшифровки .vcrd
Для расшифровки Vault необходимо запустить:
./vaultdec.py --masterkey <mk dir> --sid <SID> --password <pass> <VAULT DIR>
Вместо пароля можно применить доменный ключ, как было показано в предыдущей статье. Так же следует отметить, что если в машина в домене и включена политика Credential Roaming, то данные Windows Vault будут храниться в ldap. Про это можно прочитать в первой нашей статье про DPAPI.
Маленькое дополнение: для корректной работы скрипта Вам скорее всего потребуется установить старые питоновские либы:
apt install python-construct.legacy
Шпаргалка
Для расшифровки паролей IE, Edge а так же сохраненных в Windows паролей Вам необходимо забрать:
каталог c Vault
c:\Users\<user>\AppData\Local\Microsoft\Vault\<GUID>\
каталог c мастер-ключами
c:\Users\<user>\AppData\roaming\microsoft\Protect\<SID>\
содержимое ключей реестра
HKEY_USERS\<SID>\Software\Microsoft\Internet Explorer\IntelliForms\Storage2
HKEY_USERS>\<SID>\Software\Microsoft\Internet Explorer\typedurls
Помимо этого, необходимо знать пароль пользователя или доменный dpapi backup-ключ для расшифровки без пароля.