python3写的综合扫描工具,主要用来存活验证,敏感文件探测(目录扫描/js泄露接口/html注释泄露),WAF/CDN识别,端口扫描,指纹/服务识别,操作系统识别,POC扫描,SQL注入,绕过CDN,查询旁站等功能,主要用来甲方自测或乙方授权测试,请勿用来搞破坏。
English | 简体中文
python3写的综合扫描工具,主要用来敏感文件探测(目录扫描与js泄露接口),WAF/CDN识别,端口扫描,指纹/服务识别,弱口令探测,POC扫描,SQL注入等功能。
2019.10.31
目录扫描使用了uvloop+asyncio+aiohttp
修复了一堆BUG
404页面验证添加了更多逻辑
2019.9.20
删除了暴力破解模块,速度实在是太慢了
修复了端口扫描和目录扫描的一部分BUG
修复了生成html报告空白问题,主要是没有转义
2019.8.19
添加了禁止扫描gov.cn与edu.cn域名,程序检测到会立即终止运行
修改了程序输出界面 改为时间+插件+域名+结果样式
删除了原来SQL注入插件,增加了弱口令探测插件(Mysql、Postgresql、SSH等)
将Fofa的指纹识别库与WEBEYE合并 指纹规则2000+条
2019.7.19
添加了socks5全局代理
封装了requests
优化了目录结构
删除了原来html报告,采用了从Perun里抽取的html报表
去掉了json结果输出,调整为存储到sqllite3数据库中,入库时进行去重,扫描时如果目标主机已存在db文件中则跳过
添加了phpinfo、leaks常见的信息泄露扫描插件
pdns加入viewdns.info接口
2019.7.1
显示ping检测失败的主机
-u 命令可以添加多个目标,用逗号隔开
修复指纹识别报错问题
2019.6.18
修复了指纹识别iis网站报错的问题,修改了apps.json
删除了一些容易引起错误的第三方库与脚本
扫描如果出现一闪而过就完成,那是因为程序首先检测dns解析与ping操作
第一次用Vxscan时,fake_useragent会加载这里的 https://fake-useragent.herokuapp.com/browsers/0.1.11 的ua列表,可能会出现加载超时错误
Python version > 3.6
requests
pyfiglet
fake-useragent
beautifulsoup4
pymysql
python-nmap
geoip2
tldextract
lxml
pymongo
virustotal_python
dnspython
pysocks
apt install nmap
wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz
After decompressing, put GeoLite2-City.mmdb inside to vxscan/data/GeoLite2-City.mmdb
wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-ASN.tar.gz
After decompressing, put the GeoLite2-ASN.mmdb inside to vxscan/data/GeoLite2-ASN.mmdb
pip3 install -r requirements.txt
python3 Vxscan.py -h
optional arguments:
-h, --help show this help message and exit
-u URL, --url URL Start scanning this url -u xxx.com
-i INET, --inet INET cidr eg. 1.1.1.1 or 1.1.1.0/24
-s SAVE, --save SAVE save in dbfile
-f FILE, --file FILE read the url from the file
1. 扫描一个网站
python3 vxscan.py -u http://www.xxx.com/
2. 从文件列表里扫描网站
python3 vxscan.py -f hosts.txt
3. 扫描一个C段
python3 vxscan.py -i 127.0.0.0/24
/
├─Vxscan.py 主文件
├─data
│ ├─path urls路径
│ ├─apps.json Web指纹信息
│ ├─apps.txt Web指纹信息(WEBEYE)
│ ├─GeoLite2-ASN.mmdb geoip
│ ├─GeoLite2-City.mmdb asn
├─doc 存放一些图片或者文档资源
├─report html报告相关内容
├─lib
│ ├─bcolor.py 终端颜色输出
│ ├─cli_output.py 终端输出
│ ├─common.py 判断CDN、端口扫描、POC扫描等
│ ├─iscdn.py 根据ip段和asn范围来判断IP是不是CDN
│ ├─options.py 选项设置
│ ├─random_header.py 自定义header头
│ ├─Requests.py 封装的requests库,做一些自定义设置
│ ├─settings.py 设置脚本
│ ├─sqldb.py 所有与sqlite3有关的都在这里
│ ├─url.py 对抓取的连接进行去重
│ ├─verify.py script脚本提供验证接口
│ ├─vuln.py 批量调用POC扫描
│ ├─waf.py waf规则
│ ├─webinfo.py web信息获取
├─script
│ ├─Poc.py Poc脚本
│ ├─......
├─Plugins
│ ├─ActiveReconnaissance
│ ├─active.py 判断主机存活并且验证dns解析
│ ├─check_waf.py 判断网站waf
│ ├─crawl.py 抓取网站连接并测试
│ ├─osdetect.py 操作系统识别
│ ├─InformationGathering
│ ├─geoip.py 地理位置查询
│ ├─js_leaks.py js信息泄露
│ ├─PassiveReconnaissance
│ ├─ip_history.py pdns接口
│ ├─reverse_domain.py 旁站查询
│ ├─virustotal.py VT Pdns查询
│ ├─wappalyzer.py CMS被动指纹识别
│ ├─Scanning
│ ├─async_scan 异步扫描
│ ├─dir_scan 目录扫描
│ ├─port_scan 端口扫描
├─requirements.txt
├─report.py html 报告生成
├─logo.jpg
├─error.log
# coding=utf-8
# 全局超时时间
TIMEOUT = 5
# 国家验证
VERIFY_COUNTRY = True
# 要排除的状态吗
BLOCK_CODE = [0, 308, 400, 401, 403, 404, 405, 406, 408, 410, 411, 417, 418, 429, 493, 500, 502, 503, 504, 999]
# 设置扫描线程
THREADS = 100
# 要排除的 内容类型
BLOCK_CONTYPE = [
'image/jpeg', 'image/gif', 'image/png', 'application/javascript', 'application/x-javascript', 'text/css',
'application/x-shockwave-flash', 'text/javascript', 'image/x-icon', 'x-icon'
]
# 是否启动目录扫描
SCANDIR = True
# 是否启动POC插件
POC = True
# 是否开启抓取插件
CRAWL = False
# 如果存在于结果db中就跳过
CHECK_DB = False
# 无效的404页面
PAGE_404 = [
'page_404"', "404.png", '找不到页面', '页面找不到', "Not Found", "访问的页面不存在",
"page does't exist", 'notice_404', '404 not found'
]
# ping探测
PING = True
# 设置代理
# SOCKS5 = ('127.0.0.1', 1080)
SOCKS5 = ()
# shodan
SHODAN_API = ''
# VT接口
VIRUSTOTAL_API = ''
# 设置cookie
COOKIE = 'random'
# COOKIE = {'Cookie': 'SRCtest'}
1. 根据端口开放或者指纹识别结果来调用POC
在script目录下新建python文件,定义好check函数,传进来的参数主要是ip地址、端口列表、指纹识别列表,然后将结果return回去:
import pymongo
from lib.verify import verify
timeout = 2
vuln = ['27017', 'Mongodb']
def check(url, ip, ports, apps):
# verify用来验证扫描列表中是否有Mongodb相关的结果,如果端口没有开启则不进行扫描
if verify(vuln, ports, apps):
try:
conn = pymongo.MongoClient(host=ip, port=27017, serverSelectionTimeoutMS=timeout)
database_list = conn.list_database_names()
if not database_list:
conn.close()
return
conn.close()
return '27017 MongoDB Unauthorized Access'
except Exception as e:
pass
2. 在目标IP开放的每个HTTP端口上遍历一遍
根据传递过来的端口服务列表生成要扫描的url,然后在每个web端口中去访问一遍,下面脚本会获取ip每个http端口的标题
from lib.verify import get_list
from lib.random_header import HEADERS
from lxml import etree
import requests
def get_title(url):
try:
r = requests.get(url, headers=HEADERS, timeout=3, verify=False)
html = etree.HTML(r.text)
title = html.xpath('//title/text()')
return url + ' | ' + title[0]
except:
pass
def check(url, ip, ports, apps):
result = []
probe = get_list(ip, ports)
for i in probe:
out = get_title(i)
if out:
result.append(out)
return result
如何添加指纹识别特征
修改data/apps.txt文件内容
1. 匹配HTTP Header头
Cacti|headers|Set-Cookie|Cacti=
2. 匹配HTTP响应体
ASP|index|index|<a[^>]?href=('|")[^http][^>]?.asp(?|#|\1)
3. 拆分Headers头,在k或者v中匹配
ThinkSNS|match|match|T3_lang