Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
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
engagement-mgr — Engagement Manager es una aplicación web para el seguimiento de compromisos de seguridad ofensiva. Cuenta con una interfaz de usuario moderna, construida con Next.js, Prisma y PostgreSQL. | Kitploit
Herramientas/GitHubGitHub/leebaird/engagement-mgr
Herramientas DefensivasAnálisis de VulnerabilidadesSeguridad WebPruebas de PenetraciónUtilidades y FrameworksAprendizaje y EducaciónRed TeamingRespuesta a Incidentes
GitHubleebaird/engagement-mgr

engagement-mgr

Engagement Manager es una aplicación web para el seguimiento de compromisos de seguridad ofensiva. Cuenta con una interfaz de usuario moderna, construida con Next.js, Prisma y PostgreSQL.

2438hace 2 díasRevisado por Kitploit

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 →
Ver Repositorio
Compartir

Engagement Manager

Engagement Manager es una aplicación web para el seguimiento de compromisos de seguridad ofensiva. Cuenta con una interfaz de usuario moderna, construida con Next.js, Prisma y PostgreSQL. La aplicación incluye un calendario, compromisos, clientes, contactos, hallazgos y operadores.

License: MIT

  • Twitter Follow Lee Baird @discoverscripts
  • Twitter Follow Jay "L1ghtn1ng" Townsend @jay_townsend1

Capturas de pantalla

Dashboard

