
IoT 및 운영 기술 허니팟
| 📢 주의!!! |
|---|
| 이 저장소는 Honeynet 프로젝트로 이동되었습니다 :) |
RIoTPot은 하이브리드 상호작용 허니팟으로, 주로 IoT 및 OT 프로토콜의 에뮬레이션에 중점을 두고 있지만, 다른 서비스도 에뮬레이션할 수 있습니다. 기본적으로 RIoTPot은 시스템에 포함된 다른 허니팟을 위한 프록시 서비스 역할을 합니다. 따라서 RIoTPot과 함께 모든 허니팟 및 다른 서비스를 실행할 수 있습니다. 또한 라우팅을 관리할 수 있는 UI 웹 애플리케이션이 있습니다.
허니팟에는 즉시 사용 가능한 여러 저상호작용 서비스가 포함되어 있습니다. 이러한 서비스는 플러그인으로 작성되었기 때문에 Linux에서만 지원됩니다. 그러나 플러그인 없이도 RIoTPot을 시작할 수 있습니다. 다음 표는 RIoTPot에 기본적으로 포함된 서비스, 내부 포트 및 프록시 포트 목록입니다.
목차
RIoTPot 아키텍처는 내부 및 주변(또는 외부) 서비스(예: 허니팟, 전체 서비스, 컨테이너, 원격 호스트 등)에 대한 프록시 연결을 기반으로 합니다.
이를 위해 허니팟은 사용자가 정의한 여러 프록시를 관리하며, 이 프록시는 서비스와 RIoTPot 간의 연결을 중계합니다1.
이런 방식으로 RIoTPot은 들어오는 공격을 어떻게, 어디로 라우팅할지 결정할 수 있습니다.
들어오는 공격을 처리하는 방법을 결정하는 로직은 미들웨어 형태로 구현됩니다2.
서비스, 미들웨어 및 프록시를 관리하기 위해 RIoTPot은 기본적으로 REST API3와 웹앱 UI4를 제공합니다.
UI는 브라우저에서 localhost:2022로 접근할 수 있으며, API 엔드포인트는 localhost:2022/api/swagger에서 Swagger 인터페이스를 통해 확인할 수 있습니다.
그림 1은 RIoTPot 아키텍처를 보여주며, RIoTPot을 구성하는 두 가지 주요 애플리케이션(RIoTPot 자체 및 RIoTPot UI)과 그 구성 요소, 그리고 외부(또는 인접) 서비스를 포함하는 섹션을 나타냅니다.
RIoTPot은 Golang5으로 작성되었습니다. 각 RIoTPot 인스턴스는 필요에 따라 등록된 프록시(포트 기준)를 노출합니다. 프록시를 제공하려면 반드시 바인딩된 서비스가 있어야 하며, 프록시 포트 반드시 사용 가능해야 합니다(현재 RIoTPot은 동일한 포트에서 여러 서비스를 실행하는 것을 허용하지 않습니다). 프록시가 바인딩되어 제공되면, 공격자는 해당 포트에서 RIoTPot으로 메시지를 보낼 수 있으며, 메시지는 바인딩된 서비스로 전달되었다가 다시 공격자에게 돌아갑니다6.
편의를 위해 여러 RIoTPot 인스턴스를 RIoTPot UI 웹앱에서 관리할 수 있습니다.
UI는 각 인스턴스에 등록된 프록시를 관리할 뿐만 아니라, 프로필을 생성, 사용 및 편집할 수 있게 해줍니다.
각 프로필에는 프로토콜 또는 기타 서비스 이름을 딴 여러 프록시가 포함되어 RIoTPot 인스턴스가 실제 장치(예: 홈 어시스턴트)처럼 보이게 합니다.
간단히 말해, 프로필은 특정 구성으로 RIoTPot 인스턴스를 설정하고 프로비저닝하는 과정을 가속화합니다.
UI는 React 프론트엔드 JavaScript 라이브러리(이 프로젝트에서는 TypeScript 사용)와 Recoil 상태 관리 라이브러리를 사용하여 작성되었습니다.
RIoTPot은 상당히 작기 때문에 현재는 데이터베이스를 사용하지 않습니다.
RIoTPot 실행은 비교적 간단합니다. 전체적으로 세 가지 옵션이 있습니다. 첫 번째는 RIoTPot 릴리스를 다운로드하는 것입니다. 최신 릴리스나 이전 릴리스를 선택할 수 있습니다. 두 번째 옵션은 프로젝트를 직접 빌드하는 것입니다. 마지막 옵션은 소스 코드를 사용하여 RIoTPot과 추가 애플리케이션이 포함된 Docker 컨테이너를 만들어 허니팟을 강화하는 것입니다.
정보: 이 가이드는 특별한 요구 사항이 없고 간편한 즉시 사용 환경을 원하는 사용자를 대상으로 합니다.
각 릴리스는 riotpot이라는 폴더에 포함되어 있으며, 실행 바이너리(역시 riotpot이라는 이름)와 여러 서비스(또는 저상호작용 허니팟)로 채워진 plugins 폴더가 있습니다.
RIoTPot이 의도한 대로 작동하려면 내부 폴더 구조를 유지하는 것이 중요합니다.
📁 riotpot
┕ riotpot
┕ 📁 plugins
riotpot 폴더를 추출하세요.riotpot 바이너리를 실행하세요. 그러면 API가 활성화되고, 모든 플러그인이 사용 준비되며, UI 서버가 시작됩니다.
localhost:2022를 통해 접근할 수 있습니다.정보: 이 가이드는 개발 환경에 익숙한 고급 사용자를 대상으로 합니다.
요구 사항
- Golang - 프로젝트 빌드에 필요
- Node - UI 빌드에 필요
선택 사항:
- Git - 소스 코드 다운로드에 사용
- Make - 미리 준비된 명령어 실행에 사용
GitHub에서 RIoTPot 소스 코드를 다운로드하세요. 콘솔을 열고 다음 줄을 입력하세요.
git clone [email protected]:aau-network-security/riotpot.git
RIoTPot 소스를 다운로드한 폴더로 이동한 후, 필요한 노드 패키지를 설치하세요.
npm install
Make를 설치했다면, 프로젝트 빌드를 돕는 여러 명령어 도우미가 포함되어 있습니다. 간단히 말해, RIoTPot 바이너리와 플러그인을 빌드(그리고 올바른 폴더에 배치)하는 두 가지 명령어를 실행하면 됩니다.
# 서버 빌드
make build-ui
# RIoTPot과 플러그인 빌드
make riotpot-build
참고: UI는 Vite를 사용하여 빌드됩니다. 다른 빌더를 사용하려면 먼저 직접 몇 가지 변경을 해야 할 수 있습니다.
정보: 이 가이드는 가상 환경에서 RIoTPot을 사용하려는 고급 사용자를 대상으로 합니다.
요구 사항
- Docker - RIoTPot 인스턴스와 UI 서버의 이미지를 빌드하는 데 사용
- Docker-compose - RIoTPot 인스턴스, UI 및 기타 애플리케이션과 서비스를 포함하는 단일 컨테이너를 생성하는 데 사용
이 설정을 사용할 때의 주요 장점은 컨테이너 구성과 컨테이너 자체에 최소한의 변경만으로 추가 보안 기능을 제공한다는 것입니다. 예를 들어, 분리된 가상 사설 네트워크와 오버레이 네트워크를 정의하여 RIoTPot과 기타 인접 서비스를 숨기고, 샌드박싱하고, 캡슐화할 수 있습니다. 또한 컨테이너를 사용하면 IP 대신 Docker 주소 이름을 사용하여 서비스를 바인딩할 수 있어 매우 편리합니다. 마지막으로, 다른 서비스에 영향을 주지 않고 필요에 따라 분리된 컨테이너를 생성하고 중지할 수 있습니다.
반면, 가상화는 베어메탈에서 애플리케이션을 사용하는 것보다 분명히 더 많은 자원을 요구합니다. 단일 RIoTPot 인스턴스는 상대적으로 가볍지만, 가상화 및 하드웨어 에뮬레이션(예: 응답 지연)으로 인한 단점을 고려하는 것이 중요합니다.
경고: 기술적으로 말하면, 전용 공격자는 가상화로 인한 응답 시간 지연을 실제 서버와 비교 분석하여 RIoTPot이 실제로 허니팟임을 깨달을 수 있습니다(!!). 이러한 유형의 허니팟 핑거프린팅은 이전에 연구된 바 있지만, 클라우드 호스팅 서비스의 상용화와 가상 머신 및 세부 서버 구성으로 인해 일반적인 인터넷 서비스(예: HTTP, Telnet, SSH)에 대한 결과는 여전히 결정적이지 않습니다.
docker-compose 파일에는 RIoTPot 경험을 향상시키기 위한 추가 서비스가 포함되어 있습니다.
다음 표는 이 컨테이너에 포함된 서비스 및 애플리케이션 목록을 요약합니다.
서비스
RIoTPot에는 무슨 내용을, 어떻게 시작할지에 영향을 주는 플래그 명령어가 있습니다. 예시:
# UI 없이 RIoTPot 실행
./riotpot --ui false
내부 및 주변 서비스는 인터넷을 통해 접근할 수 없습니다. 내부 서비스는 통합되어 있으며 RIoTPot에만 접근 가능합니다. 이러한 서비스는 시작 시 로드되며 삭제할 수 없지만 중지할 수 있습니다. 주변 서비스는 RIoTPot과 동일한 네트워크에 있어야 합니다. 외부 서비스는 오직 RIoTPot만 허용 목록에 추가해야 합니다. ↩
미들웨어는 현재 개발 중입니다. ↩
RIoTPot API는 인터넷에 노출되어서는 안 됩니다. 그럼에도 불구하고 현재 API는 localhost에서의 연결만 허용합니다. 향후 호스트 허용 목록 및 표준 인증을 제공하도록 변경될 수 있습니다. ↩
웹 인터페이스는 별도의 구성 요소로 사용할 수 있지만, RIoTPot 바이너리에 내장되어 있습니다. ↩
기본 애플리케이션은 상호 운용이 가능하지만, 내부 서비스(플러그인)는 Linux, FreeBSD 및 macOS 환경에서만 사용할 수 있습니다. 우리는 플러그인을 gRPC를 통해 통신하는 마이크로서비스로 대체하여 이 제한을 극복할 계획입니다. ↩
윤리적, 보안적 이유로 RIoTPot은 외부로의 원치 않는 요청(예: 리버스 셸 등)을 허용하지 않습니다. ↩
| 서비스 | 내부 포트 | 프록시 포트 |
|---|
| Echo | 20007 | 7 |
| SSH | 20022 | 22 |
| Telnet | 20023 | 23 |
| HTTP | 28080 | 80 |
| Modbus | 20502 | 502 |
| MQTT | 21883 | 1883 |
| CoAP | 25683 | 5683 |
| 서비스 | 이미지 | 포트 | 세부 사항 |
|---|
| MQTT | eclipse-mosquitto | 1883 | Mosquito MQTT 서버 |
| HTTP | httpd | 80 | 일반 HTTP 서버 |
| Modbus | oitc/modbus-server | 502 | Modbus 서버 |
| OCPP | ocpp1.6-central-system | 443 | OCPP v1.6 (자동차 충전소에서 사용) |
| 애플리케이션 | 이미지 | 세부 사항 |
|---|---|---|
| TCPDump | kaazing/tcpdump | 패킷 기록기. 네트워크 트래픽을 .pcap 파일에 저장합니다. |
컨테이너는 세 가지 간단한 단계로 설정할 수 있습니다:
GitHub에서 RIoTPot 소스 코드를 다운로드하세요. 콘솔을 열고 다음 줄을 입력하세요.
git clone [email protected]:aau-network-security/riotpot.git
RIoTPot 소스를 다운로드한 폴더로 이동하세요.
Docker가 실행 중인 상태에서: Make가 설치되어 있다면 다음 명령어를 실행하세요. 그렇지 않으면 build/docker 폴더에 포함된 docker-compose 파일을 사용하여 docker-compose 명령어를 실행하세요.
# Make 사용
make up
# Docker-compose 사용
docker-compose -p riotpot -f build/docker/docker-compose.yaml up -d --build
| 플래그 | 타입 | 기본값 | 설명 |
|---|
| debug | Boolean | false | 로그 수준을 디버그로 설정 |
| api | Boolean | true | API를 시작할지 여부 |
| plugins | Boolean | true | 저상호작용 허니팟 플러그인을 로드할지 여부 |
| whitelist | String | http://localhost,http://localhost:3000 | API에 접근할 수 있는 쉼표로 구분된 허용 호스트 목록 |
| ui | Boolean | true | UI를 시작할지 여부 |