Infomation

TCP 세션 하이재킹 (Session Hijacking)

DarkSoul.Story 2014. 1. 27. 07:25
반응형

1) TCP 세션 하이재킹

TCP 세션 하이재킹은 트러스트를 이용한IP 스푸핑에서의 공격 개념과 크게 다르지 않다. 하지만TCP 세션 하이재킹은Client와 서버간의 통신을 관찰할 수 있을 뿐만 아니라 트러스트를 이용한 세션은 물론Telnet, FTP등TCP를 이용하는 세션을 갈취가 가능하다.

 

2) TCP 세션 하이재킹 공격 환경

TCP 세션 하이재킹 공격 환경을 알기 위해서는  TCP 3 – Way Handshaking에서 정상적인TCP Sequence Number의 교환과Established상태에 대해 알아야 한다. 먼저 다음 표를 잘 기억해 둔다.


 명     칭

설     명  

 Client_My_Seq

 클라이언트가 관리하는 자신의 Sequence Number

 Client_Server_Seq

 클라이언트가 알고 있는 서버의 Sequence Number

 Server_My_Seq

 서버가 관리하는 자신의 Sequence Number

 Server_Client_Seq

 서버가 알고 있는 클라이언트의 Sequence Number

 Data_Len

 데이터의 길이


정상적인 접속이 유지되기 위해서는 서버와 클라이언트가 서로의 Sequence Number를 올바르게 알고 있어야 한다. 이러한 생태를  동기화 상태라고 한다.

 

서버와 클라이언트가 동기화된 Sequence Number를 가지려면 다음과 같은 과정을 거친다.            

 


 


① 연결하기 전 클라이언트의 포트는Closed 상태며, 서버는 서비스를 제공하기를 기다리고 있으므로Listen 상태이다.


② 클라이언트는32비트의 숫자 중 임의의 숫자(Client_My_Seq)를 생성하여 서버에게 SYN 패킷을 보내며, 서버는 클라이언트가 보낸Client_My_Seq 값을 읽어Server_Client_Seq 값으로 저장한다. 이때 클라이언트는SYN_Sent 상태가 된다.


③ 서버는Server_My_Seq 값을 생성하고, Server_Client_Seq에 패킷의 길이만큼 뎌해서 클라이언트로 보낸다. (그러나 여기서 데이터는0이므로+1이라고만 표시한다.) 서버는SYN_Received 상태가 되며, 클라이언트는Server_Client_Seq +1을 받아 자신의Client_My_Seq와 비교하고 일치하면Server_My_Seq 값을Client_Server_Seq값으로 저장한다.


④ 클라이언트는Client_Server_Seq +1을 서버에게 보내고Established 상태가 되며, 서버 역시 클라이언트가 보낸Client_Server_Seq +1과 자신의Server_My_Seq과 비교하여 일치하면 Established 상태가 된다.


이렇게 정상적인 동기화 상태가 되면 다음과 같은 상태가 된다.

        

- Client_My_Seq = Server_Client_Seq

- Server_My_Seq = Client_Server_Seq

 

TCP 세션 하이재킹은 위의 상태를 무너뜨리는 것에서 시작한다. TCP 세션 하이재킹은 먼저 서버와 클라이언트가 각자아는 Sequence Number를 조작해서 속인 뒤 다음과 같은 상황을 만든다.

 

[클라이언트 측]

Client_My_Seq = 공격자가 생성한Server_Client_Seq

Client_Server_Seq = 공격자가 생성한Server_My_Seq

 

[서버 측]

Server_Client_Aeq = 공격자가 생성한Client_My_Seq

Server_My_Seq = 공격자가 생성한Client_Server_Seq

 

3) TCP 세션 하이재킹 공격 방법

- 공격자가 생성한 패킷에는A붙여 구분 한다.

     

TCP 세션 하이재킹 공격은 다음과 같다.



 


    

① 클라이언트는 서버와 접속되어 있는 상태로 모두Established 상태며, 공격자는 적절한 Sequence Number 획득하기 위해 스니핑을 하고 있다.


