Python开发网站目录扫描器
有人问为什么要去扫描网站目录:懂的人自然懂
这个Python脚本的特点:
1.基本完善
2.界面美观(只是画了个图案)
3.可选参数增加了线程数
4.User Agent细节处理
5.多线程显示进度
扫描目标:Metasploitable Linux
代码:WebDirScanner.py:
# -*- coding:utf-8 -*-
__author__ = "Yiqing"
import sys
import threading
import random
from Queue import Queue
from optparse import OptionParser try:
import requests
except Exception:
print "[!] You need to install requests module!"
print "[!] Usage:pip install requests"
exit() class WebDirScan:
"""
Web目录扫描器
""" def __init__(self, options):
self.url = options.url
self.file_name = options.file_name
self.count = options.count class DirScan(threading.Thread):
"""
多线程
""" def __init__(self, queue, total):
threading.Thread.__init__(self)
self._queue = queue
self._total = total def run(self):
while not self._queue.empty():
url = self._queue.get()
# 多线程显示进度
threading.Thread(target=self.msg).start()
try:
r = requests.get(url=url, headers=get_user_agent(), timeout=5)
if r.status_code == 200:
sys.stdout.write('\r' + '[+]%s\t\t\n' % url)
# 保存到本地文件,以HTML的格式
result = open('result.html', 'a+')
result.write('<a href="' + url + '" target="_blank">' + url + '</a>')
result.write('\r\n</br>')
result.close()
except Exception:
pass def msg(self):
"""
显示进度
:return:None
"""
per = 100 - float(self._queue.qsize()) / float(self._total) * 100
percent = "%s Finished| %s All| Scan in %1.f %s" % (
(self._total - self._queue.qsize()), self._total, per, '%')
sys.stdout.write('\r' + '[*]' + percent) def start(self):
result = open('result.html', 'w')
result.close()
queue = Queue()
f = open('dict.txt', 'r')
for i in f.readlines():
queue.put(self.url + "/" + i.rstrip('\n'))
total = queue.qsize()
threads = []
thread_count = int(self.count)
for i in range(thread_count):
threads.append(self.DirScan(queue, total))
for thread in threads:
thread.start()
for thread in threads:
thread.join() def get_user_agent():
"""
User Agent的细节处理
:return:
"""
user_agent_list = [
{'User-Agent': 'Mozilla/4.0 (Mozilla/4.0; MSIE 7.0; Windows NT 5.1; FDM; SV1; .NET CLR 3.0.04506.30)'},
{'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; en) Opera 11.00'},
{
'User-Agent': 'Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.0.2) Gecko/2008092313 Ubuntu/8.04 (hardy) Firefox/3.0.2'},
{
'User-Agent': 'Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.15) Gecko/20101027 Fedora/3.5.15-1.fc12 Firefox/3.5.15'},
{
'User-Agent': 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.551.0 Safari/534.10'},
{'User-Agent': 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.2) Gecko/2008092809 Gentoo Firefox/3.0.2'},
{
'User-Agent': 'Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.544.0'},
{'User-Agent': 'Opera/9.10 (Windows NT 5.2; U; en)'},
{
'User-Agent': 'Mozilla/5.0 (iPhone; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko)'},
{'User-Agent': 'Opera/9.80 (X11; U; Linux i686; en-US; rv:1.9.2.3) Presto/2.2.15 Version/10.10'},
{
'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5'},
{'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9b3) Gecko/2008020514 Firefox/3.0b3'},
{
'User-Agent': 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; fr) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16'},
{
'User-Agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20'},
{
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.2)'},
{'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux x86_64; en) Opera 9.60'},
{
'User-Agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.366.0 Safari/533.4'},
{'User-Agent': 'Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51'}
] return random.choice(user_agent_list) def main():
"""
主函数
:return: None
"""
print '''
____ _ ____
| _ \(_)_ __/ ___| ___ __ _ _ __
| | | | | '__\___ \ / __/ _` | '_ \
| |_| | | | ___) | (_| (_| | | | |
|____/|_|_| |____/ \___\__,_|_| |_| Welcome to WebDirScan
Version:1.0 Author: %s
''' % __author__
parser = OptionParser('python WebDirScanner.py -u <Target URL> -f <Dictionary file name> [-t <Thread_count>]')
parser.add_option('-u', '--url', dest='url', type='string', help='target url for scan')
parser.add_option('-f', '--file', dest='file_name', type='string', help='dictionary filename')
parser.add_option('-t', '--thread', dest='count', type='int', default=10, help='scan thread count')
(options, args) = parser.parse_args()
if options.url and options.file_name:
dirscan = WebDirScan(options)
dirscan.start()
sys.exit(1)
else:
parser.print_help()
sys.exit(1) if __name__ == '__main__':
main()
需要一个字典文件:
我存进去了一些,一部分是确定存在的目录
dict.txt
index.php
login
dvwa
phpMyAdmin
dav
twiki
login.php
结果:得到一个HTML文件:
<a href="http://192.168.232.129/twiki" target="_blank">http://192.168.232.129/twiki</a> </br><a href="http://192.168.232.129/index.php" target="_blank">http://192.168.232.129/index.php</a> </br><a href="http://192.168.232.129/phpMyAdmin" target="_blank">http://192.168.232.129/phpMyAdmin</a> </br>
脚本的使用:
Python开发网站目录扫描器的更多相关文章
- python网站目录扫描器2.0版
改进了上次乱的要死的. #网站目录扫描器2.0的脚本 import sys import requests import time print('[+]扫描中') def gfc(): f=open( ...
- [原创]Python入门到简单网站目录扫描器编写(上)
1.字符串,整型,浮点型.区别以及用法 |------字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 可以不严格的说,你可以认为引号包括的,都属于字符串 ...
- python 探测网站目录的GUI程序-乾颐堂
1.pyqt4写的界面 find_ui.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...
- python 开发搭建目录规范
软件目录结构规范有什么好处: 通过规范化,能够更好的控制软件结构,让程序具有更高的可读性. 项目目录组织结构如下: Foo/ # 项目名 --bin/ # 可执行文件目录 --foo # 可执行程序 ...
- Python开发【第一篇】:目录
本系列博文包含 Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习编程的童鞋提供一点帮助!!! Python开发[第一篇]:目录 Python开发[第二篇]:初识Python ...
- Python开发目录
Python开发目录 Python之三目运算符 Python之文件的基本操作
- python-模块入门二(模块循环导入,区分python文件的两种用途,模块搜索路径,软件开发的目录规范)
一.模块的循环导入问题 run.py # import m1 # 第一次导入 m1.py # 错误示范 ''' print('正在导入m1') from m2 import y #第一次导入m2 x= ...
- 【Python 开发】Python目录
目录: [Python开发]第一篇:计算机基础 [Python 开发]第二篇 :Python安装 [Python 开发]第三篇:python 实用小工具
- BT网站--Python开发爬虫代替.NET
BT网站-奥修磁力-Python开发爬虫代替.NET写的爬虫,主要演示访问速度和在一千万左右的HASH记录中索引效率. IBMID 磁力下载- WWW.IBMID.COM 现在用的是Python + ...
随机推荐
- mysql 索引及索引创建原则
是什么 索引用于快速的查询某些特殊列的某些行.如果没有索引, MySQL 必须从第一行开始,然后通过搜索整个表来查询有关的行.表越大,查询的成本越大.如果表有了索引的话,那么 MySQL 可以很快的确 ...
- (C#)日志接口请求响应时间
日志接口响应时间,记录接口请求信息,响应结果以及响应时间等.可以清楚的分析和了解接口状态. 如果一个一个地在接口下面做日志,那不是我们想要的结果.所以,我们选择做一个特性来控制接口要不要记录请求响应日 ...
- FPGA學習筆記(肆)--- Star Test Bench Template Writer
上一篇testbench我自己也沒怎麽搞懂,再來一篇學習特權同學的方法. 課程:Lesson 7 BJ EPM240学习板实验1——分频计数实验 鏈接:https://www.youtube.com/ ...
- SpringBoot图片上传
毕设终于写到头像上传了,本来想用Vue写来着,但是一直不顺利,还是对Vue用的不太熟.所以就用jquery写了. 首先添加以下标签 <img id="avatarPreview&quo ...
- 【转】Android总结篇系列:Activity启动模式(lauchMode)
[转]Android总结篇系列:Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些 ...
- 快速排序——JavaScript实现
基本原理: 1.从一个数组中任意挑选一个元素作为中轴元素: 2.将剩下的元素以中轴元素作为比较的标准,将小于等于中轴元素的放到中轴元素的左边,将大于中轴元素的放到中轴元素的右边: 3.以当前中轴元素的 ...
- 解决使用Mybatis 传入多参数使用map封装遇到的 “坑”问题
好久没来写些东西了,今天 我分享一下自己遇到的一个“小 坑”,这也许对您来说不是个问题,但是我还是希望对没有遇到过这类问题的朋友给个小小的帮助吧 是这样的,需求:需要实现根据多条件 且分页展示数据 1 ...
- Java整理
基础篇 1. 面向对象 2. Java平台 3. 值传递 4. 封装.继承.多态 5. 基本数据类型 6. Java 装箱和拆箱 7. String 8. Java关键字 9. 集合 ...
- DAO和service的解释
转自:http://blog.sina.com.cn/s/blog_4b1452dd0102wvox.html 我们都知道有了Hibernate后,单独对数据的POJO封装以及XML文件要耗损掉一个类 ...
- bootstrap-datepicker简单使用
粗略整理,可能存在其他的方式请大家多多指教 选择年份 html <div class="dropdown"> <label class="search- ...