Desavil 88 Zgłoś post Napisano Styczeń 13, 2015 (edytowany) Witam, od kilku dni "obrywam" jakimś atakiem sieciowym na serwer gry Minecraft, a dokładnie po uruchomieniu serwera w netstat widzę kilkadziesiąt połączeń. Serwer gry Minecraft zaczyna nagle zużywać całą dostępną pamięć RAM serwera, aż w końcu wyłącza się - za kazdym razem kilkadziesiąt minut po jego uruchomieniu. Od razu mówię, że problem na pewno nie jest spowodowany jakimiś błędami w pluginach itp. Taka sytuacja ma również miejsce po uruchomieniu całkiem czystego serwera. Ponadto, dla testu zablokowałem cały ruch przychodzący (iptables -I INPUT -j DROP) i dodałem kilka zaufanych adresów IP i wszystko działało dobrze, wystarczy tylko zezwolić wszystkim na połączenia, a problem będzie się powtarzał z zajęciem całej dostępnej pamięci RAM. Próbowałem w różny sposób limitować już ruch za pomocą iptables (np. synflood) i niestety nic z tego. W netstat można zauważyć, że większość połączeń jest z zagranicy, a ich nazwy hostów to np. tor, exitnode, torproxy itp. Na wykresach nie widzę żadnych "szpilek", zwiększonego ruchu sieciowego. Będę wdzięczny, jeżeli ktoś mógłby rzucić okiem na poniższe logi. Przesyłam również plik binarny z logami tcpdump (do odczytania w np. Wireshark), w momencie występowania ataku. Logi tcpdump: https://www.dropbox.com/s/8gjvq21xfphkuh5/tcpdump.bin?dl=0 Wynik polecenia netstat - serwer działa za NATem (lokalizacja OVH) jego adres IP oraz port: 192.168.0.98:20186. Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp6 0 0 :::20196 :::* LISTEN 1370/java tcp6 0 0 :::20186 :::* LISTEN 1370/java tcp6 79816 0 192.168.0.98:20186 194.150.168.95:58779 ESTABLISHED 1370/java tcp6 77440 0 192.168.0.98:20186 94.242.246.23:50608 ESTABLISHED - tcp6 29 0 192.168.0.98:20186 31.175.85.223:52497 CLOSE_WAIT 1370/java tcp6 0 0 192.168.0.98:43131 190.93.246.102:443 TIME_WAIT - tcp6 78150 0 192.168.0.98:20186 5.196.28.199:45739 ESTABLISHED - tcp6 65662 0 192.168.0.98:20186 178.238.223.67:62375 ESTABLISHED - tcp6 77788 0 192.168.0.98:20186 77.95.229.16:59171 ESTABLISHED 1370/java tcp6 0 0 192.168.0.98:34086 107.170.1.65:80 TIME_WAIT - tcp6 67076 0 192.168.0.98:20186 77.247.181.162:46842 ESTABLISHED - tcp6 21 0 192.168.0.98:20186 83.27.18.60:50098 CLOSE_WAIT 1370/java tcp6 78154 0 192.168.0.98:20186 95.130.15.97:59953 ESTABLISHED - tcp6 77602 0 192.168.0.98:20186 18.239.0.140:36777 ESTABLISHED 1370/java tcp6 77822 0 192.168.0.98:20186 176.126.252.11:36359 ESTABLISHED 1370/java tcp6 75682 0 192.168.0.98:20186 94.242.246.23:35013 ESTABLISHED 1370/java tcp6 78156 0 192.168.0.98:20186 94.242.246.24:52230 ESTABLISHED - tcp6 79184 0 192.168.0.98:20186 62.210.74.186:42649 ESTABLISHED - tcp6 77940 0 192.168.0.98:20186 77.95.229.16:60883 ESTABLISHED - tcp6 65420 0 192.168.0.98:20186 37.187.129.166:48503 ESTABLISHED - tcp6 76900 0 192.168.0.98:20186 64.113.32.29:58028 ESTABLISHED 1370/java tcp6 71394 0 192.168.0.98:20186 94.242.246.24:46867 ESTABLISHED 1370/java tcp6 78114 0 192.168.0.98:20186 195.154.251.25:33633 ESTABLISHED - tcp6 80420 0 192.168.0.98:20186 5.196.28.199:42352 ESTABLISHED - tcp6 0 0 192.168.0.98:2535 190.93.245.100:80 TIME_WAIT - tcp6 78370 0 192.168.0.98:20186 77.247.181.162:38742 ESTABLISHED - tcp6 78208 0 192.168.0.98:20186 176.126.252.12:51483 ESTABLISHED - tcp6 65948 0 192.168.0.98:20186 176.126.252.11:58058 ESTABLISHED 1370/java tcp6 66460 0 192.168.0.98:20186 94.242.246.24:56327 ESTABLISHED - tcp6 21 0 192.168.0.98:20186 83.27.18.60:50132 CLOSE_WAIT - tcp6 78370 0 192.168.0.98:20186 77.247.181.162:46975 ESTABLISHED - tcp6 76004 0 192.168.0.98:20186 82.211.223.3:38178 ESTABLISHED 1370/java tcp6 0 0 192.168.0.98:43106 190.93.246.102:443 TIME_WAIT - tcp6 20 0 192.168.0.98:20186 83.8.30.212:59570 CLOSE_WAIT 1370/java tcp6 66428 0 192.168.0.98:20186 64.113.32.29:58102 ESTABLISHED - tcp6 77512 0 192.168.0.98:20186 128.52.128.105:49029 ESTABLISHED - tcp6 66598 0 192.168.0.98:20186 96.47.226.22:60178 ESTABLISHED - tcp6 20 0 192.168.0.98:20186 178.239.10.217:60260 ESTABLISHED - tcp6 21 0 192.168.0.98:20186 83.27.18.60:50133 CLOSE_WAIT - tcp6 76670 0 192.168.0.98:20186 5.196.28.199:39670 ESTABLISHED 1370/java tcp6 77510 0 192.168.0.98:20186 95.130.15.97:47819 ESTABLISHED - tcp6 77810 0 192.168.0.98:20186 176.126.252.11:58449 ESTABLISHED - tcp6 78210 0 192.168.0.98:20186 96.47.226.22:43974 ESTABLISHED - tcp6 79398 0 192.168.0.98:20186 5.196.28.199:39588 ESTABLISHED 1370/java tcp6 77512 0 192.168.0.98:20186 96.44.189.101:56533 ESTABLISHED - tcp6 75758 0 192.168.0.98:20186 176.126.252.12:44915 ESTABLISHED 1370/java tcp6 78548 0 192.168.0.98:20186 37.187.129.166:52988 ESTABLISHED 1370/java tcp6 58 0 192.168.0.98:20186 78.68.10.38:50656 ESTABLISHED - tcp6 0 0 192.168.0.98:20186 62.210.74.186:51981 ESTABLISHED - tcp6 78252 0 192.168.0.98:20186 95.130.15.97:59979 ESTABLISHED - tcp6 79692 0 192.168.0.98:20186 5.196.28.199:44892 ESTABLISHED - tcp6 67376 0 192.168.0.98:20186 64.113.32.29:46567 ESTABLISHED - tcp6 79384 0 192.168.0.98:20186 77.247.181.162:58493 ESTABLISHED 1370/java tcp6 78382 0 192.168.0.98:20186 176.126.252.11:33966 ESTABLISHED - tcp6 77220 0 192.168.0.98:20186 95.130.15.97:42660 ESTABLISHED 1370/java tcp6 67296 0 192.168.0.98:20186 77.247.181.162:38747 ESTABLISHED 1370/java tcp6 77052 0 192.168.0.98:20186 82.211.223.3:54678 ESTABLISHED - tcp6 66710 0 192.168.0.98:20186 91.121.169.33:46798 ESTABLISHED - tcp6 81868 0 192.168.0.98:20186 178.217.187.39:57465 ESTABLISHED 1370/java tcp6 77050 0 192.168.0.98:20186 195.154.251.25:52634 ESTABLISHED - tcp6 76976 0 192.168.0.98:20186 128.52.128.105:41392 ESTABLISHED 1370/java tcp6 16384 0 192.168.0.98:20186 94.242.246.23:57436 ESTABLISHED - tcp6 78648 0 192.168.0.98:20186 5.196.28.199:42743 ESTABLISHED - tcp6 78534 0 192.168.0.98:20186 178.238.223.67:63838 ESTABLISHED - tcp6 66390 0 192.168.0.98:20186 91.121.169.33:50483 ESTABLISHED - tcp6 78050 0 192.168.0.98:20186 82.211.223.3:54608 ESTABLISHED - tcp6 78356 0 192.168.0.98:20186 194.150.168.95:45666 ESTABLISHED - tcp6 77734 0 192.168.0.98:20186 5.196.28.199:39712 ESTABLISHED 1370/java tcp6 78798 0 192.168.0.98:20186 128.52.128.105:45040 ESTABLISHED - tcp6 76788 0 192.168.0.98:20186 96.44.189.101:36869 ESTABLISHED 1370/java tcp6 68788 0 192.168.0.98:20186 5.196.28.199:39594 ESTABLISHED 1370/java tcp6 79474 0 192.168.0.98:20186 5.196.28.199:44898 ESTABLISHED - tcp6 77118 0 192.168.0.98:20186 195.154.251.25:45166 ESTABLISHED - tcp6 68558 0 192.168.0.98:20186 178.238.223.67:63146 ESTABLISHED 1370/java tcp6 78560 0 192.168.0.98:20186 176.126.252.12:33436 ESTABLISHED - tcp6 77958 0 192.168.0.98:20186 5.196.28.199:42343 ESTABLISHED 1370/java tcp6 0 0 192.168.0.98:2516 190.93.245.100:80 TIME_WAIT - tcp6 77144 0 192.168.0.98:20186 5.196.28.199:42346 ESTABLISHED 1370/java tcp6 1 0 192.168.0.98:20186 5.196.178.73:41957 CLOSE_WAIT 1370/java tcp6 0 0 192.168.0.98:29246 107.170.7.99:80 TIME_WAIT - tcp6 79146 0 192.168.0.98:20186 178.217.187.39:56298 ESTABLISHED - tcp6 0 0 192.168.0.98:4687 54.173.214.28:80 TIME_WAIT - tcp6 72144 0 192.168.0.98:20186 96.44.189.100:52293 ESTABLISHED 1370/java tcp6 78176 0 192.168.0.98:20186 176.126.252.11:48591 ESTABLISHED - tcp6 77550 0 192.168.0.98:20186 195.154.251.25:51234 ESTABLISHED 1370/java tcp6 78210 0 192.168.0.98:20186 77.247.181.162:47017 ESTABLISHED - tcp6 0 0 192.168.0.98:2515 190.93.245.100:80 TIME_WAIT - tcp6 66426 0 192.168.0.98:20186 176.126.252.11:54586 ESTABLISHED - tcp6 81296 0 192.168.0.98:20186 79.134.234.200:39367 ESTABLISHED 1370/java tcp6 67538 0 192.168.0.98:20186 77.247.181.162:58507 ESTABLISHED 1370/java tcp6 21 0 192.168.0.98:20186 78.68.10.38:57238 CLOSE_WAIT 1370/java tcp6 78142 0 192.168.0.98:20186 77.247.181.162:38736 ESTABLISHED 1370/java tcp6 78196 0 192.168.0.98:20186 82.211.223.3:46244 ESTABLISHED - tcp6 21 0 192.168.0.98:20186 83.27.18.60:50097 CLOSE_WAIT 1370/java tcp6 0 0 192.168.0.98:29253 107.170.7.99:80 TIME_WAIT - tcp6 77520 0 192.168.0.98:20186 96.44.189.101:45848 ESTABLISHED - tcp6 78466 0 192.168.0.98:20186 91.121.169.33:43178 ESTABLISHED 1370/java tcp6 77884 0 192.168.0.98:20186 37.187.129.166:37370 ESTABLISHED - tcp6 80108 0 192.168.0.98:20186 194.150.168.95:37660 ESTABLISHED - tcp6 77990 0 192.168.0.98:20186 77.247.181.162:58499 ESTABLISHED 1370/java tcp6 79632 0 192.168.0.98:20186 37.187.129.166:37266 ESTABLISHED 1370/java tcp6 82474 0 192.168.0.98:20186 79.134.234.200:40724 ESTABLISHED 1370/java tcp6 78304 0 192.168.0.98:20186 82.211.223.3:46253 ESTABLISHED - tcp6 80142 0 192.168.0.98:20186 95.130.15.97:47869 ESTABLISHED - tcp6 76552 0 192.168.0.98:20186 79.134.234.200:42025 ESTABLISHED - tcp6 76782 0 192.168.0.98:20186 5.196.28.199:44891 ESTABLISHED - tcp6 80954 0 192.168.0.98:20186 178.217.187.39:35466 ESTABLISHED 1370/java tcp6 77598 0 192.168.0.98:20186 37.187.129.166:48620 ESTABLISHED - Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node PID/Program name Path unix 2 [ ] STREAM CONNECTED 1270227278 1370/java unix 2 [ ] STREAM CONNECTED 1270227268 1370/java Edytowano Styczeń 13, 2015 przez Desavil (zobacz historię edycji) Udostępnij ten post Link to postu Udostępnij na innych stronach
Syndrom 95 Zgłoś post Napisano Styczeń 13, 2015 Najszybciej to wyciągać sobie co określony czas adresy IP z tor listy i z automatu dropować: https://check.torproject.org/exit-addresses Następnie można limitować co do krajów i wiele wiele innych zabawek 1 Udostępnij ten post Link to postu Udostępnij na innych stronach
Desavil 88 Zgłoś post Napisano Styczeń 13, 2015 To oczywiście może być dobrym rozwiązaniem, ale myślę że na dłuższą metę niestety nie. :/ Udostępnij ten post Link to postu Udostępnij na innych stronach
Syndrom 95 Zgłoś post Napisano Styczeń 13, 2015 pomyśl poszukaj, tak jak napisałem patentów jest dużo. Możesz np zliczać ilość połączeń z danego IP i powyżej jakiegoś limitu to ban (netstat / sort / uniq / bash / cron ) Udostępnij ten post Link to postu Udostępnij na innych stronach
Desavil 88 Zgłoś post Napisano Styczeń 13, 2015 (edytowany) Z tego co widziałem, ilość połączeń per ip to ok. 3 (z tych atakujących). Tak jak pisałem w pierwszym poście - próbowałem już na różne sposoby to limitować przez iptables i mi nie wyszło. @Edit Dodaję, jak zablokować TORa, może się komuś przyda w przyszłości. Instalujemy pakiety (użyłem ipset, bo jest do tego najlepszy): apt-get install ipset curl Dodajemy (do np. /etc/rc.local) poniższe linie, aby przy starcie/restarcie blokowanie uruchomiło się: ipset create torblock iphash curl -s https://check.torproject.org/exit-addresses | grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" | sort -n | uniq | xargs -n 1 ipset add torblock iptables -I INPUT -m set --match-set torblock src -j DROP Dodajemy do crona (/etc/crontab) poniższą linię, aby codziennie o godz. 2:00 aktualizowało nam listę adresów: 0 2 * * * root ipset flush torblock && curl -s https://check.torproject.org/exit-addresses | grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" | sort -n | uniq | xargs -n 1 ipset add torblock Oczywiście można byłoby to zrobić bez wyrażeń regularnych (komendy byłyby krótsze), ale lepiej użyć tego jako dodatkowego zabezpieczenia, jakby zamiast adresu IP, podali np. jakieś "rm" i wykonałoby nam się to przez "xargs". Jeżeli ktoś ma jeszcze jakieś warte uwagi listy z adresami IP, które warto zablokować, prosiłbym o umieszczenie ich tutaj. Edytowano Styczeń 13, 2015 przez Gość (zobacz historię edycji) Udostępnij ten post Link to postu Udostępnij na innych stronach
Desavil 88 Zgłoś post Napisano Styczeń 17, 2015 Po zablokowaniu ruchu z TORa przez ok. 1-2 dni był spokój. Teraz znów to samo i leci z wszystkich lokalizacji, uk, ovh, leaseweb i inne, więc blokowanie po geolokalizacji tutaj się nie sprawdzi, gdyż musiałbym odciąć praktycznie cały świat, a zostawić tylko Polskę co nie wchodzi w grę. Jakby to były adresy z samych Chin, Rosji to jeszcze nie byłoby problemu. Po uruchomieniu serwera widzę, kilkadziesiąt połączeń z różnych adresów IP. Postanowiłem zablokować cały ruch przychodzący i zaakceptować dowolny losowy adres IP z tej listy, włączyłem logowanie pakietów dla tego adresu IP i serwer też się wyłączył, czyli najprawdopodobniej wysyłane jest to samo przez wszystkie hosty, a tak naprawdę wystarczy tylko atak z jednego serwera. Od początku do końca (do momentu out of memory, kiedy aplikacja już wyłączyła się w wyniku ataku) posiadam logi binarne tcpdump - https://www.dropbox.com/s/niotztxrzlkzauk/tcpdump2.bin?dl=0 Zastanawiam się co jeszcze mogę tutaj zrobić, aby zablokować skutecznie ten atak. Z tego co widać serwer atakujący wysyła dużą ilość pakietów ACK, ale widać też że SYN Flood to nie jest, gdyż nie widać dużo pakietów tego typu. Udostępnij ten post Link to postu Udostępnij na innych stronach
Bartosz Z 236 Zgłoś post Napisano Styczeń 17, 2015 Może warto w tej sprawie napisać do twórców MineCrafta, Bukkita czy czego tam używasz? Udostępnij ten post Link to postu Udostępnij na innych stronach
Desavil 88 Zgłoś post Napisano Styczeń 17, 2015 Chyba będę musiał, bo przez iptables tego nie zablokuje na to wygląda. Udostępnij ten post Link to postu Udostępnij na innych stronach
Bartosz Z 236 Zgłoś post Napisano Styczeń 17, 2015 Ja wiem, że za czasów serwerów CS 1.6 na HLDS, to takie ataki blokowało się na poziomie dodatku do silnika gry, a nie na poziomie sieci Do Bukkita są filtry na pobieranie zbyt dużej ilości kawałków (chunks'ów) jednocześnie, więc może na takie ataki też się da coś napisać.. Udostępnij ten post Link to postu Udostępnij na innych stronach
Pan Kot 1535 Zgłoś post Napisano Styczeń 18, 2015 Jeśli osoba używająca tych ataków ma głowę to jest w stanie w prosty sposób napisać sobie bota, który inicjuje poprawne połączenie TCP z serwerem MC, przez co wymusza na serwerze alokację zasobów, tak jakby było to połączenie od nowego gracza. Ja bym zrobił limit np. 5 nowych SYNów na dany port w ciągu sekundy, jeśli wartość przekroczy limit to DROP wszystkich kolejnych SYNów na ten port przez np. 120 sekund. To skutecznie zatrzyma boty i nie odłączy aktywnych graczy, ale zablokuje wszystkim drzwi w trakcie ataku. To wszystko jest do napisania w iptables, ale nie chce mi się dawać ci gotowego rozwiązania, pogłówkuj. Udostępnij ten post Link to postu Udostępnij na innych stronach
Desavil 88 Zgłoś post Napisano Styczeń 18, 2015 (edytowany) Do Bukkita są filtry na pobieranie zbyt dużej ilości kawałków (chunks'ów) jednocześnie, więc może na takie ataki też się da coś napisać.. Przez ostatnie kilka dni próbowałem znaleźć w internetach coś na wzór tego jakim atakiem obrywam, w skrócie atak który powoduje zużycie całej dostępnej ilości pamięci RAM przez serwer w szybkim tempie, aż proces zostaje zabity (testowałem na serwerach 16GB RAM, 32GB RAM, 64GB RAM), więc metoda ataku jest taka sama. Nigdzie nie znalazłem informacji, aby ktoś miał podobne problemy. Ja bym zrobił limit np. 5 nowych SYNów na dany port w ciągu sekundy, jeśli wartość przekroczy limit to DROP wszystkich kolejnych SYNów na ten port przez np. 120 sekund. To skutecznie zatrzyma boty i nie odłączy aktywnych graczy, ale zablokuje wszystkim drzwi w trakcie ataku. To wszystko jest do napisania w iptables, ale nie chce mi się dawać ci gotowego rozwiązania, pogłówkuj. Tak też myślałem na początku, ale to się nie sprawdzi niestety (chyba, że się mylę). Dla przykładu, dla którego przeprowadziłem test -zablokowałem cały ruch przychodzący i odblokowałem tylko jedno losowe IP z poprzedniego ataku, widać że jeden host może spowodować takie zachowanie serwera. A w logach z tcpdumpa (https://www.dropbox.com/s/niotztxrzlkzauk/tcpdump2.bin?dl=0) widać, że SYNów było tylko 6 i to w dużych odstępach. Najwięcej było pakietów ACK i PSH, ACK (tych nieco mniej), bo aż 2948 z adresu IP źródłowego hosta atakującego - wszystko od momentu uruchomienia serwera (rozpoczęcie ataku), aż do zakończenia ataku (wyłączenie się serwera z powodu out of memory procesu). Oczywiście nie chodzi mi tutaj też o jakieś gotowe rozwiązania, tylko o jakieś nakierowanie mnie na co mam zwrócić uwagę, aby zablokować ten atak. Edytowano Styczeń 18, 2015 przez Desavil (zobacz historię edycji) Udostępnij ten post Link to postu Udostępnij na innych stronach
Misiek08 285 Zgłoś post Napisano Styczeń 18, 2015 U klienta pomogła blokada wszystkich exit node'ów TORa. Teraz pracuję nad dodatkowym proxy jeszcze przed BungeeCord'em, żeby uwalać wszystkich powolnych ludzików, bo z tego co widziałem to otwiera się kilkaset połączeń i powolo wysyłają niepełne pakiety MC lub jakiś syf i wtedy serwer i BC się zapychają czekając na poprawny pakiet. Dodatkowo sam serwer nie zawsze ogarnia kolejność i potrafi przyjąć pakiety np. z danymi ruchu gry bez wcześniejszego logowania i wtedy w konsoli sypie się tyle NPE, że putty nie ogarnia. Problem dotknął ostatnio wiele serwerów, głównie hostujących się w OVH, ale nie tylko. Trzeba samemu analizować i blokować, bo do wczoraj gotowych łatek nie było. Udostępnij ten post Link to postu Udostępnij na innych stronach
Desavil 88 Zgłoś post Napisano Styczeń 18, 2015 Fakt, z tym TORem sprawdza się. Musiałem ustawić jeszcze częstszą aktualizację list exit nodów, niż raz dziennie. Udostępnij ten post Link to postu Udostępnij na innych stronach
Pan Kot 1535 Zgłoś post Napisano Styczeń 18, 2015 ACKi per client też da się limitować i sprawdzać czy przewyższają pewną wartość. Tyle, że z tego co opisujecie to bug jest w samym serwerze, a nie samym ruchu. Aplikacja zawsze powinna być przygotowana na anomalie. Udostępnij ten post Link to postu Udostępnij na innych stronach