
원래 CVE-2026-20131용 허니팟
저상호작용 허니팟으로, Cisco Secure Firewall Management Center (FMC) 웹 표면을 모방하고 인증되지 않은 Java 직렬화 스타일 공격 트래픽(CVE 스타일 안전하지 않은 역직렬화 프로브)을 캡처합니다.
\xac\xed\x00\x05(및 Base64 rO0AB…)를 탐지하고 정규 표현식 및 휴리스틱을 사용하여 셸 또는 URL 문자열을 추출합니다.requests**를 사용하여 실행 불가능한 다운로드 볼륨으로만 검색합니다.한 줄 JSON 로그(Splunk 및 ELK 호환), 선택적 Telegram 알림, 해시된 2단계 아티팩트, 비루트 컨테이너 사용자. 이 프로젝트는 추가 통합 코드 없이 집중적인 FMC 스타일 트랩이 필요한 연구자를 대상으로 합니다.
| 항목 | 참고 |
|---|
| Docker 및 Docker Compose v2 | Docker 설치 |
| VPS 또는 호스트 | 전용 또는 격리된 네트워크 세그먼트 권장 |
| 도메인 (선택 사항) | HTTPS용: DNS 구성 및 호스트로의 인바운드 TCP 80 및 TCP 443 허용 |
git clone https://github.com/Hassan-Pouladi/Cisco-FMC-honeypot
cd FMC-Trap
cp .env.example .env
필요에 따라 .env를 편집합니다(환경 변수 참조). 번들 Caddy 뒤에 배포하는 경우 **TRUST_X_FORWARDED_FOR=1**로 설정하여 로그의 클라이언트 IP 주소가 원래 클라이언트를 반영하도록 합니다.
**Caddyfile**을 편집하여 플레이스홀더 호스트 이름을 사용자의 도메인(및 해당되는 경우 www)으로 바꿉니다:
example.com, www.example.com {
reverse_proxy fmc-trap:5000
}
선택적으로 Caddyfile에서 전역 email [email protected] 블록의 주석을 해제하여 Let's Encrypt 만료 알림을 받을 수 있습니다.
yourdomain.com → 서버의 공인 IP, www도 사용하는 경우 추가.ufw allow 80,443/tcp).애플리케이션은 컨테이너 내부에서 UID **10001**로 실행됩니다. 바인드 마운트된 ./data 디렉터리는 쓰기 가능해야 합니다:
mkdir -p data/logs data/downloads
sudo chown -R 10001:10001 data/logs data/downloads
올바른 소유권이 없으면 악용 POST 요청이 500을 반환할 수 있습니다(로그 또는 원시 블롭을 쓸 때 Permission denied).
docker compose up -d --build
docker compose ps
curl -sI https://yourdomain.com/
HTTP/2 200(또는 301 또는 302) 및 **Via: Caddy**가 예상됩니다. 브라우저에서 **https://yourdomain.com/**는 시뮬레이션된 FMC 로그인 페이지를 표시해야 합니다.
이벤트, 페이로드 및 Docker 출력을 읽을 위치는 로그, 다운로드 및 서비스 출력 찾기 및 일반 작업을 참조하세요.
아래 모든 내용은 프로젝트 디렉터리(docker-compose.yml이 포함된 폴더, 일반적으로 클론 후 FMC-Trap)를 기준으로 합니다. 경로는 호스트 기준이며, Docker가 이를 컨테이너에 바인드 마운트합니다.
| 항목 | 호스트 경로 | 열기 또는 팔로우 방법 |
|---|---|---|
| 이벤트 로그 (JSON 라인) | data/logs/fmc-trap.json | tail -f data/logs/fmc-trap.json (실시간 스트림), 또는 편집기에서 열기, 또는 Splunk/ELK로 수집 |
| 다운로드된 2단계 페이로드 | data/downloads/ | 수집기가 원격 응답을 저장할 때만 파일이 나타납니다. 각 파일은 SHA256 해시(64자 16진수)로 이름 지정되며, 확장자 없음. ls -la data/downloads(Linux/macOS) 또는 Get-ChildItem data\downloads(Windows PowerShell)로 나열 |
| 애플리케이션 프로세스 출력 | 파일 아님; Docker | docker compose logs -f fmc-trap |
| Caddy (TLS, 프록시, ACME) | 파일 아님; Docker | docker compose logs -f caddy |
| Telegram 알림 (선택 사항) | data/에 저장되지 않음 | .env에서 TELEGRAM_BOT_TOKEN 및 TELEGRAM_CHAT_ID 설정; 이벤트가 기록될 때 알림 전송 |
로그 파일에 무언가 나타날 때: fmc-trap.json은 요청이 역직렬화 프로브 동작(POST의 매직 바이트)과 일치할 때 한 줄에 하나의 JSON 객체를 받습니다. 가짜 로그인 페이지에 대한 일반적인 GET 요청은 기본적으로 이 파일에 기록되지 않습니다.
다운로드 폴더에 파일이 있을 때: 파이프라인이 프로브에서 URL을 추출하고 수집기가 MAX_DOWNLOAD_MB 내에서 허용된 원격 콘텐츠를 성공적으로 가져온 경우에만 항목이 나타납니다. 디렉터리가 비어 있으면 아직 적격 URL이 없거나 애플리케이션의 정책에 따라 가져오기가 차단되었을 수 있습니다.
JSON 예쁘게 출력 (선택 사항): 단일 라인의 경우 python -m json.tool로 파이프하거나 jq(설치된 경우)를 사용하세요.
| 목표 | 명령 또는 동작 |
|---|---|
| 컨테이너가 실행 중인지 확인 | docker compose ps |
.env 또는 Caddyfile 편집 후 재시작 | docker compose up -d --build (또는 env만 변경된 경우 docker compose up -d --force-recreate) |
| 스택 중지 | docker compose down |
| 새 JSON 이벤트를 지속적으로 팔로우 | tail -f data/logs/fmc-trap.json |
| 최근 몇 개 이벤트 확인 | tail -n 50 data/logs/fmc-trap.json |
| 다운로드된 아티팩트 개수 세기 | 파일 관리자에서 data/downloads 열기, 또는 해당 디렉터리에서 쉘 파일 개수 사용 (파일은 SHA256으로 이름 지정) |
| 허니팟 페이지 로드 확인 | 브라우저에서 https://yourdomain.com/ 열기 또는 확인 단계에서 curl -sI 사용 |
Internet :443/:80 → Caddy (TLS, Let's Encrypt) → fmc-trap:5000 (Gunicorn/Flask)
↓
./data/logs, ./data/downloads (bind mounts)
expose: "5000" 참조).| 변수 | 목적 | 기본값 / 참고 |
|---|---|---|
TRUST_X_FORWARDED_FOR | 첫 번째 X-Forwarded-For 홉을 src_ip로 사용 | Caddy 사용 시 1 권장 |
DECEPTION_STATUS | 200은 HTML 본문 반환; 302는 리디렉션 반환 | 200 |
DECEPTION_REDIRECT_URL | 상태가 302일 때 대상 경로 | / |
MAX_DOWNLOAD_MB | URL당 수집기 제한 | 16 |
TELEGRAM_BOT_TOKEN / TELEGRAM_CHAT_ID | 선택적 알림 | 비어 있으면 알림 비활성화 |
FMC_SERVER_HEADER | Server 응답 헤더 | nginx |
VT_API_KEY | 예약됨 | 선택 사항 |
Compose는 이러한 변수를 fmc-trap 서비스로 전달합니다. 자세한 내용은 docker-compose.yml을 참조하세요.
data/logs/fmc-trap.json의 각 줄은 하나의 JSON 객체입니다. 일반적인 키로는 timestamp, event_type, src_ip, headers, raw_payload_hash, extracted_commands 및 파일이 저장된 경우 downloaded_file_hash가 있습니다. data/downloads/에 저장된 블롭은 모드 0400(소유자 읽기 전용)을 사용합니다.
| 증상 | 해결 방법 |
|---|---|
data/ 아래에 쓸 때 Permission denied 오류 | sudo chown -R 10001:10001 data/logs data/downloads 실행 |
Bind for 0.0.0.0:80 failed: port is already allocated | 다른 서비스나 컨테이너가 80에 바인딩되어 있습니다. 해당 서비스를 중지하거나 80을 해제하세요. 호스트당 하나의 프로세스만 80에서 수신할 수 있습니다. |
| Caddy 로그에 Let's Encrypt 또는 ACME 오류 | DNS가 이 서버로 확인되고 80 및 443이 인터넷에서 연결 가능한지 확인하세요. Compose는 호스트 리졸버가 Docker 내부에서 실패할 때 Caddy에 대해 DNS 1.1.1.1 및 8.8.8.8을 구성합니다. |
첫 번째 시도에서 curl로 HTTPS 연결 시 출력이 비어 있거나 실패 | docker compose logs caddy에서 certificate obtained successfully가 나타날 때까지 기다리세요. |
로그의 클라이언트 IP가 172.x.x.x로 표시됨 | Caddy 사용 시 **TRUST_X_FORWARDED_FOR=1**을 설정한 후 컨테이너를 다시 생성하세요: docker compose up -d --force-recreate. |
Caddy 없이 Gunicorn에 직접 접근하려면 docker-compose.yml의 fmc-trap 아래에 다음을 추가하세요:
ports:
- "127.0.0.1:5000:5000"
프로덕션에서 Caddy가 TLS를 종료할 때 애플리케이션을 0.0.0.0에 바인딩하지 마십시오.
.env에만 저장하세요(절대 .env를 커밋하지 마세요).소유한 시스템 또는 명시적으로 계측 배포 권한이 부여된 시스템에만 배포하세요. 허니팟은 공격 트래픽과 악성 코드를 수집할 수 있습니다. 해당 법률 및 조직 정책을 준수하세요. 이 소프트웨어는 보안 연구 목적으로 사용됩니다.