티스토리 뷰
지금 소개할 방법은 FTP가 control 채널과 data 채널로 나뉘며, data 채널은 양방향으로 접속이 되도록 구현되어 있는데, 이것을 잘 이용하여 방화벽을 우회할 수 있는 기술입니다. 제목은 SSH서버라고 했지만, 모든 TCP 서버가 다 가능합니다.....만, 여러가지 제약으로 인해 시도하다 좌절할 수도 있습니다.
FTP의 Active Mode는 FTP 클라이언트가 포트를 열고 있으면, 서버가 데이터(디렉토리 목록나 파일 내용)를 쏴주는 방법입니다. 예를 들어 서버 200.200.200.200에서 운영중인 ftp 서비스에 접속하여 "ls" 명령을 내렸을 때 어떻게 되는지 알아 보기로 합시다.
ftp> open 200.200.200.200
Connected to200.200.200.200.
220 FTP Server Ready ..
Name (200.200.200.200:pynoos):
Password:
230 User pynoos logged in
ftp> debug
Debugging on (debug=1).
ftp> ls
---> PORT 172,20,114,164,208,31
200 PORT command successful
---> LIST
150 Opening ASCII mode data connection for file list
-rw-rw-r-- 1 pynoos pynoos 1202 Jul 2 16:43 a
-rwxr-xr-x 1 pynoos pynoos 62 Dec 16 2008 ac.sh
-rw-rw-r-- 1 pynoos pynoos 69386 Dec 16 2008 a.tar.gz
-rwxr-xr-x 1 pynoos pynoos 589463 Aug 10 19:31 s
-rw-r--r-- 1 pynoos pynoos 1630 Aug 10 19:30 s.c
-rw-r--r-- 1 pynoos pynoos 2672 Dec 17 2008 sendmail.c
226 Transfer complete
debug 라는 명령으로 프로토콜을 중간에 보이도록 하면, 'ls' 명령을 내렸을 때, PORT, LIST 두 개의 조합으로 이루어지는 것을 볼 수 있습니다. (passive 도 한번 해보세요.) 이 때, PORT 명령을 잘 살펴보면, 앞의 네 개의 숫자(172,20,114,164)는 IP고 뒤의 두 개의 숫자는 port를 256으로 나눈 값과 그 나머지 입니다. 즉, 클라이언트는 53279번 포트(208*256+31=53279)를 열어 두고 PORT 명령을 전송합니다. 그러면, LIST 명령을 받는 즉시 서버에서 거꾸로 그 포트에 접속하여 LIST의 결과에 해당하는 데이터를 전송해 주는 것입니다.
방화벽 안에 있는 서버에, 내부 도움없이 접근하는 것은 어렵습니다. 해킹이니까요.
위 예처럼 만약 FTP Client가 NAT가 되는 방화벽 안에 있고, 외부에 있는 FTP 서버에 접속한다고 가정하면, 방화벽은 조금 스마트하게 동작하여 connection tracking 을 합니다. 방화벽은 FTP Control Channel인 21번 포트를 특별하게 감시합니다. 그 중 내부 Client에 의해 PORT 명령이 외부로 전송될 때, 명령에 실려있는 내부 IP 주소를 방화벽 외부 주소로 바꿔서 나가는 것이죠. 위의 경우 172.20 이라는 내부 IP를 사용했습니다만, 외부에 있는 저 FTP(200.200.200.200) 서버는 다른 IP를 받게 됩니다. 만약 방화벽 외부 주소가 200.111.111.100이라면, 위 예에서의 명령을 "PORT 200,111,111,100,208,31" 과 같이 바꾸는 것이죠. 심지어, 맨 뒤의 208,31 이라는 포트도 바꾸는 NAT도 있습니다.
제가 사용한 NAT 장비는 다행히도 PORT는 바뀌지 않아서, 다음을 계속 진행할 수가 있었습니다.
$ more /etc/ssh/sshd_config
# Package generated configuration file
# What ports, IPs and protocols we listen for
Port 2560
Port 22
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::
#ListenAddress 0.0.0.0
Protocol 2
...
이런식으로 SSHD의 서비스를 2560번에 하나 더 띄우고 재시작을 시킵니다. 임의의 포트 번호를 추가했는데, 이렇게 하는 이유는 FTP의 데이터 채널은 1024번 이상의 포트에서만 접속이 일어나기 때문에 그렇습니다. 자, 이렇게 sshd를 재시작하면 22, 2560번 포트에 SSH 서비스가 대기하고 있고, FTP 클라이언트로 PORT, LIST 조합에서 PORT만 전송하고 LIST 명령을 내리지 않으면, 누군가 해당 포트로 접속할 수 있는 것 아니겠습니까?
이때, 사용할 명령이 FTP 클라이언트의 quote 명령입니다.
ftp> quote PORT 172,20,114,164,10,0
---> PORT 172,20,114,164,10,0
200 PORT command successful
quote 명령은 뒤에 따라오는 것들을 그대로 전송하라는 얘기입니다. 위의 예는 "10*256+0번 포트로 나는 대기중이야, 다음 접속은 그쪽으로 해"라는 뜻입니다. 이때, 이 명령을 감시하고 있는 방화벽의 NAT 모듈은 2560 번으로 누군가 들어오면, 내부 IP 172.20.114.164 번으로 바로 접속할 수 있도록 임시로 개방이 되는 것입니다. 단, 조건은 control 채널에 해당하는 IP에서만 들어올 수 있습니다. 지금까지 하면, 현재 ftp 서버인 200.200.200.200 장비에서 방화벽 안의 FTP Client가 있는 서버의 2560 번 포트로 접속이 가능한 것이지요.
FTP 서버에 ssh로 들어가서 자신의 방화벽의 외부 IP에 해당하는 IP로 -p로 port를 지정하여
$ ssh 200.111.111.100 -p 2560
으로 접속해 들어오면, 프롬프트가 나오는 것을 보실 수 있을 겁니다. 짜잔! 외부에서 바로 들어 올 수 있다니요...
- Total
- Today
- Yesterday
- ssh
- 수선화
- 구근
- 디버깅
- writely
- 대화
- MySQL
- url
- JavaScript
- OpenID
- 커피
- 오픈소스
- 클레로덴드럼
- perl
- 덴드롱
- Tattertools plugin
- VIM
- Subversion
- 벤자민
- BlogAPI
- 식물
- Linux
- 킹벤자민
- tattertools
- 퀴즈
- SVN
- nodejs
- SSO
- TCP/IP
- macosx
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |