利用 Python 的协程进行快速端口扫描

0x00 协程的优势 协程拥有极高的执行效率,因为子程序切换不是线程切换,而是由程序自身控制,因此没有线程切换的开销。和多线程比,线程数量越多,协程的性能优势就越明显。 不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多 0x01 Python中的协程 协程也就是微线程,python 的 generator(生成器) 中的 yield 可以一定程度上实现协程 在 generator 中,我们不但可以通过 for 循环来迭代,还可以不断调用 next() 函数获取由 yield 语句返回的下一个值。 但是 Python 的 yield 不但可以返回一个值,它还可以接收调用者发出的参数。 0x02 使用 gevent python 中可以通过 generator 实现协程,但是不完全,第三方的 gevent 为 Python 提供了比较完善的协程支持,gevent 可以通过 monkey patch 动态的修改 Python 自带的一些标准库 由于 IO 操作(比如访问网络)非常耗时,经常使程序处于等待状态,而 gevent 可以为我们自动切换协程,再在适当的时候切换回来继续执行,这就保证总有 greenlet 在运行,而不是等待 IO 使用 gevent 可以获得极高的并发性能,但 gevent 只能在 Unix/Linux 下运行,在 Windows 下不保证正常安装和运行 下面 3 个网络操作是并发执行的,且结束顺序不同,但只有一个线程 from gevent import monkey; monkey.patch_all() import requests import gevent def get_resp_size(url): print('GET: %s' % url) html = requests.


Python中执行系统命令

0x00 使用模块 在python执行系统命令一般可以通过3个模块来实现,这三个模块是:os、commands、subprocess 0x01 os模块执行系统命令 一般用os模块的system函数来执行一些简单的命令 >>> import os >>> os.system("pwd") /Users/reber 0 0x02 commands模块执行系统命令 commands这个模块在python3中被移除了 >>> import commands >>> commands.getoutput("pwd") '/Users/reber' >>> commands.getstatusoutput("pwd") (0, '/Users/reber') #返回状态码以及结果 0x03 subprocess模块执行系统命令 task.py代码 def aaa(): s = 0 for x in range(3): time.sleep(1) s += x return s print(aaa()) call函数执行命令(会阻塞到任务完成) 函数原型:subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) >>> from subprocess import call >>> call(["ls","-l"]) #传入一个list total 16 -rw-r--r-- 1 reber staff 80 8 16 16:19 README.


MRQ的使用

0x00 MRQ MRQ是Python基于Redis、Mongo和gevent的分布式任务队列。 MRQ一方面旨在像RQ一样简单,另一方面有接近Celery的性能。 MRQ最初的功能设计是为了满足任务队列的各种任务需求(IO密集&CPU密集,很多小任务&几个大任务)。 0x01 设置mongo和redis 因为mrq依赖于redis和mongo,所以先安装设置下 安装redis $ sudo apt-get install redis-server $ netstat -nlt|grep 6379 $ sudo /etc/init.d/redis-server status $ sudo /etc/init.d/redis-server stop $ sudo vim /etc/redis/redis.conf #bind 127.0.0.1 requirepass reber_redis $ sudo redis-server /etc/redis/redis.conf & $ redis-cli > auth reber_redis 安装mongo 可以参考:https://docs.mongodb.com/master/tutorial/install-mongodb-on-ubuntu/ $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6 $ echo "deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.


下载大文件时显示进度条

0x00 作用 在下载大文件时以进度条的形式显示下载进度,如下图所示: 0x01 代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # code by reber <1070018473@qq.com> import requests from tqdm import tqdm def get_vedio(url,name): resp = requests.get(url=url,stream=True) content_size = int(resp.headers['Content-Length'])/1024/1024 with open(name, "wb") as f: print "download file {}, total size: {}M".format(name,content_size) for data in tqdm(iterable=resp.iter_content(1024*1024),total=content_size,unit='M'): f.write(data) def get_content(filename): data = [] with open(filename) as f: lines = f.readlines() for line in lines: data.append(line.strip()) return data if __name__ == '__main__': urls = get_content('urls.


检测WebLogic是否存在SSRF

0x00 weblogic返回状态 weblogic的ssrf漏洞测试3种状态,返回如下: 同网段不存在的主机 同网段主机存活但端口不开放 同网段主机存活且端口开放 0x01 检测脚本如下 #!/usr/bin/env python # -*- coding: utf-8 -*- import re import sys import Queue import requests import threading from requests.packages.urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning) queue = Queue.Queue() mutex = threading.Lock() class Weblogic_SSRF_Check(threading.Thread): """docstring for Weblogic_SSRF_Check""" def __init__(self, queue): threading.Thread.__init__(self) self.queue = queue def check(self,domain,ip): payload = "uddiexplorer/SearchPublicRegistries.jsp?operator={ip}&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search".format(ip=ip) url = domain + payload try: html = requests.get(url=url, timeout=15, verify=False).content m = re.


Python的pycurl模块

