Как получить список пользователей WordPress и как от этого защититься?
Hack ProofНе станет открытием то, что любая более-менее осмысленная атака начинается с изучения цели и сбора информации. А для сайта на WordPress что это может быть за информация?
- Список пользователей.
- Выявление учётных записей со слабым паролем. Поиск администратора сайта, подбор аутентификационных данных для этой учётной записи.
- Список установленных тем и плагинов.
- Выявление уязвимых элементов с целью проведения различного рода атак.
- Номер версии WordPress.
- Выявление по номеру версии известных уязвимостей ядра CMS.
Инструменты для проведения атаки
Начнём с первого этапа. Для выявления списка пользователей прекрасно подходит Kali Linux с её инструментом WPScan. Есть ещё скрипт для Nmap и модуль для Metasploit Framework, но функционируют они идентично.
Специально для этого я натравил скрипт WPScan на некоторые сайты на базе WordPress и посмотрел на её вывод:
# wpscan -u <url_site> --enumerate u

Как происходит получение пользователей
Кстати, я перед тем, как поставить сканирование, включил запись трафика. Позже, после проведения Enumerating, посмотрел дамп:

То есть скрипт просто запрашивает параметр ?author=1,2,3… для первых 10 зарегистрированных пользователей и получает редирект на логин.
Вот, даже собрал http-stream данного запроса (всё очень легко делается в WireShark):

То есть сервер просто перенаправляет по коду 301 на URL вида http://адрес_сайта/author/логин.
Проверить можно в браузере, набрав site.ru/?author=1 – перейдём на записи, созданные первым пользователем (по умолчанию – администратор сайта).
Обрабатываем GET-запрос на уровне WEB-сервера
Идея была такая. Зачем обычному посетителю блога получить все записи администратора? Не смог придумать ни одного реального сценария, поэтому решено было резать на корню подобные запросы.
Для NGINX:
if ($arg_author) {
return 403;
}
Для Apache:
RewriteCond %{QUERY_STRING} author=\d
RewriteRule ^ /? [L,R=403]
Попытка получения списка пользователей
После изменения конфигурации попробуем получить список пользователей:

Сценарий отработал нормально. В браузере получаем ту же картину:

Пускаем по ложному следу
В принципе, нам ничто не мешает перенаправить с 301-ым кодом на произвольный адрес и пустить скрипткиддиса по ложному следу:
if ($arg_author) {
return 301 $scheme://$server_name/author/hackersucker;
}

Конечно, выгоднее всего перенаправить именно 1-ого юзера на произвольный URL, таким образом программы определения администратора пойдут по ложному следу. А тут явно видно, что “ждали”.