
Herramienta de escaneo integral escrita en Python3, utilizada principalmente para verificación de supervivencia, detección de archivos sensibles (escaneo de directorios, interfaces filtradas en JS, comentarios HTML), identificación de WAF/CDN, escaneo de puertos, reconocimiento de huellas/servicios, identificación de sistema operativo, escaneo de POC, inyección SQL, evasión de CDN, consulta de sitios vecinos, etc. Está destinada principalmente para autoevaluación del cliente o pruebas autorizadas por el contratista. No la use para actividades maliciosas.
English | 简体中文
Herramienta de escaneo integral en Python3, utilizada principalmente para la detección de archivos sensibles (escaneo de directorios y fuga de interfaces JS), identificación de WAF/CDN, escaneo de puertos, identificación de huellas/servicios, identificación del sistema operativo, detección de contraseñas débiles, escaneo POC, inyección SQL, evasión de CDN, verificación de sitios vecinos.
2019.8.19
Se añadió la prohibición de escanear dominios gov.cn y edu.cn; el programa lo detecta y finaliza inmediatamente.
Se modificó la interfaz de salida del programa al estilo: hora + plugin + dominio + resultado.
Se eliminó el plugin de inyección SQL original y se añadió un plugin de detección de contraseñas débiles (Mysql, Postgresql, SSH, etc.).
Se combinó la base de huellas de Fofa con WEBEYE. Regla de huellas 2000+.
2019.7.19
Se añadió proxy global socks5.
Se empaquetó requests.
Se optimizó la estructura de directorios.
Se eliminó el informe html original y se usó el informe html extraído de Perun.
Se eliminó la salida de resultados en json y se ajustó para almacenar en la base de datos sqllite3, eliminando duplicados al ingresar; si el host de destino ya existe en el archivo db durante el escaneo, se omite.
Se añadió el plugin de detección de fugas de información común como phpinfo, hojas de ruta.
Se añadió la interfaz de viewdns.info a PDNS.
2019.7.1
Se muestra el host cuyo ping falló.
El comando -u puede agregar múltiples objetivos separados por comas.
Se corrigió un error en la identificación de huellas.
2019.6.18
Se corrigió el problema de identificación incorrecta del sitio web iis, se modificó apps.json.
Se eliminaron algunas bibliotecas y scripts de terceros propensos a errores.
Si el escaneo parpadea al finalizar, es porque el programa primero detecta resolución DNS y operación ping.
La primera vez que se usa Vxscan, fake_useragent cargará la lista de ua de https://fake-useragent.herokuapp.com/browsers/0.1.11, y puede ocurrir un error de tiempo de espera de carga.
Versión de Python > 3.6
requests
pyfiglet
fake-useragent
beautifulsoup4
tldextract
python-nmap
geoip2
lxml
pymongo
virustotal_python
dnspython
pysocks
wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz
Después de descomprimir, coloca GeoLite2-City.mmdb en vxscan/data/GeoLite2-City.mmdb
wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-ASN.tar.gz
Después de descomprimir, coloca GeoLite2-ASN.mmdb en vxscan/data/GeoLite2-ASN.mmdb
pip3 install -r requirements.txt
python3 Vxscan.py -h
optional arguments:
-h, --help mostrar este mensaje de ayuda y salir
-u URL, --url URL Iniciar escaneo de esta url -u xxx.com
-i INET, --inet INET cidr ej. 1.1.1.1 o 1.1.1.0/24
-f FILE, --file FILE leer la url desde el archivo
1. Escanear un sitio web
python3 vxscan.py -u http://www.xxx.com/
2. Escanear un sitio web desde una lista de archivos
python3 vxscan.py -f hosts.txt
3. cidr ej. 127.0.0.0/24
python3 vxscan.py -i 127.0.0.0/24
├─Vxscan.py archivo principal
├─data
│ ├─apps.json Información de huellas web
│ ├─apps.txt Información de huellas web (WEBEYE)
│ ├─GeoLite2-ASN.mmdb geoip
│ ├─GeoLite2-City.mmdb asn
├─doc Almacenar imágenes o recursos de documentos
├─report Contenido relacionado con el informe html
├─lib
│ ├─common.py Determinar CDN, escaneo de puertos, escaneo POC, etc.
│ ├─color.py Salida de color en terminal
│ ├─cli_output.py Salida de terminal
│ ├─active.py Determinar resolución DNS y supervivencia IP por ping
│ ├─save_html.py Generar informes html
│ ├─waf.py Reglas WAF
│ ├─options.py Configuración de opciones
│ ├─iscdn.py Determinar si la IP es CDN basado en segmento IP y rango ASN
│ ├─osdetect.py Identificación de versión del sistema operativo
│ ├─random_header.py Cabecera personalizada
│ ├─settings.py Script de configuración
│ ├─vuln.py Llamada por lotes de escaneo POC
│ ├─url.py Eliminar duplicados de conexiones obtenidas
│ ├─verify.py Proporcionar interfaz de verificación
│ ├─sqldb.py Todo lo relacionado con sqlite3 está aquí
│ ├─Requests.py Biblioteca requests empaquetada, con algunas configuraciones personalizadas
├─script
│ ├─Poc.py Script POC
│ ├─......
├─Plugins
│ ├─ActiveReconnaissance
│ ├─active.py Determinar supervivencia del host y verificar resolución DNS
│ ├─check_waf.py Determinar WAF del sitio web
│ ├─crawk.py Rastrear enlaces del sitio web y probar
│ ├─osdetect.py Identificación del sistema operativo
│ ├─InformationGathering
│ ├─geoip.py Búsqueda de ubicación
│ ├─js_leaks.py Fuga de información en JS
│ ├─PassiveReconnaissance
│ ├─ip_history.py Interfaz PDNS
│ ├─reverse_domain.py Consulta de sitios vecinos
│ ├─virustotal.py Consulta VT Pdns
│ ├─wappalyzer.py Reconocimiento pasivo de huellas CMS
│ ├─Scanning
│ ├─dir_scan Escaneo de directorios
│ ├─port_scan Escaneo de puertos
├─requirements.txt
├─report.py Generación de informe html
├─logo.jpg
├─error.log
# coding=utf-8
# tiempo de espera global
TIMEOUT = 5
# Estados a excluir
BLOCK_CODE = [
301, 403, 308, 404, 405, 406, 408, 411, 417, 429, 493, 502, 503, 504, 999
]
# Establecer hilos de escaneo
THREADS = 100
# Content-Type a excluir
BLOCK_CONTYPE = [
'image/jpeg', 'image/gif', 'image/png', 'application/javascript',
'application/x-javascript', 'text/css', 'application/x-shockwave-flash',
'text/javascript', 'image/x-icon'
]
# Si se debe omitir el escaneo de directorios
SCANDIR = True
# Si se debe iniciar el plugin POC
POC = True
# Omitir si existe en la base de datos de resultados
CHECK_DB = False
# Página 404 inválida
PAGE_404 = [
'page_404"', "404.png", '找不到页面', '页面找不到', "Not Found", "访问的页面不存在",
"page does't exist", 'notice_404', '404 not found'
]
# ping
PING = True
# proxy socks5
# SOCKS5 = ('127.0.0.1', 1080)
SOCKS5 = ()
# shodan
SHODAN_API = ''
# VT
VIRUSTOTAL_API = ''
# cookie
COOKIE = {'Cookie': 'test'}
1. Llamar POC según la apertura de puertos o los resultados del reconocimiento de huellas
Cree un nuevo archivo python en el directorio script, defina la función check, los parámetros de entrada son principalmente la dirección ip, la lista de puertos y la lista de identificación de huellas, luego devuelva el resultado:
import pymongo
from lib.verify import verify
timeout = 2
vuln = ['27017', 'Mongodb']
def check(ip, ports, apps):
# Verify se utiliza para verificar si hay un resultado relacionado con Mongodb en la lista de escaneo. Si el puerto no está abierto, no se escanea.
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. Recorrer cada puerto HTTP abierto de la IP objetivo
Generar la url a escanear según la lista de servicios de puertos pasados, y luego visitarla en cada puerto web. El siguiente script obtendrá el título de cada puerto http de la ip.
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(ip, ports, apps):
result = []
probe = get_list(ip, ports)
for i in probe:
out = get_title(i)
if out:
result.append(out)
return result
Cómo agregar funciones de reconocimiento de huellas
Modifique el contenido del archivo data/apps.txt
1. Coincidir cabecera HTTP
Cacti|headers|Set-Cookie|Cacti=
2. Coincidir cuerpo de respuesta HTTP
ASP|index|index|<a[^>]?href=('|")[^http][^>]?.asp(?|#|\1)
3. Dividir cabeceras Headers para coincidir en k o v
ThinkSNS|match|match|T3_lang
360
360wzws
Anquanbao
Armor
BaiduYunjiasu
AWS WAF
AdNovum
Airee CDN
Art of Defence HyperGuard
ArvanCloud
Barracuda NG
Beluga CDN
BinarySEC
BlockDoS
Bluedon IST
CacheFly CDN
ChinaCache CDN
Cisco ACE XML Gateway
CloudFlare CDN
Cloudfront CDN
Comodo
CompState
DenyALL WAF
DenyAll
Distil Firewall
DoSArrest Internet Security
F5 BIG-IP APM
F5 BIG-IP ASM
F5-TrafficShield
Fastly CDN
FortiWeb
FortiWeb Firewall
GoDaddy
GreyWizard Firewall
HuaweiCloudWAF
HyperGuard Firewall
IBM DataPower
ISAServer
Immunify360
Imperva SecureSphere
Incapsula CDN
Jiasule
KONA
KeyCDN
ModSecurity
NGENIX CDN
NSFOCUS
Naxsi
NetContinuum
NetContinuum WAF
Neusoft SEnginx
Newdefend
Palo Alto Firewall
PerimeterX Firewall
PowerCDN
Profense
Qiniu CDN
Reblaze Firewall
SDWAF
Safe3
Safedog
SiteLock TrueShield
SonicWALL
SonicWall
Sophos UTM Firewall
Stingray
Sucuri
Teros WAF
Usp-Sec
Varnish
Wallarm
WatchGuard
WebKnight
West263CDN
Yundun
Yunsuo
ZenEdge Firewall
aesecure
aliyun
azion CDN
cloudflare CDN
dotDefender
limelight CDN
maxcdn CDN
mod_security
yunsuo
A continuación se muestran los resultados del sitio web de prueba del escáner AWVS

El reconocimiento de huellas utiliza principalmente Wappalyzer y WebEye:
https://github.com/b4ubles/python3-Wappalyzer
https://github.com/zerokeeper/WebEye
Poc referenciado:
Escáner BBscan https://github.com/lijiejie/BBScan
POC-T https://github.com/Xyntax/POC-T/tree/2.0/script
Perun https://github.com/WyAtu/Perun
Referencia al escaneo de puertos y juicio de servicios de anthx:
https://raw.githubusercontent.com/AnthraX1/InsightScan/master/scanner.py
Extracción de expresiones regulares de información sensible en Js:
https://github.com/nsonaniya2010/SubDomainizer
Reglas de juicio WAF usando waf00f y whatwaf:
https://github.com/EnableSecurity/wafw00f
https://github.com/Ekultek/WhatWaf
El informe html usa:
https://github.com/WyAtu/Perun
https://github.com/ly1102