网上有很多python相关的学习资料,但适用于具体场景的解读方式却较少。于是乎,突然想起开启“一起玩蛇”这一系列,想以最基础最简单的方式打开python,在渗透测试或安全领域进行浅浅的应用,自定义实现期望的操作,高效学习,高效工作,高效生活。
1 、实现功能
作为网络安全从业者,想必都看到过“安全行业从业人员自研开源扫描器合集”(https://github.com/We5ter/Scanners-Box)
其中不乏有很多优秀的项目,无论是从功能,还是工具框架与实现思路都值得借鉴。如果一个个去翻阅然后下载,会变得十分麻烦;如果可以全都下载到本地用编辑器去打开,那将非常便利。因此,便有了写个小脚本去实现批量下载的想法。
系统环境:win10
语言环境:python 2.7.13
所需模块:re, urllib2
使用python实现文件下载,通常可以使用以下三种方式:
(1)urllib
(2)urllib2
(3)requests
在进行脚本编写前,需要了解github上这些工具的页面结构以及下载流程。
(1)页面分析
访问https://github.com/We5ter/Scanners-Box并查其源码,以第一类工具SubdomainScanners or Enumeration Tools中的第一个工具subDomainsBrute为例,在源码中确定其具体位置:
(2)下载流程
当页面上点击subDomainsBrute时,实际上是通过https://github.com/lijiejie/subDomainsBrute跳转至工具的主页面:
当点击Download ZIP时,可以看到下载链接为:https://codeload.github.com/lijiejie/subDomainsBrute/zip/master
重新下载一个工具,比如:wydomain,下载链接为:https://codeload.github.com/ring04h/wydomain/zip/wydomain2
(3)地址提取
通过手工从Scanners-Box下载几款工具,梳理对应的链接以及下载链接:
不难看出工具实际的下载链接可由两部分组成:
不得不说,关于作者更新过版本的工具存在特殊情况,比如wydomain,实际下载链接为https://codeload.github.com/ring04h/wydomain/zip/wydomain2,但通过https://codeload.github.com/ring04h/wydomain/zip/master也能下载,不过应该是旧版本:
类似的情况并不多,所以该脚本中均构造/zip/master结尾的网址来实现工具的下载。
(4)本地保存
在上一部分中已经介绍常见的文件下载方式,此处采用urllib2来实现该功能。
按照上面的流程,可以把整个功能的实现分为三个小块,编写边调试。
通过正则匹配出工具在Scanners-Box中显示的链接,此时获得的是数组[(工具1-a, 工具1-b, 工具1-c,), (工具2-a, 工具2-b, 工具2-c,), (), …]
将获取的工具数组,按照不用工具(一个工具一个元组)提取出第一个URL,再将其按照左斜杠分割,提取出倒数第一个或第二个作为下载至本地的名称。
先构造完整的下载链接,再替换域名,获得真正的下载地址。
通过urllib2去请求资源并根据工具名保存到本地。需要注意的是根据工具名保存下载的压缩包文件,并设置异常与下载完成的提示信息。
完整的脚本如下:
# -*- coding:utf-8 -*-# Author : aerfa# Functions :批量下载“安全行业从业人员自研开源扫描器合集 https://github.com/We5ter/Scanners-Box” import urllib2import re def downloadGithub(target): req = urllib2.urlopen(target)result = req.read()pContent = re.compile(r'''<li><a href="(.+?)">(.+?)</a> (.+?)</li>''')mContent = pContent.findall(result)for row in mContent: content = row[0] line = content.rstrip('\n') tool = line.split('/') if tool[-1] : toolName = tool[-1] else: toolName = tool[-2] print toolName url = content + '/zip/master' url = url.replace('https://github.com', 'https://codeload.github.com') print url try: f = urllib2.urlopen(url) print f.code data = f.read() with open('%s.zip' % toolName, 'wb') as code: code.write(data) print 'downloading %s over!' % toolName except urllib2.URLError as e: if hasattr(e, 'code'): print 'Error code:', e.code elif hasattr(e, 'reason'): print 'Reason:', e.reason print 'downloading github-resources success!' def main(): sourceUrl = "https://github.com/We5ter/Scanners-Box" downloadGithub(sourceUrl) if __name__ == '__main__': main() |
---|
download_github_tools.py运行效果:
在桌面上已经有下载完成的文件,具体路径可以在open()中进行设置。
整个实现过程相对简单,不过对于新手可能会遇到:
在对URL进行拼接时,变成两行而不是完整的一行URL。这是由于在每行换行时使用了回车,可以通过line.rstrip('\n')移除换行符。