Servidor «honeypot»
Un servidor honeypot de código abierto que detecta ataques y aporta automáticamente información sobre amenazas a la ReportedIP . Implántalo junto a tu infraestructura para interceptar a los atacantes antes de que lleguen a tus sistemas reales.
¿Qué es un honeypot?
Un honeypot es un sistema señuelo diseñado para atraer y detectar a los atacantes. Imita servicios reales, pero no tiene ninguna finalidad legítima; cualquier interacción con él es intrínsecamente sospechosa.
El servidor ReportedIP emula instalaciones de CMS vulnerables para identificar direcciones IP maliciosas. Cuando un atacante intenta un inicio de sesión por fuerza bruta, busca vulnerabilidades conocidas o escanea en busca de vulnerabilidades, el honeypot captura la dirección IP de origen y los detalles del ataque, y luego los envía automáticamente a la ReportedIP .
Emulación de CMS
El servidor honeypot simula páginas de inicio de sesión y paneles de administración de sistemas de gestión de contenidos populares. Los atacantes que intentan llevar a cabo ataques de fuerza bruta o de explotación son detectados y notificados de inmediato.
| CMS | Rutas emuladas | Detección |
|---|---|---|
| WordPress | /wp-login.php, /wp-admin/, /xmlrpc.php |
Ataques de fuerza bruta al inicio de sesión, uso indebido de XML-RPC, vulnerabilidades en plugins |
| Drupal | /user/login, /admin/ |
Intentos de inicio de sesión, firmas de Drupalgeddon |
| Joomla | /administrator/, /index.php/component/users/ |
Ataques de fuerza bruta contra el administrador, vulnerabilidades de componentes |
Analizadores de amenazas
El honeypot incluye 36 analizadores integrados que examinan cada solicitud entrante en busca de patrones y técnicas de ataque conocidos:
| Analizador | Descripción |
|---|---|
| Detección de ataques de fuerza bruta | Detecta los intentos repetidos de inicio de sesión desde la misma fuente |
| Inyección SQL | Detecta cargas útiles de inyección SQL en parámetros y encabezados |
| Cargas útiles de XSS | Detecta intentos de cross-site scripting en los datos de las solicitudes |
| Recorrido de rutas | Identifica secuencias de recorrido de directorios (../, ..\\) |
| Firmas de vulnerabilidades conocidas | Compara las solicitudes con una base de datos de vulnerabilidades CVE conocidas |
| Reutilización de credenciales | Detecta pruebas automatizadas de credenciales con diferentes combinaciones de nombre de usuario y contraseña |
| Enumeración de directorios | Detecta el escaneo sistemático de archivos y directorios confidenciales |
| Uso indebido de XML-RPC | Detecta la amplificación de pingbacks y los ataques de fuerza bruta a través de XML-RPC |
Informes automáticos
Cada ataque detectado se notifica automáticamente a la ReportedIP sin necesidad de intervención manual. Cada informe incluye:
- IP de origen: la dirección IP del atacante
- Tipo de ataque: el patrón de ataque concreto detectado
- ID de categoría: asignada a una de las 30 categorías de amenazas predefinidas
- Marcas de tiempo: hora exacta de cada incidente de ataque
Repercusión en la puntuación de confianza
Los informes de honeypots tienen un peso especial en el sistema de reputación, ya que representan una actividad maliciosa confirmada: no hay ninguna razón legítima para interactuar con un honeypot. El sistema aplica una bonificación específica por honeypot además de la puntuación de confianza básica.
| Ventaja | Detalle |
|---|---|
| Bonificación Honeypot | Se añaden hasta 25 puntos a la puntuación de confianza |
| Reducción de la atenuación temporal | Los informes mantienen su relevancia durante más tiempo; la proporción de honeypots reduce el factor de caducidad |
| Mayor ponderación de confianza | Los informes de honeypot se multiplican por honeypot_report_weight_multiplier (por defecto: 2.0x) |
| Confianza mínima | Si hay al menos dos informes de honeypot, se garantiza un nivel de confianza mínimo del 25 %. |
Fórmula de bonificación Honeypot
base_bonus = honeypot_count * base_bonus_per_report
# Diversity requirement
diversity_factor = min(unique_reporters / diversity_divisor, 1.0)
base_bonus = base_bonus * diversity_factor
# Single reporter penalty (if > 5 honeypot reports & only 1 reporter)
if honeypot_reports > threshold AND unique_reporters == 1:
penalty = 10
final_bonus = min(base_bonus - penalty, 25)
# Time dampening reduction
honeypot_ratio = honeypot_reports_count / report_count
dampening_reduction = honeypot_ratio * 0.5
time_dampening_factor = min(1.0, time_dampening_factor + dampening_reduction)
Requisitos
El servidor «honeypot» es una aplicación PHP autónoma que no tiene dependencias externas de Composer. Almacena toda la información en una base de datos SQLite local, por lo que no se necesita ningún servidor de bases de datos independiente.
- PHP 8.2+ con el
pdo_sqlite,curl, yjsonextensiones - nginx o Apache redirigir todas las solicitudes a
public/index.php - SQLite para el almacenamiento — no se necesita ningún servidor MySQL ni PostgreSQL
Instalación
Docker (recomendado)
La forma más rápida de empezar. Clona el repositorio e inicia la pila de Compose incluida:
git clone https://github.com/reportedip/honeypot-server.git
cd honeypot-server
docker compose -f docker/docker-compose.yml up -d
Abre la URL del contenedor en tu navegador: el instalador web se inicia automáticamente en la primera visita y te guía a través de las comprobaciones del sistema, la introducción de la clave API, la selección del CMS y las credenciales de administrador. Necesitas una clave ReportedIP para el paso de generación de informes; consulta «Autenticación y límites de tasa» para saber cómo crear una (se asignan, previa solicitud, claves específicas para honeypots con generación de informes ilimitada).
Configuración manual
Clona el repositorio y configura tu servidor web para que apunte al public/ directorio. Plantilla
Las configuraciones para ambos servidores web se incluyen en el repositorio:
git clone https://github.com/reportedip/honeypot-server.git
cd honeypot-server
# nginx: adapt the bundled example
cp config/nginx.conf.example /etc/nginx/sites-available/honeypot.conf
# Apache: copy the htaccess template into the document root
cp config/apache.htaccess.example public/.htaccess
A continuación, abre la URL del sitio en tu navegador. El instalador web te guiará a lo largo de las comprobaciones del sistema, la introducción de la clave API, la selección del CMS, las credenciales de administrador y la configuración opcional de OpenAI.
Configuración
El instalador web configura la mayoría de los parámetros la primera vez que se ejecuta. Estos se pueden modificar posteriormente en el panel de administración o en el archivo de configuración.
| Configuración | Por defecto | Descripción |
|---|---|---|
api_key |
— | Tu clave de acceso a ReportedIP (obligatoria). Utiliza una clave con el rol «Honeypot» para poder enviar informes sin límites; solicítala en [email protected]. |
cms_profile |
wordpress |
Perfil de CMS que se va a emular: wordpress, drupal, o joomla. |
admin_path |
/_hp_admin |
Ruta URL del panel de administración. Elige un valor que no sea fácil de adivinar para mantenerlo oculto. |
trusted_proxies |
CIDR de Cloudflare | Rangos de direcciones IP proxy utilizados para determinar la dirección IP real del cliente detrás de una CDN. |
rate_limit_per_ip |
10 |
Número máximo de entradas de registro almacenadas por dirección IP por minuto. |
report_rate_limit |
60 |
Número máximo de informes de la API enviados por minuto. |
report_batch_size |
10 |
Número de informes en cola transmitidos por lote de cron. |
queue_mode |
web |
Modo de procesamiento de la cola de informes: web (después de cada visita a la página) o cron. |
log_retention_days |
90 |
Días antes de que las entradas antiguas del registro se eliminen automáticamente. |
openai_api_key |
— | Clave opcional de OpenAI para contenido señuelo generado por IA. |
Procesamiento de colas
Los ataques detectados se colocan en cola y se envían a la ReportedIP en pequeños lotes. Hay dos modos disponibles:
- Cron web (por defecto): la cola se procesa automáticamente tras cada visita a la página. No se necesita ninguna tarea cron externa, lo que resulta ideal para el alojamiento compartido.
-
Cron manual: conjunto
queue_modeacrony programar tú mismo el proceso CLI.
# Process the report queue every 5 minutes
*/5 * * * * php /path/to/honeypot-server/cli.php process-queue
Webhooks
El honeypot puede reenviar cada detección que coincida a un punto final externo en tiempo real — dirigiendo los ataques directamente a tu SIEM, a una plataforma de registro, a una alerta de chat o a otra base de datos de amenazas. Los webhooks se incorporaron en la versión 1.2.0; la versión 1.3.0 los convirtió en un enrutador flexible capaz de dirigirse a cualquier API HTTP, incluida una asignación integrada con AbuseIPDB.
Cada webhook es un punto final HTTP(S) que recibe una solicitud por cada detección con la que coincide. El envío se produce después de que se haya enviado la respuesta de trampa al atacante, por lo que los webhooks nunca ralentizan el honeypot. Cuando una sola solicitud activa varios analizadores, las detecciones se agrupan en un único envío (categorías fusionadas, mayor gravedad).
Configuración
Los webhooks se gestionan en el panel de administración, en la sección «Webhooks». Cada punto final admite:
- Filtros de categoría: restringen la entrega a los ID de categorías de amenazas específicos.
- Filtros del analizador — limitar la entrega a los motores de detección especificados (p. ej.,
SqlInjection). - Clave secreta: opcional; permite la firma de la carga útil mediante HMAC-SHA256.
Los filtros vacíos significan todos se envían las detecciones. Cuando ambos filtros están configurados, el webhook
se activa cuando o bien coincide. Cada punto final se puede verificar desde el panel de administración mediante
un envío de prueba, que incluye el encabezado X-ReportedIP-Event: test.
Encabezados de solicitud
| Encabezado | Valor |
|---|---|
Content-Type |
application/json |
User-Agent |
reportedip-honeypot-server/<version> |
X-ReportedIP-Event |
detection o test |
X-ReportedIP-Signature |
sha256=<HMAC> — solo cuando se configura un secreto |
Carga útil
{
"event": "detection",
"generated_at": "2026-06-12T14:00:00+00:00",
"honeypot": {
"name": "reportedip-honeypot-server",
"version": "1.3.0",
"host": "your-honeypot.example.com",
"profile": "wordpress"
},
"request": {
"ip": "203.0.113.50",
"method": "POST",
"uri": "/wp-login.php",
"user_agent": "sqlmap/1.7"
},
"detections": [
{
"analyzer": "SqlInjection",
"categories": [16, 21],
"category_names": ["SQL Injection", "Web App Attack"],
"comment": "SQL injection attempt detected: ...",
"severity": 85
}
]
}
Verificación de la firma
Cuando se configura un secreto, calcula el HMAC sobre el cuerpo de la solicitud sin procesar y compáralo en tiempo constante:
$expected = 'sha256=' . hash_hmac('sha256', $rawBody, $secret);
$valid = hash_equals($expected, $_SERVER['HTTP_X_REPORTEDIP_SIGNATURE'] ?? '');
Enrutamiento a cualquier API
Un webhook ya no está limitado al formato ReportedIP . Desde la versión 1.3.0, cada punto final define su propio método HTTP, sus encabezados y su cuerpo, por lo que puedes enviar datos directamente a AbuseIPDB, Slack, Discord o cualquier API HTTP, sin necesidad de utilizar middleware.
| Opción por webhook | Opciones | Notas |
|---|---|---|
| Método HTTP | POST, PUT, PATCH, GET |
Adáptate a lo que requiera la API de destino. |
| Encabezados personalizados | Uno por línea | Añade claves API o encabezados de autenticación; estos anulan los valores predeterminados. |
| Formato del cuerpo | json, form, plantilla personalizada |
JSON estructurado, pares clave/valor codificados en URL o una plantilla de formato libre. |
Marcadores de posición
Los encabezados personalizados y los cuerpos basados en plantillas se rellenan a partir de marcadores de posición. Entre los tokens confirmados se incluyen:
{{ip}}, {{categories}}, {{severity}}, y
{{timestamp}}; los demás campos de solicitud y detección que aparecen en la carga útil anterior también están
disponibles. Cada token también tiene un {{..._url}} (codificado en URL) y
{{..._json}} (con codificación JSON) para que los valores se mantengan seguros en cualquier contexto.
Integración con AbuseIPDB
El honeypot envía un {{abuseipdb_categories}} marcador de posición que traduce
el Categorías de ReportedIP (ID 1–30)
a los ID de categoría de AbuseIPDB más cercanos. De este modo,
un informe directo a la API de AbuseIPDB v2 se reduce a una plantilla de cuerpo de una sola línea:
POST https://api.abuseipdb.com/api/v2/report
Header: Key: <your-abuseipdb-api-key>
Body (form): ip={{ip}}&categories={{abuseipdb_categories}}&comment={{comment_url}}
Ajustes predefinidos
No es necesario que lo configures manualmente. Los ajustes preestablecidos integrados para AbuseIPDB, Slack, Discord y un destino JSON genérico rellenan automáticamente el método, los encabezados y el cuerpo del mensaje: elige uno, introduce tu clave o URL y envía una prueba.
127.0.0.1, por lo que
la verificación de un AbuseIPDB o de un webhook de terceros nunca genera una denuncia real contra una dirección activa.
Repositorio de GitHub
El servidor honeypot es totalmente de código abierto. Se agradecen las contribuciones, los informes de errores y las sugerencias de nuevas funciones .
Última actualización: · Gestionado por el ReportedIP