Python新世界

Python手把手教你打造自己的多线程批量工具!有了多线程事半功

2018-10-24  本文已影响27人  919b0c54458f

0x00 前言

你学习Python的目的是什么呢?是在大佬口中听说“Python大法好”而学习的,还是想自写爬虫爬取数据(数据、图片、各种内容),还是想自写自动化小工具,还是单纯的欣赏这门语言呢?

今天我来带领大家手把手写一个多线程批量扫描爆破弱服务端口的工具。

进群:548377875   即可获取数十套PDF哦!

捋一下思路

1.这个多线程扫描工具需要一个完善的多线程模板,一个完善的多线程模板需要用到哪些知识呢?

threading多线程模块Queue队列模块超时处理机制,异常处理机制等。

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

3.我们想要爆破的服务可以是:1433端口(SQL Server数据库),3306端口(MySQL数据库),3389端口(RDP连接),6379端口(Redis数据库),27017端口(MongoDB数据库)等等等可以爆破或者匿名访问的端口和服务。

所以首先要探测端口开放情况,如果开放,进行下一步的匿名访问检测或者爆破检测,此时需要用到的知识点:socket模块探测端口,对应端口服务的核心爆破规则编写,当然相应的也离不开超时处理以及异常处理。

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

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

PS:虽然是我们的内网,不过还是打上码吧,不介意吧,哈哈~

文章最后会附上源码供大家参考学习~

0x01 完善的多线程模板

这套多线程模板,我是在ichunqiu官网视频看到的的,曾经出现过线程无法终止等问题,不过后来问题都解决了,关键是在取出队列中的一个数据时加入timeout超时处理,就完美运行了,哈哈~

下面这个多线程模板,没有任何功能,仅供测试使用,取出work列表中的数据并依次输出,后面我们再为他添加核心功能代码,下面稍微讲一下这套模版到底是如何运行的。

先贴一下图片以及源码:

# 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

' % 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行:启动线程以及等待至线程终止。

讲的这么详细,大家应该理解的不错了吧。

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模块,可以直接在两者之间轻松转换,用法如下:

import ipaddr

IPDuan = '192.168.1.1/24'

IPs = ipaddr.IPNetwork(IPDuan)

for ip in IPs:

print ip

运行结果:

从192.168.1.0输出到192.168.1.255。

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

0x03 端口开放检测

基本操作,使用socket模块,创建套接字使用TCP协议探测端口开放情况。

使用方法如下(代码是在最终工具中截取的):

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

' % ip)

except:

s.close()

continue

IP就是在队列queue中取出的IP,这就是使用socket套接字探测端口开放情况的简单代码。

sys.stdout.write是标准化输出,解决多线程并发输出不对齐问题。

这个代码探测了6379端口开放情况。

0x04 核心代码

好了,前期准备工作完成了,我们有了一套完善的多线程模板,并且将需要扫描的IP群也放入了队列模块,并且开启了多线程,也完成了端口开放扫描,终于走到了最后的核心代码区域。

笔者这里写的是Redis数据库未授权访问的批量扫描工具,所以核心代码就是检测Redis是否可以匿名访问。

Redis数据库有一个特性,如果他对所有人开放,使用客户端向 Redis 服务器发送一个 PING ,如果服务器运作正常的话,会返回一个 PONG。

所以,最后的核心代码:

try:

s.send("ping

")

r = s.recv(1024)

if "+PONG" in r:

sys.stdout.write('%s:6379 is vul!

' % ip)

except:

s.close()

continue

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

0x05 Logo制作以及帮助文档撰写

Logo的制作使用Linux下的工具figlet,帮助文档使用Python内置模块argparse,我在前面详细介绍过这两款工具,现在用上了吧~哈哈~

两款工具详解传送门:https://bbs.ichunqiu.com/thread-31231-1-1.html

Logo代码以及帮助文档代码:

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解密一次,再将它输出至屏幕就可以了。

___ ___ __ ___ __

/ _ ___ ___/ (_)__ / / / / |/ /

/ , _/ -_) _ / (_-

/_/|_|__/_,_/_/___/____/_/|_/

Author:[url]http://www.imsunshine.cn[/url]

完成,炫酷!

0x06 抛砖引玉

既然本次笔者是批量检测的Redis数据库匿名访问,那是否可以是MongoDBldap匿名访问呢?甚至是MySQL数据库弱口令的爆破的,答案当然是可以的。

如:

MongoDB数据库未授权访问核心代码(连接数据库并尝试插入数据):

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

笔者再给大家列一些弱端口以及对应的服务吧,不过核心的爆破代码,需要自己慢慢研究咯~~

(PS:并不全面,仅供参考)

21 FTP22 SSH23 Telnet25 SMTP110 POP3389 LDAP873 Rsync1433 SQL Server1521 Oracle3128 Squid3306 MySQL3389 RDP5432 PostgreSQL6379 Redis

27017 MongoDB

上一篇下一篇

猜你喜欢

热点阅读