Hacking/Network

SSH Dynamic Port Forwarding with SOCKS

rootable 2017. 3. 10. 11:52
반응형

1. 복습


1.1 SSH 터널링이란?

 - SSH 프로토콜을 이용하여 직접 접속할 수 없는 곳과 연결통로(터널)을 만들어 접근할 수 있도록 만드는 기술


1.2 옵션

 - 총 3가지 옵션이 존재한다. (L, R, D)

 - L = Local = 클라이언트측에서 지정한 포트를 listening하다가 연결이 요청되면 미리 설정된 원격지의 해당 포트로 데이터를 전송하는 옵션

 - R = Remote = 서버측에서 지정한 포트를 listening하도록 만들고, 해당 포트로 연결이 요청되면 클라이언트측의 지정한 포트로 데이터를 전송하는 옵션



2. SSH Dynamic Portforwarding


2.1 D옵션

 - D = Dynamic = 클라이언트측에서 지정한 포트를 listening하다가 연결이 요청되면 미리 설정된 원격지로 데이터를 전송하는 옵션


2.2 L,R 옵션과의 차이

 - L,R 옵션 : 하나의 포트와의 연결(1;1 매핑)

 - D 옵션 : 여러 포트와의 연결(1:n 매핑) => 지정한 포트로 접속하면 원격지에 내 PC가 존재한다고 생각할 수 있다.


2.3 명령어

[Linux 환경]

ssh -D [리스닝할 port] [계정]@[포워딩할 목적지 ip] [-p 목적지 ssh 포트]


- (ex) ssh -D 1111 root@10.10.10.10 -p 7899

- 만약 목적지의 ssh 포트가 default인 22번이라면 적지 않아도 된다.


[Windows 환경]

plink -D [리스닝할 port] [포워딩할 목적지 ip] [-P 포트] -l 계정 -pw 패스워드


- (ex) plink -D 1111 10.10.10.10 -P 7899 -l root -pw 1234

- 만약 목적지의 ssh 포트가 default인 22번이라면 적지 않아도 된다.


3. 실습


가정 : Web 서버에 웹쉘이 업로드 되어 있는 상태이다. 라우터와 첫번째 DB의 SSH 계정 정보를 알고 있을 때 방화벽을 넘어 두번째 DB에 접속하여라.


3.1 해결방법 1 = WEB Server에서 -D 옵션 사용

 - WEB server -> plink -D 3333 2.2.2.2 -P 22 -l test -pw test

(이 명령어를 작성할 경우 WEB server에 3333 포트로 연결이 요청되면 2.2.2.2의 22번으로 접속을 하여 공격자가 2.2.2.2에 위치한다고 볼 수 있다. 첫 번째 DB와 두 번쨰 DB는 서로 연결이 되는 상태이므로 Web Server의 3333포트로만 요청이 가면 목적지까지 도달이 가능한 것이다.)


 - WEB server -> plink -R 1111:localhost:3333 111.222.333.444 -P 1234 -l admin -pw admin

( 이 명령어를 작성할 경우 Router의 1111포트로 연결이 요청되면 WEB server의 3333포트로 요청을 넘겨준다. 위의 명령어로 인해 목적지까지 도달할 수 있다.)


- 공격자 PC -> plink -L 2222:localhost:1111 111.222.333.444 -P 1234 -l admin -pw admin

( 이 명령어를 작성할 경우 공격자 PC에서 2222포트로 연결을 요청하면 Router의 1111포트로 요청을 넘겨준다. )


- 공격자 PC -> localhost:2222 

( 이 명령어를 작성하면 Router의 1111포트로 넘어가고 이는 WEB server의 3333포트로 넘어가서 결과적으로 목적 DB까지 접속이 가능하다. )


3.2 해결방법 2 = Router에서 -D 옵션 사용

 - Web server -> plink -R 3333:2.2.2.2:22 111.222.333.444 -P 1234 -l admin -pw admin

(이 명령어를 작성하면 라우터의 3333포트로 연결이 요청되면 그 요청을 첫번째 DB로 넘겨준다.


 - Router -> plink -D 2222 localhost -P 3333 -l admin -pw admin

(이 명령어를 작성하면 라우터의 2222 포트로 연결이 요청되면 그 요청을 자신의 3333 포트로 넘겨준다. 위의 명령어로 인해 요청이 자연스럽게 첫번째 DB까지 하게되고 결과적으로 목적 DB까지 접속이 가능하다)


 - 공격자 PC -> plink -L 1111:localhost:2222 111.222.333.444 -P 1234 -l admin -pw admin

(이 명령어를 작성하면 공격자 PC에서 1111 포트로 연결이 요청되면 router의 2222포트로 연결을 넘겨준다.)


- 공격자 PC -> localhost:1111

( 이 명령어를 작성하면 위의 흐름대로 진행되어 목적 DB까지 접속이 가능하다)


3.3 해결방법 2가 가능한 이유

Q> 첫번째 DB가 내 것처럼 되야지 두번째 DB로 접속이 가능할텐데 해결방법 2처럼 진행하면 WEB 서버가 내 것처럼 되는 것 아닐까?

A> 결과부터 말씀드리면 아닙니다. D 옵션을 사용할 경우 터널링 흐름의 끝이 자기 자신처럼 동작하는 것입니다. 위의 흐름에서 터널링의 끝은 첫번째 DB이므로 공격자가 첫번째 DB에 있다고 볼 수 있게 되어 두번째 DB에 접속이 가능한 것입니다.













반응형