Стресс тесты веб приложений с помощью Scrapy

Достаточно долгое время написание инструментов для пентеста компьютерных сетей считалось занятием очень непростым. Но все изменилось с появлением библиотеки Scapy для языка Python. С помощью этой связки можно удовлетворить любую потребность — от создания просто скрипта, отсылающего несколько заданных пакетов в сеть, до написания собственного снифера. Мало того, это не только просто, но и интересно. Об этом мы сегодня и поговорим и даже создадим свои инструменты для ARP– и DNS-спуфинга.

Вступительное слово

Доброго времени суток, дорогой Username, сегодня хотелось бы тебе рассказать об одной мощнейшей библиотеке для языка питон, которая также позиционируется как фреймворк. Имя ей Scapy. Данный инструмент предоставляет нам просто огромные возможности по работе с сетевыми технологиями. Например, он может собирать пакеты с последующей отправкой их в сеть, захватывать пакеты, а также читать их из сохраненного ранее дампа, исследовать сети и многое другое.

Все перечисленное можно делать «в прямом эфире» (то есть из консоли питона) или же посредством написания скриптов. Разработка данной утилиты изначально велась под UNIX-подобные системы, однако запустить ее возможно и на операционных системах семейства Windows. Также она неплохо взаимодействует с другими библиотеками языка питон. Например, gnuplot поможет нам в построении графиков, визуализируя работу инструмента, — что немаловажно, ведь графического интерфейса Scapy не имеет.

Установка модуля SCAPY

Ну что ж, приступим. Начать, я думаю, стоит с описания установки данной утилиты. Для ее работы нам потребуется установленный Python 2.6+, а также дополнительные библиотеки вроде pylibpcap. Если установка производится на Linux и он основан на Debian, то установка сводится к одной команде apt-get install python-scapy. Если же система основана на чем-либо другом, то поможет следующая очередность команд:

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

Ну что же, с установкой на Linux мы разобрались, но как быть обладателям остальных ОС? Начнем, пожалуй, с обладателей техники, произведенной одной фруктовой компанией. Для установки на ОС данного семейства нам придется вооружиться бубном. Первым делом установим MacPorts. Это достаточно мощная утилита, которая дает возможность установки софта, портированного с Linux. Очень подробную инструкцию по ее установке можно найти на официальном сайте проекта (bit.ly/1Ap4wtl).

Далее есть два пути развития событий.

Первый предусматривает создание своего велосипеда (что мало привлекает), а во втором мы воспользуемся скриптом, уже написанным за нас замечательным человеком с ником 0x90 (привет, HardWare Village!). Найти его можно в репозитории на гитхабе (bit.ly/14psIRE). За скрипт автору огромное спасибо. Все, что нам необходимо сделать далее, — скопировать скрипт, выполнить его от имени пользователя root и дождаться отчета об успешной установке. В моем случае использовалась OS Х 10.10 — полет нормальный.

Осталось у нас еще одно семейство ОС, которым, к сожалению, пользуются очень многие, — Windows. Для установки нам необходимо перейти на сайт разработчика и скачать последнюю версию Scapy, далее распаковать ее и в командной строке выполнить следующую команду:

После окончания установки, чтобы проверить работоспособность, мы запускаем интерпретатор питона и пишем коман ду import scapy.
Стандартное окно Scapy, предлагающее начать ввод, представлено на рис. 1.

Как ты видишь, при отсутствии каких-либо библиотек Scapy сразу же предупредит нас. На этом первый шаг укрощения змея окончен, пора приступать к изучению самой утилиты.

Первое знакомство со SCAPY

Для начала предлагаю ознакомиться с основным функционалом этого чудо-комбайна. Одной из самых важных для новичка функций по праву можно считать ls(). Выполнив ее, мы увидим список из более чем трехсот протоколов, поддерживаемых этой утилитой. Выглядит это примерно так, как изображено на рис. 2.

Однако так будет лишь в том случае, если функцию ls выполнить без параметров, а вот если в качестве параметра указать имя какого-либо протокола, то мы получим детальную информацию о его структуре (см. рис. 3).

Обычно наибольший интерес представляет список всех полей, которые можно изменить в процессе создания пакетов. Основной функционал инструмента можно посмотреть командой lsc() — она выведет все имеющиеся в арсенале функции, но нам ведь этого мало, верно? Хотелось бы посмотреть мануал по функциям, и в этом нам поможет команда help(), параметром которой можно указать что-нибудь из полученного списка. Возьмем, например, help(sniff) — она выдаст нам подробную информацию по функции sniff (см. рис. 4).

Ну а теперь попробуем написать самый простой скрипт:

Число count означает количество пакетов, которые мы будем слушать в эфире до окончания программы. В нашем случае это десять, но этот параметр не является обязательным, и если его не указать, то снифер будет работать до получения заветной комбинации ctrl + c. Метод nsummary(), в свою очередь, выводит достаточно подробную статистику о захваченном трафике. Я запускал получившийся скрипт с включенным Wi-Fi и вот что получил на выходе:

Мы видим наш эфир, какие сети ловятся, MAC-адреса, а также SSID. В данном случае мы поймали Beacon-пакет от Wi-Fi-сети, имя которой byfl y WIFI, а MAC-адрес вещающей точки — c8:64:c7:37:48:fd, тип вещания 802.11 Management. А теперь добавим в наш скрипт функцию wrpcap(), которая, как можно догадаться, дает нам возможность записать захваченный трафик в файл.

