用户
搜索
  • TA的每日心情

    2018-7-3 09:19
  • 签到天数: 104 天

    连续签到: 2 天

    [LV.6]常住居民II

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    31

    主题

    203

    帖子

    1212

    魔法币
    收听
    0
    粉丝
    11
    注册时间
    2016-7-25

    春秋文阁积极活跃奖i春秋签约作者i春秋推荐小组幽默灌水王春秋游侠

    发表于 2018-1-3 01:38:50 12825440
    本帖最后由 Aedoo 于 2018-3-21 10:04 编辑

    本文原创作者:Aedoo,本文属i春秋原创奖励计划,未经许可禁止转载。
    免责声明:
    • 请使用者注意使用环境并遵守中华人民共和国相关的法律法规!
    • 由于使用者使用本软件造成的任何后果本人不承担任何法律责任!
    • 此软件只供安全研究及安全测试使用,本软件的使用者对任何站点进行的任意操作均与本人无关,造成的任何后果均由软件使用者承担。


    (如果你觉得本篇文章让你获得了知识,请务必在下方点个赞,谢谢表哥们!)
    0x00 前言
    你学习Python的目的是什么呢?是在大佬口中听说“Python大法好”而学习的,还是想自写爬虫爬取数据(数据、图片、各种内容),还是想自写自动化小工具,还是单纯的欣赏这门语言呢?
    今天我来带领大家手把手写一个多线程批量扫描爆破弱服务端口的工具。
    1.png
    捋一下思路

    1.这个多线程扫描工具需要一个完善的多线程模板,一个完善的多线程模板需要用到哪些知识呢?
    threading多线程模块Queue队列模块超时处理机制,异常处理机制等。

    2.其次我们要扫描的是一个比较大的网段的IP的某一个开启弱服务的端口,我们并不能手动一个一个的输入IP地址,所以需要IP地址块和IP的转换

    3.我们想要爆破的服务可以是:1433端口(SQL Server数据库),3306端口(MySQL数据库),3389端口(RDP连接),6379端口(Redis数据库),27017端口(MongoDB数据库)等等等可以爆破或者匿名访问的端口和服务。
    所以首先要探测端口开放情况,如果开放,进行下一步的匿名访问检测或者爆破检测,此时需要用到的知识点:socket模块探测端口,对应端口服务的核心爆破规则编写,当然相应的也离不开超时处理以及异常处理。

    4.最后再加入帮助文档,以及我们自己特色的Logo,这样就可以完成我们自己的小工具啦!

    先放一张我们最终工具完成后的效果图(Redis匿名访问版本):
    2.png

    PS:虽然是我们的内网,不过还是打上码吧,不介意吧,哈哈~
    文章最后会附上源码供大家参考学习~

    0x01 完善的多线程模板
    这套多线程模板,我是在ichunqiu官网视频看到的的,曾经出现过线程无法终止等问题,不过后来问题都解决了,关键是在取出队列中的一个数据时加入timeout超时处理,就完美运行了,哈哈~
    下面这个多线程模板,没有任何功能,仅供测试使用,取出work列表中的数据并依次输出,后面我们再为他添加核心功能代码,下面稍微讲一下这套模版到底是如何运行的。
    先贴一下图片以及源码:
    [Python] 纯文本查看 复制代码
    # coding:utf-8
    # powered by Aedoo
    import threading,Queue,sys
    class RedisUN(threading.Thread):
        def __init__(self,queue):
            threading.Thread.__init__(self)
            self._queue = queue
        def run(self):
            while True:
                if self._queue.empty():
                    break
                try:
                    number = self._queue.get(timeout=0.5)
                    sys.stdout.write('execute: %s\n' % number)
                except:
                    continue
    def main():
        work = [1,2,3,4,5,6,7,8,9,10]
        thread_count = 5
        threads = []
        queue = Queue.Queue()
    
        for i in work:
            queue.put(i)
        for i in xrange(thread_count):
            threads.append(RedisUN(queue))
        for t in threads:
            t.start()
        for t in threads:
            t.join()
    
    if __name__ == '__main__':
        main()


    首先,
    第4行:是我们定义的一个多线程类,继承了threading模块的Thread类;
    第5行:初始化类,并加入_queue参数来接收后来传入的队列queue
    第8行:核心代码区域,依次取出队列queue的一个元素,当队列为空时,结束代码。
    第12行:此异常处理try才是真正的核心代码,将取出的元素进行批量处理;
    第19行:定义的线程数
    第20行:定义为空的线程列表
    第23~24行:将未处理的数据逐个放入队列queue。
    第25~26行:根据线程数量将queue传入多线程类。
    第27~30行:启动线程以及等待至线程终止。
    讲的这么详细,大家应该理解的不错了吧。
    3.png

    0x02 IP地址块转换

    由于工具中需要直接输入一整个大的网段,所以此时我们需要用到IP地址块转换,例:
    a.将192.168.1.1/24,转换为192.168.1.0~192.168.1.255这256个IP。
    b.将192.168.1.1/16,转换为102.168.0.0~192.168.255.255这65536个IP。

    这就是IP地址块的转换。
    这个概念和转换方式大家应该理解吧。
    不懂的话详情百度IP地址块。

    Python中内置一个ipaddr模块,可以直接在两者之间轻松转换,用法如下:

    [Python] 纯文本查看 复制代码
    import ipaddr
    IPDuan = '192.168.1.1/24'
    IPs = ipaddr.IPNetwork(IPDuan)
    for ip in IPs:
       print ip


    4.png

    运行结果:
    5.png
    从192.168.1.0输出到192.168.1.255。

    后续的就是将这些要扫描的IP放入queue队列中,配合上面的多线程模板进行下一步扫描工作。

    0x03 端口开放检测
    基本操作,使用socket模块,创建套接字使用TCP协议探测端口开放情况。
    使用方法如下(代码是在最终工具中截取的):

    [Python] 纯文本查看 复制代码
    ip = str(self._queue.get(timeout=0.5))
    addr = (ip,6379)
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    try:
        s.settimeout(0.2)
        s.connect(addr)
        sys.stdout.write('%s open 6379\n' % ip)
    except:
        s.close()
        continue
    

    IP就是在队列queue中取出的IP,这就是使用socket套接字探测端口开放情况的简单代码。
    sys.stdout.write是标准化输出,解决多线程并发输出不对齐问题。
    这个代码探测了6379端口开放情况。
    6.png

    0x04 核心代码
    好了,前期准备工作完成了,我们有了一套完善的多线程模板,并且将需要扫描的IP群也放入了队列模块,并且开启了多线程,也完成了端口开放扫描,终于走到了最后的核心代码区域。
    笔者这里写的是Redis数据库未授权访问的批量扫描工具,所以核心代码就是检测Redis是否可以匿名访问。
    Redis数据库有一个特性,如果他对所有人开放,使用客户端向 Redis 服务器发送一个 PING ,如果服务器运作正常的话,会返回一个 PONG。

    所以,最后的核心代码:
    [Python] 纯文本查看 复制代码
    try:
        s.send("ping\n")
        r = s.recv(1024)
        if "+PONG" in r:
            sys.stdout.write('%s:6379 is vul!\n' % ip)
    except:
        s.close()
        continue


    向6379端口发送一个ping,通过返回的PONG检测是否可以未授权访问,当然也可以使用Python连接Redis数据库并且尝试向内写入一对key和value,如果写入成功,也能检测出是否存在未授权访问漏洞,不过第一种方法比较简单。
    7.png

    0x05 Logo制作以及帮助文档撰写
    Logo的制作使用Linux下的工具figlet,帮助文档使用Python内置模块argparse,我在前面详细介绍过这两款工具,现在用上了吧~哈哈~
    两款工具详解传送门:https://bbs.ichunqiu.com/thread-31231-1-1.html
    Logo代码以及帮助文档代码:
    [Python] 纯文本查看 复制代码
    logo_code = 'CiAgIF9fXyAgICAgICAgIF9fXyAgICAgX18gIF9fXyAgX18KICAvIF8gXF9fXyBfX18vIChfKV9fIC8gLyAvIC8gfC8gLwogLyAsIF8vIC1fKSBfICAvIChfLTwvIC9fLyAvICAgIC8gCi9fL3xffFxfXy9cXyxfL18vX19fL1xfX19fL18vfF8vIAoKQXV0aG9yOmh0dHA6Ly93d3cuaW1zdW5zaGluZS5jbgogICAg'
    logo = base64.b64decode(logo_code)
    print logo
    print ''
    
    parser = ArgumentParser()
    parser.add_argument("-i", dest="cidr_ip", default = "192.168.1.1/16", help="The CIDR IP Like 192.168.1.1/24")
    parser.add_argument("-t", dest="thread_count", type=int, default=100, help="The Thread Number")
    args = parser.parse_args()
    parser.print_help()


    logo_code是事先使用base64加密过的,目的是让Logo的嵌入不显得那么突兀,只需要base64解密一次,再将它输出至屏幕就可以了。
    8.png

    [AppleScript] 纯文本查看 复制代码
       ___         ___     __  ___  __
      / _ \___ ___/ (_)__ / / / / |/ /
     / , _/ -_) _  / (_-</ /_/ /    / 
    /_/|_|\__/\_,_/_/___/\____/_/|_/ 
    
    Author:[url]http://www.imsunshine.cn[/url]


    完成,炫酷!

    0x06 抛砖引玉
    既然本次笔者是批量检测的Redis数据库匿名访问,那是否可以是MongoDBldap匿名访问呢?甚至是MySQL数据库弱口令的爆破的,答案当然是可以的。
    如:
    MongoDB数据库未授权访问核心代码(连接数据库并尝试插入数据):
    9.png

    MySQL数据库弱口令爆破核心代码(两个open是读取用户以及密码字典,然后尝试远程连MySQL):
    10.png

    笔者再给大家列一些弱端口以及对应的服务吧,不过核心的爆破代码,需要自己慢慢研究咯~~
    (PS:并不全面,仅供参考)
    21       FTP
    22       SSH
    23       Telnet
    25       SMTP
    110     POP3
    389     LDAP
    873     Rsync
    1433   SQL Server
    1521   Oracle
    3128   Squid
    3306   MySQL
    3389   RDP
    5432   PostgreSQL
    6379   Redis
    27017 MongoDB

    0x06 源码分享
    呼~ 码了好久的字。
    由于代码在文中几乎全部贴出,所以懒懒的童鞋需要支付一点魔法小币币才可以下载源码哦~
    源码包括多线程模板以及笔者自己写的Redis数据库批量匿名访问检测工具。
    (PS:签到可领取魔法小币币哦~)
    游客,如果您要查看本帖隐藏内容请回复


    如有疑惑之处,请尽情指出~~~

    评分

    参与人数 1积分 +50 收起 理由
    浪子彦 + 50 多线程现在太慢了,建议楼主可以使用线程池.

    查看全部评分

    本帖被以下淘专辑推荐:

    http://www.imsunshine.cn/
    发表于 2018-1-4 11:03:36
    本帖最后由 Aedoo 于 2018-1-4 11:11 编辑

    核心代区域的运行步骤是:
    1.首先用一个try检测你设置的端口是否开放并设置socket超时时间,比如想要爆破MySQL数据库密码,要先检测3306端口是否开放。
    2.之后程序确认端口开放之后才会进行下一步的爆破或者未授权访问测试。
    所以,端口检测超时时间设置为0.1秒的话,使用100线程爆破60000+ 的IP,大约1分多种就可以完成检测。

    http://www.imsunshine.cn/
    使用道具 举报 回复
    发表于 2018-1-4 10:59:34
    本帖最后由 Aedoo 于 2018-1-4 11:09 编辑
    浪子彦 发表于 2018-1-3 21:18
    以及在运行过程中可能或者会出现的性能陷阱,网络堵塞,延迟,超时,异常处理,爆破端口钱进行端口扫描后生 ...

    好的,研究研究线程池,我是先用一个try检测目标端口是否开放,后来再用一个try是真正的爆破代码,如果socket的timeout设置的小,还是挺快的~谢谢大佬~
    http://www.imsunshine.cn/
    使用道具 举报 回复

    给,回复拿好……嗳……你这人……别跪啊……一个回复而已……男人膝下有黄金啊……你要干什么啊?嗳!别拉我裤链啊……你这人……你怎么这样?别……啊……啊……嗯……啊嗯……喔……啊……不行……你……听我说……啊……一个……回复……喔……不算什么……啊啊啊……快停下……啊……别……啊啊……要丢了……喔……别!快吐出来……卧槽……何必呢?
    使用道具 举报 回复
    以及在运行过程中可能或者会出现的性能陷阱,网络堵塞,延迟,超时,异常处理,爆破端口钱进行端口扫描后生成列表,从而减少一些代码中存在的污染函数。设置全局socket超时,构建线程池并发里进程。queue虽然方便,但是合理的使用线程锁效果更好哦,楼主加油
    使用道具 举报 回复
    浪子彦 发表于 2018-1-3 21:18
    以及在运行过程中可能或者会出现的性能陷阱,网络堵塞,延迟,超时,异常处理,爆破端口钱进行端口扫描后生 ...

    爆破mysql 3306端口前没确认端口是否开放的话,延迟等待可以让你崩溃,谁试谁知道~
    使用道具 举报 回复
    发表于 2018-1-3 22:03:29
    浪子彦 发表于 2018-1-3 21:30
    爆破mysql 3306端口前没确认端口是否开放的话,延迟等待可以让你崩溃,谁试谁知道~ ...

    你看我没检测端口开放吗?老铁~
    http://www.imsunshine.cn/
    使用道具 举报 回复
    发表于 2018-1-3 13:24:57

    并不是大佬,只是能排版一下文章罢了
    http://www.imsunshine.cn/
    使用道具 举报 回复
    发表于 2018-1-3 13:29:13
    Miss_纯 发表于 2018-1-3 11:24
    大哥,小弟受教了,厉害

    其实并不难  哈哈~
    http://www.imsunshine.cn/
    使用道具 举报 回复
    发表于 2018-1-3 02:06:38
    嘿嘿,这个可以有!!...
    使用道具 举报 回复
    像大神学习
    使用道具 举报 回复
    学习一下
    使用道具 举报 回复
    11111111111
    使用道具 举报 回复
    发表于 2018-1-3 09:53:40
    膜拜大佬 很详细
    使用道具 举报 回复
    发表于 2018-1-3 09:56:47
    1234565432
    使用道具 举报 回复
    发表于 2018-1-3 10:06:30
    感谢分享!
    使用道具 举报 回复
    66666666666666666
    使用道具 举报 回复
    66666666666666666
    使用道具 举报 回复
    发表于 2018-1-3 10:36:06
    学习一下
    使用道具 举报 回复
    前来学习
    使用道具 举报 回复
    膜拜一下大佬。
    使用道具 举报 回复
    发表于 2018-1-3 11:24:08
    大哥,小弟受教了,厉害
    使用道具 举报 回复
    学习了!感谢分享
    使用道具 举报 回复
    您需要登录后才可以回帖 登录 | 立即注册