一款多线程站点目录扫描工具_站点扫描_Slash_HK的博客-程序员秘密

技术标签: python  安全  常用工具积累  

一款多线程的站点目录扫描工具

一. 项目地址

https://github.com/WangYihang/SourceLeakHacker

关于网站目录扫描的工具,之前接触了非常多,例如kali自带的dirb,dirsearch,以及7kbscan等等,今天在逛github的时候偶然间发现了这款站点目录扫描工具,因此做一个记载。
首先我们将其下载部署到本地

git clone https://github.com/WangYihang/SourceLeakHacker

请添加图片描述
进入到下载的SourceLeakHacker目录下,安装相关依赖

cd SourceLeakHacker
pip install -r requirements.txt

在这里插入图片描述

使用方法及相关参数说明

usage: SourceLeakHacker.py [options]

optional arguments:
  -h, --help            show this help message and exit
  --url URL             url to scan, eg: 'http://127.0.0.1/'
  --urls URLS           file contains urls to scan, one line one url.
  --scale {full,tiny}   build-in dictionary scale
  --output OUTPUT       output folder, default: result/YYYY-MM-DD hh:mm:ss
  --threads THREADS, -t THREADS
                        threads numbers, default: 4
  --timeout TIMEOUT     HTTP request timeout
  --level {CRITICAL,ERROR,WARNING,INFO,DEBUG}, -v {CRITICAL,ERROR,WARNING,INFO,DEBUG}
                        log level
  --version, -V         show program's version number and exit

二.使用例子

1 . python SourceLeakHacker.py --url=http://baidu.com --threads=4 --timeout=8
在这里插入图片描述
图片来自github作者
这里具体功能不再赘述,对源码进行简单的一些查看

三.源码分析

(1)字典分析

在这里插入图片描述

(2)源码分析

#!/usr/bin/env python
# encoding:utf-8

import threading
import requests
import signal
import sys
import glob
import time
import argparse
import prettytable
import coloredlogs
import os
import logging

from lib.util import url
from lib.util import output
from lib.context import context
from lib.util import signal as sg
from lib.core import dispatcher

def init():
    initSignal()

def initSignal():
    signal.signal(signal.SIGINT, sg.ctrlC)
    signal.signal(signal.SIGTERM, sg.ctrlC)

def initArguments():
    parser = argparse.ArgumentParser(
        usage="%(prog)s [options]", 
        formatter_class=argparse.RawDescriptionHelpFormatter,
        description="A multi threads web application source leak scanner", 
        epilog='''
Examples: 
    1. For a single url('http://baidu.com') to scan: 
        ```
        python SourceLeakHacker.py --url=http://baidu.com --scale=tiny --threads=4 --timeout=8 
        ```
    2. For a bunch of urls in file('url.txt') to scan: 
        ```
        python SourceLeakHacker.py --urls=url.txt --threads=4 --timeout=8 --level=INFO 
        ```
        '''
    )
    
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument("--url", "-u", help="url to scan, eg: 'http://127.0.0.1/'")
    group.add_argument("--urls", type=argparse.FileType("r"), help="file contains urls to scan, one line one url.")

    parser.add_argument("--scale", "-s", default="full", help="build-in dictionary scale", choices=[i.split(os.sep)[-1] for i in glob.glob("./dict/*")])
    # parser.add_argument("--folders", default=context.foldernames_dictionary, help="dictionary for most common folder names, default: {}".format(context.foldernames_dictionary))
    # parser.add_argument("--files", default=context.filenames_dictionary, help="dictionary for most common file names, default: {}".format(context.filenames_dictionary))
    # parser.add_argument("--backups", default=context.backups_dictionary, help="dictionary for most common backup file patterns, default: {}".format(context.backups_dictionary))
    parser.add_argument("--output", "-o", help="output folder, default: result/YYYY-MM-DD-hh-mm-ss", default=time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime(time.time())))

    parser.add_argument("--threads", "-t", default=4, type=int, help="threads numbers, default: 4")
    parser.add_argument("--timeout", type=float, default=4, help="HTTP request timeout")

    levels = ["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG",]
    parser.add_argument("--level", "-v", choices=levels, default="WARNING", help="log level")
    parser.add_argument("--version", "-V", action="version", version="%(prog)s 3.0")

    args = parser.parse_args()
    return args

def save_dictionary(filename, dictionary):
    with open(filename, "w") as f:
        for k, v in dictionary.items():
            f.write("{}\t{}\n".format(v, k))

def main():
    init()
    # Parse command line arguments
    args = initArguments()

    # Logger
    logger = logging.getLogger(__name__)
    coloredlogs.install(
        level=args.level, 
        fmt='%(asctime)s [%(levelname)s] %(message)s'
    )
    context.logger = logger

    # Parse urls
    urls = set()
    if args.url:
        urls = urls.union(url.Formater(args.url))
    if args.urls:
        for i in list(args.urls):
            x = url.Formater(i)
            urls = urls.union(x)

    # Start dispatching
    dispatcher.start(
        urls, 
        "dict/{}/{}".format(args.scale, context.foldernames_dictionary), 
        "dict/{}/{}".format(args.scale, context.filenames_dictionary), 
        "dict/{}/{}".format(args.scale, context.backups_dictionary), 
        args.threads,args.timeout
    )

    # Save optimized dictionary
    context.logger.info("Saving optimized dictionary: dict/{}/{}".format(args.scale, context.foldernames_dictionary))
    save_dictionary("dict/{}/{}".format(args.scale, context.foldernames_dictionary), context.foldernames_cache)
    context.logger.info("Saving optimized dictionary: dict/{}/{}".format(args.scale, context.filenames_dictionary))
    save_dictionary("dict/{}/{}".format(args.scale, context.filenames_dictionary), context.filenames_cache)
    context.logger.info("Saving optimized dictionary: dict/{}/{}".format(args.scale, context.backups_dictionary))
    save_dictionary("dict/{}/{}".format(args.scale, context.backups_dictionary), context.backups_cache)

    # Print statistic information
    output.asTable()

    # Save result
    output.asCSV(args.output)

