Когда вы используете API интерфейса поставщика поддержки безопасности (SSPI) для проверки учетных данных пользователя, сервер получает контекст безопасности дескриптор.
Затем вы можете использовать QueryContextAttributes
для запроса информации об дескрипторе контекста безопасности:
QueryContextAttributes(handle,
SECPKG_ATTR_LIFESPAN
)
- tsStart: Time at which the context was established.
- tsExpiry: время истечения срока действия контекста.
QueryContextAttributes(handle,
SECPKG_ATTR_AUTHORITY
)
- sAuthorityName: the name of the authenticating authority, if available.
QueryContextAttributes(handle,
SECPKG_ATTR_PASSWORD_EXPIRY
)
- tsPasswordExpires: when the credentials for the security context expire.
QueryContextAttributes(handle,
SECPKG_ATTR_PACKAGE_INFO
)
- Name: the name of the security package.
- Комментарий. Это может быть любая дополнительная строка, возвращенная пакетом.
QueryContextAttributes(handle,
SECPKG_ATTR_NATIVE_NAMES
)
- sClientName: the principal name for the client in the outbound ticket.
- sServerName: основное имя сервера в исходящем билете.
QueryContextAttributes(handle,
SECPKG_ATTR_CLIENT_SPECIFIED_TARGET
)
- sTargetName: The SPN of the initial target.
Когда я использую SSPI для проверки своих учетных данных, сервер получает набор информации обо мне меня, один из элементов не работает:
- Дескриптор контекста:
0x04CC9F4000AC8B80
- Имя пользователя:
STACKOVERFLOW\ian
- Имя собственного клиента:
[email protected]
- Имя собственного сервера:
[email protected]
- SID пользователя:
S-1-5-21-1708537768-844245398-2146844275-1109
- Цель, указанная клиентом:
ian
- Уполномоченный:
The function requested is not supported (80090302)
- Срок действия пароля истекает (UTC):
- Начало срока службы:
10/23/2019 11:03 ᴀᴍ
- Срок действия:
10/23/2019 7:32 ᴘᴍ
- Имя пакета:
Kerberos
- Комментарий к пакету:
Microsoft Kerberos V1.0
- Возможности пакета:
0x028F3BBF
- Версия пакета:
0001
- Идентификатор Rpc пакета:
0010
- Максимальная длина токена пакета:
48000
Удостоверение личности
Я хочу знать авторитет, который подтвердил (или поручился за кешированные) учетные данные.
За исключением того, что вызов QueryContextAttributes (и QueryContextAttributesEx) с SECPKG_ATTR_AUTHORITY
завершается с ошибкой:
// MessageId: SEC_E_UNSUPPORTED_FUNCTION
//
// MessageText:
//
// The function requested is not supported
//
SEC_E_UNSUPPORTED_FUNCTION = HRESULT($80090302);
Что ты делаешь?
Я могу найти его с помощью командной строки:
C:\Users\Ian>SET
LOGONSERVER=\\HYDROGEN
Но я использую API.
Справочная информация: как работает SSPI
SSPI был разработан как универсальная оболочка для различных алгоритмов безопасности. Способ использования API довольно прост:
- Client:
- calls
InitializeSecurityContext
and is given a blob - клиент отправляет этот блоб на сервер
- calls
- Server:
- calls
AcceptSecurityContext(blob)
, and is given a blob back - сервер отправляет этот блоб обратно клиенту
- calls
- Client:
- calls
InitializeSecurityContext(blob)
, and is given back a blob - клиент отправляет этот большой двоичный объект обратно на сервер
- calls
- Server:
- calls
AcceptSecurityContext(blob)
, and is given a blob back - ...повторять, пока не будет остановлено...
- calls
Обе стороны продолжают двигаться вперед и назад, пока функция не перестанет возвращать большой двоичный объект, который необходимо отправить другой стороне:
И так с SSPI вы делаете это пинг-понг взад и вперед, пока вам не скажут остановиться. Таким образом, они смогли впихнуть каждую схему аутентификации в эту высокоуровневую абстракцию типа «пинг-понг, пока не скажут остановить».
А как вы передаете блобы?
Вы передаете BLOB-объекты по любому каналу связи, который используете.
Если вы разговариваете с удаленным сервером через TCP/IP, вы, вероятно, использовали бы это:
// Open connection to server
sockConnect(162.210.196.166, 1433);
blob = null;
Boolean bContinue = InitializeSecurityContext(ref blob);
while (bContinue)
{
sockWrite(blob); //send the blob to the server
blob = sockRead(); //wait for the server to return a blob
bContinue = InitializeSecurityContext(ref blob);
}
Если вы делаете это через http:
blob = null;
Boolean bContinue = InitializeSecurityContext(ref blob);
while (bContinue)
{
http = new HttpRequest("http://4chan.org/default.aspx");
http.AddHeader("X-SSPI-Blob", blob.ToBase64());
http.Send();
blob = http.ReasponseHeader["X-SSPI-Blob"];
if (blob.IsEmpty())
break;
bContinue = InitializeSecurityContext(ref blob);
}
Вы даже можете отправить их почтовым голубем!
Бонусное чтение
SSPI — это имя реализации Windows RFC4121.
Универсальный программный интерфейс службы безопасности (GSS-API)
Бонус Бонус
- "Что я должен установить для TargetName?: https://stackoverflow.com/a/49411527/12597
QueryContextAttributes
не поддерживает атрибутSECPKG_ATTR_AUTHORITY
, приводит к ошибке недопустимого параметра для меня. ИQueryContextAttributesEx
приводит к ошибке ссылки для меня. Кажется, это пропущено вSecur32.lib
. Итак, не могли бы вы показать воспроизводимую демонстрацию и шаги? Тестирую на Windows 10 1903. - person Rita Han   schedule 24.10.2019QueryContextAttributesEx
тоже не работает. - person Ian Boyd   schedule 24.10.2019>ver
:Microsoft Windows [Version 10.0.18362.418]
- person Ian Boyd   schedule 25.10.2019