Рейтинг:9

Как узнать, является ли текущий работающий SSH-сервер OpenSSH или Dropbear?

флаг in

Если я зайду внутрь файла /etc/ssh/ssh_config, я вижу "$OpenBSD" вверху файла. Однако, если я изменю порт по умолчанию на другое значение, это не сработает. Коллега сообщил мне, что это потому, что Dropbear является здесь программным сервером, а не OpenSSH.

Есть ли способ убедиться? Я не могу найти ответ в гугле.

eckes avatar
флаг cn
Вы можете использовать netstat или ss с параметром -p, чтобы увидеть PID, а затем проверить запущенный процесс на наличие пути и командной строки.
Рейтинг:24
флаг cz

Подключитесь к порту ssh (например, 22) и проверьте баннер.

$ нк 10.0.0.10 22
SSH-2.0-OpenSSH_8.6
Mark avatar
флаг tz
Для полноты баннер Dropbear начинается с «SSH-2.0-dropbear».
TooTea avatar
флаг in
Для тех, кто не хочет играть с необработанным соединением, ту же информацию можно извлечь, подключившись с помощью `ssh -v localhost` и найдя `удаленная версия программного обеспечения dropbear` или `версия удаленного программного обеспечения OpenSSH_something`.
Рейтинг:6
флаг rs

Большинство (если не все?) SSH-серверов отправляют какую-то строку версии сразу после подключения. В своем небольшом исследовательском проекте я попытался сопоставить версию SSH-сервера с большим пространством IPv4, и то, что я сделал, было в основном порт адреса nc.

Я встроил его в perl-скрипт с тайм-аутом для облегчения обработки на моей стороне, а также с необязательным тайм-аутом со значением по умолчанию:

#!/USR/бен/перл
использовать предупреждения;
использовать строгий;

если ($ARGV[0] && $ARGV[1]) { die "Использование: ./raw порт имени хоста [время ожидания]\n" }
мой $timeout = '10s';
если ($ARGV[2]) { $timeout = $ARGV[2] }

мой $response = `тайм-аут $timeout nc $ARGV[0] $ARGV[1]`;
напечатать $ответ;

Тестирование на сервере в моей сети:

./sshbanner.pl 172.16.16.11 22
SSH-2.0-OpenSSH_5.3
Patrick Mevzek avatar
флаг cn
«Большинство (если не все?) SSH-серверов отправляют какую-то строку версии сразу после подключения». Поскольку это является обязательным в соответствии со стандартом, см. §4.2 RFC 4253: «Когда соединение установлено, обе стороны ДОЛЖНЫ отправить идентификационная строка.». Программное обеспечение, которое не делает этого, неправильно реализует SSH (и, скорее всего, не сможет взаимодействовать с другими инструментами, использующими SSH)
флаг cn
@PatrickMevzek Вам нужно отправить какую-то строку, но я думаю, что случайная или пустая строка также сработает и мало что идентифицирует.
Patrick Mevzek avatar
флаг cn
@PaÅloEbermann «Вам нужно отправить какую-то строку», да, это именно то, что говорит стандарт, и я процитировал RFC. Так что "если не все?" в ответе является избыточным/ненужным. Любой SSH-сервер, который не отправляет это (вообще ничего), НЕ реализует протокол SSH.
Patrick Mevzek avatar
флаг cn
@SnakeDoc Просто потому, что Perl здесь абсолютно не нужен, вы можете просто запустить внутреннюю команду `timeout ...` прямо в вашей оболочке, Perl ничего туда не добавляет (но если это нравится пользователю, это не проблема. .. `Использование`, хотя и не соответствует приведенному примеру :-)), и я всегда советую НЕ раскошелиться на Perl (или любой другой язык, если на то пошло), особенно если вы раскошелитесь на то, что язык может делать нативно/через библиотеки.Perl имеет `Net::Socket`, который был бы правильным способом сделать `nc`, а также имеет все необходимое для реализации тайм-аутов.
флаг pn
Чтобы расширить комментарий @PatrickMevzek, в RFC указано, что строка идентификатора должна иметь форму «SSH-протоверсия-версия программного обеспечения SP комментарии CR LF», где протоверсия — «2.0», и только комментарии являются необязательными. - Теперь, когда они с открытым исходным кодом, и кто-то теоретически может создать OpenSSH с идентификатором DropBear, вы не можете быть на 100% уверены в этом, но это был бы способ сделать ставку!
флаг us
в bash есть все, что вам нужно `прочитайте
Рейтинг:3
флаг cn

Если вы находитесь на сервере, посмотрите на процесс, подключенный к сетевому порту, где ssh ожидается (22 или что-то другое).

Ты можешь использовать нетстат или же SS для этого. Затем вы сможете найти полную командную строку работающего сервера, которой может быть достаточно для его идентификации, или же вы можете использовать другие параметры:

  • Бег струны на самом деле это последний курс действий, но он может дать результаты (вы наверняка найдете также строку, о которой удаленно сообщает сервер, как показывают другие ответы)
  • вы можете найти открытые файлы процесса (посмотрите в /proc/$PID/fd), который может дать либо ссылку на файл конфигурации, либо файл журнала, и в идеале файл журнала должен содержать достаточно информации, чтобы точно определить, что это за процесс.

Или в зависимости от вашей системы и настроек, например, вы можете использовать systemctl список-юниты чтобы увидеть, что именно работает в настоящее время, и что ssh сервер (затем, проверив системад unit файл, вы увидите, что это за командная строка, и другую информацию)

Если вы находитесь за пределами сервера, то посмотрите другие ответы, но нет гарантии, что он возвращается с удаленного сервера, это правда, он может отображать себя как угодно.

Другим удаленным вариантом может быть «снятие отпечатков пальцев SSH».Я не видел это непосредственно, но я уверен, что это существует. По сути, тестируя различные типы соединений, можно получить некоторую информацию от удаленной части, помимо того, что она утверждает. Я предполагаю, что многие сканеры уязвимостей имеют подобные вещи.

Рейтинг:1
флаг cn

Ты можешь использовать PS чтобы получить список процессов и grep выход для sshd.
При этом вы получите путь к исполняемому двоичному файлу {{ например /usr/sbin/sshd или что-то подобное }}.
Затем вы можете выполнить этот двоичный файл с помощью -? чтобы получить справку и информацию об использовании. Этот вывод будет содержать Окончательное название пакета {{ например, OpenSSH или Dropbear или что-то подобное }}.

Ответить или комментировать

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