|
python 小工具连载
-备份文件扫描-
应用场景
最近都在编写web目录爆破的工具,虽然上一次完成的工具我们也可以使用字典针对我们的目标进行备份文件的扫描,但是这样批量的扫描,不仅访问次数多,容易被发现,且命中率不高,因为很多备份文件都是以自己网站的名称、或者域名之类的进行命名,这样我们的字典就很难针对不同的网站进行扫描,而本次我们完成的专门用于备份文件扫描的工具,就是这样一个,根据我们要扫描的url自动生成字典,并且在其中加入了些常用的备份文件命名,这样不仅提升了我们的命中率,也保证了我们的攻击行为尽可能多的减少访问量,以便我们保护自己。
工具效果
利用工具对自己的网站进行目录爆破
使用方法 python3 备份文件扫描 -u url
实现原理
本次的工具我是根据之前的poc模版修改完成的,poc模版的具体原理这里就不做解释,大家可以参考这篇文章。
一个通用poc模版
首先呢,这里根据用户输入的url或者从文件读取的url转换成一个列表,传入我们的字典处理函数中,在这个函数中,首先我们创建一个队列,用于存放处理好的url,然后是一个列表,其中是常用的备份后缀,然后首先我们将msg中的url一个一个取出,将其中最后的‘/’,然后将开头的http://或https://删除掉,最后再检查一遍,是否还存在‘/’、‘:’这些我们不想要的内容。然后将被攻击者的域名或ip根据'.'进行分割,并且将分割的内容拼接。然后就要生成我们的字典,并且将我们刚刚提取出来的域名或在ip作为我们字典的一部分,将拼接好的域名或ip也作为我们的字典的一部分,最后依次将我们的目标url和字典文件以及后缀一次拼接(此时已经将字典与url拼接完成),并且放入我们刚刚生成的队列中,并将这个队列返回。
def handle(msg):
url = queue.Queue()
suffixFormat = ['rar', 'zip', 'gz', 'tar.gz']
for urll in msg:
ucp = ''
if urll[-1] == '/':
urll = urll[0:-1]
if urll.startswith('http://'):
ucp = urll.lstrip('http://')
elif urll.startswith('https://'):
ucp = urll.lstrip('https://')
if'/'in ucp:
ucp = ucp.split('/')[0]
if':'in ucp:
cport = ucp.split(':')[1]
ucp = ucp.split(':')[0]
www1 = ucp.split('.')
else:
www1 = ucp.split('.')
wwwlen = len(www1)
wwwhost = ''
for i in range(1, wwwlen):
wwwhost += www1[i]
domainDic = [ucp + '.', ucp.replace('.', '') + '.', 'wz.', 'sql.', 'wwwroot.', 'index.', 'old.','web.','database.','upload.', 'website.', 'wangzhan.','package.', 'bin.', 'ftp.', 'output.', 'config.', '网站备份.', '网站.', '数据库.', '数据库备份.','sjk.','shujuku.','home.','backup.','faisunzip.','1.','2.','3.','4.','5.','6.','7.', '8.','9.','666.',
'777.','888.','999.','234.','555.', '333.','444.','admin.', 'db.', 'test.', '123.', 'admin.', 'root.', 'data.', '666.','111.', 'beifen.','b.', 'template.', 'install.', 'core.', 'about.', 'cache.', 'download.','runtime.', 'a.', 'img.', 'include.','000.', '00.', '0.', '012.','application.', 'server', 'extend.','vendor.', 'app.', 'public.''bf.', wwwhost + '.',ucp.split('.', 1)[-1] + '.', www1[0] + '.', www1[1] + '.']
for a in suffixFormat:
for b in domainDic:
url.put(urll+'/'+b+a)
return url
然后后面就简单了,我们在主函数中调用上面的字典处理函数后,创建多线程,并从队列中取出一个要扫描的url作为参数传入。
t = threading.Thread(target=exploit,args=(target.get(),))
t.start()
最后执行扫描,通过网页的状态码以及包头中的content-length来判断目录是否存在,并且其是否可能为泄漏的备份文件。
def exploit(url):
global proxies_judge
proxies = {
"http": 'http://127.0.0.1:8080',
"https": 'http://127.0.0.1:8080'
}
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}
exp = url
try:
if proxies_judge:
re = requests.get(exp,verify=False,timeout=5,proxies=proxies)
else:
re = requests.get(exp,verify=False,timeout=5)
if re.status_code == 200:
rarsize = int(re.headers.get('Content-Length'))
if rarsize // 1024 > 100:
msg = "存在目录 文件大小为"+str(rarsize)+' '+exp
else:
msg = '存在目录,但文件较小,请手动验证 '+url
judge = 1
output_to_file(msg)
else:
msg = '不存在目录'+url
judge = 2
except:
msg = 'error! 目标路径无法访问'
judge = 3
output(msg,judge)
工具下载链接: https://pan.baidu.com/s/1f3NE7n6zrF62u8Gg-zyvGg 提取码: sro8
Github:https://github.com/haochen1204/python_hacktool_study/blob/main/备份文件扫描.py
|