В сети присутствует огромное количество сетевых устройств 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.
Итак, у нас есть устройство 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+ содержит в себе несколько полей с однозначным значением и строку приветствия от 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
продолжение следует….
7 comments On Укрощение CISCO — брутим ключ к TACACS+
Pingback: Укрощение CISCO – брутим ключ к TACACS+ (часть 2) - Cryptoworld ()
Pingback: Укрощение CISCO - как взломать роутер на растоянии. (ч. 3) - Cryptoworld ()
Pingback: CiscoRouter - инструмент для сканирования и взлома роутеров CISCO. - Cryptoworld ()
Pingback: Укрощение CISCO – как слить конфигурацию роутера через SNMP (ч. 4) - Cryptoworld ()
Pingback: Укрощение CISCO – как узнать пароль от устройств CISCO (ч. 5) - Cryptoworld ()
Pingback: Перехват трафика с помощью подмены BGP сессий. - Cryptoworld ()
Pingback: Атаки на протокол TACACS+ в CISCO - Cryptoworld ()