
Быстрый взлом вызовов/ответов MSCHAPv2 с использованием базы NT-хешей.
Быстро взламывайте challenge/response'ы MSCHAPv2/NTLMv1 с помощью базы NT-хэшей
Assless CHAPs — это эффективный способ восстановить NT-хэш, используемый в обмене MSCHAPv2/NTLMv1, если у вас есть challenge и response (например, из атаки WiFi EAP WPE).
Требуется база NT-хэшей, инструкции по её созданию из существующих списков или с помощью hashcat со словарями и правилами приведены ниже. Я включил пример базы из SecLists. Вам нужно распаковать её с помощью bunzip.
Обмен MSCHAPv2 не требует «взлома» пароля в открытом виде, нам нужен только используемый NThash.
MSCHAPv2 делит NThash на три части и использует каждую часть как разные ключи для DES-шифрования одного и того же challenge (полученного из peer и authenticator challenges). NTHash разбивается на два 7-байтовых ключа и один 2-байтовый ключ. Это означает, что последний ключ дополняется NULL для получения ключа необходимой длины. Его можно быстро перебрать благодаря эффективности DES и пространству ключей в 65 535. Получив эти два байта, мы можем найти в нашей базе все NThash'и, оканчивающиеся на эти два байта. Это даёт гораздо меньшее множество возможных хэшей для проверки.
Это форма компромисса между пространством и временем, похожая на радужную таблицу. Это также форма hash shucking.
Впервые это было представлено на Defcon 29's RF Hacking Village. Слайды включены в этот репозиторий.
Вот сравнение для трёх примеров challenge/response и трёх разных словарей: небольшого частного, rockyou и списка Have I Been Pwned. Тесты проводились на моём Macbook Pro 2016. Hashcat использует это hash schucking ядро и два встроенных GPU, а также чистое, а не оптимизированное ядро (последнего пока не существует). Hash3 отсутствует в списках для имитации наихудшей производительности. Я не включаю время, которое hashcat тратит на построение кэша словаря при первом запуске.
Hash1
Small hashlist:
hashcat 0.50s user 0.27s system 55% cpu 1.405 total (8597.8 kH/s)
assless 0.05s user 0.00s system 294% cpu 0.018 total
Rockyou hashlist:
hashcat 2.67s user 0.51s system 93% cpu 3.413 total
assless 0.05s user 0.01s system 281% cpu 0.021 total
HIBP hashlist:
hashcat 59.97s user 11.72s system 136% cpu 52.603 total (5620.6 kH/s)
assless 0.05s user 0.00s system 292% cpu 0.018 total
Hash 2
Small hashlist:
hashcat 0.51s user 0.27s system 55% cpu 1.409 total (8704.7 kH/s)
assless 0.03s user 0.00s system 248% cpu 0.012 total
Rockyou hashlist:
hashcat 2.20s user 0.46s system 110% cpu 2.409 total (5798.4 kH/s)
assless 0.03s user 0.00s system 231% cpu 0.015 total
HIBP hashlist:
hashcat 65.37s user 12.74s system 135% cpu 57.712 total (5768.7 kH/s)
assless 0.03s user 0.00s system 249% cpu 0.013 total
Hash 3
Hash 3 doesn't exist in any of the hashlists to simulate a worst case lookup performance.
Small hashlist:
hashcat 0.67s user 0.34s system 66% cpu 1.526 total (7550.1 kH/s)
assless 0.02s user 0.00s system 211% cpu 0.012 total
Rockyou hashlist:
hashcat 2.71s user 0.52s system 94% cpu 3.415 total (5685.4 kH/s)
assless 0.02s user 0.01s system 181% cpu 0.014 total
HIBP hashlist:
hashcat 125.19s user 27.62s system 139% cpu 1:49.75 total (5634.9 kH/s)
assless 0.06s user 0.03s system 115% cpu 0.075 total
Версия на Rust требует SQLite 3.6.8 или новее.
Версия на Python требует python3, sqlite3 и pycryptodome.
Утилита создания базы данных требует python3 и CLI sqlite3.
Это относится только к версии на Rust. Вам понадобится cargo.
Установив cargo, просто перейдите в каталог assless-chaps-rs и соберите с помощью:
cargo build --release
Полученный бинарник будет в каталоге target/release/.
Для assless требуются challenge, response и база NThash'ей. Опционально версия на Python может использовать встроенный оптимизированный файл поиска двух байтов. Простейшее использование выглядит так:
./assless-chaps <Challenge> <Response> <hashes.db>
Например:
./assless-chaps 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db
Вывод должен выглядеть так:
[-] Two byte lookup file not provided, will brute force instead.
[+] Found in 22636 tries: 586c
[-] Found 222 hashes ending in 586c
[+] Found hash: 8846f7eaee8fb1
[-] Found after 186 hashes.
[+] Found hash: 17ad06bdd830b7
[+] Full hash: 8846f7eaee8fb117ad06bdd830b7586c
Итоговый полный хэш 8846f7eaee8fb117ad06bdd830b7586c — это NT-хэш для password.
Я потратил некоторое время на построение списка всех 65 535 возможных двухбайтовых значений, отсортированных по наиболее часто встречающимся в большом корпусе паролей. Этот файл включён как twobytes. Вы можете просто передать его четвёртым аргументом assless.
Обычно это экономит несколько раундов DES, но не даёт большого прироста скорости. Возможно, если вы обрабатываете много хэшей.
python3 assless-chaps.py 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db twobytes
[+] Found in 65533 tries: 586c
[-] Found 222 hashes ending in 586c
[+] Found hash: 8846f7eaee8fb1
[-] Found after 186 hashes.
[+] Found hash: 17ad06bdd830b7
[+] Full hash: 8846f7eaee8fb117ad06bdd830b7586c
Файл mksqlitedb.py поможет превратить CSV-файл с хэшами в базу данных.
python3 mksqlitedb.py <database name> <csv file>
CSV-файл требует три столбца:
Например, хэш 8846f7eaee8fb117ad06bdd830b7586c станет:
586c,8846f7eaee8fb1,17ad06bdd830b7
Пример regexp-трансформации для этого:
echo 8846f7eaee8fb117ad06bdd830b7586c | sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\)$/\3,\1,\2/"
Вы можете либо взять существующий список хэшей (например, списки Have I Been Pwned), либо сгенерировать свои с помощью hashcat и ваших любимых комбинаций словарей/правил.
Списки паролей HIBP уже доступны для скачивания в виде NT-хэшей, нужно только удалить количество из файла и преобразовать их в формат CSV для импорта в базу данных.
Это можно сделать с помощью стандартной утилиты Unix sed следующим образом:
sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\):.*/\3,\1,\2/" pwned-passwords-ntlm-ordered-by-hash.txt > hibp.csv
После чего их можно импортировать с помощью mksqlitedb.py hibp.db hibp.csv.
Чтобы преобразовать обычный словарь в список nthash'ей, можно использовать nthasher, который быстро обрабатывает большие словари. Полученные хэши нужно будет преобразовать в требуемый формат CSV, как описано выше.
Гораздо более медленный nthasher, который выводит хэши сразу в нужном формате CSV, включён в этот репозиторий, и запускается просто так:
python3 nthash-from-clear.py <wordlist> > hashlist.csv
Если вы хотите расширить словарь с помощью правил, смотрите следующий раздел об использовании hashcat.
Вам нужно сделать небольшое изменение в коде модуля OpenCL для режима 1000, чтобы он выводил каждый хэш, а не только те, что соответствуют вашему кандидату. По умолчанию он генерирует хэш в правильном формате CSV.
OpenCL: cd hashcat/OpenCLpatch < m01000_a0-pure.cl.patchecho 11111111111111111111111111111111 > impossible_hashhashcat -m1000 impossible_hash rockyou.txt -r best64.rule --potfile-disable --quiet > rockyou.csvpython3 mksqlitedb.py rockyou.db rockyou.csvБаза данных SQLite обычно на 61% больше, чем CSV-файл, использованный для её создания. Создание базы данных также может занять некоторое время в зависимости от размера файлов. Соответственно подготовьте требования к файловой системе.
Вот пример с использованием словаря rockyou:
You could save space by converting and inserting each hash dynamically and skipping the need for the intermediary CSV file.
NTLMv1 будет работать точно так же, если только не используется SSP. Вы узнаете, что используется SSP, если получите LM-ответ, оканчивающийся на множество нулей. Вы можете использовать включённый ntlm-ssp.py для создания серверного challenge, который потребуется assless.
Запустите так:
python3 ntlm-ssp.py <lm response> <challenge>
Например, если мы используем пример NTLMv1-SSP challenge response из примеров хэшей hashcat:
u4-netntlm::kNS:338d08f8e26de93300000000000000000000000000000000:9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41:cb8086049ec4736c
Вы передадите LM и challenge следующим образом:
python3 ntlm-ssp.py 338d08f8e26de93300000000000000000000000000000000 cb8086049ec4736c
И получите следующий ответ:
The server challenge is: 724edf24aea0d68b
Который затем можно взломать с помощью assless-chaps как обычно:
./assless-chaps 724edf24aea0d68b 9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41 hashes.db