지금 소개할 방법은 FTP가 control 채널과 data 채널로 나뉘며, data 채널은 양방향으로 접속이 되도록 구현되어 있는데, 이것을 잘 이용하여 방화벽을 우회할 수 있는 기술입니다. 그러나, 여러가지 제약으로 인해 시도하다 좌절할 수 있습니다.
FTP의 Active Mode는 FTP 클라이언트가 포트를 열고 있으면, 서버가 데이터(디렉토리 목록나 파일 내용)를 쏴주는 방법입니다. 예를 들어 "ls" 명령이 어떻게 되는지 알아 보기로 합시다.
자, 여기에서 만약 FTP Client가 NAT가 되는 방화벽 안에 있다면, 방화벽은 조금 스마트하게 동작하여 connection tracking 정보를 만듭니다. 21번 포트에서 왔다갔다하는 것들 중에, PORT 명령 같은 것을 감시하고 있다가, 외부로 전송될때, 실제 주소로 바꿔서 나가는 것이죠. 위의 경우 172.20 이라는 내부 IP를 사용했습니다만, 실제 외부에 있는 저 FTP(200.200.200.200) 서버는 다른 IP를 받게 됩니다. 심지어, PORT도 다르게 할당하는 NAT도 있습니다.
제가 사용한 NAT 장비는 다행히도 PORT는 바뀌지 않아서, 다음을 계속 진행할 수가 있었습니다.
이때, 사용할 명령이 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 장비에서 2560 번 포트로 접속이 가능한 것이지요.
FTP 서버에 ssh로 들어가서
FTP의 Active Mode는 FTP 클라이언트가 포트를 열고 있으면, 서버가 데이터(디렉토리 목록나 파일 내용)를 쏴주는 방법입니다. 예를 들어 "ls" 명령이 어떻게 되는지 알아 보기로 합시다.
ftp> open 200.200.200.200debug 라는 명령으로 프로토콜을 중간에 보이도록 하면, 'ls' 명령을 내렸을 때, PORT, LIST 두 개의 조합으로 이루어지는 것을 볼 수 있습니다. (passive 도 한번 해보세요.) 이 때, PORT 명령을 잘 살펴보면, 앞의 네 개의 숫자는 IP고 뒤의 두 개의 숫자는 port를 256으로 나눈 값과 그 나머지 입니다. 53279번 포트(208*256+31=53279)를 열어 두고 PORT 명령을 전송하면, 서버에서 그 포트에 접속하여 LIST를 쏘아주는 것입니다.
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
자, 여기에서 만약 FTP Client가 NAT가 되는 방화벽 안에 있다면, 방화벽은 조금 스마트하게 동작하여 connection tracking 정보를 만듭니다. 21번 포트에서 왔다갔다하는 것들 중에, PORT 명령 같은 것을 감시하고 있다가, 외부로 전송될때, 실제 주소로 바꿔서 나가는 것이죠. 위의 경우 172.20 이라는 내부 IP를 사용했습니다만, 실제 외부에 있는 저 FTP(200.200.200.200) 서버는 다른 IP를 받게 됩니다. 심지어, PORT도 다르게 할당하는 NAT도 있습니다.
제가 사용한 NAT 장비는 다행히도 PORT는 바뀌지 않아서, 다음을 계속 진행할 수가 있었습니다.
$ more /etc/ssh/sshd_config이런식으로 SSHD의 서비스를 2560번에 하나 더 띄우고 재시작을 시킵니다. 이렇게 하는 이유는 FTP의 데이터 채널은 1024번 이상의 포트에서 접속이 일어나기 때문에 그렇습니다. 자, 2560번 포트에는 SSH 서비스가 대기하고 있는데, FTP 클라이언트로 PORT, LIST 조합에서 PORT만 전송하고 LIST 명령을 내리지 않으면, 누군가 해당 포트로 접속할 수 있는 것 아니겠습니까?
# 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
...
이때, 사용할 명령이 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 장비에서 2560 번 포트로 접속이 가능한 것이지요.
FTP 서버에 ssh로 들어가서
$ w자신의 FTP Client가 돌고 있는 외부 IP를 얻습니다. 그리고, 그 서버에서
5:58pm up 187 days, 10:45, 2 users, load average: 0.35, 0.39, 0.44
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
pynoos pts/1 200.111.111.100 5:58pm 0.00s 0.05s 0.00s w
$ ssh 200.111.111.100 -p 2560으로 접속해 들어오면, 프롬프트가 나오는 것을 보실 수 있을 겁니다. 짜잔! 외부에서 바로 들어 올 수 있다니요...