0x00 关于cURL cURL可以使用URL的语法模拟浏览器来传输数据,它支持FTP、FTPS、HTTP、HTTPS、GOPHER、TELNET、DICT、FILE以及LDAP等多种协议。 利用cURL可以实现:HTTPS认证、HTTP POST方法、HTTP PUT方法、FTP上传、keyberos认证、代理服务器、cookies、用户名/密码认证、下载文件断点续传、上传文件断点续传、http代理服务器管道等等。 0x01 pycurl常见方法 创建curl对象 c = pycurl.Curl() #创建一个curl对象 设置请求 c.setopt(pycurl.URL,"http://www.baidu.com") #指定请求的URL c.setopt(pycurl.CONNECTTIMEOUT, 5) #连接的等待时间,设置为0则不等待 c.setopt(pycurl.TIMEOUT, 5) #请求超时时间 c.setopt(pycurl.USERAGENT,"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:46.0) Gecko/20100101 Firefox/46.0") #配置User-Agent c.setopt(pycurl.NOPROGRESS, 0) #是否屏蔽下载进度条,非0则屏蔽 c.setopt(pycurl.MAXREDIRS, 5) #指定HTTP重定向的最大数 c.setopt(pycurl.FORBID_REUSE, 1) #完成交互后强制断开连接,不重用 c.setopt(pycurl.FRESH_CONNECT,1) #强制获取新的连接,即替代缓存中的连接 c.setopt(pycurl.DNS_CACHE_TIMEOUT,60) #设置保存DNS信息的时间,默认为120秒 c.setopt(pycurl.HEADERFUNCTION, getheader) #将返回的HTTP HEADER定向到回调函数getheader c.setopt(pycurl.WRITEFUNCTION, getbody) #将返回的内容定向到回调函数getbody c.setopt(pycurl.WRITEHEADER, fileobj) #将返回的HTTP HEADER定向到fileobj文件对象 c.setopt(pycurl.WRITEDATA, fileobj) #将返回的HTML内容定向到fileobj文件对象 部分返回信息 c.getinfo(pycurl.HTTP_CODE) #返回的HTTP状态码 c.


初识Tornado

0x00 简介 Tornado是一个用Python写的相对简单的、不设障碍的Web服务器架构,用以处理上万的同时的 连接口,让实时的Web服务通畅起来。虽然跟现在的一些用Python写的Web架构相似,比如Django, 但Tornado更注重速度,能够处理海量的同时发生的流量。 0x01 示例 main.py代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import tornado.ioloop import tornado.web class IndexHandler(tornado.web.RequestHandler): def get(self): #访问根时触发这个函数 name = self.get_argument('name','wyb') self.write('Hello,' + name) self.write('<br /><a href="/login">login</a>') class MyLoginHandler(tornado.web.RequestHandler): def get(self): self.render('login.html') #若用户请求/login页面则将login.html发送给客户端,客户会看的一个登陆表单 def post(self): #当用户点击提交按钮是触发这个函数 name = self.get_argument('name') #接收表单的name password = self.get_argument('password') #接收表单的password self.write("you name is:%s\nyou password is:%s" % (name,password)) def get_app(): handlers = [ (r"/",IndexHandler), #代表请求/的都让IndexHandler处理 (r"/login",MyLoginHandler), #表示请求/login页面的让MyLoginHandler处理 ] app = tornado.


Python实现CDN的判断

0x00 什么是CDN CDN的全称是Content Delivery Network,即内容分发网络。主要功能是在不同地点缓存内容, 运营商会在全国各地的节点上缓存你的网站网页,通过负载均衡技术,将用户的请求定向到最合适的 缓存服务器上去获取内容,比如说你是上海用户,你访问www.aa.com就会被重定向到上海的节点, 你是北京用户,你也访问www.aa.com,但是你会被重定向到上海的节点。 0x01 判断方法 可以查询CNAME记录,每个cdn厂商都有特有的特征串 查看http返回头的头部信息 0x02 代码 首先安装dnspython这个第三方模块:pip install dnspython #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import dns.resolver import urllib2 import urlparse class CdnCheck(object): def __init__(self, url): super(CdnCheck, self).__init__() self.cdninfo() self.url = url self.cnames = [] self.headers = [] def get_cnames(self): # get all cname furl = urlparse.urlparse(self.url) url = furl.netloc # print url rsv = dns.


使用Python的openpyxl模块读写xlsx文件

0x00 openpyxl模块 这个模块可以让你读写excel文件 0x01 读取数据 代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- from openpyxl import load_workbook #设置data_only=True,否则如果文件中有计算公式的话读出来的是公式不是数值 wb = load_workbook(filename='aa.xlsx',data_only=True) sheetnames = wb.get_sheet_names() #获得所有表名 print u"存在表:%s" % sheetnames ws = wb.get_sheet_by_name(sheetnames[0]) print u"第一张表表名为:%s" % ws.title #Sheet1 rows = ws.max_row #行数 columns = ws.max_column #列数 print "表%s有%d行%d列" % (ws.title,rows,columns) #10 2 共10行2列 print print u"取部分数据:" print ws['A1'].value,ws['B1'].value print ws['A2'].value,ws['B2'].value print ws.cell(row=1, column=2).value print u"\n输出表%s的所有数据:" % ws.title for x in range(1,rows+1): for y in range(1,columns+1): print ws.


Python爆破zip压缩包

0x00 代码 多线程爆破加密的zip压缩包 #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import optparse import zipfile import threading import Queue queue = Queue.Queue() lock = threading.Lock() result = '' def load_pwd(filename): for line in open(filename,'r'): if line: queue.put(line.strip()) def bruter(zipname,queue): global result zFile = zipfile.ZipFile(zipname) while not queue.empty(): password = queue.get() try: zFile.extractall(pwd=password) # 解压 lock.acquire() print "[Ok] password is: %s" % password lock.release() result = password except: lock.acquire() print "[Error] password not is: %s" % password lock.



可以返回顶部