Vxscan是用python3寫的綜合掃描工具,主要用來敏感檔案探測(目錄掃描與js洩露),WAF/CDN識别,端口掃描,指紋/服務識别,作業系統識别,弱密碼探測,POC掃描,SQL注入,繞過CDN,查詢旁站等功能。
安裝說明
要求Python版本大于3.6:
git clone https://github.com/al0ne/Vxscan
cd Vxscan
apt install libpq-dev nmap
wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz
解壓後将裡面的GeoLite2-City.mmdb放到vxscan/db/GeoLite2-City.mmdb。
pip3 install -r requirements.txt
主要功能
使用多線程掃描目錄;
使用笛卡爾乘積方式生成字典清單,支援自定義字典清單;
随機的UserAgent、XFF、X-Real-IP;
存活探測,對掃描目标先通過socket.gethostbyname判斷解析在通過ping判斷存活;
自定義404頁面識别,通路随機頁面然後通過difflib對比相似度,識别自定義302跳轉;
掃描目錄時先探測http端口,将一個主機多個http端口加入到掃描目标中;
過濾無效Content-Type,無效狀态嗎;
WAF/CDN探測,內建100+常見WAF與CDN指紋;
使用socket發包探測常見端口,發送不同payload探測端口服務指紋;
遇到全端口開放的主機(portspoof)自動跳過;
調用wappalyzer.json與WebEye判斷網站指紋,內建1200+常見指紋;
檢測到CDN或者WAF網站自動跳過;
調用nmap識别作業系統指紋;
根據端口開放調用弱密碼探測腳本(FTP/SSH/TELNET/Mysql/MSSQL…);
根據指紋識别或者端口調用POC掃描,或将IP開放的WEB端口上打一遍;
分析js檔案裡面的敏感資産資訊(域名、郵箱、apikey、password等);
抓取網站連接配接,測試SQL注入,LFI等;
調用一些線上接口擷取資訊,通過VT pdns判斷真實IP,通過www.yougetsignal.com、api.hackertarget.co查詢網站旁站。
使用方式
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
-f FILE, --file FILE read the url from the file
-t THREADS, --threads THREADS
Set scan thread, default 150
-e EXT, --ext EXT Set scan suffix, -e php,asp
-w WORD, --word WORD Read the dict 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
4.設定線程100,組合隻用php字尾,使用自定義字典
python3 vxscan.py -u http://www.xxx.com -e php -t 100 -w ../dict.txt
目錄結構
/
├─Vxscan.py 主檔案
├─db
│ ├─apps.json Web指紋資訊
│ ├─apps.txt Web指紋資訊(WEBEYE)
│ ├─password.txt 密碼字典
├─report 報告目錄
├─lib
│ ├─common.py 判斷CDN、端口掃描、POC掃描等
│ ├─color.py 終端顔色輸出
│ ├─active.py 判斷dns解析與ping ip存活
│ ├─save_html.py 生成html報表
│ ├─crack.py 測試弱密碼
│ ├─waf.py waf規則
│ ├─osdetect.py 作業系統版本識别
│ ├─random_header.py 自定義header頭
│ ├─scan_port.py 端口掃描腳本
│ ├─jsparse.py 抓取網站js連接配接,分析ip位址,連結,Email等
│ ├─settings.py 設定腳本
│ ├─pyh.py 生成html
│ ├─wappalyzer.py 指紋識别腳本
│ ├─SQLi.py 抓取網站連接配接,測試SQL注入腳本
├─script
│ ├─Poc.py Poc腳本
│ ├─......
├─requirements.txt
├─logo.jpg
├─error.log
配置檔案
修改lib/settings.py
# 全局逾時時間
TIMEOUT = 5
# 要排除的狀态嗎
BLOCK_CODE = [
301, 403, 308, 404, 405, 406, 408, 411, 417, 429, 493, 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'
]
# 是否跳過目錄掃描
SKIP = True
# 儲存的檔案名
html_name = time.strftime("%Y%m%d%H%M%S", time.localtime())
# shodan
shodan_api = ''
# VT接口
virustotal_api = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'
# 添加Cookie
COOKIE = {'Cookie': 'Vxscan 1.0'}
# 設定密碼
PASS = ['password']
POC編寫
案例1 根據端口開放或者指紋識别結果來調用POC
在script目錄下建立python檔案,定義好check函數,傳進來的參數主要是ip位址、端口清單、指紋識别清單,然後将結果return回去:
import pymongo
from lib.verify import verify
timeout = 2
vuln = ['27017', 'Mongodb']
def check(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 Probe
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(ip, ports, apps):
result = []
probe = Probe(ip, ports)
for i in probe:
out = get_title(i)
if out:
result.append(out)
return result
案例3 根據端口開放調用弱密碼探測:
from lib.verify import verify, GetHosts
import concurrent.futures
import pymysql
vuln = ['mysql', '3306']
user = ['root']
result = ''
def mysqlBruteforce(task):
global result
address, username, password = task.split('|')
try:
db = pymysql.connect(address, username, password, "mysql")
result = 'Mysql User: ' + username + ' Pass: ' + password
except:
pass
def check(ip, ports, apps):
global result
if verify(vuln, ports, apps):
# GetHosts會根據ip和使用者名還有lib/settings.py裡設定的密碼生成一個要爆破的清單,
hosts = GetHosts(ip, user)
with concurrent.futures.ThreadPoolExecutor(max_workers=40) as executor:
executor.map(mysqlBruteforce, hosts)
return result
http://www.45zq.cn/portal/article/index/id/145.html