Файл с именем our_dump.pcap создастся в директории с нашим скриптом, если не указан полный путь. Позже его можно будет проанализировать мощным инструментом под названием Wireshark, который можно запустить прямо из скрипта командой wireshark(). Кстати говоря, про Wireshark есть достаточно крутая статья на Хабре (bit.ly/1ASzxWT). Настоятельно рекомендую ознакомиться.

ARP SPOOFING с Помощью SCAPY

Все это, конечно, интересно, но давай уже рассмотрим реальное применение этого инструмента. Для примера я выбрал одну из моих любимых атак — ARP poisoning, также известную под названием ARP spoofing. Перед тем как приступить к реализации, хотелось бы рассказать немного о самой атаке. На каждой машине в сети имеется такая вещь, как ARP-таблица, — она хранит соотношения IP-адресов машин в сети с их MAC-адресами. Суть атаки заключается в следующем: когда атакуемая машина посылает запрос на поиск роутера в сети, дабы отослать какую-либо информацию, мы посылаем ей ложный пакет с данными, в которых говорится «мы и есть роутер», и весь трафик, который должен был идти напрямую в Сеть, идет туда, но уже через нас, то есть такой вариант реализации классической MITM-атаки.

Реализовывать атаку, как ты понял, мы будем на языке Python с использованием библиотеки Scapy. Для простоты я буду приводить части программного кода, а потом разбирать их. Первой частью, конечно же, будет

В данной части, я думаю, никаких вопросов быть не должно, мы просто подключаем библиотеки вроде Scapy, системной и так далее.

Функция originalMAC возвращает нам MAC-адрес для указанного IP-адреса.

Ну а эта функция, как можно догадаться из названия, будет парсить аргументы из строки, когда мы будем вызывать нашу программу. У нас будет два аргумента: targetIP и routerIP. В них, соответственно, будут находиться адреса для будущей атаки. Для их задания при вызове нашего скрипта будут использоваться ключи -t и -r соответственно.

А вот и сама функция «заражения». Ее аргументами будут IP- и MAC-адреса нашего роутера и «машины-жертвы». В функции мы посылаем два ARP-пакета, в которых указываем необходимые адреса. О строении этого пакета можно подробнее узнать, используя команду lsc(arp).

restore полностью аналогична функции poison, однако выполняет обратную роль — она возвращает все наши MAC- адреса в ARP-таблице на правильные, проще говоря «обеззараживает».

Ну и последняя часть нашей программы — функция main(), вызывается она, как ты успел заметить, с параметрами, парсинг которых мы описали немного ранее. Первым делом проверяем, от какого пользователя запущен наш скрипт. Как я уже говорил, нужны максимальные привилегии, так как работать приходится на низкосетевом уровне. Далее мы находим MAC-адреса нашей цели и роутера и, если все в порядке, запускаем заражение. Зараженные пакеты мы шлем в сеть каждые полторы секунды, чтобы цель не находила настоящий роутер. Запуск нашего скрипта:

Результат его работы можно посмотреть на рис. 5.

Итак,атака в самом разгаре, остается только запустить снифер.

DNS SPOOFING

Ну а теперь попробуем заняться чем-нибудь более сложным. Например… DNS-спуфингом. Суть данной атаки состоит в том, что мы атакуем DNS-кеш, в котором хранится соответствие между именами сайтов и их реальными IP-адресами, и подменяем адрес какого-либо сервиса на свой. В результате все запросы, идущие на этот сервис, будут приходить атакующему. В этот раз я не стану описывать совершенно понятные части вроде импорта библиотек, а возьмем лишь самое вкусное. Хочу заметить, что скрипт я писал под Linux, и если тебе, username, захочется его протестировать на другой ОС, придется немного попотеть самому. Собственно, об этом и сообщает функция osCheck(), проверяющая тип используемой ОС.

Далее перейдем к функции main(). Первым делом нам необходимо поймать DNS-пакет (запрос к DNS-серверу), на питоне это будет выглядеть примерно так:

После поимки необходимо проверить, действительно ли это DNS-пакет. Затем убедиться, что это DNS-запрос (getDNSPacket[0].haslayer(DNS)), а не DNS-ответ (getDNSPacket[0].getlayer(DNS).qr == 0) и что в нем запрашивается адрес какого-либо одного домена ((getDNSPacket[0].getlayer(DNS).qd.qtype == 1) and (getDNSPacket[0].getlayer(DNS).qd.qclass == 1)), а не чего-то еще. Для наглядности выведем сообщение о поимке и поставим время поимки, собранное воедино условие будет выглядеть так:

Далее мы разбираем полученный пакет на составляющие части и запоминаем их. Если взглянуть на программный код, выглядеть это будет так:

Ну и наконец, создаем поддельный пакет с помощью следующего кода:

Это и есть тот самый Packet Crafting в действии. На самом деле это только выглядит страшно, а составляется достаточно просто. Стоит лишь взглянуть на структуру пакета (помнишь, я рассказывал, как это сделать, в начале статьи?) и подставить полученные из запроса данные, далее мы просто отсылаем этот пакет и делаем все описанные выше действия по кругу. Выполнение скрипта можно увидеть на рис. 6.

В Заключении

Ну что же, дорогой Username, вот мы и рассмотрели азы Scapy. Подводя итог, хотелось бы еще раз напомнить, что это очень мощный и крутой инструмент для построения пакетов, их отлова, а также работы с сетью на любом уровне. Я считаю, что любой человек, увлекающийся ИБ, просто обязан ознакомиться с ним.

Рейтинг материала
[Голосов: 0 Рейтинг: 0]
26 декабря 2015, 12:53

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *