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
这里具体功能不再赘述,对源码进行简单的一些查看
#!/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库有了一个较好的认识。
参考: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:...
(写一点关于前沿知识的简单问题,可能复试中会问到的)文章目录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、机器学习基于学习方式...
第一种:实现思路:双层循环,外循环表示从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]){ ++..
sz用法: 下载一个文件 sz filename 下载多个文件 sz filename1 filename2 下载dir目录下的所有文件,不包含dir下的文件夹 sz dir/*rz用法:输入rz回车后,会出现文件选择对话框,选择需要上传文件,一次可以指定多个文件,上传到服务器的路径为当前执行rz命令的目录。
原标题:你选的LED台灯防蓝光危害评估结果是RG0吗?在提倡节能环保的今天,LED光源台灯得到了空前的发展,LED台灯市场快速扩张,从而带来了大量的低价劣质台灯充斥市场,引起了大家对蓝光的恐惧。其实不必恐惧蓝光,而是注意LED台灯蓝光的量,今天我们结合2017年1月1日的新国标GB7000.1:2015来谈谈蓝光的危害。太阳光是我们最常见的光源,主要包括红、绿、蓝三光混合而成。在每天的不同时段,因...
文章目录直接传递数组daoxmlModel含有数组的属性modelDaoMapper直接传递数组daopublic void setStatesDelete(@Param("idArray") String[] idArray);xml &lt;update id="setStatesDelete"&gt; delete from t_book whe...
tf.transpose(input, [dimension_1, dimenaion_2,..,dimension_n]):这个函数主要适用于交换输入张量的不同维度用的,如果输入张量是二维,就相当是转置。dimension_n是整数,如果张量是三维,就是用0,1,2来表示。这个列表里的每个数对应相应的维度。如果是[2,1,0],就把输入张量的第三维度和第一维度交换。import tensor...
原因:输入数据尺寸太大了解决方法:1,resize(crop)输入数据 2,更改bitchsize大小
1 UEFI+GPT与Legacy+MBR的区别 更多信息请参考我的另一篇文章——第2章 主机规划与磁盘分区。1.1 磁盘分区格式 一般来说,磁盘分区表有两种格式:MBR和GPT。1.1.1 MBR格式 磁盘的0号扇区也叫主引导扇区(512B),它包含主引导记录(MBR,446B)、分区表(DPT,64B)、硬盘有效标志(2B)。 主引导记录中存放的是引导加载程序(boot loade
代码如下所示:import datetimeimport jsonimport osimport randomimport tkinter as tkimport openpyxl# 花名册文件名excel_file_path = "花名册.xlsx"#需在当前目录创建对应花名册.xlsx# 工作表名excel_sheet = "Sheet1"# 记录存储文件名file_path = "name_...
① out - javax.servlet.jsp.jspWriter out对象用于把结果输出到网页上。方法:1. void clear() ; 清除输出缓冲区的内容,但是不输出到客户端。2. void clearBuffer() ; 清除输出缓冲区的内容,并输出到客户端。3. void close() ; 关闭输出流,清除所有内容。4. vo...