지금 소개할 방법은 FTP가 control 채널과 data 채널로 나뉘며, data 채널은 양방향으로 접속이 되도록 구현되어 있는데, 이것을 잘 이용하여 방화벽을 우회할 수 있는 기술입니다. 그러나, 여러가지 제약으로 인해 시도하다 좌절할 수 있습니다.

FTP의 Active Mode는 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 명령을 잘 살펴보면, 앞의 네 개의 숫자는 IP고 뒤의 두 개의 숫자는 port를 256으로 나눈 값과 그 나머지 입니다. 53279번 포트(208*256+31=53279)를 열어 두고 PORT 명령을 전송하면, 서버에서 그 포트에 접속하여 LIST를 쏘아주는 것입니다.

자, 여기에서 만약 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

# 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번 이상의 포트에서 접속이 일어나기 때문에 그렇습니다. 자, 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 장비에서 2560 번 포트로 접속이 가능한 것이지요.

FTP 서버에 ssh로 들어가서
$ w
  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
자신의 FTP Client가 돌고 있는 외부 IP를 얻습니다. 그리고, 그 서버에서
$ ssh 200.111.111.100 -p 2560
으로 접속해 들어오면, 프롬프트가 나오는 것을 보실 수 있을 겁니다. 짜잔! 외부에서 바로 들어 올 수 있다니요...

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. newschool 2009.09.01 11:37 신고

    오늘도 무단으로 지식 복사해갑니다.
    마스터 짱

  2. 건더기 2009.09.05 13:26 신고

    후훗. 잘 지내시죠~?

    최근들어 V3가 이뻐보이는데 메인 OS가 윈7이라 미쳐버리겠습니다 ;;;
    일단인 미국판 V3 IS 8.0으로 버티고 있는데, V3 365는 언제쯤 윈도우 7 지원하나요??
    IS 8.0은 미국 서버에서 업데이트를 받아와서 업데이트가 속터지고, ASD가 없어서 좌절입니다... ㅠㅠ

    안티바이러스쪽은 아니시지만 그래도 직장이시니 혹시나 아시면 답변 쫌?? @.@

+ Recent posts