위협 주의보: mDNS 반사 DDoS

저자: 윌버 메히아(Wilber Mejia)

개요

2015년 3분기 말부터 Akamai SIRT는 mDNS(멀티캐스트 도메인 네임 시스템) 지원 디바이스가 DDoS 공격에 제한적으로 이용되는 양상을 관측하기 시작했습니다. 또한, 2015년 3월 반사 및 증폭 DDoS 공격에서 mDNS가 사용될 수 있다는 사실도 알게 되었습니다.

이 위협 보고서는 mDNS 반사 공격 기법의 개념과 기술에 대한 정보와 이를 방어하는 방법을 자세히 설명합니다. mDNS는 인터넷을 통해 주로 5353 포트에서 사용되며, 이 mDNS가 노출되는 소스 디바이스의 가용성을 통해 이 공격 기법이 이용될 수 있습니다.

2016년 10월, Akamai는 게임 업계와 소프트웨어 및 기술 업계를 대상으로 발생한 일곱 차례의 mDNS DDoS 공격을 탐지하고 성공적으로 방어했습니다. 실제 공격에서 관찰된 특성으로 볼 때 이 공격이 얼마나 오랜 기간 지속될지 현재는 예측하기 어렵습니다.

공격 타임라인

mDNS 공격 기법은 2015년 9월 최초로 관찰된 이후 산발적으로 일어났습니다. 아래 타임라인에서 알 수 있듯이, 최초 공격과 그다음 공격 간에 약 5개월의 공백이 있었는데, 이는 공격 스크립트의 초기 테스트 결과 때문일 수 있습니다. 2016년 3월 말, 4월 초 이후에는 공격 기법이 보다 지속적으로 사용되기 시작했습니다. 하지만, 현재까지 단일 기법으로 mDNS를 사용하는 공격은 다른 반사 기법에 비해 위력이 강하지 않았습니다.

mDNS attack timeline

공격의 주요 특성

다음 섹션에서는 2016년에 발생한 공격을 중점적으로 설명하겠습니다. 지금까지 방어한 일곱 차례의 공격은 모두 다른 대상을 겨냥하여 일어났습니다.

  • 최대 대역폭: 초당 2.9기가비트(Gbps)
  • 초당 최대 패킷 수: 초당 465,200패킷
  • 공격 기법: mDNS
  • 소스 포트: 5353(mDNS)
  • 대상 포트: 무작위


17:07:32.071836 IP Z.Z.Z.Z.5353 > X.X.X.X.80: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local. (104)

17:07:32.071857 IP Z.Z.Z.Z.5353 > X.X.X.X.80: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local. (104)

17:07:32.071873 IP Z.Z.Z.Z.5353 > X.X.X.X.80: 0*- 4/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local., PTR _http._tcp.local., PTR _rfb._tcp.local. (143)

17:07:32.072187 IP Z.Z.Z.Z.5353 > X.X.X.X.80: 0*- 3/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local., PTR _ipp._tcp.local. (123)

17:07:32.072274 IP Z.Z.Z.Z.5353 > X.X.X.X.80: 0*- 3/0/0 PTR _workstation._tcp.local., PTR _https._tcp.local., PTR _http._tcp.local. (119)

17:07:32.072279 IP Z.Z.Z.Z.5353 > X.X.X.X.80: 0*- 4/0/0 PTR _pdl-datastream._tcp.local., PTR _printer._tcp.local., PTR _ipp._tcp.local., PTR _http._tcp.local. (143)

17:07:32.072295 IP Z.Z.Z.Z.5353 > X.X.X.X.80: 0*- 8/0/0 PTR _workstation._tcp.local., PTR _webdavs._tcp.local., PTR _webdav._tcp.local., PTR _smb._tcp.local., PTR _sftp._tcp.local., PTR _http._tcp.local., PTR _afpovertcp._tcp.local., PTR _device-info._tcp.local. (235)

17:07:32.072361 IP 193.147.161.117.5353 > X.X.X.X.80: 0*- 7/0/0 PTR _workstation._tcp.local., PTR _ftp._tcp.local., PTR _edcp._udp.local., PTR _afpovertcp._tcp.local., PTR _device-info._tcp.local., PTR _smb._tcp.local., PTR _http._tcp.local. (209)

마지막으로 기록된 mDNS 공격은 2016년 10월 27일에 발생했습니다. SYN Flood, UDP Flood, UDP Fragment, DNS Flood 및 mDNS Flood로 이루어진 멀티벡터 DDoS 공격이었으며, 최고 트래픽은 41Gbps였습니다.

  • 이벤트 시작 시간: 2016년 10월 27일 06:01:00 UTC
  • 최대 대역폭: 41Gbps
  • 초당 최대 패킷 수: 초당 6백만 패킷
  • 공격 기법: SYN Flood, UDP Flood, UDP Fragment, DNS Flood, mDNS Flood
  • 소스 포트: 무작위
  • 대상 포트: 무작위

 

mDNS Flood

 

06:05:36.522973 IP X.X.X.X.5353 > X.X.X.X.80: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local. (104)

06:05:36.522976 IP X.X.X.X.53301 > X.X.X.X.80: Flags [R], seq 194989615, win 0, length 0

06:05:36.523036 IP X.X.X.X.5353 > X.X.X.X.80: 0*- 4/0/0 PTR _workstation._tcp.local., PTR _http._tcp.local., PTR _device-info._tcp.local., PTR _smb._tcp.local. (144)

06:05:36.523040 IP X.X.X.X.5353 > X.X.X.X.80: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _ssh._tcp.local. (97)

06:05:36.523102 IP X.X.X.X.5353 > X.X.X.X.80: 0*- 3/0/0 PTR _workstation._tcp.local., PTR _https._tcp.local., PTR _http._tcp.local. (119)

06:05:36.523114 IP X.X.X.X.5353 > X.X.X.X.80: 0*- 3/0/0 PTR _workstation._tcp.local., PTR _ssh._tcp.local., PTR _sftp-ssh._tcp.local. (121)

06:05:36.523147 IP X.X.X.X.5353 > X.X.X.X.80: 0*- 4/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local., PTR _ssh._tcp.local., PTR _sftp-ssh._tcp.local. (147)

06:05:36.523168 IP X.X.X.X.5353 > X.X.X.X.80: 0*- 3/0/0 PTR _workstation._tcp.local., PTR _https._tcp.local., PTR _http._tcp.local. (119)

06:05:36.523221 IP X.X.X.X.5353 > X.X.X.X.80: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _ssh._tcp.local. (97)

06:05:36.523285 IP X.X.X.X.5353 > X.X.X.X.80: 0*- 3/0/0 PTR _workstation._tcp.local., PTR _ssh._tcp.local., PTR _sftp-ssh._tcp.local. (121)

06:05:36.523313 IP X.X.X.X.5353 > X.X.X.X.80: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _sftp-ssh._tcp.local. (102)

06:05:36.523322 IP X.X.X.X.58727 > X.X.X.X.80: Flags [R.], seq 2670641259, ack 2670641259, win 1400, length 0

 

SYN Flood

6:01:35.894589 IP X.X.X.X.28970 > X.X.X.X.80: Flags [SEW], seq 4054777856, win 0, length 0

06:01:35.894639 IP X.X.X.X.1028 > X.X.X.X.80: Flags [SEW], seq 1405550592, win 0, length 0

06:01:35.894646 IP X.X.X.X.50021 > X.X.X.X.80: Flags [SEW], seq 3309240320, win 0, length 0

06:01:35.894655 IP X.X.X.X.40602 > X.X.X.X.80: Flags [SEW], seq 2493120512, win 0, length 0

06:01:35.894658 IP X.X.X.X.3847 > X.X.X.X.80: Flags [SEW], seq 1046675456, win 0, length 0

06:01:35.894658 IP X.X.X.X.21163 > X.X.X.X.80: Flags [SEW], seq 2160787456, win 0, length 0

 

UDP Flood

06:08:36.313095 IP X.X.X.X.42862 > X.X.X.X.80: UDP, length 1

06:08:36.313768 IP X.X.X.X.648 > X.X.X.X.80: UDP, length 11

