Cómo Preparar tu API REST para un Pentest Exitoso
Has decidido realizar un pentest de tu API. Excelente decisión. Pero antes de que el equipo de seguridad comience a probar, hay pasos críticos que puedes tomar para maximizar el valor del pentest y acelerar el proceso.
Por Qué la Preparación es Crítica
Un pentest de API bien preparado puede:
- Reducir tiempo y costos hasta en un 40%
- Identificar más vulnerabilidades al dar contexto completo
- Generar reportes más accionables con recomendaciones específicas
- Evitar falsos positivos que consumen tiempo
Antes del Pentest: Checklist Completo
1. Documentación de la API
La documentación es el activo más valioso para un pentester. Sin ella, se pierde tiempo descubriendo endpoints manualmente.
Qué Incluir:
OpenAPI/Swagger Specification
openapi: 3.0.0
info:
title: Mi API de Startup
version: 1.0.0
description: API para gestión de usuarios y productos
servers:
- url: https://api-staging.miapp.com
description: Ambiente de staging
paths:
/api/v1/users:
get:
summary: Lista usuarios
security:
- bearerAuth: []
responses:
'200':
description: Lista de usuarios
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/User'
'401':
description: No autorizado
/api/v1/users/{userId}:
get:
summary: Obtiene usuario por ID
parameters:
- name: userId
in: path
required: true
schema:
type: string
format: uuid
security:
- bearerAuth: []
responses:
'200':
description: Usuario encontrado
'404':
description: Usuario no encontrado
components:
schemas:
User:
type: object
properties:
id:
type: string
format: uuid
email:
type: string
format: email
role:
type: string
enum: [user, admin, moderator]
createdAt:
type: string
format: date-time
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
Herramientas para Generar Documentación:
Para Node.js/Express:
import swaggerJsdoc from 'swagger-jsdoc'
import swaggerUi from 'swagger-ui-express'
const options = {
definition: {
openapi: '3.0.0',
info: {
title: 'Mi API',
version: '1.0.0',
},
},
apis: ['./routes/*.js'], // Ruta a tus archivos de rutas
}
const specs = swaggerJsdoc(options)
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(specs))
Para FastAPI (Python):
from fastapi import FastAPI
app = FastAPI(
title="Mi API",
description="API para pentesting",
version="1.0.0"
)
@app.get("/users/{user_id}")
async def read_user(user_id: str):
"""
Obtiene información de un usuario específico.
- **user_id**: UUID del usuario
"""
return {"user_id": user_id}
# FastAPI genera automáticamente documentación en /docs
2. Ambiente de Staging Dedicado
Nunca realices un pentest en producción directamente. Crea un ambiente de staging que replique producción.
Configuración del Ambiente:
# .env.staging
NODE_ENV=staging
API_URL=https://api-staging.miapp.com
DATABASE_URL=postgresql://staging_db
REDIS_URL=redis://staging_cache
# Datos de prueba
ENABLE_TEST_DATA=true
ALLOW_DANGEROUS_OPERATIONS=true
# Rate limiting relajado para pentest
RATE_LIMIT_ENABLED=false
# Logging extendido
LOG_LEVEL=debug
LOG_ALL_REQUESTS=true
Características del Ambiente de Staging:
- Base de datos con datos sintéticos (no reales)
- Misma arquitectura que producción
- Logs detallados habilitados
- Sin rate limiting (o límites muy altos)
- Acceso aislado del ambiente de producción
3. Datos de Prueba Realistas
Los pentesters necesitan cuentas de prueba con diferentes niveles de privilegios.
Crea al Menos 5 Tipos de Cuentas:
{
"test_accounts": [
{
"role": "admin",
"email": "admin@pentest.local",
"password": "Test123!Admin",
"description": "Cuenta con todos los privilegios"
},
{
"role": "moderator",
"email": "moderator@pentest.local",
"password": "Test123!Mod",
"description": "Cuenta con privilegios moderados"
},
{
"role": "user",
"email": "user@pentest.local",
"password": "Test123!User",
"description": "Usuario estándar"
},
{
"role": "limited_user",
"email": "limited@pentest.local",
"password": "Test123!Limited",
"description": "Usuario con cuenta de prueba gratuita"
},
{
"role": "suspended_user",
"email": "suspended@pentest.local",
"password": "Test123!Suspended",
"description": "Usuario suspendido/bloqueado"
}
]
}
Script para Generar Datos:
// seed-pentest-data.js
import { faker } from '@faker-js/faker'
import db from './database.js'
async function seedPentestData() {
// Crear usuarios de prueba
const testUsers = [
{ email: 'admin@pentest.local', role: 'admin' },
{ email: 'user@pentest.local', role: 'user' }
]
for (const userData of testUsers) {
await db.users.create({
...userData,
password: await hashPassword('Test123!'),
firstName: faker.person.firstName(),
lastName: faker.person.lastName(),
createdAt: faker.date.past()
})
}
// Crear datos relacionales
await createTestProducts(50)
await createTestOrders(100)
await createTestComments(200)
console.log('✅ Datos de pentest creados')
}
seedPentestData()
4. Información de Autenticación y Autorización
Documenta claramente cómo funciona tu sistema de auth.
Template de Documentación:
## Autenticación
### Método: JWT Bearer Token
#### Obtener Token:
POST /api/v1/auth/login
Content-Type: application/json
{
"email": "user@example.com",
"password": "password123"
}
Respuesta:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "refresh_token_here",
"expiresIn": 3600
}
#### Usar Token:
GET /api/v1/protected-endpoint
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
### Roles y Permisos
| Rol | Permisos |
|-----|----------|
| admin | Acceso total a todos los endpoints |
| moderator | Leer/escribir contenido, no puede gestionar usuarios |
| user | Leer su propio contenido, escribir posts |
| guest | Solo lectura de contenido público |
### Tokens de Larga Duración para Pentest
Para facilitar el pentest, genera tokens con mayor duración:
Token Admin (válido 7 días):
`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbkBwZW50ZXN0LmxvY2FsIiwicm9sZSI6ImFkbWluIiwiZXhwIjoxNzM1OTk5OTk5fQ...`
Token User (válido 7 días):
`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyQHBlbnRlc3QubG9jYWwiLCJyb2xlIjoidXNlciIsImV4cCI6MTczNTk5OTk5OX0...`
5. Scope y Límites del Pentest
Define claramente qué está dentro y fuera del alcance.
Documento de Scope:
## Alcance del Pentest de API
### EN SCOPE (Permitido)
#### Endpoints a Probar:
- ✅ Todos los endpoints en /api/v1/*
- ✅ Autenticación y autorización
- ✅ Endpoints de administración (/api/v1/admin/*)
- ✅ WebSockets en /ws/*
- ✅ GraphQL endpoint (/graphql)
#### Tipos de Pruebas:
- ✅ Inyección (SQL, NoSQL, Command)
- ✅ Broken Authentication
- ✅ Broken Access Control (IDOR, escalación de privilegios)
- ✅ SSRF
- ✅ XXE
- ✅ Deserialización insegura
- ✅ Rate limiting bypass
- ✅ Business logic flaws
#### Acciones Permitidas:
- ✅ Crear/modificar/eliminar datos de prueba
- ✅ Intentos de autenticación ilimitados
- ✅ Fuzzing de endpoints
- ✅ Ataques de fuerza bruta contra cuentas de prueba
### FUERA DE SCOPE (NO Permitido)
- ❌ Ataques de denegación de servicio (DoS/DDoS)
- ❌ Ingeniería social
- ❌ Phishing
- ❌ Ataques físicos
- ❌ Modificar datos de usuarios reales
- ❌ Acceder a ambientes de producción
- ❌ Compartir credenciales con terceros
### Datos Sensibles
⚠️ **Datos que NO deben exfiltrarse:**
- Ningún dato de clientes reales (si por error están en staging)
- Credenciales de servicios de terceros
- Claves API de producción
6. Contacto y Comunicación
Establece canales de comunicación claros.
Información de Contacto:
## Contactos del Pentest
### Equipo Técnico
- **Lead Developer**: Juan Pérez
- Email: juan@miapp.com
- Slack: @juan
- Teléfono: +57 300 123 4567
- Disponibilidad: Lun-Vie 9am-6pm COT
- **DevOps**: María García
- Email: maria@miapp.com
- Slack: @maria
- Emergencias: +57 300 765 4321
### Escalación de Incidentes
Si se encuentra una vulnerabilidad CRÍTICA:
1. Notificar inmediatamente por Slack (#security-alerts)
2. Enviar email a security@miapp.com
3. Si no hay respuesta en 2 horas, llamar a número de emergencias
### Reportes de Progreso
- Daily standup: Todos los días 10am COT
- Canal Slack: #pentest-proyecto
- Updates escritos: Al final de cada día
7. Configuración de Monitoreo
Habilita monitoreo detallado durante el pentest.
Logs a Habilitar:
// logging-config.js para pentest
export const pentestLoggingConfig = {
level: 'debug',
// Registrar todas las requests
logAllRequests: true,
// Logs específicos de seguridad
security: {
failedLogins: true,
authorizationFailures: true,
suspiciousPatterns: true,
rateLimitHits: true,
invalidTokens: true
},
// Formato detallado
format: 'json',
// Incluir metadata útil
metadata: {
ip: true,
userAgent: true,
requestId: true,
userId: true,
endpoint: true,
method: true,
responseTime: true,
statusCode: true
}
}
Dashboards en Tiempo Real:
Configura dashboards para monitorear durante el pentest:
- Tráfico de API en tiempo real
- Errores 4xx/5xx agrupados
- Intentos de autenticación fallidos
- Endpoints más accedidos
- Tiempos de respuesta anormales
8. Checklist Pre-Pentest Final
Antes de entregar acceso a los pentesters:
Documentación:
- Swagger/OpenAPI spec actualizada y accesible
- Documento de arquitectura de la API
- Flujos de autenticación documentados
- Lista de roles y permisos
- Changelog de versiones recientes
Ambiente:
- Staging funcionando correctamente
- Base de datos con datos sintéticos
- Aislado de producción
- Rate limiting deshabilitado o alto
- Logs detallados habilitados
Accesos:
- 5+ cuentas de prueba con diferentes roles
- Tokens de larga duración generados
- Credenciales documentadas
- VPN/Firewall configurado si es necesario
Comunicación:
- Contactos de emergencia definidos
- Canal de Slack/comunicación creado
- Horarios de disponibilidad comunicados
- Proceso de escalación definido
Scope:
- Documento de scope firmado
- Límites claros definidos
- Exclusiones documentadas
- SLA de respuesta acordado
Durante el Pentest: Mejores Prácticas
Estar Disponible
Los pentesters tendrán preguntas. Responde rápido:
- "¿Este endpoint está deprecado?"
- "¿Este comportamiento es intencional?"
- "¿Podemos probar este flujo específico?"
Monitorear Activamente
Revisa los logs en tiempo real:
# Monitorear logs en tiempo real
tail -f /var/log/api/access.log | grep "pentest"
# Filtrar errores
tail -f /var/log/api/error.log | grep -E "5xx|ERROR|CRITICAL"
No Arreglar Durante el Pentest
Si encuentran algo, no lo arregles inmediatamente. Anótalo para después, pero deja que terminen de probar.
Después del Pentest: Siguientes Pasos
Triaje de Hallazgos
Clasifica las vulnerabilidades:
| Severidad | Tiempo de Remediación | Ejemplo |
|---|---|---|
| Crítica | 24-48 horas | SQL Injection, RCE |
| Alta | 1 semana | IDOR, Auth bypass |
| Media | 2-4 semanas | XSS, información expuesta |
| Baja | Próximo sprint | Mejoras de configuración |
Plan de Remediación
## Plan de Remediación - Vulnerabilidades API
### Críticas (0)
✅ Ninguna encontrada
### Altas (2)
#### 1. IDOR en /api/v1/orders/{orderId}
- **Descripción**: Cualquier usuario puede acceder a órdenes de otros usuarios
- **Responsable**: Juan Pérez
- **Fecha límite**: 2025-12-10
- **Status**: En progreso
- **PR**: #234
#### 2. Mass Assignment en /api/v1/users/profile
- **Descripción**: Se puede modificar el rol de usuario vía request
- **Responsable**: María García
- **Fecha límite**: 2025-12-12
- **Status**: Pendiente
### Medias (5)
[...]
### Bajas (8)
[...]
Herramientas Útiles
Para Documentación:
- Swagger/OpenAPI: Estándar de facto
- Postman Collections: Útil para requests de ejemplo
- Readme.io: Documentación bonita y pública
Para Staging:
- Docker Compose: Replicar ambiente fácilmente
- Terraform: Infrastructure as Code
- Kubernetes: Para ambientes complejos
Para Datos de Prueba:
- Faker.js: Generar datos sintéticos
- Factory Bot: Para Ruby/Rails
- pytest-factoryboy: Para Python
Conclusión
Un pentest bien preparado es un pentest exitoso. Invierte tiempo en documentación, ambientes de prueba y comunicación clara. El resultado será un reporte más completo, vulnerabilidades reales identificadas y un plan de acción claro.
¿Listo para un pentest profesional de tu API? En Pentacode nos especializamos en pentesting de APIs para startups. Agenda una consultoría y recibe una evaluación preliminar gratuita.
Próximos pasos:
- Revisa nuestra guía de OWASP Top 10
- Descubre vulnerabilidades comunes en APIs modernas