TCP연결 및 세션 하이재킹

junghan·2022년 12월 1일
0

보안

목록 보기
1/2
post-thumbnail

세션(Session)이란?

사용자와 컴퓨터, 또는 여러 컴퓨터 간의 활성화된 상태를 의미합니다. 일정 시간 동안 같은 사용자로 부터 들어오는 요구를 하나의 상태로 정의하고 그 상태를 일정하게 유지시키는 기술입니다.

세션 하이재킹(Session Hijacking)이란?

시스템 간 연결이 활성화 되어 있을 때, 유지되고 있는 상태를 중간에 가로채 해당 유저인 것 처럼 시스템에 접근하여 자원이나 데이터를 사용하는 공격을 의미합니다. 세션 하이재킹은 TCP라는 프로토콜을 사용할 때, 설계 상 보안을 고려하지 않아 발생하는 문제점을 이용하는 해킹 기법입니다.




TCP 세션 하이재킹

UDP는 의미가 없다 세션이 성립되지 않기 때문

서버와 클라이언트 통신 시 TCP의 시퀀스 넘버(순서제어)를 제어하는데 발생하는 문제를 공격하는 것입니다.
공격자가 숫자를 이용해 상호간의 소통하는 것에 가짜 시퀀스 넘버를 만들어서 끼어들며 해킹하는 기법이며, 주로 서버와 클라이언트가 TCP를 이용해 통신하고 있을 때 RST패킷을 보내 일시적으로 TCP세션을 끊고 시퀀스 넘버를 새로 생성하여 인증된 세션을 빼앗고 인증을 회피하는 방식이 사용됩니다.

세션 하이재킹 종류

Blind Attack: 시퀀스 넘버를 예측해야하기 때문에 일반적인 방법으로 해킹하기 힘듭니다.
보통 세션 하이재킹은 Non-Blind Attack으로 일어납니다.

Non-Blind Attack: 스니핑이 가능한 상태(중간에 가로채서 시퀀스 넘버확인, 소통 중간에 끼어들어 모든 네트워크 패킷을 확인 가능한 상태)에서 수행가능합니다.

세션 하이재킹 갈취 가능 상태

  • 트러스트(IP 스푸핑)를 이용한 세션
  • 텔넷, FTP 등 TCP를 이용한 거의 모든 세션
  • 인증 문제 해결을 위한 일회용 패스워드, 토큰 기반 인증을 이용한 세션
    - IPV 4 기반 TCP프로토콜은 특별한 인증구조 없이 사용하여 취약하기 때문에, 추가적인 암호화 기법을 적용하여 보안을 강화해야합니다.



TCP연결 과정

TCP연결 순서

  1. 클라이언트의 서버로 three handShaking을 요청
  • 클라이언트 Closed 서버 Listen상태
    서버에게 three handShaking을 요청하기 위한 SYN 패킷을 보내기 위해 Client_My_Seq를 생성
  1. 서버 측에서 시작 요청을 수신
    SYN 패킷을 통해 전달받은 Client_My_Seq을 Server_client_Seq에 생성 후 저장

  2. 서버 측에서 클라이언트에게 요청에 대한 응답
    서버가 자신의 시퀀스 넘버인 Server_My_Seq을 생성
    SYN/ACK에 각각 Server_My_Seq와 Server_Client_Seq + 1을 넣어 응답

  • 1 을 통해 받았음을 확인
  1. 클라이언트에서 응답을 확인
    서버로 부터 전달받은 시퀀스 넘버를 Client_Server_Seq에 저장

  2. 클라이언트에서 서버로 응답확인을 보냄
    클라이언트 Established 상태
    ACK에 Client_server_Seq + 1을 넣어 보냄

  • 1을 통해 잘 받았음을 확인
  1. 서버에서 확인을 받음
    서버 Established상태

  2. 동기화 완료




세션 하이재킹 과정

비동기화를 통한 공격

TCP연결이 동기화된 서버와 클라이언트가 공유하던 시퀀스 넘버가 어긋날 경우 비동기화 상태라고 말합니다.

