hhkb.dev

BLOG

2025-12-23 / 레드팀인프라구축 · 04

C2 서버 구축과 Sliver

1. Sliver C2 프레임워크 개요

Sliver는 Golang으로 만든 오픈소스 크로스 플랫폼 C2 프레임워크다. Cobalt Strike의 대안으로 자주 언급되며, 바이너리 난독화와 네트워크 우회 쪽 장점이 크다.

C2 서버는 리다이렉터 뒤에 숨어 있으므로, 기본적으로는 리다이렉터를 통해 들어온 트래픽만 처리하게 된다.

2. 환경 구축(Golang & 의존성)

Sliver를 소스코드 레벨에서 수정하고 컴파일하기 위해 특정 버전의 Go 언어 환경이 필요하다.

2.1. GVM(Go Version Manager)을 이용한 설치

Ubuntu 기본 리포지토리의 Go 버전은 호환 문제가 있을 수 있어서, GVM을 쓰는 편이 안전하다.

# 1. 필수 컴파일러 및 도구 설치
sudo apt install -y git build-essential mingw-w64 binutils-mingw-w64 g++-mingw-w64 bison

# 2. GVM 설치
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
source /root/.gvm/scripts/gvm

# 3. Go 1.20.7 설치 및 활성화(Sliver 1.5.x 호환)
gvm install go1.20.7 -B
gvm use go1.20.7 --default

3. 정적 분석 우회(Static Evasion)

오픈소스 C2의 약점은 시그니처(Signature)가 이미 널리 알려져 있다는 점이다. 그래서 소스코드를 무작위로 바꿔 해시값과 내부 문자열을 계속 달라지게 만드는 작업이 필요하다.

3.1. 소스코드 수정 및 컴파일 절차

절차는 아래 순서로 보면 된다.

  1. 소스를 내려받는다.
    git clone https://github.com/BishopFox/sliver.git /opt/sliver
    cd /opt/sliver
    git checkout tags/v1.5.43  # 안정적인 버전 체크아웃
    
  2. 난독화 스크립트(mod_sliver.py)를 실행한다.
    • 역할: 함수명, 변수명, 로고 아스키 아트, 에러 메시지 등을 무작위 문자열로 바꾼다.
    • 결과: 빌드할 때마다 다른 시그니처의 바이너리가 만들어져 백신의 정적 탐지를 피하기 쉬워진다.
    # (스크립트 준비 후)
    python3 mod_sliver.py
    
  3. 최종 컴파일한다.
    make pb    # Protocol Buffers 컴파일
    make       # Sliver Server & Client 최종 빌드
    

4. Malleable C2 와 네트워크 우회

Malleable C2는 C2 통신 트래픽의 모형(Profile)을 바꾸는 기능이다. 기본 트래픽은 특정 헤더나 확장자 같은 패턴이 눈에 띄는데, 이 부분을 손봐서 일반 웹 트래픽처럼 보이게 만든다.

맞춰야 할 포인트는 아래와 같다.

  • 설정 파일: sliver-server/assets/profiles/http-c2.json(경로는 다를 수 있음)을 수정하거나 새로 불러온다.
  • 동기화: 앞서 설정한 Redirector(Nginx) 규칙과 완전히 같아야 한다.
    • URL 경로(예: /login.php, /static/jquery.js)
    • User-Agent 문자열
    • HTTP 헤더 및 쿠키 포맷

5. 서버 실행 및 리스너 설정

서버를 올릴 때는 아래 순서로 진행한다.

  1. 서버를 실행한다. ./sliver-server를 쓰며 관리자 권한이 필요할 수 있다.
  2. 리스너를 연다. 리다이렉터를 통해 들어오는 HTTPS 트래픽을 받을 포트다.
    sliver > https --lport 443
    
  3. Operator 설정(Multiplayer Mode)을 만든다.
    • 로컬에서 직접 작업하지 않고, 오퍼레이터 접속용 프로필을 생성한다.
    sliver > new-operator --name choi --lhost [C2_Public_IP]
    
    • 생성된 .cfg 파일은 오퍼레이터 서버로 옮겨서 사용한다.