От събота следобед на моя сървър, който хоства около 25 сайта на Wordpress, започнаха диви спирачки. Тъй като успях да преживея предишните атаки ( , ), без да бъда забелязан, не разбрах веднага какво не е наред.
Като разбрах се оказа, че има търсене на пароли + много заявки към XMLRPC.
В резултат на това беше възможно да се отреже всичко, макар и не веднага. От котка три прост приемкак да го избегнем.
Тези техники най-вероятно са известни на всички, но стъпих на няколко гребла, които не намерих в описанията - изведнъж това ще спести на някого време.
1. Спираме изброяването, приставката за ограничаване на опитите за влизане - поставяме го точно, тъй като други защити силно задържат сървъра, например при използване Плъгин ВходСървърът на Security Solution умря за половин час, плъгинът натоварва силно базата данни.
В настройките не забравяйте да поставите отметка в квадратчето "За прокси" - в противен случай ще определи ip на вашия сървър за всички и автоматично ще блокира всички.
АКТУАЛИЗАЦИЯ, благодаря, подробностите са по-долу в коментарите - поставяме отметка в квадратчето „За прокси“ само ако дефиницията не работи, когато е активирана „Директна връзка“
2. Деактивирайте XML-RPC - плъгин Деактивирайте XML-RPC (просто го активирайте и това е).
3. Затворете wp-login.php - ако влезете в сайта през ip, плъгинът не работи и пикерите продължават да чукат сайта. За да избегнете това, добавете към .htaccess:
Копираме файла wp-login, преименуваме го на всяко странно име, например poletnormalny.php и вътре във файла променяме всички надписи wp-login.php на poletnormalny.php чрез автокорекция.
Всичко, сега можете да получите достъп до админ панела само чрез вашия файл.
След тези 3 лесни стъпки, сайтовете започнаха да летят отново и настъпи мир.
Е, изведнъж стана интересно
Един от вариантите е как да видите, че сте атакуван. Това може да се види в регистрационните файлове на nginx (например, тук е пътя за файла /var/log/nginx access.log на Debian).Въведение в XML-RPC
В мрежата има много различни ресурси, които предоставят на потребителите определена информация. Това не означава обикновени статични страници, а например данни, извлечени от база данни или архиви. Това може да бъде архив от финансови данни (валутни курсове, данни за борсови котировки), данни за времето или по-обемна информация - новини, статии, съобщения от форуми. Такава информация може да бъде представена на посетителя на страницата, например чрез формуляр, като отговор на заявка или може да бъде динамично генерирана всеки път. Но трудността е, че често такава информация е необходима не толкова на крайния потребител - човек, а на други системи, програми, които ще използват тези данни за своите изчисления или други нужди.
Пример от реалния живот: страница на банков сайт, която показва валутни котировки. Ако влезете в страницата като обикновен потребител, през браузъра виждате целия дизайн на страницата, банери, менюта и друга информация, която „рамкира“ истинската цел на търсенето – валутни котировки. Ако трябва да въведете тези котировки във вашия онлайн магазин, тогава не ви остава нищо друго освен ръчно да изберете необходимите данни и да ги прехвърлите на вашия уебсайт чрез клипборда. И трябва да правите това всеки ден. Наистина ли няма изход?
Ако решим проблема директно, веднага се предлага решение: програмата (скрипт на сайта), която се нуждае от данни, получава страницата от сървъра като "обикновен потребител", анализира (парсира) получения html код и извлича необходимата информация от него. Може да се направи или нормално регулярен израз, или с всеки html анализатор. Сложността на подхода се крие в неговата неефективност. Първо, за да получите малка част от данните (данните за валутите са буквално дузина или два знака), трябва да получите цялата страница, която е поне няколко десетки килобайта. Второ, при всяка промяна в кода на страницата, например дизайнът се е променил или нещо друго, нашият алгоритъм за анализ ще трябва да бъде преработен. Да, и ще подбере ресурсите прилично.
Затова разработчиците стигнаха до решението - необходимо е да се разработи някакъв универсален механизъм, който да позволи прозрачен (на ниво протокол и среда за предаване) и лесен обмен на данни между програми, които могат да бъдат разположени навсякъде, да бъдат написани на всеки език и да тече под всякакви операционна системаи на всяка хардуерна платформа. Такъв механизъм сега се нарича нашумялите термини „Уеб услуги“ (web-service), „SOAP“, „сервизно-ориентирана архитектура“ (service-oriented architecture). За обмен на данни се използват отворени и изпитани във времето стандарти - за предаване на съобщения HTTP протоколът (въпреки че могат да се използват и други протоколи - SMTP например). Самите данни (в нашия пример - валутни курсове) се предават опаковани в междуплатформен формат - под формата на XML документи. За това е изобретен специален стандарт - SOAP.
Да, сега уеб услугите, SOAP и XML са на устните на всички, те започват активно да се прилагат и големи корпорации като IBM и Microsoft пускат нови продукти, предназначени да помогнат за пълното внедряване на уеб услуги.
Но! За нашия пример с обменни курсове, които трябва да се прехвърлят от уебсайта на банката към двигателя на онлайн магазина, подобно решение ще бъде много трудно. В края на краищата само описанието на стандарта SOAP отнема неприлични хиляда и половина страници и това не е всичко. За практическа употреба ще трябва също да научите как да работите с библиотеки и разширения на трети страни (само като се започне с PHP 5.0, той включва библиотека за работа със SOAP), да напишете стотици и хиляди редове от вашия код. И всичко това, за да получите няколко букви и цифри, очевидно е много тежко и нерационално.
Следователно има още един, с удължение, можем да кажем алтернативен стандарт за обмен на информация - XML-RPC. Той е разработен с участието на Microsoft от UserLand Software Inc и е предназначен за унифициран трансфер на данни между приложенията през Интернет. Той може да замени SOAP при изграждане на прости услуги, където не са необходими всички „корпоративни“ функции на истински уеб услуги.
Какво означава съкращението XML-RPC? RPC означава Remote Procedure Call - извикване на отдалечена процедура. Това означава, че приложението (независимо дали е скрипт на сървъра или обикновено приложение на клиентски компютър) може прозрачно да използва метод, който е физически внедрен и изпълнен на друг компютър. XML се използва тук, за да осигури универсален формат за описание на предаваните данни. Като транспорт, HTTP протоколът се използва за прехвърляне на съобщения, което ви позволява свободно да обменяте данни през всякакви мрежови устройства - рутери, защитни стени, прокси сървъри.
И така, за да го използвате, трябва да имате: XML-RPC сървър, който предоставя един или повече методи, XML-RPC клиент, който може да формира правилна заявка и да обработи отговора на сървъра, и също така да знаете параметрите на сървъра, необходими за успешен операция - адрес, име на метод и предадени параметри.
Цялата работа с XML-RPC се извършва в режим "заявка-отговор", това е една от разликите между технологията и стандарта SOAP, където има както концепциите за транзакции, така и възможността за извършване на отложени повиквания (когато сървърът запазва заявката и отговаря на нея в определен момент в бъдеще). Тези допълнителни функциипо-полезни за мощни корпоративни услуги, те значително усложняват разработката и поддръжката на сървъри и поставят допълнителни изисквания към разработчиците на клиентски решения.
Процедурата за работа с XML-RPC започва с формирането на заявка. Типичната заявка изглежда така:
POST/RPC2 HTTP/1.0
Потребителски агент: eshop-test/1.1.1 (FreeBSD)
Хост: server.localnet.com
Тип съдържание: текст/xml
дължина на съдържанието: 172
Първите редове формират стандартната HTTP POST заглавка на заявката. Задължителните параметри включват хост, тип данни (тип MIME), който трябва да е текст/xml, и дължината на съобщението. Стандартът също така посочва, че полето User-Agent трябва да бъде попълнено, но може да съдържа произволна стойност.
Следва нормалната заглавка на XML документа. Основен елемент на заявката -
Линия
След това се задават предадените параметри. За това секцията
След описанието на всички параметри следват затварящи тагове. Заявка и отговор в XML-RPC са нормални XML документи, така че всички тагове трябва да бъдат затворени. Но в XML-RPC няма единични тагове, въпреки че те присъстват в XML стандарта.
Сега нека анализираме отговора на сървъра. Заглавката на HTTP отговора е нормална, ако заявката е обработена успешно, сървърът връща HTTP/1.1 200 OK отговор. Точно както в заявката, трябва правилно да посочите MIME типа, дължината на съобщението и датата, на която е генериран отговорът.
Тялото на отговора е следното:
Сега вместо основния маркер
Ако е възникнала грешка при обработката на вашата заявка, вместо Отговорът ще има елемент
Сега нека да разгледаме набързо типовете данни в XML-RPC. Има общо 9 типа данни - седем прости типа и 2 сложни. Всеки тип се описва със собствен етикет или набор от тагове (за сложни типове).
Прости видове:
Цели числа- етикет
булев тип- етикет
ASCII низ- описано от етикет
Числа с плаваща запетая- етикет
дата и час- описано от етикет
Последният прост тип е base64 кодиран низ, което е описано от тага
Сложните типове са представени от структури и масиви. Структура, дефинирана от коренния елемент
Масивите нямат имена и се описват с таг
Разбира се, някой ще каже, че такъв списък от типове данни е много лош и „не ви позволява да се разширявате“. Да, ако трябва да прехвърлите сложни обекти или големи количества данни, тогава е по-добре да използвате SOAP. И за малки, неизискващи приложения XML-RPC е доста подходящ, освен това много често дори неговите възможности се оказват твърде много! Като се има предвид лекотата на внедряване, много голям брой библиотеки за почти всеки език и платформа и широка поддръжка в PHP, тогава XML-RPC често просто няма конкуренти. Въпреки че е невъзможно веднага да се препоръча като универсално решение - във всеки случай е необходимо да се реши според обстоятелствата.
Технологията XML-RPC се използва в системата WordPress за различни приятни функции като pingbacks, trackbacks, отдалечено управление на сайт без влизане в административната зона и т.н. За съжаление, нападателите могат да го използват за DDoS атаки на уебсайтове. Тоест създавате красиви интересни WP проекти за себе си или по поръчка и в същото време, без да подозирате нищо, можете да бъдете част от DDoS ботнет. Свързвайки заедно десетки и стотици хиляди сайтове, лошите хора създават мощна атака срещу жертвата си. Въпреки че вашият сайт също страда, т.к. натоварването отива към хостинга, където се хоства.
Доказателство за такава лоша дейност могат да бъдат регистрационните файлове на сървъра (access.log в nginx), съдържащи следните редове:
103.238.80.27 - - "POST /wp-login.php HTTP/1.0" 200 5791 "-" "-"
Но обратно към уязвимостта на XML-RPC. Визуално се проявява в бавното отваряне на сайтовете на вашия сървър или невъзможността за зареждането им изобщо (грешка 502 Bad Gateway). Техническата поддръжка на моя FASTVPS хостинг потвърди моите предположения и посъветва:
- Актуализирайте WordPress до последна версиязаедно с плъгини. Като цяло, ако следвате, може би сте чели за необходимостта от инсталиране на най-новата 4.2.3. поради критики към сигурността (точно като предишни версии). Накратко, актуализирането е добро.
- Инсталирайте приставката Disable XML-RPC Pingback.
Деактивиране на XML-RPC в WordPress
Преди ми се струва, че опцията за активиране / деактивиране на XML-RPC беше някъде в системните настройки, но сега не мога да я намеря там. Следователно, най-лесният начин да се отървете от него е да използвате подходящия плъгин.
Намерете и изтеглете Disable XML-RPC Pingback или като го инсталирате директно от системния администраторски панел. Не е необходимо да конфигурирате нищо допълнително, модулът започва да работи веднага. Той премахва методите pingback.ping и pingback.extensions.getPingbacks от XML-RPC интерфейса. Също така премахва X-Pingback от HTTP заглавки.
В един от блоговете намерих още няколко опции за премахване на деактивирането на XML-RPC.
1. Деактивирайте XML-RPC в шаблона.
За да направите това, към файла functions.php на темата се добавя ред:
Аз лично не използвах последните два метода, т.к. Свързах плъгина Disable XML-RPC Pingback - мисля, че ще е достатъчно. Само за тези, които не харесват допълнителни настройки, предложих алтернативни опции.