美文网首页大数据 爬虫Python AI SqlPython学习
黑客大佬亲自带你写代码,python协程&多进程快速爆破

黑客大佬亲自带你写代码,python协程&多进程快速爆破

作者: 1a076099f916 | 来源:发表于2018-11-15 15:20 被阅读6次
    黑客大佬亲自带你写代码,python协程&多进程快速爆破密码工具!

    听说不想扯淡的程序猿,不是一只好猿。所以今天来扯扯淡,不贴代码,只讲设计思想。

    0×00 起 – 初始设计(加小编Python学习群:813542856可以获取大量Python学习资料)

    我们的目标是设计一枚通用的弱密码扫描器,基本功能是针对不同类型的弱密码,可方便的扩展,比如添加SSH、SVN、phpmyadmin的弱密码扫描功能。我们设定启动方法是命令行,可以通过命令行指定扫描对象,以及扫描哪些弱密码。

    既然是要求可扩展,那我们首先来编写一个通用的框架,然后通过添加POC的方法来实现扩展。在这个框架中,我们需要处理的事情包括:

    <pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">初始化扫描对象(格式化URL、从文件或数据库中读取URL)
    载入弱密码扫描脚本(载入一种或者多种扫描脚本)
    </pre>

    同时为了易用性,框架还要提供一些额外的功能:

    <pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">提供一些公用的函数(如端口扫描、URL去格式化以及格式化等)
    显示当前可用的POC以及POC的相关信息
    </pre>

    我们预期的调用方法应该是这样:

    <pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">python base.py -p ssh_weak,mysql_weak -t test.txt --run
    </pre>

    这样,让我们画个简图:

    黑客大佬亲自带你写代码,python协程&多进程快速爆破密码工具!

    具体讲解一下:

    base.py是扫描器的入口文件

    poc处理流程:init_poc()将输入 ssh_weak,mysql_weak格式化,通过load_poc()加载到内存中。

    target处理流程: init_target()将输入 test.txt 内容读取到内存中,同时应该支持直接指定参数,以及从数据库中读取参数。

    POC管理: show_poc_info()调用load_poc(),载入所有POC,并print poc_info。

    poc_base.py是所有POC的父类,POC通过继承poc_base,来实现常用函数的继承,以及POC引擎。

    0×10 承 – 功能抽象

    通过上述描述,我们得到了一个简单的框架,通过这个框架提供的功能,我们来试着用python写一个标准的 POC :

    黑客大佬亲自带你写代码,python协程&多进程快速爆破密码工具!

    有几个地方可以优化:

    数据存储模块,每次扫描完存储一次,太浪费资源,有什么解决方法?

    数据存储模块,是否能集成到框架中?

    扫描数量较大的时候,应该有扫描成功的提醒,以及扫描进度的提醒,是否能集成到框架中?

    这其实是一个问题,数据定时存储(扫描过程中多次存储)和进度提醒功能,如何集成到框架中?本来的逻辑是,调用一次poc,扫描多个URL,然后直接由POC输出结果。如果想实现数据存储和进度提醒,看起来要把更多的控制权交到框架手中。所以,将POC的功能简化到判断某一个URL是否存在弱密码,返回true or false。将POC的调用权限,交到Poc_Base中,多次调用POC,Python伪代码如下:

    <pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">class Poc_Base(object):
    count = 0
    progress = 100 # 进度提醒的单位

    @ overide
    def verify():
    pass
    def run():
    for url in url_list:
    count += 1
    if count % progress == 0:
    save() # 数据存储
    print "progress %d " % (count) # 进度提醒
    if self.verify():
    print "success"
    </pre>

    经过优化之后,POC的基本模式,更简单了:

    <pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">from poc_base import PocBase
    class MyPOC(PocBase):
    poc_info = {
    'author': 'Friday',
    'title': 'svn_weak',
    }
    def svn_burst(self, url, user, password):
    pass
    def verify(self, url):
    for user in ['root', 'work']:
    for passwd in ['test', '123456']:
    if port_open(22) and svn_burst():
    return True
    </pre>

    在beebeeto提交过POC的同学,应该惊呼了“除了结果自动存储的模块,这不和beebeeto的框架一样么!”,是的,在一开始写框架的时候,参考了beebeeto-frame,后来独立编写完成/优化完成后,发现殊途同归了 : )

    0×20 转 – 性能提升

    在实现基本功能之后,我又开始蠢蠢欲动了。作为一个有尊(xing)严(neng)的框架,怎么能满足于一条线的模式!所以,为了效率,我们要在框架层面添加协程和多进程支持,让多核CPU每个都能跑到100%是我们的目标!

    但应该怎么添加进程和协程的支持呢?有之前添加数据存储和进度提醒的经验,实现不难想象。难点在于,在添加进程和协程支持的时候,不影响正常的数据存储和进度提醒。伪代码如下:

    <pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">class Poc_Base(object):
    gevent_num = 100 # 协程数
    process_num = 4 # 进程数
    count = [0] * process_num # 每个进程,单独计数
    progress = 100 # 进度提醒的单位
    @ overide def verify(): pass
    def verify_count():
    count[progress_number] += 1 if count[progress_number] % progress == 0:
    save() # 数据存储
    print "progress %d " % (count[progress_number]) # 进度提醒
    if self.verify(): print "success"

    协程调度函数,分配任务到协程

    def run_in_gevent(url_list): # url_list 每个进程分配到一定量的url
    pool = Pool(self.gevent_num) for target in url_list:
    pool.add(gevent.spawn(self.verify_count, url))
    pool.join() # 进程调度函数,分配任务到各个进程
    def run():
    url_each_process = len(url_list)/process_num for process_number in range(process_num):
    multiprocessing.Process(target=run_in_gevent, args=(url_list[:],)).start()
    multiprocessing.join()
    </pre>

    这样,我们就能在跑POC的时候,用到高端的协程和进程了。

    0×30 合

    实际运行过程中,协程开了150,进程开了2(8核CPU),可以把两个核的CPU都跑到90+%。

    运行截图:

    黑客大佬亲自带你写代码,python协程&多进程快速爆破密码工具! 黑客大佬亲自带你写代码,python协程&多进程快速爆破密码工具! 黑客大佬亲自带你写代码,python协程&多进程快速爆破密码工具!

    虽然一开始说,不会贴代码,但还是贴了不少伪代码。内容并不深奥,如果你看过beebeeto-frame和beehive的源码,觉得这是简化版的beehive,是高度定制版的beebeeto-frame,我也会觉得很开心: ) ,学习借鉴就是开源软件对于我的意义。

    因为涉及公司的一些制度,不方便公开源码,但感兴趣的同学,或者想自己实现一个简单的扫描器的同学,可以参考上文提到的两种开源软件

    相关文章

      网友评论

        本文标题:黑客大佬亲自带你写代码,python协程&多进程快速爆破

        本文链接:https://www.haomeiwen.com/subject/pvyyfqtx.html