세션 하이재킹과 TCP Sequence Number
세션 하이재킹이란?
세션은 클라이언트와 서버 두 대의 컴퓨터 간의 활성화된 상태를 말합니다.
이때 세션 하이재킹은 로그인된 상태를 가로채는 것을 말합니다.
TCP 세션 하이재킹은 TCP의 고유한 취약점을 이용하여 정상적인 접속을 빼앗는 방식입니다.
TCP는 클라이언트와 서버 간 통신을 할 때 패킷의 연속성을 보장하기 위해 각각 시퀀스 넘버를 사용합니다.
이 시퀀스 넘버가 잘못되면 이를 바로잡기 위한 작업을 하는데 TCP 세션 하이재킹은 서버와 클라이언트에 각각 잘못된 시퀀스 넘버를 위조하여 연결된 세션에 혼란을 주고 자신이 끼어들어가는 방식입니다.
TCP 패킷
TCP 프로토콜은 신뢰형 프로토콜로 다음과 같은 기능을 제공합니다.
1. 데이터 양을 조절하는 흐름 제어
2. 데이터 유실에 대처하는 오류 제어
3. 네트워크 문제에 따른 혼잡 제어
이러한 기능을 제공하기 위해서 TCP는 3 way Handshaking을 통해 세션을 맺고 통신을 시작합니다.
SYN : 연결 요청하면서 초기에 Sequence Number를 보냄
ACK : 연결이 승인됨을 뜻함
SYN, ACK을 통해 SYN을 통해 데이터를 전송하고, ACK를 통해 해당 데이터가 도착했음을 알려줍니다.
만약 ACK패킷을 받지 못하면 중간에 패킷이 유실되었다고 판단하고 패킷을 다시 보내는 등으로 오류제어를 할 수 있습니다.
이때 수많은 패킷들이 오고가는 상황에 해당 ACK가 어떤 SYN에 대한 응답인지 알기 위한 확인이 필요하고 이를 위해 Sequence Number와 ACK Number를 사용하게 됩니다.
클라이언트- 서버 TCP 통신
조금 더 쉽게 요약하자면 다음과 같습니다
SYN : 요청하는 패킷의 번호
ACK : 요청을 잘 받았고 다음 전송을 받을 패킷
처음에 연결을 수립하기 위해 클라이언트가 서버에게 SYN을 보냅니다.
이때 SYN값은 임의로 세팅됩니다.
서버는 SYN 100 요청을 받고 이 요청을 잘 받았고 다음 패킷으로는 101번을 달라고 ACK 101을 보냅니다.
그리고 서버에서도 연결을 수립하기 위해 클라이언트에게 임의로 세팅된 2000 SYN을 보냅니다.
이후 클라이언트는 SYN 2000을 받고 이 요청을 잘 받았고 다음 패킷으로는 2001번을 달라고 ACK 2001을 보내게 됩니다.
그리고 다음 패킷인 101번 패킷을 전송하기 위해 SYN 201을 서버에게 전송합니다.
Sequence Number를 랜덤 하게 지정하는 이유는?
Sequence Number가 항상 0부터 시작한다면 이를 이용한 보안 문제가 발생할 수 있습니다.
또한 Connection을 맺을 때 사용하는 포트는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용되는데 난수가 아닌 순차적인 number를 전송한다면 서버 측에서는 이전의 connection으로부터 오는 패킷으로 인식할 수 있습니다.
이런 문제가 발생할 가능성을 줄이기 위해 난수로 설정합니다.
출처
https://www.youtube.com/watch?v=Ah4-MWISel8&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=22
https://lactea.kr/entry/Network-%E2%80%93-tcp-%EC%97%B0%EA%B2%B0-%EB%B6%84%EC%84%9D
https://github.com/dreamgonfly/TIL/blob/master/TCP-Sequence-Prediction-Attack.md