Где в Windows хранятся корневые сертификаты Центров Сертификации (CA)
Общесистемные корневые CA сертификаты
Если вы задаётесь вопросом, в какой папке хранятся сертификаты в Windows, то правильный ответ в том, что в Windows сертификаты хранятся в реестре. Причём они записаны в виде бессмысленных бинарных данных. Чуть ниже будут перечислены ветки реестра, где размещены сертификаты, а пока давайте познакомимся с программой для просмотра и управления сертификатами в Windows.
В Windows просмотр и управление доверенными корневыми сертификатами осуществляется в программе Менеджер Сертификатов.
Чтобы открыть Менеджер Сертификатов нажмите Win+r, введите в открывшееся поле и нажмите Enter:

Перейдите в раздел «Доверенные корневые центры сертификации» → «Сертификаты»:

Здесь для каждого сертификата вы можете просматривать свойства, экспортировать и удалять.
Просмотр сертификатов в PowerShell
Чтобы просмотреть список сертификатов с помощью PowerShell:

Чтобы найти определённый сертификат выполните команду вида (замените «HackWare» на часть искомого имени в поле Subject):

Теперь рассмотрим, где физически храняться корневые CA сертификаты в Windows. Сертификаты хранятся в реестре Windows в следующих ветках:
Сертификаты уровня пользователей:
Сертификаты уровня компьютера:
Сертификаты уровня служб:
Сертификаты уровня Active Directory:

И есть несколько папок и файлов, соответствующих хранилищу сертификатов Windows. Папки скрыты, а открытый и закрытый ключи расположены в разных папках.
Пользовательские сертификаты (файлы):
Компьютерные сертификаты (файлы):
Рассмотрим теперь где хранятся корневые CA сертификаты веб-браузеров.
Google Chrome
Использует общесистемные доверенные корневые центры сертификации.

Чтобы перейти к списку сертификатов из веб браузера:

Настройки → Приватность и Защита → Безопасность → Управление сертификатами → Просмотр сертификатов → Центры сертификации → Доверенные корневые центры сертификации:
Opera
Чтобы перейти к списку сертификатов из веб браузера: Настройки → Перейти к настройкам браузера → Дополнительно → Безопасность → Ещё → Настроить сертификаты → Доверенные корневые центры сертификации:

Firefox

Приватность и Защита → Сертификаты → Просмотр сертификатов → Центры сертификации:

Для глубокого понимания OpenSSL смотрите также полное руководство: «OpenSSL: принципы работы, создание сертификатов, аудит».
Appdata roaming microsoft crypto rsa что это
As you might have heard, Winamp recently changed ownership.
Please take a minute to review the new Terms of Service and Privacy Policy.
Sorry for german text, maybe some german people know an answer.
Could it be that Windows generates the file and not Winamp? Maybe should I just delete the file?
no one has replied as i doubt anyone knows. even i’m not sure from a quick look though it’s most likely from something Winamp calls in the OS if it’s related to the OSes security but i don’t know exactly what causes it (though appears that it used to be stored in the registry before being moved to a file based version).
I don’t know why Winamp would be using the private key folder. Winamp Standard (free) and Winamp Pro are the same. The difference is that Winamp Pro will ask for the reg key during install. In Winamp’s preferences there is a section that allows you to upgrade to Pro or enter the reg key if you already have Pro. At a guess and this is only a guess, the use private key folder is used to help facilitate upgrading to Pro for those that choose to do so.
As for backing up Winamp.ini. Winamp uses user profiles and settings are saved to the Winamp folder in the %AppData% folder. So, if Winamp.ini is restored to the Program Files\Winamp folder, it will not be recognized by Winamp because it is looking in the %AppData%\Winamp folder. Additionally, Winamp has other settings files and the «lost settings» may be due to the other settings files not being restored. If you want to backup Winamp’s settings, we suggest using the Winamp Backup Tool.
It does not have anything to do with the Winamp Pro «Key» (the product key that allows you to use the Pro features).
This is stored in the Registry and is not a «cryptographic» key as such (used for encryption and so on). It’s just a string that has to satisfy certain needs to be recognized as a valid «Pro Key». In fact, if you want to talk of encryption, it is rather the encrypted payload than the key.
The fact that Winamp uses Windows Crypto API calls (Windows creates this folder and files then by itself) has to do something with, I guess, the Windows Media DRM key mechanisms which Winamp uses to play DRM protected WMA and WMV files. But that is just a guess.
Best regards
kzuse


