=== [1] El secreto JWT aflora en el heapdump (grep sobre strings) === app.jwt.secret! === [2] application.properties embebido en el jar (BOOT-INF/classes) === (via: docker cp pingupenguin_container:/app/app.jar . && unzip -p app.jar BOOT-INF/classes/application.properties) spring.application.name=apadrina-pinguino server.port=8080 # =========================================================================== # Base de datos H2 (en fichero, para que la consola y el heap tengan datos) # =========================================================================== spring.datasource.url=jdbc:h2:mem:pinguinosdb;DB_CLOSE_DELAY=-1 spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=pinguino_admin # (!) Credencial de BBDD en texto: aparecera en el heapdump spring.datasource.password=Gl4c14r_DB_P4ss_2024! spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.show-sql=false spring.jpa.properties.hibernate.format_sql=false # =========================================================================== # Secreto de firma JWT # (!) Enmascarado en /actuator/env pero EN CLARO dentro del heapdump. # Quien lo extraiga puede forjar un token con rol ADMIN. # =========================================================================== # Secreto debil y "legible" (mal habito real): contiene la palabra 'secret', # por lo que aflora con un grep generico sobre el heap. app.jwt.secret=changeme-super-secret-key-pinguinos-prod-2024 app.jwt.expiration-ms=3600000 # --------------------------------------------------------------------------- # Ruido realista que tambien vive en memoria (otros secretos de la app). # Un analista tendra que distinguir cual de todos es la clave de firma JWT. # --------------------------------------------------------------------------- # Cadena de conexion a la BBDD de produccion con credenciales embebidas # (la usa un job de sincronizacion). grep jdbc -> credenciales en claro. app.sync.production-datasource=jdbc:mysql://db-prod.internal:3306/pinguinos?user=svc_pinguinos&password=Pr0d_Gl4c14r_Sync_2024 # API key de un proveedor de pagos/partner. app.partner.api-key=apikey_live_pngn_8f3a9c2e7b1d4f6a0c5e9d2b # Secreto JWT ANTERIOR (rotado) -> SENUELO: ya no firma nada. app.jwt.previous-secret=changeme-super-secret-key-pinguinos-prod-2023 # =========================================================================== # (!!!) CONFIGURACION VULNERABLE DE ACTUATOR # Expone TODOS los endpoints sin autenticacion. Error tipico en produccion. # =========================================================================== management.endpoints.web.exposure.include=* management.endpoints.web.base-path=/actuator management.endpoint.health.show-details=always management.endpoint.heapdump.enabled=true management.endpoint.env.enabled=true management.endpoint.beans.enabled=true management.endpoint.mappings.enabled=true management.endpoint.loggers.enabled=true management.endpoint.threaddump.enabled=true management.info.env.enabled=true info.app.name=Apadrina un Pinguino info.app.environment=production info.app.maintainer=devops@apadrinaunpinguino.org === [3] /app/.env (RCE -> lectura directa, reutilizacion de credenciales) === (via: docker exec pingupenguin_container cat /app/.env) # =========================================================================== # Configuracion del backend - Apadrina un Pinguino (NO subir a git!) # =========================================================================== APP_ENV=production APP_NAME=Apadrina un Pinguino # Base de datos de produccion DB_HOST=db-prod.internal DB_PORT=3306 DB_NAME=pinguinos DB_USER=svc_pinguinos DB_PASSWORD=Pr0d_Gl4c14r_Sync_2024 # Integraciones PARTNER_API_KEY=apikey_live_pngn_8f3a9c2e7b1d4f6a0c5e9d2b # Clave de recuperacion de acceso del sistema. # El equipo de sistemas la reutiliza como contrasena de la cuenta de soporte/root. RECOVERY_KEY=recoverypasswordpenguin root:x:0:0:root:/root:/bin/bash www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin