IT 그리고 정보보안/Knowledge base

r-services 개념과 관련 취약점

plummmm 2021. 4. 19. 07:15
반응형

r-services에 대해 알아봅시다. 

 

유닉스/리눅스 시스템에서 신뢰도 있는 사용자에 한해서 패스워드로 검증하지 않고 

그냥 서비스를 가능하게 해주는 아주 딱 봐도 취약해보이는 서비스이다.

 

rsh, rcp 등등의 r-services 들은 .rhosts 파일을 사용한다. 

이 파일은 호스트와 계정을 패스워드없이 통과하도록 해준다

한번 인증하면 .rhosts 파일에 아래와 같이 등록된다. 

 

 

문제는 이미 나왔따. 맨 아랫줄 와일드 카드 * *  2개가 나와있는데,

이건 무슨 뜻이나면.. 모든 호스트와 계정을 허용한다는 말이다.

물론 .rhosts 파일에 이게 존재하진 않는다.

 

하지만.. 해커가 이 .rhosts 파일에 * * 만 추가할 수 있다면 큰일 나는 거지.

다음은 r-services 에서 일어날 수 있는 보안 취약점들과 그에 대한 대응책을 간단하게 설명한 것이다.

 

 

다음으로 r-service 취약점에 대한 공격 몇가지를 알아보자 

 

1. Source routing

source routing 이란, ip헤더 옵션 중 하나로 송신자가 미리 패킷 헤더에 경로를 라우팅하는 옵션이다.

공격자는 이를 이용하여 라우팅 경로를 조작할 수 있다.

원래 라우터가 정해주는대로 가야하는데 공격자 임의로 경로를 지정할 수 있다는 말.

 

 

위 그림은 공격자 X가 source routing 옵션으로 S로의 경로를 지정하고 

C로 자신을 Spoofing한 패킷을 전송하는 그림이다.

 

source routing은 공격자가 원래는 접근할 수 없는 네트워크에 접근할 수 있도록 한다.

공격자는 애초에 목적지로 가는 전체 경로를 리스트로 만들어 패킷의 헤더에 넣고 보낸다.

라우터에서 source routing 옵션을 허용하였다면 경로가 조작되는 것이다.

 

이렇게 S로 접근하였다면, 패킷을 가로챌 수 있다는 말.

요즘은 대부분 라우터에서 source routing 옵션을 disable 하기 때문에 먹히지 않음.

 

 

2. Remote Session Hijacking (TCP sequence prediction attack)

이번엔 세션 하이제킹에 대해 알아봅시다. 하이제킹이란 말은 사전적 의미로 보면 납치하다 뭐 이런 뜻.

저번부터 포스트 하는 r-service 관련 공격들은 그냥  TCP/IP 취약점이라고 봐도 무방하다.

 

세션이란 말이 너무 광범위하게 사용되는 이유랄까.. 일단 이번에는 TCP/IP 에서 세션 하이제킹을 알아본다.

또다른 이름은 TCP sequence prediction attack 이다. Remote 세션 하이재킹이라고 하였는데, 리모트와 로컬 두가지 종류가 있는데

일단 리모트 부터 알아보자. 

 

일단 TCP/IP 세션 하이제킹을 알아보기 전에 TCP 세션이 어떻게 맺어지는지, Seq number는 어떻게 되는지 알아보자.

 

 

그림을 보면 알겠지만, 처음에 c라는 seq.num(줄여서 쓰겠음)이 날아가면 SYN에 대한 ACK는 c+1, 그리고 새로운 SYN은 s라는 seq.num을 가지게 된다.

(위에서 ISN은 seq. number)

 

TCP/IP의 세션 하이제킹 기본 개념은 이 seq.num의 증가분을 예측하는 것이다. seq.num을 예측하면 클라이언트인 척 하는 해커가 서버와 세션을 맺을 수 있다.

공격 과정을 한번 살펴보자.

 

1. Sequence Number 예측

seq.num을 예측 하는 과정이다.

 

먼저 공격자(X)는 클라이언트(C)를 다운시킨다. DOS 공격 등을 활용하여. 여기서 C를 dIsable 시키지 않으면 나중에 RST을 날릴 수 있으니 필히 죽여야 한다.

C를 다운 시키고  X는 자신을 C로 속이고 서버(S)에게 [SYN] 을 먼저 보낸다.

그럼 S는 C에게 [SYN, ACK] 를 보내겠지? 공격자는 이 [SYN ACK]의 [SYN]을 예측하여 다시 S에게 [ACK]를 보낸다.

OS, 환경마다 Seq.num이 증가하는 속도, 시간이 다르므로 여러번 해야 seq.num을 맞출 수 있다.

 

2. 세션 하이제킹

1의 방법으로 계속해서 seq.num을 예측한다. 계속적으로 브루트 포싱을 하면 맞출 수 있다.

(일단 공격이 가능한 환경이라고 가정한다.)

 

그렇게 seq.num을 때려맞추면 S는 C로 위장한 X와  TCP 세션을 맺게 된다.

S는 지가 맺은 세션이 C라고 철썩같이 믿고 있지.

 

3. 원격 명령 실행

세션을 탈취했으니 이제 원격 명령을 실행한다. 

 

제목에서도 말했지만, 이건 r-service 환경이라고 가정했기에 r-service 공격에 사용되는 원격 명령을 그림으로 보여주고 있다.

요약하자면, 리모트 세션 하이재킹은 그냥 시퀀스 넘버를 대충 때려 넣어서 세션을 갈취한다.

시퀀스 넘버가 32비트니까 거의 못맞춘다고 보면 무방하다.

 

 

 

3. Local Session Hijacking

이번에 알아볼 공격은 Local Session Hijacking다. (session stealing 이라고도 불리는 듯)