I hate it when I guess wrong and I had a feeling that was going to come back and haunt me.
Thanks for the explanation, kzuse.
«Секретики» DPAPI или DPAPI для пентестеров
Вторая статья по итогам выступления нашей команды на OFFZONE-2018. На этот раз рассмотрим доклад с MainTrack “Windows DPAPI “Sekretiki” or DPAPI for pentesters”.
Внимание! Очень много буков!
При проведении RedTeam кампаний хочется давать меньше поводов для реакции BlueTeam, но их может быть много. Например, запуск mimikatz для получения пользовательских паролей или сертификатов. Даже если мы сумели «отмазать» его от Касперского, у BlueTeam есть возможность отслеживания с помощью специализированных средств, таких как Sysmon, Microsoft ATA и т.д. В тоже время хотелось бы получить максимум информации со скомпрометированной машины пользователя. В ходе неоднократно проведенных RedTeam кампаний с противодействием настоящим BlueTeam командам мы пришли к выводам, что необходимо в максимально избегать действий, которые могу служить индикаторами компрометации системы. Достигнуть эту цель возможно с помощью использования легальных механизмов и действий, предусмотренных операционной системой для пользователя.
Одним из таких легальных инструментов является механизм DPAPI (Windows Data Protection API), который используется операционной системой и различными приложениями для шифрования чувствительных данных пользователя (прежде всего паролей, криптографических ключей и т.д.) Для конечного пользователя и его приложений DPAPI выглядит предельно просто: есть всего 2 функции – «зашифровать данные» и «расшифровать данные». В данной статье хотелось бы рассмотреть, насколько такой механизм полезен пентестерам при проведении RedTeam кампаний.
Что такое DPAPI? Только кратко и по-русски
Начиная с 2000 года все ОС Windows стали использовать механизм DPAPI для того, чтобы сохранять пользовательские данные в безопасности.
Если пропустить всю криптографию, которую мы рассматривали на докладе – для расшифровки зашифрованных через DPAPI данных нам необходимы: мастер-ключ, SID пользователя, хэш пароля пользователя и сам DPAPI блоб (шифрованные DPAPI данные).
В общем виде процесс выглядит так:
Внутри нашей «криптографической шляпы» находится много различных крипто механизмов, которые мы не будем рассматривать в данной статье, дабы не перегружать читателя. Отметим лишь то, что основной частью DPAPI является так называемый Masterkey (мастер-ключ). Если по-простому, мастер-ключ – это 64 байта случайных данных, зашифрованных с помощью prekey, который генерируется из пароля пользователя и его SID.
В генерации prekey так же принимают участие дополнительные параметры: количество итераций (IterN), соль и HMAC, которые могут варьироваться от случая к случаю. Значения этих параметров хранятся вместе с мастер-ключом в одном файле.
Таким образом, зная пароль пользователя, его SID и прочитав из файла мастер-ключа параметры генерации (HMAC, Salt, InterN), мы можем сгенерировать prekey и расшифровать мастер-ключ, т.е. получить те самые случайные 64 байт, которые мы будем использовать для расшифровки DPAPI-блобов.
А если я сменю пароль?
Обычно пароли пользователя меняются с определенной периодичностью. Что будет, если пользователь сменил пароль? Куда делся предыдущий? Ведь для расшифровки мастер-ключа необходимо знать пароль пользователя, а перешифровывать все мастер-ключи пользователя каждый раз – слишком затратное удовольствие. На этот случай у Windows все продумано.
Существует специальный файл (CREDHIST), задача которого хранить все предыдущие пароли пользователя. Он также шифруется текущим паролем пользователя и сохраняется в стек. Если у системы вдруг не получилось расшифровать мастер-ключ, то она поступает следующим образом: используя текущий пароль расшифровывает первую запись в CREDHIST. Полученным паролем пытается снова расшифровать мастер-ключ и так до тех пор, пока не закончатся пароли в цепочке или мастер-ключ не будет расшифрован.
Немного о приватных ключах контроллера домена
Как вы уже догадались, DPAPI применяется для всех пользователей, в том числе и доменных. Для того, чтобы была возможность сбросить пароль пользователю, который его успешно забыл после какой-нибудь пятничной вечеринки, нужен запасной ключ, который будет храниться в надежном месте. По мнению Microsoft, таким надежным местом является контроллер домена.
Суть механизма по расшифровке мастер-ключа после сброса пароля пользователя состоит в следующем: на контроллере домена создается пара RSA-ключей – закрытый и открытый. Закрытый ключ хранится на контроллере домена в базе NTDS и называется BCKUPKEY_xxxx (см. рисунок ниже), а открытый ключ распространяется на все доменные системы и используется для формирования дубликата мастер-ключа при его генерации.
После создания мастер-ключа на доменной машине также создается его дубликат (вернее материала мастер-ключа — его 64-х байт), который хранится вместе с основным мастер-ключом в одном файле и называется Domain Key. При потере основного мастер-ключа, т.е. при сбросе пароля пользователя, система отправляет его дубликат контроллеру домена и просит его расшифровать. Контроллер, авторизовав пользователя, производит расшифровку дубликата и возвращает системе, после чего материал мастер-ключа уже заново шифруется новым паролем.
Имея соответствующие привилегии в домене (чаще всего — админские) можно достать эти приватные RSA ключи с контроллера домена через механизм репликации и использовать их при дальнейшей расшифровке мастер-ключей, созданных на доменных машинах. Сделать это можно с помощью mimikatz или DSInternals. Подробнее об этом можно прочитать в mimikatz wiki или блоге DSInternals.
Где хранятся мастер-ключи и какие они бывают?
Мастер-ключ может быть пользовательским и системным, в зависимости от того чьи секреты шифруются. Пользовательский мастер-ключ хранится в профиле пользователя по следующему пути:
На всякий случай система хранит все когда-либо используемые пользователем мастер-ключи. Ведь она не знает наперед, каким мастер ключом будет необходимо что-нибудь расшифровать. GUID текущего используемого ключа хранится в файле Preferred.
Системные мастер-ключи хранятся по следующему пути:
windows\system32\Microsoft\Protect\S-1-5-18\
Аналогично с пользователем – используется один мастер-ключ, имя которого можно найти в файле Preferred, где хранятся все когда-либо используемые ключи.
Хорошо, а что этот ваш DPAPI может дать пентестеру?
Поскольку DPAPI – легальный и простой механизм, его стараются использовать различные приложения. Потому что это удобно и безопасно. До поры до времени, конечно.
Например, DPAPI используется для шифрования закрытых ключей клиентских и системных сертификатов, WIFI ключей, Chrome (cookie, паролей), DropBox, Skype, RSA SecurID (софтварного приложения, которое генерирует одноразовые ключи). И это далеко не исчерпывающий список.
Задача пентестера – расшифровать нужные блобы и получить пароли, куки и т.д.
Сделать это можно несколькими способами. Так или иначе все они сводятся к двум расшифровкам — онлайн и офлайн. Онлайн расшифровка – это когда на машине пользователя мы просто вызываем системные функции по расшифровке данных и передаем ей на вход DPAPI-блоб, а система уже делает все сама – ищет мастер-ключ, которым был зашифрован блоб, расшифровывает его, используя при этом SID пользователя и хеш пароля, хранящийся в памяти LSASS.
На рисунке ниже приведен пример вызова DPAPI-функций для шифрования и дешифровки на powershell.
Сперва мы шифруем наш секрет (в данном случае слово «Password») через вызов функции [Security.Cryptography.ProtectedData]::Protect(). Причем делаем это два раза — в первом случае используя мастер-ключ пользователя (параметр CurrentUser), а во втором – мастер-ключ системы (параметр LocalMachine). Затем полученные блобы мы можем расшифровать через вызов обратной функции — [Security.Cryptography.ProtectedData]::UnProtect().
При этом в данном случае неважно значение параметра CurrentUser или LocalMachine, т.к. система сама находит мастер-ключ, подходящий для расшифровки блоба, и делает все необходимое. На выходе в обоих случаях мы получаем наш первоначальный секрет – слово «Password» (его побайтовое представление).
При онлайн расшифровке важно понимать, в каком контексте Вы вызываете функцию UnProtect(). Для того чтобы расшифровка прошла удачно необходимо находиться в сессии пользователя или войти в систему под новой сессией. Все дело в хеше пароля, который хранится в памяти LSASS. Если Вы делаете вызов не в сеcсии пользователя (например, зашли в систему по сети через psexec или meterpreter), то у Вас, соответственно, нет хеша пароля, необходимого для расшифровки мастер-ключа. Он, конечно, есть в соседней сессии, но LSASS вам его не отдаст, т.к. это уже другая сессия хоть и создана она под тем же пользователем. Для удачной онлайн расшифровки вам необходимо либо мигрировать в любой процесс, запущенный вошедшим через GUI пользователем, либо полноценно войти в систему, например, через RDP.
Альтернативой powershell’у для онлайн расшифровки DPAPI-блобов может являться вызов mimiktaz::blob с параметром /unprotect. На входе ему подается бинарный файл с DPAPI-блобом, а на выходе мы получаем расшифрованные данные. Подробнее случаи с использованием mimikatz описаны в блоге HarmJ0y.
Биток упал. Куда девать мою ферму с видюхами?
Ввиду того, что DPAPI мастер-ключи шифруются на пароле пользователя, то можно попробовать обратный процесс – брутфорс пароля пользователя по его мастер-ключу. Например, мы получили обратный коннект от нашего макроса или DDE из отправленного docx-файла. Мы можем взять мастер-ключ пользователя и восстановить пароль пользователя без какой-либо эскалации привилегий и запусков mimikatz.
Для брутфорса пароля можно использовать Hashcat или JohnTheRipper? Но перед этим необходимо соответствующим скриптом из состава Джона достать параметры для брутфорса:
Затем результат работы скрипта мы уже можем отправлять на нашу ферму с видеокартами и надеяться, что у пользователя слабый пароль, т.к. скорость брутфорса мастер-ключа примерно сопоставима со скоростью перебора WPA2, т.е. совсем уж медленно.
Здесь стоит дополнительно заметить, что в случае, когда мастер-ключ генерируется на доменной Windows 10, то к генерации prekey добавляется еще 10000 раундов алгоритма PBKDF2. Но еще хуже то, что ни Hashcat, ни JohnTheRipper об этом не знают (по крайней мере на момент написания данной статьи), а это значит, что они не смогут сбрутить пароль от такого мастер-ключа.
«Забрать все что плохо лежит, а потом уже разбираться. »
Как мы уже отмечали ранее – выполнение подозрительных действий на машине пользователя может спровоцировать дополнительный интерес к нам со стороны Blueteam команды, а это соответственно чревато тем, что весь RedTeam на этом и закончится. В качестве примера можно привести запуск powershell на компьютере бухгалтера или секретаря с последующим расследованием инцидента. Дабы не вызывать излишних подозрений, лучше использовать оффлайн способы расшифровки DPAPI-блобов. Для этого необходимо сначала забрать с машины все необходимое, а именно:
Сам python фреймворк dpapick был сделан исследователем Жан-Мишелем Пикодом еще в 2014-м году и представляет собой реализацию механизмов DPAPI на питоновских крипто-библиотеках. Использование питона, равно как и структура фреймворка позволяет с достаточной легкостью адаптировать его под различные механизмы DPAPI. В своей изначальной версии dpapick не умел использовать domain backup key для расшифровки мастер-ключей, а также в нем отсутствовали механизмы по расшифровке мастер-ключей, созданных на Windows 10 в режиме доменной машины.
После исправления данных недостатков и расширению функционала по расшифровке DPAPI-блобов, dpapick превратился в достаточно хороший инструмент по оффлайн расшифровке DPAPI. Ниже, в качестве примеров – мы покажем варианты использования этого фреймворка для расшифровки зашифрованных через DPAPI-пользовательских данных.
Chrome – забираем и расшифровываем куки и пароли
Куки Chrome хранятся в файле %localappdata%\Google\Chrome\User Data\Default\Cookies
Данные о логинах – в файле %localappdata%\Google\Chrome\User Data\Default\Login Data
Оба файла представляют из себя sqlite3 БД, в которых чувствительные данные хранятся в виде DPAPI-блобов. В составе dpapick присутствует готовый диссектор (парсер) этих данных (examples/chrome.py). Для успешной расшифровки ему необходим указать каталог с мастер-ключами, sid пользователя, его пароль или местоположение приватного ключа контроллер-домена а так же sqlite3 файл от Chrome (cookie или login data).
Оффлайн расшифровка Chrome cookie с помощью пароля пользователя
Оффлайн расшифровка Chrome cookie с помощью хеша от пароля пользователя
Оффлайн расшифровка Chrome паролей с помощью приватного ключа с контроллера домена
DPAPI для клиентских сертификатов
Клиентские сертификаты используются много где – для генерации OTP, EFS или аутентификации в VPN, Web-приложениях и т.д.
Сами сертификаты публичного ключа хранятся в профиле пользователя:
%APPDATA%\Microsoft\SystemCertificates\My\Certificates\
А приватные ключи, с помощью которых собственно и производится подпись или иные криптографические операции зашифрованы через DPAPI и расположены так же в профиле пользователя по пути:
Для успешной расшифровки приватных ключей сертификатов и последующего воссоздания PFX-файлов нам необходимы помимо вышеперечисленных файлов еще мастер-ключи пользователя, а также его SID и пароль (либо приватный RSA-ключ с контроллера).
С помощью Dpapick и пароля пользователя расшифруем это:
Опциональный параметр rsaout в скриншоте дает возможность дополнительно экспортировать расшифрованные RSA ключи в PEM-формате. Результатом работы скрипта является воссозданный PFX-файл без пароля, который можно уже импортировать к себе и использовать по назначению. Если в вышеуказанных каталогах присутствуют несколько сертификатов и приватных ключей, то dpapick попытается расшифровать каждый из них и сделать несколько pfx-файлов.
Те же действия можно выполнить, используя доменный приватный ключ для расшифровки мастер-ключа, указав соответствующий параметр:
Еще немного о «фишечках» домена
Говоря о домене Active Directory стоит упомянуть еще такую замечательную фишку как Credentials Roaming – функцию домена, когда мастер-ключи, зашифрованные пароли и сертификаты «путешествуют» за пользователем по всему домену Active Directory. Они не привязаны к конкретной машине и «приедут» на тот компьютер, на котором доменный пользователь залогинится.
При включении этой «фишечки» все сертификаты, которые импортирует пользователь, равно как и все его приватные ключи и пароли — улетают в AD и хранятся в соответствующих атрибутах учетной записи: msPKIAccountCrdentailas и msPKIDPAPIMasterKeys.
Посмотреть, как это выглядит внутри AD можно, например, через ldapsearch:
По умолчанию пользователь может получить DPAPI атрибуты только для своей учетной записи. Но с повышенными привилегиями это можно сделать для любой учетной записи, в том числе и учетной записи компьютера.
Credential Roaming очень удобная технология не только для админов, но и для пентестеров. Получив доступ к домен контроллеру через ldap можно слить все сертификаты пользователя, его мастер-ключи и зашифрованные через DPAPI пароли (например пароли для подключения к сетевым дискам).
И почему бы не добавить подобный функционал в состав dpapick, подумали мы – и научили его автоматизированному изъятию сертификатов с контроллера домена через ldap, их расшифровки и формированию pfx-файлов.
Для выполнения скрипту необходимо указать домен-контроллер в качестве ldap-сервера, реквизиты подключения к нему, имя учетной записи, для которой мы получаем сертификаты и пароль для расшифровки мастер-ключа (или приватный backup ключ контроллера).
Dropbox. Угнать за 60 секунд…
Dropbox – еще один пример использования DPAPI для хранения пользовательских секретов. Токены авторизации для dropbox хранятся в файлах:
Это зашифрованные sqlite3 базы, содержащие данные для подключения. Для шифрования применяется симметричный ключ, который в свою очередь шифруется через DPAPI и хранится в реестре:
Таким образом, общий порядок угона dropbox следующий:
Ключи ks и ks1 содержат заголовок (8 байт) версии dbx перед DPAPI-блобом и md5 HMAC DPAPI-блоба (последние 16 байт). Сам DPAPI-блоб начинается с 9-го байта 0x01000000D0… Эти байты нужно скопировать в формате base64 в файл, который затем расшифровать через dpapick:
Затем, на своей машине необходимо зашифровать полученные на прошлом этапе ключи уже нашими master-key и положить результат в соответствующие ветки реестра.
Для зашифровки удобнее всего применить powershell:
В данном случае — hdata — ключ который получили на этапе расшифровки. dv0_entropy — константа энтропии, используемая DBOX в DPAPI. К получившемуся блобу необходимо спереди приписать заголовок 8 байт 0x00000000F6000000, а сзади — HMACMD5+0x00
После этого можно писать данные в соответствующие ключи реестра.
DPAPI и RSA SecurID
RSA SecurID – клиентская программа, которая используется для генерации одноразового пароля, разработанная компанией RSA.
Является достаточно популярной штукой для больших компаний и также использует DPAPI, только немного сложнее. В данном случае, инженеры RSA решили заморочиться и применили более сложные схемы DPAPI.
Т.е. сначала DB Key шифруется системным мастер-ключом, а потом получившийся DPAPI-блоб еще раз шифруется уже пользовательским мастер-ключом.
Так же в базе присутствует CryptoCheckSum от CheckSum:
CryptoCheckSum = DPAPI blob(CurrenUser)
Таким образом, для того, чтобы слитый SecurIDStorage заработал на вашей машине необходимо:
Затем полученный DPAPI_SYSTEM мы можем использовать для расшифровки необходимых блобов с помощью dpapick (парсер — examples/filegeneric.py), как показано на следующих скриншотах:
1) Получение DPAPI_SYSTEM через mimikatz offline
2) Получение DPAPI_SYSTEM через Impacket offline
3) Расшифровка DPAPIck с пользовательскими и системными мастер-ключами
Шпаргалка
Чтобы Вы не забыли места конкретных данных – вынесем их в отдельный раздел:


















