Имперсонация - C максим Мамаев

Имперсонация
Предположим, что узел А обменивается IP-датаграммами с узлом В, при этом узлы идентифицируют друг друга по IP-адресам, указываемым в датаграммах. Предположим далее, что узел В имеет особые привилегии при взаимодействии с А: то есть А предоставляет В некоторый сервис, недоступный для других хостов Интернета. Злоумышленник на узле Х, желающий получить такой сервис, должен имитировать узел В — такие действия называются имперсонацией узла В узлом Х.

Говоря о сервисах, мы имеем в виду приложения UDP или TCP, то есть речь идет об имперсонации UDP-сообщений или TCP-соединений (соответственно, UDP-spoofing и TCP-spoofing). Часто одновременно с имперсонацией злоумышленник предпринимает атаки типа «отказ в обслуживании» (п. 9.7) против узла В для исключения последнего из процесса сетевого взаимодействия.

Хосты А, В и Х могут располагаться друг относительно друга различным образом, от этого зависит, какие методы имперсонации применит злоумышленник.

Если злоумышленник может перехватить трафик, идущий от узла А к В (одним из методов, описанных в предыдущем пункте), то задача имперсонации практически выполнена. Получая от узла А UDP-сообщения или TCP-сегменты, адресованные узлу В, злоумышленник не передает их по назначению, а вместо этого сам формирует пакеты от имени В. При этом узел В даже не подозревает о происходящем, поэтому атаковать его на предмет отказа в обслуживании не имеет смысла.

Напомним, что перехват трафика возможен, когда:

1) А, В и Х находятся в одной IP-сети (ARP-атака);

2) А и Х находятся в одной сети, а В — в другой (навязывание ложного маршрутизатора);

3) А и В находятся в разных сетях, а Х находится на пути между ними (или включает себя в маршрут путем атаки на протокол маршрутизации).

В остальных случаях злоумышленник не может перехватить данные, передаваемые из А в В. По-прежнему ничто не мешает ему отправлять в адрес А сфальсифицированные датаграммы от имени В, но ответные пакеты А будет отправлять узлу В, минуя злоумышленника. Важным обстоятельством в этих условиях является то, имеет ли узел Х возможность подслушивать эти ответные пакеты, или же злоумышленник вынужден работать вслепую.
^ Имперсонация без обратной связи
Рассмотрим самый сложный случай: перехват и прослушивание данных, отправляемых из А в В невозможны. Этот случай (рис. 9.4) является наиболее общим: узел Х находится в сети, не имеющей никакого отношения к узлам А и В и не лежащей между ними (А и В могут находиться как в одной, так и в разных сетях).


Рис. 9.4. Имперсонация без обратной связи

Подчеркнем, что имперсонация без обратной связи имеет смысл лишь тогда, когда злоумышленнику для достижения своей цели достаточно только передать данные на узел А от имени узла В, и последующий ответ узла А уже не имеет значения. Классическим примером такой атаки является отправка злоумышленником на порт сервера Rlogin TCP-сегмента, содержащего какую-либо команду операционной системе узла А. Узел А выполняет эту команду, полагая, что она поступила с узла В.

Если имперсонация UDP-сообщений без обратной связи остается тривиальной, злоумышленник должен только сфабриковать датаграмму, адресованную от узла В узлу А, и отправить ее по назначению, то в случае с TCP все обстоит не так просто. Прежде чем отправить узлу А сегмент с данными, узел Х должен установить с ним соединение от имени узла В. Напомним, как происходит установление соединения: узел Х от имени В отправляет в А сегмент с битом SYN, где указывает начальный номер ISN(В). Узел А отвечает узлу В SYN-сегментом, в котором подтверждает получение предыдущего сегмента, и устанавливает свой начальный номер ISN(A). Этот сегмент злоумышленник никогда не получит.

Здесь возникает две проблемы: во-первых, узел В, получив от А ответ на SYN-сегмент, который он никогда не посылал, отправит узлу А сегмент с битом RST, тем самым сводя к нулю усилия злоумышленника. Во-вторых, узел Х все равно не сможет отправить в А следующий сегмент (как раз это должен быть сегмент с данными), потому что в этом сегменте узел Х должен подтвердить получение SYN-сегмента от А, то есть поместить в поле ACK SN заголовка своего сегмента значение ISN(A)+1. Но злоумышленник не знает номера ISN(A), потому что соответствующий сегмент ушел к узлу В.

