강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

TCP Connection Hijacking 공격 및 대책

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

TCP Connection Hijacking 공격 및 대책

1999. 1.16

정현철/CERTCC-KR, 한국정보보호센터

hcjung@{certcc,kisa}.or.kr

 

서론

Connection hijacking은 TCP 스트림을 자신의 머신을 거치게 리다이렉션 할 수 있는 TCP 프로토콜의 취약성을 이용한 적극적 공격 (Active Attack)이다. 리다이렉션을 통해 침입자는 SKEY와 같은 일회용 패스워드나 Kerberos와 같은 티켓 기반 인증 시스템에 의해 제공되는 보호 메커니즘을 우회할 수 있다. TCP 접속은 누군가 접속로 상에 TCP 패킷 스니퍼나 패킷 생성기를 가지고 있다면 대단히 취약하다.
스니퍼를 이용한 소극적 공격(Passive Attack)은 인터넷 상에서 그 발생 빈도가 점점 증가하고 있다. 공격자는 스니퍼를 이용하여 사용자 id와 패스워드를 획득하여 그 사용자로 시스템에 로그온할 수 있다. 이러한 공격으로부터 방어하기 위하여 일회용 패스워드나 토큰 기반 인증과 같은 사용자 식별 스킴이 사용되어지고 있다. 이들은 안전하지 않은 네트워크 상에서 스니핑으로부터 패스워드를 보호하지만 이러한 방법들은 데이터 스트림을 암호화하거나 사인하지 않는 한 적극적인 공격으로부터 여전히 취약하다. 많은 사람들이 적극적 공격은 대단히 어렵고 그만큼 위협도 적을 것이라고 생각하고 있지만 여기서는 이러한 환상을 깰 수 있도록 유닉스 호스트에 성공적으로 침입한 대단히 간단한 적극적 공격을 설명한다.

최근 이론적으로 알려진 이 취약점을 공격할 수 있는 도구가 인터넷 상에 공개되어 이에 대한 대책이 요구되고 있다.
우선 본 분석보고서에서는 hijacing 공격의 근간이 되는 TCP 프로토콜에 대해서 알아보고, TCP Connection hijacking 공격 기법에 대해 소개하고, 실제 이를 구현한 공격 도구인 HUNT에 대해서 간단히 소개하기로 한다.

마지막으로 이러한 hijacking 공격을 탐지할 수 있는 방법과 그 방지대책을 살펴보기로 한다.

 

1. TCP 프로토콜


가. TCP 프로토콜 개요

이 절에서는 TCP 프로토콜에 대한 간단한 설명을 한다.
TCP는 두 지점간의 신뢰성있는 전이중 스트림 접속을 제공한다. 접속은 송신자의 IP 주소, 송신자의 TCP 포트 번호, 수신자의 IP 주소, 수신자의 TCP 포트 번호로 이루어진 네 개의 요소에 의해 유일하게 정의되어 진다.
호스트에 의해서 송신되어지는 모든 바이트는 32비트 정수값인 일련번호(sequence number)가 매겨지고 수신자도 이 일련번호로 승인(acknowledge)한다. 첫 번째 송신 바이트를 위한 일련번호는 연결설정시 계산되어지고 매 TCP 연결시 마다 다른 일련번호를 사용하기 위하여 설계된 규칙에 근거하여 매 연결시 마다 변화한다.

서버와 클라이언트간의 접속시 다음과 같이 정의한다.

 

 SVR_SEQ : 서버에 의해서 송신되어질 다음 바이트의 일련번호
 SVR_ACK : 서버에 의해 수신될 다음 바이트
           (마지막 수신된 바이트의 일련번호 + 1)
 SVR_WIND : 서버의 수신 윈도우
 CLT_SEQ : 클라이언트에 의해서 송신되어질 다음 바이트의 일련번호
 CLT_ACK : 클라이언트에 의해 수신될 다음 바이트
           (마지막 수신된 바이트의 일련번호 + 1)
 SVR_WIND : 클라이언트의 수신 윈도우

 

  데이터 교환이 이루어지지 않은 초기에는 SVR_SEQ=CLT_ACK,  CLT_SEQ=SVR_ACK 상태이다. 이런 상태는 접속 후 양측에서 데이터의 전송이 이루어지지 않은 'quiet' 상태에서도 마찬가지이다. 이러한 상태는 데이터가 전송되어지는 상태에서는 성립하지 않는다. 좀더 일반적인 등식은 다음과 같다.

 

 CLT_ACK   SVR_SEQ   CLT_ACK + CLT_WIND
 SVR_ACK   CLT_SEQ   SVR_ACK + SVR_WIND


