Comments 194
у меня на edge сработало
Но я не понял одного момента, вроде в IE, в настройках по умолчанию, автоматический логон разрешен только в Intanet zone.
Т.е. эта атака подействует если пользователь изменил настройки безопасности?
Или я чего-то не понимаю?
Вот за это огромное спасибо!
Правда с другой стороной, когда пытаешься развернуть какой-нибудь web сервис, на который доменный пользователь должен автоматом заходить, то приходится его адрес вносить в Trusted Sites. И только тогда пользователь начнет заходить, до этого у него спрашивает авторизацию.
Вообщем надо мне этот момент поподробней изучить, видимо.
В первый момент возникала мысль: а что, ещё не все провайдеры блокируют 445-ый порт?
Для меня оказалось откровением то, что популярные утилиты — Hashcat (-legacy) и John The Ripper (OpenCL-реализация) — неправильно взламывают NTLMv2-хеши. Просто не могут подобрать пароль, хотя он гарантированно есть в словаре. С oclHashcat и Hashcat 3.0, вроде бы, все в порядке. Остается только догадываться, сколько паролей не было взломано из-за этих ошибок…
А можно поподробнее?
Скорее всего некорректно сформирован хеш для брута, сам на этом попадался в jtr. Но если с этим же хешем иные сборки работают правильно, то дело конечно в самих крякерах.
apistoletov@outlook.com::MicrosoftAccount:1122334455667788:9C22646B3139840F7B0F83ED88D0EE5F:01010000000000004013BCA0D0E4D10182D8FAEDA695C1340000000002000A0053004D0042003100320001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D00420031003200080030003000000000000000010000000020000020B3933DD93DA6CA0E16279689BEEB7BD3F8DB084528F396AA0B9899391BCC310A001000000000000000000000000000000000000900200063006900660073002F00330031002E003200320030002E0035002E00340033000000000000000000
Пароль — 123123qq. Hashcat-legacy не находит. Сейчас поищу еще без пароля, которые john с --format=ntlmv2-opencl не мог сбрутить.
которые john с --format=ntlmv2-opencl не мог сбрутить
было бы здорово
valdikss::MicrosoftAccount:1122334455667788:F74ECC1AECC1D113782C823BB330772E:010100000000000039B063751BECD1017BAAF43DFFEEB51D0000000002000E004E004F004D00410054004300480001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D0042003100320008003000300000000000000001000000001000007A91E6D78F02D98EB60F535074AB74D9FA5E62D85D40CB60DC5510339F9537450A001000000000000000000000000000000000000900340063006900660073002F00770069007400630068002E00760061006C00640069006B00730073002E006F00720067002E00720075000000000000000000
Пароль — 123qq
cc: Intercepter
$ cat ValdikSS_2.dic
123qq
$ cat ValdikSS_2.pass
valdikss::MicrosoftAccount:1122334455667788:F74ECC1AECC1D113782C823BB330772E:010100000000000039B063751BECD1017BAAF43DFFEEB51D0000000002000E004E004F004D00410054004300480001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D0042003100320008003000300000000000000001000000001000007A91E6D78F02D98EB60F535074AB74D9FA5E62D85D40CB60DC5510339F9537450A001000000000000000000000000000000000000900340063006900660073002F00770069007400630068002E00760061006C00640069006B00730073002E006F00720067002E00720075000000000000000000
$ ./john --format=ntlmv2-opencl -w=ValdikSS_2.dic -pot=ValdikSS_2.pot ValdikSS_2.pass
Device 1: Tahiti
Loaded 1 password hash (ntlmv2-opencl, NTLMv2 C/R [MD4 HMAC-MD5 OpenCL])
Press 'q' or Ctrl-C to abort, almost any other key for status
123qq (valdikss)
1g 0:00:00:00 DONE (2016-08-02 09:52) 2.857g/s 5.714p/s 5.714c/s 5.714C/s 123qq
Use the "--show" option to display all of the cracked passwords reliably
Session completed
Есть возможность поподробнее описать ситуацию тут? — https://github.com/magnumripper/JohnTheRipper/issues/2194
проксировать запросы от клиента к удаленному серверу и от сервера к клиенту, и успешно на нем аутентифицируетесь!
Правильно ли я понимаю, что это работает только если у клиента разрешен NTLMv1? По умолчанию он запрещен начиная с Win 7, с чем у нас были как-раз проблемы, так как Alfresco очевидно не может поддерживать NTLMv2 pass through authentication :(
В любом случае, находка с MS Account шикарная, вся кривая попытка MS сделать облачный «домен» из обычного трещит по швам :) Полагаю, есть даже шанс что исправят на сей раз. Облако — это у них сейчас святое.
Не надо таких глупостей писать, построенные на OAuth «облачные домены» сейчас используются более-менее всеми, и то же самое использует облако MS. Вся проблема в том, что MS, в отличие от остальных провайдеров аутентификации, надо тащить груз обратной совместимости с кучей древнего и/или криво написанного софта, отсюда периодически и всплывают косяки.
MS вместо логичной архитектуры прикрутили облако к Windows всеми костылями, какие были под рукой. Причем в W8 это было бы простительно, но то что в W10 работы над ошибками не случилось — показательно.
«Кривое» встраивание — это следствие из того, о чем я вам пишу — нужна обратная совместимость. Если юзер залогинен с аккаунтом MS, он, тем не менее, должен всё ещё быть способен работать внутри рабочей или домашней сети, в том числе иногда и с ресурсами, которые не понимают ничего, кроме NTLM.
Я уверен, что вы, как большой гуру в таких делах, всё сделали бы сразу и без ошибок, но, к сожалению, такие идеальные люди, как вы, не проектируют софт и не пишут код. Поэтому периодически появляются такие ошибки. А также случаются всякие нearthbleed, shellshoсk, дырки в аутентфикации различных сервисов, и т.п. :) А мы с этим живем.
в котором в свою очередь без Кербероса (а его не будет, если это домашний пользователь) без вариантов используется древний NTLM
Тут по соседству в ветке как раз обсуждается PKU2U.
No NTLM hash is leaked. Edge.
:1122334455667788:813A2FE0D59A69680908C8E808F49BBF:0101000000000000504BB5280BECD101B87D68927A8E96360000000002000E004E004F004D00410054004300480001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D0042003100320008003000300000000000000000000000002000005377377153B0C0362E732719935BDA82E8614B42CAE0BB1D711EB51514F93B0A0A001000000000000000000000000000000000000900340063006900660073002F00770069007400630068002E00760061006C00640069006B00730073002E006F00720067002E00720075000000000000000000
Потом no hash is leaked
Неужто такой хэш брутится??
Windows 10/Firefox 47. Пишет:
C Edge то же самое, открытие новой вкладки с file:// не помогает…
Сервис 2ip выдал верный браузер и систему.
Хочу отметить, что ваш сервис раньше выдавал верные данные, т.к. я видел ваш сайт раньше. Но после последнего накопительного обновления теперь некорректно определяет ни браузер ни систему, тот же IPLEAK выдает верные данные. Не знаю, с чем связано, возможно какие-то недокументированные патчи.
Не поленился, запустил IE11. Результат вообще огонь:
Можно без фаервола групповыми политиками:
- Network security: Restrict NTLM: Incoming NTLM traffic.
- Network security: Restrict NTLM: Outgoing NTML traffic to remote servers.
https://technet.microsoft.com/library/jj852213(v=ws.10).aspx
https://technet.microsoft.com/library/jj852167(v=ws.10).aspx
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0]
"RestrictReceivingNTLMTraffic"=dword:00000002
"RestrictSendingNTLMTraffic"=dword:00000002
Не наступите на мои грабли.
An authentication error has occurred.
The function requested is not supported.
Подключился через PowerShell, удалил эти значения из реестра — RDP заработал.
Видимо здесь срабатывает комбинация факторов.
В любом случае — лучше проверить, чтоб не остаться без рук.
Обращение по RDP к доменному серверу по имени (в том числе с недоменной машины) — не перестаёт, там работает Kerberos.
Обращение по RDP к недоменному серверу, или к любому по IP — перестанет, надо дополнительно включить политику «NTLM: Добавить удаленные серверы в исключения....»
Исключения можно добавить вообще для любых серверов, законно требующих NTLM, не только RDP.
Ага, отваливается в том числе и Azure VM RDP, причем жестко
Сегодня вот отобщался с саппортом который помогал восстановить доступ к машине по RDP. Печально вот так применять реестрик чтобы одну проблему исправить, а вторую, скрытую, добавить.
А что они делают — вполне понятно. А вот почему такая комбинация приводит к неработоспособным новым RDP ( которые с NLA) — не очень понятно, потому как NTLM это вроде как не очень свежее и очень внутридоменное и локальное, и какого это внутрилокальное влияет на RDP по интернету (куда никакие NTLM вообще ходить не должны ) — не так уж очевидны
NTLM сам по себе не имеет никакого отношения ни к домену, ни к локальности — это просто встроенный в Windows протокол аутентификации, который изначально был основным, а сейчас по умолчанию используется, когда по какой-то причине недоступен Kerberos (например, при аутентификации на одиноком недоменном хосте). Интернет там или не интернет — разницы никакой.
NLA же вообще не влияет на выбор способа аутентификации, а просто позволяет аутентифицировать пользователя до того, как тот установит RDP-сессию, а не после, как было до появления этого механизма.
Поэтому надо понимать, что полное отключение NTLM отрубит доступ, в частности, ко всем недоменным ресурсам, для которых используется встроенная аутентификация Windows (если не предпринять каких-то мер, чтобы этого избежать).
Ну раз они все такие друг с другом не связанные — почему при выключеном NTLM не пускает на сервер по RDP (сервер не в домене, просто свежая виртуалка в ажуре) пока на сервере включен NLA.
Выключаем NLA на сервере при выключенном NTLM на клиенте — все работает снова, включаем NLA и включаем NTLM — все тоже ок.
Это клево конечно что МС в документации написали что никто ни на что не влияет, но по полученному фидбеку от инженера МС саппорта — они тоже удивились когда мы вместе докопались до реальной причины.
Саппорт первой линии — это не всезнающие люди. Обычно они более-менее натасканы на решение часто встречающихся проблем, а запрет NTLM на клиенте к таковой не относится.
Это была вторая линия, первая обычно там мартышки на телефоне, он лазил по логам… Ну или они сильно проапгрейдили саппорт.
Извините но или я не понимаю ваши аргументы или вы не очень четко объясняете, т.к. я все еще не могу понять:
при ВКЛЮЧЕННОМ NLA на сервере в облаке ( не доверенный домен, не локальная сеть, не VPN) почему клиентские настройки NTLM влияют на способность подсоединяться по RDP?
Пока у меня сложилось впечатление что вы утверждаете что настроки NTLM на клиенте НЕ могут влиять на способность ходить по RDP на сервер с NLA. Но тогда ваши утверждения противоречат моей реальности.
Когда работает RDP без NLA, там механизма сетевой аутентификации как такового нет. Вы просто открываете RDP-сессию на сервер, и он локально обрабатывает весь ваш ввод. Поэтому NTLM тут не при делах.
Что происходит, когда работает NLA?
Клиент подключается, сервер просит NLA. А дальше задействуется механизм согласования протокола аутентификации между клиентом и сервером (SPNEGO), который и согласовывает протоколы из доступных на сервере и клиенте. Этот протокол не является частью RDP-клиента, он общесистемный. Именно это я имел в виду, говоря «NLA сам по себе не влияет на выбор протокола». Что система предложит, то и будет использоваться. Проблема в том, что по умолчанию система предлагает либо Kerberos, либо NTLM. То есть при недоступности домена остаётся только NTLM, отсюда и грабли.
Важная ремарка: после этого перестает пускать по RDP.
Не наступите на мои грабли.
Не только RDP, после этого не работают сетевые ресурсы \\COMPUTERNAME
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0]
"RestrictSendingNTLMTraffic"=dword:00000002
"RestrictReceivingNTLMTraffic"=dword:00000002
Если наступили на эти грабли и у вас перестал работать RDP к серверам — вот как вычистить эти эээ "настройки безопасности" через PowerShell ( выполнять под админом):
# these settings are the conflicting configuration on the client
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -name "RestrictReceivingNTLMTraffic"
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -name "RestrictSendingNTLMTraffic"
# Remove these settings to restore NLA support for RDP and working latest RDP to Azure VMs
Remove-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -name "RestrictReceivingNTLMTraffic"
Remove-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -name "RestrictSendingNTLMTraffic"
# Restore these settings to have protection from NTLM hash leak until there will be better ways to prevent the problem
#Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -name "RestrictReceivingNTLMTraffic" -value 2
#Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -name "RestrictSendingNTLMTraffic" -value 2
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -name "RestrictReceivingNTLMTraffic"
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -name "RestrictSendingNTLMTraffic"
"> Итак, мы выяснили, что любой, кто попытается открыть какой-то файл или директорию с нашего SMB-сервера из-под Windows, автоматически отправит свои данные либо локального аккаунта, либо аккаунта Microsoft, либо логин и хеш пароля от VPN. Что же мы можем с этим сделать?
Ничего, потому что это дефолтное поведение дефолтных настроек NT 6.0.
Известно это 10 лет, и лечится настройками NTLMv2. EPA, в частности.
http://www.atraining.ru/lm-ntlm-ntlmv2-armoring/
Проверено с 5 серверов и домашней машины — ничего оный тест не видит, ничего ему не отправляется.
Ломать дефолтные настройки винды, которые сделаны для совместимости — удобно и приятно, я понимаю.
Просто реальность такова, что это не дыра — это личный уровень компетентности автора.
Примерно поэтому мы курсы дописываем по материалу сами, а не стандартные Microsoft'овские про Next-next-finish читаем. Потому что натаскивание на «как можно быстрее деплоить дефолтные конфиги» приводит к таким вот постам.
СЕНСАЦИЯ! ВЕНДА ВЗЛОМАНА ПОЛНОСТЬЮ! ПАРОЛЬ МОЖНО ПОДОБРАТЬ ЗА ПОЛСЕКУНДЫ! Ну и так далее. На тему а-ля «по дефолту, оказывается, LM-хэш сохраняется»."
Почему поведение винды, по дефолту, практически во всех случаях, это «лечь и раздвинуть ноги»?
1. Отключил хранение хэшей LAN Manager (было и так включено в политиках)
2. Отправка только NTLMv2-ответов с отказом от LM и NTLM
3. Требование NTLMv2 при RPC-запросах (на всякий случай)
4. EPA: HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ LSA \ DWORD-параметр SuppressExtendedProtection 0 и 3 пробовал
5. EPA для SMB: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \ DWORD-параметр SmbServerNameHardeningLevel 1 и 2 пробовал
Ничего из этого не помогло против WITCH. Блокировать полностью NTLM трафик пока не готов, как советуют коллеги выше и ниже
>Блокировать полностью NTLM трафик пока не готов, как советуют коллеги выше и ниже
Не надо сразу блокировать. Надо сначала включить аудит и посмотреть, а куда у вас вообще машина по NTLM ходит.
А если вы сами уже точно знаете, куда должна — тогда включаете политику для блокировки и политику для исключений, они там рядышком.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0]
"RestrictReceivingNTLMTraffic"=dword:00000002
"RestrictSendingNTLMTraffic"=dword:00000002
"ClientAllowedNTLMServers"=hex(7):31,00,39,00,32,00,2e,00,31,00,36,00,38,00,2e,\
00,2a,00,00,00,00,00
это оставляет 192.168.* рабочими
Windows не может получить доступ к \\COMPUTERNAME
Проверьте правильность написания данного имени. В противном случае возможна проблема с вашей сетью. Для определения и разрешения проблем с сетью щелкните кнопку «Диагностика».
Win10 Pro, 192.168.0.0/24
ну либо закрывать фаерволом
При этом, блокировать tcp/445 — маловато будет.
Занимался давно, могу наврать, но:
1) CIFS умеет работать как по tcp, так и по udp. Соответственно надо фильтровать и udp/445
2) SMB, со всей своей утечкой хешей, бывает (был?) и через NBT. А это уже tcp/139.
Есть мнение, что локально это блокируется отвязкой CIFS от VPN-интерфейсов использующихся для анонимизации.Не работает, я проверил. С OpenVPN работает, т.к. он устанавливает свой драйвер сетевого интерфейса, а вот на VPN-подключениях Windows не работает.
NetBIOS через TCP по умолчанию отключили в каком-то недавнем обновлении.
А если дома не один комп — лучше перестраховаться, тем более, что NetBios в Интернет не нужен
С отрицанием история забавная — на каждом мероприятии у MS рассказывают про более продвинутую атаку на Kerberos, а этой как бы не существует, хотя даже в STIG нет рекомендаций по фильтрации NTLM.
P.S. Думаю, надо дополнить, что Avast IS у меня работал в параноидальном режиме.
))))
Я думал они уже давно NTLM выпилили, он уже довольно давно считается устаревшим и небезопасным. Вместо него предлагаяется использовать Kerberos.
А то что настройка игнорируется, вообще "порадовало" — вот это настоящий epic fail!
@ValdikSS, спасибо, читать как всегда очень интересно и познавательно.
Собственно, вся безопасность Kerberos достигается за счет наличия отдельного доверенного сервера (KDC), который проверяет учетные данные пользователей и, в случае их корректности, предоставляет билеты на доступ к сервисам. И понятно, что если два компьютера не входят в один и тот же домен, то KDC которому могли бы доверять оба этих компьютера, просто напросто не существует.
В общем, Kerberos далеко не панацея и наличие NTLM вполне оправдано, на мой взгляд. Хотя, конечно, с описанным в статье поведением бороться надо. Например, по умолчанию активировав запрет на доступ к удаленным SMB-серверам
Благодарю за развернутый ответ! Я просто не думал что NTLM сейчас где-то может использоваться без нормального контроллера домена.
Ведь в этом случае вам придется вручную настраивать учетные записи на компьютерах и синхронизировать пароли между клиентом и сервером, иначе NTLM не заработает.
Насколько мне известно на данный момент для построения сетей без контроллера домена, у Microsoft есть новая фишка, называется она "Домашняя группа". Там используется протокол PKU2U, который, если не ошибаюсь, и использует Kerberos для аутентификации пользователей.
Да, я в курсе про домашнюю группу, но пользоваться ей, лично мне, было не удобно — слишком много магии. Нигде нет нормального описания как это работает и что делать, когда что-то сломалось. Проще уж одинаковых учеток насоздавать.
Про PKU2U я правда не знал, и нормального описания этого протокола пока не нашел. Буду благодарен за полезные ссылки на эту тему.
Сразу хочу сказать, что для досконального изучения документа у меня не хватает ни времени, ни мотивации, ни компетентности. Тем не менее после прочтения некоторые, возможно ошибочные, выводы я сделал.
Во-первых, в документе нигде не говорится про парольную аутентификацию, везде описывается применение сертификатов. Не, PKI — это конечно замечательно, но для SOHO, на мой взгляд, это overkill, а у крупных предприятий для этого есть домен и Kerberos.
Во-вторых, даже если возможность парольной аутентификации есть, то преимуществ перед NTMLv2 я, в данном случае, не вижу, поскольку в качестве KDC предлагается использовать потенциально передоверенного участника взаимодействия, играющего роль сервера. Т.е., в контексте данной статьи, PKU2U не помог бы никак. Все равно на сервер злоумышленника ValdikSS передалась бы некоторая производная от пароля. А имея эту производную и зная алгоритм её получения, можно подобрать пароль атакой по словарю или брутфорсом (ну или обломиться, если пароль достаточно сложный).
Все равно на сервер злоумышленника ValdikSS передалась бы некоторая производная от пароля. А имея эту производную и зная алгоритм её получения, можно подобрать пароль атакой по словарю или брутфорсом
Вы только что повергли в прах всю современную криптографию. :)
В том же Kerberos клиент передает, на начальном этапе, на сервер текущее время зашифрованное симметричным алгоритмом, используя в качестве ключа хеш от пароля. Бери и подбирай.
Для начала вам надо компьютер ручками добавить в «домашнюю группу» (или автоматически — в случае использования PKI), после чего используется механизм PKINIT для преаутентификации.
При использовании сертификатов у меня вопросов к протоколу нет — всё логично. Но я не могу понять, как он работает без сертификатов и работает ли вообще. Что происходит при добавлении в домашнюю группу по паролю? Создается новый сертификат? Кто выступает в роли центра сертификации? Почему ему доверяют другие участники группы?
Если вы в теме, напишите, пожалуйста, развернутый комментарий или даже статью. Думаю, многим полезно будет — информации по протоколу и технической информации по домашней группе кот наплакал.
На статью у меня материала нет, но исследовать, как оно на самом деле в текущей реализации функционирует — мысль интересная. :)
В принципе, в Windows 10 есть возможность дать доступ пользователю к компьютеру по имени его (пользователя) учетной записи Microsoft. Думаю, при этом используется механизм схожий с описанным выше. Но будет ли при этом доступ по SMB, я пока не проверял.
Но вообще на замену NTLM PKU2U не тянет, хотя бы потому, что все сценарии использования NTLM он не покрывает.
Согласен, свободных реализаций к сожалению пока нет. Но для таких вот случаев я бы сделал галочку в венде как с клиентом Telnet.
Если вы Ъ-админ, вы конечно можете поднять свой контроллер домена на nas, но этот вариант к сожалению не всем подходит...
Как по мне, единственное рабочее решение — это таки провайдерам перекрывать порты. Причем вплоть до на уровне закона. Кому таки очень надо через Интернет ползать на SMB-ресурсы пускай городит VPN. И это по-любому правильнее.
Как по мне это решение совсем неправильное. Провайдера совсем не должно беспокоить какие порты у меня открыты и для чего. Максимум, как опция у провайдера (у билайна такая есть).
Правильное решение это если Microsoft выпустят патч который разрешает использование NTLM по умолчанию только для локальных подключений.
Почему не смогут? — смогут, просто им свой логин и пароль нужно будет ввести вручную при первом подключении, там и галочка есть "сохранить пароль" и "подключаться автоматически"
Вот уж не поверю что вы на своем сервере создаете такие же учетки как у пользователя на лаптопе, только ради того что бы автоматический вход работал...
Вот патч, который таки запретит посылку имени и пароля автоматом — это да, решило-бы проблему.
P.S. я не создаю на сервере учетки, совпадающие с юзеровскими учетками на их домашних лаптопах. А вот они таки да, создают локальные аккаунты, совпадающие с их рабочим аккаутом, дабы иметь прозрачный доступ к ресурсам. Но это действительно, уже совсем другая проблема.
Вообще не понимаю людей, кто ставит ванильную винду и к тому же с аккаунтом от мелкософта.
Файлволл ничего не блочит
telnet 31.220.5.43 445
— работаетНекоторые провайдеры, например Ростелеком, блокируют доступ по этим портам в своих сетях, что довольно мило с их стороны.
Боюсь что это не так…
Кстати, requestPolicy заблокировал 1 картинку… интересно насколько хорошо он ее не пропустил?
Просто на всякий случай распишу, как читать полученные хеши и как получать из них свои пароли (чтобы проверить, например, проверить правильность работы). Распишу потому, что сам с протоколом NTLMv2 знаком не был и пришлось разбираться, как проверить, что полученный хеш содержит пароль от моего аккаунта.
Для примера рассмотрим хеш, который приводит автор статьи в одном из комментариев. Выглядит хеш следующим образом:
valdikss::MicrosoftAccount:1122334455667788:F74ECC1AECC1D113782C823BB330772E:010100000000000039B063751BECD1017BAAF43DFFEEB51D0000000002000E004E004F004D00410054004300480001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D0042003100320008003000300000000000000001000000001000007A91E6D78F02D98EB60F535074AB74D9FA5E62D85D40CB60DC5510339F9537450A001000000000000000000000000000000000000900340063006900660073002F00770069007400630068002E00760061006C00640069006B00730073002E006F00720067002E00720075000000000000000000
Когда я впервые увидел такой-же хеш для своего аккаунта, моей первой мыслью было: "ну и где тут именно хеш моего пароля?", потому что для меня хеширование и его результат представлялось как что-то типа md5("password") = abc34.......gb. А тут столько данных.
Итак. В протоколе NTLMv2 используется хеширование, которое в качестве входных данных использует не только сам пароль, но и имя аккаунта, имя домена, в котором аккаунт находится, а также (далее подробнее) server challenge (SC)
и client challenge (CC)
.
Значения SC
и CC
используются в качестве дополнительных данных, передаваемых сервером клиенту (SC
) и клиентом серверу (CC
). При этом SC
формируется сервером независимо ни от чего, а вот CC
формируется на основе множества данных, генерируемых самим клиентом.
Формат, в котором представлен полный хэш (длиннющая строка выше) расшифровывается следующим образом:
AccountName::DomainName:SC:HASH:CC
1) AccountName — имя аккаунта. Тут всё понятно. В данном случае — valdikss. Может быть и просто именем, может быть и в виде адреса электронной почты — apistoletov@outlook.com.
2) DomainName — имя домена. Если вы не находитесь в домене (т. е. если у вас не серверная ОС), то по-умолчанию будет MicrosoftAccount.
3) SC — Server challenge. Строка длиною в 8 байт, сгенерированная сервером случайным образом. Отправляется сервером клиенту в качестве ответа на запрос авторизации. В данном случае: 1122334455667788
4) HASH — итоговый хеш. Тот самый хеш, который мы хотим проверить (ну или сбрутфорсить, если заранее не знаем пароля). В данном случае — F74ECC1AECC1D113782C823BB330772E.
5) CC — Client challenge. Огромная строка, которая по-другому называется blob (в некоторых статьях указывается название CC, а в некоторых blob, при этом CC называется другая строка, входящая в blob). CC формируется клиентом из множества данных и имеет следующую структуру:
НазваниеРазмер (байты)Значение из примера
Постоянное значение, открывает начало blob-строки4`01010000`
Постоянное значение, зачем оно нужно, неизвестно4`00000000`
Timestamp8`39B063751BECD101`
Сlient challenge (его ещё называют Client nonce)8`7BAAF43DFFEEB51D`
Постоянное значение, назначение неизвестно4`00000000`
Target information block. Набор значений, включающих имена NetBios в кодировке UTF-16LEМеняющаяся`02000E004E004F004D00410054004300480001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D0042003100320008003000300000000000000001000000001000007A91E6D78F02D98EB60F535074AB74D9FA5E62D85D40CB60DC5510339F9537450A001000000000000000000000000000000000000900340063006900660073002F00770069007400630068002E00760061006C00640069006B00730073002E006F00720067002E007200750000000000`
Постоянное значение, назначение опять неизвестно4`00000000`
Чуть более подробно рассмотрим структуру поля Target information block:
НазваниеРазмер (байты)Значение из примера
Тип данных, хранящихся в этом блоке (`0x0000` — конец блока
`0x0100` — имя сервера
`0x0200` — имя домена
`0x0300` — полное DNS-имя сервера (maps.yandex.ru)
`0x0400` — DNS-имя сервера (yandex.ru)2`0200` (в нашем случае должно быть имя домена)
Длина значения в байтах2`0E00`
Значение в кодировке UTF-16LEМеняющаяся длина (указана в предыдущем поле)`4E004F004D00410054004300480001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D0042003100320008003000300000000000000001000000001000007A91E6D78F02D98EB60F535074AB74D9FA5E62D85D40CB60DC5510339F9537450A001000000000000000000000000000000000000900340063006900660073002F00770069007400630068002E00760061006C00640069006B00730073002E006F00720067002E007200750000000000`
В данном случае значение поля "Значение" при переводе в символы unicode даёт следующее:
NOMATCH SMB12 SMB12 SMB12 SMB1200 i삝㦖鏣둙䷎ች幔퓘콓贱ᬏ赬ᨪ穉켊 4cifs/witch.valdikss.org.ru
И мне это, честно говоря, не очень пока понятно.
Так, окей, со структурой хеша разобрались. Теперь, как же нам получить этот самый хеш, зная пароль? В протоколе NTLMv2 алгоритм получения хеша следующий:
- Преобразуем пароль в последовательность байт юникод-кодировки UTF-16LE (именно LE!).
- Полученную последовательность хешируем алгоритмом md4.
- Имя пользователя переводим в верхний регистр. Объединяем его в одну строку с именем домена. Полученную строку преобразуем в последовательность байт UTF-16LE. Полученную последовательность хешируем алгоритмом HMAC-md5, используя значение из шага 2 в качестве ключа.
- Объединяем в одну строку SC и CC (blob) и хешируем полученную строку (преобразовывать в UTF-16LE не надо, т.к. эти две строки и так уже представлены в шестнадцатеричном виде) алгоритмом HMAC-md5, используя значение из шага 3 в качестве ключа.
Всё, результат из шага 4 и есть искомый хеш.
Далее представляю код на php, реализующий данный алгоритм:
<?php
function GenerateNTLMv2($password, $account, $domain, $server_challenge, $blob) {
$unicode_password= iconv ( 'UTF-8', 'UTF-16LE', $password );
$NTLM_Key = mhash ( MHASH_MD4, $unicode_password);
$NTLM_Hash = mhash ( MHASH_MD5, iconv ( 'UTF-8', 'UTF-16LE', strtoupper ( $account ) . $domain ), $NTLM_Key );
$NTLM_Chal_Hash = mhash ( MHASH_MD5, pack ( "H*", $server_challenge . $blob ), $NTLM_Hash );
return strtoupper ( bin2hex ( $NTLM_Chal_Hash ) );
}
$password = '123qq';
$blob = '010100000000000039B063751BECD1017BAAF43DFFEEB51D0000000002000E004E004F004D00410054004300480001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D0042003100320008003000300000000000000001000000001000007A91E6D78F02D98EB60F535074AB74D9FA5E62D85D40CB60DC5510339F9537450A001000000000000000000000000000000000000900340063006900660073002F00770069007400630068002E00760061006C00640069006B00730073002E006F00720067002E00720075000000000000000000';
$server_challenge = '1122334455667788';
$domain = 'MicrosoftAccount';
$account = 'valdikss';
echo GenerateNTLMv2($password, $account, $domain, $server_challenge, $blob);
?>
Выполнить код в песочнице
Выполнив данных код, получим значение:
F74ECC1AECC1D113782C823BB330772E
что и равняется нашему полю HASH из полученного общего хеша (AccountName::DomainName:SC:HASH:CC).
P.S. Kalter и Funbit как по мне и не должно работать и нужно специально настраивать чтобы заработало :)
P.S. провайдера я сразу «сменил» с помощью OpenVPN на того который точно SMB не блочит, трафик на порт точно ходит. В общем буду думать что и где у меня совсем не так.
Все отлично работает, к сажалению(
https://s.mail.ru/7RKm/WA5NR2Hsi
Касперский негодует!
Ниже представлено содержимое пакетного файла bat вносящего изменения в правила брандмауэра Windows. Для запуска пакетного файла требуются права администратора. Работа пакетного файла проверялась на Windows 7.
Перед применением правил создается файл с текущими правилами брандмауэра Windows «c:\tmp\log_rule_org.txt», после применения правил создается файл с новыми правилами — «c:\tmp\log_rule_new.txt». Соответственно сравнив эти два файла можно проверить изменения в правилах брандмауэра.
В правила вносится блокировка SMB трафика для всех IP адресов IPv4 за исключением частных адресов: 10.0.0.0/8, 127.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16.
Windows7-Netsh_AdvFirewall_Firewall.bat
@chcp 1251
netsh advfirewall firewall show rule name=all > c:\tmp\log_rule_org.txt
:: SMB 137 (TCP, UDP)
netsh advfirewall firewall add rule name=«SMB_137(TCP-In)» dir=In action=block enable=yes profile=any localip=any remoteip=0.0.0.0-9.255.255.255,11.0.0.0-126.255.255.255,128.0.0.0-172.15.255.255,172.32.0.0-192.167.255.255,192.169.0.0-255.255.255.255 localport=137 remoteport=any protocol=tcp
netsh advfirewall firewall add rule name=«SMB_137(UDP-In)» dir=In action=block enable=yes profile=any localip=any remoteip=0.0.0.0-9.255.255.255,11.0.0.0-126.255.255.255,128.0.0.0-172.15.255.255,172.32.0.0-192.167.255.255,192.169.0.0-255.255.255.255 localport=137 remoteport=any protocol=udp
netsh advfirewall firewall add rule name=«SMB_137(TCP-Out)» dir=out action=block enable=yes profile=any localip=any remoteip=0.0.0.0-9.255.255.255,11.0.0.0-126.255.255.255,128.0.0.0-172.15.255.255,172.32.0.0-192.167.255.255,192.169.0.0-255.255.255.255 localport=any remoteport=137 protocol=tcp
netsh advfirewall firewall add rule name=«SMB_137(UDP-Out)» dir=out action=block enable=yes profile=any localip=any remoteip=0.0.0.0-9.255.255.255,11.0.0.0-126.255.255.255,128.0.0.0-172.15.255.255,172.32.0.0-192.167.255.255,192.169.0.0-255.255.255.255 localport=any remoteport=137 protocol=udp
:: SMB 138 (UDP)
netsh advfirewall firewall add rule name=«SMB_138(UDP-In)» dir=In action=block enable=yes profile=any localip=any remoteip=0.0.0.0-9.255.255.255,11.0.0.0-126.255.255.255,128.0.0.0-172.15.255.255,172.32.0.0-192.167.255.255,192.169.0.0-255.255.255.255 localport=138 remoteport=any protocol=udp
netsh advfirewall firewall add rule name=«SMB_138(UDP-Out)» dir=out action=block enable=yes profile=any localip=any remoteip=0.0.0.0-9.255.255.255,11.0.0.0-126.255.255.255,128.0.0.0-172.15.255.255,172.32.0.0-192.167.255.255,192.169.0.0-255.255.255.255 localport=any remoteport=138 protocol=udp
:: SMB 139 (TCP)
netsh advfirewall firewall add rule name=«SMB_139(TCP-In)» dir=In action=block enable=yes profile=any localip=any remoteip=0.0.0.0-9.255.255.255,11.0.0.0-126.255.255.255,128.0.0.0-172.15.255.255,172.32.0.0-192.167.255.255,192.169.0.0-255.255.255.255 localport=139 remoteport=any protocol=tcp
netsh advfirewall firewall add rule name=«SMB_139(TCP-Out)» dir=out action=block enable=yes profile=any localip=any remoteip=0.0.0.0-9.255.255.255,11.0.0.0-126.255.255.255,128.0.0.0-172.15.255.255,172.32.0.0-192.167.255.255,192.169.0.0-255.255.255.255 localport=any remoteport=139 protocol=tcp
:: SMB 445 (TCP, UDP)
netsh advfirewall firewall add rule name=«SMB_445(TCP-In)» dir=In action=block enable=yes profile=any localip=any remoteip=0.0.0.0-9.255.255.255,11.0.0.0-126.255.255.255,128.0.0.0-172.15.255.255,172.32.0.0-192.167.255.255,192.169.0.0-255.255.255.255 localport=445 remoteport=any protocol=tcp
netsh advfirewall firewall add rule name=«SMB_445(UDP-In)» dir=In action=block enable=yes profile=any localip=any remoteip=0.0.0.0-9.255.255.255,11.0.0.0-126.255.255.255,128.0.0.0-172.15.255.255,172.32.0.0-192.167.255.255,192.169.0.0-255.255.255.255 localport=445 remoteport=any protocol=udp
netsh advfirewall firewall add rule name=«SMB_445(TCP-Out)» dir=out action=block enable=yes profile=any localip=any remoteip=0.0.0.0-9.255.255.255,11.0.0.0-126.255.255.255,128.0.0.0-172.15.255.255,172.32.0.0-192.167.255.255,192.169.0.0-255.255.255.255 localport=any remoteport=445 protocol=tcp
netsh advfirewall firewall add rule name=«SMB_445(UDP-Out)» dir=out action=block enable=yes profile=any localip=any remoteip=0.0.0.0-9.255.255.255,11.0.0.0-126.255.255.255,128.0.0.0-172.15.255.255,172.32.0.0-192.167.255.255,192.169.0.0-255.255.255.255 localport=any remoteport=445 protocol=udp
netsh advfirewall firewall show rule name=all > c:\tmp\log_rule_new.txt
@pause
Деанонимизируем пользователей Windows и получаем учетные данные Microsoft и VPN-аккаунтов