Укрощение CISCO — брутим ключ к TACACS+

В сети присутствует огромное количество сетевых устройств CISCO. С их помощью строятся как домашние сети так и магистральные каналы связывающие континенты и обслуживающие милионы пользователей. Мы начинаем цикл публикаций в которых раскажем о уязвимостях и возможной эксплуатации и взлома устройств CISCO.

TACACS+ — это клиент-серверный протокол (TCP), который работает в формате запрос — ответ
(клиентом выступает устройство Cisco, а сервером — сервис TACACS+). Он поддерживает шифрование трафика с использованием общего ключа (Pre-Shared Key). При этом заголовки протокола не шифруются, а вот тела (данные) шифруются полностью. Зашифрованные данные (enc_data) представляют собой результат операции XOR с данными (data) и специальной строкой — pseudo_pad.

data^pseudo_pad=enc_data

pseudo_pad — это последовательность хешей MD5.
pseudo_pad = {MD5_1 [,MD5_2 [ … ,MD5_n]]}
Хеши создаются на основании данных из заголовков пакетов TACACS+, плюс общий ключ (PSK), плюс предыдущий хеш (для первого MD5 его нет).

MD5_1 = MD5{session_id, key, version, seq_no}
MD5_2 = MD5{session_id, key, version, seq_no, MD5_1}
....
MD5_n = MD5{session_id, key, version, seq_no, MD5_n-1}

где session_id — случайный идентификатор сессии; version — версия прото-
кола; seq_no — инкрементируемый номер пакета; key — PSK.

Пример заголовков пакетов TACACS+, используемых для генерации
Пример заголовков пакетов TACACS+, используемых для генерации

Итак, у нас есть устройство Cisco и сервер TACACS+. Мы можем провести на них атаку man-in-the-middle и видеть передаваемый трафик. Наша цель — получить PSK и с помощью него расшифровать трафик и получить валидные учетки.

Для начала, как мы видим, значение MD5 создается от нескольких значений, но только одно из них мы точно не знаем — общий ключ. Все остальные можно получить из заголовков TACACS+ пакета. Если упростить задачу, то все сводится к тому, чтобы перебором (без этого — никуда) подобрать ключ. При этом MD5 можно брутить в офлайне очень быстро. Но для этого нам нужно получить значение MD5_1. Учитывая, что значения с MD5_2 по MD5_n содержат еще и предыдущее значение MD5, они для нас по большому счету бесполезны (получается второе неизвестное).

Далее, мы должны вспомнить, что XOR — это обратимая операция. Если у нас была операция data^pseudo_pad=enc_data, то pseudo_pad=data^enc_data. При этом XOR — это простейшая операция, и изменение части строки не влечет изменений в другой ее части. Получаем MD5_1 — это начальная часть pseudo_pad (точнее, 128 бит или 16 байт). Таким образом, чтобы получить MD5_1, нам нужно знать первые 16 байт зашифрованных данных и 16 байт изначальных
данных. И если зашифрованные данные мы имеем в любом количестве из трафика, то как нам получить 16 байт изначальных данных?

Давай взглянем на формат пакета пользовательских данных. Формат отличается для запросов и ответов, а также для различных их видов (TACACS+ —это Authentication, Authorization, Accounting).
Пакет состоит из нескольких полей (четыре байта): Action, Priv Level, Auth Type, Service. Они указывают на то, что кто-то хочет аутентифицироваться на циске. При этом в большинстве случаев они будут иметь значение 01. Далее User len, но в первом пакете аутентификации это значение не используется, поэтому 00. Далее Port len — это длина имени терминала, на который происходит подключение. Для удаленных подключений должно быть 04. Далее длина IP-адреса подключающегося. После — поле Data, которое тоже будет равно 00 для первого пакета. Далее — Port. Это номер или имя терминала у Cisco-девайса. И последнее поле — это сам IP-адрес подключающегося (причем нас интересуют только четыре байта от его начала, до полных 16 байт незашифрованных данных).

Пример первого запроса аутентификации
Пример первого запроса аутентификации

Что же мы тут видим? Самое главное — отсутствие по-настоящему случайных значений. По моим наблюдениям, изменяются только Port, RemAddr и RemAddrLen, возможно Priv Level. Но если мы можем провести MITM-атаку на Cisco и TACACS+, то у нас есть и возможность подключаться к этой же циске для аутентификации на ней (при этом валидных кред нам и не требуется знать).
В этой ситуации мы уже будем контролировать часть незашифрованных данных, передаваемых от устройства на TACACS+.

Мы знаем свой IP и достаточно уверены в значении Priv Level (мы ведь пытаемся подключиться удаленно). Остается только Port. Но и тут значение, скорее всего, будет tty плюс номер tty. А с учетом того, что у цисочки tty не так много (обычно от 0 до 4) и идут они последовательно (в зависимости от количества параллельных сессий), мы приходим к выводу, что вариантов незашифрованных данных первого пакета при нашей аутентификации один или два.

Теперь у нас есть зашифрованные данные (enc_data), 16 байт незашифрованных изначальных данных (data) и повторных. При помощи XOR мы получаем хеш MD5_1 (точнее, несколько — в зависимости от количества вариантов незашифрованных данных). Теперь мы можем скормить MD5 в oclHashCat и брутить ключ. В случае успеха мы сможем расшифровать с тем же ключом и аутентификации реальных админов Cisco на TACACS+.

Но это еще не все интересное, что можно выжать из этой атаки. Если поближе присмотришься к шифрованию протокола TACACS+, заметишь, что в MD5 используется поле seq_no, то есть номер пакета. Таким образом, для каждого пакета данных будет генериться свой pseudo_pad, а это значит, что MD5_1 получится вытащить из любого запроса или ответа. Это значительно облегчает задачу, так как мы можем выбрать пакет данных, в котором точно будем уверены.
Вот пара примеров.

Пример ответа от сервера TACACS+ со строкой-приветствием и запросом логина
Пример ответа от сервера TACACS+ со строкой-приветствием и запросом логина

Ответ от сервера TACACS+ содержит в себе несколько полей с однозначным значением и строку приветствия от Cisco для пользователя. Так как строку приветствия мы можем получить при подключении, то выходит, что все значения мы знаем наверняка.

Второй пример — это второй запрос от устройства Cisco. Все, что в нем передается, — это имя юзера и длина имени. Оба значения нам известны, если аутентификацию проводим мы сами.

Еще хотелось бы отметить небольшую трудность с hashcat. К сожалению, в нем отсутствует метод для брута MD5 с двумя разными солями (в началеи в конце последовательности). Приходится идти на уловки. Одна из них — использование маски в качестве первой или второй соли. То есть одну из солей мы хардкодим в маску. На примере ниже c002 — это версия протокола TACACS+ и номер пакета в шестнадцатеричном виде, а первая соль лежит в файле hashes.txt.

hashcat-cli64.exe -a 3 -m 20 --hex-charset--hex-salt hashes.txt ?d?d?d?dc002

продолжение следует….

Click to rate this post!
[Total: 1 Average: 5]

Специалист в области кибер-безопасности. Работал в ведущих компаниях занимающихся защитой и аналитикой компьютерных угроз. Цель данного блога - простым языком рассказать о сложных моментах защиты IT инфраструктур и сетей.

7 comments On Укрощение CISCO — брутим ключ к TACACS+

Leave a reply:

Your email address will not be published.