【问题标题】:Get SSH Banner using raw sockets使用原始套接字获取 SSH 横幅
【发布时间】:2013-05-14 03:41:38
【问题描述】:

我最近编写了一个小脚本来获取本地网络中的 ssh 服务器列表,因为我不知道我的计算机的 ip 地址,而无需将它们连接到屏幕并进行查找(这将消除对 ssh 的需要)。因为我有多个 ssh 服务器,所以我想知道哪个 ip 地址属于一台计算机。为此,我想使用 ssh 横幅来识别计算机。由于使用 ssh 库来获得横幅和学习体验有点过头,我想使用套接字来实现它。

Atm 我在 python 中有这个:

from socket import socket
s = socket()
s.connect((ip,22))
s.send(s.recv(100)) # send the ssh version back

直到这里它起作用,并且从套接字读取会给出支持的加密算法列表。我应该发回一份算法列表和我的mac地址(我还没有成功)。我尝试发送从服务器获得的列表,但之后我没有得到任何响应。

根据文档,服务器可以随时发送横幅。当我使用普通的 ssh 客户端时,它会在我登录之前显示横幅,所以我认为我不需要经历整个身份验证过程。

使用套接字获取 ssh 横幅的最简单方法是什么?

(代码不必在python中)

【问题讨论】:

  • 也许我没有正确理解你的问题,但为什么不直接使用nmap 之类的呢?
  • 我不会从使用nmap 中学到任何东西,并且输出包含更多我不需要的数据,并且标志更复杂。而且 afaik nmap 不显示 ssh 横幅。
  • 为什么使用 ssh 库看起来有点矫枉过正?在我看来,这将是最好和最正确的方法。顺便说一句,我建议您通过 SSH 密钥指纹来唯一标识计算机,而不是通过它们的横幅。大多数 SSH 服务器没有配置特别独特的横幅——许多根本没有。如果您将 SSH 密钥指纹与 DNS SSHFP 记录相匹配,则您可以在 DNS 中维护这些记录以作为文档。

标签: sockets ssh openssh


【解决方案1】:

使用 paramiko - 一个用 python 编写的 ssh 客户端包装器,代码可以很容易地重复使用来抓取横幅

# !/usr/bin/python

import paramiko


def grab_banner(ip_address, port):
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        client.connect(ip_address, port=port, username='username', password='bad-password-on-purpose')
    except:
        return client._transport.get_banner()


if __name__ == '__main__':
    print grab_banner('192.168.1.26', 22)
  • 遇到了同样的问题,尝试使用原始套接字,但看到横幅是在 ssh 加密密钥交换后发送的(仅获取横幅就过大了)

【讨论】:

    猜你喜欢
    • 2015-01-09
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    相关资源
    最近更新 更多