1.使用了多线程+队列的方式
2.使用了随机user-agent头来发起网络请求
3.使用了asp网站目录字典,拼接url发起网络请求,探查网站是否存在潜在url
4.使用了Figlet工具转换字符做脚本LOGO,提升美观性
5.使用了optparse模块,做调用脚本的参数,具备了–help帮助说明,可设置默认线程数
6.使用了sys.stdout模块,在cmd命令行内动态展示扫描过程的详情,显示待扫描数、扫描总数、剩余百分比
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 目录扫描,敏感文件扫描
# 字典很重要是扫描器的基石
# 取出字典内容,和目标网站url进行拼接,发送网络请求进行识别
# 使用Figlet工具转换字符做脚本LOGO http://www.network-science.de/ascii/
# 使用optparse参数说明模块 https://docs.python.org/2/library/optparse.html
# baidu搜目标网站语法 inurl:admin.asp
# asp网站目录字典txt asp_dir_dic.txt
# 随机user-agent头 user_agent_list.py
import requests
from queue import Queue
import sys
import threading
import user_agent_list
from optparse import OptionParser
class DirScanMain:
def __init__(self, options):
self.url = options.url
self.ext = options.ext
self.count = options.count
# 内部类DirScan
class DirScan(threading.Thread):
# 构造参数,创建原始的线程对象,拿到传入的queue队列对象和total队列总数
def __init__(self, queue, total):
threading.Thread.__init__(self)
self.queue = queue
self.total = total
# 一个run方法,谁来调用这个方法?
def run(self):
# 当队列queue的数量不为空时,就开始干活了
while not self.queue.empty():
# 取出队列里的url
url = self.queue.get()
# 打印queue队列中的第一个url看看
# print(url)
# 让线程对象执行self.msg方法
threading.Thread(target=self.msg).start()
try:
r = requests.get(url=url, headers=user_agent_list.get_user_agent(), timeout=8, )
# 发送网络请求,如果我们拼接的url,访问是存在的,我们就写到result.html文件中,并且调用sys.stdout来cmd命令台输出
if r.status_code == 200:
# print('[*]' + url)
# 调用sys系统模块stdout输出展示信息
sys.stdout.write('\r' + '[*]扫描到存在的网址=======>%s\t\n' % (url))
# 开始往result.html文件中追加写入信息
f = open('result.html', 'a+')
# 按照html语言语法,把url地址写入
f.write('<a href="' + url + '"" target="_blank">' + url + '</a>')
# \r是回车(光标移动到本行的行首),\n是换行(光标所在位置向下移动一行),\r\n是回车换行(光标回到下一行的行首)
f.write('\r\n</br>')
f.close()
except Exception as e:
print(e)
pass
# 获得扫描了多少个的信息的方法
def msg(self):
# self.total是总任务数,self.queue.qsize()是队列里还剩的数
# print(self.total,self.queue.qsize())
# 输出百分比,队列里还剩的数/总数
per = ('{:.0%}'.format(self.queue.qsize() / self.total))
msg =