Port Forwarding
Last updated
Was this helpful?
Last updated
Was this helpful?
로컬 영역에 서비스를 실행하고는 있지만
바인딩 가능한 IP 대역을 내부망으로 제한하거나, 방화벽 등을 통해서
외부망에서는 접속하거나 탐지할 수 없게 조치를 해둔 프로토콜의 경우
포트 포워딩을 통해서만 직접 통신할 수 있습니다.
SSH를 이용해서 쉘을 획득한 경우 SSH를 이용한 로컬 포트 포워딩이 가능하지만
그렇지 않은 환경에서는 적절한 도구를 사용해줄 수 있습니다.
파일을 다운로드 한 뒤 압축을 해제하여 exe 파일로 변환합니다.
만약 내부망에 커버로스 프로토콜이 실행 중일 경우 커버로스팅과 같은 공격은
88번 포트 외에도 389번 포트가 필요합니다.
이럴 때는 포트포워딩 양식을 두번 연속 인자로 전달하여 사용합니다.
위와 같이 타겟과 로컬의 1:1 매치 상황은 비현실적입니다.
실제로 터널링 기술을 원하는 호스트에 1:1 상황으로 사용했다면,
방화벽 등의 장애물을 건너뛰는 것이 힘들 뿐 아니라 호스트 PC가 종료되었을 때
직원의 PC가 재부팅될 때까지 연결할 수 없습니다.
그래서 보통의 경우 SSH 서버를 장악한 뒤, 해당 서버에서 터널링을 통해
개별 호스트에 데이터를 송수신하는 방법을 사용합니다.
점프 호스트 개념은 방화벽을 우회하여 쉘, 프로토콜 사용을 위한 해킹 기술은 아닙니다.
간이 VPN이 필요하거나, 간접 연결을 통하여 보안상 이점을 챙기려는 경우,
사용하던 서비스나 서드파티가 변경된 경우 등에 사용되는 기술입니다.
이때 내가 직접 접근할 수는 없지만, 장악한 사내망 호스트를 통하여 타겟에 접근이 가능할 때
장악한 호스트를 통해 점프하여 터널링 한다고 하여 점프 호스트라고 부릅니다.
로컬 포트 포워딩은 바인드 쉘과 동작 방식이 비슷합니다.
목적지 호스트와의 통신을 연결하는 패킷을 전송하여 대상과 연결하여 터널을 생성한 뒤,
그 터널을 이용하여 원하고자 하는 활동을 하는 것입니다.
가장 간단한 매커니즘의 포트 포워딩이기도 합니다.
위와 같은 환경에서는 Kali 호스트에서 내부망 1.1.2.2 호스트로의 직접적인 통신은 불가능합니다.
때문에 접근 가능한 DMZ의 1.1.1.1 특정 포트와의 연결을 통하여 1.1.2.2와 터널을 맺습니다.
예를 들어, Kali의 8888 포트와 1.1.1.1의 8888 포트를 연결하고,
1.1.2.1의 8888 포트와 1.1.2.2의 8888 포트를 연결한다면 Kali에서 8888 트래픽 전송은
1.1.1.1:8888 , 1.1.2.1:8888 을 거쳐 1.1.2.2:8888로 도달합니다.
리모트 포트 포워딩은 대상에 대한 직접적인 접근이 불가능하거나
다른 목적으로 패킷을 받기 위해서 사용합니다.
로컬 포트 포워딩이 바인드 쉘과 비슷했다면, 리모트 포트 포워딩은 리버스 쉘과 비슷합니다.
즉 C2 서버와 외부망의 분리를 위해 HTTP 리다이렉트 서버를 구축한 후,
HTTP 서버에서 리모트 포트 포워딩을 통해 들어오는 패킷을 C2서버로 곧장 전달하는 것과 같이
망 분리 환경에서 보안 상 이점을 위하여 사용하거나, 리버스 쉘 연결을 위해 사용합니다.
위 다이어그램과 같이 직접 접근이 불가능한 2.2.2.2에 연결을 위해 1.1.1.1을 점프 호스트로 설정하여
SSH 연결을 통한 터널링 기술은 아래 명령으로 할 수 있습니다.
하지만 점프해야할 호스트가 많아질 수록 그때마다 SSH 터널링 하는 것은 번거로우며
복잡한 방법이기 때문에 SSH에서는 점프 플래그인 J를 제공합니다.
J 플래그 뒤에 네트워크 대역만 올바르게 입력해줍니다.
동적 포트 포워딩과 로컬/리모트 포트 포워딩의 확연한 차이는 목적지 포트 설정에 있습니다.
앞서 확인한 포트 포워딩들은 모두 목적지의 포트를 명확히 설정하는 것에 비해
동적 포트 포워딩은 로컬에 대한 포트만 설정하며 점프 호스트(피벗)이 SOCKS 프록시 역할을 합니다.
Proxychains 도구를 사용하면 도구를 사용했을 때 해당 명령의 패킷이
SOCKS 프록시를 통해서 타겟 호스트에 직접 전달됩니다.