【一起玩蛇】python武器库的打开方式

网上有很多python相关的学习资料,但适用于具体场景的解读方式却较少。于是乎,突然想起开启“一起玩蛇”这一系列,想以最基础最简单的方式打开python,在渗透测试或安全领域进行浅浅的应用,自定义实现期望的操作,高效学习,高效工作,高效生活。

1 、实现功能

作为网络安全从业者,想必都看到过“安全行业从业人员自研开源扫描器合集”(https://github.com/We5ter/Scanners-Box)

其中不乏有很多优秀的项目,无论是从功能,还是工具框架与实现思路都值得借鉴。如果一个个去翻阅然后下载,会变得十分麻烦;如果可以全都下载到本地用编辑器去打开,那将非常便利。因此,便有了写个小脚本去实现批量下载的想法。

2、基础知识

2.1 基础环境

系统环境:win10

语言环境:python 2.7.13

所需模块:re, urllib2

2.2 文件下载

使用python实现文件下载,通常可以使用以下三种方式:

(1)urllib

(2)urllib2

(3)requests

2.3 流程分析

在进行脚本编写前,需要了解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来实现该功能。

3、脚本编写

按照上面的流程,可以把整个功能的实现分为三个小块,编写边调试。

3.1 获取所有工具地址功能

通过正则匹配出工具在Scanners-Box中显示的链接,此时获得的是数组[(工具1-a, 工具1-b, 工具1-c,), (工具2-a, 工具2-b, 工具2-c,), (), …]

3.2 提取所有工具名称功能

将获取的工具数组,按照不用工具(一个工具一个元组)提取出第一个URL,再将其按照左斜杠分割,提取出倒数第一个或第二个作为下载至本地的名称。

3.3 构造下载链接并保存本地

先构造完整的下载链接,再替换域名,获得真正的下载地址。

通过urllib2去请求资源并根据工具名保存到本地。需要注意的是根据工具名保存下载的压缩包文件,并设置异常与下载完成的提示信息。

4、结果展示

完整的脚本如下:

# -*- 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()中进行设置。

5、注意事项

整个实现过程相对简单,不过对于新手可能会遇到:

在对URL进行拼接时,变成两行而不是完整的一行URL。这是由于在每行换行时使用了回车,可以通过line.rstrip('\n')移除换行符。

原文发布于微信公众号 - 我的安全视界观(CANI_Security)

原文发表时间:2018-03-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器人网

终于全了!ABB机器人学习资料

? 1、安全 自动模式中,任何人不得进入机器人工作区域 长时间待机时,夹具上不宜放置任何工件。 机器人动作中发生紧急情况或工作不正常时,均可使用E-stop键...

3583
来自专栏沃趣科技

等待事件统计视图 | 全方位认识 sys 系统库

在上一篇《内存分配统计视图 | 全方位认识 sys 系统库》中,我们介绍了sys 系统库如何查询内存事件统计信息和buffer pool统计信息,本期的内容先给...

1300
来自专栏编程札记

Goroutine并发调度模型深入之实现一个协程池

7535
来自专栏沃趣科技

基于Oracle的私有云架构探析(连载三)@【DTCC干货分享】

• 启用Instance Caging Instance Caging 通过设置2个数据库的初始化参数来达到管控CPU的目的: • cpu_count ...

3745
来自专栏维C果糖

GitHub 术语解释

为了大家进一步了解和使用 GitHub,在本文中,我们一起来看看 GitHub 的常用术语,也可以说是基本概念: Repository:简称Repo,可以理解为...

1915
来自专栏编程之路

羊皮书APP(Android版)开发系列(十六)Android 开源库的使用

1052
来自专栏北京马哥教育

NoSQL之mongodb我见

NoSQL介绍: NoSQL数据管理系统是目前非常流行的一种非关系性、分布式、不支持ACID设计规范式的数据库;NoSQL简单的数据模型、元数据和数据分离、弱一...

3089
来自专栏Java进阶架构师

dubbo源码解析-详解router

估算了一下,dubbo里面涉及的东西还是比较多的.比如谈到框架的时候,设计模式都是一个老生常谈的话题,再比如我们开发中我们不常用的一些概念,spi、javass...

883
来自专栏Linyb极客之路

程序员不可不知的Linux性能工具

1104
来自专栏大数据和云计算技术

云存储产品浅析

云上存储产品主要有对象存储,块存储,网络文件系统(NAS),还有最赚钱的CDN,我们将针对这些主流产品,讲讲他们产品特点,有云上存储时候知道如何选型,当然我们是...

3353

扫码关注云+社区