if __name__ == "__main__":
    main()
               

功能模块不是很难理解,正好最近也在学Python,通过对这个项目的学习,对requests库有了一个较好的认识。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lovefairy1/article/details/122670949

智能推荐

numpy.random.choice的使用_有石为玉的博客-程序员秘密

参考:https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.choice.htmlnumpy.random.choice:有选择的随机numpy.random.choice(a,size=None,replace=True,p=None)从给定的1维数组中产生一个随机样本Parameters:...

人工智能、机器学习、数据挖掘等基础概念-考研复试面试_人工智能复试csdn_有趣的学习的博客-程序员秘密

(写一点关于前沿知识的简单问题,可能复试中会问到的)文章目录1、人工智能(Artificial Intelligence, AI)1.1、人工智能是什么?1.2、人工智能应用在什么地方?1.3人工智能具体有哪三种形态呢?2、人工智能的四大技术分支2.1、模式识别:2.2、机器学习:2.3、数据挖掘:2.4、智能算法:3、数据挖掘4、机器学习算法4.1、机器学习常见算法4.2、机器学习基于学习方式...

数组去重方法:_yige8608的博客-程序员秘密

第一种:实现思路:双层循环,外循环表示从0到arr.length,内循环表示从i+1到arr.length将没重复的右边值放入新数组。(检测到有重复值时终止当前循环同时进入外层循环的下一轮判断)function unique4(arr){ var hash=[];for (var i = 0; i < arr.length; i++) {for (var j = i+1; j < arr.length; j++) { if(arr[i]===arr[j]){ ++..

xshell上传文件到服务器和下载文件到本地_我从远处聆听你的博客-程序员秘密

sz用法: 下载一个文件 sz filename 下载多个文件 sz filename1 filename2 下载dir目录下的所有文件,不包含dir下的文件夹 sz dir/*rz用法:输入rz回车后,会出现文件选择对话框,选择需要上传文件,一次可以指定多个文件,上传到服务器的路径为当前执行rz命令的目录。

rg1 蓝光危害rg0_你选的LED台灯防蓝光危害评估结果是RG0吗?_weixin_39717825的博客-程序员秘密

原标题:你选的LED台灯防蓝光危害评估结果是RG0吗?在提倡节能环保的今天,LED光源台灯得到了空前的发展,LED台灯市场快速扩张,从而带来了大量的低价劣质台灯充斥市场,引起了大家对蓝光的恐惧。其实不必恐惧蓝光,而是注意LED台灯蓝光的量,今天我们结合2017年1月1日的新国标GB7000.1:2015来谈谈蓝光的危害。太阳光是我们最常见的光源,主要包括红、绿、蓝三光混合而成。在每天的不同时段,因...

随便推点

mybatis批量删除_java持续实践的博客-程序员秘密

文章目录直接传递数组daoxmlModel含有数组的属性modelDaoMapper直接传递数组daopublic void setStatesDelete(@Param("idArray") String[] idArray);xml <update id="setStatesDelete"> delete from t_book whe...

tensorflow的tf.transpose()简单使用_lilong117194的博客-程序员秘密

tf.transpose(input, [dimension_1, dimenaion_2,..,dimension_n]):这个函数主要适用于交换输入张量的不同维度用的,如果输入张量是二维,就相当是转置。dimension_n是整数,如果张量是三维,就是用0,1,2来表示。这个列表里的每个数对应相应的维度。如果是[2,1,0],就把输入张量的第三维度和第一维度交换。import tensor...

RuntimeError: cuDNN error: CUDNN_STATUS_MAPPING_ERROR_xiaobai11as的博客-程序员秘密

原因:输入数据尺寸太大了解决方法:1,resize(crop)输入数据 2,更改bitchsize大小

安装windows与Linux双系统_安装windows和li_蓝月心语的博客-程序员秘密

1 UEFI+GPT与Legacy+MBR的区别  更多信息请参考我的另一篇文章——第2章 主机规划与磁盘分区。1.1 磁盘分区格式  一般来说,磁盘分区表有两种格式:MBR和GPT。1.1.1 MBR格式  磁盘的0号扇区也叫主引导扇区(512B),它包含主引导记录(MBR,446B)、分区表(DPT,64B)、硬盘有效标志(2B)。   主引导记录中存放的是引导加载程序(boot loade

python编程点名程序_基于python tkinter的点名小程序功能的实例代码_weixin_39637571的博客-程序员秘密

代码如下所示:import datetimeimport jsonimport osimport randomimport tkinter as tkimport openpyxl# 花名册文件名excel_file_path = "花名册.xlsx"#需在当前目录创建对应花名册.xlsx# 工作表名excel_sheet = "Sheet1"# 记录存储文件名file_path = "name_...

jsp内置对象_weixin_34259159的博客-程序员秘密

① out - javax.servlet.jsp.jspWriter out对象用于把结果输出到网页上。方法:1. void clear() ; 清除输出缓冲区的内容,但是不输出到客户端。2. void clearBuffer() ; 清除输出缓冲区的内容,并输出到客户端。3. void close() ; 关闭输出流,清除所有内容。4. vo...

推荐文章

热门文章

相关标签