TCP 패킷의 구조는 그림과 같다.


 

Source Port : 소스 포트 번호
Destination Port : 목적지 포트 번호
Sequence number : 패킷의 첫 번째 바이트의 일련번호
Acknowledgment number : 수신될 다음번 바이트의 예상 일련번호
Data Offset : 패킷내의 데이터 오프셋
Control Bits :
   URG : 긴급 포인터
   ACK : 승인
   PSH : 푸쉬 기능
   RST : 접속의 리셋
   SYN : 동기화 일련번호
   FIN : 송신자로부터 더 이상의 데이터 없음
Window : 송신자의 윈도우 사이즈
Checksum : 헤더와 데이터의 TCP 체크섬값
Urgent Pointer : TCP 긴급 포인터
Options : TCP 옵션들
   ·SEG_SEQ : 패킷의 일련번호
   ·SEG_ACK : 패킷의 확인번호
   ·SEG_FLAG : 제어 비트

클라이언트에 의해 보내지는 전형적인 패킷에서는 SEG_SEQ는 CLT_SEQ, SEG_ACK은 CLT_ACK으로 세팅되어 진다.

TCP는 새로운 연결을 확립하기 위하여 "three-way handshake"를 사용한다. 만일 클라이언트가 서버에 접속을 초기화하고 데이터 교환이 없다면 정상적인 패킷 교환은 다음 그림과 같다.

 

클라이언트는 서버에 SYN 비트가 세팅된 패킷을 전송하므로써 연결을 시작한다. 이 패킷은 호스트에게 클라이언트가 연결을 설정하고 싶다고 말하고 어떤 일련번호를 패킷의 시작 번호로 사용할 것인지를 알려준다. 이 일련번호는 데이터의 순서를 유지하기 위해서 사용된다.
서버는 ACK와 SYN 비트가 세팅된 패킷으로 응답한다. 서버는 클라이언트의 패킷을 받았음을 확인하고 클라이언트에게 서버 자신의 일련번호를 알려준다.
마지막으로 클라이언트는 서버의 패킷 수신을 확인하므로써 양측의 연결이 확립되고 데이터 교환이 시작된다.
ESTABLISHED 상태에서 일련번호가 다음의 범위 내에 속하면 수신가능한 패킷으로 간주된다.

서버의 경우 : [SVR_ACK, SVR_ACK+SVR_WIND]
클라이언트의 경우 : [CLT_ACK, CLT_ACK+CLT_WIND]

 

나. desynchronized 상태

desynchronized 상태는 양쪽이 ESTABLISHD 상태일 경우의 아무런 데이터 전송이 없으면서 다음과 같이 서로의 일련번호와 확인번호가 일치하지 않는 접속 상태를 말한다.

SVR_SEQ ≠ CLT_ACK
CLT_SEQ ≠ SVR_ACK

이 상태는 데이터가 전송되기 전까지는 안정적(stable)이다. 하지만 데이터가 전송된다면 다음 두 경우가 발생하게 된다.

 

 CLT_SEQ < SVR_ACK + SVR_WIND
 CLT_SEQ > SVR_ACK


이 상태에서 패킷 수신이 가능하며 데이터는 차후의 사용을 위해서 저장되지만 사용자에게 SVR_ACK의 일련번호는 전송하지는 않는다.

 

 CLT_SEQ > SVR_ACK + SVR_WIND
 CLT_SEQ < SVR_ACK


패킷 수신이 불가능한 상태이며 데이터도 버려진다.

두가지 경우의 이러한 상태는 존재할 수 있지만 상호간의 데이터 교환은 불가능한 상태이다.

 

2. TCP Connection hijacking 공격
 

가. 공격 개요

hijacking 공격은 TCP 접속 양단을 desynchronized 상태로 만들어 접속 쌍방이 더이상 데이터 전송이 불가능하도록 하는데 관건이 있다. 그런 후 제 3의 호스트는 실제 패킷을 흉내내어 양 쪽에서 수신될 수 있는 패킷을 생성한다. TCP 세션이 desynchronized 상태이고 클라이언트는 다음의 패킷을 보낸다.

