
Honeypot de IoT y Tecnología Operacional
| 📢 ¡ATENCIÓN!!! |
|---|
| Este repositorio ha sido movido a the Honeynet Project :) |
RIoTPot es un honeypot de interacción híbrida, enfocado principalmente en la emulación de protocolos IoT y OT, aunque también es capaz de emular otros servicios. En esencia, RIoTPot actúa como un servicio proxy para otros honeypots incluidos en el sistema. Por lo tanto, puede ejecutar cualquier honeypot y otros servicios junto con RIoTPot. Además, hay una aplicación web de interfaz de usuario (UI) que puede usar para gestionar su enrutamiento.
El honeypot viene con múltiples servicios de baja interacción listos para usar. Dado que estos servicios están escritos como plugins, solo son compatibles con Linux; sin embargo, puede iniciar RIoTPot sin ellos. La siguiente tabla contiene la lista de servicios incluidos en RIoTPot por defecto, su puerto interno y puerto proxy.
Tabla de Contenidos
La arquitectura de RIoTPot se basa en conexiones proxy a servicios internos y circundantes (o externos) (por ejemplo, honeypots, servicios completos, contenedores, hosts remotos, etc.).
Para ello, el honeypot gestiona un número de proxies definidos por el usuario que retransmiten conexiones entre los servicios y RIoTPot 1.
De esta manera, RIoTPot puede decidir cómo y dónde enrutar los ataques entrantes.
La lógica utilizada para determinar cómo manejar el ataque entrante se implementa en forma de middlewares 2.
Para gestionar servicios, middlewares y proxies, RIoTPot incluye una API REST 3 y una interfaz de usuario web 4 de serie.
Se puede acceder a la interfaz de usuario a través del navegador en localhost:2022 y puede experimentar con los endpoints de la API en localhost:2022/api/swagger que muestra una interfaz Swagger.
Figura 1 muestra la arquitectura de RIoTPot, incluyendo las dos aplicaciones principales que constituyen RIoTPot (RIoTPot en sí mismo, y la UI de RIoTPot) y sus componentes, y una sección para encerrar servicios externos (o adyacentes).
RIoTPot está escrito en Golang5. Cada instancia de RIoTPot expone los proxies registrados (según su puerto) a demanda. Para servir un proxy, debe tener un servicio vinculado y el puerto del proxy debe estar disponible (actualmente, RIoTPot no acepta múltiples servicios ejecutándose en el mismo puerto). Cuando un proxy ha sido vinculado y servido, los atacantes podrán enviar mensajes a RIoTPot en ese puerto, retransmitiendo los mensajes al servicio vinculado y de vuelta al atacante6.
Para facilitar el acceso, se pueden gestionar múltiples instancias de RIoTPot desde la aplicación web UI de RIoTPot.
Además de gestionar los proxies registrados en cada instancia, la UI permite crear, usar y editar perfiles.
Cada perfil contiene un número de proxies nombrados según protocolos u otros servicios, haciendo que una instancia de RIoTPot se asemeje a un dispositivo real (por ejemplo, un asistente doméstico).
En pocas palabras, los perfiles aceleran el proceso de configuración y aprovisionamiento de una instancia de RIoTPot con configuraciones específicas.
La UI está escrita utilizando la biblioteca de JavaScript de front-end React (usamos Typescript para este proyecto) y la biblioteca de gestión de estado Recoil.
Como RIoTPot es bastante pequeño, por el momento no utiliza una base de datos.
Ejecutar RIoTPot es relativamente simple. En general, tiene tres opciones. La primera es descargar una versión de RIoTPot; puede elegir descargar la última versión o una anterior. La segunda opción es construir el proyecto usted mismo. La última opción es usar el código fuente para crear un contenedor Docker con RIoTPot y algunas aplicaciones adicionales para mejorar el honeypot.
Info: Esta guía está destinada a usuarios sin necesidades especiales, que desean una experiencia simple lista para usar.
Cada lanzamiento viene en una carpeta llamada riotpot con un binario ejecutable (también) llamado riotpot y una carpeta plugins llena de múltiples servicios (o honeypots de baja interacción).
Es importante mantener la estructura de carpetas interna para que RIoTPot funcione correctamente.
📁 riotpot
┕ riotpot
┕ 📁 plugins
riotpot.riotpot. Esto iniciará RIoTPot con la API habilitada, todos los plugins listos para usar y el servidor UI.
localhost:2022Info: Esta guía está destinada a usuarios avanzados cómodos en entornos de desarrollo.
Requisitos
- Golang - Necesario para construir el proyecto
- Node - Necesario para construir la UI
Opcional:
- Git - Se usa para descargar el código fuente
- Make - Para ejecutar comandos ya preparados
Descargue el código fuente de RIoTPot desde GitHub. Abra una consola e introduzca la siguiente línea.
git clone [email protected]:aau-network-security/riotpot.git
Navegue a la carpeta donde descargó el código fuente de RIoTPot e instale los paquetes de node requeridos.
npm install
Si tiene instalado Make, hemos incluido varios ayudantes de comandos para asistirle en la construcción del proyecto. Para simplificar, puede ejecutar dos comandos simples que construirán el binario de RIoTPot y los plugins (y los colocarán en la carpeta correcta).
# Construir el servidor
make build-ui
# Construir RIoTPot y los plugins
make riotpot-build
NOTA: La UI utiliza Vite para construir el proyecto. Si prefiere usar otro constructor, es posible que necesite hacer algunos cambios primero por su cuenta.
Info: Esta guía está destinada a usuarios avanzados que prefieren usar RIoTPot en un entorno virtual.
Requisitos
- Docker - Se usa para construir una imagen de una instancia de RIoTPot y el servidor UI.
- Docker-compose - Se usa para crear un solo contenedor con una instancia de RIoTPot, la UI y otras aplicaciones y servicios.
Las principales ventajas de usar esta configuración son las características de seguridad adicionales con cambios mínimos en la configuración del contenedor y los contenedores en sí. Por ejemplo, podemos definir redes privadas virtuales separadas y redes superpuestas para ocultar, aislar y encapsular RIoTPot y otros servicios adyacentes. Además, los contenedores nos permiten vincular servicios usando su nombre de dirección de Docker en lugar de su IP, lo cual es muy conveniente. Por último, podemos iniciar y detener contenedores separados bajo demanda sin afectar otros servicios.
Por otro lado, la virtualización es posiblemente más exigente que usar aplicaciones en hardware real. Si bien una sola instancia de RIoTPot es relativamente liviana, es importante considerar las desventajas introducidas por la virtualización y la emulación de hardware (por ejemplo, retrasos en las respuestas).
Advertencia: Técnicamente hablando, un atacante dedicado puede darse cuenta de que RIoTPot es en realidad un honeypot analizando y comparando los retrasos de tiempo de respuesta introducidos por la virtualización con servidores reales (!!). Aunque este tipo de huella digital de honeypot se ha estudiado antes, los resultados para servicios comunes de Internet aún no son concluyentes (por ejemplo, HTTP, Telnet y SSH), debido a la mercantilización de los servicios de alojamiento en la nube que utilizan máquinas virtuales y configuraciones detalladas de servidores.
El archivo docker-compose incluye servicios adicionales para mejorar la experiencia de RIoTPot.
La siguiente tabla resume la lista de servicios y aplicaciones incluidos en este contenedor.
Servicios
RIoTPot viene con comandos de bandera que afectan cómo y qué se inicia. Ejemplo:
# Ejecutar RIoTPot sin la ui
./riotpot --ui false
Los servicios internos y circundantes no son accesibles a través de Internet. Los servicios internos están integrados y solo son accesibles para RIoTPot. Estos servicios se cargan al inicio y no se pueden eliminar, pero se pueden detener. Los servicios circundantes deben estar en la misma red que RIoTPot. Los servicios externos deben incluir solo a RIoTPot en su lista blanca. ↩
Los middlewares están actualmente en desarrollo. ↩
La API de RIoTPot no debe exponerse a Internet. De todos modos, la API actualmente solo acepta conexiones desde localhost. Esto podría cambiarse en el futuro, proporcionando una lista blanca de hosts y autenticación estándar. ↩
Aunque la interfaz web puede usarse como un componente separado, está incrustada en el binario de RIoTPot. ↩
Si bien la aplicación base es interoperable, los servicios internos (plugins) solo se pueden usar en entornos Linux, FreeBSD y macOS. Planeamos superar esta limitación reemplazando los plugins con microservicios que se comuniquen a través de gRPC. ↩
Por razones éticas y de seguridad, RIoTPot no permite solicitudes no solicitadas hacia el exterior, es decir, shells inversas y similares no están permitidas. ↩
| Servicio | Puerto Interno | Puerto Proxy |
|---|
| Echo | 20007 | 7 |
| SSH | 20022 | 22 |
| Telnet | 20023 | 23 |
| HTTP | 28080 | 80 |
| Modbus | 20502 | 502 |
| MQTT | 21883 | 1883 |
| CoAP | 25683 | 5683 |
| Servicio | Imagen | Puerto | Detalles |
|---|
| MQTT | eclipse-mosquitto | 1883 | Servidor MQTT Mosquito |
| HTTP | httpd | 80 | Servidor HTTP normal |
| Modbus | oitc/modbus-server | 502 | Servidor Modbus |
| OCPP | ocpp1.6-central-system | 443 | OCPP v1.6 (usado en estaciones de carga de coches) |
| Aplicación | Imagen | Detalles |
|---|---|---|
| TCPDump | kaazing/tcpdump | Grabador de paquetes. Almacena tráfico de red en archivos .pcap |
El contenedor se puede configurar en tres sencillos pasos:
Descargue el código fuente de RIoTPot desde GitHub. Abra una consola e introduzca la siguiente línea.
git clone [email protected]:aau-network-security/riotpot.git
Navegue a la carpeta donde descargó el código fuente de RIoTPot.
Con Docker en ejecución: si tiene Make instalado, ejecute el siguiente comando. De lo contrario, ejecute un comando docker-compose usando el archivo docker-compose incluido en la carpeta build/docker.
# Con make
make up
# Con docker-compose
docker-compose -p riotpot -f build/docker/docker-compose.yaml up -d --build
| Bandera | Tipo | Por Defecto | Descripción |
|---|
| debug | Boolean | false | Establecer el nivel de registro a debug |
| api | Boolean | true | Si iniciar la API |
| plugins | Boolean | true | Si cargar los plugins de honeypot de baja interacción |
| whitelist | String | http://localhost,http://localhost:3000 | Lista de hosts permitidos separados por comas para contactar la API |
| ui | Boolean | true | Si iniciar la UI |