Od sobotniego popołudnia na moim serwerze, na którym znajduje się około 25 stron na Wordpress, zaczęły się dzikie przerwy. Ponieważ udało mi się przetrwać poprzednie ataki ( , ) bez zauważenia, nie od razu zrozumiałem, co jest nie tak.
Kiedy się domyśliłem, okazało się, że jest poszukiwanie haseł + dużo próśb do XMLRPC.
W efekcie udało się to wszystko odciąć, choć nie od razu. Przez kota trzy prosty odbiór jak tego uniknąć.
Te techniki są najprawdopodobniej znane wszystkim, ale nadepnąłem na kilka grabi, których nie znalazłem w opisach - nagle zaoszczędzi to komuś czas.
1. Zatrzymujemy enumerację, wtyczkę Limit Login Attempts - ujmujemy dokładnie, ponieważ inne zabezpieczenia mocno zawieszają serwer np. podczas używania Logowanie do wtyczki Serwer Security Solution zgasł w pół godziny, wtyczka mocno ładuje bazę danych.
W ustawieniach upewnij się, że zaznaczyłeś pole wyboru "Dla proxy" - w przeciwnym razie określi IP twojego serwera dla wszystkich i automatycznie zablokuje wszystkich.
AKTUALIZACJA, dzięki, szczegóły poniżej w komentarzach - włączamy checkbox „Dla proxy” tylko wtedy, gdy definicja nie działa, gdy włączone jest „Połączenie bezpośrednie”
2. Wyłącz XML-RPC - wtyczka Wyłącz XML-RPC (po prostu aktywuj i to wszystko).
3. Zamknij wp-login.php - jeśli uzyskujesz dostęp do witryny przez ip, wtyczka nie działa, a zbieracze nadal wbijają się w witrynę. Aby tego uniknąć, dodaj do .htaccess:
Kopiujemy plik wp-login, zmieniamy jego nazwę na dowolną dziwną nazwę, na przykład poletnormalny.php i wewnątrz pliku zmieniamy wszystkie napisy wp-login.php na poletnormalny.php przez autokorektę.
Wszystko, teraz masz dostęp do panelu administracyjnego tylko przez swój plik.
Po tych 3 prostych krokach strony znów zaczęły latać i nastał pokój.
No, nagle jest ciekawie
Jedną z opcji jest to, jak zobaczyć, że jesteś atakowany. Można to zobaczyć w logach nginx (na przykład tutaj jest ścieżka do pliku Debian /var/log/nginx access.log).Wprowadzenie do XML-RPC
Istnieje wiele różnych zasobów w sieci Web, które dostarczają użytkownikom pewnych informacji. Nie chodzi tu o zwykłe strony statyczne, ale np. o dane pobrane z bazy danych lub archiwów. Może to być archiwum danych finansowych (kursy walut, dane o notowaniach papierów wartościowych), dane pogodowe lub bardziej obszerne informacje - newsy, artykuły, wiadomości z forów. Takie informacje mogą być prezentowane odwiedzającemu stronę np. poprzez formularz, jako odpowiedź na zapytanie, lub mogą być każdorazowo dynamicznie generowane. Ale trudność polega na tym, że często takie informacje są potrzebne nie tyle użytkownikowi końcowemu - osobie, ale innym systemom, programom, które będą wykorzystywać te dane do swoich obliczeń lub innych potrzeb.
Przykład z życia: strona w witrynie bankowej, która wyświetla notowania walut. Jeśli wchodzisz na stronę jako zwykły użytkownik, za pośrednictwem przeglądarki widzisz cały projekt strony, banery, menu i inne informacje, które „oprawiają” prawdziwy cel wyszukiwania - notowania walut. Jeśli musisz wprowadzić te cytaty do swojego sklepu internetowego, nie pozostaje nic innego, jak ręcznie wybrać potrzebne dane i przenieść je na swoją stronę internetową za pomocą schowka. I musisz to robić codziennie. Czy naprawdę nie ma wyjścia?
Jeśli rozwiążemy problem czołowo, to rozwiązanie natychmiast sugeruje samo: program (skrypt na stronie), który potrzebuje danych, otrzymuje stronę z serwera jako „zwykły użytkownik”, parsuje (parsuje) otrzymany kod html i wyodrębnia niezbędne informacje z niego. Można to zrobić lub normalnie Wyrażenie regularne lub za pomocą dowolnego parsera html. Złożoność podejścia polega na jego nieefektywności. Po pierwsze, aby uzyskać niewielką porcję danych (dane o walutach to dosłownie kilkanaście lub dwa znaki), trzeba pobrać całą stronę, czyli co najmniej kilkadziesiąt kilobajtów. Po drugie, przy każdej zmianie w kodzie strony, na przykład zmianie wyglądu lub czegoś innego, nasz algorytm parsowania będzie musiał zostać przerobiony. Tak, i przyzwoicie dobierze zasoby.
Dlatego twórcy podjęli decyzję – konieczne jest opracowanie pewnego rodzaju uniwersalnego mechanizmu, który pozwoli na przejrzystą (na poziomie protokołu i medium transmisyjnego) i łatwą wymianę danych między programami, które mogą znajdować się w dowolnym miejscu, być napisane w dowolnym języku i biegnij pod jakimkolwiek system operacyjny i na dowolnej platformie sprzętowej. Taki mechanizm jest obecnie nazywany głośnymi terminami „usługi sieciowe” (usługa internetowa), „SOAP”, „architektura zorientowana na usługi” (architektura zorientowana na usługi). Do wymiany danych wykorzystywane są otwarte i sprawdzone w czasie standardy – do przesyłania wiadomości używany jest protokół HTTP (choć można stosować inne protokoły – np. SMTP). Same dane (w naszym przykładzie kursy walut) są przesyłane w formacie wieloplatformowym – w postaci dokumentów XML. W tym celu wymyślono specjalny standard - MYDŁO.
Tak, teraz usługi sieciowe, SOAP i XML są na ustach wszystkich, zaczynają być aktywnie wdrażane, a duże korporacje, takie jak IBM i Microsoft, wypuszczają nowe produkty zaprojektowane, aby pomóc w całkowitym przyjęciu usług internetowych.
Ale! Dla naszego przykładu z kursami walut, które trzeba przenieść ze strony banku do silnika sklepu internetowego, takie rozwiązanie będzie bardzo trudne. Przecież sam opis standardu SOAP zajmuje nieprzyzwoite półtora tysiąca stron, a to nie wszystko. Dla praktycznego zastosowania będziesz musiał nauczyć się pracować z zewnętrznymi bibliotekami i rozszerzeniami (tylko od PHP 5.0 zawiera bibliotekę do pracy z SOAP), napisać setki i tysiące linii kodu. A wszystko to po to, aby uzyskać kilka liter i cyfr, jest oczywiście bardzo ciężkie i irracjonalne.
Jest więc jeszcze jeden, z naciągiem można powiedzieć, alternatywny standard wymiany informacji – XML-RPC. Został opracowany przy udziale Microsoft przez UserLand Software Inc i jest przeznaczony do ujednoliconego przesyłania danych między aplikacjami przez Internet. Może zastąpić SOAP podczas budowania prostych usług, w których nie są potrzebne wszystkie „korporacyjne” funkcje prawdziwych usług internetowych.
Co oznacza skrót XML-RPC? RPC to skrót od Remote Procedure Call - zdalne wywołanie procedury. Oznacza to, że aplikacja (czy to skrypt na serwerze, czy zwykła aplikacja na komputer kliencki) może w sposób przezroczysty używać metody, która jest fizycznie zaimplementowana i wykonywana na innym komputerze. XML jest tu używany, aby zapewnić uniwersalny format opisu przesyłanych danych. Jako transport do przesyłania wiadomości wykorzystywany jest protokół HTTP, który pozwala na swobodną wymianę danych za pośrednictwem dowolnych urządzeń sieciowych – routerów, firewalli, serwerów proxy.
Aby z niego skorzystać, trzeba mieć: serwer XML-RPC, który udostępnia jedną lub więcej metod, klienta XML-RPC, który potrafi sformować poprawne żądanie i przetworzyć odpowiedź serwera, a także znać parametry serwera niezbędne do powodzenia operacja - adres, nazwa metody i przekazane parametry.
Cała praca z XML-RPC odbywa się w trybie „request-response”, jest to jedna z różnic między technologią a standardem SOAP, gdzie istnieją zarówno koncepcje transakcji, jak i możliwość wykonywania odroczonych połączeń (gdy serwer zapisuje żądanie i odpowiada na nie w określonym czasie w przyszłości). Te dodatkowe funkcje bardziej przydatne w przypadku wydajnych usług korporacyjnych, znacznie komplikują rozwój i obsługę serwerów oraz nakładają dodatkowe wymagania na deweloperów rozwiązań klienckich.
Procedura pracy z XML-RPC rozpoczyna się od utworzenia żądania. Typowe żądanie wygląda tak:
POST/RPC2 HTTP/1.0
User-Agent: eshop-test/1.1.1 (FreeBSD)
Host: serwer.localnet.com
Typ treści: tekst/xml
długość treści: 172
Pierwsze wiersze tworzą standardowy nagłówek żądania HTTP POST. Wymagane parametry obejmują host, typ danych (typ MIME), którym musi być tekst/xml, oraz długość wiadomości. Norma określa również, że pole User-Agent musi być wypełnione, ale może zawierać dowolną wartość.
Następnie pojawia się normalny nagłówek dokumentu XML. Główny element żądania -
Linia
Następnie ustawiane są przekazane parametry. W tym celu sekcja
Po opisaniu wszystkich parametrów następują znaczniki zamykające. Żądanie i odpowiedź w XML-RPC to normalne dokumenty XML, więc wszystkie znaczniki muszą być zamknięte. Ale w XML-RPC nie ma pojedynczych znaczników, chociaż są one obecne w standardzie XML.
Teraz przeanalizujmy odpowiedź serwera. Nagłówek odpowiedzi HTTP jest normalny, jeśli żądanie zostanie pomyślnie przetworzone, serwer zwróci odpowiedź HTTP/1.1 200 OK. Podobnie jak w żądaniu, należy poprawnie określić typ MIME, długość wiadomości oraz datę wygenerowania odpowiedzi.
Treść odpowiedzi jest następująca:
Teraz zamiast tagu głównego
Jeśli wystąpił błąd podczas przetwarzania Twojego żądania, zamiast Odpowiedź będzie miała element
Przyjrzyjmy się teraz szybko typom danych w XML-RPC. W sumie istnieje 9 typów danych - siedem prostych i 2 złożone. Każdy typ jest opisany własnym znacznikiem lub zestawem znaczników (w przypadku typów złożonych).
Proste typy:
Wszystkie liczby- tag
typ logiczny- tag
Ciąg znaków ASCII- opisane przez tag
Liczb zmiennoprzecinkowych- tag
Data i godzina- opisane przez tag
Ostatni prosty typ to ciąg zakodowany w base64, który jest opisany przez tag
Typy złożone są reprezentowane przez struktury i tablice. Struktura zdefiniowana przez element główny
Tablice nie mają nazw i są opisane tagiem
Oczywiście ktoś powie, że taka lista typów danych jest bardzo uboga i „nie pozwala na rozbudowę”. Tak, jeśli potrzebujesz przenieść złożone obiekty lub duże ilości danych, lepiej użyć SOAP. A dla małych, niewymagających aplikacji XML-RPC jest całkiem odpowiedni, co więcej, bardzo często nawet jego możliwości okazują się zbyt duże! Biorąc pod uwagę łatwość wdrożenia, bardzo dużą liczbę bibliotek dla prawie każdego języka i platformy oraz szerokie wsparcie w PHP, XML-RPC często po prostu nie ma konkurentów. Choć nie da się od razu doradzić, jako uniwersalnego rozwiązania – w każdym przypadku trzeba decydować w zależności od okoliczności.
Technologia XML-RPC jest wykorzystywana w systemie WordPress do różnych fajnych funkcji, takich jak pingbacki, trackbacki, zdalne zarządzanie witryną bez logowania do panelu administracyjnego itp. Niestety, osoby atakujące mogą wykorzystać go do ataków DDoS na strony internetowe. Oznacza to, że tworzysz piękne, ciekawe projekty WP dla siebie lub na zamówienie, a jednocześnie, niczego nie podejrzewając, możesz stać się częścią botnetu DDoS. Łącząc ze sobą dziesiątki i setki tysięcy witryn, źli ludzie tworzą potężny atak na swoją ofiarę. Chociaż Twoja strona również cierpi, ponieważ. ładunek trafia do hostingu, na którym jest hostowany.
Dowodem takiej złej aktywności mogą być logi serwera (access.log in nginx) zawierające następujące wiersze:
103.238.80.27 - - "POST /wp-login.php HTTP/1.0" 200 5791 "-" "-"
Wróćmy jednak do luki XML-RPC. Wizualnie objawia się to powolnym otwieraniem witryn na twoim serwerze lub niemożnością ich załadowania w ogóle (błąd 502 Bad Gateway). Wsparcie techniczne mojego hostera FASTVPS potwierdziło moje przypuszczenia i poradziło:
- Zaktualizuj WordPress do Ostatnia wersja wraz z wtyczkami. Ogólnie rzecz biorąc, jeśli śledzisz, być może przeczytałeś o konieczności zainstalowania najnowszej wersji 4.2.3. ze względu na krytykę bezpieczeństwa (podobnie jak poprzednie wersje). Krótko mówiąc, aktualizacja jest dobra.
- Zainstaluj wtyczkę Wyłącz XML-RPC Pingback.
Wyłączanie XML-RPC w WordPress
Wcześniej wydaje mi się, że opcja włączenia/wyłączenia XML-RPC była gdzieś w ustawieniach systemowych, ale teraz nie mogę jej tam znaleźć. Dlatego najprostszym sposobem na pozbycie się go jest użycie odpowiedniej wtyczki.
Znajdź i pobierz Disable XML-RPC Pingback lub zainstaluj go bezpośrednio z panelu administracyjnego systemu. Nie musisz niczego dodatkowo konfigurować, moduł od razu zaczyna działać. Usuwa metody pingback.ping i pingback.extensions.getPingbacks z interfejsu XML-RPC. Usuwa również X-Pingback z nagłówków HTTP.
W jednym z blogów znalazłem kilka dodatkowych opcji usunięcia wyłączenia XML-RPC.
1. Wyłącz XML-RPC w szablonie.
W tym celu do pliku functions.php motywu dodawana jest linia:
Osobiście nie korzystałem z dwóch ostatnich metod, ponieważ. Podłączyłem wtyczkę Disable XML-RPC Pingback - myślę, że to wystarczy. Właśnie dla tych, którzy nie lubią dodatkowych ustawień, zaproponowałem alternatywne opcje.