Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Gauri  
#1 Оставлено : 7 июня 2023 г. 4:26:49(UTC)
Gauri

Статус: Новичок

Группы: Участники
Зарегистрирован: 07.06.2023(UTC)
Сообщений: 5

Доброе время суток. Пишу службу, которой нужно смотреть в пользовательские сертификаты, в том числе персональные сертификаты пользователей, а не компьютера.
Когда из-под учётки пользователя выполняю код
Код:
CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, IntPtr.Zero, CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_READONLY_FLAG | CERT_STORE_OPEN_EXISTING_FLAG, "My");

хранилище открывается, сертификат с помощью CertFindCertificateInStore находится.
Но служба запускается из-под LOCAL_SYSTEM, это другой пользователь, через CURRENT_USER тот сертификат не видно. Пробую:
Код:
HCERTSTORE hSysStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, IntPtr.Zero, CERT_SYSTEM_STORE_USERS | CERT_STORE_READONLY_FLAG | CERT_STORE_OPEN_EXISTING_FLAG, "sid пользователя\My");

хранилище открывается, но сертификат не находится.
Как решить? Просить каждого пользователя переносить сертификаты в другое место не хочу, запускать службу то от одного пользователя, то от другого - тоже кривой вариант.

И ещё: в HKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates пользователя пусто, редактор реестра говорит, что сертификат лежит в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates (certutil это подтверждает: certutil -store My сертификат есть, certutil -user -store My пусто). Почему тогда сертификат находится через CERT_SYSTEM_STORE_CURRENT_USER, а не CERT_SYSTEM_STORE_LOCAL_MACHINE?

Отредактировано пользователем 7 июня 2023 г. 4:32:27(UTC)  | Причина: Не указана

Offline Gauri  
#2 Оставлено : 9 июня 2023 г. 14:36:46(UTC)
Gauri

Статус: Новичок

Группы: Участники
Зарегистрирован: 07.06.2023(UTC)
Сообщений: 5

Стало чуть понятнее, где что хранится.
В случае сертификатов компа:
Сертификат - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\My\Certificates
Ссылка на ключ - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\My\Keys
Сам ключ (если хранится в реестре) - HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Crypto Pro\Settings\Keys
Сам ключ (если хранится в директории) - C:\Users\All Users\Crypto Pro\Crypto

Для сертификатов пользователя:
Сертификат - C:\Users\имя_пользователя\AppData\Roaming\Microsoft\SystemCertificates\My\Certificates
Ссылка на ключ - C:\Users\имя_пользователя\AppData\Roaming\Microsoft\SystemCertificates\My\Keys
Сам ключ (если хранится в реестре) - HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Crypto Pro\Settings\Users\sid_пользователя\Keys
Сам ключ (если хранится в директории) - C:\Users\имя_пользователя\AppData\Local\Crypto Pro

Т.е. сертификаты/ключи пользователя лежат вообще не в реестре. При этом CertOpenStore CERT_SYSTEM_STORE_CURRENT_USER каким-то чудом их подгружает, а CertOpenStore CERT_SYSTEM_STORE_USERS - нет.

Вопрос, как нормальным путём админу получить сертификаты всех пользователей, остался открытым...
Offline Андрей *  
#3 Оставлено : 9 июня 2023 г. 14:48:12(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,297
Мужчина
Российская Федерация

Сказал «Спасибо»: 549 раз
Поблагодарили: 2201 раз в 1717 постах
Здравствуйте.

А доменные политики, запуск при входе не рассматривается?
Техническую поддержку оказываем тут
Наша база знаний
Offline Gauri  
#4 Оставлено : 9 июня 2023 г. 15:50:38(UTC)
Gauri

Статус: Новичок

Группы: Участники
Зарегистрирован: 07.06.2023(UTC)
Сообщений: 5

Хотелось бы, чтоб решение работало независимо от того, залогинился отдельно взятый пользователь или нет.
Offline basid  
#5 Оставлено : 9 июня 2023 г. 21:48:46(UTC)
basid

Статус: Активный участник

Группы: Участники
Зарегистрирован: 21.11.2010(UTC)
Сообщений: 1,095

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 150 раз в 135 постах
Теоретически, некоторые учётные записи имеют право "перевоплощения" (Impersonation).
Код, конечно, не подскажу, даже примерно, но я бы копал в эту сторону.
Offline Gauri  
#6 Оставлено : 14 июня 2023 г. 18:12:08(UTC)
Gauri

Статус: Новичок

Группы: Участники
Зарегистрирован: 07.06.2023(UTC)
Сообщений: 5

Автор: basid Перейти к цитате
Теоретически, некоторые учётные записи имеют право "перевоплощения" (Impersonation).
Код, конечно, не подскажу, даже примерно, но я бы копал в эту сторону.


Итог нескольких дней ковыряний. Нормальное использование олицетворения, например, через функцию CreateToken подразумевает, что вы знаете пароль учётной записи.
Я закопался в руткитоподобное использование недокументированной NtCreateToken (благодаря nuget пакету NtApiDotNet это было чуть проще): тырим токен у процесса lsass.exe - используя его, вызываем NtCreateToken для создания токена нужной учётки (без использования пароля) - используя его, обращаемся к хранилищу сертификатов и... ничего не поменялось, сертификат пользователя не находится.
Offline Gauri  
#7 Оставлено : 16 июня 2023 г. 6:42:02(UTC)
Gauri

Статус: Новичок

Группы: Участники
Зарегистрирован: 07.06.2023(UTC)
Сообщений: 5

В общем, решил задачу временным копированием сертификатов всех пользователей в LocalSystem. Странно, конечно, что для таких случаев нет нормального API.

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.