[TOC]
0x00 前言 在安全工作者或者渗透测试中,我们常常需要自己造轮子来写自动化利用的脚本,所以Python脚本能更快的帮助我们编写响应扫描器以及可利用脚本;
扩展包:
0x01 IP地址处理模块 描述:在对很多业务进行扫描的时候,我们可能需要输入一个IP段对其扫描,在写Python脚本中免不了进行IP地址的计算包括网段/网络掩码/广播地址/子网数/IP类型等等;
因此Python给我们提供了一个强大的第三方模块IPy,安装模块执行pip install IPy
即可;
(1) IP地址/网段基本处理 :
[TOC]
0x00 前言 在安全工作者或者渗透测试中,我们常常需要自己造轮子来写自动化利用的脚本,所以Python脚本能更快的帮助我们编写响应扫描器以及可利用脚本;
扩展包:
0x01 IP地址处理模块 描述:在对很多业务进行扫描的时候,我们可能需要输入一个IP段对其扫描,在写Python脚本中免不了进行IP地址的计算包括网段/网络掩码/广播地址/子网数/IP类型等等;
因此Python给我们提供了一个强大的第三方模块IPy,安装模块执行pip install IPy
即可;
(1) IP地址/网段基本处理 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 from IPy import IPipv4=IP('192.168.1.0/24' ).version() ipv6=IP('::1' ).version() print(ipv4," " ,ipv6) iptype = ip.iptype() IP('132.54.56.25' ).iptype() print(IP('::1' ).iptype()) print(IP('2001:0658:022a:cafe:0200::1' ).iptype()) ip=IP('192.168.10.0/24' ) len(ip) print(ip.len()) for x in ip: print(x) print(str(ip[2 ])) ip=IP('192.168.1.8' ) revname = ip.reverseNames() IP("192.168.1.1" ).int() IP("192.168.1.1" ).strHex() IP("192.168.1.1" ).strBin() print(IP(0xc0a80101 )) print(IP(3232235777 )) IP('192.168.1.0' ).make_net('255.255.255.0' ) IP('192.168.1.0/255.255.0.0' ,make_net=True ) IP('10.10.0.0/255.0.0.0' ,make_net=True ) IP('10.10.0.0-10.10.255.255' ,make_net=True ) IP('10.0.0.0/8' ).net() IP('10.0.0.0/8' ).broadcast() 0 : 无返回,如192.168 .1 .0 1 :prefix格式 a.b.c.0 /24 | 2001 :658 :22 a:cafe::/64 2 :decimal netmask格式 a.b.c.d/255.255 .255 .0 3 :lastIP格式 a.b.c.0 -a.b.c.255 2001 :658 :22 a:cafe::-2001 :658 :22 a:cafe:ffff:ffff:ffff:ffffIP('192.168.1.0/30' ).strNormal(0 ) IP('192.168.1.4/30' ).strNormal(0 ) IP('192.168.1.0/30' ).strNormal(1 ) IP('192.168.1.0/30' ).strNormal() IP('192.168.1.0/30' ).strNormal(2 ) IP('192.168.1.0/30' ).strNormal(3 )
(2) 多网络计算对比 : 比较两个网段是否存在包含重叠等关系,IPy支持蕾仕于数值型数据的比较,可以帮助IP对象进行比较
1 2 3 4 5 6 7 8 9 10 11 12 13 14 IP("192.168.0.0/16" ) < IP("192.168.1.0/24" ) IP("192.168.0.0/16" ) > IP("192.168.1.0/24" ) IP("192.168.0.0/16" ) in IP("192.168.1.0/24" ) IP("192.168.1.0/32" ) in IP("192.168.1.0/24" ) IP("192.168.1.0/32" ).overlaps("192.168.1.0/24" ) IP("192.168.2.5" ).overlaps("192.168.1.0/24" )
实际案例:
+ IPy模块使用案例查看 1 2 3 4 5 6 Useage: > ipinfo.py -t/-m 192.168.1.1 -t 指定IP类型地址进行相互转换二进制IP/整数IP/十六进制 -m 指定IP类地址或者IP段查看信息 IP格式1:192.168.1.1 IP格式2:192.168.1.0/24 IP格式3:192.168.1.1-192.168.1.254
0x02 DNS处理模块 描述:Python中的dbspython是实现一个DNS工具包,支持所有的记录类型,用于查询/传输并动态更新ZONE信息,同时支持所有的记录类型; 模块安装:pip install dnspython
1.方法详解 dns提供一个DNS解析类-resolver,使用它的query方法来实现查询功能,query方法定义如下:1 2 3 4 5 import dns.resolverdef query (qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN, tcp=False, source=None, raise_on_no_answer=True, source_port=0 , lifetime=None) :
rdclass参数用于指定网络类型,可选值有IN,CH与HS,其中IN为默认; tcp参数表示是否启用TCP协议; 其中rdtype参数用来指定RR资源类型:
A 记录 : 将主机名转换成为IP地址
MX 记录 :邮件交换记录,定义邮件服务器的域名
CNAME 记录 : 指定别名记录,实现域名间的映射
NS 记录 : 标记区域的域名服务器及授权子域名
PTR 记录 :反向解析与A记录相反,将IP地址转换为主机名
SOA 记录 :SOA标记一个起始授权区的定义
示例演示:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 for i in dns.resolver.query('www.qq.com.cn' ,'A' ).response.answer: for j in i.items: print ("A记录:%s" % j.address) for i in dns.resolver.query('qq.com' ,'A' ).response.answer: for j in i.items: print ("A记录:%s" % j.address) for i in dns.resolver.query('qq.com' ,'MX' ): print ("MX preference = %s , mail exchanger = %s" %(i.preference,i.exchange)) for i in dns.resolver.query('qq.com' ,'NS' ).response.answer: for j in i.items: print ("NS记录:%s" %j) NS记录:ns2.qq.com. NS记录:ns1.qq.com. NS记录:ns4.qq.com. NS记录:ns3.qq.com. for i in dns.resolver.query('weiyigeek.github.io' ,'CNAME' ).response.answer: for j in i.items: print ("CNAME记录:%s" %j) for i in dns.resolver.query('baidu.com' ,'SOA' ): print (i)
实际案例:+ Github查看
weiyigeek.top-dnsinfo信息查看
0x01 web探测模块 pycurl 模块 描述:pycurl是一个用C语言写的libcurl Python实现,功能强大支持多种通信协议,类似于linux下Curl命令功能的Python封装简单易用; 模块安装:1 2 3 4 5 6 7 8 9 10 pip install pycurl Processing c:\users\weiyigeek\downloads\pycurl-7.43 .0 .3 -cp37-cp37m-win32.whl Installing collected packages: pycurl Successfully installed pycurl-7.43 .0 .3 python -c "import pycurl;print(pycurl.version)" 'PycURL/7.43.0.3 libcurl/7.64.1 OpenSSL/1.1.1c zlib/1.2.11 c-ares/1.15.0 libssh2/1.8.2'
主要功能:
web服务质量探测:HTTP状态码/请求延时/HTTP头信息/下载速度等等
探测服务的可用性以及服务响应速度
模块常用方法:1 2 3 4 5 pcurl = pycurl.Curl pcurl.setopt(option,value) pcurl.perform() pcurl.getinfo(option) pcurl.close()
利用libcurl包提供的常量值来达到探测Web服务质量的目的:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 pc.setopt(pycurl.URL, URL) pc.setopt(pycurl.USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0" ) pc.setopt(pycurl.CONNECTTIMEOUT, 5) pc.setopt(pycurl.TIMEOUT, 5) pc.setopt(pycurl.MAXREDIRS, 1) pc.setopt(pycurl.NOPROGRESS, 1) pc.setopt(pycurl.MAXREDIRS, 1) pc.setopt(pycurl.DNS_CACHE_TIMEOUT, 30) pc.setopt(pycurl.FORBID_REUSE, 1) pc.setopt(pycurl.FERSH_CONNECT, 1) pc.setopt(pycurl.HEADERFUNCTION, getheader) pc.setopt(pycurl.WRITEFUNCTION, getbody) pc.setopt(pycurl.WRITEHEADER, index) pc.setopt(pycurl.WRITEDATA, index) print ("HTTP状态码: %s" %(pc.getinfo(pc.HTTP_CODE)))print ("DNS解析时间: %.2f ms" %(pc.getinfo(pc.NAMELOOKUP_TIME)*1000))print ("建立连接时间: %.2f ms" %(pc.getinfo(pc.CONNECT_TIME)*1000))print ("准备传输时间: %.2f ms" %(pc.getinfo(pc.PRETRANSFER_TIME)*1000))print ("传输开始时间: %.2f ms" %(pc.getinfo(pc.STARTTRANSFER_TIME)*1000))print ("传输结束总时间: %.2f ms" %(pc.getinfo(pc.TOTAL_TIME)*1000))print ("重定向消耗的时间: %.2f ms" %(pc.getinfo(pc.REDIRECT_TIME)*1000))print ("下载数据包大小: %d bytes/s" %(pc.getinfo(pc.SIZE_DOWNLOAD)))print ("上传数据包大小: %d bytes/s" %(pc.getinfo(pc.SIZE_UPLOAD)))print ("平均下载速度: %d bytes/s" %(pc.getinfo(pc.SPEED_DOWNLOAD)))print ("平均上传速度: %d bytes/s" %(pc.getinfo(pc.SPEED_UPLAOD)))print ("HTTP头部大小: %d byte" %(pc.getinfo(pc.HEADER_SIZE)))
实际案例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 import sys, timeimport pycurlURL="http://www.weiyigeek.github.io" def request () : """ 构建请求 :return: """ pc = pycurl.Curl() pc.setopt(pycurl.URL, URL) pc.setopt(pycurl.CONNECTTIMEOUT, 5 ) pc.setopt(pycurl.TIMEOUT, 5 ) pc.setopt(pycurl.NOPROGRESS, 1 ) pc.setopt(pycurl.FORBID_REUSE, 1 ) pc.setopt(pycurl.MAXREDIRS, 1 ) pc.setopt(pycurl.DNS_CACHE_TIMEOUT, 30 ) pc.setopt(pycurl.USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0" ) with open('content.txt' , 'wb' ) as index: pc.setopt(pycurl.WRITEHEADER, index) pc.setopt(pycurl.WRITEDATA, index) try : pc.perform() except Exception as e: print("connect Error:" + str(e)) sys.exit() return pc def reponse (pc) : """ 返回请求响应数据解析 :param pc: :return: """ print("HTTP状态码: %s" %(pc.getinfo(pc.HTTP_CODE))) print("DNS解析时间: %.2f ms" %(pc.getinfo(pc.NAMELOOKUP_TIME)*1000 )) print("建立连接时间: %.2f ms" %(pc.getinfo(pc.CONNECT_TIME)*1000 )) print("准备传输时间: %.2f ms" %(pc.getinfo(pc.PRETRANSFER_TIME)*1000 )) print("传输开始时间: %.2f ms" %(pc.getinfo(pc.STARTTRANSFER_TIME)*1000 )) print("传输结束总时间: %.2f ms" %(pc.getinfo(pc.TOTAL_TIME)*1000 )) print("下载数据包大小: %d bytes/s" %(pc.getinfo(pc.SIZE_DOWNLOAD))) print("HTTP头部大小: %d byte" %(pc.getinfo(pc.HEADER_SIZE))) print("平均下载速度: %d bytes/s" %(pc.getinfo(pc.SPEED_DOWNLOAD))) print("重定向消耗的时间: %.2f ms" % (pc.getinfo(pc.REDIRECT_TIME) * 1000 )) pc.close() def main () : """ 请求函数调用 响应函数调用 :return: """ pcurl = request() reponse(pcurl) return 0 if __name__ == '__main__' : main()
weiyigeek.top-pycurl模块