是否可以在 known_hosts 文件中找出主机?

Col*_*ell 155 ssh

我想看看我的 known_hosts 文件中有哪些主机,但它似乎不是人类可读的。是否可以阅读它?

更具体地说,我可以通过多个名称连接到一个主机,我想从已知的主机文件中找出我期望的指纹。

更新:我正在使用 OpenSSH_5.3p1 Debian-3ubuntu7,OpenSSL 0.9.8k 2009 年 3 月 25 日

我的 known_hosts 文件中的一行看起来像这样,

|1|guO7PbLLb5FWIpxNZHF03ESTTKg=|r002DA8L2JUYRVykUh7jcVUHeYE= ssh-rsa AAAAB3NzaC1yc2EAAFADAQABAAABAQDWp73ulfigmbbzif051okmDMh5yZt/DlZnsx3DEOYHu3Nu/+THJnUAfkfEc1XkOFiFgbUyK/08Ty0K6ExUaffb1ERfXXyyp63rpCTHOPonSrnK7adl7YoPDd4BcIUZd1Dk7HtuShMmuk4l83X623cr9exbfm+DRaeyFNMFSEkMzztBYIkhpA2DWlDkd90OfVAvyoOrJPxztmIZR82qu/5t2z58sJ6Jm2xdp2ckySgXulq6S4k+hnnGuz2p1klviYCWGJMZfyAB+V+MTjGGD/cj0SkL5v/sa/Fie1zcv1SLs466x3H0kMllz6gAk0/FMi7eULspwnIp65g45qUAL3Oj
Run Code Online (Sandbox Code Playgroud)

pdo*_*pdo 175

您已在文件中HashKnownHosts设置为“ yesssh_config,因此主机名在纯文本中不可用。

如果您提前知道要查找的主机名,则可以使用以下命令进行搜索:

ssh-keygen -H -F hostname
# Or, if SSH runs on port other than 22
ssh-keygen -H -F '[hostname]:2222'
Run Code Online (Sandbox Code Playgroud)

这是ssh-keygen(1)手册页中的相关部分:

 -F hostname
         Search for the specified hostname in a known_hosts file, listing
         any occurrences found.  This option is useful to find hashed host
         names or addresses and may also be used in conjunction with the
         -H option to print found keys in a hashed format.
Run Code Online (Sandbox Code Playgroud)

  • @pdo - 您的命令并不总是有效。如果主机在‘22’以外的端口上有 SSH,则‘known_hosts’中的格式是不同的。然后你必须使用以下命令:`ssh-keygen -H -F [host.example.com]:2222` (12认同)
  • @ColinNewell 是的,您需要知道主机名。这是一种安全措施,可以防止攻击者在您的机器受到威胁时获取您经常使用的其他机器的主机名/IP 地址。 (8认同)
  • 不是 sshd_config,而是 ssh_config。 (6认同)
  • 散列已知主机本质上是否意味着不可能?即我需要知道主机的名称才能查看它的信息? (4认同)
  • 我想找到特定主机的 rsa 密钥,因此我运行了以下命令: `ssh-keygen -l -f ~/.ssh/known_hosts -F <hostname>` (2认同)
  • 哦,“[主机名]:2222”中的方括号是*文字*。我无意识地将它们解析为指示要替换的变量!如果您尝试查找端口不是 22 的服务器,您*确实*必须包含这些方括号。 (2认同)

Roy*_*ams 22

对于未来的搜索者,这篇文章(非免责声明:我没有从属关系)有一个相对简单的 Perl 脚本,可以在known_hosts.

http://blog.rootshell.be/2010/11/03/bruteforcing-ssh-known_hosts-files/

它允许从特定的 IP 地址开始。它也可以很容易地修改为使用字典。

此外,在 2014 年 6 月,John the Ripper 项目增加了对 known_hosts 破解的支持,它可以利用多个 CPU 内核、GPU、字典重整等。

总体而言,这是一项类似于密码破解的练习,具有更可预测(或至少受限制)的目标空间。

对于私有 IP,您可以使用此 nmap 片段生成所有 RFC1918 IP 地址的字典以用作字典:

nmap -sL -Pn -n 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 |\
    grep '^Nmap scan report for' | cut -d\  -f5 >ips.list
Run Code Online (Sandbox Code Playgroud)

如果包含公共 IP,则使用规则可能更有效。这个 hashcat 规则集可能需要额外的工作来适应与 JtR 一起工作,但完成了大部分繁重的工作,应该给你一个起点。

主机名对用户和环境更具特殊性,但主机名也有趋势。完全限定的主机名可以在 DNS、/etc/hosts、shell 历史记录等中与任何发现的 IP 地址相关联。由于目标系统可能与主机系统完全无关,因此可以从各种 Internet 范围的扫描工作(例如 Censys)的 DNS 数据中获取公共域和主机名的公共转储。

除了最简单的情况外,在接受的所有答案中,使用 John the Ripper 可能比本地 SSH 解决方案更有效且可扩展性更好。


sr_*_*sr_ 10

ssh-keygen -l -f ~/.ssh/known_hosts帮助吗?它显示该文件中每个主机的指纹。(使用-v你也可以获得漂亮的小藏宝图,例如

+--[ RSA 2048]----+
|        .        |
|       + .       |
|      . B .      |
|     o * +       |
|    X * S        |
|   + O o . .     |
|    .   E . o    |
|       . . o     |
|        . .      |
+-----------------+
Run Code Online (Sandbox Code Playgroud)

  • 不是严格意义上的不,它仍然是 base64。pdo 对它被散列的解释表明这是一种单向的事情,所以我想我被卡住了,除非我知道主机名。 (3认同)
  • 呃,`ssh-keygen -l -F <hostname>` 更简单 (3认同)

xn.*_*xn. 6

使用-l选项ssh-keygen列出指纹,以及-Fknown_hosts文件中搜索主机名的选项。

$ ssh-keygen -l -F sdf.org
# Host sdf.org found: line 835 type RSA
2048 6e:cd:53:4f:75:a1:e8:5b:63:74:32:4f:0c:85:05:17 |1|9J47PEllvWk/HJ6LPz5pOB2/7rc=|ld0BtQh5V3NdhBHBwR/ZqSv8bqY= (RSA)
Run Code Online (Sandbox Code Playgroud)

您可以使用您ssh-keyscan的指纹known_hosts与来自服务器的指纹进行比较。

$ ssh-keyscan sdf.org | awk '{print $3}' | base64 -d | openssl md5 -c
# sdf.org SSH-2.0-OpenSSH_7.1
# sdf.org SSH-2.0-OpenSSH_7.1
no hostkey alg
(stdin)= 6e:cd:53:4f:75:a1:e8:5b:63:74:32:4f:0c:85:05:17
Run Code Online (Sandbox Code Playgroud)