Tabla de contenidos

  • Capturas de pantalla
  • Redacción de hallazgos y generación de informes PDF
  • Seguridad de informes y despliegue
  • Verificación
  • Requisitos previos
  • Configuración del entorno
  • Configuración de la base de datos
    • Desarrollo
    • Producción
  • Instalación
    • Configuración automatizada (Ubuntu)
      • Notas de actualización para la configuración reforzada y las copias de seguridad
    • Configuración manual
  • Ejecución de la aplicación
  • Despliegue en producción
    • Requisitos
    • Pasos de despliegue
    • Lista de verificación para producción
  • Credenciales predeterminadas
  • Migración de servidor (Copia de seguridad / Restauración / Reinicio)
  • Plan de implementación y arquitectura
    • Stack tecnológico
    • Esquema de la base de datos
    • Adición de nuevos campos
    • Arquitectura de seguridad
  • Redacción de hallazgos y generación de informes PDF

    • Espacio de trabajo de redacción: abre el enlace Write & review de un hallazgo para editar en Markdown y obtener una vista previa segura. Los borradores privados se guardan tras 15 segundos de inactividad o bajo demanda; se almacenan en el servidor, no en el almacenamiento local del navegador. Recupera un borrador explícitamente tras reabrirlo. Los guardados en conflicto conservan el texto del editor y requieren comparación con la revisión actual. Las revisiones de texto pueden inspeccionarse y restaurarse; la restauración no restaura la evidencia eliminada.
    • Plantillas reutilizables: busca redacción aprobada por título, categoría o severidad. Los usuarios pueden proponer plantillas; los administradores las curan y aprueban. Aplicar una plantilla crea un hallazgo de compromiso independiente con observaciones, hosts afectados y evidencia vacíos, evitando la reutilización accidental de la prueba de otro compromiso.
    • Evidencia: sube o pega hasta cuatro imágenes PNG/JPEG juntas, añade pies de foto y edita el pie de foto/orden en el espacio de trabajo de redacción. Las imágenes se decodifican, se les eliminan los metadatos, se redimensionan a un máximo de 2000 × 2000 píxeles y se guardan como PNG. Conserva la evidencia forense original por separado si se requieren los bytes o metadatos originales.
    • Revisión: envía los hallazgos completos de Draft/Changes Requested a Ready. Un revisor asignado o administrador, distinto del autor actual, puede aprobar o solicitar cambios. Los administradores asignan revisores. Los cambios en el texto, la evidencia y las revisiones restauradas anulan la aprobación. La cola de revisión, los comentarios, la lista de verificación de preparación y el historial de revisiones facilitan el traspaso.
    • Informes PDF: elige un compromiso en Reports, redacta su resumen ejecutivo, selecciona/ordena los hallazgos y guarda la configuración. Los borradores de PDF están visiblemente marcados. Solo los administradores pueden emitir un PDF final, y cada hallazgo seleccionado debe estar aprobado y superar las comprobaciones de preparación. Cada versión emitida almacena su PDF, una instantánea de contenido explícita y un resumen SHA-256; las ediciones posteriores no lo regeneran. Eliminar el compromiso padre sigue eliminando sus informes a través del ciclo de vida existente.
    • Importaciones de escáneres: previsualiza una exportación, selecciona hallazgos y luego confirma. Las importaciones nunca ejecutan escaneos ni contactan con los objetivos. La huella digital del lado del servidor omite los hallazgos coincidentes en el mismo compromiso; todos los registros nuevos comienzan como Draft y deben ser revisados por un operador.
    Familia de escáner/exportaciónExportación aceptada
    Burp SuiteIssues XML, incluido el DTD de esquema interno inerte
    Nessus / TenableNessus v2 XML (.nessus)
    NmapXML; los puertos abiertos y la salida de sus scripts se convierten en observaciones informativas, no en vulnerabilidades inferidas
    OpenVAS / GreenboneInforme XML nativo o GMP get_reports_response
    OWASP ZAPInforme JSON tradicional con sitios y alertas
    NucleiJSON Lines (-jsonl)
    QualysXML de resultados de escaneo (estructura SCAN/IP), no el formato separado de la API de detección de hosts
    Semgrep / CodeQL y otros productores de SARIFEjecuciones, reglas y resultados SARIF JSON

    Las exportaciones están limitadas a 2 MB y 500 hallazgos por importación, con límites de tasa de previsualización y confirmación por usuario. La aplicación acepta como máximo 10.000 hallazgos en total y 500 para un solo compromiso entre creación manual, plantillas e importaciones de escáneres. La lista global de Findings carga 100 filas por página, y las consultas de hallazgos de compromiso/informe están limitadas por el mismo límite por compromiso. Los diseños desconocidos fallan de forma visible en lugar de tratarse silenciosamente como una importación exitosa. Las severidades del escáner son sugerencias: revisa su contexto antes de la aprobación. Las URL referenciadas, el HTML y las imágenes remotas incrustadas no se obtienen ni se ejecutan.

    Los informes permiten de 1 a 100 hallazgos, hasta 100 imágenes de evidencia (5 MB cada una, 20 MB de entrada total), 500 páginas y 25 MB de salida. La emisión está limitada a 50 versiones por compromiso y 1 GB de PDF emitidos en toda la aplicación. La previsualización y la emisión tienen límites de tasa por usuario, y solo se admite una renderización de PDF por proceso de aplicación a la vez. Los hallazgos conservan como máximo 1000 revisiones y 500 comentarios; alcanzar un límite falla sin sobrescribir el historial. Las fuentes DejaVu y su licencia de redistribución se incluyen en assets/fonts; los despliegues deben conservar estos recursos (el trazado de salida de Next los incluye).

    Las Server Actions de Next.js comparten un único límite de tamaño de cuerpo de 25mb (establecido en next.config.ts) para las subidas de evidencia. El inicio de sesión utiliza una ruta dedicada codificada por URL del mismo origen con un límite de transmisión de 4 KB antes de la autenticación o del trabajo en la base de datos.

    Seguridad de informes y despliegue

    Esto preserva el espacio de trabajo autenticado compartido existente, no un nuevo modelo de tenencia por cliente. Todas las páginas nuevas, acciones y descargas de PDF comprueban una sesión actual respaldada por la base de datos. Los borradores están limitados a su propietario; los permisos de revisión, aprobación de plantillas y emisión se aplican en el lado del servidor. Las respuestas de PDF confidenciales son privadas/no-store. Los PDF finales contienen solo una lista de campos de informe explícita permitida, nunca borradores privados, comentarios de revisión ni compromisos no relacionados.

    La implementación utiliza la lista de verificación OWASP Top 10:2025: comprobaciones de acceso (A01), respuestas privadas y controles CSP/CSRF existentes (A02), dependencias fijadas y CI (A03), protecciones de sesión/secreto existentes más comprobaciones de integridad de informes (A04/A08), Markdown/XML inerte y acceso parametrizado a la base de datos (A05), procesamiento acotado y revisión independiente (A06), comprobaciones de sesión en vivo (A07), eventos de auditoría sin contenido (A09) y cambios transaccionales con limpieza en caso de fallo (A10). Un resumen detecta corrupción accidental; no es una firma digital ni una protección frente a un administrador de base de datos. Esto no es una certificación de cumplimiento. Producción sigue requiriendo HTTPS, almacenamiento protegido de base de datos/copias de seguridad y monitoreo operativo de la salida de auditoría.

    Antes de desplegar esta actualización, realiza una copia de seguridad normal de la aplicación y aplica las migraciones aditivas 20260904221808_reporting_workflow y 20260906194500_add_revocable_sessions con npm run db:migrate, luego regenera Prisma Client y reconstruye. Los hallazgos existentes comienzan como Draft en la versión 1, y las cookies del navegador existentes deben iniciar sesión de nuevo para recibir un ID de sesión respaldado por el servidor. No reinicies una base de datos existente. Las copias de seguridad incluyen las nuevas tablas y los PDF emitidos a través de la exportación completa de base de datos existente.

    Verificación```bash

    npm test npm run lint npx tsc --noEmit --noUnusedLocals --noUnusedParameters npm run build npm audit

    root@kitploit:~
    `npm test` usa el modo de prueba no aislado de Node con `tsx` para que los casos de prueba individuales de TypeScript se ejecuten, en lugar de limitarse a informar el éxito del subproceso del archivo. Mantén visibles los totales de aserciones explícitas en CI.
    
    Las regresiones de base de datos y navegador requieren una **base de datos local dedicada llamada `reporting_tests`**, con las migraciones aplicadas. Estas crean y eliminan sus propias filas de fixture; nunca apuntes estas pruebas a una base de datos de aplicación. Establece `REPORTING_TEST_DATABASE_URL` a esa base de datos de prueba, luego ejecuta:```bash
    DATABASE_URL="$REPORTING_TEST_DATABASE_URL" npx prisma migrate deploy
    npm run test:reporting
    npx playwright install chromium
    npm run test:browser
    

    El conjunto de pruebas del navegador inicia su propio servidor de desarrollo en loopback en el puerto 3317 con un secreto de sesión exclusivo para pruebas; se niega a reutilizar un servidor existente. Establece REPORTING_TEST_BROWSER a un ejecutable de Chromium instalado si se desea. Prueba la privacidad de borradores, ediciones conflictivas, carga de evidencias, revisión independiente, permisos/inmutabilidad de PDF, creación de plantillas sin JavaScript e importaciones selectivas deduplicadas. Las pruebas de integración ejercitan conflictos transaccionales reales y rollback. Los conjuntos de pruebas no reemplazan la verificación en LAN remota, Safari o despliegue en producción.

    Requisitos previos

    Esta aplicación está diseñada para ejecutarse en Ubuntu y requiere lo siguiente:```bash sudo apt update && sudo apt install -y nodejs npm postgresql postgresql-client postgresql-contrib zip

    root@kitploit:~
    `postgresql-client` proporciona `pg_dump`, `pg_restore` y `psql`; `zip` crea archivos de respaldo. La extracción de la restauración es gestionada por la aplicación con validación estricta de entradas y tamaño.
    
    Instalar los paquetes no siempre deja PostgreSQL en ejecución. Inicie y habilite el servicio antes de crear roles o iniciar la aplicación:```bash
    sudo systemctl enable --now postgresql
    sudo systemctl status postgresql --no-pager
    

    Si la aplicación falla más tarde con Can't reach database server at 127.0.0.1:5432, ejecuta sudo systemctl start postgresql y confirma con pg_isready -h 127.0.0.1 -p 5432.

    La aplicación requiere Node.js ^22.12.0 o >=24.0.0 (consulta engines en package.json). Si el paquete del sistema operativo es más antiguo, instala una versión compatible desde una fuente de paquetes de confianza cuyas firmas verifiques antes de ejecutar setup.sh.

    Configuración del entorno

    Crea un archivo .env en la raíz del proyecto antes de ejecutar Prisma o la aplicación:```bash cat > .env << 'EOF' DATABASE_URL="postgresql://em_admin:em_pass@localhost:5432/engagement_manager?schema=public" JWT_SECRET="replace-with-a-long-random-secret-at-least-32-characters" EOF chmod 600 .env

    root@kitploit:~
    | Variable | Obligatorio | Notas |
    |----------|----------|-------|
    | `DATABASE_URL` | Sí | Cadena de conexión de PostgreSQL. Prisma utiliza el parámetro de consulta `schema=public`. La copia de seguridad y la restauración utilizan un archivo pgpass temporal solo para el propietario, de modo que la contraseña no se coloca en los argumentos del subproceso. |
    | `JWT_SECRET` | Sí en producción | Debe tener al menos **32 caracteres**. La aplicación se niega a iniciarse en producción sin él. Rotarlo invalida todas las sesiones existentes. |
    | `TRUST_PROXY` | No | Establézcalo en `1` (o `true`) solo cuando la aplicación esté detrás de un proxy inverso que **sobrescriba** `X-Forwarded-For` / `X-Real-IP` y `X-Forwarded-Host`. Las comprobaciones de origen de inicio de sesión utilizan `X-Forwarded-Host` cuando está presente en este modo; debe contener un host público, incluido un puerto no predeterminado cuando se utilice. De lo contrario, el proxy debe preservar el encabezado `Host` público. Esta es la topología de producción requerida para límites precisos de inicio de sesión por origen. Cuando no se establece, los encabezados se ignoran para evitar la suplantación y el inicio de sesión utiliza un presupuesto de respaldo compartido de un minuto más alto, de modo que un cliente no puede imponer un bloqueo global de 15 minutos. |
    | `ALLOWED_DEV_ORIGINS` | No | **Solo desarrollo.** Nombres de host adicionales permitidos para cargar recursos de `/_next` (separados por comas). Las direcciones IPv4 actuales de la LAN del servidor se permiten automáticamente. Utilice esto para un nombre DNS estable. Las compilaciones de producción ignoran esto. |
    
    Genere un secreto fuerte:```bash
    openssl rand -base64 32
    

    Configuración de la base de datos

    Asegúrate de que PostgreSQL esté en ejecución primero (consulta Requisitos previos). El script automatizado ./setup.sh inicia el servicio por ti; los pasos manuales a continuación asumen que ya está en funcionamiento.

    Desarrollo

    Ejecuta los siguientes comandos para crear la base de datos y el usuario de PostgreSQL:```bash sudo -u postgres createuser --pwprompt em_admin sudo -u postgres psql -c "ALTER USER em_admin CREATEDB;" sudo -u postgres createdb --owner=em_admin engagement_manager sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE engagement_manager TO em_admin;"

    root@kitploit:~
    ### Producción
    
    Utilice un usuario de base de datos dedicado con **privilegios mínimos** — no otorgue `CREATEDB` ni derechos de superusuario:```bash
    sudo -u postgres createuser --pwprompt em_app
    sudo -u postgres createdb --owner=em_app engagement_manager
    

    Establece DATABASE_URL para usar em_app (o el nombre de usuario que elijas). Las migraciones se ejecutan como este usuario mediante npm run db:migrate.

    Nota: Los archivos de la base de datos se almacenan en el directorio de datos de PostgreSQL (normalmente /var/lib/postgresql/<version>/main/).

    Instalación

    Configuración automatizada (Ubuntu)

    Desde la raíz del repositorio, ejecuta:```bash chmod +x setup.sh ./setup.sh

    root@kitploit:~
    El script instala los requisitos previos, inicia y habilita el servicio de PostgreSQL, solicita un nombre de usuario y una contraseña para la base de datos, escribe un `.env` con `chmod 600`, crea el rol y la base de datos de PostgreSQL, aplica las migraciones y siembra la cuenta de administrador predeterminada. El modo de producción también completa `npm run build` e imprime únicamente el comando de inicio de producción. No instala Node.js desde un script de shell remoto; instala primero una versión compatible de Node.js.
    
    Para uso sin interfaz gráfica o en CI:```bash
    sudo install -d -m 700 -o "$USER" /secure
    openssl rand -base64 24 > /secure/db-password
    chmod 600 /secure/db-password
    ./setup.sh -y --db-user=em_admin --db-pass-file=/secure/db-password
    

    Ejecute ./setup.sh --help para ver todas las opciones.

    Notas de actualización para la configuración reforzada y las copias de seguridad

    • Se eliminó --db-pass=... porque los secretos en la línea de comandos son visibles para otros procesos. Coloque la contraseña en un archivo accesible solo por el propietario y reemplace el argumento antiguo con --db-pass-file=/secure/db-password; el ejemplo de configuración automatizada anterior está listo para copiar y pegar.
    • setup.sh ya no instala Node.js. Instale una versión compatible de Node.js (^22.12.0 o >=24.0.0) desde una fuente de paquetes confiable antes de ejecutarlo.
    • La instalación de dependencias ahora usa npm ci, por lo que package-lock.json debe estar presente y sincronizado con package.json.
    • Las copias de seguridad .sql heredadas no se pueden restaurar. Antes de retirar un servidor antiguo, actualícelo a una versión que pueda crear la copia de seguridad estructurada de la aplicación y vuelva a exportar los datos como un .zip.

    Configuración manual

    1. Instale las dependencias de Node.js: ```bash npm ci
      root@kitploit:~
    2. Ejecutar las migraciones de la base de datos para crear las tablas: ```bash npx prisma migrate dev
      root@kitploit:~
    3. Inicialice la base de datos para crear la cuenta de Administrador predeterminada: ```bash npx prisma db seed
      root@kitploit:~

    Ejecutar la aplicación

    Desde el directorio del proyecto, un solo comando instala las actualizaciones de paquetes, inicia PostgreSQL si está detenido y arranca la aplicación:```bash ./run.sh

    root@kitploit:~
    Deja esa ventana abierta. Usa la dirección Local o Network que imprime.
    
    Para iniciarlo tú mismo en su lugar: PostgreSQL debe estar en ejecución (`sudo systemctl start postgresql` si es necesario). Luego inicia el servidor de desarrollo:```bash
    npm run dev
    

    Startup imprime tanto una URL de loopback como la dirección LAN de esta máquina:```

    • Local: http://localhost:3000
    • Network: http://192.168.1.20:3000
    root@kitploit:~
    `npm run dev` y `npm start` enlazan `0.0.0.0` para que la URL de red funcione en la LAN. Considera el acceso por LAN solo para laboratorio en una red de confianza. El modo de desarrollo no está reforzado para internet público.
    
    Si abres la aplicación por **nombre de host** (no por IP) y el navegador remoto muestra una página en blanco, añade ese nombre a `.env` y reinicia:```bash
    ALLOWED_DEV_ORIGINS=dev.office.example
    

    Despliegue en Producción

    Requisitos

    • Node.js ^22.12.0 o >=24.0.0 (ver engines en package.json)
    • PostgreSQL con un usuario de aplicación con privilegios mínimos (ver Configuración de la Base de Datos)
    • HTTPS delante de la aplicación (proxy inverso como nginx o Caddy). Las cookies de sesión se marcan como Secure en producción.
    • Almacenamiento persistente para el directorio uploads/ (capturas de pantalla de hallazgos)

    Pasos de despliegue

    1. Clona el repositorio e instala las dependencias: ```bash npm ci

      root@kitploit:~
    2. Cree .env con valores de producción (DATABASE_URL, JWT_SECRET ≥ 32 caracteres).

    3. Aplique las migraciones de la base de datos: ```bash npm run db:migrate

      root@kitploit:~
    4. Ejecutar las comprobaciones previas al despliegue: ```bash npm run audit npm run typecheck npm run build

      root@kitploit:~
    5. Inicie la aplicación con NODE_ENV=production: ```bash NODE_ENV=production npm run start

      root@kitploit:~

    Para un servidor real, ejecuta esto bajo un gestor de procesos (systemd, PM2, etc.) y coloca un proxy inverso delante para la terminación de TLS.

    1. Crea la primera cuenta de administrador mediante el seed de la base de datos (solo en desarrollo) o restaurando desde una copia de seguridad. Cambia la contraseña temporal del seed inmediatamente antes de exponer la aplicación a los usuarios.

    Lista de verificación para producción

    • JWT_SECRET tiene al menos 32 caracteres y no está comprometido en git
    • NODE_ENV=production está configurado para el proceso en ejecución
    • HTTPS está configurado; HTTP redirige a HTTPS
    • El usuario de la base de datos no tiene privilegios CREATEDB ni de superusuario
    • uploads/ está en disco persistente e incluido en las copias de seguridad
    • backups/ está en disco persistente si los administradores usan Backup
    • pg_dump, pg_restore y zip están disponibles si los administradores van a usar Backup/Restore

    Credenciales predeterminadas

    Después de hacer el seed de la base de datos, puedes iniciar sesión usando la cuenta de administrador temporal generada:

    • Nombre de usuario: admin
    • Contraseña: escrita una sola vez en initial-admin-credentials.txt con permisos solo para el propietario mediante npx prisma db seed / npm run db:seed

    Nota: Se te pedirá que cambies esta contraseña temporal en el primer inicio de sesión. Elimina initial-admin-credentials.txt inmediatamente después. Todas las contraseñas deben tener al menos 16 caracteres e incluir una letra mayúscula, una letra minúscula, un número y un símbolo.

    Migración de servidor (Backup / Restore / Reset)

    • La barra lateral almacena localmente el formato de fecha y la preferencia de zona horaria de cada navegador. La zona horaria puede seguir el sistema operativo del espectador o mostrar las marcas de tiempo en UTC; las fechas de programación de engagement permanecen como fechas de calendario sin cambios.
    • El administrador puede hacer copias de seguridad y restaurar todos los datos de la aplicación desde la página Admin (/dashboard/users).
    • Usa esto cuando te muevas de un servidor antiguo a uno nuevo: clona la aplicación en el nuevo host y luego restaura una copia de seguridad del host antiguo.

    En Admin, el panel Database muestra los botones Backup, Restore y Reset. El panel Users lista las cuentas y proporciona un botón New User para añadir usuarios. El panel Appearance permite a un administrador elegir el color de resaltado de toda la aplicación.

    Backup requiere tu contraseña de administrador y luego guarda un .zip llamado em-backup-YYYY-MM-DD-HHMM.zip en backups/ dentro del directorio de la aplicación (engagement-mgr/backups/). Tras una exportación exitosa, usa Download en la página Admin. Se mantiene una concesión firmada de corta duración en una cookie HttpOnly y solo funciona para el administrador que creó la copia de seguridad.

    • La marca de tiempo usa la hora local del servidor que ejecuta la aplicación, sin segundos. Ejemplo: em-backup-2026-06-02-1430.zip.
    RutaContenido
    engagement-manager-backup/database.dumpVolcado completo de PostgreSQL en formato personalizado (esquema, tablas, datos, enums, relaciones) de pg_dump
    engagement-manager-backup/uploads/Archivos de capturas de pantalla de hallazgos referenciados en la base de datos
    • Restore acepta solo un .zip creado por Backup y reemplaza la base de datos actual y la carpeta uploads/. La restauración desde el navegador está limitada a 8 MB para que la descompresión no pueda monopolizar el proceso web. Para un archivo más grande, detén la aplicación y ejecuta npm run db:restore -- /absolute/path/to/em-backup.zip como el usuario de la aplicación. El comando offline carga .env desde el directorio de trabajo y requiere un DATABASE_URL no vacío en .env o en el entorno. Acepta archivos regulares de hasta 500 MB y transmite cada entrada del archivo a través de su límite de tamaño expandido. La restauración de la base de datos se ejecuta en una sola transacción; los recuentos de entradas del archivo, las rutas, las tasas de compresión y los tamaños expandidos se validan antes de instalar los archivos. Backup, restore, reset y los cambios de archivos de capturas de pantalla comparten un bloqueo de mantenimiento exclusivo para que las confirmaciones de la base de datos y los intercambios del sistema de archivos no puedan solaparse. Requiere tu contraseña de administrador para confirmar.
    • Reset borra todos los datos de la aplicación, restaura el color de resaltado rojo predeterminado y recrea admin. Requiere escribir RESET y volver a introducir la contraseña actual del administrador que confirma. Esa contraseña se convierte en la contraseña temporal de la cuenta recreada y debe cambiarse en el primer inicio de sesión.

    Servidor antiguo

    1. Inicia sesión como un usuario Admin.
    2. Abre Admin y haz clic en Backup (bajo Database).
    3. Guarda el .zip y cópialo al nuevo servidor (por ejemplo con scp o rsync): ```bash scp em-backup-2026-06-02-1430.zip user@new-server:/path/to/
      root@kitploit:~

    Servidor nuevo

    1. Instala los Requisitos previos y clona el repositorio.
    2. Crea .env con DATABASE_URL y JWT_SECRET (consulta Configuración del entorno).
    3. Crea una base de datos PostgreSQL vacía y un usuario (consulta Configuración de la base de datos).
    4. Instala las dependencias: npm ci.
    5. Ejecuta las migraciones y el seed una vez para que un Admin pueda iniciar sesión. La restauración reemplaza estos datos de arranque con la copia de seguridad.
    6. Compila e inicia la aplicación en modo producción (consulta Despliegue en producción): ```bash npm run build NODE_ENV=production npm run start
      root@kitploit:~
    7. Inicie sesión como admin usando el archivo initial-admin-credentials.txt exclusivo del propietario, cambie la contraseña temporal y elimine el archivo de credenciales.
    8. Abra Admin (/dashboard/users), haga clic en Restore (en Database), seleccione el .zip del servidor antiguo, introduzca su contraseña de administrador y confirme.
    9. Reinicie la aplicación si ya estaba en ejecución para que cargue los datos restaurados.

    Notas

    • Acciones sensibles: Backup, Restore y Reset requieren todos una reconfirmación de la contraseña de administrador. Restore y Reset también reemplazan las filas existentes de la base de datos y sobrescriben el directorio uploads/.
    • JWT_SECRET: Puede diferir en el nuevo servidor; las sesiones de navegador existentes del servidor antiguo no se migran. Los usuarios vuelven a iniciar sesión con las cuentas de la base de datos importada.
    • Código de la aplicación: Use git clone (o despliegue la misma revisión) en el nuevo servidor para que la aplicación coincida con el esquema esperado por la copia de seguridad. Si el servidor antiguo ejecutaba un esquema más reciente que el código clonado, alinee las versiones antes de importar.
    • Herramientas: La copia de seguridad y la restauración requieren las herramientas de CLI instaladas en Prerequisites.

    Plan de implementación y arquitectura

    Esta sección documenta la arquitectura, el esquema de base de datos, las medidas de seguridad y las fases de desarrollo completadas para la aplicación Engagement Manager.

    Stack tecnológico

    • Framework full-stack: Next.js 16+ (React) usando el App Router.
    • Base de datos: PostgreSQL.
    • ORM: Prisma.
    • Autenticación: Implementación personalizada usando cookies de sesión estrictas (borradas al cerrar el navegador) y Argon2id para el hash de contraseñas. Las contraseñas exigen un mínimo de 16 caracteres, con símbolos, números y mayúsculas y minúsculas mixtas obligatorios.
    • Estilos: CSS vanilla con una estética de modo oscuro glassmorphism en los paneles de página; los modales son totalmente opacos mediante Modal.tsx y .modal-panel en globals.css.

    Esquema de base de datos

    Adiciones de informes: Finding también almacena version, reviewStatus, authorId, reviewerId, templateId e importFingerprint; Screenshot almacena sortOrder. FindingTemplate contiene redacción reutilizable revisada; FindingRevision contiene revisiones de texto inmutables; FindingDraft contiene borradores privados por usuario con versiones de conflicto; FindingComment registra discusiones de revisión; EngagementReport contiene el título del informe, el resumen ejecutivo y los IDs de hallazgos ordenados; IssuedReport almacena un PDF inmutable, una instantánea del contenido y un digest SHA-256 para cada versión emitida. Las relaciones de autor/revisor de usuario usan SetNull; los borradores privados se eliminan cuando se elimina su usuario. Los registros de informes siguen el ciclo de vida de su engagement/finding padre.

    • User: id, username, passwordHash, role (Admin, User), lastPasswordChange, lastLogin, sessions, createdAt, updatedAt.
    • Session: id, userId, expiresAt, createdAt — los registros del lado del servidor hacen que cada sesión de inicio de sesión firmada sea revocable individualmente al cerrar sesión.
    • LoginRateLimit: key, count, resetAt — reservas atómicas de intentos de origen y de confirmación de contraseña. La verificación de contraseña también tiene un límite de concurrencia acotado.
    • ApplicationSetting: registro singleton de configuración de toda la aplicación con highlightColor (Red, Blue, Teal, Green, Purple o Amber) y updatedAt.
    • Engagement: id, codeName, clientId, chargeCode, status (Prep, Recon, Testing, Reporting, Complete), focus, type (AI, Code_Review, Firewall, Multi, Pentest, Phishing, Physical, Purple_Team, Red_Team, USB_Drop, Vishing, Web_App, Wireless), location (Internal, External), startPrep, endPrep, startRecon, endRecon, startTesting, endTesting, startReporting, , , , , , , (M:N), / (M:N con Contact), , , , .
    • Client: id, company (columna de BD: companyName), address, city, state, zip, phone (columna de BD: phoneNumber), website, notes, contacts, engagements, createdAt, updatedAt.
    • Contact: id, clientId, name, title, email, phone (columna de BD: phoneNumber), notes, assignedEngagements, trustedEngagements, createdAt, updatedAt.
    • Finding: id, engagementId (opcional), title, category, severity, background, remediation, supportingData (columna de BD: supportingLinks), screenshots, engagementContext, createdAt, updatedAt.
    • EngagementFindingContext: id, engagementId, findingId, observation, affectedHosts, createdAt, updatedAt.
    • Screenshot: id, findingId, filePath, description, createdAt.
    • Operator: id, name, title, email, phoneNumber, discord, github, notes, engagements (M:N), createdAt, updatedAt.

    Añadir nuevos campos

    Para añadir un nuevo campo a un modelo existente (p. ej., focus en Engagement):

    1. Abra prisma/schema.prisma y añada el campo al modelo deseado: ```prisma model Engagement { id String @id @default(uuid()) codeName String focus String? // new field ... }
      root@kitploit:~
    2. Cada cambio en prisma/schema.prisma debe ir seguido de: ```bash npx prisma migrate dev --name describe_your_change
      root@kitploit:~

    Esto crea una migración, actualiza la base de datos y regenera los tipos de Prisma Client.

    1. Actualiza los componentes de UI, formularios, lógica de validación o acciones de servidor afectados según sea necesario.

    Arquitectura de seguridad

    1. Autenticación y cuentas: La cuenta admin predeterminada se genera mediante el seed de Prisma. Los roles Admin tienen acceso completo de creación/edición/eliminación a todos los registros. Los roles User pueden crear, editar y eliminar hallazgos y capturas de pantalla; todas las demás entidades (compromisos, clientes, contactos, operadores) son de solo lectura para los usuarios. Cada página del panel refresca la sesión contra la base de datos antes de leer datos confidenciales. Solo los administradores pueden acceder a la página de administración (/dashboard/users), gestionar cuentas, cambiar el color de resaltado de toda la aplicación y hacer copias de seguridad, restaurar o restablecer la base de datos. La copia de seguridad, la restauración y el restablecimiento requieren re-confirmación de contraseña. Crear una copia de seguridad es una Server Action; la descarga desde el navegador usa GET /api/db/backup?file=… con la sesión de Admin y una concesión firmada de cinco minutos en una cookie HttpOnly.
    2. Gestión de sesiones: Las sesiones usan JWTs de jose almacenados en cookies HttpOnly, SameSite=Lax y una fila Session correspondiente en el servidor que el logout revoca. La expiración de la cookie se omite intencionalmente para mantener el comportamiento de sesión del navegador; tanto el token firmado como el registro de la base de datos expiran después de un día. La admisión transaccional retiene como máximo diez sesiones activas por cuenta.
    3. Seguridad de la aplicación:
      • El Proxy Edge de Next.js (src/proxy.ts) aplica comprobaciones de sesión y rotación de contraseña de 90 días en todas las rutas protegidas.
      • Las Server Actions de Next.js reducen el riesgo de CSRF con protecciones integradas de mismo origen.
      • Prisma mitiga automáticamente la inyección SQL parametrizando todas las consultas.
      • React mitiga XSS escapando automáticamente los elementos HTML al renderizar.
      • Las capturas de pantalla se almacenan con permisos de solo propietario y cuotas agregadas/por hallazgo acotadas. La eliminación usa marcadores pendientes recuperables; el arranque del panel, las subidas y las copias de seguridad reconcilian los archivos en disco con las referencias de la base de datos, con fallos de limpieza registrados en la salida de auditoría, errores detallados en los logs del servidor y una advertencia mostrada a los administradores. La reconciliación fallida del panel reintenta como máximo una vez por minuto por proceso; las subidas y las copias de seguridad siguen validando el almacenamiento de inmediato. La ruta autenticada /api/uploads evita IDOR y devuelve respuestas no-store.
    Descargar herramienta
    endReporting
    outbrief
    objectives
    targets
    exclusions
    notes
    operators
    contacts
    trustedAgents
    findings
    findingContexts
    createdAt
    updatedAt