Notice
Recent Posts
관리 메뉴

Hacking Arts

[CVE 2013-5211] DrDOS (NTP) 본문

정보보안기사/네트워크

[CVE 2013-5211] DrDOS (NTP)

Rakehell 2018. 11. 23. 20:39

NTP란?

- Network Time Protocol로써 시간을 동기화 시켜주는 프로토콜이라고 생각하면 됩니다. 보안에서도 시간은 중요한 데이터인 만큼 대부분 NTP 서버를 이용하여 동기화를 진행합니다.


NTP 동작원리?

- Stratum 값을 기준으로 높을수록 더 정확한 서버라고 할 수 있다. Stratum 값이 커질수록 위에 단계의 서버로부터 동기화를 받는 서버이다.


NTP timestamp ?

- 기본적으로 64bit 타임스탬프를 사용하며, 네트워크 지연에 대한 시각 정보 오류 교정을 위하여 타임스탬프를 사용 

- Reference Timestamp : 초기화한 시간을 기록(Request 초기화 or 마지막 동기화 시간/Reply 초기값 혹은 마지막 동기화 시간)

- Origin Timestamp : 클라이언트가 서버로 Request한 시간(Request 초기값/Reply 클라이언트의 Request에 있는 Transmit Timestamp값)

- Receive Timestamp : 서버가 클라이언트로 Request 받은 시간(Request 초기값/Reply 클라이언트의 Request를 받은 시간)

- Transmit Timestamp : 전송되는 시간(Request 보내는 시간/Reply 서버의 Reply를 보내는 시간)


NTP Monlist 기능?

- NTP Monlist라는 명령어는 NTP 서버에 monlist만 명령어로 들어오게 된다면, 최근에 접속한 600개의 IP리스트를 보내는 기능입니다.


NTP Monlist를 이용한 DrDOS

- 이전에 말씀드렸듯이 Monlist의 기능을 단순 이용하여 간단한 monlist명령어 하나로 600개의 IP크기로 증폭시킨다면 훨씬 커진 크기 및 대량의 바이트를 전송할 수 있게 됩니다. 이러한식으로 여러대의 서버 그리고 여러개의 PC에서 하게 되면 적은량의 좀비 PC 대수로도 대량의 Byte를 전송하여 공격에 성공 할 수 있게 됩니다. 

- ntpd 4.2.7 이전 버전은 취약


- NTP monlist 패킷 분석

-> 구성환경 Victim : centos7(192.168.0.99) / attacker : kali(192.168.0.97)

무슨 문제인지 모르겠지만 ubuntu에서 ntp 설치후 config로 monlist 기능을 허용 해주어도 올라오지 않아 결국 centos로 테스트 했는데 잘된다.  centos iptables는 잠시 꺼둔 상태

<통신 테스트>


<요청 패킷>


<응답 패킷>


위는 정상적인 monlist 패킷이다 보통 요청 패킷은 사이즈0 flag쪽에 7번 mode -> monlist mode를 명시하여 날리게 된다.

응답패킷은 요청받은 패킷은 모드넘버는 7로 똑같이 가져가고 monlist를 보내주는데 0x48크기 즉 72byte크기의 3개의 리스트를 붙임으로써 크기가 증가하게 되는 것을 알 수 있다.


다른 글을 보면 첫번째 플래그 값이 0xD7로 되어있는데

flag를 분석해보면 총 4개의 값이 존재한다. 

<응답 패킷의 flag>

-flag 필드구역이다.

response request를 구별하는 비트

해당 패킷이 끝인지 더있는지를 구별하는 것같다.

나머지 ntp 버전에 해당하는 비트 3개

나머지 mode관련 비트 3개가 들어가게 된다. monlist의 경우 해당 7번 모드에서 있다고 한다.


