( 1 ) 취약점 정의
NTP 의 monlist 기능을 이용한 대량의 네트워크 트래픽을 유발시켜 분산 서비스 거부 공격을 일으킬 수 있는 취약점을 말함.
여기서 monlist 기능은 NTP 서버에 최근 접속한 시스템 목록을 요청하고 출력하는 기능을 말함.
ntpd 4.2.7 이전 버전에 취약함.
(ntpd - 유닉스 계열의 시간 동기화 유지 관리 프로그램)
( 2 ) NTP 프로토콜
IP 네트워크 상에 연결된 2개의 컴퓨터 사이에 각 장비별 동일한 시간을 갖게 하고 서보 시간을 교환할 수 있는 프로토콜을 말하며 UDP 123번 포트를 사용함.
컴퓨터 클록 시간을 1/1000 초 이하까지 동기화시키기 위해 협정 세계시각(UTC)을 사용함.
( 3 ) 공격 시나리오
공격자는 변조된 소스 IP(즉, 공격하고자 하는 IP)를 취약한 NTP 서버로 monlist 명령어를 전송함.
취약한 NTP 서버는 최근 접속한 시스템 목록(최대 600개)을 변조된 소스 IP 로 monlist 명령어에 대한 Response 패킷을 전송하여 대량의 네트워크 트래픽을 유발함.
즉, NTP 서비스를 이용한 반사 DDoS 공격임. (NTS Amplification DDoS Attack)
( 4 ) 공격 패킷 분석 (NTP Monlist 패킷)
공격 패킷은 monlist 패킷 포맷으로 길이는 7 아니면 8 바이트로 표현되며 해당 바이트까지만 분석함. (위 그림에서 파란색 선으로 표시된 부분)
NTP 의 monlist 기능은 패킷 모드 7 에서 동작함. (!!! 핵심 포인트)
패킷 모드는 개인 사용을 위한 예약 모드로 시간 동기와 관련되거나 모니터링, 통계 수집 및 구성 등 데이터 교환에 사용됨.
위 그림은 취약한 NTP 서버에서 변조된 소스 IP(즉, 공격하고자 하는 IP)로 공격한 패킷임. (헥사값 "D7 3D 03 2A 00 06 00 48")
① 첫 번째 바이트 0xD7
R : 응답 비트M : 추가 비트로 하나의 패킷 이상을 요구 시 설정되는 비트
VN : 버전 넘버 필드
Mode : 패킷 모드 필드 (monlist 기능은 패킷 모드 7 에서 동작하므로 7 로 설정됨)
② 두 번째 바이트 0x3D
A : 인증 비트
Sequence number : 시퀀스 넘버 필드로 기존의 패킷의 시퀀스 번호를 포함함. 0 ~ 127 까지임.
③ 세 번째 바이트 0x03
Implementation number : 구현 번호 필드임. 구현 번호 0 값은 모든 구현 동의의 코드 및 데이터 형식에 사용되며 나머지 255 값은 예약되어 있음. XNTPD 는 0x03 임.
⑤ 네 번째 바이트 0x2A
Request code : 요청 코드 필드로 패킷에 포함된 작업 수행 및 데이터 형식을 지정하는 필드임. (monlist 기능은 MON_GETLIST_1 값으로 0x2A 임)
⑤ 다섯 번째 & 여섯 번째 바이트 0x0006
Err (4bit) : 에러 필드임. 오류가 없으면 0x00임
에러표
0 - 오류 없음
1 - 비교할 수없는 구현 번호
2 - 구현되지 않은 요청 코드
3 - 포맷 에러 (잘못된 데이터 항목, 데이터 사이즈, 패킷 사이즈 등)
4 - 자료 없음
5, 6 - 알 수 없음
7 - 인증 실패 (즉, 사용 권한이 거부됨)
Number of data items (12bit) : 데이터 항목 필드임. 데이터 항목값을 반환하며 0 ~ 500 사이임.
⑥ 일곱 번째 & 여덟 번째 바이트 0x0048
MBZ (4bit) : 예약 데이터 필드임. 요청과 응답이 0 이어야 함.
Size of data item (12bit) : 패킷의 각 데이터 항목의 크기 필드로 값은 0 ~ 500 사이임. (MON_GETLIST_1 일 경우 0x48임)
나머지는 데이터 요청 & 응답 데이터를 포함하는 가변 크기의 영역임.
요청 및 응답을 위한 오프셋 사이즈는 데이터 항목과 데이터 항목의 사이즈의 갯수의 곱과 같거나 커야 함.
요청에 대한 데이터 영역의 길이는 정확히 40 오프셋이어야 하며 응답에 대한 데이터 영역의 길이는 0 ~ 500 사이의 오프셋 일 수 있음.
현재까지 조사한 결과를 토대로 분석한 결과, 공격자로 부터 공격받은 후 NTP Monlist Response 패킷 중 "첫 번째 바이트 0xD7 이거나 0x97", "네 번째 바이트 0x2A", "여덟 번째 바이트 0x48" 일 경우 NTP 서버가 CVE-2013-5211 취약점이 존재함.
( 5 ) 취약점 여부 확인
nptdc 도구와 NSE 도구로 영향력을 확인할 수 있음. 명령어 형식은 아래와 같음.
nptdc -c monlist <IP>
nmap -sU -p 123 --script=ntp-monlist.nse <IP>
( 6 ) 해결책
ntpd를 4.2.7 버전으로 업그레이드하거나 NTP 서버에 최근 접속한 시스템 목록을 요청하고 출력하는 monlist 기능을 해제해야 함.
ntp.conf 설정 파일에 아래와 같이 2줄을 추가하면 monlist 기능을 해제시킴.
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
참고 사이트 :
https://blog.cloudflare.com/understanding-and-mitigating-ntp-based-ddos-attacks/
https://thehackernews.com/2014/01/Network-Time-Protocol-Reflection-DDoS-Attack-Tool.html
https://isc.sans.edu/diary/NTP+reflection+attack/17300
https://www.boannews.com/media/view.asp?idx=39359
============================================================
본 게시물은 KOROMOON 님께서 작성하였으며 CCL (Creative Commons License) 에서 "저작자표시-비영리-동일조건변경허락" 이용조건으로 자료를 이용하셔야 합니다.
댓글 없음:
댓글 쓰기