Оглавление:

Netcat на Python: 6 шагов
Netcat на Python: 6 шагов

Видео: Netcat на Python: 6 шагов

Видео: Netcat на Python: 6 шагов
Видео: Разнёс чужой код за 15 секунд. Часть 1 #код #айти #программирование #рефакторинг 2024, Ноябрь
Anonim
Netcat на Python
Netcat на Python

Что такое netcat? На странице руководства для netcat говорится следующее: «Утилита nc (или netcat) используется практически для всего, что находится под солнцем, включая сокеты TCP, UDP или UNIX-домена. Она может открывать TCP-соединения, отправлять UDP-пакеты, прослушивать произвольные Порты TCP и UDP, сканирование портов и работа как с IPv4, так и с IPv6. В отличие от telnet (1), сценарии nc красиво и разделяют сообщения об ошибках на стандартные ошибки вместо отправки их на стандартный вывод, как telnet (1) делает с некоторыми"

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

Шаг 1. С чего начать?

С чего начать?
С чего начать?

Выше показано, как называется netcat. Вы можете видеть, что в конце есть два аргумента: «пункт назначения» и «порт». Пункт назначения относится к имени хоста или IP-адресу сервера, к которому мы пытаемся подключиться, а порт относится к порту сервера, к которому мы пытаемся подключиться.

Шаг 2: приступим

Давай начнем
Давай начнем

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

Шаг 3: Создание подключения

Создание подключения
Создание подключения

Давайте создадим функцию netcat, которую мы сможем использовать. В основном мы здесь создаем сокет и подключаемся к серверу с использованием заданных параметров. Для команды netcat текущими параметрами являются имя хоста и порт сервера, к которому мы пытаемся подключиться. Сокет содержит параметры «socket. AF_INET» и «socket. SOCK_STREAM», потому что в этом руководстве мы используем TCP-соединение по умолчанию.

Шаг 4. Давайте отправим контент

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

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

Строка 14-16: мы отправляем все содержимое через сокет, мы ждем немного, а затем закрываем сокет для любых исходящих данных, чтобы сокет знал, что данные больше не поступают.

Строка 18-26: мы создаем буфер для хранения ответа сервера, и пока сокет получает данные, мы добавляем к результату до 1024 байтов данных, пока есть данные для чтения.

Строка 28-29: мы хотим, чтобы это соединение netcat было одноразовым, поэтому мы объявляем соединение закрытым, а затем закрываем соединение.

Строка 31: это стандартный HTTP-запрос. Если вы запустите код с аргументами командной строки «google.com» и «80», вы увидите правильный ответ

Шаг 5: давайте установим открытое соединение

Давайте установим открытое соединение
Давайте установим открытое соединение

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

Строка 31: мы хотим читать команды бесконечно, чтобы поддерживать "интерактивность".

Строка 32: это наш буфер, в котором будет храниться содержимое нашего запроса.

Строка 36-45: мы будем читать в буфер, пока не прочитаем пустую строку

Строка 48: мы просто вызываем нашу функцию netcat с именем хоста, портом и вновь созданным контентом (который правильно закодирован)

Строка 50: если содержимое нашего буфера когда-либо содержит «Connection: Close» (указывающее, что мы хотим закрыть соединение), мы просто выходим из цикла.

Шаг 6: Заключение

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

1. поддержка других протоколов

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

3. добавление флагов, которые netcat уже должен изменить для изменения поведения

Рекомендуемые: