目标:用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打造一个目录扫描工具的更多相关文章

  1. 目录扫描工具 dirsearch 使用详解

    介绍 dirsearch 是一个python开发的目录扫描工具.和我们平时使用的dirb.御剑之类的工具一样,就是为了扫描网站的敏感文件和目录从而找到突破口. 特点 多线程 可保持连接 支持多种后缀( ...

  2. phantomjs + python 打造一个微信机器人

    phantomjs + python 打造一个微信机器人 1.前奏   媳妇公司不能上网,但经常需要在公众号上找一些文章做一些参考,需要的时候就把文章链接分享给我,然后我在浏览器打开网页,一点点复制过 ...

  3. 渗透测试工具篇之目录扫描工具dirmap

    (一)dirmap介绍 一个高级web目录扫描工具,功能将会强于DirBuster.Dirsearch.cansina.御剑 (二)dirmap安装 打开浏览器输入https://github.com ...

  4. python遍历一个目录,输出所有文件名

    python遍历一个目录,输出所有文件名 python os模块 os import os  def GetFileList(dir, fileList):  newDir = dir  if os. ...

  5. python之web路径扫描工具

    # coding: UTF-8 import sys, os, time, httplibimport relist_http=[]  #http数组 def open_httptxt():  #打开 ...

  6. Python读取一个目录下的所有文件

    #!/usr/bin/python # -*- coding:utf8 -*- import os allFileNum = 0 def printPath(level, path): global ...

  7. python 读取一个目录下的所有目录和文件

    #!/usr/bin/python # -*- coding:utf8 -*- import os allFileNum = 0 def printPath(level, path): global ...

  8. python 检索一个目录下所有的txt文件,并把文件改为.log

    检索一个目录及子目录下所有的txt文件,并把txt文件后缀改为log: import os f_path = r'C:\Users\PycharmProjects\mystudy\Testfolder ...

  9. python 删除一个目录下的所有文件

    一个目录下有文件,文件夹,文件夹里又有文件.文件夹....用python脚本,实现,递归删除一个目录下的所有文件: 目录结构如下: 其中我们要删除所有文件 代码实现如下: import os CUR_ ...

随机推荐

  1. Ubuntu 安装mysql

    ubuntu上安装mysql非常简单只需要几条命令就可以完成. 1. sudo apt-get install mysql-server   2. apt-get isntall mysql-clie ...

  2. Hibernate 关于实体映射常用注解

    注解 类注解(写在类上面的) @Entity       标明实体类 @Table(name="数据库标明")      生成数据库时的表名由这个决定 @DynamicInsert ...

  3. BZOJ3244/UOJ122 [Noi2013]树的计数

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  4. HDU1565 方格取数(1)

    Problem Description 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数 ...

  5. Git---之上传远程仓库

    一:在GitHub上注册账号 官网   : https://github.com/ 二:与远程仓库关联 在本地生成ssh key 运行命令  ssh-keygen -t rsa -C "50 ...

  6. php get_magic_quotes_gpc()

    magic_quotes_gpc函数在php中的作用是判断解析用户输入的数据,如包括有:post.get.cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序异常,特别是数据库语句因为 ...

  7. 绑定自己Self

    Header="{Binding Path=Command.Text, RelativeSource={RelativeSource Self}}"/>

  8. 用lsmod看硬盘驱动决定是sata还是scsi盘

    sas盘 scsi盘 sata盘都是显示为sdx的所以无法区别唯一可以分别的是看看内核加载的驱动模块有啥 lsmod....mptsas      62545       7

  9. MySQL管理

    http://www.yiibai.com/mysql/administration.html 在本节中,您将学习有关MySQL管理教程,包括MySQL服务器启动和关闭,MySQL服务器安全性,MyS ...

  10. 剑指offer--5.变态跳台阶

    WA了一次,错误数据4,输出8,怎么真么熟悉呢?改个return过了,OMG ------------------------------------------------------------- ...