FTP란 무엇인가 ?
FTP 란?
FTP란 File Transfer Protocol의 약자로 영어 그대로 서버와 클라이언트 사이에서 TCP/IP를 통해 파일을 송수신하기 위해 고안된 프로토콜입니다.
해당 프로토콜은 오로지 빠른 파일 송수신만을 목적으로 두고 고안되었기 때문에 보안 부분에서는 상당히 취약한 프로토콜입니다. (보안 취약점에 대해서는 여기를 클릭 시면 됩니다.)
나는 한 개가 아니라 두 개야!
FTP는 다른 프로토콜들과 다르게 포트(port) 번호를 기본 두 개를 사용하도록 제작되었습니다.
첫 번째 포트는 포트번호 21번으로 클라이언트와 서버 사이의 명령, 제어 등을 송수신하는 제어 포트입니다.
그리고 두 번째 포트로는 20번으로 클라이언트와 서버 사이의 직접적인 파일 송 수신을 담당하는 데이터 포트입니다.
PI : Protocol Interpreter의 약자 / DTP : Data Transfer Process의 약자
위 그림은 FTP Model입니다.
1. User PI가 Control connection을 통해 명령(command)을 보냅니다.
2. command를 받은 Server PI는 그에 대하여 응답(Reply)을 보내줍니다.
3. 명령을 받은 Server는 Data connection(전 이중 통신입니다.)을 생성하여 User와 연결하며 데이터 송 수신을 진행하고 진행이 완료된 Data connection은 다시 제거합니다.
이러한 동작으로 인하여 21번 포트인 제어 포트는 첫 연결부터 서로 연결이 끊길 때까지 이어져 있고 20번 포트인 데이터 포트는 명령을 받고 그 명령을 수행하기 위해 포트를 연결한 후 수행이 끝나면 연결된 포트를 제거합니다.
나는 모드도 두 개야!
FTP는 기본 설정으로는 Active mode로 설정되어 있습니다.
FTP는 위에서 포트가 두 개를 사용한다는 것을 저희가 알았습니다.
하지만 이러한 타 프로토콜과 다른 이유 때문에 모드도 두 개가 존재합니다.
처음 연결을 시도할 때 21번 포트로 서로 신호를 주어 받고 그 후 데이터 포트를 연결할 때 Active mode는 클라이언트가 서버에게 20번 포트로 연결해달라고 알려주면 서버는 클라이언트의 20번 포트로 연결을 하는 것입니다.
하지만 이러한 동작은 실제로 방화벽으로 인하여 연결이 제대로 이어지지 않는 일이 발생할 때가 있습니다.
그 때문에 존재하는 것이 Passive mode입니다.
Passive mode는 Active mode의 반대로 서버 쪽에서 클라이언트에게 연결할 포트를 알려줍니다
지금까지의 내용을 요약해 보겠습니다.
FTP는 사용하는 포트가 2개 존재합니다.
1. 제어 포트
2. 데이터 포트.
FTP 사용하는 모드가 2개 존재합니다.
1. Active mode : 클라이언트가 서버에게 연결할 데이터 포트를 알려주는 모드
2. Passive mode : 서버가 클라이언트에게 연결할 데이터 포트를 알려주는 모드
나는 솔직해서 문제야...
위에서 언급했듯이 FTP 프로토콜은 보안이 매우 취약합니다.
서버와 클라이언트가 서로 명령이나 데이터를 주고받을 때 암호화 과정 없이 평문을 주고받습니다.
위 그림은 FTP로 서버에 접속하려는 유저 아이디와 패스워드를 서버에 보내어 인증을 받는 장면입니다.
얼핏 보면 인증도 잘 받고 괜찮아 보입니다.
하지만 위 그림처럼 H라는 해커가 중간에서 가로챈다면 암호화가 하나도 되지 않은 계정 아이디와 패스워드를 확인할 수 있습니다.
FTP 전용 계정이라 괜찮다? 절대 아닙니다.
FTP 주목적이 파일 관리이기 때문에 파일을 삭제하거나 중요 데이터를 삭제, 다운로드 등 큰 문제로 이어질 수 있습니다.
다행히도 현재는 이러한 문제를 해결하기 위해 보안 프로토콜 등이 많이 존재합니다.
아래는 RFC2577에 기재되어있는 보안 취약점에 대한 내용입니다.
무차별 대입 공격(Brute Force)
비밀번호 4개 달린 자물쇠를 다들 아십니까? 예전에 저는 이것을 풀기 위해 0000부터 9999 번호까지 쭉 돌려보기도 해 보았습니다. 이 방법이 무차별 대입 공격입니다.
id와 password를 무작위로 대입해서 공격하는 기법입니다.
FTP Bounce Attack
FTP 프로토콜은 목적지를 별로 중요시 생각하지 않습니다.
무슨 뜻이냐 하면 만약 제가 쇼핑몰에서 물건을 구매했을 때 그 물건은 목적지인 저에게 배송되어야 합니다.
이 과정에서 물건을 보내는 사람은 물건을 시킨 사람의 주소와 목적지의 주소가 같은 지 확인 후 택배를 보낼 것입니다.
그 과정은 FTP 프로토콜은 하지 않습니다. 그러한 점을 이용한 공격이라 보시면 되겠습니다.
위에 공격들 말고도 스니핑, 스푸핑 등 공격들이 있습니다.
명령, 제어 신호
FTP 클라이언트에서 명령을 내리면 그에 따라 응답신호를 보내줍니다.
FTP 명령
USER, PASS
처음 클라이언트와 서버가 연결될 때 이 두 개를 통해 username, password를 보내어 인증을 받습니다.
CWD : 작업 디렉터리를 변경합니다.
CDUP : 부모 디렉터리로 위치를 변경합니다.
RMD : 디렉터리 제거
MKD : 디렉터리 생성
명령어는 더 있지만 주로 사용되는 명령어들을 적어 봤습니다.
끝맺음
이번에 toy project로 ftp client를 제작해 볼 겸 조사한 내용들을 적어봤습니다.
잘못된 정보나 부족한 부분을 지적해 주시면 감사하겠습니다.