Почему «sock.recv (1024)» снаружи », в то время как True:« возвращает службу, работающую на порту, как это делает nmap? - PullRequest
0 голосов
/ 20 января 2019

Я не понимаю, почему sock.recv() возвращает имя службы, работающей на конкретном порту.Вот что я имею в виду.Когда вы пишете код на python и подключаетесь к серверу, вы обычно делаете это в цикле while True, чтобы получить то, что было отправлено другим компьютером.Но когда вы просто делаете recv() один раз самопроизвольно на сервере, скажем 192.168.55.3, на port 22, который работает ssh, sock.recv(1024) возвращает имя приложения, такое как ssh version xxx Я не понимаюмеханизм, стоящий за этим, и надеюсь, что кто-то может объяснить.

Я провел какое-то исследование, но не смог найти много.

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((interface, port))
sock.connect((host, host_port))
print(sock.recv(100))

он возвращает что-то вроде этого b'SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1\n

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Вы подключаетесь к порту 22, который используется для протокола SSH (Secure Shell) .

Per RFC 4253: протокол транспортного уровня Secure Shell (SSH), Раздел 4: «Настройка соединения» :

SSH работает через любой 8-битный чистый двоично-прозрачный транспорт.Базовый транспорт ДОЛЖЕН защищать от ошибок передачи, поскольку такие ошибки приводят к разрыву соединения SSH.Клиент инициирует соединение.

4.1.Использование по TCP / IP

При использовании по TCP / IP сервер обычно прослушивает соединения через порт 22 * ​​1015 *.Этот номер порта был зарегистрирован в IANA и был официально назначен для SSH.

4.2.Версия протокола обмена

Когда соединение установлено, обе стороны ДОЛЖНЫ отправить идентификационную строку .Эта идентификационная строка ДОЛЖНА быть

SSH-protoversion-softwareversion SP комментарии CR LF

Поскольку протокол, определяемый в этом наборе документов, - это версия 2.0, «протоверсия» ОБЯЗАНА быть «2.0».Строка 'comments' является необязательной.Если включена строка 'comments', символ 'пробел' (обозначенный выше как SP, ASCII 32) ДОЛЖЕН разделять строки 'softwareversion' и 'comments'.Идентификация ДОЛЖНА заканчиваться одним символом возврата каретки (CR) и одним символом перевода строки (LF) (ASCII 13 и 10 соответственно).Разработчики, желающие сохранить совместимость с протоколом стандартов Ylonen & Lonvick [Страница 4] Протокол транспортного уровня SSH RFC 4253, январь 2006 г., со старыми недокументированными версиями этого протокола могут захотеть обработать строку идентификации, не ожидая присутствия символа возврата каретки по описанным причинамв разделе 5 этого документа.Нулевой символ НЕ ДОЛЖЕН быть отправлен.Максимальная длина строки составляет 255 символов, включая возврат каретки и перевод строки.

Часть строки идентификации, предшествующая возврату каретки и переводу строки, используется в обмене ключами Диффи-Хеллмана (см. Раздел 8).).

Сервер МОЖЕТ отправить другие строки данных перед отправкой строки версии.Каждая строка ДОЛЖНА заканчиваться возвратом каретки и переводом строки.Такие строки НЕ ДОЛЖНЫ начинаться с "SSH-" и ДОЛЖНЫ быть закодированы в ISO-10646 UTF-8 [RFC3629] (язык не указан).Клиенты ДОЛЖНЫ иметь возможность обрабатывать такие строки.Такие строки МОГУТ игнорироваться или МОГУТ отображаться пользователю клиента.Если они отображаются, то следует использовать фильтрацию управляющих символов, как описано в [SSH-ARCH].Основное использование этой функции - позволить TCP-оболочкам отображать сообщение об ошибке перед отключением.

Обе строки 'protoversion' и 'softwareversion' ДОЛЖНЫ состоять из печатных символов US-ASCII, за исключением пробеловсимволы и знак минус (-).Строка 'softwareversion' в основном используется для запуска расширений совместимости и для указания возможностей реализации.Строка 'comments' ДОЛЖНА содержать дополнительную информацию, которая может быть полезна при решении пользовательских проблем.Таким образом, примером допустимой идентификационной строки является

SSH-2.0-billsSSH_3.6.3q3

Эта идентификационная строка не содержит необязательную строку 'comments' итаким образом, завершается символами CR и LF сразу после строки 'softwareversion'.

Обмен ключами начинается сразу после отправки этого идентификатора.Все пакеты, следующие за идентификационной строкой, ДОЛЖНЫ использовать двоичный пакетный протокол, который описан в разделе 6.

То, что вы видите распечатанным, - это идентификационная строка сервера:

SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1

Где:

  • protoversion = 2.0
  • softwareversion = OpenSSH_4.7p1
  • comments = Debian-8ubuntu1
0 голосов
/ 20 января 2019

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

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

Протоколы, которые делают это, включают SSH, SMTP и FTP.Попробуйте подключиться к разным портам, и вы получите совершенно разные результаты

...