hhkb.dev

BLOG

2025-12-19 / 피버팅과터널링 · 08

SSH 다이나믹 포트 포워딩

1. 개요

**SSH 다이나믹 포트 포워딩(Dynamic Port Forwarding)**은 공격자 시스템에 **SOCKS 프록시(Proxy)**를 생성하고, 이를 통해 발생하는 트래픽을 SSH 터널을 경유하여 피벗 호스트로 보낸 뒤, 피벗 호스트에서 목적지로 릴레이(Relay)하는 기법이다.

기존의 로컬/리모트 포트 포워딩이 1:1 매핑(특정 포트를 특정 목적지로 연결)인 반면, 다이나믹 포트 포워딩은 1:N 매핑이다. 즉, 하나의 터널만으로 내부망에 존재하는 다수의 호스트와 포트에 접근할 수 있어, 네트워크 스캔(Nmap)이나 웹 브라우징, RDP 접속 등 다양한 작업을 동시에 수행하는 데 매우 효율적이다.

2. SOCKS 프록시와 작동 원리

SSH 클라이언트는 지정된 로컬 포트에서 SOCKS 서버처럼 동작한다.

  1. SOCKS 리스너 생성: ssh -D [LocalPort] 명령으로 공격자 로컬 머신에 SOCKS 리스너를 띄운다(주로 1080/9050 포트 사용).
  2. 애플리케이션 연동: 공격자는 ProxyChains나 웹 브라우저의 프록시 설정(FoxyProxy 등)을 통해 트래픽을 로컬 SOCKS 포트로 보낸다.
  3. 다이나믹 라우팅: SSH 클라이언트는 SOCKS 프로토콜 헤더를 분석하여 목적지 주소를 파악하고, 이를 암호화하여 피벗 호스트로 전송한다.
  4. 최종 전달: 피벗 호스트는 패킷을 복호화한 후, 헤더에 명시된 내부망의 목적지로 트래픽을 대신 전송(Proxy)한다.

3. 명령어 구문 및 도구 설정

3.1 기본 구문

ssh -N -D [LocalBindIP]:[LocalBindPort] [User]@[PivotHost]
  • -D: 다이나믹 포트 포워딩(SOCKS 프록시 생성) 옵션.
  • [LocalBindPort]: 공격자 PC에서 리스닝할 포트 (예: 1080).
  • [LocalBindIP]: 생략 시 127.0.0.1에 바인딩.

3.2 ProxyChains 설정 및 사용

생성된 SOCKS 터널을 활용하기 위해 ProxyChains 도구를 주로 사용한다. ProxyChains는 프록시를 지원하지 않는 일반 명령어(nmap, rdesktop 등)도 강제로 프록시를 경유하게 만들어준다.

  1. 설정 파일 수정 (/etc/proxychains4.conf):
    [ProxyList]
    # SSH -D로 생성한 포트와 프로토콜(socks4 또는 socks5)을 지정
    socks5  127.0.0.1 1080
    
  2. 도구 실행:
    # 내부망(10.1.20.0/24) 웹 서버 스캔
    proxychains nmap -sT -Pn -p 80,443 10.1.20.20
    
    # 내부망 호스트로 RDP 접속
    proxychains rdesktop 10.1.20.10
    
    # 내부망 호스트로 WinRM 접속
    proxychains evil-winrm -i 10.1.20.20 -u user -p password
    

4. 제약 사항 및 OpsSec

4.1 프로토콜 제약

  • TCP Only: 기본적으로 SSH 터널링과 SOCKS4는 TCP 트래픽만 처리 가능하다. SOCKS5는 UDP를 지원하지만, ssh -D 구현체나 네트워크 환경에 따라 UDP 터널링(예: DNS 질의, SNMP 스캔)이 불안정하거나 지원되지 않을 수 있다.
  • 속도 저하: 모든 트래픽이 암호화/복호화 과정을 거치고 터널을 경유하므로, 직접 접속 대비 지연 시간(Latency)이 발생한다. Nmap 스캔 시 -T4 이상의 빠른 속도 옵션은 타임아웃 오류를 유발할 수 있다.

4.2 스캔 시 주의사항 (Nmap)

ProxyChains를 통한 Nmap 스캔 시 SYN Scan(-sS)은 불가능하다. SYN 스캔은 Raw Socket을 조작해야 하는데, SOCKS 프록시는 완전한 TCP 연결(Connect Scan, -sT) 방식만 지원하기 때문이다. 따라서 반드시 -sT 옵션을 사용해야 하며, ICMP 패킷이 터널을 통과하지 못하는 경우가 많으므로 -Pn(Ping Skip) 옵션을 함께 사용하는 것이 필수적이다.