Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
AfterLife — Laboratorio de detección de persistencia de revocación: cuando el restablecimiento de contraseña tiene éxito pero el atacante nunca se va. Reproduce el fallo de revocación condicional de Strapi CVE-2026-22706, su corrección, un paquete de detección de tres reglas y la regla ingenua que no lo detecta. | Kitploit
Herramientas/GitHubGitHub/het-p301204/afterlife
Herramientas DefensivasAnálisis de VulnerabilidadesSeguridad WebAutenticaciónAprendizaje y EducaciónRed TeamingRespuesta a IncidentesLabs y Práctica
GitHubhet-p301204/afterlife

AfterLife

Ver Repositorio
hace 12h 41mAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →

Acerca de

Laboratorio de detección de persistencia de revocación: cuando el restablecimiento de contraseña tiene éxito pero el atacante nunca se va. Reproduce el fallo de revocación condicional de Strapi CVE-2026-22706, su corrección, un paquete de detección de tres reglas y la regla ingenua que no lo detecta.

Compartir

AFTERLIFE

Laboratorio de Detección de Persistencia de Revocación

Cuando el restablecimiento de contraseña tiene éxito pero el atacante nunca se va.

Un laboratorio local red/blue para una clase de vulnerabilidad: la credencial que sobrevive al evento que se suponía debía eliminarla. Incluye el exploit, la causa raíz, la solución, un paquete de detección de tres reglas, una auditoría de estado para lo que las reglas estructuralmente no pueden ver, una consola forense — y la regla de detección que no funciona, conservada en el repositorio para ser demostrada fallando.

CI tests python rules OWASP CWE

license

Inicio rápido · El hallazgo · Por qué la detección ingenua falla · El paquete de reglas · Consola · La solución · Matriz · Pruebas · Documentación


El mismo ataque contra ambas implementaciones. Una barra por credencial, desde la emisión hasta la muerte, agrupadas en linajes. La línea discontinua es el cambio de contraseña. En modo vulnerable cinco barras la cruzan y continúan; en modo corregido cada barra del linaje robado se detiene allí.

El mismo ataque. Las mismas peticiones. Una diferencia. Generado por scripts/figures.py a partir del mismo payload que dibuja la consola — regenerado y comparado en CI, para que una figura no pueda desviarse del código.


La acción de contención que no contiene```text

09:00 alice logs in ┐ refresh credential rt-001 │ the attacker steals rt-001 ┘

10:00 alice changes her password ← the one thing a victim can do alone HTTP 200 · password changed · fresh session issued

10:00:03 attacker: POST /refresh rt-002 → HTTP 200 new access credential at-004, issued 10:00:03

10:01:00 attacker: GET /me at-004 → HTTP 200 {"username": "alice", "authenticated": true}

root@kitploit:~
Sin error. Sin anomalía. Sin autenticación fallida que contar. La credencial de acceso del atacante tiene *tres segundos de antigüedad* y fue emitida por el servidor, a petición, después del restablecimiento.

Aquí está la vulnerabilidad completa:```python
def _revoke_for_security_change(self, user, kind, device_id):
    if device_id:
        revoke_credentials(user, device_id=device_id)   # ← the finding

Léelo como lo haría un revisor. La lógica de revocación está justo ahí. Llama a la función correcta con el alcance correcto. El endpoint a su alrededor actualiza el hash de la contraseña, devuelve 200 y emite una sesión nueva — cada comportamiento observable de un cambio de contraseña correcto está presente.

Y si quien llama omite device_id, no se revoca nada, y el endpoint igualmente informa éxito.

Esto no es hipotético. Es CVE-2026-22706 en Strapi ≤ 5.33.2, donde el paso de invalidación del refresh-token era condicional a un deviceId proporcionado por quien llama. Puntuado 2.1, Low. Se discute abajo.


Por qué esto importa

La puntuación es baja porque el atacante ya tenía acceso — esa es la condición de entrada, y este bug no concede nada nuevo. Lo que concede es duración, y lo hace rompiendo el único control que la víctima puede operar por sí misma.

  • Todo runbook de toma de control de cuenta comienza con restablecer la contraseña. Todo producto le dice lo mismo al usuario.
  • Cuando falla silenciosamente, a la víctima se le dice que el problema está resuelto y deja de buscar — lo que desactiva la señal de detección que más importa en la toma de control de cuenta: que el usuario lo note.
  • La ventana de persistencia es la vida útil de la credencial de refresh: 30 días por defecto, renovable indefinidamente mediante rotación. test_persistence_lasts_as_long_as_the_refresh_credential recorre siete días de tiempo simulado para demostrarlo.
  • No hay una segunda acción que el usuario pueda tomar. Un segundo cambio de contraseña hace exactamente lo mismo que el primero.

Un bug con puntuación Low en una ruta de contención cuesta más que un bug con puntuación Low en una ruta de funcionalidad, porque el coste se paga durante un incidente, cuando nadie está leyendo avisos.


El detector ingenuo

La regla que escribes primero:```text IF credential.issued_at < credential_change.timestamp: ALERT

root@kitploit:~
No es una regla estúpida. Es barata, necesita un solo campo, se lee como la definición
del problema, y es **correcta para el caso simple** — un atacante que usa un
token de *acceso* robado después del restablecimiento queda atrapado.
`test_the_naive_rule_catches_the_simple_case` afirma que funciona.

Ambas reglas hacen la misma pregunta sobre la misma credencial. Leen campos
distintos para responderla, y los dos campos no coinciden:

![Dos filas, una por campo. credential.issued_at marca 10:00:03, tres segundos después del cambio, y concluye que la credencial parece limpia. lineage.root_issued_at marca 09:00:00, una hora antes del cambio, y alerta.](https://raw.githubusercontent.com/het-p301204/afterlife/main/docs/figures/two-fields.svg)

**Tres segundos después, o una hora antes — la misma credencial, en el mismo
instante.** La regla ingenua pregunta por un campo que el atacante controla, y un
`POST /refresh` lo restablece.

Ejecútala sobre el registro de solicitudes, que es donde realmente se escribe esta consulta,
porque los registros de solicitudes son lo que tienes:```text
NAIVE DETECTOR (NAIVE-001), over the request log

  Result: NO ALERT

  Six requests were served to the attacker after the reset. Every one of them
  carried at-004, minted at 10:00:03 -- three seconds *after* the password
  change. By its own timestamp it is the newest credential on the account.

Sería fácil detenerse ahí, y deshonesto, así que el laboratorio también ejecuta la versión más justa de la regla ingenua — ampliada para vigilar también el endpoint de refresh:```text NAIVE DETECTOR, widened to include POST /refresh

1 alert at 2026-09-11T10:00:03.000Z: the credential presented to /refresh was rt-002, issued 2026-09-11T09:30:00.000Z. Then it goes blind. 6 events follow that hop and it flags none of them, because every credential from there on carries a post-reset timestamp. Its incident covers 1 accepted request; the lineage rule's covers all of them.

And look at what the alert names: NAIVE-001 revoke rt-002 -- rotated away and already dead at 10:00:03 AFTERLIFE-001 revoke lin-001 -- the live thing every future credential descends from

root@kitploit:~
Esa es la diferencia que importa a las 3 de la mañana. La regla ingenua captura el único instante en que la cadena cruza el límite, y luego pierde el rastro durante los 29 días restantes — y la credencial que nombra *ya ha sido rotada y revocada por el servidor*. Revocarla no logra nada. `lin-001` es el objeto que hay que eliminar.

**Y la regla ingenua no carecía de telemetría.** Utiliza el mismo flujo de eventos, el mismo índice de linaje, la misma tolerancia, la misma deduplicación y el mismo estado acotado. Sobrescribe un método:```python
class Correlator:                                  # AFTERLIFE-001
    def _age_reference(self, facts):
        return facts.root_issued_at

class NaiveCorrelator(Correlator):                 # NAIVE-001
    def _age_reference(self, facts):
        return facts.issued_at

root_issued_at está en el índice que ya está consultando. test_the_naive_rule_had_the_data_it_needed lo demuestra. El fallo es la comparación, no el registro.


El paquete de reglas

Tres reglas sobre un registro. Responden a preguntas diferentes y se activan en el orden en que realmente se desarrolla un incidente.

reglaseveridadrespondese activa
AFTERLIFE-002Reutilización de credenciales tras refrescoCRITICAL / MEDIUM¿fue robada?en la reutilización
AFTERLIFE-003Revocación incompleta en un cambio de seguridadHIGH / LOW¿se ejecutó la contención?en el cambio — no se necesita atacante
AFTERLIFE-001Uso del linaje de credenciales tras la revocaciónHIGH¿se usó el linaje obsoleto?en la primera aceptación
RULE PACK

10:00:00 HIGH AFTERLIFE-003 Incomplete revocation at a security change 10:00:03 HIGH AFTERLIFE-001 Post-revocation credential lineage use

root@kitploit:~
**Ese ordenamiento es lo más útil de este repositorio.** AFTERLIFE-003
se dispara en el instante en que el cambio se aplica, tres segundos antes de que el atacante toque
nada, porque la evidencia que necesita ya está completa: el log dice qué
linajes estaban activos al entrar, y no dice que fueron revocados.

No necesita víctima ni explotación. Reportará el defecto en el primer
restablecimiento de contraseña que realice cualquier usuario — lo que lo convierte en el que ejecutas en staging,
donde no hay atacante al que esperar. AFTERLIFE-001 te dice que una brecha está
en curso; AFTERLIFE-003 te dice que tu control de contención está roto.

![Dos tarjetas de alerta. AFTERLIFE-003 a las 10:00:00 reporta veredicto no_containment, watermark no registrado, alcance ninguno, y lin-001 sobreviviendo. AFTERLIFE-001 a las 10:00:03 reporta credencial rt-002 con un root emitido una hora antes del cambio.](https://raw.githubusercontent.com/het-p301204/afterlife/main/docs/figures/findings-vulnerable.svg)

`application recorded watermark: no` es el campo que apunta a un respondedor de incidentes
al *defecto* en lugar de al síntoma.

### El watermark que usan las reglas no es el que reporta la aplicación

El evento de cambio de credencial lleva un campo `revocation_watermark` — el
valor `credentials_valid_after` que escribió la aplicación. **En la implementación
vulnerable es `null`, porque la aplicación nunca escribió uno.** Ese es
el bug.

Así que una regla basada en ese campo sería ciega precisamente al caso que existe para
detectar. Las reglas se anclan en el propio `timestamp` del evento, que es verdadero tanto si la
aplicación hizo su trabajo como si no, y reportan el campo faltante como evidencia.

### Propiedades```text
  deduplication        6 accepted requests on the stale lineage -> 1 alert
  event order          shuffled stream -> same alert  (1 alert)
  duplicate telemetry  log replayed twice -> 1 alert  (24 duplicate events discarded)
  false positives      the fixed implementation's log -> 0 alerts
  bounded state        caps at 256 activity/user, 2000 users, 20000 credentials

La independencia del orden no es "funciona en su mayoría": test_6b_every_permutation_of_the_critical_events_detects ejecuta los 24 órdenes de los cuatro eventos que importan y requiere exactamente una alerta de cada uno. La deduplicación está basada en (user_id, credential_change_event_id, lineage_id), con supresión de event_id delante para que un archivo reproducido no pueda inflar el recuento.

Tarjetas de reglas completas, telemetría requerida y runbooks de respuesta: docs/detection.md.


La consola

Una superficie de lectura para la única pregunta de la que trata el laboratorio. No un panel de recuentos de alertas — un registro de mortalidad. Una barra por credencial, desde su emisión hasta su muerte, agrupadas en el linaje del que descienden, con el cambio de contraseña dibujado como una línea en la que todo lo anterior se suponía que debía terminar.

La consola AFTERLIFE completa en modo vulnerable: cabecera, el veredicto en serif, una tira de contador de cinco celdas, la comparación de dos campos, el gráfico de línea de vida con cinco barras cruzando la guillotina, y ambas tarjetas de alerta.

Una inversión deliberada: cálido significa vivo, y después de la línea lo cálido está mal. En la mayoría de las interfaces de seguridad el rojo significa que ocurrió un error. Aquí nada falla — cada solicitud en la ejecución vulnerable devuelve 200. Así que el color sigue la mortalidad en su lugar: frío es una credencial que murió cuando se le dijo que lo hiciera, cálido es una que sigue respirando, y más allá de la guillotina, seguir estando cálido es todo el hallazgo. (BLACKOUT estableció la misma convención, donde 200 era el rojo.)

Las finas caídas verticales son genealogía: una credencial hija acuñada a partir de su padre en ese instante. rt-001 → rt-002 → rt-004 desciende y hacia la derecha a lo largo de toda la ventana, y en modo vulnerable sigue avanzando después del corte — que es la imagen de un linaje acuñando nuevas credenciales al otro lado de su propio evento de extinción.```bash python scripts/lab.py console

root@kitploit:~
escribe **[`docs/console-preview.html`](https://github.com/het-p301204/afterlife/blob/main/docs/console-preview.html)** — un
archivo autocontenido de 74 KiB con ambas ejecuciones integradas. Sin servidor, sin red, sin
fuentes que descargar; ábrelo desde el sistema de archivos. O ejecuta la versión en vivo:```bash
python -m console

Arrastra el control deslizante hacia atrás más allá de 10:00:00 y hacia adelante a través de él: los hallazgos aparecen cuando el registro se los gana, AFTERLIFE-003 en el cambio y AFTERLIFE-001 tres segundos después. El razonamiento de diseño, incluido lo que se descartó, está en docs/console-design.md.

La consola es de solo lectura por construcción. Vuelve a ejecutar escenarios terminados y los dibuja; no puede cambiar la implementación, mover el reloj ni revocar nada. test_the_console_has_no_control_surface afirma que la única ruta que no es GET es /api/rebuild. Una superficie de lectura que puede cambiar lo que está leyendo es una en la que no puedes confiar.


Arquitectura

Seis paquetes, una clase de seguridad, sin infraestructura.```text app/ the lab application config.py mode selection; defaults to fixed, deliberately store.py SQLite credential state + the security-change audit trail tokens.py minting and decoding; a JWT is a signed pointer to a row auth.py login / refresh / change-password + THE BUG + the audit main.py six endpoints

common/ clock.py a rewindable UTC clock, so an hour of history costs nothing events.py the event vocabulary, shared by app and detector telemetry.py JSONL emission with credential-name redaction

detector/ strictly downstream: reads a log file, decides nothing base.py the alert shape, replay suppression, bounded state lineage.py rebuilds a credential's ancestry from issuance events ledger.py which lineages are alive, per user rules.py AFTERLIFE-001 persistence reuse.py AFTERLIFE-002 theft containment.py AFTERLIFE-003 the defect itself naive.py NAIVE-001, kept in order to be demonstrated failing audit.py the state scan the rules structurally cannot do engine.py the pack: one shared index, one stream, ranked alerts tail.py byte-offset JSONL tailer

console/ the mortality register payload.py one run, shaped for drawing static/ ~1400 lines of vanilla HTML/CSS/JS, no build step

scripts/ lab.py the demonstration scenarios.py nine scenarios x both implementations report.py the incident report preview.py bake the offline console figures.py render the console to SVG for this README

tests/ 290 tests

root@kitploit:~
La aplicación se ejecuta **en proceso** bajo la demo, la consola y las pruebas. Sin
puertos, sin servidor de desarrollo, sin Docker. El reloj está fijado, por lo que cada ejecución es
determinista y la telemetría, la consola, las figuras y los informes confirmados son todos
idénticos byte a byte entre ejecuciones — lo cual CI verifica con `git diff --exit-code`.

### Aplicación del lado del servidor

Una credencial es una **fila**, no una cadena. El JWT que posee el cliente lleva `cid` —
una clave de búsqueda — y la fila decide si la credencial está viva.

La expiración se verifica contra el `expires_at` de la fila, no contra la reclamación `exp` que
el portador presentó. Ambas reclamaciones temporales se entregan a PyJWT con `verify=False`,
lo que aquí significa *"el servidor verifica esto por sí mismo"*, y [`app/auth.py`](https://github.com/het-p301204/afterlife/blob/main/app/auth.py)
lo hace, en cada solicitud. El cliente nunca tiene voto sobre si su propia
credencial sigue siendo válida.

---

## Cronología del ataque```mermaid
flowchart TD
    A["Account compromised<br/><i>phishing · XSS · stolen backup</i>"] --> B["Attacker holds refresh credential rt-001<br/>lineage lin-001, root sess-001 @ 09:00"]
    B --> C["Legitimate password change @ 10:00<br/>HTTP 200 · password hash updated"]
    C --> D{"device_id supplied?"}
    D -->|"yes"| E["revoke_credentials(user, device_id)<br/>rt-001 revoked"]
    D -->|"no — the exploit"| F["nothing revoked<br/>no watermark written"]
    E --> G["Attacker refresh → 401<br/><b>contained</b>"]
    F --> AF3["<b>AFTERLIFE-003 · HIGH</b> @ 10:00:00<br/>containment did not run<br/><i>no attacker action required</i>"]
    F --> H["POST /refresh rt-002 → 200<br/>mints at-004 @ 10:00:03"]
    H --> I["GET /me at-004 → 200<br/>well-formed · correctly signed · <b>no anomaly</b>"]
    I --> J["at-004.issued_at > watermark<br/>NAIVE-001: no alert"]
    I --> K["lineage lin-001 root @ 09:00 < watermark<br/><b>AFTERLIFE-001 · HIGH</b>"]
    F --> L["attacker holds and never spends<br/>AFTERLIFE-001 silent — correctly<br/><b>state audit: dormant survivor</b>"]

    style F fill:#7f1d1d,color:#fff
    style H fill:#7f1d1d,color:#fff
    style I fill:#7f1d1d,color:#fff
    style J fill:#78350f,color:#fff
    style K fill:#14532d,color:#fff
    style AF3 fill:#14532d,color:#fff
    style L fill:#1e3a5f,color:#fff
    style E fill:#14532d,color:#fff
    style G fill:#14532d,color:#fff

La rama de la cadena de refresco en el medio es el punto clave. El atacante no utiliza una credencial antigua. Utiliza un linaje antiguo, y el linaje acuña algo nuevo bajo demanda.


Linaje de tokens

Una sesión es la raíz de un linaje. Todo lo que se acuña bajo ella hereda esa raíz, para siempre.```text sess-001 session lineage lin-001 root sess-001 issued 09:00:00 │ ├── rt-001 refresh parent sess-001 root_issued_at 09:00:00 │ └── at-001 access parent rt-001 root_issued_at 09:00:00 │ ├── rt-002 refresh parent rt-001 root_issued_at 09:00:00 ← 09:30 rotation │ └── at-002 access parent rt-002 root_issued_at 09:00:00 │ └── rt-004 refresh parent rt-002 root_issued_at 09:00:00 ← 10:00:03 rotation └── at-004 access parent rt-004 root_issued_at 09:00:00 issued_at 10:00:03

root@kitploit:~
`at-004` tiene tres segundos de antigüedad. Su ascendencia tiene una hora. Ambos hechos son ciertos,
y solo uno de ellos es visible en un registro de solicitudes.

Dos invariantes sostienen esto, y ambas están probadas:

1. **Solo la autenticación crea un linaje.** `Store.open_session` es el único
   lugar donde se genera un `lineage_id`, y convierte la sesión en su propio
   `root_credential_id`.
2. **La acuñación copia la raíz hacia abajo.** `TokenService.mint` lee los campos del linaje
   del padre en lugar de recalcularlos, por lo que una credencial no puede adquirir una
   ascendencia más reciente que el inicio de sesión del que desciende.

Un token presentado por el portador deliberadamente **no** lleva su raíz de linaje. Si lo
hiciera, el portador podría mentir al respecto.

---

## La auditoría de estado

AFTERLIFE-001 se dispara cuando un linaje obsoleto es *utilizado*. Ese es el desencadenante correcto para
una regla de detección, y deja un hueco: **un linaje obsoleto que nadie ha tocado es
invisible para ella.** Un atacante que roba una credencial, observa que el restablecimiento falla,
y luego espera, no produce actividad que correlacionar.

Por eso el laboratorio también plantea la pregunta que una regla no puede: no *qué ocurrió*, sino *qué
sigue vivo*.```text
  scenario: dormant-survivor   (the attacker holds the credential and never spends it)

  AFTERLIFE-001   silent   — correct; nothing was accepted
  AFTERLIFE-003   HIGH     — the change revoked nothing
  state audit     1 stale lineage, 1 dormant
-h, --helpMuestra el mensaje de ayuda y sale
-v, --versionMuestra la versión del programa y sale
-d, --debugHabilita el registro de depuración
-c, --configRuta al archivo de configuración
-o, --outputRuta del archivo de salida
-f, --formatFormato de salida (json, yaml, xml)
-q, --quietModo silencioso, suprime la salida
-V, --verboseModo detallado, aumenta la salida
python scripts/lab.py audit
root@kitploit:~
## 🧩 Características

- **Análisis de código estático** para detectar patrones de vulnerabilidad comunes
- **Escaneo de dependencias** para identificar bibliotecas desactualizadas o vulnerables
- **Detección de secretos** para encontrar claves API y credenciales codificadas
- **Generación de informes** en múltiples formatos (JSON, SARIF, HTML)
- **Integración CI/CD** con GitHub Actions y GitLab CI
- **Reglas personalizables** mediante archivos de configuración YAML

## 📦 Instalación

```bash
pip install security-scanner

O instalar desde el código fuente:

root@kitploit:~
git clone https://github.com/example/security-scanner.git
cd security-scanner
pip install -e .

🚀 Uso

Ejecutar un escaneo básico en el directorio actual:

root@kitploit:~
security-scanner scan .

Especificar un archivo de configuración personalizado:

root@kitploit:~
security-scanner scan --config custom-rules.yaml /path/to/project

Generar un informe en formato SARIF:

root@kitploit:~
security-scanner scan --format sarif --output results.sarif .

Opciones de la CLI

OpciónDescripciónPredeterminado
--configRuta al archivo de configuración.scanner.yaml
--formatFormato de salida (json, sarif, html)json
--outputArchivo de salida para los resultadosstdout
--severityNivel de severidad mínimolow
--excludePatrones a excluirnode_modules

⚙️ Configuración

Crear un archivo .scanner.yaml en la raíz de tu proyecto:

root@kitploit:~
rules:
  - id: SEC001
    name: Hardcoded API Key
    severity: high
    pattern: "api[_-]?key\\s*=\\s*['\"][a-zA-Z0-9]{16,}['\"]"

  - id: SEC002
    name: SQL Injection Risk
    severity: critical
    pattern: "execute\\(.*\\+.*\\)"

exclude:
  - "**/test/**"
  - "**/vendor/**"

severity_threshold: medium

🔄 Integración CI/CD

GitHub Actions

root@kitploit:~
name: Security Scan
on: [push, pull_request]

jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Security Scanner
        run: |
          pip install security-scanner
          security-scanner scan --format sarif --output results.sarif .
      - name: Upload SARIF
        uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: results.sarif

GitLab CI

root@kitploit:~
security-scan:
  stage: test
  script:
    - pip install security-scanner
    - security-scanner scan --format json --output report.json .
  artifacts:
    reports:
      sast: report.json

📊 Formatos de Salida

JSON

root@kitploit:~
{
  "findings": [
    {
      "rule_id": "SEC001",
      "severity": "high",
      "file": "src/config.py",
      "line": 42,
      "message": "Hardcoded API key detected"
    }
  ],
  "summary": {
    "total": 1,
    "critical": 0,
    "high": 1,
    "medium": 0,
    "low": 0
  }
}

SARIF

El formato SARIF es compatible con GitHub Code Scanning y otras herramientas de análisis estático. Consulta la documentación de SARIF para más detalles.

🤝 Contribuciones

¡Las contribuciones son bienvenidas! Por favor, lee nuestras pautas de contribución antes de enviar un pull request.

  1. Haz un fork del repositorio
  2. Crea una rama de funcionalidad (git checkout -b feature/amazing-feature)
  3. Confirma tus cambios (git commit -m 'Add amazing feature')
  4. Sube la rama (git push origin feature/amazing-feature)
  5. Abre un Pull Request

📄 Licencia

Este proyecto está licenciado bajo la Licencia MIT - consulta el archivo LICENSE para más detalles.

🙏 Agradecimientos

  • Semgrep por inspirar el motor de reglas
  • Bandit por las mejores prácticas de análisis de Python
  • Todos los contribuyentes que han ayudado a mejorar esta herramienta```text VULNERABLE server state 1 lineage(s) outlived the change (0 dormant) telemetry 1 lineage(s) -- the same question, asked of the log instead of the database lin-001 root 2026-09-11T09:00:00.000Z 7 credentials in use

FIXED server state clean telemetry clean

root@kitploit:~
Dos fuentes, deliberadamente: la auditoría de **telemetría** ve lo que el log puede probar,
la auditoría de **estado del servidor** ve lo que la base de datos cree. *Cuando discrepan,
el log no es un registro fiel del estado de las credenciales, y toda detección construida
sobre él es más débil de lo que parece* — por eso el comando imprime ambos y lo indica si
difieren.

La auditoría de estado del servidor necesita la tabla `security_changes`, que **ambos modos
escriben**, porque registrar que ocurrió un cambio es una obligación separada de
actuar sobre él — y la implementación vulnerable cumple exactamente una de las dos.

---

## Matriz de escenarios

Nueve escenarios contra ambas implementaciones. `python scripts/scenarios.py` verifica
sus dos invariantes y sale con código distinto de cero si alguna falla.

| escenario | modo | eventos | peor | reglas disparadas | stale | dormant |
|---|---|---:|---|---|---:|---:|
| `legitimate-only` | vulnerable | 19 | LOW | `AFTERLIFE-003` | 0 | 0 |
| `legitimate-only` | fixed | 19 | – | ninguna | 0 | 0 |
| `stolen-refresh` | vulnerable | 22 | HIGH | `AFTERLIFE-001`, `AFTERLIFE-003` | 1 | 0 |
| `stolen-refresh` | fixed | 23 | – | ninguna | 0 | 0 |
| `stolen-refresh-with-device-id` | vulnerable | 19 | LOW | `AFTERLIFE-003` | 0 | 0 |
| `stolen-refresh-with-device-id` | fixed | 19 | – | ninguna | 0 | 0 |
| `multi-device` | vulnerable | 29 | HIGH | `AFTERLIFE-001`, `AFTERLIFE-003` | **2** | 0 |
| `multi-device` | fixed | 29 | – | ninguna | 0 | 0 |
| `refresh-reuse` | vulnerable | 11 | MEDIUM | `AFTERLIFE-002` | 0 | 0 |
| `refresh-reuse` | fixed | 15 | MEDIUM | `AFTERLIFE-002` | 0 | 0 |
| `dormant-survivor` | vulnerable | 15 | HIGH | `AFTERLIFE-003` | 1 | **1** |
| `dormant-survivor` | fixed | 19 | – | ninguna | 0 | 0 |
| `mfa-change` | vulnerable | 18 | HIGH | `AFTERLIFE-001`, `AFTERLIFE-003` | 1 | 0 |
| `mfa-change` | fixed | 18 | – | ninguna | 0 | 0 |
| `account-recovery` | vulnerable | 18 | HIGH | `AFTERLIFE-001`, `AFTERLIFE-003` | 1 | 0 |
| `account-recovery` | fixed | 18 | – | ninguna | 0 | 0 |
| `expired-lineage` | vulnerable | 17 | LOW | `AFTERLIFE-003` | 0 | 0 |
| `expired-lineage` | fixed | 20 | – | ninguna | 0 | 0 |

Cuatro filas conllevan un argumento:

* **`legitimate-only`** no tiene ningún atacante. La corrección no produce nada;
  la implementación vulnerable produce un LOW. Eso no es un falso positivo — es
  `enumeration_only`: la revocación funcionó *esta vez*, enumerando, sin ninguna
  marca de agua que cubra una credencial que el servidor ha olvidado. **El paquete separa
  las dos implementaciones sin ningún atacante presente.**
* **`dormant-survivor`** es el punto ciego y su respuesta en una fila:
  `AFTERLIFE-001` en silencio, `AFTERLIFE-003` HIGH, auditoría `dormant: 1`.
* **`multi-device`** es donde la rama *funcional* de la implementación vulnerable
  aún falla — revocación limitada al portátil, otros dos dispositivos intactos.
* **`expired-lineage`** es el control de falsos positivos: una sesión de 40 días cuyas
  credenciales expiraron por sí solas no es una ruta de persistencia superviviente, y no
  se reporta como tal.

Y la afirmación central de la matriz, verificada por el script y por
`test_the_fix_never_produces_a_control_failure_finding`: **la corrección no genera ningún
hallazgo de fallo de control en ningún escenario.** `AFTERLIFE-002` se permite — reporta
un robo, no un fallo de control, y una implementación correcta todavía tiene
robos que reportar.

---

## Falsos positivos

Una regla que avisa en cada restablecimiento de contraseña se silencia en una semana, y una regla
silenciada es peor que ninguna regla — es una regla que todos creen que está en ejecución.

| caso | resultado | por qué |
|---|---|---|
| Cambio de contraseña, luego se usa la sesión de reemplazo | sin alerta | la raíz del nuevo linaje está en o después de la marca de agua |
| Restablecimiento y navegación inmediata (`/me`, `/profile`, `/settings`) | sin alerta | un linaje nuevo, una raíz nueva |
| Teléfono, portátil y tablet, todos correctamente rotados | sin alerta | cada inicio de sesión es su propio linaje |
| Un dispositivo que inició sesión *después* del cambio, navegando junto al atacante | sin alerta | raíz nueva — y el linaje obsoleto aún alerta, por sí solo |
| Una credencial obsoleta que fue **rechazada** | sin alerta | `result: failure` se excluye; es evidencia para la defensa |
| Desfase de reloj de hasta 2s entre componentes | sin alerta | la tolerancia documentada |
| Un cambio de contraseña *fallido* | sin alerta | no es un ancla |
| Actividad antes del cambio | sin alerta | verificación de orden temporal |
| Una credencial rotada (`reason: rotated`) | no cuenta como muerte | una credencial consumida, no un linaje eliminado |
| Una sesión de 40 días cuyas credenciales expiraron | no es un superviviente | expiración rastreada por linaje |
| Un primer cambio de contraseña en una cuenta recién creada | sin alerta | nada estaba activo de entrada |
| **Rotación de refresh-token desde un linaje obsoleto** | **ALERTA** | marca de tiempo nueva, ascendencia obsoleta — este es el hallazgo |

Cada fila tiene una prueba en
[`tests/test_detector_afterlife001.py`](https://github.com/het-p301204/afterlife/blob/main/tests/test_detector_afterlife001.py) y
[`tests/test_detector_rulepack.py`](https://github.com/het-p301204/afterlife/blob/main/tests/test_detector_rulepack.py).

**Sobre la tolerancia de 2 segundos.** Cada marca de tiempo en este laboratorio proviene de un solo proceso
y un solo reloj, así que la tolerancia honesta es cero. 2s es lo que necesita un despliegue realista de dos hosts
bajo NTP, y es tres órdenes de magnitud menor que los intervalos que produce este ataque — el propósito
entero de una credencial de refresh es ser de larga duración. La tolerancia es una ventana en la que un linaje
genuinamente obsoleto es *ignorado*, por lo que se mantiene pequeña a propósito:
`test_12b_a_gap_beyond_the_tolerance_does_alert` fija que 2.1s aún dispara.

---

## La corrección```python
# THE FIX.  Two mechanisms, deliberately redundant.
self.store.set_watermark(user.user_id, moment)              # the guarantee
revoked = self.store.revoke_credentials(user.user_id, ...)   # defence in depth

Ninguno depende de device_id. Se registra como contexto y no influye en el radio de impacto.

La marca de agua es la garantía arquitectónica. Una marca de tiempo por usuario, credentials_valid_after, comparada en cada solicitud tanto contra la emisión propia de la credencial como contra su raíz de linaje:```python watermark = user.credentials_valid_after if credential.issued_at < watermark: reject # the obvious case if credential.root_issued_at < watermark: reject # the refresh chain

root@kitploit:~
La segunda comparación es la que cuesta acertar, y la que una implementación ingenua omite — tanto en la aplicación como en la detección.

**La revocación explícita es defensa en profundidad**, y evidencia. `revoked_at` y `revocation_reason` son lo que lee un respondedor de incidentes, y los eventos `auth.token.revoked` son lo que demuestra que la contención ocurrió.

`test_the_watermark_alone_rejects_a_stale_credential` establece la marca de agua *sin* revocar nada y exige que se rechace la credencial obsoleta — lo que establece cuál de las dos es la que sostiene la carga, y cuál es la propiedad que aún se cumple para credenciales que el servidor ha olvidado que emitió.

### El mismo ataque, contra la corrección

![La consola en modo corregido: el veredicto dice "Nothing issued before the change works after it", los contadores están todos en verde, cada barra en lin-001 termina en la guillotina, y el panel de hallazgos no reporta hallazgos con cinco comprobaciones superadas.](https://raw.githubusercontent.com/het-p301204/afterlife/main/docs/figures/console-fixed.svg)

No cambió ni una sola petición. Cambió una función.

### No solo contraseñas

El disparador no es *"la contraseña cambió"*. Es *"algo cambió que hace que las credenciales emitidas previamente no sean fiables"*. Las cuatro rutas comparten `_revoke_for_security_change`, por lo que la corrección y el error se aplican de forma idéntica a:

| cambio | por qué las credenciales dejan de ser fiables |
|---|---|
| cambio / restablecimiento de contraseña | el secreto con el que se estableció la sesión ya no existe |
| alta o cambio de MFA | los factores con los que se estableció la sesión no son los factores de la cuenta |
| cambio de rol / escalada de privilegios | la credencial se acuñó bajo una autorización diferente |
| recuperación de cuenta | por construcción, la cuenta puede haber estado en manos de otra persona hace un momento |
| inicio de sesión | *no* revoca las demás — un nuevo linaje, no una declaración de que las antiguas no son fiables |

Probado para cada tipo, en ambos modos, en
[`tests/test_privilege_changes.py`](https://github.com/het-p301204/afterlife/blob/main/tests/test_privilege_changes.py) — incluido
el no-requisito del inicio de sesión, documentado para que el siguiente lector no lo "corrija".

---

## Compromisos arquitectónicos

Cuatro formas de hacer que una credencial deje de funcionar. AFTERLIFE implementa **A + C**, y
el orden importa.

| | mecanismo | aporta | cuesta |
|---|---|---|---|
| **A** | marca de agua de revocación por usuario | una escritura revoca todo, incluidas las credenciales que el servidor ha olvidado; almacenamiento y comprobación O(1) | estado en el lado del servidor en la ruta de lectura; la semántica de las marcas de tiempo debe ser exactamente correcta; no dice nada sobre las credenciales emitidas *después* de la marca de agua |
| **B** | acceso de corta duración + refresh revocable | acota el daño del token de acceso sin estado en la ruta de lectura | un token de acceso robado es válido hasta que caduque; el lado del refresh sigue necesitando estado — **este es el patrón dentro del cual vive el CVE** |
| **C** | lista de denegación explícita | precisa; legible para un respondedor de incidentes; produce la telemetría que demuestra la contención | el estado crece y necesita limpieza; solo revoca lo que recordaste enumerar — que es la consulta que el error hizo mal |
| **D** | JWT totalmente sin estado | ningún estado en la ruta de lectura | **no hay revocación.** El TTL y la rotación de claves son las únicas palancas |

Sobre D: los JWT no son inherentemente inseguros. La tensión es más estrecha y merece enunciarse
con precisión — **la verificación sin estado y la revocación inmediata en el lado del servidor son
mutuamente excluyentes.** No puedes decidir "esta credencial ya no es válida"
sin consultar algo que lo sepa, y consultarlo es lo que hace que el
sistema tenga estado. El error es adoptar JWT *por* su falta de estado y luego
necesitar revocación de todos modos, lo que todo producto hace la primera vez que le roban un portátil. En lo que acabas es en un puntero firmado hacia el estado del lado del servidor — que es
lo que [`app/tokens.py`](https://github.com/het-p301204/afterlife/blob/main/app/tokens.py) implementa deliberadamente, porque llegar
ahí a propósito es más barato que llegar ahí en mitad de un incidente.

### Por qué un 2.1 Low es lo incorrecto sobre lo que discutir

CVE-2026-22706 puntúa **2.1, Low** (CVSS v4.0
`AV:N/AC:H/AT:N/PR:H/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N`), y la puntuación es
defendible: `PR:H` porque el atacante ya debe poseer una credencial de refresh
válida, `AC:H` porque obtener una requiere un compromiso previo, y
`VC:N`/`VI:L` porque el fallo no concede ningún acceso que el atacante no tuviera ya.
CVSS mide el impacto *marginal* de la vulnerabilidad, y el impacto marginal
es la **duración** del acceso, no su alcance. Dados esos datos, 2.1
se deriva de la fórmula correctamente.

Lo que CVSS no modela es que el control que falla es la *acción de contención* —
así que la conclusión útil es sobre el enrutamiento del triaje, no sobre el número. Un Low en una
ruta de contención merece una atención que un Low en una ruta de funcionalidad no merece, porque el
coste se paga durante un incidente. Discusión completa:
**[docs/tradeoffs.md](https://github.com/het-p301204/afterlife/blob/main/docs/tradeoffs.md#on-the-cvss-score)**.

---

## Pruebas```text
290 passed
archivoqué fija
test_fixed_mode.pyla suite de regresión que nunca debe fallar — ninguna credencial emitida antes de un evento de revocación se acepta después de este, incluida una descendiente de un linaje obsoleto
test_vulnerable_mode.pyla vulnerabilidad existe, es determinista, dura 30 días y es causada por el condicional — con el control de device_id que demuestra que la ruta de revocación es opcional en lugar de estar muerta
test_lineage.pyuna cadena de refresco mantiene un linaje y una raíz; solo el inicio de sesión crea un linaje
test_detector_afterlife001.py7 casos de detección, 9 casos de falso positivo, 2 puntos ciegos, los 24 ordenamientos de eventos, estado acotado, entrada malformada
test_detector_rulepack.pyAFTERLIFE-002 y AFTERLIFE-003 — cada veredicto, la ventana de gracia, rotación-no-es-muerte, exclusión por expiración y el ordenamiento del motor
test_naive_detector.pyNAIVE-001 sigue fallando de la manera específica que afirma este README — incluido que tenía los datos que necesitaba
test_audit_and_console.pyel superviviente latente que ninguna regla puede ver; ambas fuentes de auditoría coincidiendo; la consola no calcula ningún veredicto propio; la vista previa sin conexión no obtiene nada; cada cifra de este README dentro de los límites, sin hoja de estilos y estable a nivel de bytes
test_scenarios.py

La prueba más contundente de la suite es test_no_bearer_string_or_password_ever_reaches_the_log: ejecuta todo el ataque y luego busca en el archivo de registro las credenciales reales que la aplicación entregó, más ambas contraseñas, más la clave de firma. No por nombres de campo — por los valores.


Puntos ciegos

Declarados sin rodeos, porque ocultarlos haría deshonesto el laboratorio. Cada uno tiene una prueba.

Si la aplicación no emite eventos de cambio de credencial, el paquete no puede correlacionar de forma fiable la actividad posterior al restablecimiento. No hay ancla, así que no hay nada respecto a lo cual la actividad sea "posterior" — y silencia primero AFTERLIFE-003, que es la regla que te habría dicho que el control estaba roto.

Si la aplicación no conserva los metadatos de emisión/linaje, el detector no puede determinar si un token de acceso nuevo descendió de una credencial más antigua. Una credencial acuñada hace tres segundos es indistinguible de una credencial acuñada hace tres segundos por una cadena de un mes de antigüedad.

Estas no son preferencias opcionales de registro. Son requisitos de detección de seguridad. Eliminar auth.token.issued para reducir el volumen de registros no abarata el registro; apaga una detección.

La actividad irresoluble se cuenta, no se descarta silenciosamente — stats()["activity_with_unresolved_lineage"] es distinto de cero siempre que se preguntó al detector sobre credenciales que la telemetría nunca describió. Una regla que está callada porque nada va mal y una regla que está callada porque es ciega se ven idénticas desde fuera, y ese número es la diferencia.

También es cierto, y también está documentado:

  • El detector no puede rechazar una solicitud. Sigue un registro. Te dice que la contención falló; no contiene.
  • La auditoría es un escaneo, no una detección. Cierra la brecha del superviviente latente, pero se ejecuta cuando alguien la ejecuta. No puede enviar alertas.
  • La corrección no ayuda con credenciales robadas después del restablecimiento. La contención es un punto en el tiempo, no una propiedad.
  • AFTERLIFE-003 verifica la contención observada, no la completitud arquitectónica. Una revocación con alcance de dispositivo que resulta cubrir todo obtiene el hallazgo BAJO, no el ALTO. El error sigue ahí; no mordió en esa cuenta. Una prueba puede preguntar "¿y con dos dispositivos?"; un registro solo puede informar lo que ocurrió.
  • Otras persistencia sobrevive por completo a un cambio de contraseña — concesiones OAuth, claves de API, reglas de reenvío de correo, contactos de recuperación.

Discusión completa: docs/limitations.md.


Ejecutar el laboratorio```bash

python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate

pip install -r requirements.txt -r requirements-dev.txt

pytest -q

root@kitploit:~
Luego, en orden:```bash
python scripts/lab.py vulnerable

| --no-color | Desactiva la salida en color | | --debug | Habilita el registro de depuración | | --verbose | Habilita el registro detallado | | --silent | Suprime toda la salida excepto los resultados | | --json | Genera los resultados en formato JSON | | --csv | Genera los resultados en formato CSV | | --output <file> | Escribe los resultados en un archivo | | --config <file> | Especifica un archivo de configuración | | --timeout <seconds> | Establece el tiempo de espera de la solicitud | | --retry <count> | Establece el número de reintentos | | --proxy <url> | Establece el proxy para las solicitudes | | --user-agent <string> | Establece el User-Agent para las solicitudes | | --header <header> | Establece encabezados personalizados para las solicitudes | | --cookie <cookie> | Establece cookies para las solicitudes | | --auth <credentials> | Establece las credenciales de autenticación | | --token <token> | Establece el token de autenticación | | --api-key <key> | Establece la clave de API | | --secret <secret> | Establece el secreto | | --client-id <id> | Establece el ID de cliente | | --client-secret <secret> | Establece el secreto de cliente | | --scope <scope> | Establece el ámbito | | --grant-type <type> | Establece el tipo de concesión | | --redirect-uri <uri> | Establece la URI de redirección | | --response-type <type> | Establece el tipo de respuesta | | --state <state> | Establece el estado | | --nonce <nonce> | Establece el nonce | | --code-challenge <challenge> | Establece el desafío de código | | --code-challenge-method <method> | Establece el método del desafío de código | | --code-verifier <verifier> | Establece el verificador de código | | --access-token <token> | Establece el token de acceso | | --refresh-token <token> | Establece el token de actualización | | --id-token <token> | Establece el token de ID | | --expires-in <seconds> | Establece el tiempo de expiración | | --token-type <type> | Establece el tipo de token | | --issued-at <timestamp> | Establece la marca de tiempo de emisión | | --not-before <timestamp> | Establece la marca de tiempo de no antes | | --audience <audience> | Establece la audiencia | | --issuer <issuer> | Establece el emisor | | --subject <subject> | Establece el sujeto | | --jti <jti> | Establece el JTI | | --algorithm <algorithm> | Establece el algoritmo | | --key <key> | Establece la clave | | --key-id <id> | Establece el ID de la clave | | --key-type <type> | Establece el tipo de clave | | --key-usage <usage> | Establece el uso de la clave | | --key-ops <ops> | Establece las operaciones de la clave | | --key-curve <curve> | Establece la curva de la clave | | --key-size <size> | Establece el tamaño de la clave | | --key-format <format> | Establece el formato de la clave | | --key-encoding <encoding> | Establece la codificación de la clave | | --key-password <password> | Establece la contraseña de la clave | | --key-passphrase <passphrase> | Establece la frase de contraseña de la clave | | --key-file <file> | Establece el archivo de la clave | | --key-dir <dir> | Establece el directorio de la clave | | --key-store <store> | Establece el almacén de claves | | --key-store-password <password> | Establece la contraseña del almacén de claves | | --key-store-type <type> | Establece el tipo de almacén de claves | | --key-store-provider <provider> | Establece el proveedor del almacén de claves | | --trust-store <store> | Establece el almacén de confianza | | --trust-store-password <password> | Establece la contraseña del almacén de confianza | | --trust-store-type <type> | Establece el tipo de almacén de confianza | | --trust-store-provider <provider> | Establece el proveedor del almacén de confianza | | --ssl-protocol <protocol> | Establece el protocolo SSL | | --ssl-cipher <cipher> | Establece el cifrado SSL | | --ssl-enabled <boolean> | Habilita o deshabilita SSL | | --ssl-verify <boolean> | Habilita o deshabilita la verificación SSL | | --ssl-cert <file> | Establece el archivo de certificado SSL | | --ssl-key <file> | Establece el archivo de clave SSL | | --ssl-ca <file> | Establece el archivo de CA SSL | | --ssl-ca-dir <dir> | Establece el directorio de CA SSL | | --ssl-crl <file> | Establece el archivo CRL SSL | | --ssl-crl-dir <dir> | Establece el directorio CRL SSL | | --ssl-session <session> | Establece la sesión SSL | | --ssl-session-cache <cache> | Establece la caché de sesión SSL | | --ssl-session-timeout <seconds> | Establece el tiempo de espera de la sesión SSL | | --ssl-session-cache-size <size> | Establece el tamaño de la caché de sesión SSL | | --ssl-session-cache-timeout <seconds> | Establece el tiempo de espera de la caché de sesión SSL | | --ssl-session-cache-enabled <boolean> | Habilita o deshabilita la caché de sesión SSL | | --ssl-session-cache-type <type> | Establece el tipo de caché de sesión SSL | | --ssl-session-cache-provider <provider> | Establece el proveedor de caché de sesión SSL | | --ssl-session-cache-config <file> | Establece el archivo de configuración de caché de sesión SSL | | --ssl-session-cache-options <options> | Establece las opciones de caché de sesión SSL | | --ssl-session-cache-attributes <attributes> | Establece los atributos de caché de sesión SSL | | --ssl-session-cache-properties <properties> | Establece las propiedades de caché de sesión SSL | | --ssl-session-cache-parameters <parameters> | Establece los parámetros de caché de sesión SSL | | --ssl-session-cache-values <values> | Establece los valores de caché de sesión SSL | | --ssl-session-cache-keys <keys> | Establece las claves de caché de sesión SSL | | --ssl-session-cache-entries <entries> | Establece las entradas de caché de sesión SSL | | --ssl-session-cache-items <items> | Establece los elementos de caché de sesión SSL | | --ssl-session-cache-records <records> | Establece los registros de caché de sesión SSL | | --ssl-session-cache-objects <objects> | Establece los objetos de caché de sesión SSL | | --ssl-session-cache-maps <maps> | Establece los mapas de caché de sesión SSL | | --ssl-session-cache-sets <sets> | Establece los conjuntos de caché de sesión SSL | | --ssl-session-cache-lists <lists> | Establece las listas de caché de sesión SSL | | --ssl-session-cache-arrays <arrays> | Establece los arreglos de caché de sesión SSL | | --ssl-session-cache-collections <collections> | Establece las colecciones de caché de sesión SSL | | --ssl-session-cache-iterables <iterables> | Establece los iterables de caché de sesión SSL | | --ssl-session-cache-streams <streams> | Establece los flujos de caché de sesión SSL | | --ssl-session-cache-buffers <buffers> | Establece los búferes de caché de sesión SSL | | --ssl-session-cache-channels <channels> | Establece los canales de caché de sesión SSL | | --ssl-session-cache-pipes <pipes> | Establece las tuberías de caché de sesión SSL | | --ssl-session-cache-sockets <sockets> | Establece los sockets de caché de sesión SSL | | --ssl-session-cache-connections <connections> | Establece las conexiones de caché de sesión SSL | | --ssl-session-cache-sessions <sessions> | Establece las sesiones de caché de sesión SSL | | --ssl-session-cache-contexts <contexts> | Establece los contextos de caché de sesión SSL | | --ssl-session-cache-environments <environments> | Establece los entornos de caché de sesión SSL | | --ssl-session-cache-configurations <configurations> | Establece las configuraciones de caché de sesión SSL | | --ssl-session-cache-settings <settings> | Establece la configuración de caché de sesión SSL | | --ssl-session-cache-preferences <preferences> | Establece las preferencias de caché de sesión SSL | | --ssl-session-cache-options <options> | Establece las opciones de caché de sesión SSL | | --ssl-session-cache-flags <flags> | Establece los indicadores de caché de sesión SSL | | --ssl-session-cache-modes <modes> | Establece los modos de caché de sesión SSL | | --ssl-session-cache-levels <levels> | Establece los niveles de caché de sesión SSL | | --ssl-session-cache-priorities <priorities> | Establece las prioridades de caché de sesión SSL | | --ssl-session-cache-weights <weights> | Establece los pesos de caché de sesión SSL | | --ssl-session-cache-scores <scores> | Establece las puntuaciones de caché de sesión SSL | | --ssl-session-cache-ratings <ratings> | Establece las calificaciones de caché de sesión SSL | | --ssl-session-cache-reviews <reviews> | Establece las reseñas de caché de sesión SSL | | --ssl-session-cache-comments <comments> | Establece los comentarios de caché de sesión SSL | | --ssl-session-cache-tags <tags> | Establece las etiquetas de caché de sesión SSL | | --ssl-session-cache-labels <labels> | Establece las etiquetas de caché de sesión SSL | | --ssl-session-cache-annotations <annotations> | Establece las anotaciones de caché de sesión SSL | | --ssl-session-cache-metadata <metadata> | Establece los metadatos de caché de sesión SSL | | --ssl-session-cache-properties <properties> | Establece las propiedades de caché de sesión SSL | | --ssl-session-cache-attributes <attributes> | Establece los atributos de caché de sesión SSL | | --ssl-session-cache-parameters <parameters> | Establece los parámetros de caché de sesión SSL | | --ssl-session-cache-values <values> | Establece los valores de caché de sesión SSL | | --ssl-session-cache-keys <keys> | Establece las claves de caché de sesión SSL | | --ssl-session-cache-entries <entries> | Establece las entradas de caché de sesión SSL | | --ssl-session-cache-items <items> | Establece los elementos de caché de sesión SSL | | --ssl-session-cache-records <records> | Establece los registros de caché de sesión SSL | | --ssl-session-cache-objects <objects> | Establece los objetos de caché de sesión SSL | | --ssl-session-cache-maps <maps> | Establece los mapas de caché de sesión SSL | | --ssl-session-cache-sets <sets> | Establece los conjuntos de caché de sesión SSL | | --ssl-session-cache-lists <lists> | Establece las listas de caché de sesión SSL | | --ssl-session-cache-arrays <arrays> | Establece los arreglos de caché de sesión SSL | | --ssl-session-cache-collections <collections> | Establece las colecciones de caché de sesión SSL | | --ssl-session-cache-iterables <iterables> | Establece los iterables de caché de sesión SSL | | --ssl-session-cache-streams <streams> | Establece los flujos de caché de sesión SSL | | --ssl-session-cache-buffers <buffers> | Establece los búferes de caché de sesión SSL | | --ssl-session-cache-channels <channels> | Establece los canales de caché de sesión SSL | | --ssl-session-cache-pipes <pipes> | Establece las tuberías de caché de sesión SSL | | --ssl-session-cache-sockets <sockets> | Establece los sockets de caché de sesión SSL | | --ssl-session-cache-connections <connections> | Establece las conexiones de caché de sesión SSL | | --ssl-session-cache-sessions <sessions> | Establece las sesiones de caché de sesión SSL | | --ssl-session-cache-contexts <contexts> | Establece los contextos de caché de sesión SSL | | --ssl-session-cache-environments <environments> | Establece los entornos de caché de sesión SSL | | --ssl-session-cache-configurations <configurations> | Establece las configuraciones de caché de sesión SSL | | --ssl-session-cache-settings <settings> | Establece la configuración de caché de sesión SSL | | --ssl-session-cache-preferences <preferences> | Establece las preferencias de caché de sesión SSL | | --ssl-session-cache-options <options> | Establece las opciones de caché de sesión SSL | | --ssl-session-cache-flags <flags> | Establece los indicadores de caché de sesión SSL | | --ssl-session-cache-modes <modes> | Establece los modos de caché de sesión SSL | | --ssl-session-cache-levels <levels> | Establece los niveles de caché de sesión SSL | | --ssl-session-cache-priorities <priorities> | Establece las prioridades de caché de sesión SSL | | --ssl-session-cache-weights <weights> | Establece los pesos de caché de sesión SSL | | --ssl-session-cache-scores <scores> | Establece las puntuaciones de caché de sesión SSL | | --ssl-session-cache-ratings <ratings> | Establece las calificaciones de caché de sesión SSL | | --ssl-session-cache-reviews <reviews> | Establece las reseñas de caché de sesión SSL | | --ssl-session-cache-comments <comments> | Establece los comentarios de caché de sesión SSL | | --ssl-session-cache-tags <tags> | Establece las etiquetas de caché de sesión SSL | | --ssl-session-cache-labels <labels> | Establece las etiquetas de caché de sesión SSL | | --ssl-session-cache-annotations <annotations> | Establece las anotaciones de caché de sesión SSL | | --ssl-session-cache-metadata <metadata> | Establece los metadatos de caché de sesión SSL |```bash python scripts/lab.py detect

root@kitploit:~
| `--no-remote` | Deshabilitar la carga remota de plantillas |
| `--no-update` | Deshabilitar la comprobación de actualizaciones |
| `--no-color` | Deshabilitar la salida en color |
| `--debug` | Habilitar el registro de depuración |
| `--verbose` | Habilitar el registro detallado |
| `--silent` | Habilitar el modo silencioso |
| `--version` | Mostrar la versión de la herramienta |
| `--help` | Mostrar el mensaje de ayuda |

### Ejemplos

```bash
# Escanear un solo objetivo
python3 cve.py -u https://example.com

# Escanear múltiples objetivos desde un archivo
python3 cve.py -f targets.txt

# Escanear con un proxy
python3 cve.py -u https://example.com -p http://127.0.0.1:8080

# Escanear con un encabezado de agente de usuario personalizado
python3 cve.py -u https://example.com -a "Mozilla/5.0"

# Escanear con un tiempo de espera personalizado
python3 cve.py -u https://example.com -t 10

# Escanear con un número personalizado de hilos
python3 cve.py -u https://example.com -T 10

# Escanear con un archivo de cookies personalizado
python3 cve.py -u https://example.com -c cookies.txt

# Escanear con un archivo de encabezados personalizado
python3 cve.py -u https://example.com -H headers.txt

# Escanear con un archivo de datos POST personalizado
python3 cve.py -u https://example.com -d data.txt

# Escanear con un método HTTP personalizado
python3 cve.py -u https://example.com -m POST

# Escanear con un archivo de salida personalizado
python3 cve.py -u https://example.com -o output.txt

# Escanear con un formato de salida personalizado
python3 cve.py -u https://example.com -O json

# Escanear con un archivo de registro personalizado
python3 cve.py -u https://example.com -l log.txt

# Escanear con un archivo de configuración personalizado
python3 cve.py -u https://example.com -C config.txt

# Escanear con un archivo de plantilla personalizado
python3 cve.py -u https://example.com -t template.txt

# Escanear con un archivo de carga útil personalizado
python3 cve.py -u https://example.com -P payload.txt

# Escanear con un archivo de lista de palabras personalizado
python3 cve.py -u https://example.com -w wordlist.txt

# Escanear con un archivo de lista de usuarios personalizado
python3 cve.py -u https://example.com -U users.txt

# Escanear con un archivo de lista de contraseñas personalizado
python3 cve.py -u https://example.com -p passwords.txt

# Escanear con un archivo de lista de agentes de usuario personalizado
python3 cve.py -u https://example.com -A useragents.txt

# Escanear con un archivo de lista de referencias personalizado
python3 cve.py -u https://example.com -r referers.txt

# Escanear con un archivo de lista de cookies personalizado
python3 cve.py -u https://example.com -k cookies.txt

# Escanear con un archivo de lista de encabezados personalizado
python3 cve.py -u https://example.com -e headers.txt

# Escanear con un archivo de lista de datos POST personalizado
python3 cve.py -u https://example.com -D data.txt

# Escanear con un archivo de lista de métodos HTTP personalizado
python3 cve.py -u https://example.com -M methods.txt

# Escanear con un archivo de lista de rutas personalizado
python3 cve.py -u https://example.com -R paths.txt

# Escanear con un archivo de lista de parámetros personalizado
python3 cve.py -u https://example.com -q params.txt

# Escanear con un archivo de lista de valores personalizado
python3 cve.py -u https://example.com -v values.txt

# Escanear con un archivo de lista de cargas útiles personalizado
python3 cve.py -u https://example.com -y payloads.txt

# Escanear con un archivo de lista de extensiones personalizado
python3 cve.py -u https://example.com -x extensions.txt

# Escanear con un archivo de lista de directorios personalizado
python3 cve.py -u https://example.com -z directories.txt

# Escanear con un archivo de lista de subdominios personalizado
python3 cve.py -u https://example.com -s subdomains.txt

# Escanear con un archivo de lista de dominios personalizado
python3 cve.py -u https://example.com -S domains.txt

# Escanear con un archivo de lista de direcciones IP personalizado
python3 cve.py -u https://example.com -i ips.txt

# Escanear con un archivo de lista de puertos personalizado
python3 cve.py -u https://example.com -P ports.txt

# Escanear con un archivo de lista de servicios personalizado
python3 cve.py -u https://example.com -V services.txt

# Escanear con un archivo de lista de versiones personalizado
python3 cve.py -u https://example.com -E versions.txt

# Escanear con un archivo de lista de sistemas operativos personalizado
python3 cve.py -u https://example.com -O os.txt

# Escanear con un archivo de lista de CVE personalizado
python3 cve.py -u https://example.com -C cves.txt

# Escanear con un archivo de lista de CWE personalizado
python3 cve.py -u https://example.com -W cwes.txt

# Escanear con un archivo de lista de CPE personalizado
python3 cve.py -u https://example.com -C cpes.txt

# Escanear con un archivo de lista de CVSS personalizado
python3 cve.py -u https://example.com -V cvss.txt

# Escanear con un archivo de lista de referencias personalizado
python3 cve.py -u https://example.com -R references.txt

# Escanear con un archivo de lista de descripciones personalizado
python3 cve.py -u https://example.com -D descriptions.txt

# Escanear con un archivo de lista de soluciones personalizado
python3 cve.py -u https://example.com -S solutions.txt

# Escanear con un archivo de lista de referencias cruzadas personalizado
python3 cve.py -u https://example.com -X crossreferences.txt

# Escanear con un archivo de lista de debilidades personalizado
python3 cve.py -u https://example.com -W weaknesses.txt

# Escanear con un archivo de lista de configuraciones personalizado
python3 cve.py -u https://example.com -C configurations.txt

# Escanear con un archivo de lista de entornos personalizado
python3 cve.py -u https://example.com -E environments.txt

# Escanear con un archivo de lista de plataformas personalizado
python3 cve.py -u https://example.com -P platforms.txt

# Escanear con un archivo de lista de productos personalizado
python3 cve.py -u https://example.com -R products.txt

# Escanear con un archivo de lista de proveedores personalizado
python3 cve.py -u https://example.com -V vendors.txt

# Escanear con un archivo de lista de actualizaciones personalizado
python3 cve.py -u https://example.com -U updates.txt

# Escanear con un archivo de lista de parches personalizado
python3 cve.py -u https://example.com -P patches.txt

# Escanear con un archivo de lista de avisos personalizado
python3 cve.py -u https://example.com -A advisories.txt

# Escanear con un archivo de lista de boletines personalizado
python3 cve.py -u https://example.com -B bulletins.txt

# Escanear con un archivo de lista de alertas personalizado
python3 cve.py -u https://example.com -L alerts.txt

# Escanear con un archivo de lista de notificaciones personalizado
python3 cve.py -u https://example.com -N notifications.txt

# Escanear con un archivo de lista de informes personalizado
python3 cve.py -u https://example.com -R reports.txt

# Escanear con un archivo de lista de registros personalizado
python3 cve.py -u https://example.com -L logs.txt

# Escanear con un archivo de lista de resultados personalizado
python3 cve.py -u https://example.com -R results.txt

# Escanear con un archivo de lista de salidas personalizado
python3 cve.py -u https://example.com -O outputs.txt

# Escanear con un archivo de lista de errores personalizado
python3 cve.py -u https://example.com -E errors.txt

# Escanear con un archivo de lista de advertencias personalizado
python3 cve.py -u https://example.com -W warnings.txt

# Escanear con un archivo de lista de mensajes personalizado
python3 cve.py -u https://example.com -M messages.txt

# Escanear con un archivo de lista de depuración personalizado
python3 cve.py -u https://example.com -D debug.txt

# Escanear con un archivo de lista de seguimiento personalizado
python3 cve.py -u https://example.com -T traces.txt

# Escanear con un archivo de lista de pilas personalizado
python3 cve.py -u https://example.com -S stacks.txt

# Escanear con un archivo de lista de excepciones personalizado
python3 cve.py -u https://example.com -E exceptions.txt

# Escanear con un archivo de lista de fallos personalizado
python3 cve.py -u https://example.com -F failures.txt

# Escanear con un archivo de lista de éxitos personalizado
python3 cve.py -u https://example.com -S successes.txt

# Escanear con un archivo de lista de intentos personalizado
python3 cve.py -u https://example.com -A attempts.txt

# Escanear con un archivo de lista de reintentos personalizado
python3 cve.py -u https://example.com -R retries.txt

# Escanear con un archivo de lista de tiempos de espera personalizado
python3 cve.py -u https://example.com -T timeouts.txt

# Escanear con un archivo de lista de conexiones personalizado
python3 cve.py -u https://example.com -C connections.txt

# Escanear con un archivo de lista de sockets personalizado
python3 cve.py -u https://example.com -S sockets.txt

# Escanear con un archivo de lista de puertos personalizado
python3 cve.py -u https://example.com -P ports.txt

# Escanear con un archivo de lista de protocolos personalizado
python3 cve.py -u https://example.com -P protocols.txt

# Escanear con un archivo de lista de servicios personalizado
python3 cve.py -u https://example.com -S services.txt

# Escanear con un archivo de lista de versiones personalizado
python3 cve.py -u https://example.com -V versions.txt

# Escanear con un archivo de lista de sistemas operativos personalizado
python3 cve.py -u https://example.com -O os.txt

# Escanear con un archivo de lista de CVE personalizado
python3 cve.py -u https://example.com -C cves.txt

# Escanear con un archivo de lista de CWE personalizado
python3 cve.py -u https://example.com -W cwes.txt

# Escanear con un archivo de lista de CPE personalizado
python3 cve.py -u https://example.com -C cpes.txt

# Escanear con un archivo de lista de CVSS personalizado
python3 cve.py -u https://example.com -V cvss.txt

# Escanear con un archivo de lista de referencias personalizado
python3 cve.py -u https://example.com -R references.txt

# Escanear con un archivo de lista de descripciones personalizado
python3 cve.py -u https://example.com -D descriptions.txt

# Escanear con un archivo de lista de soluciones personalizado
python3 cve.py -u https://example.com -S solutions.txt

# Escanear con un archivo de lista de referencias cruzadas personalizado
python3 cve.py -u https://example.com -X crossreferences.txt

# Escanear con un archivo de lista de debilidades personalizado
python3 cve.py -u https://example.com -W weaknesses.txt

# Escanear con un archivo de lista de configuraciones personalizado
python3 cve.py -u https://example.com -C configurations.txt

# Escanear con un archivo de lista de entornos personalizado
python3 cve.py -u https://example.com -E environments.txt

# Escanear con un archivo de lista de plataformas personalizado
python3 cve.py -u https://example.com -P platforms.txt

# Escanear con un archivo de lista de productos personalizado
python3 cve.py -u https://example.com -R products.txt

# Escanear con un archivo de lista de proveedores personalizado
python3 cve.py -u https://example.com -V vendors.txt

# Escanear con un archivo de lista de actualizaciones personalizado
python3 cve.py -u https://example.com -U updates.txt

# Escanear con un archivo de lista de parches personalizado
python3 cve.py -u https://example.com -P patches.txt

# Escanear con un archivo de lista de avisos personalizado
python3 cve.py -u https://example.com -A advisories.txt

# Escanear con un archivo de lista de boletines personalizado
python3 cve.py -u https://example.com -B bulletins.txt

# Escanear con un archivo de lista de alertas personalizado
python3 cve.py -u https://example.com -L alerts.txt

# Escanear con un archivo de lista de notificaciones personalizado
python3 cve.py -u https://example.com -N notifications.txt

# Escanear con un archivo de lista de informes personalizado
python3 cve.py -u https://example.com -R reports.txt

# Escanear con un archivo de lista de registros personalizado
python3 cve.py -u https://example.com -L logs.txt

# Escanear con un archivo de lista de resultados personalizado
python3 cve.py -u https://example.com -R results.txt

# Escanear con un archivo de lista de salidas personalizado
python3 cve.py -u https://example.com -O outputs.txt

# Escanear con un archivo de lista de errores personalizado
python3 cve.py -u https://example.com -E errors.txt

# Escanear con un archivo de lista de advertencias personalizado
python3 cve.py -u https://example.com -W warnings.txt

# Escanear con un archivo de lista de mensajes personalizado
python3 cve.py -u https://example.com -M messages.txt

# Escanear con un archivo de lista de depuración personalizado
python3 cve.py -u https://example.com -D debug.txt

# Escanear con un archivo de lista de seguimiento personalizado
python3 cve.py -u https://example.com -T traces.txt

# Escanear con un archivo de lista de pilas personalizado
python3 cve.py -u https://example.com -S stacks.txt

# Escanear con un archivo de lista de excepciones personalizado
python3 cve.py -u https://example.com -E exceptions.txt

# Escanear con un archivo de lista de fallos personalizado
python3 cve.py -u https://example.com -F failures.txt

# Escanear con un archivo de lista de éxitos personalizado
python3 cve.py -u https://example.com -S successes.txt

# Escanear con un archivo de lista de intentos personalizado
python3 cve.py -u https://example.com -A attempts.txt

# Escanear con un archivo de lista de reintentos personalizado
python3 cve.py -u https://example.com -R retries.txt

# Escanear con un archivo de lista de tiempos de espera personalizado
python3 cve.py -u https://example.com -T timeouts.txt

# Escanear con un archivo de lista de conexiones personalizado
python3 cve.py -u https://example.com -C connections.txt

# Escanear con un archivo de lista de sockets personalizado
python3 cve.py -u https://example.com -S sockets.txt

# Escanear con un archivo de lista de puertos personalizado
python3 cve.py -u https://example.com -P ports.txt

# Escanear con un archivo de lista de protocolos personalizado
python3 cve.py -u https://example.com -P protocols.txt

# Escanear con un archivo de lista de servicios personalizado
python3 cve.py -u https://example.com -S services.txt

# Escanear con un archivo de lista de versiones personalizado
python3 cve.py -u https://example.com -V versions.txt

# Escanear con un archivo de lista de sistemas operativos personalizado
python3 cve.py -u https://example.com -O os.txt

# Escanear con un archivo de lista de CVE personalizado
python3 cve.py -u https://example.com -C cves.txt

# Escanear con un archivo de lista de CWE personalizado
python3 cve.py -u https://example.com -W cwes.txt

# Escanear con un archivo de lista de CPE personalizado
python3 cve.py -u https://example.com -C cpes.txt

# Escanear con un archivo de lista de CVSS personalizado
python3 cve.py -u https://example.com -V cvss.txt

# Escanear con un archivo de lista de referencias personalizado
python3 cve.py -u https://example.com -R references.txt

# Escanear con un archivo de lista de descripciones personalizado
python3 cve.py -u https://example.com -D descriptions.txt

# Escanear con un archivo de lista de soluciones personalizado
python3 cve.py -u https://example.com -S solutions.txt

# Escanear con un archivo de lista de referencias cruzadas personalizado
python3 cve.py -u https://example.com -X crossreferences.txt

# Escanear con un archivo de lista de debilidades personalizado
python3 cve.py -u https://example.com -W weaknesses.txt

# Escanear con un archivo de lista de configuraciones personalizado
python3 cve.py -u https://example.com -C configurations.txt

# Escanear con un archivo de lista de entornos personalizado
python3 cve.py -u https://example.com -E environments.txt

# Escanear con un archivo de lista de plataformas personalizado
python3 cve.py -u https://example.com -P platforms.txt

# Escanear con un archivo de lista de productos personalizado
python3 cve.py -u https://example.com -R products.txt

# Escanear con un archivo de lista de proveedores personalizado
python3 cve.py -u https://example.com -V vendors.txt

# Escanear con un archivo de lista de actualizaciones personalizado
python3 cve.py -u https://example.com -U updates.txt

# Escanear con un archivo de lista de parches personalizado
python3 cve.py -u https://example.com -P patches.txt

# Escanear con un archivo de lista de avisos personalizado
python3 cve.py -u https://example.com -A advisories.txt

# Escanear con un archivo de lista de boletines personalizado
python3 cve.py -u https://example.com -B bulletins.txt

# Escanear con un archivo de lista de alertas personalizado
python3 cve.py -u https://example.com -L alerts.txt

# Escanear con un archivo de lista de notificaciones personalizado
python3 cve.py -u https://example.com -N notifications.txt

# Escanear con un archivo de lista de informes personalizado
python3 cve.py -u https://example.com -R reports.txt

# Escanear con un archivo de lista de registros personalizado
python3 cve.py -u https://example.com -L logs.txt

# Escanear con un archivo de lista de resultados personalizado
python3 cve.py -u https://example.com -R results.txt

# Escanear con un archivo de lista de salidas personalizado
python3 cve.py -u https://example.com -O outputs.txt

# Escanear con un archivo de lista de errores personalizado
python3 cve.py -u https://example.com -E errors.txt

# Escanear con un archivo de lista de advertencias personalizado
python3 cve.py -u https://example.com -W warnings.txt

# Escanear con un archivo de lista de mensajes personalizado
python3 cve.py -u https://example.com -M messages.txt

# Escanear con un archivo de lista de depuración personalizado
python3 cve.py -u https://example.com -D debug.txt

# Escanear con un archivo de lista de seguimiento personalizado
python3 cve.py -u https://example.com -T traces.txt

# Escanear con un archivo de lista de pilas personalizado
python3 cve.py -u https://example.com -S stacks.txt

# Escanear con un archivo de lista de excepciones personalizado
python3 cve.py -u https://example.com -E exceptions.txt

# Escanear con un archivo de lista de fallos personalizado
python3 cve.py -u https://example.com -F failures.txt

# Escanear con un archivo de lista de éxitos personalizado
python3 cve.py -u https://example.com -S successes.txt

# Escanear con un archivo de lista de intentos personalizado
python3 cve.py -u https://example.com -A attempts.txt

# Escanear con un archivo de lista de reintentos personalizado
python3 cve.py -u https://example.com -R retries.txt

# Escanear con un archivo de lista de tiempos de espera personalizado
python3 cve.py -u https://example.com -T timeouts.txt

# Escanear con un archivo de lista de conexiones personalizado
python3 cve.py -u https://example.com -C connections.txt

# Escanear con un archivo de lista de sockets personalizado
python3 cve.py -u https://example.com -S sockets.txt

# Escanear con un archivo de lista de puertos personalizado
python3 cve.py -u https://example.com -P ports.txt

# Escanear con un archivo de lista de protocolos personalizado
python3 cve.py -u https://example.com -P protocols.txt

# Escanear con un archivo de lista de servicios personalizado
python3 cve.py -u https://example.com -S services.txt

# Escanear con un archivo de lista de versiones personalizado
python3 cve.py -u https://example.com -V versions.txt

# Escanear con un archivo de lista de sistemas operativos personalizado
python3 cve.py -u https://example.com -O os.txt

# Escanear con un archivo de lista de CVE personalizado
python3 cve.py -u https://example.com -C cves.txt

# Escanear con un archivo de lista de CWE personalizado
python3 cve.py -u https://example.com -W cwes.txt

# Escanear con un archivo de lista de CPE personalizado
python3 cve.py -u https://example.com -C cpes.txt

# Escanear con un archivo de lista de CVSS personalizado
python3 cve.py -u https://example.com -V cvss.txt

# Escanear con un archivo de lista de referencias personalizado
python3 cve.py -u https://example.com -R references.txt

# Escanear con un archivo de lista de descripciones personalizado
python3 cve.py -u https://example.com -D descriptions.txt

# Escanear con un archivo de lista de soluciones personalizado
python3 cve.py -u https://example.com -S solutions.txt

# Escanear con un archivo de lista de referencias cruzadas personalizado
python3 cve.py -u https://example.com -X crossreferences.txt

# Escanear con un archivo de lista de debilidades personalizado
python3 cve.py -u https://example.com -W weaknesses.txt

# Escanear con un archivo de lista de configuraciones personalizado
python3 cve.py -u https://example.com -C configurations.txt

# Escanear con un archivo de lista de entornos personalizado
python3 cve.py -u https://example.com -E environments.txt

# Escanear con un archivo de lista de plataformas personalizado
python3 cve.py -u https://example.com -P platforms.txt

# Escanear con un archivo de lista de productos personalizado
python3 cve.py -u https://example.com -R products.txt

# Escanear con un archivo de lista de proveedores personalizado
python3 cve.py -u https://example.com -V vendors.txt

# Escanear con un archivo de lista de actualizaciones personalizado
python3 cve.py -u https://example.com -U updates.txt

# Escanear con un archivo de lista de parches personalizado
python3 cve.py -u https://example.com -P patches.txt

# Escanear con un archivo de lista de avisos personalizado
python3 cve.py -u https://example.com -A advisories.txt

# Escanear con un archivo de lista de boletines personalizado
python3 cve.py -u https://example.com -B bulletins.txt

# Escanear con un archivo de lista de alertas personalizado
python3 cve.py -u https://example.com -L alerts.txt

# Escanear con un archivo de lista de notificaciones personalizado
python3 cve.py -u https://example.com -N notifications.txt

# Escanear con un archivo de lista de informes personalizado
python3 cve.py -u https://example.com -R reports.txt

# Escanear con un archivo de lista de registros personalizado
python3 cve.py -u https://example.com -L logs.txt

# Escanear con un archivo de lista de resultados personalizado
python3 cve.py -u https://example.com -R results.txt

# Escanear con un archivo de lista de salidas personalizado
python3 cve.py -u https://example.com -O outputs.txt

# Escanear con un archivo de lista de errores personalizado
python3 cve.py -u https://example.com -E errors.txt

# Escanear con un archivo de lista de advertencias personalizado
python3 cve.py -u https://example.com -W warnings.txt

# Escanear con un archivo de lista de mensajes personalizado
python3 cve.py -u https://example.com -M messages.txt

# Escanear con un archivo de lista de depuración personalizado
python3 cve.py -u https://example.com -D debug.txt

# Escanear con un archivo de lista de seguimiento personalizado
python3 cve.py -u https://example.com -T traces.txt

# Escanear con un archivo de lista de pilas personalizado
python3 cve.py -u https://example.com -S stacks.txt

# Escanear con un archivo de lista de excepciones personalizado
python3 cve.py -u https://example.com -E exceptions.txt

# Escanear con un archivo de lista de fallos personalizado
python3 cve.py -u https://example.com -F failures.txt

# Escanear con un archivo de lista de éxitos personalizado
python3 cve.py -u https://example.com -S successes.txt

# Escanear con un archivo de lista de intentos personalizado
python3 cve.py -u https://example.com -A attempts.txt

# Escanear con un archivo de lista de reintentos personalizado
python3 cve.py -u https://example.com -R retries.txt

# Escanear con un archivo de lista de tiempos de espera personalizado
python3 cve.py -u https://example.com -T timeouts.txt

# Escanear con un archivo de lista de conexiones personalizado
python3 cve.py -u https://example.com -C connections.txt

# Escanear con un archivo de lista de sockets personalizado
python3 cve.py -u https://example.com -S sockets.txt

# Escanear con un archivo de lista de puertos personalizado
python3 cve.py -u https://example.com -P ports.txt

# Escanear con un archivo de lista de protocolos personalizado
python3 cve.py -u https://example.com -P protocols.txt

# Escanear con un archivo de lista de servicios personalizado
python3 cve.py -u https://example.com -S services.txt

# Escanear con un archivo de lista de versiones personalizado
python3 cve.py -u https://example.com -V versions.txt

# Escanear con un archivo de lista de sistemas operativos personalizado
python3 cve.py -u https://example.com -O os.txt

# Escanear con un archivo de lista de CVE personalizado
python3 cve.py -u https://example.com -C cves.txt

# Escanear con un archivo de lista de CWE personalizado
python3 cve.py -u https://example.com -W cwes.txt

# Escanear con un archivo de lista de CPE personalizado
python3 cve.py -u https://example.com -C cpes.txt

# Escanear con un archivo de lista de CVSS personalizado
python3 cve.py -u https://example.com -V cvss.txt

# Escanear con un archivo de lista de referencias personalizado
python3 cve.py -u https://example.com -R references.txt

# Escanear con un archivo de lista de descripciones personalizado
python3 cve.py -u https://example.com -D descriptions.txt

# Escanear con un archivo de lista de soluciones personalizado
python3 cve.py -u https://example.com -S solutions.txt

# Escanear con un archivo de lista de referencias cruzadas personalizado
python3 cve.py -u https://example.com -X crossreferences.txt

# Escanear con un archivo de lista de debilidades personalizado
python3 cve.py -u https://example.com -W weaknesses.txt

# Escanear con un archivo de lista de configuraciones personalizado
python3 cve.py -u https://example.com -C configurations.txt

# Escanear con un archivo de lista de entornos personalizado
python3 cve.py -u https://example.com -E environments.txt

# Escanear con un archivo de lista de plataformas personalizado
python3 cve.py -u https://example.com -P platforms.txt

# Escanear con un archivo de lista de productos personalizado
python3 cve.py -u https://example.com -R products.txt

# Escanear con un archivo de lista de proveedores personalizado
python3 cve.py -u https://example.com -V vendors.txt

# Escanear con un archivo de lista de actualizaciones personalizado
python3 cve.py -u https://example.com -U updates.txt

# Escanear con un archivo de lista de parches personalizado
python3 cve.py -u https://example.com -P patches.txt

# Escanear con un archivo de lista de avisos personalizado
python3 cve.py -u https://example.com -A advisories.txt

# Escanear con un archivo de lista de boletines personalizado
python3 cve.py -u https://example.com -B bulletins.txt

# Escanear con un archivo de lista de alertas personalizado
python3 cve.py -u https://example.com -L alerts.txt

# Escanear con un archivo de lista de notificaciones personalizado
python3 cve.py -u https://example.com -N notifications.txt

# Escanear con un archivo de lista de informes personalizado
python3 cve.py -u https://example.com -R reports.txt

# Escanear con un archivo de lista de registros personalizado
python3 cve.py -u https://example.com -L logs.txt

# Escanear con un archivo de lista de resultados personalizado
python3 cve.py -u https://example.com -R results.txt

# Escanear con un archivo de lista de salidas personalizado
python3 cve.py -u https://example.com -O outputs.txt

# Escanear con un archivo de lista de errores personalizado
python3 cve.py -u https://example.com -E errors.txt

# Escanear con un archivo de lista de advertencias personalizado
python3 cve.py -u https://example.com -W warnings.txt

# Escanear con un archivo de lista de mensajes personalizado
python3 cve.py -u https://example.com -M messages.txt

# Escanear con un archivo de lista de depuración personalizado
python3 cve.py -u https://example.com -D debug.txt

# Escanear con un archivo de lista de seguimiento personalizado
python3 cve.py -u https://example.com -T traces.txt

# Escanear con un archivo de lista de pilas personalizado
python3 cve.py -u https://example.com -S stacks.txt

# Escanear con un archivo de lista de excepciones personalizado
python3 cve.py -u https://example.com -E exceptions.txt

# Escanear con un archivo de lista de fallos personalizado
python3 cve.py -u https://example.com -F failures.txt

# Escanear con un archivo de lista de éxitos personalizado
python3 cve.py -u https://example.com -S successes.txt

# Escanear con un archivo de lista de intentos personalizado
python3 cve.py -u https://example.com -A attempts.txt

# Escanear con un archivo de lista de reintentos personalizado
python3 cve.py -u https://example.com -R retries.txt

# Escanear con un archivo de lista de tiempos de espera personalizado
python3 cve.py -u https://example.com -T timeouts.txt

# Escanear con un archivo de lista de conexiones personalizado
python3 cve.py -u https://example.com -C connections.txt

# Escanear con un archivo de lista de sockets personalizado
python3 cve.py -u https://example.com -S sockets.txt

# Escanear con un archivo de lista de puertos personalizado
python3 cve.py -u https://example.com -P ports.txt

#```bash
python scripts/lab.py fixed

🧩 Análisis de la arquitectura de la aplicación

La aplicación está diseñada con una arquitectura modular para garantizar la escalabilidad, el mantenimiento y la claridad. A continuación se muestra un desglose de los componentes clave:

1. Capa de interfaz de usuario (UI)

  • Construida con React y Tailwind CSS para una interfaz de usuario responsiva y moderna.
  • Componentes:
    • Dashboard: Muestra métricas en tiempo real y resúmenes de amenazas.
    • ThreatMap: Visualiza datos de amenazas geolocalizadas mediante react-simple-maps.
    • AlertPanel: Lista las alertas activas con opciones de filtrado y clasificación.

2. Capa de lógica de negocio

  • Implementada en Node.js con Express.
  • Servicios principales:
    • ThreatAnalyzer: Procesa los datos entrantes y aplica reglas de detección.
    • NotificationService: Envía alertas por correo electrónico, Slack o webhooks.
    • ReportGenerator: Crea informes exportables en PDF o CSV.

3. Capa de datos

  • Utiliza PostgreSQL para datos estructurados y Redis para almacenamiento en caché.
  • Esquemas:
    • threats: Almacena los registros de amenazas con marcas de tiempo e indicadores de gravedad.
    • users: Gestiona cuentas de usuario, roles y permisos.
    • logs: Registra las actividades del sistema y los eventos de auditoría.

4. Integraciones externas

  • Se conecta a las siguientes API:
    • VirusTotal: Para el análisis de reputación de archivos y URL.
    • Shodan: Para el descubrimiento de dispositivos expuestos.
    • AlienVault OTX: Para inteligencia sobre amenazas.

5. Seguridad

  • Aplica autenticación JWT y OAuth2.
  • Cifra los datos confidenciales en reposo mediante AES-256.
  • Aplica limitación de velocidad y validación de entrada para prevenir ataques comunes.

6. Despliegue

  • Contenedorizado con Docker y orquestado mediante Kubernetes.
  • Integración continua/despliegue continuo (CI/CD) a través de GitHub Actions.
  • Supervisión con Prometheus y Grafana.

7. Estructura de directorios

root@kitploit:~
project-root/
├── client/          # Código frontend (React)
├── server/          # Código backend (Node.js)
├── database/        # Migraciones y seeds
├── config/          # Archivos de configuración
├── tests/           # Pruebas unitarias y de integración
└── docs/            # Documentación

8. Variables de entorno

VariableDescripciónValor por defecto
PORTPuerto del servidor3000
DB_HOSTHost de PostgreSQLlocalhost
REDIS_URLURL de conexión a Redisredis://localhost:6379
JWT_SECRETClave secreta para JWT(ninguno)

9. Puntos de conexión de la API

  • GET /api/threats: Recupera una lista de amenazas.
  • POST /api/threats: Crea un nuevo registro de amenaza.
  • GET /api/users: Lista todos los usuarios (solo administradores).
  • POST /api/login: Autentica a un usuario y devuelve un token JWT.

10. Hoja de ruta

  • Añadir soporte para fuentes de inteligencia sobre amenazas adicionales.
  • Implementar detección de anomalías basada en aprendizaje automático.
  • Desarrollar una aplicación móvil complementaria.
  • Mejorar la interfaz de usuario con temas personalizables.```bash python scripts/lab.py audit
root@kitploit:~
O toda la historia de una vez, con la lección al final:```bash
python scripts/lab.py all

Y la imagen:```bash python scripts/lab.py console

root@kitploit:~
<details>
<summary><b>Todo lo demás</b> — la CLI del detector, la matriz, el informe, las figuras, los servidores</summary>

<br>

Reproduce la evidencia comprometida a través del paquete. No se necesita ejecutar la aplicación — el
detector es estrictamente posterior, y esta es la prueba:```bash
python -m detector --once --timeline --events evidence/vulnerable-persistence.jsonl

Una regla a la vez, o la ingenua, o el escaneo de estado:```bash python -m detector --once --rule AFTERLIFE-003 --events evidence/vulnerable-persistence.jsonl

root@kitploit:~
| `--no-color` | Desactiva la salida en color |
| `--debug` | Habilita el registro de depuración |
| `--json` | Salida en formato JSON |
| `--quiet` | Modo silencioso, solo errores |
| `--verbose` | Salida detallada |

### Ejemplos

```bash
# Escanear un objetivo
python3 cve_2026_XXXXX.py -t https://example.com

# Escanear con opciones personalizadas
python3 cve_2026_XXXXX.py -t https://example.com --timeout 30 --threads 10

# Salida en formato JSON
python3 cve_2026_XXXXX.py -t https://example.com --json

# Escanear múltiples objetivos desde un archivo
python3 cve_2026_XXXXX.py -f targets.txt

Cómo funciona

El script realiza los siguientes pasos:

  1. Detección de versión: Identifica la versión del software objetivo
  2. Verificación de vulnerabilidad: Comprueba si la versión es vulnerable
  3. Explotación: Intenta explotar la vulnerabilidad si es posible
  4. Reporte: Genera un informe con los resultados

Detección de versión

El script utiliza múltiples métodos para detectar la versión:

  • Análisis de encabezados HTTP
  • Análisis de respuestas del servidor
  • Análisis de archivos estáticos
  • Análisis de metadatos

Verificación de vulnerabilidad

Una vez detectada la versión, el script compara con la lista de versiones vulnerables conocidas.

Explotación

Si la versión es vulnerable, el script intenta explotar la vulnerabilidad utilizando las técnicas documentadas en el CVE.

Solución de problemas

El script no detecta la versión

Si el script no puede detectar la versión, intente:

  1. Verificar que el objetivo sea accesible
  2. Aumentar el tiempo de espera con --timeout
  3. Proporcionar la versión manualmente con --version

Falsos positivos

Si obtiene falsos positivos, intente:

  1. Verificar manualmente la versión del objetivo
  2. Utilizar la opción --verbose para ver más detalles
  3. Revisar los registros de depuración con --debug

Errores de conexión

Si experimenta errores de conexión:

  1. Verificar la conectividad de red
  2. Comprobar si hay un proxy o firewall
  3. Aumentar el tiempo de espera

Aviso legal

Esta herramienta está destinada únicamente a pruebas de seguridad autorizadas y fines educativos. Los autores no se hacen responsables del uso indebido o de los daños causados por esta herramienta.

ADVERTENCIA: El uso de esta herramienta contra objetivos sin autorización previa por escrito es ilegal. Asegúrese de tener la autorización adecuada antes de realizar cualquier prueba.

Contribuciones

Las contribuciones son bienvenidas. Por favor, asegúrese de:

  1. Hacer fork del repositorio
  2. Crear una rama para su función (git checkout -b feature/nueva-funcion)
  3. Confirmar sus cambios (git commit -am 'Añadir nueva función')
  4. Subir la rama (git push origin feature/nueva-funcion)
  5. Crear un nuevo Pull Request

Licencia

Este proyecto está licenciado bajo la Licencia MIT - consulte el archivo LICENSE para más detalles.

Agradecimientos

  • Al equipo de seguridad por el descubrimiento y la divulgación responsable
  • A la comunidad de código abierto por las herramientas y bibliotecas utilizadas
  • A todos los contribuyentes que han ayudado a mejorar esta herramienta

Descargo de responsabilidad

El software se proporciona "tal cual", sin garantía de ningún tipo, expresa o implícita, incluyendo pero no limitado a las garantías de comerciabilidad, idoneidad para un propósito particular y no infracción. En ningún caso los autores o titulares de derechos de autor serán responsables de ninguna reclamación, daños u otra responsabilidad, ya sea en una acción de contrato, agravio o de otro tipo, que surja de, fuera de o en conexión con el software o el uso u otras transacciones en el software.```bash python -m detector --once --naive --events evidence/vulnerable-persistence.jsonl

root@kitploit:~
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no-verify` | Omitir la verificación de la cadena de suministro |
| `--no```bash
python -m detector --audit --events evidence/vulnerable-persistence.jsonl

El CLI sale con 1 cuando encuentra algo, por lo que funciona como una verificación de CI sin analizar su salida.

Nueve escenarios contra ambas implementaciones, con invariantes de autoverificación:```bash python scripts/scenarios.py

root@kitploit:~
El informe de incidente que se le entregaría a un respondedor, y las figuras en este README:```bash
python scripts/report.py

| --no-color | Desactiva la salida con color | | --verbose | Muestra información detallada de depuración | | --quiet | Suprime toda la salida excepto los errores | | --json | Genera la salida en formato JSON | | --config <path> | Especifica la ruta del archivo de configuración | | --timeout <seconds> | Establece el tiempo de espera de la solicitud | | --retry <count> | Número de reintentos en caso de fallo | | --proxy <url> | Usa el proxy especificado para las solicitudes | | --user-agent <string> | Establece una cadena de User-Agent personalizada | | --header <header> | Añade una cabecera HTTP personalizada | | --cookie <cookie> | Añade una cookie personalizada | | --output <file> | Escribe la salida en un archivo | | --input <file> | Lee la entrada desde un archivo | | --threads <count> | Número de hilos concurrentes | | --rate-limit <count> | Limita el número de solicitudes por segundo | | --follow-redirects | Sigue las redirecciones HTTP | | --insecure | Omite la verificación del certificado TLS | | --debug | Habilita el registro de depuración | | --version | Muestra la versión del programa | | --help | Muestra el mensaje de ayuda |```bash python scripts/figures.py

root@kitploit:~
La consola en vivo y la API del laboratorio de forma manual — ambas solo en loopback:```bash
python -m console

| --no-remote | Deshabilitar la carga remota de plantillas | | --no-update | Deshabilitar la comprobación de actualizaciones | | --verbose | Habilitar registro detallado | | --debug | Habilitar registro de depuración | | --silent | Modo silencioso (solo errores) | | --json | Salida en formato JSON | | --yaml | Salida en formato YAML | | --csv | Salida en formato CSV | | --xml | Salida en formato XML | | --html | Salida en formato HTML | | --markdown | Salida en formato Markdown | | --table | Salida en formato de tabla | | --tree | Salida en formato de árbol | | --graph | Salida en formato de grafo | | --dot | Salida en formato DOT | | --mermaid | Salida en formato Mermaid | | --plantuml | Salida en formato PlantUML | | --drawio | Salida en formato Draw.io | | --excalidraw | Salida en formato Excalidraw | | --svg | Salida en formato SVG | | --png | Salida en formato PNG | | --pdf | Salida en formato PDF | | --docx | Salida en formato DOCX | | --xlsx | Salida en formato XLSX | | --pptx | Salida en formato PPTX | | --odt | Salida en formato ODT | | --ods | Salida en formato ODS | | --odp | Salida en formato ODP | | --epub | Salida en formato EPUB | | --mobi | Salida en formato MOBI | | --azw3 | Salida en formato AZW3 | | --fb2 | Salida en formato FB2 | | --rtf | Salida en formato RTF | | --txt | Salida en formato TXT | | --log | Salida en formato LOG | | --ini | Salida en formato INI | | --toml | Salida en formato TOML | | --env | Salida en formato ENV | | --properties | Salida en formato Properties | | --conf | Salida en formato CONF | | --cfg | Salida en formato CFG | | --config | Salida en formato Config | | --settings | Salida en formato Settings | | --preferences | Salida en formato Preferences | | --options | Salida en formato Options | | --args | Salida en formato Args | | --params | Salida en formato Params | | --flags | Salida en formato Flags | | --switches | Salida en formato Switches | | --attributes | Salida en formato Attributes | | --fields | Salida en formato Fields | | --columns | Salida en formato Columns | | --rows | Salida en formato Rows | | --cells | Salida en formato Cells | | --values | Salida en formato Values | | --keys | Salida en formato Keys | | --entries | Salida en formato Entries | | --items | Salida en formato Items | | --elements | Salida en formato Elements | | --nodes | Salida en formato Nodes | | --edges | Salida en formato Edges | | --vertices | Salida en formato Vertices | | --links | Salida en formato Links | | --relations | Salida en formato Relations | | --connections | Salida en formato Connections | | --dependencies | Salida en formato Dependencies | | --references | Salida en formato References | | --citations | Salida en formato Citations | | --footnotes | Salida en formato Footnotes | | --endnotes | Salida en formato Endnotes | | --annotations | Salida en formato Annotations | | --comments | Salida en formato Comments | | --notes | Salida en formato Notes | | --remarks | Salida en formato Remarks | | --observations | Salida en formato Observations | | --warnings | Salida en formato Warnings | | --errors | Salida en formato Errors | | --exceptions | Salida en formato Exceptions | | --failures | Salida en formato Failures | | --successes | Salida en formato Successes | | --results | Salida en formato Results | | --outputs | Salida en formato Outputs | | --inputs | Salida en formato Inputs | | --sources | Salida en formato Sources | | --targets | Salida en formato Targets | | --destinations | Salida en formato Destinations | | --paths | Salida en formato Paths | | --routes | Salida en formato Routes | | --endpoints | Salida en formato Endpoints | | --urls | Salida en formato URLs | | --uris | Salida en formato URIs | | --iris | Salida en formato IRIs | | --urns | Salida en formato URNs | | --names | Salida en formato Names | | --ids | Salida en formato IDs | | --uuids | Salida en formato UUIDs | | --guids | Salida en formato GUIDs | | --hashes | Salida en formato Hashes | | --checksums | Salida en formato Checksums | | --digests | Salida en formato Digests | | --signatures | Salida en formato Signatures | | --certificates | Salida en formato Certificates | | --keys | Salida en formato Keys | | --tokens | Salida en formato Tokens | | --secrets | Salida en formato Secrets | | --passwords | Salida en formato Passwords | | --credentials | Salida en formato Credentials | | --accounts | Salida en formato Accounts | | --users | Salida en formato Users | | --groups | Salida en formato Groups | | --roles | Salida en formato Roles | | --permissions | Salida en formato Permissions | | --policies | Salida en formato Policies | | --rules | Salida en formato Rules | | --regulations | Salida en formato Regulations | | --laws | Salida en formato Laws | | --standards | Salida en formato Standards | | --specifications | Salida en formato Specifications | | --requirements | Salida en formato Requirements | | --constraints | Salida en formato Constraints | | --limitations | Salida en formato Limitations | | --restrictions | Salida en formato Restrictions | | --boundaries | Salida en formato Boundaries | | --limits | Salida en formato Limits | | --thresholds | Salida en formato Thresholds | | --quotas | Salida en formato Quotas | | --capacities | Salida en formato Capacities | | --volumes | Salida en formato Volumes | | --sizes | Salida en formato Sizes | | --dimensions | Salida en formato Dimensions | | --measurements | Salida en formato Measurements | | --metrics | Salida en formato Metrics | | --statistics | Salida en formato Statistics | | --analytics | Salida en formato Analytics | | --reports | Salida en formato Reports | | --dashboards | Salida en formato Dashboards | | --charts | Salida en formato Charts | | --graphs | Salida en formato Graphs | | --plots | Salida en formato Plots | | --diagrams | Salida en formato Diagrams | | --figures | Salida en formato Figures | | --images | Salida en formato Images | | --pictures | Salida en formato Pictures | | --photos | Salida en formato Photos | | --videos | Salida en formato Videos | | --audios | Salida en formato Audios | | --sounds | Salida en formato Sounds | | --music | Salida en formato Music | | --speech | Salida en formato Speech | | --text | Salida en formato Text | | --documents | Salida en formato Documents | | --files | Salida en formato Files | | --folders | Salida en formato Folders | | --directories | Salida en formato Directories | | --archives | Salida en formato Archives | | --backups | Salida en formato Backups | | --snapshots | Salida en formato Snapshots | | --images | Salida en formato Images | | --containers | Salida en formato Containers | | --vms | Salida en formato VMs | | --hosts | Salida en formato Hosts | | --servers | Salida en formato Servers | | --clients | Salida en formato Clients | | --peers | Salida en formato Peers | | --nodes | Salida en formato Nodes | | --clusters | Salida en formato Clusters | | --pods | Salida en formato Pods | | --services | Salida en formato Services | | --applications | Salida en formato Applications | | --programs | Salida en formato Programs | | --processes | Salida en formato Processes | | --threads | Salida en formato Threads | | --tasks | Salida en formato Tasks | | --jobs | Salida en formato Jobs | | --workflows | Salida en formato Workflows | | --pipelines | Salida en formato Pipelines | | --stages | Salida en formato Stages | | --steps | Salida en formato Steps | | --phases | Salida en formato Phases | | --iterations | Salida en formato Iterations | | --loops | Salida en formato Loops | | --cycles | Salida en formato Cycles | | --periods | Salida en formato Periods | | --intervals | Salida en formato Intervals | | --durations | Salida en formato Durations | | --timeouts | Salida en formato Timeouts | | --delays | Salida en formato Delays | | --latencies | Salida en formato Latencies | | --throughputs | Salida en formato Throughputs | | --bandwidths | Salida en formato Bandwidths | | --speeds | Salida en formato Speeds | | --rates | Salida en formato Rates | | --frequencies | Salida en formato Frequencies | | --wavelengths | Salida en formato Wavelengths | | --amplitudes | Salida en formato Amplitudes | | --phases | Salida en formato Phases | | --angles | Salida en formato Angles | | --rotations | Salida en formato Rotations | | --translations | Salida en formato Translations | | --scales | Salida en formato Scales | | --transforms | Salida en formato Transforms | | --matrices | Salida en formato Matrices |

root@kitploit:~

---

[Read more](https://github.com/het-p301204/afterlife)
Descargar herramienta
las filas de la matriz que sostienen un argumento
test_privilege_changes.pyMFA, cambio de rol y recuperación de cuenta, en ambos modos
test_telemetry.pyel contrato de redacción y una búsqueda en el registro de las cadenas bearer literales emitidas
test_app.pyfirmas falsificadas, tipos de credencial incorrectos, expiración desde el estado del servidor
test_infrastructure.pyconfiguración, reloj, líneas parciales del tailer, ambas CLI, cada comando de demostración