
Honeypot para IoT e Tecnologia Operacional
RIoTPot é um honeypot de interação híbrida, focado principalmente na emulação de protocolos IoT e OT, embora também seja capaz de emular outros serviços. Em essência, o RIoTPot atua como um serviço de proxy para outros honeypots incluídos no sistema. Portanto, você pode executar qualquer honeypot e outros serviços juntamente com o RIoTPot. Além disso, existe uma aplicação web UI que você pode usar para gerenciar seu roteamento.
O honeypot vem com múltiplos serviços de baixa interação prontos para uso. Como esses serviços são escritos como plugins, eles são suportados apenas no Linux; no entanto, você pode iniciar o RIoTPot sem eles. A tabela a seguir contém a lista de serviços incluídos no RIoTPot por padrão, sua porta interna e porta de proxy.
| Serviço | Porta Interna | Porta de Proxy |
|---|---|---|
| Echo | 20007 | 7 |
| SSH | 20022 | 22 |
| Telnet | 20023 | 23 |
| HTTP | 28080 | 80 |
| Modbus | 20502 | 502 |
| MQTT | 21883 | 1883 |
| CoAP | 25683 | 5683 |
A arquitetura do RIoTPot é baseada em conexões de proxy para serviços internos e circundantes (ou externos) (ex.: honeypots, serviços completos, contêineres, hosts remotos, etc.).
Para isso, o honeypot gerencia vários proxies definidos pelo usuário que retransmitem conexões entre os serviços e o RIoTPot 1.
Dessa forma, o RIoTPot pode decidir como e para onde rotear ataques recebidos.
A lógica usada para determinar como lidar com o ataque recebido é implementada na forma de middlewares 2.
Para gerenciar serviços, middlewares e proxies, o RIoTPot traz embutidos uma API REST 3 e uma interface web UI 4 prontos para uso.
A UI pode ser acessada pelo seu navegador em localhost:2022 e você pode manipular os endpoints da API em localhost:2022/api/swagger, exibindo uma interface Swagger.
Figura 1 mostra a arquitetura do RIoTPot, incluindo os dois aplicativos principais que constituem o RIoTPot (o próprio RIoTPot e o RIoTPot UI) e seus componentes, e uma seção para envolver serviços externos (ou adjacentes).
O RIoTPot é escrito em Golang5. Cada instância do RIoTPot expõe proxies registrados (com base em sua porta) sob demanda. Para servir um proxy, ele deve ter um serviço vinculado e a porta do proxy deve estar disponível (atualmente, o RIoTPot não aceita múltiplos serviços executando na mesma porta). Quando um proxy é vinculado e servido, os atacantes poderão enviar mensagens ao RIoTPot nessa porta, retransmitindo as mensagens para o serviço vinculado e de volta para o atacante6.
Para facilitar o acesso, múltiplas instâncias do RIoTPot podem ser gerenciadas a partir da webapp UI do RIoTPot.
Além de gerenciar os proxies registrados em cada instância, a UI permite criar, usar e editar perfis.
Cada perfil contém um número de proxies nomeados após protocolos ou outros serviços, fazendo com que uma instância do RIoTPot se assemelhe a um dispositivo real (por exemplo, um assistente residencial).
Em poucas palavras, os perfis aceleram o processo de configuração e provisionamento de uma instância do RIoTPot com configurações específicas.
A UI é escrita usando a biblioteca JavaScript de front-end React (usamos TypeScript neste projeto) e a biblioteca de gerenciamento de estado Recoil.
Como o RIoTPot é relativamente pequeno, por enquanto, ele não utiliza um banco de dados.
Executar o RIoTPot é relativamente simples. No geral, você tem três opções. A primeira é baixar uma versão do RIoTPot; você pode escolher baixar a versão mais recente ou uma anterior. A segunda opção é construir o projeto você mesmo. A última opção é usar o código-fonte para criar um contêiner Docker com o RIoTPot e alguns aplicativos adicionais para aprimorar o honeypot.
Info: Este guia é destinado a usuários sem necessidades especiais, que desejam uma experiência simples pronta para uso.
Cada versão vem em uma pasta chamada riotpot com um binário executável (também) chamado riotpot e uma pasta plugins preenchida com vários serviços (ou honeypots de baixa interação).
É importante manter a estrutura interna de pastas para que o RIoTPot funcione como esperado.
📁 riotpot
┕ riotpot
┕ 📁 plugins
riotpot.riotpot. Isso iniciará o RIoTPot com a API habilitada, todos os plugins prontos para uso e o servidor UI.
localhost:2022Info: Este guia é destinado a usuários avançados confortáveis em ambientes de desenvolvimento.
Requisitos
- Golang - Necessário para construir o projeto
- Node - Necessário para construir a UI
Opcional:
- Git - Usado para baixar o código-fonte
- Make - Para executar comandos pré-preparados
Baixe o código-fonte do RIoTPot do GitHub. Abra um console e insira a seguinte linha.
git clone [email protected]:aau-network-security/riotpot.git
Navegue até a pasta onde você baixou o código-fonte do RIoTPot e instale os pacotes node necessários.
npm install
Se você instalou o Make, incluímos vários auxiliares de comando para ajudá-lo a construir o projeto. Para simplificar, você pode executar dois comandos simples que construirão o binário do RIoTPot e os plugins (e os colocarão na pasta correta).
# Construir o servidor
make build-ui
# Constrói o RIoTPot e os plugins
make riotpot-build
NOTA: A UI usa Vite para construir o projeto. Se você preferir usar outro construtor, pode ser necessário fazer algumas alterações por conta própria.
Info: Este guia é destinado a usuários avançados que preferem usar o RIoTPot em um ambiente virtual.
Requisitos
- Docker - Usado para construir uma imagem de uma instância do RIoTPot e servidor UI.
- Docker-compose - Usado para criar um único contêiner com uma instância do RIoTPot, a UI e outros aplicativos e serviços.
As principais vantagens de usar esta configuração são os recursos adicionais de segurança com alterações mínimas na configuração do contêiner e nos próprios contêineres. Por exemplo, podemos definir redes privadas virtuais separadas e redes overlay para ocultar, isolar e encapsular o RIoTPot e outros serviços adjacentes. Além disso, os contêineres nos permitem vincular serviços usando seu nome de endereço Docker em vez de seu IP, o que é muito conveniente. Por fim, podemos criar e parar contêineres separados sob demanda sem afetar outros serviços.
Por outro lado, a virtualização é indiscutivelmente mais exigente do que usar aplicações em bare-metal. Embora uma única instância do RIoTPot seja relativamente leve, é importante considerar as desvantagens introduzidas pela virtualização e emulação de hardware (por exemplo, atrasos de resposta).
Aviso: Tecnicamente falando, um atacante dedicado pode perceber que o RIoTPot é na verdade um honeypot analisando e comparando os atrasos de tempo de resposta introduzidos pela virtualização com servidores reais (!!). Embora esse tipo de fingerprinting de honeypot já tenha sido estudado antes, os resultados para serviços comuns da Internet ainda são inconclusivos (por exemplo, HTTP, Telnet e SSH), devido à mercantilização de serviços de hospedagem em nuvem usando máquinas virtuais e configurações detalhadas de servidor.
O arquivo docker-compose inclui serviços adicionais para aprimorar a experiência com o RIoTPot.
A tabela a seguir resume a lista de serviços e aplicativos empacotados neste contêiner.
Serviços
Serviço Imagem Porta Detalhes MQTT eclipse-mosquitto 1883 Servidor MQTT Mosquito HTTP httpd 80 Servidor HTTP Comum Modbus oitc/modbus-server 502 Servidor Modbus OCPP ocpp1.6-central-system 443 OCPP v1.6 (usado em estações de carga de carros) Aplicativos
Aplicativo Imagem Detalhes TCPDump kaazing/tcpdump Gravador de pacotes. Armazena tráfego de rede em arquivos .pcap
O contêiner pode ser configurado em três passos simples:
Baixe o código-fonte do RIoTPot do GitHub. Abra um console e insira a seguinte linha.
git clone [email protected]:aau-network-security/riotpot.git
Navegue até a pasta onde você baixou o código-fonte do RIoTPot.
Com o Docker em execução: se você tiver o Make instalado, execute o seguinte comando. Caso contrário, execute um comando docker-compose usando o arquivo docker-compose incluído na pasta build/docker.
# Com make
make up
# Com docker-compose
docker-compose -p riotpot -f build/docker/docker-compose.yaml up -d --build
O RIoTPot vem com comandos de flag que afetam como e o que é iniciado. Exemplo:
# Executar o RIoTPot sem a UI
./riotpot --ui false
| Flag | Tipo | Padrão | Descrição |
|---|---|---|---|
| debug | Booleano | false | Definir nível de log para debug |
| api | Booleano | true | Se deve iniciar a API |
| plugins | Booleano | true | Se deve carregar os plugins de honeypot de baixa interação |
| whitelist | String | http://localhost,http://localhost:3000 | Lista de hosts permitidos separados por vírgula para contatar a API |
| ui | Booleano | true | Se deve iniciar a UI |
Serviços internos e circundantes não são acessíveis pela Internet. Os serviços internos são integrados e acessíveis apenas ao RIoTPot. Esses serviços são carregados na inicialização e não podem ser excluídos, mas podem ser parados. Os serviços circundantes devem estar na mesma rede que o RIoTPot. Os serviços externos devem incluir apenas o RIoTPot na lista de permissões. ↩
Os middlewares estão atualmente em desenvolvimento. ↩
A API do RIoTPot não deve ser exposta à Internet. Independentemente disso, a API atualmente só aceita conexões do localhost. Isso pode ser alterado no futuro, fornecendo uma lista de permissões de hosts e autenticação padrão. ↩
Embora a interface web possa ser usada como um componente separado, ela está incorporada ao binário do RIoTPot. ↩
Embora o aplicativo base seja interoperável, os serviços internos (plugins) só podem ser usados em ambientes Linux, FreeBSD e macOS. Planejamos superar essa limitação substituindo plugins por microsserviços que se comunicam através de gRPC. ↩
Por razões éticas e de segurança, o RIoTPot não permite solicitações não solicitadas para o exterior, ou seja, shells reversos e similares não são permitidos. ↩