
Knock Subdomain Scan
✅ Rápido y Async • 🔐 Recon + Fuerza Bruta • 🔧 Fácil de Extender
KnockPy es una herramienta modular de Python 3 para enumerar subdominios mediante reconocimiento pasivo y fuerza bruta, ahora con soporte async/await, rendimiento mejorado y manejo moderno de HTTP/TLS.
httpx y resolución DNS--verbose diagnóstico de un solo dominio (DNS/TCP/TLS/cadenas de redirección/errores de solicitud + comprobaciones de seguridad)show/delete/export/search)git clone https://github.com/guelfoweb/knockpy.git
cd knockpy
# recomendado: instalar en un entorno virtual
python3 -m venv .venv
. .venv/bin/activate
python3 -m pip install -U pip
pip install .
# alternativa: instalar para el usuario actual (sin venv)
# python3 -m pip install --user .
⚠️ Versión de Python recomendada: 3.9+
El código está organizado por responsabilidad, con fachadas estables para compatibilidad hacia atrás:
knockpy/
cli.py # Punto de entrada CLI (fachada/orquestación)
cli_parts/
status.py # renderizado del panel de estado/ejecución
setup.py # configuración interactiva y valores predeterminados persistentes en tiempo de ejecución
report.py # modo informe interactivo
scan_flow.py # reglas de exclusión, prueba de reconocimiento, ayudantes de comodín
core.py # fachada principal pública (compatibilidad)
engine/
runtime.py # implementación del motor de escaneo
storage.py # fachada de almacenamiento público (compatibilidad)
storage_parts/
db.py # persistencia/configuraciones SQLite
export.py # orquestación de exportación de informes
html_report.py # renderizado de informes HTML
output.py # renderizado de salida en terminal
server_versions.py # catálogo de versiones de servidores web
knockpy.py # exportaciones del módulo de compatibilidad
Nota de compatibilidad:
import knockpy o from knockpy import KNOCKPY.engine/, cli_parts/ y storage_parts/.Solo después de que la versión estable se publique en GitHub
pip install knock-subdomains
knockpy -d dominio.com [opciones]
--threads y --timeoutEstas dos opciones tienen el mayor impacto en el tiempo de ejecución para escaneos grandes.
--threads controla la concurrencia (cuántos objetivos se procesan en paralelo)--timeout controla cuánto tiempo espera cada paso de red antes de rendirseCompromiso:
threads más alto = escaneos más rápidos, pero más carga en CPU/red/DNS y mayor riesgo de límites de tasa remotostimeout más bajo = escaneos más rápidos, pero mayor riesgo de perder objetivos lentos pero válidos (falsos negativos)Perfiles recomendados:
--threads 50 --timeout 5--threads 150 --timeout 4--threads 250 --timeout 3Si necesitas velocidad y completitud en listas muy grandes, usa una estrategia de 2 pasadas:
--threads 250 --timeout 3--threads 80 --timeout 5 (o más alto)Notas:
--setup) anulan los valores predeterminados incorporadosthreads=250, timeout=3knockpy -d example.com --recon --bruteforce
knockpy -d example.com --recon --test
knockpy --update-versions
knockpy --check-update
En la primera ejecución, KnockPy crea:
~/.knockpy/recon_services.json
Puedes agregar/deshabilitar fuentes editando el array services.
También puedes apuntar a una ruta de archivo personalizada sin cambiar código:
export KNOCK_RECON_SERVICES=/ruta/a/recon_services.json
Cada servicio soporta:
nameenabled (true/false)parserurl_template (soporta {domain}, {virustotal_key}, {shodan_key})requires_api (virustotal o shodan, opcional)Analizadores soportados:
csv_first_columnrapiddns_html_tdjson_listvirustotal_subdomainsshodan_subdomainsecho "example.com" | knockpy -d
export API_KEY_VIRUSTOTAL=tu-clave-api-virustotal
export API_KEY_SHODAN=tu-clave-api-shodan
Puedes usar archivo .env:
API_KEY_VIRUSTOTAL=tu-clave-api-virustotal
API_KEY_SHODAN=tu-clave-api-shodan
knockpy -d example.com --recon --bruteforce
knockpy --report list
knockpy --report latest
knockpy --report
Menú de informe interactivo:
1 show2 delete3 export4 search0 reset db (pide confirmación explícita)Salir del modo informe:
Enter en el mensaje de acción vacíoCTRL+Cknockpy -d forum.example.com --verbose
knockpy -d example.com --wildcard
KnockPy se puede usar como módulo de Python:
import knockpy
result = knockpy.KNOCKPY("example.com", timeout=5.0, threads=20)
print(result["domain"], result["ip"])
o:
from knockpy import KNOCKPY
domain = 'example.com'
results = KNOCKPY(
domain,
dns="8.8.8.8",
useragent="Mozilla/5.0",
timeout=5,
threads=10,
recon=True,
bruteforce=True,
wordlist=None,
silent=False
)
for entry in results:
print(entry['domain'], entry['ip'], entry['http'], entry['cert'])
Se incluye una lista de palabras predeterminada en knockpy/wordlist/wordlist.txt.
Puedes proporcionar la tuya propia con --wordlist.
python3 -m pytest
# (opcional) ejecución de prueba del script de ejemplo
python3 examples/poc.py
Licenciado bajo la licencia GPLv3.
Gianni Amato (@guelfoweb)
| Flag | Descripción |
|---|
-d, --domain | Dominio objetivo (o stdin si se usa sin valor) |
-f, --file | Archivo con lista de dominios |
--recon | Habilita reconocimiento pasivo |
--bruteforce, --brute | Habilita fuerza bruta usando lista de palabras |
--exclude TIPO VALOR | Excluir coincidencias (status, length/lenght, body) |
--verbose | Diagnóstico profundo solo para escaneos de un solo dominio |
--wildcard | Probar DNS comodín y salir |
--test | Con --recon, probar cada fuente de reconocimiento (falló/vacía/datos) |
--setup | Configuración interactiva (valores predeterminados de ejecución + claves API en DB) |
--update-versions | Actualizar catálogo local de versiones más recientes de servidores web |
--report [ID|latest|list] | Modo informe (mostrar/eliminar/exportar/buscar/resetear db interactivo, exportar HTML) |
--check-update | Verificar en línea si hay una versión más reciente de Knockpy disponible en PyPI |
--wordlist | Sobrescribir lista de palabras en tiempo de ejecución |
--dns | Sobrescribir resolutor DNS en tiempo de ejecución |
--useragent | Sobrescribir agente de usuario HTTP en tiempo de ejecución |
--timeout | Sobrescribir tiempo de espera en tiempo de ejecución (segundos) |
--threads | Sobrescribir trabajadores concurrentes en tiempo de ejecución |
--silent | Ocultar barra de progreso |
--json | Salida solo JSON (fuerza --silent) |
--status | Imprimir estado de ejecución y continuar |
-h, --help | Mostrar mensaje de ayuda |