Введение в хакинг на низком уровне. Спуфинг IP - начальные сведения.

Сегодняшний хакинг - нечто иное по сравнению с тем, что было 10 и даже 5 лет назад. Большое количество нового ПО, донельзя упрощающего работу пользователя, а также появление различных скриптовых языков, освоить которые под силу даже ребенку, превратили искусство взлома в детскую шалость. Теперь, чтобы что-то взломать, не нужно знать всех тонкостей сетевых протоколов, владеть низкоуровневыми языками программирования - ты заходишь на поисковик, вводишь имя уязвимого файла, и перед тобой список сайтов, которые ты можешь взломать за 5 минут. Взломав так один сайт, юные хулиганы - [скрипт]киддисы - считают себя хакерами; а их интеллектуальные возможности ограничиваются взломом тех жертв, на которых показывает палец google.com.
Возможно, ты относишься к числу таких (многие квалифицированные хакеры прошли через это), и я тебя не виню - напротив: хочу направить на верный путь, и, по возможности, вызвать у тебя интерес и стимул к изучению искусств хакинга на низком уровне. Ведь однажды тебе понадобится взломать какой-то конкретный сайт (допустим, даже тебя несправедливо забанил админ чата), но твоих знаний не хватит для этого, хоть ты и уверен, что неуязвимых систем не существует. И, лишь зная все о сетях и системах досконально, ты действительно можешь контролировать почти любую ситуацию сам. Для этого тебе, как минимум, необходимо:
1) прочитать всю возможную информацию о протоколах и освоить методы взлома на межсетевом и транспортном уровнях сети;
2)выучить Ассемблер и понять принципы работы файловых систем (FAT32, EXT2 etc);
Да-да, именно так! Ведь именно этим занимались почти все известные на сегодняшний день хакеры, и именно это должен уметь настоящий хакер! Ведь ты всегда хотел им стать! Сделай это!
Надеюсь, я зарядил тебя кое-каким стимулом. А теперь я хочу тебя зацепить, чтобы было не просто интересно - чтобы тебя тянуло! Я дам тебе начальные сведения об IP-спуфинге!

***
Вся информация, проходящая в сети, формируется и передается в виде «пучков», а не потоком, как может показаться сначала. Каждый пучок состоит из тела и заголовка. Теперь я постараюсь внедрить в твой мозг значение инкапсуляции. Я нарисовал тебе цепь, состоящую из одного протокола на каждом уровне модели OSI.
Уровень Протокол
Прикладной FTP
Транспортный TCP
Межсетевой IP(+ICMP)
Канальный ARP(+драйверы)
Физический Ток :)
Представим такую картину: юзер делает FTP-запрос. Как же такие данные, состоящие из разумных и понятных обычному человеку команд (например, LIST), за мгновение превращаются в электрический ток или радиоволны? Дело в том, что за это «мгновение» происходит ряд событий, в котором задействованы все уровни OSI. Называется он инкапсуляцией. FTP-команда на прикладном уровне «спускается» по OSI к физическому уровню: сначала эта команда переходит на транспортный уровень, на котором формируется «пучок» (сегмент), телом которого является FTP-команда, при этом TCP добавляет свой заголовок. Затем сегмент транспортного уровня переходит «ниже» и становится «пучком» (пакетом) межсетевого уровня. Протокол IP, естественно, добавляет свой заголовок в этот пакет (кстати, в этом заголовке и хранится IP-адрес отправителя и получателя). Далее пакет межсетевого уровня передаётся канальному (пишется слитно). На канальном уровне формируется свой «пучок», который называется кадром или фреймом. Кадр состоит из заголовка, добавленного протоколами этого уровня, и тела, в котором лежит пакет межсетевого уровня. Вот, вроде бы, и всё про инкапсуляцию. Я проапгрейдил твой мозг, и теперь он готов освоить спуфинг : ) .

Spoofing IP - это подмена исходного адреса в заголовке пакетов. Многие подумают, что это уникальный способ скрытия/изменения IP-адреса, аналогичный proxy или socks. Это не так. Спуфинг лишь позволяет изменить IP-адрес в заголовке пакета, но не удерживать этот адрес как свой (т.е. ты не сможешь получить ответ, его получит хозяин адреса, который ты указал вместо своего). Надеюсь, ты меня понял, иначе тебе не стоит читать дальше. Так вот… ты уже обратил внимание, что я говорю «пакет», а не «сегмент» или «кадр»? Это значит, что для того, чтобы изменить свой IP-адрес в заголовке, мы будем работать с межсетевым уровнем. С этого момента начинаем практику, теория окончена :) . Для тех, кто продвинут в кодинге, я наскрёб в интернете сорцы прог, осуществляющих спуфинг IP. Почувствовал прилив энергии?! =))
Для Delphi (сказано, что работает только в Win2k): http://myphp4.h15.ru/IP-Spoofing-DELPHI.rar
если ссылка вдруг умрёт, вот другая: http://www.sources.ru/delphi/delphi_sen … kets.shtml
Для C++ (тоже, по-моему, для win2k) вот: http://myphp4.h15.ru/IP-Spoofing-C++.rar
И по той же причине ещё две:
http://www.sources.ru/cpp/cpp_raw_tcp_win2000.shtml
http://www.sources.ru/cpp/cpp_raw_tcp_200.shtml
На этот момент мне известны три готовые программы, осуществляющие IP-Spoofing. Все они под Linux. Первые две - Gspoof и IPSorcery – имеют приятный пользовательский интерфейс. Они позволяют собирать IP, ICMP-пакеты, TCP, UDP-сегменты. Разобраться в этих программах более, чем просто, и на них я зацикливаться не буду. А подробней мы познакомимся с другой софтиной – Sing. Это многофункциональная консольная утилита, главной задачей которой является посылка ICMP-пакетов с произвольно заданным Source IP (адресом отправителя) в заголовке. Прогу берём отсюда:
http://sourceforge.net/project/showfile … up_id=6994
Скачали, распаковали, установили. Приступим к тестированию...
Введём команду, которая является аналогом команды ping:
sing 127.0.0.1
Результатом будет строка
“16 bytes from 127.0.0.1: seq=0 ttl=64 TOS=0 time=0.281 ms”.
Рассмотрим пару опций программы. Опция

