Skip to main content

Rust 기반 봇넷을 리버스 엔지니어링하고 C2 허니팟을 구축해 타깃을 실시간 모니터링하는 완벽 가이드

Published 3 min readMarkdown

# 서론 – 왜 Rust 봇넷을 분석해야 할까?

최근 사이버 위협 보고서에 따르면 Rust 봇넷이 급증하고 있습니다. 메모리 안전성을 강조하는 Rust 언어 특성 덕분에 기존 C/C++ 기반 악성코드보다 탐지 회피가 뛰어나고, 공격자는 이를 이용해 더욱 정교한 C2 허니팟을 우회합니다.

초보 보안 연구자라면 “복잡한 바이너리를 어떻게 분석하나요?” 라는 의문이 들 수 있지만, 기본적인 리버스 엔지니어링 절차와 도구만 익히면 충분히 접근할 수 있습니다. 이 글에서는 Rust 로 작성된 봇넷을 단계별로 분석하고, 실제 환경에서 타깃을 모니터링할 수 있는 C2 허니팟을 구축하는 방법을 친절히 설명합니다.


# 1. Rust 봇넷 샘플 확보 및 사전 준비

| 단계 | 내용 | 도구 |

|------|------|------|

| 1️⃣ 샘플 수집 | 공개된 악성코드 리포지터리(예: VirusTotal)에서 .exe 또는 .elf 파일 다운로드 | wget, curl |

| 2️⃣ 샌드박스 실행 | 격리된 가상 머신에서 실행해 행위 로그 확보 | Cuckoo, FireEye AX |

| 3️⃣ 정적 분석 환경 | 파일 해시, 문자열, 메타데이터 확인 | pefile, radare2, strings |

| 4️⃣ 디버거 준비 | Rust 특유의 이름 맹글링을 풀어주는 플러그인 적용 | gdb + rust-gdb, lldb |

팁: Rust 바이너리는 기본적으로 DWARF 디버그 정보를 포함하지 않지만, cargo build --release 로 컴파일된 경우에도 -C debuginfo=2 옵션이 남아 있을 수 있습니다. 이 정보를 활용하면 함수 이름을 복원하는 데 큰 도움이 됩니다.


# 2. 리버스 엔지니어링 – 핵심 로직 파악하기

  1. 바이너리 구조 분석

    • objdump -d 로 어셈블리 코드를 추출하고, cargo 로 빌드된 패턴(예: std::process::Command)을 찾아봅니다.

    • Rust는 std::sync::Arc 와 tokio 비동기 런타임을 많이 사용하므로, async 함수 호출 흐름을 파악하면 C2 통신 로직을 빠르게 찾을 수 있습니다.

  2. 문자열 디코딩

    • strings -el 로 추출한 문자열 중 Base64, XOR, AES 등으로 암호화된 부분을 찾아 디코더를 작성합니다.

    • 흔히 사용되는 키는 b'rusty_bot' 와 같은 고정값이므로, 간단한 파이썬 스크립트로 자동 복호화를 시도해 보세요.

  3. 네트워크 흐름 추적

    • strace -e trace=network 로 실행 시 발생하는 connect, sendto, recvfrom 호출을 기록합니다.

    • 대부분의 Rust 봇넷은 HTTP/HTTPS 혹은 WebSocket 기반 C2 서버와 통신합니다. 이때 사용되는 URL, 헤더, 포트 정보를 메모에 저장하고, 이후 허니팟에서 동일한 엔드포인트를 모방합니다.


# 3. C2 허니팟 구축 – 실시간 타깃 모니터링

# 3.1 환경 구성

bash

# Docker 기반 허니팟 이미지 다운로드

docker pull honeyc2/rust-honeypot:latest

# 컨테이너 실행 (포트 8080, 443 매핑)

docker run -d -p 8080:8080 -p 443:443 honeyc2/rust-honeypot
  • Docker 를 이용하면 격리된 환경에서 빠르게 배포할 수 있습니다.

  • honeyc2 프로젝트는 Rust 로 작성된 C2 서버를 모방하며, 들어오는 요청을 로그와 함께 JSON 형태로 저장합니다.

# 3.2 로그 수집 및 분석

| 로그 항목 | 의미 |

|----------|------|

| src_ip | 공격 대상이 된 호스트 IP |

| payload | 암호화된 명령어(디코딩 필요) |

| timestamp | 명령 수신 시각 |

| user_agent | 변조된 HTTP 헤더 정보 |

수집된 로그는 ELK Stack(Elasticsearch, Logstash, Kibana) 혹은 Grafana Loki 로 시각화하면, 실시간 대시보드에서 봇넷의 확산 경로를 한눈에 파악할 수 있습니다.

# 3.3 자동 대응 스크립트 예시 (Python)

python

import requests, json, base64

def decode_payload(enc):

    # 예시: XOR 0x5A 로 복호화

    return bytes([b ^ 0x5A for b in base64.b64decode(enc)])

def block_ip(ip):

    requests.post('http://firewall/api/block', json={'ip': ip})

# 로그 파일 스트리밍

with open('/var/log/honeyc2/events.log') as f:

    for line in f:

        data = json.loads(line)

        cmd = decode_payload(data['payload'])

        if b'ddos' in cmd:

            block_ip(data['src_ip'])

위 스크립트는 리버스 엔지니어링 단계에서 파악한 암호화 방식을 적용해, 위험 명령이 감지되면 자동으로 방화벽에 차단 요청을 보냅니다.


# 4. 결과 검증 및 보안 강화

  1. 침투 테스트 – 자체적으로 만든 악성 샘플을 허니팟에 전송해 로그가 정상적으로 기록되는지 확인합니다.

  2. TLS 인증서 – 실제 C2 서버와 동일한 도메인과 인증서를 사용해 TLS 핸드쉐이크를 위장합니다.

  3. 위협 인텔리전스 공유 – 수집된 IOC(Indicator of Compromise)를 MISP 혹은 OTX 에 업로드해 커뮤니티와 정보를 공유합니다.


# 결론 – 지금 바로 시작해 보세요!

Rust 로 작성된 최신 봇넷은 탐지와 방어가 까다롭지만, 리버스 엔지니어링과 C2 허니팟 구축을 차근차근 따라 하면 누구든지 실전 수준의 방어 체계를 만들 수 있습니다.

  • 오늘 소개한 도구와 스크립트를 직접 실행해 보세요.

  • 로그를 분석하면서 새로운 IOC 를 발견하면 즉시 업데이트하십시오.

  • 마지막으로, 여러분이 만든 허니팟 데이터를 커뮤니티에 공유해 전체 생태계의 방어력을 높이는 데 동참해 주세요.

지금 바로 Rust 봇넷 분석에 도전하고, 안전한 인터넷 환경을 만들어갑시다!

No comments yet. Be the first to comment.

More from this blog