-그다음은 위 응답패킷에 있듯 auth 비트 1, 시퀀스 넘버 23이라는데 와이어샤크 오류같아 보이는 부분이다. 이값을 2진수로 표시하면 0x97값으로 이전 flag값과 동일하며 flag위치 다음 값은 0x00이다. 아마도 시퀀스 넘버가 0인데 오류인듯 싶다 auth bit또한 아마 0으로 보인다.


-그다음 값은 implementation number값으로 3이다. 구현 번호 필드이며, 구현 번호 0값은 모든 구현 동의의 코드 및 데이터 형식에 사용되며, 나머지 255값은 예약 되어있다 XNTPD는 0x03이다 정확히는 ntp 패킷의 해당 값의 설명을 봐야 알것같다. 정확히 뭔지 모르겠다.. 위내용 또한 퍼왔다.


-request code 값은 0x2a로 요청 코드 필드로 패킷에 포함된 작업 수행 및 데이터 형식을 지정하는 필드이며, monlist기능은 MON_GETLIST_1값으로 0x2A)라고 한다. 중요한 부분인데 아마 요청 코드의 작업 내용을 지정하는 것으로 보인다.


- 나머지 error 비트 / 사진은 0

0 - 오류 없음

1 - 비교할 수 없는 구현 번호

2 - 구현되지 않는 요청 코드

3 - 포맷에러

4 - 자료 없음

5,6 - 알수 없음

7 - 인증 실패(사용 권한이 거부됨)


- number of data items : 항목 갯수 (monlist의 경우 리스트 갯수)


- 예약 비트


- size of data  item : 0x48 (리스트의 크기를 말함)


그 이후는 monlist 항목에 대한 데이터 표시다 avgint,lsint,restr,count,remote IP주소,local 주소, flags,port,mode,version,ipv6 등의 구성요소로 총 0x48의 크기를 지니게 된다.


출처 : https://m.blog.naver.com/PostView.nhn?blogId=koromoon&logNo=120206497994&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F


해당 내용은 위에 내용과 동일하다.


- 패킷이 지닌 취약점

이게 왜 취약하게 되었는지 생각해보자. 내가 구성한 환경에서는 monlist의 경우 총 3~4개 즉 적은 리스트의 갯수를 지니게 된다. 요청 패킷의 경우 48byte의 크기로 size of data item까지의 필드와 동일하며 mode값의 변화만 주게된다. 하지만 응답패킷은 최근 접속한 총 600개까지 저장할수 있게되는데 리스트 하나 크기는 0x48즉 72byte크기를 지니게 되면 내 기억이 정확하진 않지만 mtu값이 대부분 1500byte이다  하지만 총 600개 리스트는 72x600=43200까지의 값을 가질 수 있으며 대략적으로만 나눠도 28개의 패킷이되며(물론 이것보다 더 많다 이유는 단순 짱개식 계산이지만 아래 계층의 헤더값은 계산하지 않았기 때문이다) 그렇다면 단순 IP 변경을 통해 48byte(ntp헤더의 크기만) 패킷을 날리면 최대 28개 이상의 패킷으로 분할된 패킷을 응답하게 된다. 즉 정리하면 몇백개의 좀비가 monlist가 가능한 ntp 서버에 변조된 패킷을 날리면 최대 28개이상으로 분리된 패킷을 공격대상 서버에 날리게 되고 해당 서버는 drdos공격의 대상이 된다고 판단하면 된다.


- 사용된 명령어

ntpdc -c monlist ntp서버IP : ntp서버 설치시 명령어에서 제공하는 ntpdc를 이용한 테스트 방법 

nmap -sU -pU:123 -Pn -n --script=ntp-monlist ntp서버IP : nmap에서 제공하는 monlist 스크립트 실행 명령어

systemctl stop firewalld  : centos 방화벽을 끄는 명령어

'정보보안기사 > 네트워크' 카테고리의 다른 글

iptables  (0) 2018.12.09
DrDos  (0) 2018.11.17
nmap - 1  (0) 2017.11.12