IP-spoofing(подделка IP адреса) - это атака, имеющая своей целью убедить удаленную систему, что она получает пакеты от некого источника, IP-адрес которого отличается от IP-адреса атакующего. Зачем это нужно? Ну, предположим, есть некая система, назовем ее "жертва", с IP-адресом: 204.121.34.98 и некоторый IP, с которым у "жертвы" установлены доверительные отношения. Пусть этот IP будет 204.35.138.90 - назовем его "доверительный". IP-адрес атакующего: 218.46.89.24 - это будет "реальный" адрес. Итак, у атакующего есть возможность отправлять "пакеты" жертве, но они будут обработаны на общих основаниях, т.к. "жертва" доверяет только IP, который мы обозначили как "доверительный". Если же "жертва" получит пакет не с "реального" IP, а с "доверительного", то и прореагирует на него соответствующим образом (допустим разрешит доступ без авторизации).
Таким образом, перед нами встает резонный вопрос: а можем ли мы заставить "жертву" поверить, что наш IP не "реальный", а "доверительный"? Ответ - да, можем. Именно это и называется IP-spoofing`ом.
IP-spoofing одна из самых сложных TCP-атак, сложная потому, что проводится она вслепую. Вслепую, т.к. атакующий не имеет никакой возможности узнать успешно ли развивается его атака, или он все провалил (удаленная система получая пакеты якобы от "доверительного" IP отправляет свои ответы именно на "доверительный" IP, а так как "доверительный" и "реальный" адреса мягко говоря не совпадают, то нападающий никакого представления об этих ответных пакетах не имеет).
IP-spoofing можно было бы сравнить с переговорами, когда ты говоришь но слов собеседника не слышишь. Причем не только не слышишь, но и не знаешь слушает ли он тебя вообще…
Положим, нам бы хотелось установить с "жертвой" соединение от имени "доверительного" IP.
Процедуры установки соединения постоянные читатели наверняка помнят, для остальных вкратце напомню:
- Мы посылаем SYN-пакет жертве.
- "Жертва" отвечает нам SYN/ACK пакетом, в котором передает свой SYN.
- Мы отвечаем SYN/ACK пакетом и соединение считается установленным.
Первая проблема заключается в том, что посылая пакет от лица "доверительного" IP, SYN/ACK пакет из шага два мы просто не получим - он уйдет по "доверительному" адресу. Однако, именно на втором шаге, мы должны получить SYN удаленной системы и использовать его в третьем шаге (ACK=SYN+1). Но этот SYN мы не получим, а без него никакого шага 3 просто не будет. Следовательно, мы должны вычислить этот номер заранее. Алгоритм образования SYN был описан в
первой статье. Попробуем установить соединение с жертвой от имени своего "реального" адреса. В ответ на свой SYN пакет мы получим SYN/ACK пакет, содержащий SYN "жертвы". Т.к. мы знаем этот алгоритм, по которому формируется SYN "жертвы" и его значение в настоящий момент, то с некоторой степенью достоверности мы можем вычислить его будущее значение (неуверенность вызвана тем, что мы не можем точно предсказать, какое количество новых соединений установит "жертва", пока мы производим вычисления).
Итак, будем считать, что предсказать значение SYN нам все-таки удалось. Однако существует еще одна проблема - пакет из шага 2 уходит по "доверительному" IP. А так
как "доверительная" система исходного пакета не посылала, то получив ответ "неизвестно на что", она ответит удаленной системе NACK-пакетом. А удаленная система в свою очередь, получив такой невежливый ответ, ликвидирует соединение, которое мы пытались установить.
Следовательно, "доверительная" система в момент проведения атаки попросту не должна функционировать. Ну а что делать, если эта самая система система находится, к примеру, в Филадельфии, а ты сам - в Приморье? Нет, конечно можно надеяться, что Чубайс эмигрирует в штаты и у них начнутся веерные отключения электричества ;-). Но думаю, особо на Чубайса рассчитывать на стоит - гораздо надежнее положиться на SYN-flood (DOS-атаку, описанную мной во
второй статье). "Затопленная" жертва, просто не сможет ответить…
Третья проблема, с которой сталкивается атакующий - определение верных интервалов посылки пакетов. В виду того, что мы не знаем, получила ли "жертва" наш пакет (мы не получаем ответов), то мы и не можем знать посылать ли нам следующий (SYN и ACK в пакетах тесно взаимосвязаны - подробнее смотри в первой статье). Поэтому очень важно вычислить правильный интервал, чтобы не убежать "вперед паровоза".
Итак, если обобщить все вышесказанное:
- Для успешного проведения атаки нужно, чтобы "доверительная" система должна быть отключена, либо заблокирована с помощью DOS-атаки - иными словами, на протяжении всей атаки "доверительная" система должна быть неактивна.
- До начала атаки нужно предсказать SYN "жертвы". Причем стоит отметить, что если применяется нестандартный (случайный) алгоритм генерации, то шансы на успех уменьшаются в тысячи раз.
- Нужно также правильно вычислить интервал посылки пакетов, его можно вычислить опытным путем (при этом стоит иметь в виду, что если ты посылаешь пакет и получаешь ответ, скажем, через 2 секунды, то это значит, что пакет в одну сторону идет 1 секунду -> правильный интервал будет 1секунда + 30% "коэффициент прочности").
Отмечу, что проведение атаки данного типа невозможно в Windows-системах, поэтому добро пожаловать в *nix. А в качестве помощника можешь взять Libnet - отличная утилита, свежую betа-версию можно взять с
http://www.packetfactory.net/.