06:08:36.314002 IP X.X.X.X.60399 > X.X.X.X.80: UDP, length 6

06:08:36.322169 IP X.X.X.X.19246 > X.X.X.X.80: UDP, length 9

06:08:36.327485 IP X.X.X.X.22952 > X.X.X.X.80: UDP, length 11

06:08:36.327764 IP X.X.X.X.55095 > X.X.X.X.80: UDP, length 9

 

UDP fragment

06:06:43.088487 IP X.X.X.X > X.X.X.X: udp

06:06:43.088489 IP X.X.X.X > X.X.X.X: udp

06:06:43.088501 IP X.X.X.X > X.X.X.X: udp

06:06:43.088504 IP X.X.X.X > X.X.X.X: udp

06:06:43.088507 IP X.X.X.X > X.X.X.X: udp



DNS 반사

06:16:34.508072 IP Z.Z.Z.Z.53 > X.X.X.X.23130: 28397| 20/0/1 MX stagg.cpsc.gov. 5, MX hormel.cpsc.gov. 5, TXT "v=spf1 ip4:x.x.x.x ip4:x.x.x.x ip4:X.X.X.X mx a:list.cpsc.gov -all", A x.x.x.x, AAAA 2600:803:240::2, DNSKEY, DNSKEY, DNSKEY, DNSKEY, Type51, RRSIG[|domain]

06:16:34.508077 IP Z.Z.Z.Z.53 > X.X.X.X.23130: 28397| 20/0/1 MX hormel.cpsc.gov. 5, MX stagg.cpsc.gov. 5, TXT "v=spf1 ip4: X.X.X.X ip4:X.X.X.X ip4:X.X.X.X mx a:list.cpsc.gov -all", A x.x.x.x, AAAA 2600:803:240::2, DNSKEY, DNSKEY, DNSKEY, DNSKEY, Type51, RRSIG[|domain]

06:16:34.508409 IP Z.Z.Z.Z.53 > X.X.X.X.10157: 32564 14/2/0 MX stagg.cpsc.gov. 5, MX hormel.cpsc.gov. 5, DNSKEY, DNSKEY, DNSKEY, DNSKEY, RRSIG,[|domain]

공격 및 mDNS 개요

멀티캐스트 DNS(mDNS)는 2013년에 RFC6762로 릴리스된 제안 표준 프로토콜입니다. 소규모 네트워크에서 간편하게 디바이스와 서비스를 검색하는 데 적합하며, 사용자의 상호 작용이 전혀 필요 없거나 최소한만 필요합니다. 이런 이점 덕분에 mDNS는 무설정 네트워킹(zeroconf)의 구성 요소로서도 적합합니다. mDNS는 대체로 일반적인 DNS 패킷과 공유하는 구조가 동일하기 때문에, 비슷한 이유로 DDoS 공격 기법으로 빠르게 이용되었습니다.

