
고상호작용 허니팟으로 취약한 Laravel/Livewire 애플리케이션을 모방합니다. CVE-2024-47823, CVE-2025-54068, CVE-2025-14894를 대상으로 하는 RCE 익스플로잇 및 웹쉘을 캡처한 후, 샌드박스 Docker 컨테이너에서 분석하여 IOCs를 추출합니다.
취약한 Laravel/Livewire 애플리케이션으로 위장하는 고상호작용 허니팟입니다. 알려진 Livewire CVE를 대상으로 한 익스플로잇 시도를 포착하고, 업로드된 악성 파일(웹셸)과 원격 코드 실행(RCE) 페이로드를 SHA-256 중복 제거와 함께 저장하며, 선택적으로 샌드박스 Docker 컨테이너 안에서 실행하여 악성코드가 통신을 시도하는 URL, IP, 도메인 같은 침해 지표(IOC)를 추출합니다.
시스템은 보안을 위해 두 개의 별도 프로세스로 실행됩니다. 웹 서버는 페이로드를 포착하며(Docker 접근 불가), 샌드박스 워커는 격리된 컨테이너 안에서 페이로드를 분석합니다.
Attacker → Nginx → FastAPI → SQLite ← Sandbox Worker (Docker)
(capture) (polls jobs, writes IOCs)
가상 표면 — Livewire wire: 속성, XSRF 토큰, X-Powered-By: PHP/8.3.12 헤더를 포함한 현실적인 Laravel 로그인/회원가입 페이지를 제공합니다. 자동화 스캐너는 실제 취약한 앱처럼 보이는 대상을 발견합니다.
포착 — 모든 HTTP 요청은 ASGI 미들웨어 계층에 의해 투명하게 SQLite에 기록됩니다(IP, 헤더, 본문 해시, 타임스탬프). 라우팅이 발생하기 전에 이루어집니다.
덫 — Livewire 엔드포인트는 실제 프레임워크처럼 파일 업로드와 컴포넌트 메시지를 수용합니다. 페이로드는 분류되고(PHP 코드, 직렬화 객체, 셸 명령) SHA-256 중복 제거와 함께 저장됩니다. 흥미로운 각 페이로드는 sandbox_jobs 큐에 영구 작업을 생성합니다.
샌드박스 — 별도의 워커 프로세스가 대기 중인 작업을 폴링하고, 각 페이로드를 임시 Docker 컨테이너(읽기 전용 파일시스템, 네트워크 없음, cap_drop=ALL)에서 실행합니다. LD_PRELOAD 셰임이 libc 네트워크 호출을 가로채 C2(명령 및 제어) 통신 시도를 기록합니다. 분석기는 IOC를 추출하고 휴리스틱을 사용하여 잠재적 C2 엔드포인트를 점수화합니다.
*.php 포괄 덫은 익스플로잇 이후 일반적인 웹셸 파일명(예: accesson.php, wp-login.php, admin.php)을 찾는 프로빙도 포착합니다.
필수 조건: Python 3.11+ 및 uv.
git clone https://github.com/HelgeSverre/livewire-honeypot.git
cd livewire-honeypot
# 의존성 설치
uv sync
# 웹 서버 시작 (포착 전용, Docker 불필요)
DATA_DIR=./data uv run uvicorn honeypot.main:app --reload --port 8000
# 두 번째 터미널에서 — 샌드박스 워커 시작 (Docker 필요)
DATA_DIR=./data uv run python -m honeypot.worker
# 테스트 실행
uv run pytest tests/ -v
웹 서버는 독립적으로 작동합니다. 샌드박스 워커가 실행되지 않아도 모든 것을 포착하고 저장합니다. 자동 페이로드 분석이 필요할 때 워커를 시작하세요.
참고:
src/디렉토리는pyproject.toml(src-layout)을 통해 Python 경로에 포함되므로,honeypot.main:app은src/honeypot/main.py를 가리킵니다.
필요한 것:
VPS가 존재하는 즉시 전체 배포는 단일 명령으로 수행됩니다. 스크립트는 "베어 드롭렛"에서 "TLS가 활성화된 서비스 실행"까지 모든 단계를 처리합니다. apt 패키지, 사용자 및 그룹, Python venv, 샌드박스 이미지, nginx, certbot, 방화벽 규칙.
# 1. $6/월 드롭렛 프로비저닝 (Ubuntu 24.04, 1 GB RAM으로 충분).
# DigitalOcean에서:
doctl compute droplet create veritron-honeypot \
--size s-1vcpu-1gb \
--image ubuntu-24-04-x64 \
--region fra1 \
--ssh-keys "$(doctl compute ssh-key list --format ID --no-header | head -1)" \
--wait
# 2. 도메인의 A 레코드를 드롭렛 IP로 지정.
# 계속하기 전에 DNS가 해석되기를 기다립니다.
dig +short your-domain.example # 드롭렛 IP를 반환해야 함
# 3. 프로젝트를 드롭렛에 복사.
rsync -az --exclude='.git' --exclude='.venv' --exclude='data' \
./ root@<droplet-ip>:/opt/honeypot/
# 4. 부트스트랩 스크립트 실행. 도메인을 전달하면 certbot을 통해 TLS를 활성화합니다.
ssh root@<droplet-ip> 'cd /opt/honeypot && [email protected] \
bash deploy/setup.sh your-domain.example'
이상입니다. 이제 허니팟이 HTTPS를 통해 가짜 Laravel/Livewire 로그인 페이지를 제공하며, 모든 요청을 SQLite에 포착하고, Docker 샌드박스에서 페이로드를 분석할 준비가 되었습니다.
deploy/setup.sh는 멱등적입니다. 다시 실행해도 안전합니다. 순서대로:
honeypot(웹) 및 sandbox(워커) 서비스 사용자와 공유 honeypot-data 그룹 생성.uv sync --python /usr/bin/python3.12 실행. 의도적으로 uv의 번들 인터프리터 대신 apt로 설치된 Python을 사용합니다. uv의 Python은 /root/.local/share/uv/에 위치하여 권한이 없는 서비스 사용자가 접근할 수 없고, uv가 인터프리터를 선택하도록 두면 혼란스러운 status=203/EXEC systemd 오류가 발생합니다./var/honeypot/ 생성. 두 서비스가 서로의 쓰기를 읽을 수 있도록 함.ExecStart를 시스템 Docker 데몬을 사용하도록 재작성 (제공된 유닛은 설정하기 더 어려운 rootless Docker를 가정).docker build -t honeypot-sandbox sandbox/).limit_req_zone 지시문을 /etc/nginx/conf.d/에 추가 ( 블록 안에 있어야 하며 안이 아님).각 단계를 setup.sh를 실행하는 대신 직접 수행하려면 동등한 셸 히스토리가 deploy/setup.sh에 주석 처리된 단계로 제공됩니다.
| 서비스 | 사용자 | 목적 | Docker 접근 |
|---|---|---|---|
honeypot.service | honeypot | 웹 서버 — 요청 및 페이로드 포착 |
두 서비스 모두 SQLite 데이터베이스와 페이로드 저장소를 위해 /var/honeypot/를 공유합니다. 웹 프로세스는 Docker 소켓에 접근할 수 없기 때문에, 공격자 트래픽을 통해 손상되더라도 호스트에서 컨테이너를 생성할 수 없습니다.
# 로그 보기
journalctl -u honeypot -f
journalctl -u honeypot-worker -f
# 서비스 재시작
systemctl restart honeypot honeypot-worker
# 업그레이드
cd /opt/honeypot && git pull && uv sync
docker build -t honeypot-sandbox sandbox/
systemctl restart honeypot honeypot-worker
모든 설정은 환경 변수로 제어됩니다 (systemd 유닛 파일에 설정하거나 실행 전에 export):
모든 데이터는 단일 SQLite 데이터베이스(기본: /var/honeypot/captures.db)에 저장됩니다.
# 최근 요청
sqlite3 /var/honeypot/captures.db \
"SELECT timestamp, source_ip, method, path, matched_trap
FROM requests ORDER BY id DESC LIMIT 20;"
# 빈도별 고유 페이로드
sqlite3 /var/honeypot/captures.db \
"SELECT sha256, filename, payload_type, times_seen, sandbox_status
FROM payloads ORDER BY times_seen DESC;"
# 상위 공격자 IP
sqlite3 /var/honeypot/captures.db \
"SELECT ip, total_requests, first_seen, last_seen
FROM attackers ORDER BY total_requests DESC LIMIT 10;"
# 추출된 IOC(JSON)가 포함된 샌드박스 결과
sqlite3 /var/honeypot/captures.db \
"SELECT payload_id, exit_code, duration_seconds, c2_urls_found, iocs
FROM sandbox_runs ORDER BY id DESC LIMIT 5;"
# 대기 중인 샌드박스 작업
sqlite3 /var/honeypot/captures.db \
"SELECT id, payload_sha256, status, created_at
FROM sandbox_jobs ORDER BY id DESC LIMIT 10;"
sandbox_runs.iocs의 IOC 데이터는 domains, ips, emails, urls, hashes 키가 있는 JSON으로 저장됩니다. 필요에 따라 추출하여 위협 인텔리전스 플랫폼(MISP, OpenCTI 등)에 전달하세요.
src/honeypot/
main.py # FastAPI 웹 앱 (포착 전용, Docker 불필요)
worker.py # 독립형 샌드박스 워커 (SQLite 폴링, Docker 필요)
config.py # 환경 변수에서 설정 로드
capture/
database.py # 비동기 SQLite — 요청, 페이로드, sandbox_jobs 큐
logger.py # ASGI 미들웨어 — 모든 요청 기록
payloads.py # SHA-256 중복 제거 저장소 + 페이로드 분류
facade/
routes.py # Laravel 지문이 있는 페이지 (로그인, 회원가입 등)
templates/ # Livewire wire: 속성이 있는 Jinja2 HTML
static/ # 가짜 livewire.js (v3.5.1 지문)
traps/
livewire.py # POST /livewire/message, /upload-file, /preview-file
php_catchall.py # *.php 프로빙을 위한 포괄 덫
sandbox/
orchestrator.py # Docker 컨테이너 생명주기 + 강화
analyzer.py # 아티팩트 파싱 + IOC 추출 + C2 점수화
deploy/
nginx.conf # 속도 제한이 있는 리버스 프록시
honeypot.service # systemd 유닛 (웹)
honeypot-worker.service # systemd 유닛 (샌드박스 워커)
setup.sh # VPS 부트스트랩 스크립트
sandbox/
Dockerfile # 샌드박스 컨테이너 이미지 (PHP 8.3 + 공격자 도구)
entrypoint.sh # LD_PRELOAD 네트워크 셰임이 포함된 컨테이너 진입점
본 도구는 귀하가 소유한 인프라에서 악성코드 샘플을 수집하고 공격자 행동을 관찰하기 위한 연구 도구입니다. 프로덕션 보안 제품이 아닙니다. 귀하가 통제하는 시스템에만 배포하시고, 공격자 페이로드를 포착 및 실행하는 것은 귀하의 관할권에서 법적 영향을 미칠 수 있음을 인지하십시오. SQLite 데이터베이스와 페이로드 파일은 무제한으로 커집니다. 디스크 사용량을 모니터링하고 필요에 따라 보존 정책을 구현하십시오.
이슈 및 풀 리퀘스트는 환영합니다.
| CVE | CVSS | 요약 | 덫 엔드포인트 |
|---|
| CVE-2024-47823 | 9.8 심각 | Livewire 파일 업로드 RCE: MIME 유형 우회. 파일 확장자를 파일명이 아닌 MIME 유형으로 추측하여, .php 업로드를 이미지로 위장할 수 있음. Livewire < 2.12.7 및 < 3.5.2에 영향. | POST /livewire/upload-file |
| CVE-2025-54068 | 9.2 심각 | Livewire 프로퍼티 하이드레이션 RCE. 하이드레이션 과정이 컴포넌트 속성 업데이트의 객체 유형을 살균하지 않아, 주입된 페이로드가 서버 측에서 실행될 수 있음. Livewire 3.0.0-beta.1부터 3.6.3까지 영향. | POST /livewire/message |
| CVE-2025-14894 | 심각 | Livewire Filemanager 무제한 업로드 RCE. 파일 유형 및 MIME 검증이 누락되어 인증 없이 실행 가능한 PHP 파일 업로드가 가능함. | POST /livewire/upload-file |
http {}server {}certbot --nginx 실행.| 아니오 |
honeypot-worker.service | sandbox | 샌드박스 워커 — Docker에서 페이로드 분석 | 예 |
| 변수 | 기본값 | 설명 |
|---|
DATA_DIR | /var/honeypot | 모든 데이터의 기본 디렉토리 |
DB_PATH | $DATA_DIR/captures.db | SQLite 데이터베이스 경로 |
SANDBOX_TIMEOUT | 60 | 샌드박스 실행당 최대 초 |
SANDBOX_MEMORY | 128m | 컨테이너 메모리 제한 |
SANDBOX_CPUS | 0.5 | 컨테이너 CPU 제한 |
SANDBOX_MAX_CONCURRENT | 3 | 최대 동시 샌드박스 컨테이너 |
SANDBOX_IMAGE | honeypot-sandbox | 샌드박스용 Docker 이미지 |
WORKER_POLL_INTERVAL | 2.0 | 작업 폴링 간 간격(초) |