Fetch prelogin banner from SSH server using Paramiko without authenticating

Viewed 720

I am trying to fetch banner from sever using below code. But the result always says "None", even thought banner exists. I have tried with Python 2 and 3, Paramiko 2.4 and 2.7.0, same result as "None". Can anyone correct/help me?

The code is based on: Is there a way using paramiko and python to get the banner of the ssh server you connected to?

The banner is configured in sshd_config using Banner directive.

# !/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)

Thanks

1 Answers

In general I believe that your code should work. But as after failed password authentication, Paramiko tries in vain various other authentication methods, the further attempts will discard the banner (it looks like a bug in Paramiko to me).

Prevent that by setting look_for_keys and allow_agent in SSHClient.connect:

try:
  client.connect(ip_address, port=port, username='username',
                 password='bad-password-on-purpose',
                 look_for_keys=False, allow_agent=False)
except:
  return client._transport.get_banner()

Here is a fix for Paramiko that allows retrieving the banner without the above workaround:
https://github.com/paramiko/paramiko/pull/438

Related