August 28, 2022

Взлом контейнера VeraCrypt с помощью hashcat

https://t.me/traffic_science

Все началось с того, что несколько месяцев назад я зашифровал некоторые файлы средней важности и средней секретности с помощью 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 и так далее по этой ссылке)

TrueCrypt алгоритмы для hashcat

Но для начала установим хешкат, потому что до этого я еще не:

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 умеет хекать я увидел что? Правильно - веракриптовские алгоритмы.

Алгоритмы VeraCrypt

Захожу в свойства своего контейнера и интуитивно понимаю что мне подойдет 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

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