Module 2.1

Порты и приложения

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

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

Компьютеры используют IP-адреса, чтобы идентифицировать другие компьютеры. В принципе, у каждого компьютера, подключенного к интернету, есть связанный с ним IP-адрес. IP-адрес — это набор из четырех чисел от 0 до 255, разделенных точками (например, 127.0.0.1, что соответствует вашему собственному компьютеру). Поскольку существует только 232 возможных вариантов адреса, они постепенно заканчиваются из-за появления кофейников с IP-адресами и сопутствующим программным обеспечением — интернета вещей. Существует и более новая версия, называемая IPv6; в ней 2128 различных возможных адресов, что фактически решает эту проблему.

Переходим к задаче

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

Языки программирования обычно поставляются с библиотеками, которые уменьшают объем кода, необходимый программисту для выполнения конкретной задачи. Например, доступ к удаленному компьютеру в Python можно получить с помощью модуля socket. В принципе, программисту нужно только создать экземпляр сокета, подключить его к цели (ip и порт целевой машины передаются как параметры), а затем, например, прочитать данные с целевой машины.

address = "127.0.0.1"
port = 12321

s = socket.socket()
s.connect((address, port))
data = s.recv(1024)         # Attempt to read at most 1024 bytes

Пример выше — в зависимости от целевого сервера — выбросит исключение, если к порту нельзя подключиться. О том, как обрабатывать исключения, смотрите руководство Python по исключениям. Также можно использовать connect_ex вместо connect.

Обратите внимание, что параметры connect заключены в дополнительные скобки. Причина в том, что connect принимает один параметр, и в нашем случае это кортеж вида (address, port).

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

Loading

Обратите внимание, что сканирование портов может рассматриваться как подготовка к кибератаке. Также возможно, что ваш интернет-провайдер (ISP) запрещает выполнять сканирование портов. Перед участием в следующем тесте убедитесь, что вам разрешено это делать.

Обмен данными с удаленной программой

Если у компьютера открыт порт, с программой, которая прослушивает этот порт, скорее всего можно взаимодействовать. Один из самых простых подходов для такой проверки — использование Telnet, который доступен в большинстве операционных систем; если его нет, всегда можно скачать, например, PuTTY (в PuTTY убедитесь, что тип соединения — raw). В современных версиях macOS Telnet больше не встроен, но можно использовать netcat (nc), как показано здесь.

Соединения Telnet устанавливаются с конкретным адресом и конкретным портом. Например, соединение с веб-сервером F-Secure можно инициировать через адрес f-secure.com и порт 80.

При общении с приложением важно знать протокол — формат обмена, — которому следует приложение. Один из таких примеров — протокол HTTP, который используется веб-серверами.

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

GET / HTTP/1.1
Host: f-secure.com

В примере выше мы сначала сообщаем серверу, что хотим получить ресурс по "/", и что используем версию 1.1 протокола HTTP. Следующая строка описывает адрес, к которому мы хотим обратиться; это указывается потому, что серверы могут размещать несколько веб-сайтов. HTTP-запрос завершается двумя пустыми строками.

При запуске telnet и получении содержимого с сайта f-secure мы видим нечто похожее на следующее.

username@machine:~$ telnet f-secure.com 80
Trying 104.126.172.25...
Connected to f-secure.com.
Escape character is '^]'.
GET / HTTP/1.1

Host: f-secure.com
HTTP/1.1 302 Moved Temporarily
Server: AkamaiGHost
Content-Length: 0
Location: http://f-secure.com/fi_FI/
...

В примере выше вместо возврата содержимого страницы веб-сервер F-Secure просит нас искать содержимое по адресу http://f-secure.com/fi_FI/.

Вы дошли до конца этого раздела! Перейти к следующему разделу:

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

В этой части:
  1. 1. Порты и приложения

  2. 2. Веб-серверы и веб-приложения