Первая проблема решается относительно просто: злоумышленник проводит против узла В атаку типа «отказ в обслуживании» с тем расчетом, чтобы узел В не был способен обрабатывать сегменты, приходящие из А. Например, можно поразить узел В шквалом SYN-сегментов от несуществующих узлов1 (подробнее об отказах в обслуживании см. п. 9.7). Впрочем, к облегчению злоумышленника, может оказаться, что узел В просто выключен.

Для решения второй проблемы злоумышленник должен уметь предсказывать значения ISN(A). Если операционная система узла А использует какую-либо функцию для генерации значений ISN (например, линейную зависимость от показания системных часов), то последовательно открыв несколько пробных соединений с узлом А и проанализировав присылаемые в SYN-сегментах от А значения ISN, злоумышленник может попытаться установить эту зависимость опытным путем.

Хорошая реализация TCP должна использовать случайные числа для значений ISN (более подробное обсуждение этого вопроса можно найти в RFC-1948). Несмотря на кажущуюся простоту этого требования, проблема с угадыванием номеров ISN остается актуальной и по сей день2.

Итак, приведем схему атаки для имперсонации TCP-соединения без обратной связи (рис. 9.5).


Рис. 9.5. Схема атаки с имперсонацией TCP-соединения без обратной связи



2В марте 2001 г. была опубликована информация о предсказуемости номеров ISN в Cisco IOS. См. также бюллетени CERT "Vulnerability Note VU#498440", "CERT Advisory CA-2001-09", работы [Zalewski] и [Newsham].



  1. Злоумышленник выводит из строя узел В.

  2. Злоумышленник делает несколько пробных попыток установить соединения с уз-лом А с целью получить от А последовательность значений ISN(A). Сразу после по-ступления SYN-сегмента от А злоумышленник разрывает наполовину установленное соединение посылкой сегмента с флагом RST. Проанализировав полученные значения ISN(A), злоумышленник определяет закон формирования этих значений.

  3. Злоумышленник отправляет в А SYN-сегмент от имени В.

  4. Узел А отвечает узлу В свои SYN-сегментом, подтверждающим получение SYN-сегмента от В, и указывает значение ISN(A) для этого соединения. Злоумышленник не видит этого сегмента.

  5. На основе ранее полученных данных злоумышленник предсказывает значение ISN(A) и отправляет в А сегмент от имени В, содержащий подтверждение ISN(A)+1 и данные для прикладного процесса3. Получив этот сегмент, узел А считает соединение с В установленным и передает поступившие данные прикладному процессу. Цель атаки достигнута. Данные могут быть, например, командой, которую узел А выполняет, потому что она поступила от доверенного узла В.

  6. Узел А отправляет подтверждение получения данных и, возможно, свои данные в узел В. Злоумышленник этих сегментов не получит, но они его (по условиям задачи) и не интересуют. Чтобы корректно закрыть соединение, злоумышленник может вслепую отправить в узел А от имени узла В подтверждение получения одного октета (ACK SN=ISN(A)+2), а следом выслать сегмент с флагом FIN. Таким образом канал передачи данных от узла X (он же В) к узлу А корректно закрыт. Для полного закры-тия соединения злоумышленник должен подтвердить получение FIN-сегмента от А (равно как и всех данных, которые этому сегменту предшествовали) - разумеется, он этого сделать не может, потому что в общем случае ни объем этих данных, ни время отправки FIN-сегмента из А ему не известны. Но поскольку данные, переда-ваемые из А в В для злоумышленника ценности не имеют, он просто отправляет в А сегмент с флагом RST, тем самым полностью ликвидируя соединение.

  7. Злоумышленник завершает атаку "отказ в обслуживании" против узла В.



3 Узел Х может отправить подряд несколько сегментов с данными, пока он остается в рамках объявленного узлом А окна, размер которого он выяснил во время пробных соединений.


^ Десинхронизация TCP-соединения
Злоумышленник Х, находящийся в одном сегменте сети с узлами А и В или на пути между А и В, может произвести десинхронизацию TCP-соединения между А и В для установления полного контроля над соединением, то есть, злоумышленник получит возможность действовать как от имени А, так и от имени В. Для обозначения имперсонации, выполняемой таким методом, в англоязычной литературе используется термин TCP hijacking. Впервые эта атака была описана в [Joncheray].

Определим, что такое десинхронизация TCP-соединения. При установленном соединении каждый из узлов А и В знает, октеты с какими номерами может прислать ему собеседник в данный момент: если последнее подтверждение, высланное узлом А, было ACKAB и при этом узел А объявил окно WAB, то А ожидает от В октетов с номерами SNBA, попадающими в объявленное окно, то есть:

ACKAB <= SNBA <= ACKAB + WAB

Аналогично в узле В ожидается от А:

ACKBA <= SNAB <= ACKBA + WBA

Если, например, узел А по какой-то причине получает от В сегмент с номером SNBA, не попадающим в окно, то этот сегмент уничтожается, а в ответ А отправляет в В сегмент с SNAB, ACKAB, WAB, чтобы указать узлу В, какие именно октеты ожидает получить А. Отметим, что скорее всего этот сегмент не содержит данных, но номер SNAB в этом сегменте тем не менее должен быть указан, где SNAB — номер следующего октета данных, который А когда-либо вышлет в В.

Предположим, злоумышленнику каким-то образом удалось сбить показатели счетчиков узлов А и (или) В так, что вышеприведенные неравенства больше не выполняются (как это можно сделать, мы обсудим ниже). Далее мы будем использовать обозначения вида SNAB(B), что означает «приемлемый SNAB с точки зрения В».

Теперь, если В посылает в А сегмент с неким номером SNBA(B), адекватным с точки зрения В, но уже не попадающим в окно в узле А, то А возвращает узлу В подтверждение со своим значением ACKAB=SNBA(A). Однако в этом же сегменте имеется номер SNAB(A), который теперь уже В рассматривает как не попадающий в свое окно и отправляет в А подтверждение SNBA(B), ACKBA=SNAB(A). Номер SNBA(B), как и раньше, неприемлем для А, и узел А вновь отправляет в В подтверждение, и этот цикл, называемый ACK-шторм, теоретически продолжается до бесконечности, а практически — до тех пор, пока один из ACK-сегментов не потеряется в сети. Чем сильнее шторм, тем больше загрузка сети, тем выше процент потерь, следовательно, тем быстрее шторм прекратится.

Итак, в десинхронизированном состоянии любая попытка обмена данными вызывает только ACK-шторм, а сами сегменты с данными участниками соединения уничтожаются.

В это время злоумышленник, знающий «правильные» номера с точки зрения обоих узлов, берет на себя функции посредника (рис. 9.6). Он прослушивает сеть, обнаруживает сегмент с данными длиной L октетов, направленный, например, из А в В, меняет в нем номер SNAB(A) на ожидаемый узлом В номер SNAB(B) и, пересчитав контрольную сумму, отправляет сегмент в В от имени А. После этого в узел А от имени В злоумышленник отправляет подтверждение на этот сегмент, содержащее правильный с точки зрения А номер SNBA(A). Во время этого обмена в виде побочного явления возникают два ACK-шторма: первый инициирует узел В, получивший из А оригинальный сегмент с SNAB(A) != SNAB(B), а второй шторм возникает, когда узел А получает от В сегмент, подтверждающий получение данных от Х, и в этом сегменте SNBA(B) != SNBA(A).


Рис. 9.6. Действия злоумышленника-посредника в десинхронизированном соединении между узлами А и В
(L1, L2 — объем данных в пересылаемых сегментах)

Разумеется, злоумышленник затевает атаку не для того, чтобы просто ретранслировать сегменты, которые он и так может подслушать. Ничто не мешает ему изменять содержащиеся в сегментах данные или добавлять свои: на рис. 9.6 это отображено в виде «данных 2», имеющих длину L2 октетов, в то время как оригинальные данные обозначены «данные 1» длиной L1 октетов. Например, если имеет место сессия программы telnet и А посылает в В некоторую команду, то злоумышленник может вставить в этот сегмент еще одну команду. Результат выполнения своей команды он получит, подслушав ответный сегмент SNBA(B), направленный из В в А, который узел А не воспримет из-за несовпадения порядковых номеров, так как SNBA(B) != SNBA(A). Зато злоумышленник, удалив из этого сегмента результат выполнения своей команды, отправит то, что осталось (то есть результат оригинальной команды) в А от имени В уже с приемлемым порядковым номером SNBA(A).

Злоумышленник может вообще игнорировать сегменты, посылаемые узлом А и отправлять в В только свои данные, получая ответы прослушиванием сети и соответственно реагируя на них, но в этом случае узел А заметит, что В не отвечает на его команды, и может забеспокоиться.

Рассмотрим, каким образом злоумышленник может перевести TCP-соединение в десинхронизированное состояние.
^ Ранняя десинхронизация
Ранняя десинхронизация (рис. 9.7): злоумышленник, прослушивая сеть, обнаруживает момент установления соединения между А и В, от имени А сбрасывает соединение RST-сегментом и тут же открывает его заново, но уже с новыми номерами ISN. Разберем эту процедуру в деталях.

Сначала А посылает в В сегмент SYNAB, ISNAB(A), потом В отвечает сегментом SYNBA, ISNBA(1), ACKBA(ISNAB(A)+1). По получении этого сегмента А переходит в состояние ESTABLISHED и посылает в В подтверждающий сегмент ACKAB(ISNBA(1)+1).

В этот момент злоумышленник от имени А отправляет в В сегмент RSTAB и следом за ним сегмент SYNAB, ISNAB(X), содержащий те же номера портов, но другой номер ISNAB= ISNAB(X), неприемлемый для А.

При получении этих сегментов узел В закрывает установленное соединение с А, а затем тут же вновь отрывает его и отправляет в А сегмент SYNBA, ISNBA(2), ACKBA(ISNAB(Х)+1), где ISNBA(2) — новый начальный порядковый номер, ISNBA(1) != ISNBA(2).

Узел А не воспринимает этот сегмент из-за несовпадения порядковых номеров, но злоумышленник от имени А посылает в В сегмент SNAB=ISNAB(Х)+1, ACKAB(ISNBA(2)+1).


Рис. 9.7. Ранняя десинхронизация TCP-соединения
(сегменты ACK-шторма не показаны)

После этого оба узла А и В находятся в состоянии ESTABLISHED, но соединение десинхронизировано (рис. 9.8).


Рис. 9.8. Состояние соединения после ранней десинхронизации

Отметим, что некоторые реализации TCP в нарушение стандарта в ответ на получение RST-сегмента сами отправляют RST-сегмент. В этом случае десинхронизация описанным способом невозможна.
^ Десинхронизация нулевыми данными
Десинхронизация нулевыми данными (рис. 9.9): злоумышленник, дожидаясь момента, когда соединение находится в неактивном состоянии (данные не передаются), посылает узлу А от имени В и узлу В от имени А фальсифицированные сегменты с данными, вызывая тем самым десинхронизацию. Посылаемые данные должны быть «нулевыми» — то есть приложение-получатель должно их молча игнорировать и не посылать никаких данных в ответ. Этот метод десинхронизации подходит для Telnet-соединений, которые, во-первых, часто находятся в неактивном состоянии, а во-вторых, в протоколе Telnet имеется команда «нет операции» (IAC NOP). Сегмент, содержащий произвольное число таких команд (IAC NOP IAC NOP …), будет принят приложением и полностью проигнорирован.

Кроме того, в начале Telnet-сеанса производится аутентификация пользователя. Ра-зумно (с точки зрения злоумышленника) произвести десинхронизацию после того, как введен пароль, а не в самом начале соединения. Отметим, что даже использование одноразовых паролей в этом случае пользователю не поможет.


Рис. 9.9. Десинхронизация TCP-соединения нулевыми данными
(сегменты ACK-шторма не показаны)

После описанной процедуры имеет место следующая ситуация, показанная на рис. 9.10.


Рис. 9.10. Состояние соединения после десинхронизации нулевыми данными

Имперсонация с помощью десинхронизации является сравнительно простой и очень эффективной атакой. Она позволяет злоумышленнику установить полный контроль над TCP-соединением без использования ложных сообщений ARP, ICMP или протоколов маршрутизации, без атак типа «отказ в обслуживании», которые могут быть обнаружены администратором сети или атакуемого узла. Обнаружить такие атаки можно, прослушивая сеть на предмет ACK-штормов.

Для защиты от описанных в этом пункте атак маршрутизатор (шлюз, брандмауэр), соединяющий сеть с внешним миром, должен быть настроен на запрет пропуска пакетов;

а) приходящих на внешний интерфейс, но имеющих адрес отправителя из внутренней сети;

б) приходящих на внутренний интерфейс, но имеющих адрес отправителя из внешней сети.

Случай а) соответствует ситуации, когда узлы А и В находятся во внутренней сети, а злоумышленник расположен снаружи и пытается послать узлу А датаграмму якобы от узла В. Случай б) соответствует ситуации, когда злоумышленник находится во внутренней сети, а узлы А и В — снаружи. Подчеркнем, что предложенные меры не защитят от всех разновидностей имперсонации: например, когда узел Х находится в одной сети с узлом А или В, или, естественно, когда все три узла расположены в одной сети.

Хороший алгоритм генерации случайных номеров ISN защитит от атаки в случае отсутствия обратной связи, но бесполезен, если злоумышленник может видеть сегменты, передаваемые из А в В.

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

8169864532590243.html
8170093227525983.html
8170292935609345.html
8170400818868074.html
8170536903649089.html