Python打造一个目录扫描工具
目标:用Python3写一款小型的web目录扫描工具
功能:1.扫描指定站点
2.指定网站脚本类型来扫描
3.可控线程
4.可保存扫描结果
首先定义一个命令参数的函数
def parse_option():
parser = argparse.ArgumentParser(description="The Argument of DirScan")
parser.add_argument("-u","--url",dest="url",help="The Url to Scan")
parser.add_argument("-e","--extensions",dest="extensions",help="Web Extensions")
parser.add_argument("-t","--thread",dest="thread",default=10,type=int,help="The Thread to Scan")
parser.add_argument("-r","--report",action="store_true",help="Save The Result of Scan")
args = parser.parse_args()
return args
定义了4个参数,-u用来指定扫描的url,-e用来指定网站类型,-t用来指定线程数,默认为10,-r为保存扫描结果
参数的值传入变量args,然后返回
然后定义一个开始的函数,对url进行处理和启用多线程
def start(url, ext, count):
queue = Queue() #生成一个队列
print('\033[34;1m Status Url Path\033[0m')
global url_r #设置为全局变量
#对传入的url进行处理
if url.endswith("/"):
url = url.rstrip("/")
#对url进行处理方便写入结果
if url[4] == 's':
url_r = url.lstrip("https://")
if url[4] == ':':
url_r = url.lstrip("http://")
#打开字典,并和url进行拼接
f = open('%s.txt' %ext,'r')
for i in f:
queue.put(url + i.rstrip('\n'))
threads = []
thread_count = count
for i in range(thread_count):
threads.append(Dirscan(queue)) #调用多线程
for t in threads:
t.start() #开启多线程
for t in threads:
t.join() #等待
这里用类方法来进行多线程的调用
class Dirscan(threading.Thread):
def __init__(self,queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while not self.queue.empty():
url_path = self.queue.get() #从队列里获取url
#随机user-agents
u = open("user-agents.txt", "r")
headers_list = []
random_headers = {}
for i in u:
headers_list.append(i.strip())
random_headers["user-agents"] = random.choice(headers_list)
headers = random_headers
try:
r = requests.get(url=url_path, headers=headers, timeout=6,allow_redirects=False)
status_code = r.status_code
if status_code == 200:
print("\033[32;1m[+] [%s] %s\033[0m"%(status_code,url_path))
if cmd_args.report: #如果有传入-r参数,则执行write_report()函数来写扫描结果
write_report(url_path)
return url_path
except Exception as e:
print("\033[41;1m%s\033[0m"%e)
然后是写扫描结果的函数
def write_report(url):
with open("%s.html"%url_r, "a") as r:
r.write('<a href="'+url+'" target="_blank">'+url+'</a><br>')
r.close()
最后是程序的入口
if __name__ == '__main__':
cmd_args = parse_option() #把parse_option()返回的args赋给变量cmd_args
url = cmd_args.url #把args中的url传给变量url
extension = cmd_args.extensions #把args中的extensions传给变量extension
thread = cmd_args.thread #把args中的thread传给变量thread
start(url,extension,thread) #把三个参数传入start()函数
以html格式保存扫描结果,也方便直接打开扫描结果
最后的完整代码
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"
import requests
import argparse
import threading
from queue import Queue
import random
class Dirscan(threading.Thread):
def __init__(self,queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while not self.queue.empty():
url_path = self.queue.get()
u = open("user-agents.txt", "r")
headers_list = []
random_headers = {}
for i in u:
headers_list.append(i.strip())
random_headers["user-agents"] = random.choice(headers_list)
headers = random_headers
try:
r = requests.get(url=url_path, headers=headers, timeout=6,allow_redirects=False)
status_code = r.status_code
if status_code == 200:
print("\033[32;1m[+] [%s] %s\033[0m"%(status_code,url_path))
if cmd_args.report:
write_report(url_path)
return url_path
except Exception as e:
print("\033[41;1m%s\033[0m"%e)
def write_report(url):
with open("%s.html"%url_r, "a") as r:
r.write('<a href="'+url+'" target="_blank">'+url+'</a><br>')
r.close()
def start(url, ext, count):
queue = Queue()
print('\033[34;1m Status Url Path\033[0m')
global url_r
if url.endswith("/"):
url = url.rstrip("/")
if url[4] == 's':
url_r = url.lstrip("https://")
if url[4] == ':':
url_r = url.lstrip("http://")
f = open('%s.txt' %ext,'r')
for i in f:
queue.put(url + i.rstrip('\n'))
threads = []
thread_count = count
for i in range(thread_count):
threads.append(Dirscan(queue))
for t in threads:
t.start()
for t in threads:
t.join()
def parse_option():
parser = argparse.ArgumentParser(description="The Argument of DirScan")
parser.add_argument("-u","--url",dest="url",help="The Url to Scan")
parser.add_argument("-e","--extensions",dest="extensions",help="Web Extensions")
parser.add_argument("-t","--thread",dest="thread",default=10,type=int,help="The Thread to Scan")
parser.add_argument("-r","--report",action="store_true",help="Save The Result of Scan")
args = parser.parse_args()
return args
if __name__ == '__main__':
cmd_args = parse_option()
url = cmd_args.url
extension = cmd_args.extensions
thread = cmd_args.thread
start(url,extension,thread)
Python打造一个目录扫描工具的更多相关文章
- 目录扫描工具 dirsearch 使用详解
介绍 dirsearch 是一个python开发的目录扫描工具.和我们平时使用的dirb.御剑之类的工具一样,就是为了扫描网站的敏感文件和目录从而找到突破口. 特点 多线程 可保持连接 支持多种后缀( ...
- phantomjs + python 打造一个微信机器人
phantomjs + python 打造一个微信机器人 1.前奏 媳妇公司不能上网,但经常需要在公众号上找一些文章做一些参考,需要的时候就把文章链接分享给我,然后我在浏览器打开网页,一点点复制过 ...
- 渗透测试工具篇之目录扫描工具dirmap
(一)dirmap介绍 一个高级web目录扫描工具,功能将会强于DirBuster.Dirsearch.cansina.御剑 (二)dirmap安装 打开浏览器输入https://github.com ...
- python遍历一个目录,输出所有文件名
python遍历一个目录,输出所有文件名 python os模块 os import os def GetFileList(dir, fileList): newDir = dir if os. ...
- python之web路径扫描工具
# coding: UTF-8 import sys, os, time, httplibimport relist_http=[] #http数组 def open_httptxt(): #打开 ...
- Python读取一个目录下的所有文件
#!/usr/bin/python # -*- coding:utf8 -*- import os allFileNum = 0 def printPath(level, path): global ...
- python 读取一个目录下的所有目录和文件
#!/usr/bin/python # -*- coding:utf8 -*- import os allFileNum = 0 def printPath(level, path): global ...
- python 检索一个目录下所有的txt文件,并把文件改为.log
检索一个目录及子目录下所有的txt文件,并把txt文件后缀改为log: import os f_path = r'C:\Users\PycharmProjects\mystudy\Testfolder ...
- python 删除一个目录下的所有文件
一个目录下有文件,文件夹,文件夹里又有文件.文件夹....用python脚本,实现,递归删除一个目录下的所有文件: 目录结构如下: 其中我们要删除所有文件 代码实现如下: import os CUR_ ...
随机推荐
- java基础10(IO流)-字节流
IO流 输入与输出[参照物是程序] 如果从键盘.文件.网络甚至是另一个进程(程序或系统)将数据读入到程序或系统中,称为输入 如果是将程序或系统中的数据写到屏幕.硬件上的文件.网络上的另一端或者是一个进 ...
- HBase-存储-文件
文件 HBase使用一个HDFS中可配置的根目录,默认设为“/hbase”.可使用hadoop fs -lsr /hbase查看目录结构,文件可以被分为两类,一类位于HBase根目录下,另一类位于根目 ...
- EXTJS4.2 级联 下拉
items: [ { xtype: "fieldcontainer", layout: "hbox", items: [{ xtype: 'combo', na ...
- Spring初学之使用外部配置文件dataSource
一.在Spring的基础上还要另外导入c3p0包和mysql的驱动包. 二.配置文件, jdbc.propertices:这里只做了一些简单配置 user=root password=123 driv ...
- js代理模式
代理模式的关键是,当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户实际上访问的是替身对象.替身对象对请求做出一些处理之后,再把请求转交给本体对象. 代理模 ...
- 关于angular路由中的#
http://localhost:3000/#/app/order/list 这个路由我们看到一个#,这个#代表,后边不论是有多少后缀,我们的和后台请求的时候都是一个界面. 所以说用angular的时 ...
- 工程优化方法中的“最速下降法”和“DFP拟牛顿法”的 C 语言实现
这个小程序是研一上学期的“工程优化”课程的大作业.其实这题本可以用 MATLAB 实现,但是我为了锻炼自己薄弱的编码能力,改为用 C 语言实现.这样,就得自己实现矩阵的运算(加减乘除.求逆.拷贝):难 ...
- MVC3 学习总结一(未发布)
MVC: Model,View,Control 设置View中的数据 1. 返回model,View中强类型化 Control: public ActionResult Browse(strin ...
- 时间服务器: NTP 服务器及客户端搭建
时间服务器: NTP 服务器及客户端搭建 一. NTP 服务器的安装与设定 1. NTP 服务器的安装与设定前言 2. 所需软件与软件结构 3. 主要配置文件 ntp.conf 的处理 4. NTP ...
- cassandra集群环境搭建——注意seeds节点,DHT p2p集群管理难道初始化都应如此吗?
解压cassandra的安装包后可以查看主要的配置文件,都在conf/目录下,conf/cassandra.yaml比较重要,其中需要着重注意的有以下一些配置项: cluster_name: 'TC0 ...