SEG_SEQ = CLT_SEQ
SEG_ACK = CLT_ACK

CLT_SEQ ≠ SVR_ACK 일 경우 그 데이터는 받아들여지지 않고 패킷은 버려진다. 그때 제 3자는 같은 패킷이지만 SEG_SEQ와 SEG_ACK(그리고 체크섬)을 바꾼 패킷을 보낸다.

SEG_SEQ = SVR_ACK
SEG_ACK = SVR_SEQ

이 패킷은 서버에 의해 받아들여지고 데이터는 서버에 의해 처리되어 진다.

CLT_TO_SVR_OFFSET = SVR_ACK - CLT_SEQ
SVR_TO_CLT_OFFSET = CLT_ACK - SVR_SEQ
라고 할 경우 공격자는 클라이언트에서 서버로 가는 TCP 패킷을 다음과 같이 생성한다.

SEG_SEQ ← SEG_SEQ + CLT_TO_SVR_OFFSET
SEG_ACK ← SEG_ACK - SVR_TO_CLT_OFFSET

공격자가 두 지점간에 교환되는 패킷을 감청할 수 있고 IP 패킷을 가장할 수 있다면 모든 행동이 공격자의 기계를 통하게 된다. 이로써 그 스트림에 데이터를 추가 및 삭제가 가능하다. 예를 들어 접속이 TELNET을 이용한 원격접속이라고 하면 공격자는 사용자를 대신하여 어떠한 명령어("echo merit.edu lpj >& ~/.rhosts"와 같은)를 포함할 수 있고, 이때 생길 수 있는 원치않는 화면출력을 제거할 수도 있어 사용자는 침입자의 존재를 전혀 눈치채지 못한다. 이 경우 CLT_TO_SVR_OFFSET과 SVR_TO_CLT_OFFSET은 물론 바뀌어야만 한다.
TCP 접속을 desynchronizing하는 두가지 방법이 있다. 공격자는 두 지점간에 전송되는 모든 패킷을 도청할 수 있다고 가정한다.
 

나. 초기 desynchronization

이 방법은 서버에서 초기 설정단계의 접속을 끊고 다른 일련번호로 새로운 접속을 생성한다.

 

