|
import socket, subprocess, random, string |
|
|
|
def generate_random_string(length=10): |
|
characters = string.ascii_uppercase + string.digits |
|
return ''.join(random.choice(characters) for _ in range(length)) |
|
|
|
def grab_ssh_banner(port=22, timeout=5): |
|
host = 'localhost' |
|
try: |
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
|
sock.settimeout(timeout) |
|
sock.connect((host, port)) |
|
|
|
banner = sock.recv(1024).decode('utf-8').strip() |
|
sock.close() |
|
return banner.strip() |
|
except ConnectionRefusedError: |
|
print("FAILED") |
|
except socket.timeout: |
|
print("FAILED") |
|
except Exception as e: |
|
print(f"FAILED") |
|
exit(1) |
|
|
|
def run_command(command): |
|
try: |
|
result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
|
return result.stdout.decode().strip() |
|
except subprocess.CalledProcessError as e: |
|
print(e) |
|
print("FAILED") |
|
exit(1) |
|
|
|
print(""" |
|
OpenSSH Banner Hidder |
|
===================== |
|
""") |
|
port = int(input("Enter Port: ")) |
|
print("[+] Getting Current Banner...", end='') |
|
banner = grab_ssh_banner(port) |
|
print('DONE') |
|
|
|
pts = banner.split("-") |
|
banner = "-".join(pts[2:]) |
|
len_banner = len(banner) |
|
new_banner = generate_random_string(len_banner) |
|
|
|
print("Current Banner:", banner) |
|
print("New Banner:", new_banner) |
|
|
|
print('[+] Copying Binary from /usr/sbin/sshd...') |
|
run_command("cp /usr/sbin/sshd ./sshd") |
|
|
|
print('[+] Searching for Current Banner...', end='') |
|
out = run_command(f"strings -t d -a -n {len_banner} sshd | grep -i \"{banner}\"") |
|
if len(out) == 0 or len(out.strip().split(" ")) < 2: |
|
print("NOT FOUND") |
|
exit(1) |
|
print('FOUND') |
|
|
|
offset = int(out.split(" ")[0]) |
|
print ("[+] Overwriting New Banner...", end='') |
|
with open('sshd', 'r+b') as fp: |
|
fp.seek(offset) |
|
fp.write(new_banner.encode()) |
|
|
|
out = run_command(f"strings -t d -a -n {len_banner} sshd | grep -i \"{new_banner}\"") |
|
if len(out) == 0 or len(out.strip().split(" ")) < 2: |
|
print("FAILED") |
|
exit(1) |
|
|
|
if out.split(" ")[1].strip() != new_banner: |
|
print("FAILED") |
|
exit(1) |
|
print('DONE') |
|
|
|
print("[+] Stopping OpenSSH Server...", end='') |
|
run_command("sudo systemctl stop ssh ssh.socket") |
|
print('DONE') |
|
|
|
print("[+] Copying binary to /usr/sbin/sshd...", end='') |
|
run_command("sudo cp /usr/sbin/sshd ./sshd.back") |
|
run_command("sudo cp ./sshd /usr/sbin/sshd") |
|
print('DONE') |
|
|
|
print("[+] Starting OpenSSH Server...", end='') |
|
run_command("sudo systemctl start ssh ssh.socket") |
|
print('DONE') |
|
|
|
print("[+] Cleaning Up...", end='') |
|
run_command("rm ./sshd") |
|
print('DONE') |
|
|
|
print("[+] Checking Banner...", end='') |
|
banner2 = grab_ssh_banner() |
|
pts = banner2.split("-") |
|
banner2 = "-".join(pts[2:]) |
|
if banner2 == new_banner: |
|
print('OK') |
|
print('\n\033[32;1mOpenSSH Banner Hidden Successfully\033[0m\n') |
|
exit(0) |
|
|
|
print("FAILED") |
|
print("[+] Restoring ssh...", end='') |
|
run_command("sudo systemctl stop ssh ssh.socket") |
|
run_command("sudo cp ./sshd.back /usr/sbin/sshd") |
|
run_command("sudo systemctl start ssh ssh.socket") |
|
print('DONE') |
|
|
|
print('\n\033[31;1mFailed to Hide OpenSSH Banner\033[0m\n') |