это количество посылаемых пакетов. Опция
-s
это размер мусора, содержащегося в каждом пакете, в байтах. Например, результатом команды
sing 127.0.0.1 -c 2 -s 20000
будет
SINGing to 127.0.0.1 (127.0.0.1): 20016 data bytes
20016 bytes from 127.0.0.1: seq=0 ttl=64 TOS=0 time=0.386 ms
20016 bytes from 127.0.0.1: seq=1 ttl=64 TOS=0 time=0.359 ms

--- 127.0.0.1 sing statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.359/0.373/0.386 ms
Эти данные означают, что отправлено два пакета размером 20016 байт на 127.0.0.1 и два пакета вернулось.
Проверим эту же команду с заранее запущенным в отдельном терминале снифером tcpdump.
После выполнения этой команды, на терминале, где запущен снифер появятся следующие данные:
22:19:00.755683 IP localhost.localdomain > localhost.localdomain: icmp 16416: echo request seq 0
22:19:00.758504 IP localhost.localdomain > localhost.localdomain: icmp
22:19:00.758765 IP localhost.localdomain > localhost.localdomain: icmp 16416: echo reply seq 0
22:19:00.758800 IP localhost.localdomain > localhost.localdomain: icmp
22:19:01.785720 IP localhost.localdomain > localhost.localdomain: icmp 16416: echo request seq 256
22:19:01.785739 IP localhost.localdomain > localhost.localdomain: icmp
22:19:01.785831 IP localhost.localdomain > localhost.localdomain: icmp 16416: echo reply seq 256
22:19:01.785835 IP localhost.localdomain > localhost.localdomain: icmp
Здесь всё ясно: локалхост передает данные локалхосту.
А теперь познакомимся с флагом, который позволяет подменять Source IP:
-S
Введём команду
sing -S 127.0.0.5 127.0.0.1 -c 2 -s 20000
которая схожа с предыдущей, единственное - адрес отправителя 127.0.0.5!
Вот и всё, теперь мы умеем отправлять заспуфенные пакеты! tcpdump мне не даст соврать
(22:29:44.387004 IP 127.0.0.5 > localhost.localdomain: icmp 16416: echo request seq 256)

Ну, что ж, на данный момент ты уже “вооружён”. Осталось только закрепить полученные знания.
Целью спуфинга обычно является вызов DoS(отказа в обслуживании) или провокация DDoS(распределённой атаки с целью вызова DoS). А вот способов обеспечения DoS/DDoS в спомощью айписпуфинга несколько:
1) Чтобы задосить сервер(А) ты должен отослать ему много ICMP-пакетов. Ты меняешь свой ip просто на какой-то левый, чтобы пакеты, которыми отвечает тебе сервер(А) не вызвали DoS на твоей машине. Так сервер(А) будет отвечать на них другой машине, которой, возможно, даже не существует.
2)Ты меняешь свой IP на IP ЖЕРТВЫ. Затем отсылаешь пакеты серверу(В), а он, в свою очередь, DoSит ЖЕРТВУ, адрес которой указан в этих пакетах.
3)Как адрес отправителя, так и адрес получателя равен адресу ЖЕРТВЫ. Ты отсылаешь множество таких пакетов, и ЖЕРТВА ДоСит сама себя.
Практически любой сервер уязвим к DoS-атаке, если не умеет резать пакеты, которые приходят к нему с его же адреса, или не может отличить обычный пользовательский запрос от ДоС-атаки(осуществить это вполне возможно: если это атака, то пакеты приходят с определённой периодичностью, их много, они однообразны).
Но, это только в теории. На практике большое значение имеет ширина канала (и твоего, и жертвы, и сервера). Выигрывает тот, у кого канал шире и мозгов больше; ).
Что касается распределённой атаки, то тут спуфинг применяется обычно чтобы скрыть адрес хозяина машин-зомби. Самим зомби спуфинг не обязателен: ). Здесь же важна не столько ширина твоего канала, сколько количество этих зомби.
Фуфф… вроде бы про спуфинг всё… Теперь заключительное слово…

***
Та информация, которую ты только что впитал, - лишь кусочек того, что можно знать о низкоуровневом хакинге. Как видишь, это очень легко, но самое интересное вот в чем. Имея даже такой маленький кусочек знаний, ты, при определенной сноровке, сможешь повалить сервер. Зато, пыхтя и обливаясь холодным потом, ты ищешь баги в скриптах ради каких-то nobody-привилегий. Конечно, я здесь немного утрировал: порой, поиск багов в скриптах - единственный способ получить доступ к информации. Но в противовес этим словам я поставлю другие: помнишь, я тебе сказал, что IP-адрес можно менять лишь в пакетах, что нельзя получать обратно ответы от сервера и нельзя сделать этот адрес "своим"? Я обманул тебя!!! Учись, хакер. Удачи!

Статья написана Саетгареевым Данилом aka DrWeb специально для HackZona.Ru, которая, надеюсь, и позаботится об авторских правах – свой труд всё-таки дороже золота: )