Ни один зрелый нарушитель не будет проводить DCSync от имени пользовательской учетки, поэтому отбрасывать машинные УЗ – такое себе. Детектирование на основе фильтрации трафика / мониторинга IP-адреса источника DRSGetNCChanges – это да, норм тема.
Приветствую! Спасибо за комментарий, поправил листинг. Что касается смены хеша без прав ДА – это умеет делает API SamiChangePasswordUser из samlib.dll. Она (функция) не документирована, ближайшее описание живет в MS-SAMR. Работать с ней умеет SetNTLM.ps1 и мой скрипт из Impacket. Также не забывайте, что мы меняем пароль УЗ из-под этой самой УЗ, поэтому ничего удивительного, что мы можем изменить соответствующий хеш, нет ;-)
Из того, с чем я работал в контексте обхода защиты, «Касперский» всегда был в выигрышной позиции (его обходить труднее всего). В плане юзабилити лично мне он тоже нравится больше других вендоров, на домашней тачке уже давно стоит KIS, и я вполне доволен :)
Конечно, это тоже очень верная рекомендация. Однако зачастую решение отобрать у пользователей локального админа насовсем неприменимо из-за особенностей рабочего процесса сотрудников целевой компании, а рекомендовать всем сотрудникам «безопасно использовать» свои привилегированные локальные учетки не очень надежна в плане ее соблюдения :)
Поэтому лучше всего — на корню срубить потенциальный импакт, который дамп может дать злоумышленнику, а именно, исключить появление в нем привилегированных доменных УЗ.
А почему нет? Можно было тащить целый urllib.request и просить html через urlopen(), а потом декодировать байты в текст, но зачем, если есть requests? По времени разницы особой не будет (грубый пример, но все же):
$ python3 -m timeit -s "from requests import get" -n 10 "get('http://www.linux-usb.org/usb.ids', timeout=10)"
10 loops, best of 3: 1.72 sec per loop
$ python3 -m timeit -s "from urllib.request import urlopen" -n 10 "urlopen('http://www.linux-usb.org/usb.ids', timeout=10).read().decode('cp1252')"
10 loops, best of 3: 3.05 sec per loop
Или Вы про само написание "import requests; requests.get()" вместо "from requests import get; get()"?
Тоже, когда игрался с реализацией статистических тестов, обзавелся целой кучей пробных последовательностей (псевдослучайных, которые только выглядят случайными, а на самом деле являются выходом вполне предсказуемого алгоритма, и истинно случайных — снятых с разных генераторов энтропии). Кому интересно, даже смог найти J
Алгоритмизация — это, бесспорно, хорошо и правильно. Только тут дело не в ней. Обратите внимание, я не выпускаю конечный продукт а-ля «Переборщик паролей любой длины на все случаи жизни» — я всего лишь прохожу путь решения конкретной задачи с фиксированными входными данными (речь в которой, к тому же, идет о переборе не всех строк указанной длины над алфавитом, а лишь тех, которые удовлетворяют маске). В условиях ограниченного времени, отведенного на решение, мне все же видится естественным использование цикла for (при учете того, что существует #omp parallel for!), нежели чем попытки эффективно распараллелить первокурсные задачи по типу «Выпиши все префиксы длины N над данным множеством». Если вы об этом спрашивали в своем первом комментарии, то да — код именно такой в том числе и из-за #omp parallel for.
Мне подход с вложенными for видится естественным. Дело не в openmp, при желании можно обойтись и одним циклом (что собственно и делает collapse()). Но зачем, если так проще, легче читается и на производительности не сказывается?
Не понимаю недовольства — полный перебор на то и полный, чтобы проходить по каждому элементу множества От и До, и вложенные for в такой ситуации отлично с этим справляются. Что касается 32-символьных паролей, вообще не понял к чему этот вопрос. Мало того, что пароли длины 11 и выше уже не поддаются перебору при ряде условий, так еще и описанный алгоритм рассматривается в рамках конкретной задачи, где длина строго 8.
Тело цикла действительно нелицеприятное. Как было сказано, для #omp parallel for collapse(8) необходимо условие «идеально вложенных» циклов, поэтому пришлось выкручиваться.
?
Ни один зрелый нарушитель не будет проводить DCSync от имени пользовательской учетки, поэтому отбрасывать машинные УЗ – такое себе. Детектирование на основе фильтрации трафика / мониторинга IP-адреса источника DRSGetNCChanges – это да, норм тема.
Приветствую! Спасибо за комментарий, поправил листинг. Что касается смены хеша без прав ДА – это умеет делает API SamiChangePasswordUser из samlib.dll. Она (функция) не документирована, ближайшее описание живет в MS-SAMR. Работать с ней умеет SetNTLM.ps1 и мой скрипт из Impacket. Также не забывайте, что мы меняем пароль УЗ из-под этой самой УЗ, поэтому ничего удивительного, что мы можем изменить соответствующий хеш, нет ;-)
Я в домике ?
Мы с коллегами, кто сдавал обновленную версию, пришли к выводу, что ни ход экзамена, ни его сложность не изменились ;-)
Сдавал осенью 2021 года, поэтому на тот момент ограничений не было.
Из того, с чем я работал в контексте обхода защиты, «Касперский» всегда был в выигрышной позиции (его обходить труднее всего). В плане юзабилити лично мне он тоже нравится больше других вендоров, на домашней тачке уже давно стоит KIS, и я вполне доволен :)
Конечно, это тоже очень верная рекомендация. Однако зачастую решение отобрать у пользователей локального админа насовсем неприменимо из-за особенностей рабочего процесса сотрудников целевой компании, а рекомендовать всем сотрудникам «безопасно использовать» свои привилегированные локальные учетки не очень надежна в плане ее соблюдения :)
Поэтому лучше всего — на корню срубить потенциальный импакт, который дамп может дать злоумышленнику, а именно, исключить появление в нем привилегированных доменных УЗ.
Все верно. Плюс на токене процесса, который делает дамп, должна быть навешана (и активна) привилегия
SeDebugPrivilege
.urllib.request
и просить html черезurlopen()
, а потом декодировать байты в текст, но зачем, если естьrequests
? По времени разницы особой не будет (грубый пример, но все же):Или Вы про само написание
"import requests; requests.get()"
вместо"from requests import get; get()"
?