비동기화를 생성하는 방법

  • 서버에서 초기 설정 단계의 접속을 끊고 (RST) 다른 시퀀스 넘버로 새로운 접속을 생성하는 방법
  • 대량의 널(NULL) 데이터를 보내는 방법

새로운 접속을 생성하여 비동기화

TCP세션 하이재킹은 서버와 클라이언트가 각자 알고 있는 시퀀스 넘저를 조작해 속인 후 다음 상황을 만듭니다.

세션 하이재킹 사전 작업 과정

- 스캔 및 정보수집: foot printing이나 스캔자료 수집
- 공격 대상 포트 찾기: 세션탈취를 위한 포트찾기
- 스푸핑: 클라이언트와 서버사이에 끼어들어 스푸핑을함
- fragrouter로 패킷 릴레이: 중간에 데이터를 가로챈것을 클라이언트와 서버가 알아채지 못하도록 숨김
- 스니핑: 훔쳐온데이터로 스니핑 실행하여 시퀀스 넘버확인
- reset 패키지를 보내 세션이 다시 만들어지도록 만듦 

공격자가 위의 작업을 통해 정보탈취를 할 수 있는 환경을 만들어 fragrouter로 패킷 릴레이를 수행하고, 모든 데이터의 흐름을 참조하여 정보를 주고받을 수 있게 됩니다.

세션 하이재킹 공격 순서

  1. 클라이언트와 서버가 Synchronized되어 있는 활성화 상태

  2. 공격자(Closed된 상태)가 중간에 서버에게 RST (리셋 패킷)을 보냄 서버를 closed상태로 변경

  3. 공격자가 생성한 SYN(Client_My_Seq)을 포트를 맞춘 상태로 서버에게 다시 보냄 서버는 아직 Closed상태

  4. 서버는 검토없이 전달받은 Client_My_Seq를 토대로 구성한 SYN/ACK(Server_My_Seq)를 클라이언트라고 착각하는 공격자에게 전달

  5. 공격자는 ACK응답을 다시 서버에게 보내 공격자를 Established상태로 만듦

인증 과정은 세션을 성립하기 이전 과정에서 이뤄졌기 때문에, 중간 과정에서 악의적으로 reset을 보내 인증없이 연결했기 때문에 탈취가능함
-> 중간에 reset들어오면 인증을 다시 해주는 방식으로 해결가능

  1. 클라이언트가 서버와 세션이 정상적으로 활성화되어 있다고 생각하고 패킷을 보내면 공격자가 중간에 데이터를 탈취하여 데이터를 변조하여 서버에게 전달

대량의 널(NULL) 데이터로 비동기화

SYN/ACK 통신을 수행할 때, 값이 없는 데이터를 보내면 추가적으로 데이터는 보내지지 않으면서
시퀀스 넘버만 왔다갔다하게 되는데, 시퀀스넘버가 한쪽에서만 계속 증가하면 시퀀스 넘버를 제대로 변경시키지않게 만들어 보안의 취약점을 발생시키는 방법입니다.




세션 하이재킹 탐지 방법

비동기화 상태 탐지

  • 서버와 시퀀스 넘버를 주기적으로 체크하여 비동기 상태에 빠지면 이를 탐지합니다.

ACK Storm 탐지

  • 전송 중 비동기화가 되어, ACK패킷의 윈도우 크기와 시퀀스 넘버가 맞지 않는 상태가 되면 서로에 대한 교정 패킹(ACK패킷)의 비율이 급격히 늘어남을 감지합니다.
  • 일상적으로 발생하는 ack패킷 발생량에 비해 많은 ACK가 탐지가 되어, 미리 설정해둔 threshold(한계점)를 넘어가면 접근제어하는 방식

패킷의 유실 및 재전송 증가 탐지

  • 공격자가 중간에 끼어서 작동하므로 패킷의 유실과 재전송이 발생하여 서버와의 응답시간이 길어짐
  • 클라이언트에서 확인하기에는 한계가 있음.

기대하지 않은 접속의 리셋

세션하이재킹 공격에 대한 최우선 대응책은 데이터 전송의 암호화와 지속적인 인증을 통한 세션의 유효성을 확인하는 것 입니다. (SSH를 통한 암호화된 연결사용)




profile
42seoul, blockchain, web 3.0

0개의 댓글