② 공격자는 공격하려는 시점에서 세션이 완전히 끊기지 않는 Sequence Number의 범위에서RST 패킷을 생성하여 서버에게 보낸다. 서버는 잠시Closed상태가 된다. 그러나 클라이언트는 Established 상태이다.


③ 공격자는A_Client_My_Seq를 생성하여 서버로 보낸다.


④ 서버는 새로운A_Client_My_Seq를 받아들이고, Server_My_Seq를 재 생성하여 공격자에게 보낸 후SYN_Received 상태가 된다.


⑤ 공격자는 정상적인 연결처럼 서버와 Sequence Number를 교환하고, 공격자와 서버 모두 Established 상태가 된다. 원래의 클라이언트도 이 단계까지도 Established 상태이며, 서버가 네트워크 문제로 인한 잠시 동안의 연결 문제처럼 받아들이며, 연결은 끊어졌지만 인증 세션은 열려 있는 상태이다.


⑥ 격자는 공격 전 클라이언트가 서버와 통신을 하던 Sequence Number를 모두 알고 있는 상태므로 클라이언트와 정상적으로 통신을 하며, 서버와는 공격자가 새로 생성한 Sequence Number를 가지고 통신을 한다.

 

※ 공격자가 서버와 연결을 끊고 다시 연결을 시도하는 동안 클라이언트?

- 공격자가 서버와 연결을 끊고 다시 연결을 시도하는 동안 클라이언트는 정상적인 패킷을 서버로 보낸다. 하지만 서버는 정상적이지 않은Sequence Number로 인식하여, ACK 패킷에Server_My_Seq와Server_Client_Seq를 담아 보낸다. 이 작업은Sequence Number를 맞추기 위한 작업이다. 그러나 클라이언트 역시 서버가 보낸Server_Client_Seq가 자신의Client_My_Seq과다르다는 것을 확인하고, 서버에게Client_My_Seq와Client_Server_Seq가 담긴ACK패킷을 보낸다. 이러한 과정이 무한히 반복되는 경우가 있는데, 이를 ‘ACK Storm”이라고 한다.

 

※ 공격자가 서버가 아닌 클라이언트측에 연결을 끊었다 다시 연결하면 공격이 성공할까?

- 이 공격방법은 성공할 수 없는 공격이다. 그 이유는 우선 서버는 포트 번호가 일정하여 연결의 재 설정이 쉬우나 클라이언트는 랜덤 하게 포트 번호가 설정되기 때문에 연결의 재 설정이 어렵다. 또한, 클라이언트에는 인증 세션이 존재 하지 않기 때문에 사실상 아무 의미가 없는 공격이다.

 

4) 보안 대책

- 패킷의 유실 및 재 전송 증가를 탐지한다. 공격자가 중간에 끼어서 작동하므로 패킷의 유실과 재 전송이 발생하여 서버와의 응답 시간이 길어진다.


- 네트워크 트래픽을 감시하여ACK Storm을 탐지한다. 위에서 말했듯이 클라이언트와 서버는 정확한 Sequence Number를 맞추기 위해 서로ACK패킷을보내는 과정에서 무한 루프에 걸리게 된다. 결국ACK패킷의 비율이 급격하게 증가 한다.


- 데이터 전송할 때 암호화 방식을 사용한다. 데이터 전송의 암호화는 스니핑에 대한 대응책이 되기도 한다. 데이터 전송할 때 암호화를 하면 Sequence Number를 추측하기 어렵게 된다.


- 지속적인 인증(Continuous Authentication)을 한다. 지속적인 인증이란 대부분의 시스템이 로그인 시 패스워드를 한 번 입력하고 난 뒤에 다시 재 인증을 거치는 과정을 거치지 않는데, 어떤 특정한 행동을 하거나 일정 시간이 되면 다시 패스워드 등을 물어 접속자가 정당한 인증을 받은 유요한사용자 인지 확인하는 것이다. 

반응형