Взлом защиты VPN-клиента GlobalProtect через расшифровку куки

VPN

Множество компаний используют SASE (облачная сеть с встроенной безопасностью) и функцию Always-on VPN (всегда включенные VPN-сессии). Это упрощает процесс аутентификации пользователей, ведь пользователю не нужно повторно вводить данные для входа. Но такие решения требуют хранения аутентификационных данных, например, куки. Это создает риск для безопасности, поскольку эти данные могут быть украдены и использованы хакерами. В статье расскажу, как один из популярных VPN-клиентов — GlobalProtect от Palo Alto пытается защитить эти данные, и как эту защиту можно обойти.

Еще по теме: Реверс прошивок роутера

Обход защиты VPN-клиента через куки

Согласно документации куки клиента GlobalProtect хранятся в файле:

Открыв этот файл в любом hex-редакторе, можно заметить, что файл защищен с помощью DPAPI (Windows API для шифрования с использованием учетных данных пользователя). Это подтверждается заголовком, который начинается с:

DPAPI защищенные куки
DPAPI защищенные куки

На этом этапе становится ясно, что куки зашифрованы. Теперь задача — понять, как происходит шифрование и что можно сделать, чтобы получить доступ к данным.

Попытка вызвать функцию CryptUnprotectData возвращает зашифрованные данные с высокой энтропией, что говорит о том, что данные дополнительно шифруются перед сохранением. Это навело на мысль, что VPN-клиент использует внутренний механизм для шифрования данных. Скорее всего, это делается с помощью какого-то зашитого ключа.

Энтропия DPAPI незащищенного файла cookie
Энтропия DPAPI незащищенного файла cookie

Для дальнейшего исследования я решил использовать инструменты статического и динамического анализа. Сначала был запущен дизассемблер IDA, где я начал искать строки, связанные с шифрованием. Это привело к функции UnserializePortalAuthCookie, которая занимается расшифровкой куки. Немного ниже в коде я обнаружил функцию, которая, судя по логам, отвечает за шифрование данных файла.

Декомпилированный код, указывающий на наличие функции UnserializePortalAuthCookie
Декомпилированный код, указывающий на наличие функции UnserializePortalAuthCookie
Декомпилированный код, указывающий на наличие функции расшифровки файлов
Декомпилированный код, указывающий на наличие функции расшифровки файлов

Здесь также использовалась библиотека OpenSSL. Я увидел вызовы функций EVP_EncryptInit_ex, EVP_DecryptUpdate и EVP_DecryptFinal_ex, что позволило сделать вывод: шифрование и дешифровка ведутся с использованием алгоритма AES.

OpenSSL EVP_DecryptInit_Ex в сравнении с декомпилированным кодом
OpenSSL EVP_DecryptInit_Ex в сравнении с декомпилированным кодом
Восстановление ключа при вызове EVP_DecryptInit_Ex
Восстановление ключа при вызове EVP_DecryptInit_Ex

Далее я установил точки останова на вызовы функций и начал анализировать, какие данные в них передаются. В результате мне удалось извлечь ключ шифрования:

Этот ключ — 16-байтная строка. Исходя из его длины, я предположил, что используется AES-256-CBC, и это оказалось правильным. Для проверки я воспользовался инструментом Cyberchef и успешно расшифровал файл настроек сайта GlobalProtect.

Расшифрованный заголовок файла конфигурации клиента GlobalProtect
Расшифрованный заголовок файла конфигурации клиента GlobalProtect

Теперь надо было разобраться, как этот ключ создается. Оказалось, что ключ не зашит в бинарник. Вместо этого он создается при помощи хеширования данных. В одной из функций я нашел подсказку:

Эти значения оказались стандартными для инициализации состояния MD5-хеша. Таким образом, ключ шифрования строится на основе алгоритма MD5.

Далее ключ создается по следующему алгоритму: строка pannetwork хешируется, затем результат комбинируется с уникальным SID (идентификатором системы):

Этот код возвращает тот самый 16-байтный ключ, который использовался в алгоритме шифрования.

Получив расшифрованные куки, я смог использовать их для подключения к VPN без необходимости вводить пароль или проходить многофакторную аутентификацию. Для этого подошел клиент OpenConnect, который поддерживает работу с GlobalProtect.

Команда для подключения к VPN с использованием полученной куки:

Подключение к VPN — это лишь первый шаг. В большинстве корпоративных систем также проверяются различные параметры устройства, например, наличие антивируса или настройка шифрования диска. GlobalProtect использует HIP (HIP (профиль, собирающий информацию о состоянии устройства для проверки соответствия требованиям безопасности сети) для выполнения этих прооверок. Клиент хранит результаты проверок в нескольких зашифрованных файлах, которые можно найти в папке:

Эти файлы также шифруются с использованием того же ключа AES, который мы восстановили ранее. После расшифровки этих файлов можно создать нужный профиль для обхода проверок.

Клиент OpenConnect позволяет передавать HIP данные через специальный скрипт:

Заключение

В статье показал, как расшифровать куки клиента GlobalProtect, а также использовать их для подключения к VPN. Хотя такая схема не является уязвимостью сама по себе, она демонстрирует, что аутентификационные данные всегда могут стать целью злоумышленников.

ПОЛЕЗНЫЕ ССЫЛКИ:

QUASAR

Этичный хакер и компьютерный ниндзя. Новые статьи в нашей Телеге!

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