세션 하이재킹 (Session Hijacking)
2010. 10. 19. 11:42ㆍ카테고리 없음
- 세션 가로채기로써, 세션은 '사용자와 컴퓨터, 또는 두 컴퓨터간의 활성화 상태'를 말한다.
- 쉽게 말해 두 컴퓨터간의 연결이 활성화 되면 그 활성화된 상태를 공격자가 가로채어 모든 작업을 감시하거나
제어할 수 있게 된다.
<정상적인 TCP 세션의 성립 과정>
1. 연결이 되기전 클라이언트의 포트는 Closed 상태이며, 서버는 서비스를 제공하려고 기다리고 있으므로 Listen 상태이다.
2. 클라이언트는 32비트 숫자중 임의의 숫자 (Client_MY_Seq)를 생성하여 서버에 SYN 패킷을 보낸다.
서버는 클라이언트가 보낸 Client_MY_Seq 값을 읽어 Server_Client_Seq 값으로 저장한다. 이때 클라이언트는
SYN_Sent 상태가 된다.
3. 서버는 Server_MY_Seq 값을 생성하고, Server_Client_Seq에 패킷의 길이만큼 더해서 클라이언트에 보낸다.
여기서 데이터는 0이므로, 단지 +1이라고만 표시한다. 이때 서버는 SYN_Received 상태가 되며, 클라이언트는
Server_Client_Seq+1을 받아 자신의 Client_My_Seq와 비교한다. 일치하면 Server_My_Seq 값을 Client_Server_Seq
값으로 저장한다.
4. 클라이언트는 Client_Server_Seq+1을 서버에 보내고 Established가 된다.
서버 역시 클라이언트가 보낸 Client_Server_Seq+1과 자신의 Server_My_Seq와 비료하여 일치하면 Established상태가
된다.
- 동기화 상태 (Established)
Client_MY_Seq = Server_Client_Seq
Server_MY_Seq = Client_Server_Seq
2. 클라이언트는 32비트 숫자중 임의의 숫자 (Client_MY_Seq)를 생성하여 서버에 SYN 패킷을 보낸다.
서버는 클라이언트가 보낸 Client_MY_Seq 값을 읽어 Server_Client_Seq 값으로 저장한다. 이때 클라이언트는
SYN_Sent 상태가 된다.
3. 서버는 Server_MY_Seq 값을 생성하고, Server_Client_Seq에 패킷의 길이만큼 더해서 클라이언트에 보낸다.
여기서 데이터는 0이므로, 단지 +1이라고만 표시한다. 이때 서버는 SYN_Received 상태가 되며, 클라이언트는
Server_Client_Seq+1을 받아 자신의 Client_My_Seq와 비교한다. 일치하면 Server_My_Seq 값을 Client_Server_Seq
값으로 저장한다.
4. 클라이언트는 Client_Server_Seq+1을 서버에 보내고 Established가 된다.
서버 역시 클라이언트가 보낸 Client_Server_Seq+1과 자신의 Server_My_Seq와 비료하여 일치하면 Established상태가
된다.
- 동기화 상태 (Established)
Client_MY_Seq = Server_Client_Seq
Server_MY_Seq = Client_Server_Seq
TCP 연결에서의 시퀀스 넘버 정의
Client_MY_Seq : 클라이언트가 관리하는 자신의 시퀀스 넘버
Client_Server_Seq : 클라이언트가 알고 있는 서버의 시퀀스 넘버
Server_MY_Seq : 서버가 관리하는 자신의 시퀀스 넘버
Server_Client_Seq : 서버가 알고 있는 클라이언트의 시퀀스 넘버
- TCP 세션 하이재킹은 서버와 클라이언트가 통신할때 TCP프로토콜의 시퀀스 넘버를 제어하는데 문제점을 알고
이를 파고드는 공격이다.
TCP 세션 하이재킹
- TCP 세션 하이재킹은 정상적인 세션 성립 상태를 무너뜨리는 것에서 시작한다.
- 클라이언트는 서버와 모두 접속되어 있는 Established 상태
- 서버와 클라이언트를 비동기화 상태로 만들어야 하는데, 비동기화 상태는 아래와 같이 세가지 상태로 나뉜다.
- hunt 툴을 사용한다.
비동기화 상태 (Unestablished)
1. 비동기화 상태에서 데이터가 전송되기 전까지 안정적(stable)상태
Client_MY_Seq ≠ Server_Client_Seq
Server_MY_Seq ≠ Client_Server_Seq
Server_MY_Seq ≠ Client_Server_Seq
2. 데이터가 전송될때 다음과 같은 상태에서의 데이터는 차후 사용을 위해 저장되지만 클라이언트에게 서버의 승인번호는
전달되지 않는다.
Client_MY_Seq < Server_Client_Seq + Data_Len
Server_MY_Seq < Client_Server_Seq
Server_MY_Seq < Client_Server_Seq
3. 다음 상태는 패킷의 수신이 불가능하며 데이터도 버려진다.
Client_MY_Seq > Server_Client_Seq + Data_Len
Client_MY_Seq < Server_Client_Seq
Client_MY_Seq < Server_Client_Seq
세션 하이재킹에 의한 상황
- 클라이언트측
Client_MY_Seq = 공격자가 생성한 Server_Client_Seq
Client_Server_Seq = 공격자가 생성한 Server_MY_Seq
Client_Server_Seq = 공격자가 생성한 Server_MY_Seq
- 서버측
Server_Client_Seq = 공격자가 생성한 Client_MY_Seq
Server_MY_Seq = 공격자가 생성한 Client_Server_Seq
Server_MY_Seq = 공격자가 생성한 Client_Server_Seq
세션 하이재킹 순서
1. 공격자는 스니핑을 하여 세션을 확인하고 적절한 시퀀스 넘버를 획득한다.
2. RST 패킷을 보내 서버쪽 연결을 끊는다.
3. 공격자는 새로 시퀀스 넘버를 생성하여 서버로 보낸다.
4. 서버는 새로운 시퀀스 넘버를 받아들이며 다시 세션을 연다.
5. 공격자는 정상적인 연결처럼 서버와 시퀀스 넘버를 교환하고 공격자와 서버 모두 Established 상태가 된다.
@ 클라이언트에서 다시 TCP 세션연결을 시도하려고 해도 되지가 않는데 이것은 세션 하이재킹이 되었기 때문이다.
클라이언트가 계속 ACK를 보내도 서버에서 공격지에 거쳐 계속 ACK만 왕래하는 것을 ACK Storm 이라 한다.
1. 공격자는 스니핑을 하여 세션을 확인하고 적절한 시퀀스 넘버를 획득한다.
2. RST 패킷을 보내 서버쪽 연결을 끊는다.
3. 공격자는 새로 시퀀스 넘버를 생성하여 서버로 보낸다.
4. 서버는 새로운 시퀀스 넘버를 받아들이며 다시 세션을 연다.
5. 공격자는 정상적인 연결처럼 서버와 시퀀스 넘버를 교환하고 공격자와 서버 모두 Established 상태가 된다.
@ 클라이언트에서 다시 TCP 세션연결을 시도하려고 해도 되지가 않는데 이것은 세션 하이재킹이 되었기 때문이다.
클라이언트가 계속 ACK를 보내도 서버에서 공격지에 거쳐 계속 ACK만 왕래하는 것을 ACK Storm 이라 한다.
세션 하이재킹에 대한 대응책
- 비동기화 상태 탐지 : 서버와 시퀀스 넘버를 주기적으로 체크하여 비동기화 상태에 빠지면 이를 탐지한다.
- 전송중 윈도우 크기와 시퀀스 넘버가 맞지 않는 상태가 되면 서로에 대한 교정 패킷이 정상적으로 작동하지 못하기 때문에
무한루프에 걸리게 된다.
- 결국 ACK의 비율이 급격히 늘어난다.
- 패킷의 유실 및 재전송 증가 탐지 : 공격자가 중간에 끼어서 작동하므로 패킷의 유실과 재전송이 발생하여 서버와의 응답시간이
길어진다.
- 기대하지 않는 접속의 리셋이 필요하다.
- 데이터 전송의 암호화와 지속적인 인증을 통한 세션의 유효성을 확인한다.