I recently wrote a small script to get a list op ssh servers in my local network because I didn't know the ip address of my computers without connecting them to a screen and looking it up (which would eliminate the need for ssh). Because I have multiple ssh servers, I want to know which ip address belongs to a computer. To do that, I thougth of using the ssh banner to indentify a computer. Since using a ssh library would be a little bit overkill to just get the banner and for the learning experience, I want to implement this using sockets.
Atm I have this in python:
from socket import socket
s = socket()
s.connect((ip,22))
s.send(s.recv(100)) # send the ssh version back
Until here it works, and reading from the socket gives a list of supported encryption algoritms. I should send a list back of algoritms and my mac address (in which i haven't succeeded yet). I tried sending the list I got from the server, but after that I didn't got any response.
According to the documentation, the server could at any moment send the banner. When I use a normal ssh client, it displays the banner before I log in, so I don't think I need to go through the whole authenticating process.
Whats the most simple way to get the ssh banner using sockets?
(Code doesn't have to be in python)
Use
paramiko - an ssh client wrapper written in python, code can be easily re-used to grab banner
# !/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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With