Categories: HackingRouter

Укрощение 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+, используемых для генерации

Итак, у нас есть устройство 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+ содержит в себе несколько полей с однозначным значением и строку приветствия от 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]
cryptoworld

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

View Comments

Recent Posts

Лучший адаптер беспроводной сети для взлома Wi-Fi

Чтобы взломать сеть Wi-Fi с помощью Kali Linux, вам нужна беспроводная карта, поддерживающая режим мониторинга…

4 месяца ago

Как пользоваться инструментом FFmpeg

Работа с консолью считается более эффективной, чем работа с графическим интерфейсом по нескольким причинам.Во-первых, ввод…

4 месяца ago

Как создать собственный VPN-сервис

Конечно, вы также можете приобрести подписку на соответствующую услугу, но наличие SSH-доступа к компьютеру с…

5 месяцев ago

ChatGPT против HIX Chat: какой чат-бот с искусственным интеллектом лучше?

С тех пор как ChatGPT вышел на арену, возросла потребность в поддержке чата на базе…

5 месяцев ago

Разведка по Wi-Fi и GPS с помощью Sparrow-wifi

Если вы когда-нибудь окажетесь в ситуации, когда вам нужно взглянуть на спектр беспроводной связи, будь…

5 месяцев ago

Как обнаружить угрозы в памяти

Elastic Security стремится превзойти противников в инновациях и обеспечить защиту от новейших технологий злоумышленников. В…

5 месяцев ago