소켓
소켓이란?
네트워크 상에서 클라이언트 프로그램과 서버 프로그램간 양방향 통신 엔드 포인트.
프로세스가 데이터를 보내거나 받기 위해 반드시 소켓을 열어서 소켓에 데이터를
작성하거나 소켓으로부터 데이터를 읽어야한다.
TCP/IP Socket 통신
클라이언트 프로그램과 서버 프로그램은 각각 포트를 통해 통신해야 한다.
Server Socket : 서버 프로그램에서 사용하는 소켓으로, 클라이언트로부터 연결 요청을 기다렸다가 요청 발생 시
클라이언트와 연결을 맺거나 혹은 또 다른 소켓을 만드는 일을 한다.
Client Socket : 요청 대기가 필요 없으며, 바로 소켓을 생성하고 서버 프로그램에 연결 요청 및 데이터를 전송한다.
HTTP 통신
Client의 요청(Request)이 있을 때만 서버가 응답(Response)하여 해당 정보를 전송하고 곧바로 연결을
종료하는 방식
- Client가 요청을 보내는 경우에만 Server가 응답하는 단방향 통신
- Server로부터 응답을 받은 후에는 연결이 바로 종료
- 실시간 연결이 아니라 필요한 경우에만 Server로 요청을 보내는 상황에 유용
- 요청을 보내 Server의 응답을 기다리는 어플리케이션 개발에 주로 사용
Socket 통신
Server와 Client가 특정 port를 통해 실시간으로 양방향 통신을 하는 방식
- Server와 Client가 계속 연결을 유지하는 양방향 통신
- Server와 Client가 실시간으로 데이터를 주고받는 상황이 필요한 경우에 사용
- 실시간 동영상 Streaming이나 온라인 게임 등과 같은 경우에 자주 사용
Socket 통신 흐름
1. Client Socket 프로그래밍
① socket( ) 소켓 통신을 위한 소켓 생성
- 생성시 소켓의 종류를 지정할 수 있는데, TCP 통신을 위해서는 스트림(Stream) 타입의 소켓을 사용
② connect( ) ip와 port 번호로 식별되는 대상(Target)으로 연결 요청을 전송.
③ send /recv( ) 연결된 소켓을 통해 데이터를 보낼 때는 send( ), 데이터를 받을 때는 recv( )를 사용한다.
④ close( ) 더 이상 데이터 송수신이 필요없게되면, 소켓을 닫기 위해 close( )를 호출한다. close( )에 의해 닫힌 소켓은 더 이상 유효한 소켓이 아니며, 해당 소켓을 사용하여 데이터를 송수신 할 수 없다.
2. Server Socket 프로그래밍
① socket( ) 서버 소켓을 사용하기 위해 소켓 생성
② bind( ) ip와 port 번호를 설정
- 서버 소켓은 고정된 포트번호를 사용하는데, 운영체제가 특정 포트 번호를 서버 소켓이 사용하도록 만들기 위해
소켓과 포트번호를 결합할 때 사용하는 API. 이를 소켓 바인드 또는 소켓 바인딩이라고 한다.
③ listen( ) 함수로 클라이언트의 접근 요청에 수신 대기열을 만들어 몇 개의 클라이언트를 대기 시킬지 결정하고 클라이언트에 의한 연결 요청이 수신될 때까지 기다림
④ accept( ) 연결 요청을 받아들여 소켓 간의 실질적인 연결 수립.
⑤ send( ) / recv( ) 클라이언트 소켓 처리 과정과 동일
⑥ close( ) 클라이언트 소켓과 마찬가지로 소켓을 닫기 위해 호출.
소켓 종류
스트림 : 프로토콜을 기반으로 하는 소켓 형식
- 양방향으로 바이트 스트림을 전송할 수 있는 연결 지향형 소켓으로 양쪽 어플리케이션이 모두 데이터를 주고 받을 수 있음
- 송신된 순서에 따라 중복되지 않게 데이터를 수신 →각 메시지를 보내기 위해 별도의 연결을 맺기 때문에 오버헤드 발생
- 오류 수정, 전송 처리, 흐름 제어 등을 보장
- 대량의 데이터 전송에 적합
데이터그램 : UDP 프로토콜을 기반으로 하는 소켓 형식
- 명시적으로 연결을 맺지 않은 상태로 데이터를 주고 받는 비연결형 소켓
- 스트림 소켓이 신뢰성 높은 방법이지만 연결 수립 시 오버헤드가 발생하기 때문에 빠르기가 중요한 소량의 데이터 전송 시 연결이나 해체 과정이 없어 속도가 빠른 데이터그램 소켓 사용
- 데이터 크기에 제한, 확실한 전달이 보장되지 않음, 데이터가 손실되어도 오류가 발생하지 않음
- 실시간 멀티미디어 정보를 처리하기 위해 주로 사용 (ex) 전화 등
FTP
FTP란?
File Transfer Protocol의 약자로, 표준 파일 전송 프로토콜이다. 사용자의 시스템과 원격 시스템 간에 파일을 송수신할 때 사용하는 인터넷 통신규약이다. 인터넷에서 파일 송수신만을 위해 고안된 프로토콜이기 때문에 동작 방식이 단순하며 직관적이다.
FTP 동작원리
FTP 통신은 서비스를 제공하는 서버와 여기에 접속하는 클라이언트 사이에 두 개의 연결이 생성되는데 하나는 데이터 전송을 제어하기 위한 신호를 주고 받기 위한 것이고 다른 하나는 실제 데이터(파일)전송에 사용된다.
제어 연결(Control Connection)
- 클라이언트에서 서버로의 명령과 서버의 응답을 위한 연결. 전체 FTP 세션동안 연결상태를 유지한다.
- 21번 포트를 사용하여 명령 또는 응답 형태의 제어 정보를 전송한다.
데이터 연결(Data Connection)
- 파일이 전송될 때 생성되는 데이터를 연결한다.
- 20번 혹은 1024 이후 포트를 사용하며 각각의 파일 전송이 완료되면 폐쇄한다.
FTP 접속 방식
FTP 서비스는 기본적으로 Active 모드와 Passive 모드의 두 가지 데이터 접속 방식이 있다.
1. Active mode
① 클라이언트가 서버의 command(21번) 포트로 접속 후 제어 채널을 생성하고 클라이언트가 사용할 두 번째 포트를 서버에 알려준다.
② 서버는 이에 ACK로 응답한다.
③ 서버는 data(20번) 포트를 사용하여 클라이언트가 알려준 두 번째 포트로 접속 후 데이터 채널을 생성한다.
④ 마지막으로 클라이언트가 ACK로 응답한다.
(ACK 신호 : 수신 측에서 메시지를 에러 없이 정상적으로 수신했거나, 송신해도 된다는 것을 송신 측에 알리기 위한 제어용 신호)
Active Mode 작동 방식
제어 채널 : 클라이언트 -> 서버 21번 포트
데이터 채널 : 서버 20번 포트 -> 클라이언트
Active Mode 문제점
- TCP/IP 의 특징인 클라이언트가 서버에 접속을 시도하는 것이 아니라 서버가 클라이언트에 접속을 시도한다는 점에서 문제가 발생한다.
- 클라이언트 PC의 내부적인 환경요인( 방화벽 )으로 접속을 허용하지 않는다면 데이터 채널 연결이 불가능하다.
- 외부적인 환경요인( FTP를 제대로 인지하지 못하는 공유기 ) 때문에 FTP 접속이 제대로 되지 않거나, 접속 후 데이터 목록을 받아오지 못하는 에러가 발생할 수 있다.
2. Passive Mode
① 클라이언트가 서버의 command(21번) 포트로 접속 후 제어 채널을 생성한다.
② 서버에서는 서버가 사용할 두 번째 포트(1024 이상의 포트)를 알려준다.
③ 클라이언트는 다른 포트를 열어 서버가 알려준 이 포트로 접속을 시도하여 데이터 채널을 생성한다.
④ 서버는 ACK로 응답한다.
(Passive 모드에서는 두 번째 data 포트로 active 모드가 사용했던 20번을 사용하지 않고, 1024 이후의 임의의 비 특권 포트를 사용한다.)
Passive Mode 작동 방식
제어 채널 : 클라이언트 -> 서버 21번 포트
데이터 채널 : 클라이언트 -> 서버 임의의 포트
Passive Mode 문제점
data 포트( 20번 )를 사용하지 않고 동적 포트( 1024번 이후 )를 랜덤으로 사용하기 때문에 이를 사용하면 Active모드의 문제점은 해결이 되지만 서버의 동적 포트를 전부 열어두어야 하는 보안상의 문제가 있다.
*Active, Passive Mode 정리
FTP 접속 방식에는 Active / Passive Mode가 있으며, 보통 Default는 Active Mode이다.
데이터 채널은 Active의 경우 서버가, Passive인 경우 클라이언트가 요청한다는 점에서 차이가 있다.
Anonymous(익명) FTP
1) 개념
서버에 계정이 없는 사용자가 서버 지원에 한정된 접근을 할 수 있는 권한을 제공한다. 이는 주로 기술 지원이나 고객 지원, 파일 배포 등을 할 때 사용한다.
2) 취약점
익명사용자가 보안절차를 걸치지 않고 서버에 접속할 수 있고, 쓰기 권한이 있을 경우 악성코드 생성이 가능하다.
3) 익명 FTP 보안 대책
- 사용자에 대한 최소한의 정보만 유지하여 유출을 방지하고 정기적으로 로그 파일을 분석함으로써 불필요한 접근이나 명령어의 시도가 있었는지 감시한다.
- 호스트에서 제공할 서비스와 사용할 계정을 고려하여 불필요한 계정을 만들지 않고 반드시 사용하지 않아도 되는 경우 서비스를 제거한다.
- 최소한의 서비스를 위한 권한만 사용자에게 제공하고 핵심 디렉터리의 권한을 설정하여 익명 사용자는 접근하지 못하도록 한다.
FTP 보안
FTP Bounce Attack
1) 개념
FTP 구조의 허점을 이용한 공격 방법으로, FTP 서버가 데이터를 전송할 때 목적지를 검사하지 않는다는 점을 이용한 공격.
FTP 클라이언트가 실행되는 호스트가 아닌 다른 호스트를 지정하더라도 서버는 지정된 곳으로 정보를
보내게 되는 FTP 프로토콜의 설계 상에서 발생한 문제이다.
2) 공격의 예시
- 포트 스캐닝
클라이언트가 자료 전송을 요청 할 때, 포트 연결에 대한 성공/실패 메시지가 출력되는데 이러한 메시지를 포트 스캐닝 스크립트에 이용할 수 있다.
- Fake mail
메일의 정보를 가지고 있는 헤더 부분을 FTP 바운스 공격을 이용하여 정보가 허위로 입력된 거짓 메일를 만들어 보낼 수 있다.
- 방화벽을 넘어 접근
방화벽의 내부에 익명으로 외부에서 접근이 가능한 FTP 서버가 있다면 FTP 서버는 방화벽의 내부에 존재하기 때문에 방화벽의 Packet Filtering을 완전히 무시하고 여러 가지 작업을 수행할 수 있다.
3) 공격 대응책
FTP 서버에 접속 가능한 IP주소를 필터링하고 익명 사용자는 파일 업로드를 하지 못하도록 제한한다. 클라이언트와 다른 호스트로 접속하지 않도록 설정하고 FTP 외의 다른 서비스들이 20번 포트로부터는 접속을 받아들이지 않도록 설정한다.
*보안 대책
- Root 접속 차단
- Anonymouse FTP 서버의 경우, 디렉터리 소유자와 퍼미션 관리, 로그 확인
- 불필요한 TFTP는 제거
- FTP 자체의 취약점은 없는지 주기적으로 업데이트
- Passive 모드 사용 설정
- 최대, 최소 포트번호 설정 및 로그인 제한 설정
- Vsftp 인증 절차 사용 (표준 로그 파일보다 상세한 자체 로그 파일 형식을 지원)
- Chroot를 활용하여 접속 계정의 홈 디렉토리의 상위로 이동이 불가능하게 만든다.
'파이썬 IT 해킹, 보안' 카테고리의 다른 글
포트 스캐너 개발 (0) | 2020.10.04 |
---|---|
백도어 개발 (0) | 2020.09.27 |
FTTP 프로토콜 (0) | 2020.09.20 |