① 클라이언트는 서버와의 접속을 생성시키기 위해 SYN 패킷을 전송한다.
② 공격자는 서버에서 클라이언트로 가는 SYN/ACK 패킷을 리슨한다.
③ 패킷을 탐지했을때 공격자는 서버에 RST 패킷을 보내 클라이언트의 접속을 종료시킨다.
④ 공격자는 클라이언트가 보낸 패킷과 동일한 파라메터들(TCP 포트)을 가지지만 일련번호가 다른 SYN 패킷을 서버에 보낸다. 서버는 자신의 다른 일련번호(SVR_SEQ'0)를 가지고 같은 포트에 새로운 접속을 개방한다.
⑤ 서버는 SYN/ACK 패킷을 클라이언트에 발송한다.
⑥ 이 패킷을 탐지한 공격자는 서버에 ACK 패킷을 발송한다. 서버는 ESTABLISHED 상태로 전환한다. 클라이언트는 서버로 부터 최초 SYN/ACK 패킷을 수신했을 때 이미 ESTABLISHED 상태로 전환되어 있다.

위의 과정을 거쳐 이제 양단은 desynchronized ESTABLISHED 상태가 된다.

SVR_TO_CLT_OFFSET = SVR_SEQ0 - SVR_SEQ'0
가 서버에 의해 결정된다.

CLT_TO_SVR_OFFSET = ATK_SEQ0 - CLT_SEQ0
가 공격자에 의해 결정된다.

공격의 성패는 CLT_TO_SVR_OFFSET의 올바른 선택에 달려있다. 잘못된 값은 클라이언트의 패킷이 서버에 의해 받아들여지고 원치않는 효과를 만들어낼 수 있다.
 

다. 널 데이터 desynchronization

이 방법에서 공격자는 서버와 클라이언트에 대량의 데이터를 전송한다.
전송된 데이터는 서버와 클라이언트에 아무런 영향도 주지 않고 가시적이지도 않지만 이 두 TCP 세션의 양단을 desynchronized 상태에 놓이게 한다.

다음과 같은 스킴이 telnet 세션에 사용되어질 수 있다.

 공격자는 간섭없이 세션을 관찰한다.
 공격자는 적당한 때에 서버에게 다량의 널 데이터(null data)를 전송한다. 널 데이터란 서버에 아무런 영향을 주지 않지만 TCP 확인번호 (acknowledgment number)를 바꾸는 데이터를 말한다. 가령 telnet 세션에서 공격자는 일련의 "IAC NOP IAC NOP ..."를 포함하는 ATK_SVR_OFFSET 만큼의 바이트를 보낸다. 매 2바이트 IAC NOP는telnet 데몬에 의해 해석되어지고 데이터 스트림으로부터 제거되어지고 아무런 영향도 미치지 않는다. 이제 서버는 다음 상태가 된다.
  SVR_ACK = CLT_SEQ + ATK_SVR_OFFSET
 이 과정을 통해 서버는 desynchronized 되어진다.
 클라이언트에 대해서도 이러한 작업을 수행하여 desynchronized 상태로 만든다.

이 방법은 세션이 널 데이터를 동반할 수 있을 경우에는 유용하다. 하지만 공격자가 데이터를 전송하는 시간을 결정하기가 대단히 어렵고 예측할 수 없는 부작용을 일으킬 수도 있다.

 

3. 공격 도구

이론적으로 알려진 TCP 프로토콜의 취약점을 이용한 hijacking 공격기술은 '98년 12월 HUNT라는 공격도구가 공개되면서 공격이 증가할 것으로 예상된다.
HUNT는 접속된 상태에서 침입하고 접속 상황을 감시하고 이를 재설정할 수 있는 프로그램이다. 이 도구는 메뉴방식 사용자 인터페이스를 제공하고 있어 시스템이나 프로토콜에 대한 깊은 이해가 필요없이 공격할 수 있다.

Image4.gif

 

가. 특징

HUNT의 주요 특징은 다음과 같다.

  • 접속 관리
      - 관심있는 접속을 설정
      - 들어오는 접속 탐지(SYN으로 시작하는 패킷뿐 아니라)
      - ACK storm 탐지로 hijacking 행위 감시
      - 성공적인 ARP 위장 탐지로 ARP 위장 공격과 일반적인 hijacking 공격 탐지
      - hijacking 후에 실제 클라이언트와 서버간의 동기화(이러한 이유로 접속이 리셋될 필요는 없음)
      - 접속 리셋
      - 접속 감시
  • 데몬
      - 자동적인 접속 리셋을 위한 리셋 데몬
      - 위장된 호스트로 부터의 모든 패킷을 전송할 수 있는 능력을 가진 호스트의 arp 위장을 위한 arp 위장 및 전송 데몬
      - MAC wnth 수집을 위한 MAC 발견 데몬
      - 특정 문자열을 탐색할 수 있는 TCP 트래픽을 기록할 수 있는 스니퍼 데몬
  • 호스트 resolving
      - DNS 서버를 통한 호스트 resolving
  • 패킷 엔진
      - TCP, UDP, ICMP, ARP 트래픽을 감시하기 위한 확장된 패킷 엔진
      - 일련번호와 ACK storm 탐지를 가진 TCP 접속 획득
  • 기타
      - 호스트 목록 보여주기 등
     

나. 기능

  • List/Watch/Reset 접속
    특정 접속 리스트를 얻을 수 있고 이들 접속을 대화 방식 인터페이스를 통해서 감시하거나 종료(reset)시킬 수 있다. 또한 이 접속에 대해 hijacking을 할 수도 있다.
  • ARP/Simple hijack
    선택된 접속에 대해서 대화방식 인터페이스를 통해서 데이터를 삽입할 수 있다.
  • Simple hijack
    접속의 데이터 스트림에 한 명령어를 삽입한다.
    이 경우 ARP 위장을 하지 않을 경우 ACK storm이 일어날 것이다.

 

4. 공격탐지 및 방지대책
 

가. 공격 탐지

hijacking 공격에 대한 탐지 방법이 몇가지 있다.

  • desynchronized 상태 탐지
    접속 양단의 일련번호를 비교함으로써 사용자는 이 접속이 desynchronized 상태인지를 탐지할 수 있다. 이 방법은 TCP 스트림을 통해 전송되는 일련번호가 공격자에 의해 변경되지 않았다고 가정할 경우에 가능하다.
  • Ack storm 탐지
      지역 이더넷 상의 TCP 트래픽에 대한 통계자료는 공격이 없는 일반적인 상황에서는 전체 telnet 패킷 당 데이터 없는 ACK 패킷의 비율이 대략 45% 정도이다. 이는 telnet 세션은 대화형 세션으로 사용자에 의해 타이프된 모든 문자는 에코되어지고 확인되어 진다는 것을 알 수 있다. 공격이 수행될 경우 이러한 통계값들이 변하게 될 것이다.
  • 특정 세션에서 패킷 유실 및 재전송 증가 탐지
    공격 중에는 비정상적으로 높은 비율의 패킷 유실 및 재전송이 발생하므로 공격임을 알 수 있다. 이는 사용자에 대한 응답시간의 지연을 의미한다. 패킷 유실 증가는 다음의 이유에 의해 발생한다.
      - ACK storm에 기인한 네트워크의 특별한 부하
      - 공격자의 스니퍼에 의한 패킷 상실. 이러한 패킷 상실은 네트워크 부하를 증가시키는 경향이 있음
  • 기대치 않은 접속 리셋
      사용자는 공격 프로토콜이 적절히 수행되지 않을 경우에 접속 초기 상태에서 세션의 접속 리셋을 경험할 수 있다. 공격의 약 10%가 성공하지 못하며 이에 따라 접속 종료(사용자에게 매우 가시적으로 나타남)나 non-desynchronized 접속(공격자는 스트림을 리다이렉트할 수 없음)으로 끝난다.
     

나. 방지대책

telnet 세션에서의 이러한 공격으로부터의 방어는 암호화된 커버로스 스킴(응용계층)이나 TCP 암호화 구현(TCP 계층)이다. 데이터 흐름의 암호화는 내용에 대한 침범이나 변조를 방지한다. 데이터에 대한 서명도 사용되어 질수 있다. PGP는 안전한 전자우편 전송의 한 예이다.

 

5. 결론

telnet이나 기타 유사한 프로그램에서 패스워드를 보낼 때 암호화 하지 않고 일반 텍스트로 보내게 되면 네트워크 스니퍼링 공격등에 의해 침해당할 수 있다. 하지만 일회용 패스워드를 사용할 경우 스니퍼링에는 안전할지라도 이미 이루어져 있는 접속에 대한 공격인 hijacking에는 안전하지 못하다. 오로지 완전히 암호화된 트래픽은 이러한 공격들에 안전할 수 있다.
TCP 프로토콜의 취약성을 이용한 이러한 적극적인 공격은 지역 네트워크에서 사용되어질 경우 쉽게 탐지가 되는 반면, 공격이 장거리, 낮은 대역폭, 높은 지연 네트워크(일반적으로 WAN) 상에서 수행되어질 경우 대단히 유효하다. 그것은 인터넷 상에서 너무도 자주 발생하는 수동적인 스니핑 공격에 사용되는 것과 같은 자원으로 수행되어 질 수 있다. 이러한 공격은 사용자에 의해 가시적이지 않으므로 더 위험하다. 인터넷 상에서 호스트에로의 침입이 잦을수록 공격 사실을 숨기는 것이 대단히 중요하며 이는 탐지를 어렵게 한다.
인터넷에서 모든 사람들의 관심이 현재의 IPv4를 대체할 IPv6의 출현에 주목하고 있을때, 공격의 증가와 안전한 시스템의 필요성은 인터넷 사외를 위한 안전한 전송계층의 개발 및 사용을 요구하고 있다. 프라이버시를 보호하기 위해서 사인을 하고 결국 암호화된 데이터의 전송이 선택적으로 가능해야 한다. 데이터에 대한 서명은 현재의 TCP 체크섬이 신뢰성있는 서명으로의 대체를 의미한다.
일반적으로 이더넷의 스니핑을 방지하기 위하여 s/key나 커버로스를 사용하는 것만으로 충분하다는 생각은 대단히 위험하다는 것을 깨달아야 한다.
 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,039 명
  • 현재 강좌수 :  35,848 개
  • 현재 접속자 :  93 명