Взлом контейнера VeraCrypt с помощью hashcat
Все началось с того, что несколько месяцев назад я зашифровал некоторые файлы средней важности и средней секретности с помощью VeraCrypt.
Пароль от контейнера VeraCrypt я сохранил в KeePass. На самом деле нет, это было бы слишком просто. Проблема в том, что в кипасс я сохранил не сам пароль, а подсказки для пароля, из которых по памяти я бы мог пароль собрать/вспомнить в случае необходимости.
Пару раз мне это удавалось, я вспоминал пароль и получал доступ к своим файлам. Но недавно, когда в очередной раз эти файлы мне понадобились, у меня не получилось ничего вспомнить. Я попробовал штук 15 разных вариантов и ничего.
Когда пробуешь "угадать" пароль в самом VeraCrypt - это занимает около минуты (если пароль не верный). Чем длиннее пароль - тем дольше он тупит и перебирать все варианты вручную получается слишком долго, и начинаешь сомневаться, вдруг этот вариант ты еще не пробовал и т.д.
Поэтому я решил попытаться сбрутить пароль с помощью hashcat.
Для начала, чтобы удостовериться, что я все делаю правильно, я решил "подобрать" пароль для контейнера, пароль от которого мне на 100% известен.
В вики хешката пишут, что хеш из контейнеров веры извлекается точно так же, как хеш из контейнеров трукрипта, то есть просто нужно извлечь первые 512 бит:
dd if=/путь/до/контейнера of=/путь/до/будущего/файла/с/хешем.tc bs=512 count=1
(p.s. так как я точно не знал, что делает эта команда, контейнер я на всякий случай перед этим забэкапил, чтобы, если она его испортит, мне не пришлось рвать волосы на жопе)
Файлик с хешем получен, теперь пробуем брутить его трукриптовскими алгоритмами: https://hashcat.net/wiki/doku.php?id=example_hashes (6211 и так далее по этой ссылке)
Но для начала установим хешкат, потому что до этого я еще не:
brew install hashcat
в файл /путь/до/будущего/файла/с/найденными/паролями.txt я заранее поместил правильный пароль
hashcat -m 6211 -a 0 /путь/до/файла/с/хешем.tc /путь/до/словаря/с/паролями.txt -o /путь/до/будущего/файла/с/найденными/паролями.txt
где m=6211 это алгоритм хеширования, a=0 это алгоритм брута (при котором просто берутся строки из указанного файлика)
Получаю ошибку описанную здесь https://github.com/hashcat/hashcat/issues/3044
.../hashcat/sessions/hashcat.pid: No such file or directory
потому что из коробки как обычно нихуя не работает (Меня, если что, это всегда очень бесит. Я за то, чтоб все всегда работало из коробки)
Умный человек в комментариях к этой issue подсказал как пофиксить:
mkdir -p /путь_до_юзера/.local/share/hashcat/sessions
Следующая ошибка, которую я получил, описана здесь: https://github.com/hashcat/hashcat/issues/2270
clBuildProgram(): CL_BUILD_PROGRAM_FAILURE <program source>:11:10: fatal error: 'inc_vendor.h' file not found #include "inc_vendor.h"
В комментариях люди пишут, что когда ставишь через brew не всегда работает и нужно выполнить:
git clone https://github.com/hashcat/hashcat.git cd hashcat make sudo make install
то есть скопировать с гита, перейти в папку, собрать все и установить (и уже из этой папки запускать хешкат)
Но пароль никак не хочет "отгадываться"
Session..........: hashcat Status...........: Exhausted Recovered........: 0/1
Хотя он в файлике записан точно правльный, я проверял.
Пробую на всякий извлекать хеш со смещением (dd .. bs=1 skip=31744 count=512) хоть и уверен, что это не мой случай. Пробую разные алгоритмы хеширования отсюда https://hashcat.net/wiki/doku.php?id=example_hashes (от 6211 до 6242)
Кстати, интересный факт, когда вы хекаете алгоритмом 6213 - он включает в себя 6211 и 6212, так же и 6223 = 6221 + 6222. Не знаю точно как это работает, но это так.
И нихуя у меня не получается! Тестовые хеши из примера (которые как правило с паролем hashcat) - отлично брутятся, то есть команда точно правильная, но вот мой хеш никак не хочет ломаться.
Оказалось, что если хеш мы извлекаем как для контейнера трукрипт, это не значит что и алгоритм там трукрипт! Когда я от скуки начал смотреть какие вообще хеши hashcat умеет хекать я увидел что? Правильно - веракриптовские алгоритмы.
Захожу в свойства своего контейнера и интуитивно понимаю что мне подойдет 13721 = VeraCrypt PBKDF2-HMAC-SHA512 + AES (legacy)
hashcat -m 13721 -a 0 /путь/до/файла/с/хешем.tc /путь/до/словаря/с/паролями.txt -o /путь/до/будущего/файла/с/найденными/паролями.txt
Session..........: hashcat Status...........: Cracked Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
в файле /путь/до/будущего/файла/с/найденными/паролями.txt вижу такую строку
/путь/до/файла/с/хешем.tc:мойпароль
Отлично, алгоритм шифрования подобрал (спойлер: это была моя очередная ошибка), теперь можно приступать к бруту целевого контейнера, ради чего я и ебусь уже несколько часов
Но алгоритм брута нужен немного другой, а именно https://hashcat.net/wiki/doku.php?id=combinator_attack
для этого готовим словарь1.txt и словарь2.txt в которые складываем ВОЗМОЖННЫЕ, предположительные части нашего пароля
Слова из файла 2 будут подставляться к словам из файла 1 и эти пароли будут пробоваться
У меня получилось примерно по 10 строчек в первом и втором (я их сделал одинаковыми, чтобы все части могли оказаться и справа и слева), тобишь примерно по 10*10=100 вариантов.
hashcat -m 13721 -a 1 /путь/до/файла/с/хешем.tc /путь/до/словаря/с/паролями/словарь1.txt /путь/до/словаря/с/паролями/словарь2.txt -o /путь/до/будущего/файла/с/найденными/паролями.txt
где m=13721 это алгоритм VeraCrypt PBKDF2-HMAC-SHA512 + AES (legacy) и a=1 это Combinator Attack
Session..........: hashcat Status...........: Exhausted Recovered........: 0/1
ничего не получается... пробую по-всякому играться со словарями, дополнять их всяческими вариантами, и нихуя
Радовало, что перебор сотни вариантов у хешката занимает около минуты. Если бы я вручную все это перебирал - пизданулся бы очень быстро (напомню, вера только над одним паролем думает с минуту)
Расстраивало, что, судя по всему, про файлы придется забыть, ведь восстановить пароль у меня не получилось.
Но тут я вспомнил, что когда шифруешь контейнер, вера предлагает всякие разные алгоритмы на выбор, и для файлов средней важности я мог выбрать что-нибудь менее надежное и более фсб-шное, например Kuznechik просто по приколу.
Возвращаемся к списку алгоритмов хешката, берем следующий по охватам 13723 = VeraCrypt PBKDF2-HMAC-SHA512 + Serpent-Twofish-AES (legacy)
hashcat -m 13723 -a 1 /путь/до/файла/с/хешем.tc /путь/до/словаря/с/паролями/словарь1.txt /путь/до/словаря/с/паролями/словарь2.txt -o /путь/до/будущего/файла/с/найденными/паролями.txt
Session..........: hashcat Status...........: Cracked Recovered........: 1/1 Progress.........: 104/156
Победа! Смотрим же скорее в наш файл
/путь/до/файла/с/хешем.tc:$HEX[146005b4694fde7c71188c801574ca1035920fb71]
Ну что за хуйня) это не мой пароль конечно, это видимо какое-то его шестнадцатеричное представление или что-то вроде
Я вижу что на 104 варианте из 156 он остановился, но я не знаю какой вариант у хешката был под номером 104, так что еще немного погуглил и нашел что команду нужно вполнять так
hashcat --outfile-autohex-disable -m 13723 -a 1 /путь/до/файла/с/хешем.tc /путь/до/словаря/с/паролями/словарь1.txt /путь/до/словаря/с/паролями/словарь2.txt -o /путь/до/будущего/файла/с/найденными/паролями.txt
флаг --outfile-autohex-disable оключает эту ебалу и уже в результате я вижу свой искомый пароль!
Победа! Сэкономлено много времени и нервов, файлы спасены, алгоритм по которому у меня из подсказок собирается пароль в голове еще раз закрепил, полезный опыт получен, и статью, надеюсь, интересную написал.
P.S. Обязательно посмотрите, с какими алгоритмами умеет работать hashcat, это очень вдохновляет: https://hashcat.net/wiki/doku.php?id=example_hashes