물론, 디바이스를 연결하자마자 사용할 수 있도록 설계된 프로토콜의 편의성 때문에 리스크가 있기도 합니다. 채드 시먼(Chad Seaman)은 mDNS가 로컬 네트워크 외부에서 발생하는 쿼리에 응답할 수 있다는 mDNS의 취약점(VU#550620)을 발견했습니다. 이러한 응답으로 인해 소프트웨어나 서비스 등 영향을 받은 디바이스에 대한 정보뿐만 아니라 호스트 이름, 내부 네트워크 설정 사항, 모델 번호 등의 기타 민감한 정보까지 노출될 수 있습니다. 이 피드백으로 악의적 공격자가 인터넷에 연결된 인터페이스를 통해 유니캐스트 쿼리에 응답하는 mDNS 호스트를 사용하여 DDoS 반사 및 증폭 공격에 가담할 수 있습니다. 취약점에 대한 자세한 정보는 여기에서 확인할 수 있습니다.

유사한 개념을 이용하여 악의적인 공격자가 만든 mDNS 공격 스크립트는 mDNS 디바이스에서 응답을 유도하는 특수한 유니캐스트 쿼리를 전송합니다. RFC6763에 정의된 서비스 열거 쿼리는 네트워크에서 전파된 모든 서비스 유형을 반환하는 데 유용합니다. 이 공격 스크립트는 다음 그림에 표시된 바와 같이 "_services._dns-sd._udp.local" DNS 쿼리를 취약한 호스트로 전송하는 46바이트의 페이로드 쿼리를 생성합니다. 이렇게 하면 모든 알려진 서비스가 요청 중인 디바이스로 반환됩니다. 전파된 서비스가 각각 다양한 응답 크기로 쿼리될 수도 있어 공격자가 더 많은 기회를 포착할 수 있습니다. 하지만, 이 전술을 행하려면 DDoS 공격에서 추가적인 응답 페이로드를 쉽게 활용할 수 있는 보다 정교한 공격 툴이 필요합니다.

 

공격 스크립트 UDP 페이로드 데이터 구조:

 

0000000: 0000 0000 0001 0000 0000 0000 095f 7365  ............._se

0000010: 7276 6963 6573 075f 646e 732d 7364 045f  rvices._dns-sd._

0000020: 7564 7005 6c6f 6361 6c00 000c 0001       udp.local.....

 

현재까지 DDoS 공격에서 관찰된 mDNS 응답 페이로드는 크기 면에서 한계가 있었습니다. 가장 큰 규모의 공격은 428바이트의 데이터를 포함했고, 이는 단일 NTP monlist 데이터 응답 패킷보다 12바이트 적습니다. 하지만, 관찰되는 일반적인 mDNS 응답 크기는 약 100-200바이트입니다. 단순히 46바이트 요청 페이로드 및 200바이트 페이로드 응답이라고 고려하면, 이 기법은 일반적으로 약 4.35배 증폭된 것입니다.

샘플 공격 스크립트 사용 및 신호

mDNS에 대해 만들어진 공격 스크립트는 현재 UDP 반사 및 증폭 공격에서 사용 가능한 다양한 스크립트의 수정 버전입니다. 사용은 다른 스크립트와 유사합니다. 대상 IP, 대상 포트, 인터넷에 있는 mDNS 디바이스 목록, 스레드, 패킷 스로틀 속도를 제공하기만 하고, 최종적으로 런타임을 공격합니다. 그런 다음 스크립트가 tcpdump를 통해 다음 그림에서 관찰된 악의적인 46바이트 쿼리를 전송할 때 대상 IP로 가장합니다.

 

18:37:12.565541 IP Z.Z.Z.Z.13763 > X.X.X.X.5353: 0 PTR (QM)? _services._dns-sd._udp.local. (46)

18:37:12.565908 IP Z.Z.Z.Z.13763 > X.X.X.X.188.5353: 0 PTR (QM)? _services._dns-sd._udp.local. (46)

18:37:12.566332 IP Z.Z.Z.Z.13763 > X.X.X.X.188.5353: 0 PTR (QM)? _services._dns-sd._udp.local. (46)

18:37:12.566726 IP Z.Z.Z.Z.13763 > X.X.X.X.188.5353: 0 PTR (QM)? _services._dns-sd._udp.local. (46)

18:37:12.567137 IP Z.Z.Z.Z.13763 > X.X.X.X.188.5353: 0 PTR (QM)? _services._dns-sd._udp.local. (46)

18:37:12.567507 IP Z.Z.Z.Z.13763 > X.X.X.X.5353: 0 PTR (QM)? _services._dns-sd._udp.local. (46)

18:37:12.567895 IP Z.Z.Z.Z.13763 > X.X.X.X.5353: 0 PTR (QM)? _services._dns-sd._udp.local. (46)

18:37:12.568274 IP Z.Z.Z.Z.13763 > X.X.X.X.5353: 0 PTR (QM)? _services._dns-sd._udp.local. (46)

18:37:12.568672 IP Z.Z.Z.Z.13763 > X.X.X.X.5353: 0 PTR (QM)? _services._dns-sd._udp.local. (46)

18:37:12.569069 IP Z.Z.Z.Z.13763 > X.X.X.X.5353: 0 PTR (QM)? _services._dns-sd._udp.local. (46)

연구소 테스트에서는 mDNS 수신기와 함께 Linux 서버 설정으로 쿼리가 전송되었습니다. 다음 그림에서는 기본 응답을 볼 수 있습니다.

 

18:38:10.252994 IP Z.Z.Z.Z.5353 > X.X.X.X.47070: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local. (104)

18:38:10.253256 IP Z.Z.Z.Z.5353 > X.X.X.X.47070: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local. (104)

18:38:10.253694 IP Z.Z.Z.Z.5353 > X.X.X.X.47070: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local. (104)

18:38:10.254043 IP Z.Z.Z.Z.5353 > X.X.X.X.47070: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local. (104)

18:38:10.254394 IP Z.Z.Z.Z.5353 > X.X.X.X.47070: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local. (104)

18:38:10.254739 IP Z.Z.Z.Z.5353 > X.X.X.X.47070: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local. (104)

18:38:10.255098 IP Z.Z.Z.Z.5353 > X.X.X.X.47070: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local. (104)

18:38:10.255458 IP Z.Z.Z.Z.5353 > X.X.X.X.47070: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local. (104)

18:38:10.255823 IP Z.Z.Z.Z.5353 > X.X.X.X.47070: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local. (104)

18:38:10.256193 IP Z.Z.Z.Z.5353 > X.X.X.X.47070: 0*- 2/0/0 PTR _workstation._tcp.local., PTR _udisks-ssh._tcp.local. (104)

2016년 11월 4일 Shadowserver Foundation은 mDNS 쿼리에 응답한 526,245개의 고유한 IP에서 mDNS(5353/UDP) 스캔을 완료했습니다. 다음 그래프는 최신 스캔에 따라 액세스 가능한 mDNS가 포함된 상위 20개 국가 및 ASN을 나타냅니다.

mDNS Source Distribution Countries
mDNS Source Distribution ASNs

방어 방법

다음은 로컬 네트워크 내에서 사용하도록 설계된 프로토콜 중 하나입니다. 이와 같이, 인터넷을 통해 mDNS 디바이스를 노출할 이유는 없습니다. 필요한 경우 수신되는 쿼리를 필터링하고 알려진 소스만 허용하는 것이 좋은 방법입니다. 쿼리를 탐지하는 데 Snort 같은 IDS를 추가적으로 사용하여 DDoS 공격으로부터 디바이스 사용을 보다 효과적으로 방어할 수 있습니다. 샘플 Snort 탐지 룰은 다음과 같습니다.

 

alert udp $EXTERNAL_NET !5353 -> $HOME_NET 5353 \

(msg: "mDNS DDoS Abuse request"; \

flow: to_server; \

content: "|00 00 00 00 00 01 00 00 00 00 00 00 09 5f 73 65 72 76 69 63 65 73 07 5f 64 6e 73 2d 73 64 04 5f 75 64 70 05 6c 6f 63 61 6c 00 00 0c 00 01|"; dsize:46<>46; \

classtype:Reflection-Abuse; \

sid: 201600004; rev:1;)

결론

mDNS 공격 기법은 지금까지만 해도 제한적으로 사용되고 있습니다. 이 기법은 SSDP처럼 홈 네트워크 내의 디바이스에서 악용될 가능성이 높습니다. 초기 공격은 미약했지만 방어 플랫폼을 통해 매일 mDNS 포트 5353 스캔이 관찰되었습니다. 디바이스가 많이 열거되면 공격 규모가 커질 수 있습니다. 또한, 이 프로토콜을 불필요하게 노출하는 행위를 기반으로 한 SSDP처럼, ISP가 가정용 디바이스 사용자에게 이 포트의 필터링을 도입함에 따라 mDNS가 DDoS 공격 기법으로 널리 사용되지 않을 수 있습니다. 사용된 지 수년이 지난 지금도 SSDP는 매일 지속적으로 사용되고 있으며, 여전히 대규모 DDoS 공격이 발생할 가능성이 있습니다. 즉, 제대로 된 사전 필터링을 적용하기 전에 mDNS 공격이 더욱 강력해질 수 있습니다.

참조