暴力破解测试工具--Patator 源码分析
作者:网络转载 发布时间:[ 2013/8/15 17:10:07 ] 推荐标签:
运行结果如下:
我们发现这的确是一种可行的办法。这也给hydra误报带来了解决办法。
由于每次都创建telnetlib.Telnet对象比较浪费资源,patator使用了缓存来解决这个问题,但这里我一直有一个疑问,为啥Telnet对象可以缓存,如果亲明白,教教我吧!
Telnet_login的父类TCP_Cache简化代码如下:
class TCP_Cache:
def __init__(self):
self.cache = {} # {'10.0.0.1:22': ('root', conn1), '10.0.0.2:22': ('admin', conn2),
self.curr = None
def __del__(self):
for _, (_, c) in self.cache.items():
c.close()
self.cache.clear()
def bind(self, host, port, *args, **kwargs):
hp = '%s:%s' % (host, port)
key = ':'.join(args)
if hp in self.cache:
k, c = self.cache[hp]
if key == k:
self.curr = hp, k, c
return c.fp, c.banner
else:
c.close()
del self.cache[hp]
self.curr = None
conn = self.connect(host, port, *args, **kwargs)
self.cache[hp] = (key, conn)
self.curr = hp, key, conn
return conn.fp, conn.banner
我们可以看到,当开始新建一Telnet_login对象时,将把host:port信息加入cache,以后每次都会现在cache中寻找,如果有直接返回连接对象(使用先前fp,fp.expect返回信息怎么还可用???)。
Patator基于模块化的设计,啥模块化的设计?因为支持多种协议,而各个协议之间都是独立的。举个简单的例子,你想测试telnet弱密码,使用的是telnetlib库,属于标准库,所以你完全可以扫telnet弱密码,即使你没有安装pycurl(扫http弱密码使用的库,是curl库的python封装)。哇塞,挺强大啊,那这又是怎么实现的呢?
不看不知道,一看吓一跳,相当的简单。
warnings = []
try:
import pycurl
except ImportError:
warnings.append('pycurl')
dependencies = {
'paramiko': [('ssh_login',), 'http://www.lag.net/paramiko/', '1.7.7.1'],
'pycurl': [('http_fuzz',), 'http://pycurl.sourceforge.net/', '7.19.0'],
'openldap': [('ldap_login',), 'http://www.openldap.org/', '2.4.24'],
'impacket': [('smb_login','smb_lookupsid','mssql_login'), 'http://oss.coresecurity.com/projects/impacket.html', 'svn#765'],
'cx_Oracle': [('oracle_login',), 'http://cx-oracle.sourceforge.net/', '5.1.1'],
'mysql-python': [('mysql_login',), 'http://sourceforge.net/projects/mysql-python/', '1.2.3'],
'psycopg': [('pgsql_login',), 'http://initd.org/psycopg/', '2.4.5'],
'pycrypto': [('vnc_login',), 'http://www.dlitz.net/software/pycrypto/', '2.3'],
'dnspython': [('dns_reverse', 'dns_forward'), 'http://www.dnspython.org/', '1.10.0'],
'IPy': [('dns_reverse', 'dns_forward'), 'https://github.com/haypo/python-ipy', '0.75'],
'pysnmp': [('snmp_login',), 'http://pysnmp.sf.net/', '4.2.1'],
'unzip': [('unzip_pass',), 'http://www.info-zip.org/', '6.0'],
'java': [('keystore_pass',), 'http://www.oracle.com/technetwork/java/javase/', '6'],
'python': [('ftp_login',), 'http://www.python.org/', '2.7'],
}
for w in set(warnings):
mods, url, ver = dependencies[w]
if name in mods:
print('ERROR: %s %s (%s) is required to run %s.' % (w, ver, url, name))
abort = True
上面这是我简化后的代码,从中可以看出,有一个全局变量列表warning,每次导入需要的库时,如果导入失败,则将库名加入warning,当我们通过命令行传递使用哪个模块时,如我们使用pycurl,这时我们发现在warnings中含有“pycurl",所以提示我们需要安装库,而且很智能的将库的地址也给我们了。
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11