如果我进入文件/etc/ssh/ssh_config
,我可以在文件顶部看到“$OpenBSD”。但是,如果我将默认端口更改为其他值,它似乎不起作用。一位同事告诉我,这是因为 Dropbear 是这里的软件服务器,而不是OpenSSH。
有没有什么办法可以确定?我通过谷歌搜索找不到答案。
答案1
连接到 ssh 端口(例如 22)并检查横幅。
$ nc 10.0.0.10 22
SSH-2.0-OpenSSH_8.6
答案2
大多数(如果不是全部?)SSH 服务器在连接后会立即发送某种版本字符串。在我的一个小型研究项目中,我尝试在大型 IPv4 空间中映射 SSH 服务器版本,我所做的基本上是nc address port
。
我将其嵌入到一个具有超时设置的 perl 脚本中,以便于我这边处理,并且还提供了一个具有默认值的可选超时设置:
#!/usr/bin/perl
use warnings;
use strict;
unless ($ARGV[0] && $ARGV[1]) { die "Usage: ./raw hostname port [timeout]\n" }
my $timeout = '10s';
if ($ARGV[2]) { $timeout = $ARGV[2] }
my $response = `timeout $timeout nc $ARGV[0] $ARGV[1]`;
print $response;
在我的网络上的服务器上进行测试:
./sshbanner.pl 172.16.16.11 22
SSH-2.0-OpenSSH_5.3
答案3
如果您在服务器上,请查看连接到网络端口的进程是否ssh
处于预期位置(22
或其他位置)。
您可以使用netstat
或ss
。然后您将能够找到正在运行的服务器的完整命令行,这可能足以识别它,或者您可以使用其他选项:
- 在其上运行
strings
实际上是最后一项行动,但可以产生结果(您肯定还会找到服务器远程报告的字符串,正如其他答案所示) - 您可以找到该进程打开的文件(查看
/proc/$PID/fd
),其中可能产生指向配置文件或日志文件的链接,理想情况下,日志文件将提供足够的信息来确定这是什么进程。
或者取决于您的系统和设置,例如,您可以使用它systemctl list-units
来准确查看当前正在运行的内容以及ssh
服务器是什么(然后通过检查systemd
单元文件,您将看到它是什么命令行以及其他信息)
如果您位于服务器外部,请参见其他答案,但不能保证从远程服务器返回的内容是真实的,它可以将自己显示为任何它想要的内容。
远程的另一种选择是进行“SSH 指纹识别”。我还没有亲眼见过,但我确信它存在。基本上,通过测试各种类型的连接,除了它声称的信息之外,还可以确定远程部分的一些信息。我猜多个漏洞扫描器都有类似的东西。
答案4
您可以使用ps
获取进程列表和的grep
输出sshd
。
这样,您将获得可执行二进制文件的路径 {{ eg/usr/sbin/sshd
或类似的东西 }}。
然后,您可以使用执行此二进制文件以-?
获取帮助和使用信息。此输出将包含软件包的最终名称{{ 例如 OpenSSH 或 Dropbear 或类似的东西 }}。