hhkb.dev

BLOG

2025-12-20 / 피버팅과터널링 · 14

ICMP 터널링

1. 개요

ICMP 터널링(ICMP Tunneling)은 네트워크 진단에 쓰이는 ICMP(Internet Control Message Protocol) 패킷 구조를 데이터 전달 경로로 활용하는 방식이다.

TCP/UDP 포트는 엄격하게 막아도, ping 같은 점검용 트래픽 때문에 ICMP를 일부 허용하는 환경이 있다. 이 문서는 그런 예외 경로를 데이터 전달에 쓰는 구조를 설명한다.

2. 동작 원리

RFC 792에 정의된 ICMP 패킷 구조, 특히 **Echo Request (Type 8)**와 Echo Reply (Type 0) 메시지에는 가변 길이의 Data 필드가 존재한다.

  1. 캡슐화: 공격자는 전송하고자 하는 데이터(예: HTTP 요청, SSH 트래픽 등)를 잘게 쪼개어 ICMP 패킷의 Data 필드에 채워 넣는다.
  2. 전송: 조작된 ICMP Echo Request를 피벗 호스트(또는 공격자 서버)로 전송한다.
  3. 복호화 및 전달: 수신 측의 터널링 데몬은 ICMP 패킷을 받아 Data 필드에서 원본 데이터를 추출하고, 이를 실제 목적지(예: 웹 서버)로 전달한다.
  4. 응답: 목적지로부터 온 응답 데이터 역시 ICMP Echo Reply 패킷의 Data 필드에 담겨 공격자에게 돌아온다.

3. 대표 도구 예시: ptunnel-ng

ptunnel-ng는 ICMP 터널링을 구현한 대표적인 도구이다.

3.1 서버 설정 (공격자/중계지)

# ICMP 패킷을 수신하고 처리할 서버 데몬 실행
sudo ./ptunnel-ng

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

피벗 호스트(10.1.10.10)의 로컬 포트(2222)와 외부의 ICMP 터널 서버(10.8.0.2)를 연결해, 최종 목적지(google.com:80)로 중계하는 구조 예시다.

# 구문: ptunnel-ng -p [ProxyAddress] -l [LocalPort] -R [RemoteDestIP] -r [RemoteDestPort]
sudo ./ptunnel-ng -p 10.8.0.2 -l 2222 -R 142.250.207.100 -r 80
  • -p: ICMP 터널 서버(Proxy) 주소.
  • -l: 로컬 리스닝 포트.
  • -R: 최종 목적지 IP.
  • -r: 최종 목적지 포트.

이후 curl localhost:2222를 실행하면, 트래픽은 ICMP 패킷에 실려 10.8.0.2로 가고, 거기서 구글로 접속된다.

4. 한계 및 OpsSec

  • 성능 저하: ICMP는 비연결형 프로토콜이며, 패킷 손실 시 재전송 메커니즘을 터널링 툴이 직접 구현해야 하므로 TCP 터널링 대비 속도가 매우 느리고 불안정하다.
  • 탐지 용이성 (High Risk):
    • 비정상적인 페이로드 크기: 일반적인 ping 패킷은 데이터 크기가 작고 일정하지만, 터널링 패킷은 MTU에 가깝게 꽉 채워져 전송된다.
    • 높은 빈도: 데이터 전송을 위해 단시간에 수천 개의 ICMP 패킷이 발생하므로, 트래픽 볼륨 기반 탐지에 매우 취약하다.
    • 내용 검사: Data 필드를 평문으로 전송할 경우 HTTP 헤더 등의 문자열이 그대로 노출된다.

실무에서는 ICMP 터널링을 일반적인 우선순위로 보기보다, 다른 경로가 모두 막힌 상황에서만 신중하게 검토하는 편이 맞다.