Порты и приложения
У каждого компьютера есть набор точек связи, которые называются портами. Если на компьютере выполняется программный процесс — программа — и программа контролирует порт и прослушивает отправляемые на него данные, то с этой программой можно взаимодействовать. Обмен данными следует протоколу, который перечисляет команды, понятные программе.
Другая сторона обмена может находиться на той же машине — источником сообщения может быть другая программа на том же компьютере — или сообщение может исходить с отдельного комп ьютера. Для этого компьютер должен быть подключен к сети, которая позволяет компьютерам обмениваться данными через канал передачи данных. Самый заметный пример такой сети — интернет, который за последнее десятилетие фактически стал повсеместным.
Компьютеры используют 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).
Сканеры портов — распространенный инструмент, который исследователи безопасности используют для определения сервисов, доступных на заданной машине. Сканеры портов работают, перебирая диапазон портов и пытаясь подключиться к каждому из них. Если соединение успешно, значит что-то ответило на запрос, и это можно исследовать дальше.
Обратите внимание, что сканирование портов может рассматриваться как подготовка к кибератаке. Также возможно, что ваш интернет-провайдер (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/.
Не забудьте проверить свои баллы в индикаторе в правом нижнем углу материала!