Я улучшаю некоторый код, который помогает проверить, правильно ли отслеживаются пароли. Вот исходный код внедренной DLL: https://github.com/outflanknl/Spray-AD/blob/master/Src/Spray-AD/Spray-AD/ReflectiveDll.cpp
В настоящее время проблема в этой DLL заключается в том, что она может блокировать пользователей (поскольку некоторые пользователи уже могут иметь некоторый badPwdCount к своему имени пользователя ), поэтому мне нужно правильно проверить, какой текущий badPwdCount пользователя и какое значение thresholdLockout для каждого пользователя, прежде чем пытаться аутентифицироваться как этот указанный c пользователь (поскольку разные пользователи могут иметь разные политики паролей).
К счастью, badPwdCount было несложно реализовать, и я правильно изменил фильтр LDAP:
WCHAR* pszPropertyList[3] = { L"sAMAccountName" , L"badPwdCount" , L"lockoutThreshold"};
и правильно настроил функцию ExecuteSearch:
else
{
// Return specified properties
hr = pContainerToSearch->ExecuteSearch(pszSearchFilter,
pszPropertyList,
3,
&hSearch);
}
И случай переключения поэтому он правильно перехватит badPwdCount:
case ADSTYPE_INTEGER:
for (x = 0; x < col.dwNumValues; x++) {
if (_wcsicmp(col.pszAttrName, L"badPwdCount") == 0) {
if (col.pADsValues->Integer >= 4 || col.pADsValues->Integer == 0) {
/*some code*/
break;
}
}
}
Но так как я хочу сравнить badPwdCount с заданным порогом блокировки пользователя c (а не 4, как в примере выше), я попытался извлечь Атрибут lockoutThreshold можно посмотреть здесь: https://docs.microsoft.com/en-us/windows/win32/adschema/a-lockoutthreshold
Хотя я не могу получить у меня результат для блокировки порога ... код даже не возвращает мне ошибку неизвестного типа:
default:
wprintf(L"[!] Unknown type %d.\n", col.dwADsType);
, что очень странно для меня, так как я могу получить другие атрибуты (такие как badPasswordTime) без проблем .
Как правильно получить порог блокировки? примеры кода будут потрясающими.