리모트 세션 하이재킹과 상이하게 비동기화 상태를 이용한 세션 탈취 공격이다.

 

이전에 본 리모트 세션 하이제킹은 sequence number를 조작하여 세션을 탈취하는 기법이고,

이번 로컬 세션 하이재킹은 TCP의 비동기화 상태를 이용하여 세션을 탈취하는 기법이다.

 

방법이 조금 다르지 두가지 다 시퀀스 넘버 제어하는 데에 있는 문제점을 이용한건 같다.

다만, 로컬 하이재킹이 유효한 이유는 시퀀스 넘버를 브루트 포싱으로 때려맞추는 리모트와 다르게

로컬에서는 서버/클라이언트 통신시에 시퀀스 넘버를 알 수 있다.

 

사실 로컬 세션 하이재킹이 진짜 TCP Session Hijacking이라고 볼 수 있다.(통상 그렇게 부름)

 

일단 이 공격을 사용하기 위해 전제조건이 있다.

1. 클라이언트/서버의 경로상에 공격자가 위치해야 한다. (로컬이니까 당연)

2. 패킷을 스니핑할 수 있고, 인젝션 가능한 상태여야 한다.

 

자 그럼 이제 Local Session Hijacking 의 본격적인 내용을 알아보자.

 TCP에서 Sequence Number( = seq.num)가 뭘하는 녀석인지는 알 것이다. (패킷의 순서에 대한 신뢰성을 보장해주는 번호)

 이 seq.num 는 여러가지 종류로 나뉜다. 

 

** TCP 연결에서 Sequence number

s_seq : 서버에서 전송하는 패킷의 시퀀스 넘버

s_ack : 서버가 수신하는 클라이언트 패킷의 넘버

c_seq : 클라이언트가 전송하는 패킷의 시퀀스 넘버

c_ack : 클라이언트가 수신하는 서버 패킷의 넘버

(S_Wind : 슬라이딩 윈도우)

그림을 보면 좀더 쉽게 이해가 가능할 것이다.

 

TCP 연결은 위의 seq.num에 따라서  동기화(synchronized)와 비동기화(desynchronized) 두가지 상태가 존재한다.

 

동기화(synchronized) 상태 

C_SEQ = S_ACK / S_SEQ = C_ACK 상태 일 때 동기화 상태라고 말한다.

TCP 로컬 세션 하이재킹은 이 동기화 상태를 깨뜨리는 데서 시작한다. 

 

비동기화 상태는 아래에 3가지 상태로 나뉜다.

 

* 비동기화(desynchronized) 상태 

C_SEQ != S_ACK / S_SEQ != C_ACK

양쪽 모두 ESTABLISHD 상태 이지만 시퀀스 넘버가 각각 다른 상태이다.

이것은 데이터가 전송되기 전에는 안정된 상태 (stable state) 이다.

근데 데이터 교환이 일어나면 아래와 같은 일이 일어난다.

 

1. S_ACK < C_SEQ < [ S_ACK + S_Wind ] (윈도우 안에 있는 상태)

이건 C_SEQ가 슬라이딩 윈도우 안에 있는 상태 이다.

이 상태에서는 패킷을 수용은 하지만 어플리케이션으로 전달하지 않는다.

 

2. C_SEQ > [ S_ACK + S_Wind ] or C_SEQ < S_ACK (윈도우 밖에 있는 상태)

이건 C_SEQ가 슬라이딩 윈도우 밖에 있는 상태이다.

패킷 수신이 불가능하고 데이터도 드랍시킨다.

 

위와 같은 상황을 만들기 위해 2가지 방법이 존재한다. 즉 세션 하이재킹 공격 방법이 2가지가 있다는 말이다.

하이재킹 공격은 양쪽을 비동기화 시켜, 서버와 클라이언트가 통신이 불가능하도록 만드는 것이 핵심이다.

먼저 서버에서 초기 설정단계의 접속을 끊고 다른 시퀀스 넘버로 접속을 생성하는 방법부터 보자.

 

 

1. Early desynchronization 

 

위에서 설명했듯이 초기 접속을 끊어버리고 새로운 접속을 생성하는 방법이다.

 

1. 클라이언트가 서버로 접속을 시도한다. (SYN)

2. 서버가 접속에 응답한다. (SYN ACK)

3. 공격자가 클라이언트로 위장하여 서버로 RST 패킷을 보내어 접속을 끊는다.

4. 위장한채로 서버로 접속을 시도한다. (기존의 C에서 보낸 패킷과 다른 시퀀스 넘버를 가진다.)

5. 서버는 C로 SYN ACK 를 보내지만 시퀀스 넘버가 달라 비동기화 상태가 된다.

6. 비동기화 상태가 된 서버와 클라이언트를 공격자가 마음대로 요리한다.

 

쉽게 요약해서 그냥 공격자가 중간에 끼어들어서 시퀀스 넘버를 꼬아서 비동기화 상태로 만들어

서버와 클라이언트가 통신이 불가능하도록 만드는 것이다.

 

다음 NULL 데이터를 겁나 날려서 시퀀스 넘버를 꼬아버리는 방법이다.

 

2. NULL data desynchronization

개념은 간단하다. NULL을 서버로 마구 때려넣는데, 서버와 클라이언트에 아무런 영향을 주지 않지만

시퀀스 넘버는 계속해서 밀려난다. 계속계속 하다보면 양단이 비동기화 상태에 놓이게 된다.

 

1. 공격자가 방해하지 않고 계속 세션을 관찰한다.

2. 얼마의 시간을 기다린 후 어마어마한 양의 null data를 보낸다.

3. 클라이언트가 서버에 데이터를 보내도 드랍된다. 서버의 windows 값 보다 작기 때문이다.

 

반응형