密码爆破程序技术讲解

这个程序已经写了很长时间了,一直没有时间来进行总结归纳。最近在清理自己写过的文件和程序,为了避免自己以后找不到了,就将写的程序上传到brutepwdbyflowbrutepwdbyhtml上面了,同时也借这个机会对自己的程序进行一个比较详细的说明和总结。

概述

这2个程序的作用都是用来爆破web程序的用户名和密码的,可以认为是姊妹软件,大部分的代码都是完全相同的,区别仅仅只有少部分,就是在分析和获取提交的参数的方式上存在不同。相比目前常见的密码爆破的软件,如burpsuite和pkav,这2款软件最大的特点就是自动化的程度较高,用户仅仅只是需要输入登录页面的URL,然后选择用户名字典和密码字典就结束了,不需要像burpsuite和pkav那样繁杂的操作,可以说这2个程序完全是为小白设计的,很容易上手。

技术说明

这2个程序都是使用Python写的,后台的发送网络请求,分析html网页结构都是使用的Python。界面是使用的Qt来制作的。所以整个项目完全是一个Python的程序,没有使用其他的语言或者是软件。虽然使用的Python,但是在整个软件的架构中还是使用了很多的Python库以及一些多线程的技术。

界面

当时在写这个软件的时候,综合了几种Python写界面的技术。常见的技术有Tkinter,wxPython,pyGTK,PyQt,PySide。由于Python自带的Tkinter自带的功能较弱,最后综合考虑之下就选择了PyQt4。使用了PyQt4,那么就需要考虑到界面的问题了。对于界面的编写,仅仅考虑到实用,就直接使用了Qt Desinger来画界面。但是使用Qt Desinger画出来的界面,最后得到的是*.ui文件(此ui文件其实就是使用xml来定义界面的文件,有点类似于Android中的xml文件一样),Python无法使用这种文件。但是stackoverflow是无敌的,很多人也遇到了这样的问题。最后通过Python中pyuic.py可以将ui文件变为Python可用的文件。命令如下:

1
python C:/Python34/Lib/site-packages/PyQt4/uic/pyuic.py python.ui -o window.py -x

这样得到的window.py就是界面文件,window.py中会存在一个Ui_MainWindow类。运行这个Python文件就会直接得到UI界面。
但是如果直接在window.py中编写逻辑代码,整个window.py文件就会十分地混乱。stackoverflow上面就建议新创建一个python类,叫myForm类,myForm就会添加逻辑代码,如按钮点击事件。最后只需要运行myForm.py即可。至此就完成了界面的创建工作。下图就显示了两者之间的关系。
 参数解析
UI_MainWindow负责界面的显示,myForm则负责逻辑。当需要修改界面时,仅仅修改UI_MainWindow中的代码即可。

参数解析

这也是整个软件中的核心部分,也是这2个软件最大的区别。在brutepwdbyhtml中,使用的是分析网页结构的方式,就是获取到页面代码之后,通过分析form表单中的结构来获取form表单中提交的参数。在整个识别的过程中,使用了Python中的requests和beautifulsoup两个库。使用beautifulsoup库很方便地就提取出其中的页面元素。整个参数识别的过程如下。
步骤一:通过发送请求获得页面的源代码。
步骤二:找出其中的form元素节点。这个节点是通过beautifulsoup来获得的。
步骤三:对form元素进行预处理,去掉其中的submit和reet的input元素和隐藏的input属性。
步骤四:通过inout中的type=password的属性找出其中的是密码的input标签获取name值,确定此name值为提交的密码参数。
步骤五:找出pwd元素上一个的input元素,确定此input属性为用户名的input,获取name值,确定此name值为提交的用户名参数。
步骤六:确定其中的验证码参数。虽然验证码参数识别的使用到的技术还行,这个由于识别功能比较鸡肋,所以就不进行详细地说明了。大家有兴趣,可以去看源代码。
以上就是所有的参数识别的步骤了。

模拟提交

之前说过本软件是无状态情况下的提交,每一次都会重新去请求页面获取参数。这样做的好处是在于,有的像v2ex,zhihu都会在页面中含有一个token_nonce,这个时候每次请求的时候,都能够获取到这个token,那么请求就是有效的。坏处是在于,整个过程就是无状态的提交,每一次都是新的cookie和session,无法进行类似于重放攻击的这种爆破。
其次,由于整个软件是使用Python编写而成的,加上python的GI机制,导致在整个爆破的过程中,程序运行得十分地缓慢。

结果识别

传统的爆破软件是无法对爆破的结果进行识别的。本软件在其他的软件的基础上增加了爆破结果的识别功能。整个识别是基于以下三种标准:1.时候含有识别字符,如“重试”,“错误”等;2.页面是否跳转;3.长度是否在错误列表中。在我进行测试的过程中,基于这3个标准,基本上能够找出争取的用户名和密码。

其他

最后发现整片文章变成了这个软件的说明文章,其中的技术还是有很多讲到。还有很多的技术,包括如何使用QtDesinger生成的界面文件,Beautifulsoup的实际使用,如何使用Python写一个代理,Qt中的信号槽的用法,Qthread的用法。这些大家都可以通过查看我的源代码来了解。

感谢开源,感谢写出了requestes的kennethreitz和Beautifulsoup的作者,才使得Python才变得如此的好用。