
Wrapper de Python alrededor de masscan y nmap para descubrimiento de puertos a gran escala, descubrimiento de hosts, banner grabbing y escaneo de vulnerabilidades basado en NSE en redes internas o externas.
Este script es un wrapper para masscan y nmap. nmap se encarga del descubrimiento de hosts y (para escaneos más pequeños) del descubrimiento de puertos, la captura de banners de servicios y los scripts NSE. Masscan se utiliza para el descubrimiento de puertos a gran escala, donde la velocidad bruta es importante. Instala ambos desde tu gestor de paquetes favorito o desde el código fuente.
Se requiere Python 3.8+ (requires-python en pyproject.toml; la CI establece el mínimo en 3.8).
SpooNMAP puede ejecutarse directamente desde un checkout — no se necesita ningún paso de instalación, consulta "Uso" más abajo — o instalarse como un comando independiente con uv:
uv tool install git+https://github.com/trustedsec/spoonmap
Esto coloca un ejecutable spoonmap en tu PATH, por lo que puedes invocarlo como
spoonmap desde cualquier directorio en lugar de clonar el repositorio y ejecutar
./spoonmap.py. No existe un paquete en PyPI — este proyecto nunca se ha
publicado en pypi.org, y el comando anterior se instala directamente desde el
repositorio git. Usa la forma completa git+https://... mostrada arriba, no un
simple uv tool install spoonmap; a lo que sea que ese nombre resuelva en PyPI, ahora
o en el futuro, no es este proyecto.
Para actualizar al último commit:
uv tool upgrade spoonmap
Instalar de esta manera no hace que SpooNMAP sea un escáner autocontenido:
masscan y nmap siguen siendo herramientas del sistema independientes que deben instalarse
de forma independiente (ver "Dependencias" arriba), exactamente igual que cuando se ejecuta desde un
checkout — uv tool install solo empaqueta el propio código Python de SpooNMAP y sus
scripts NSE incluidos, no los binarios externos que invoca.
Lo único que vale la pena entender antes de instalar de esta manera: el módulo Python de un
spoonmap instalado vive donde sea que uv haya colocado su entorno de herramienta gestionado — no en un directorio en el que alguna vez pensarías buscar
un archivo de configuración o la salida de un escaneo. Ese es exactamente el escenario del que trata la sección "Dónde viven los archivos"
a continuación — lee esa sección para saber qué se resuelve contra
tu directorio actual y por qué; instalar mediante uv tool install no
cambia la regla, solo hace que la regla importe, ya que no queda ningún directorio de checkout
al que una ruta de configuración o de salida pueda recurrir por costumbre.
Simplemente ejecutar el script te solicitará todas las opciones requeridas.
config.json, los archivos de objetivos/exclusiones y la salida del escaneo se resuelven contra
el directorio desde el que ejecutas el comando — consulta "Dónde viven los archivos" a continuación si
tu salida no está donde esperas, especialmente si estás acostumbrado a invocar
SpooNMAP por ruta desde fuera de su propio directorio.
Si usas uv, puedes ejecutarlo sin un entorno virtual separado:
uv run spoonmap.py
O invócalo directamente si el script es ejecutable:
# ./spoonmap.py
________ _____ _______ _________________
__ ___/______________________ | / /__ |/ /__ |__ __ \
_____ \___ __ \ __ \ __ \_ |/ /__ /|_/ /__ /| |_ /_/ /
____/ /__ /_/ / /_/ / /_/ / /| / _ / / / _ ___ | ____/
/____/ _ .___/\____/\____//_/ |_/ /_/ /_/ /_/ |_/_/
/_/
Service Categories (comma-separated numbers, default: All)
(1) Web [80, 443, 7001, 7002, 8000, 8080, 8081, 8443, 8888, 9090, 10443]
(2) Database [1433, U:1434, 1521, 3306, 5432, 6379, 9200, 27017]
(3) Remote Management [22, 23, 3389, 5900, 5901, 6129, 1723, 5985, 5986]
(4) Email [25, 110, 143, 465, 587, 993, 995]
(5) LDAP [389, 636]
(6) Network Infrastructure [53, 179, U:500, U:161, U:623, U:631, U:1194, 1194]
(7) File Transfer [21, 111]
(8) SMB [445, 135, 139, U:137]
(9) Specialized [1090, 3300, 4786, 6970, 2375, 4243, 9100, 8530, 8531]
(10) Containers & Debuggers [2377, 10250, 8001, 9229, 2345, 5005, 61616, 8009, 6000]
(11) Local LLM [11434, 1234, 7860, 5000, 5001, 1337, 3000, 8000, 8080]
(12) Full Port Scan [1-65535, TCP only — no UDP]
(c) Custom Port Scan [enter your own comma-separated ports]
(The Full Port Scan number increments automatically with the number of categories.)
**Full Port Scan is TCP only.** It sweeps TCP 1-65535 and runs no UDP discovery at
all, so every `U:` port listed in the categories above — SNMP (U:161), IKE (U:500),
IPMI (U:623), IPP (U:631), OpenVPN (U:1194), NetBIOS (U:137), SQL Browser (U:1434) —
is skipped, along with the NSE scripts and findings that depend on them. It is
*wider* than All on TCP and *narrower* on UDP. For both, run All and Full as two
passes, or use the Custom option with the UDP ports appended
(e.g. `1-65535,U:161,U:500,U:623`).
Which categories would you like to scan (e.g. 1,3 — default: All)?
Would you like to enumerate service banners for any identified services (default: Yes)?
Would you like to run NSE security scripts on identified services (default: No)?
Target Scan
(1) External
(2) Internal
Is this an internal or external scan (default: External)?
How fast would you like to scan (default: 20000 packets/second)?
Please enter the full path for the file containing target hosts (default: /opt/spoonmap/ranges.txt):
Would you like to exclude any hosts? (default: No)
Run host discovery before port scanning (default: Yes)?
Tune advanced settings (nmap threads, masscan batch size, nmap work-unit threshold)? (default: No)
También puedes crear un archivo config.json (basado en config.json.sample) para omitir todos los avisos:
{
"scan_categories": ["Web", "Database", "Remote Management"],
"banner_scan": "True",
"script_scan": "False",
"host_discovery": "True",
"target_scan": "Internal",
"max_rate": "2000",
"target_file": "ranges.txt",
"output_path": "./",
"exclusions_file": "exclusions.txt",
"nmap_threads": 5,
"masscan_batch_size": 5,
"nmap_threshold": 5000000
}