
Busca y descarga exploits públicos de la base de datos de Vulners — en línea, o totalmente sin conexión desde un índice local SQLite FTS5.
<div align="center">
# Getsploit
**Busca y descarga exploits públicos de la base de datos de [Vulners](https://vulners.com) —
en línea, o totalmente sin conexión desde un índice local.**
[](https://pypi.org/project/getsploit/)
[](https://pypi.org/project/getsploit/)
[](https://pepy.tech/project/getsploit)
[](https://github.com/vulnersCom/getsploit/stargazers)
[](https://github.com/vulnersCom/getsploit/actions/workflows/ci.yml)
[](https://github.com/vulnersCom/getsploit/actions/workflows/codeql.yml)
[](https://scorecard.dev/viewer/?uri=github.com/vulnersCom/getsploit)
[](https://github.com/vulnersCom/getsploit/actions/workflows/ci.yml)
[](https://peps.python.org/pep-0561/)
[](https://github.com/astral-sh/ruff)
[](https://github.com/astral-sh/uv)
[](LICENSE)
[Obtén una clave API](https://vulners.com/userinfo) ·
[Búsqueda de Vulners](https://vulners.com/search) ·
[Registro de cambios](https://github.com/vulnerscom/getsploit/blob/master/CHANGELOG.md) ·
[Arquitectura](https://github.com/vulnerscom/getsploit/blob/master/ARCHITECTURE.md) ·
[Política de seguridad](https://github.com/vulnerscom/getsploit/blob/master/SECURITY.md)
<img src="https://assets.kitploit.com/production/public/readmes/1237/6911a453ad43c32e26b89a2a3895cd81e60e83924db87967199871d7b07089e9.gif"
alt="Getsploit buscando en línea, creando un índice FTS5 local y luego buscando y reflejando sin conexión"
width="900">
</div>
---
## Por qué Getsploit
- 🔎 **Una consulta, todas las colecciones.** Exploit-DB, Metasploit, Packet Storm, Zero Day
Initiative, pruebas de concepto de GitHub y más, todo indexado por Vulners.
- 📴 **Funciona sin conexión de red.** Un solo `--update` crea un índice FTS5 local de SQLite
con todo el corpus de exploits; cualquier búsqueda posterior es una consulta local.
- 🧠 **Busca lo que escribiste.** `wordpress 4.7`, `CVE-2024-3094` y `ms17-010`
coinciden literalmente, mientras que una expresión de texto completo deliberada sigue usando toda la sintaxis de FTS5.
- 📊 **Progreso en el que puedes confiar.** Cada etapa de una actualización informa cifras reales, y las
dos etapas cuyo tamaño no se puede conocer lo dicen explícitamente en lugar de inventar un porcentaje.
- 🧾 **Amigable con tuberías (pipes).** JSON, JSON Lines y registros estables separados por tabulaciones cuando la
salida se redirige. Ningún color ni decoración llega jamás a un formato de máquina.
- 💾 **Conserva la fuente.** `--mirror` escribe el cuerpo de cada exploit en su propio archivo.
- 🔐 **Cuidado con tus datos.** La clave nunca es un argumento de línea de comandos, el archivo
de clave se abre sin seguir enlaces simbólicos y el contenido descargado nunca se ejecuta.
- 🧪 **Verificado.** 100 % de cobertura de sentencias y ramas en Python 3.11 a 3.14, en
Linux, macOS y Windows.
---
## Instalación
Getsploit necesita Python 3.11 o superior.
```console
$ pipx install getsploit
```
```console
$ uv tool install getsploit
```
```console
$ python -m pip install getsploit
```
## Clave API
Crea una clave en tu [cuenta de Vulners](https://vulners.com/userinfo) y luego expónla
a través del entorno:
```console
$ export VULNERS_API_KEY="your-key" # pragma: allowlist secret
```
```powershell
$env:VULNERS_API_KEY = "your-key" # pragma: allowlist secret
```
`getsploit --set-key` guarda una clave mediante un aviso de confirmación que oculta la entrada, en un archivo
privado dentro del directorio de Getsploit. El entorno tiene prioridad sobre ese archivo y es
la mejor opción para la automatización. No existe la opción `--api-key`: una clave pasada por la
línea de comandos termina en el historial del shell y en la lista de procesos.
La búsqueda en línea y `--update` necesitan una clave. `--local` y `--status` no.
## Uso
### Búsqueda en línea
```console
$ getsploit CVE-2024-3094
$ getsploit "wordpress 4.7 remote code execution" --count 25
```
La consulta llega a Vulners sin cambios, por lo que su
[sintaxis de Lucene](https://vulners.com/docs) funciona tal como está documentada:
```console
$ getsploit 'title:wordpress AND description:"code execution"'
```
`--count` por encima de 100 se pagina de forma transparente; una sola respuesta de la API nunca contiene más
de 100 documentos.
### Búsqueda sin conexión
```console
$ getsploit --update # descarga el archivo y crea el índice FTS5
$ getsploit --status # dónde está, cuánto ocupa, cuántos documentos tiene
$ getsploit --local wordpress 4.7
```
Las palabras de búsqueda normales se comparan literalmente, por lo que los identificadores y números de versión funcionan tal
como se escriben: `wordpress 4.7`, `CVE-2024-3094`, `ms17-010`. Una consulta que usa filtros de columna,
operadores booleanos, comillas, paréntesis, `*` o `^` se trata como una
[expresión FTS5 de SQLite](https://www.sqlite.org/fts5.html) y notifica su propio error
cuando está mal formada:
```console
$ getsploit --local 'title:eternalblue AND NOT description:metasploit'
```
Las columnas en las que se puede buscar son `id`, `title`, `published`, `description` y `source_data`. La
grafía heredada `sourceData:` todavía se acepta.
### Guardar fuentes de exploits
```console
$ getsploit --mirror wordpress 4.7
$ getsploit --local --mirror eternalblue
```
Los archivos se guardan en un directorio derivado de la consulta, un archivo por exploit, creado
sin seguir enlaces simbólicos y sin sobrescribir nunca nada que ya exista.
> [!WARNING]
> Los archivos reflejados son código de terceros no confiable. Léelos antes de ejecutarlos.
### Salida legible por máquina
```console
$ getsploit --format json CVE-2024-3094
$ getsploit --format jsonl wordpress | jq -r .id
$ getsploit wordpress > results.tsv # la salida redirigida está separada por tabulaciones
```
`--json` sigue siendo un alias de `--format json`.
### Control de terminal
```console
$ getsploit --color always query | less -R
$ getsploit --color never query
```
El color predeterminado es `auto`. Una terminal ancha muestra una tabla, una estrecha muestra
registros apilados y una secuencia redirigida obtiene valores separados por tabulaciones: los mismos datos en los tres casos.
Ejecuta `getsploit --help` para ver la lista completa de opciones.
## La base de datos local
| | |
| --- | --- |
| Ubicación | `~/.getsploit/getsploit.db`, o `$GETSPLOIT_HOME` |
| Formato | SQLite con un índice FTS5 de contenido externo |
| Tokenizador | `unicode61 remove_diacritics 2` |
| Tamaño | aproximadamente 1.7 GB para el corpus completo |
| Actualización | atómica: la nueva base de datos reemplaza a la anterior en una sola operación |
Una actualización descarga el archivo mediante ocho conexiones de rango en paralelo, lo descomprime y
convierte junto al destino, lo verifica y solo entonces confirma el cambio. El uso de memoria no
depende del tamaño del archivo. Una búsqueda que ya se esté ejecutando contra la base de datos anterior
termina contra ella sin interrupciones.
Las bases de datos creadas por Getsploit 2.x siguen siendo consultables; el siguiente `--update` las migra
de FTS4 a FTS5. Las expresiones de proximidad de FTS4 como `one NEAR/5 two` deben reescribirse
en la forma `NEAR(...)` de FTS5.
## Compatibilidad
| | |
| --- | --- |
| Python | 3.11, 3.12, 3.13, 3.14 |
| Sistemas operativos | Linux, macOS, Windows |
| SDK de Vulners | 4.1 y versiones 4.x posteriores |
| Dependencias de ejecución | `click`, `rich`, `vulners` |
## Desarrollo
```console
$ git clone https://github.com/vulnersCom/getsploit.git
$ cd getsploit
$ uv sync --all-groups
$ make check
```
| Comando | Propósito |
| --- | --- |
| `make format` | Formatear y corregir automáticamente los archivos fuente |
| `make lint` | Verificar formato, lint y tipos |
| `make test` | Ejecutar las pruebas en paralelo |
| `make coverage` | Exigir 100 % de cobertura de sentencias y ramas |
| `make leaks` | Escanear archivos rastreados en busca de secretos |
| `make build` | Compilar la rueda (wheel) y la distribución de código fuente |
| `make release` | Ejecutar todos los controles y validar ambas distribuciones |
| `make check` | Todo lo anterior que condiciona una fusión (merge) |
[CONTRIBUTING.md](https://github.com/vulnerscom/getsploit/blob/master/CONTRIBUTING.md) contiene las reglas de contribución y
[ARCHITECTURE.md](https://github.com/vulnerscom/getsploit/blob/master/ARCHITECTURE.md) los límites de los módulos y los invariantes de la base de datos.
Una versión (release) es una etiqueta `v<version>` enviada al repositorio. A partir de ahí,
[el flujo de trabajo de publicación](https://github.com/vulnerscom/getsploit/blob/master/.github/workflows/release.yml) vuelve a ejecutar todos los controles sobre el
commit etiquetado, publica en PyPI mediante publicación confiable (trusted publishing) y escribe la versión
de GitHub a partir del registro de cambios. No existe ningún token de PyPI que pueda filtrarse.
## Seguridad
Los archivos fuente de exploits son contenido no confiable: revísalos antes de abrirlos o ejecutarlos.
Getsploit nunca ejecuta lo que descarga.
Las versiones se publican desde GitHub Actions mediante la publicación confiable de PyPI, por lo que
no existe ningún token de API de larga duración que pueda filtrarse, y cada artefacto lleva una atestación
de procedencia de compilación. Para reportar una vulnerabilidad en Getsploit, sigue [SECURITY.md](https://github.com/vulnerscom/getsploit/blob/master/SECURITY.md).
## Licencia
[MIT](https://github.com/vulnerscom/getsploit/blob/master/LICENSE) © Vulners Team y colaboradores.