935008ec3f
Añade el capability group `recon` (dominio cybersecurity + pipelines, Python),
con la política de archivado OSINT y página madre docs/capabilities/recon.md.
Lookups y sondeo (wrappers de CLI):
- whois_lookup, rdap_lookup, dns_records, ping_host, traceroute_host, nmap_scan
- save_scan_to_osint (sink común) + recon_osint (pipeline one-shot scan+archivado)
Escaneo de puertos/servicios nativo (stdlib, sin nmap ni sudo):
- scan_tcp_ports: connect-scan TCP concurrente (open/closed/filtered)
- grab_service_banner: banner grab + identificación de servicio/versión real
- identify_port_service: puro, puerto -> servicio IANA esperado (~120 puertos)
- scan_port_services: pipeline one-shot (scan -> identify + banner por puerto abierto)
Fingerprint de tecnología web (estilo Wappalyzer), patrón pura/impura:
- fetch_http_fingerprint: GET stdlib, recoge headers/html/cookies (solo nombres)
- detect_web_tech: puro, matchea ~50 firmas regex -> tecnologías por categoría
- fingerprint_web_stack: pipeline one-shot url -> tecnologías
Todas devuelven dict {status} sin lanzar. Tests: 43 verdes, sin red externa.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8.2 KiB
8.2 KiB
name, kind, lang, domain, version, purity, signature, description, tags, params, output, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path
| name | kind | lang | domain | version | purity | signature | description | tags | params | output | uses_functions | uses_types | returns | returns_optional | error_type | imports | tested | tests | test_file_path | file_path | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| nmap_scan | function | py | cybersecurity | 1.1.0 | impure | def nmap_scan(target: str, profile: str = 'quick', ports: str | None = None, extra_args: list[str] | None = None, out_dir: str | None = None, timeout_s: int = 1800, confirm: bool = False, allowlist: list[str] | None = None) -> dict | Wrapper de `nmap` por perfiles para reconocimiento de red. Ejecuta nmap como subprocess forzando salida XML (-oX), la parsea con ElementTree y devuelve puertos abiertos y hosts vivos de forma estructurada. Funcion estrella de recon: corre en primer plano (quick, top1000, service) y segundo plano para scans largos (full-tcp, vuln, udp-top). NO lanza: devuelve dict status ok/error. Sin sudo por defecto (connect-scan TCP). |
|
|
dict. ok: {status:'ok', target, profile, command (cmd ejecutado), open_ports:[{port:int,proto,state,service,product,version}] (solo open/open|filtered), hosts_up:[ips] (host discovery), host_status, xml_path (siempre presente), raw (stdout de nmap, siempre presente), elapsed_s:float, started (ISO)}. error: {status:'error', error:str}. Si el guard rechaza el target (publico/desconocido sin confirm ni allowlist) el error tambien incluye needs_confirm:True. Nunca lanza excepciones. | false | error_py_core | true |
|
python/functions/cybersecurity/nmap_scan_test.py | python/functions/cybersecurity/nmap_scan.py |
Ejemplo
import sys, os
sys.path.insert(0, os.path.join("python", "functions"))
from cybersecurity import nmap_scan
# 1) Scan rapido en primer plano contra el host oficial de pruebas de nmap
# (scanme.nmap.org es legal escanear).
res = nmap_scan("scanme.nmap.org", profile="quick", timeout_s=120)
if res["status"] == "ok":
for p in res["open_ports"]:
print(p["port"], p["proto"], p["service"], p["product"], p["version"])
else:
print("error:", res["error"])
# 2) Scan LARGO de los 65535 puertos TCP guardando el XML en out_dir.
# Lanzar en segundo plano (background) por la duracion; el XML queda en disco.
res = nmap_scan(
"scanme.nmap.org",
profile="full-tcp",
out_dir="/tmp/nmap-runs",
timeout_s=7200, # 2h: full-tcp puede tardar minutos a horas
allowlist=["scanme.nmap.org"], # autorizado -> pasa el guard sin confirm
)
print(res["status"], res.get("xml_path"))
# 3) Guard de seguridad: un target publico SIN confirm ni allowlist se rechaza.
res = nmap_scan("8.8.8.8") # publico, sin confirm
print(res["status"], res.get("needs_confirm")) # "error" True
# Para escanear un publico autorizado: confirm=True (o anadirlo a allowlist).
res = nmap_scan("8.8.8.8", confirm=True)
# Un target privado/local NO requiere confirm:
res = nmap_scan("192.168.1.10") # procede directamente
Cuando usarla
Usala para el reconocimiento de puertos y servicios de un host: mapear la
superficie de ataque antes de un pentest autorizado, descubrir que servicios
y versiones expone una IP, o barrer una subred con profile="discovery" para
ver que hosts estan vivos. Es la funcion estrella de recon del registry.
Para scans largos (full-tcp, vuln, udp-top) lanza la llamada en SEGUNDO
PLANO: tardan de minutos a horas. Pasa out_dir para conservar el XML en disco
y sube timeout_s (p.ej. 7200) para que no aborte por timeout.
Gotchas
- GUARD anti-escaneo no autorizado: por defecto (
confirm=False) la funcion RECHAZA con status error +needs_confirm=Truecualquier target que no sea claramente privado/local (rangos privados, loopback, link-local,localhost,*.local/.lan/.internal/.home/.corp). Para escanear un target publico o un hostname desconocido tienes que pasarconfirm=Trueo incluirlo enallowlist(match exacto o por sufijo). El guard NO hace DNS lookup (sin red, KISS): un hostname publico se considera "indecidible" y cae al lado seguro (requiere confirm). Esto NO sustituye tu responsabilidad legal — solo evita disparos accidentales contra infra ajena. - LEGAL: solo escanea hosts que sean tuyos o para los que tengas autorizacion
explicita.
scanme.nmap.orges el host oficial de pruebas de nmap, legal escanear; cualquier otro objetivo de terceros sin permiso puede ser delito. - Privilegios: los perfiles
os(-O),udp-top(-sU) y parte deaggressive(-O interno) requieren sudo/root. Sin privilegios nmap cae a connect-scan TCP (-sT) y esos modos fallan o quedan incompletos — esta funcion no usa sudo. - Duracion:
full-tcp(65535 puertos),vuln(scripts NSE) yudp-top(UDP es lento) tardan minutos a horas. Subetimeout_sy/o lanza en background conout_dir; superartimeout_sdevuelve status error. - Deteccion: firewalls / IDS / WAF pueden detectar y bloquear el escaneo (sobre
todo
aggressive,vulny-T4). El resultado puede venir filtrado o incompleto si el objetivo defiende activamente. discovery(-sn) espera notacion de host o subred en CIDR (ej. "192.168.1.0/24"); pueblahosts_up, noopen_ports.- No lanza excepciones: siempre revisa
res["status"]antes de leeropen_ports/hosts_up.rawyxml_pathsolo estan garantizados en ok.
Capability growth log
- v1.1.0 (2026-06-14) — guard
confirm/allowlistanti-escaneo-no-autorizado: targets publicos/desconocidos se rechazan (status error + needs_confirm) salvo confirm=True o estar en allowlist; privados/local proceden sin confirm. Sin DNS lookup. Anadidos tests (8 casos: parseo XML, guard publico/privado/confirm/ allowlist, perfil invalido, target vacio, clasificacion _target_is_private).