본문 바로가기

Network Hacking

16~19일차] TCP 통신 raw_socket으로 직접 구현 및 테스트

# 위의 통신내용은 echo이다. 단순하게 클라이언트가 문자열(hello)을 보내면 그 문자열(hello)을 서버가 되돌려주는 통신내용이다.

# 위의 사진은 sniffer을 통해 TCP 통신과정을 캡쳐한 것이다. sequence와 ack를 잘 보자.  바로 밑 그림은 flag가 나타내는 것이다.

# 플래그의 각각의 뜻은 https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EC%A0%9C%EC%96%B4_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C 위키 백과를 참조하면 쉽게 이해할 수 있다.

 

TCP 통신과정을 큰그림으로 본다면 다음과 같다.

1). 여기서 SEQ는 ISN(초기 시퀀스 넘버)라고하며 최초 서버에 의해 랜덤으로 설정된다. 1~42억 사이의 수가 설정되기 때문에 보안에 유용하다. 랜덤하게 설정된 seq와 flag는 동기화 시퀀스 번호가 셋되었다. 양쪽이 보낸 최초의 패킷에만 이 플래그가 설정되어야 한다.

 

2). 서버 측에서 응답을 하는데 client가 보낸 seq에 +1을 해서 ack답장에 응하며, 서버측도 마찬가지로 ISN이 랜덤하게 생성되어 나간다.

마찬가지로 동기화 시퀀스가 셋되며 Acknowledgment필드의 유요함을 나타내는 ACK플래그도 셋된다.

 

3). 서버의 응답을 받은 Client는 서버의 seq+1을 하여 응답을 한다. 여기까지가 3way hand shake로 통신준비를 다 끝 마친 것이다.

 

4). 클라이언트가 다시 데이터(hello)를 보내기위해 PSH flag를 set하여 보내는데 이때 PSH가 set되는 이유는 통신을 할때 일정 버퍼가 채워지면 데이터를 보내는데 여기서는 소량의 데이터를 보내기 때문에 바로 push를 해주기 위해서 이다.

 

5). 데이터를 받은 서버는 받은 seq에 데이터의 바이트 수만큼을 더해서 ack를 보낸다.  

 

6). 서버는 받은 문자열을 돌려주기위해 psh를 set하여 받은 데이터를 돌려준다.

 

7). 받은 클라이언트도 마찬가지로 받은 문자의 데이터만큼을 더해 ack를 한다.

 

8). 다음으로 서버가 FIN을 set하여 연결 종료를 요청한다.

 

9). 클라이언트가 알았다고하며 seq+1을하여 ack를 보낸다.

 

10). 서버가 확인하고 seq+1을하여 ack를 또보낸다.  4way hand shake 완료.

 


그럼 위와같은 TCP 통신을 connect 모듈을 이용하지 않고 직접 raw_packet으로 전달해보자.

 

1). 동기화보내기. syn

 

# 결과이다. 서버입장에서는 응답을 보냈는데 클라이언트 쪽에서 3way handshake를 위한 응답이 오지 않자 계속해서 ack를 보내는 것을 확인 할 수 있다. 그럼 서버에서 보낸 ISN(초기 시퀀스 넘버)를 받아와서 ACK를 넘겨줘보자.

 

1). ack보내기. ack

 

 

# 결과. 서버에서 보내는 seq값을 받아 +1을 해서 ack로 돌려주니 서버측에서 client의 seq+1을 ack로 돌려줌으로서 establish상태과 완료되었다. 즉, 3way hand shake 까지는 완료.