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数据库匿名访问,那是否可以是MongoDB、ldap匿名访问呢?甚至是MySQL数据库弱口令的爆破的,答案当然是可以的。
如:
MongoDB数据库未授权访问核心代码(连接数据库并尝试插入数据):
MySQL数据库弱口令爆破核心代码(两个open是读取用户以及密码字典,然后尝试远程连MySQL):
笔者再给大家列一些弱端口以及对应的服务吧,不过核心的爆破代码,需要自己慢慢研究咯~~
(PS:并不全面,仅供参考)
21 FTP22 SSH23 Telnet25 SMTP110 POP3389 LDAP873 Rsync1433 SQL Server1521 Oracle3128 Squid3306 MySQL3389 RDP5432 PostgreSQL6379 Redis
27017 MongoDB
网友评论