• 🚨 29 мая стартует курс «Пентест Active Directory: от теории к практике» от Академии Кодебай

    🔍 Изучите реальные техники атак на инфраструктуру Active Directory: от первоначального доступа до полной компрометации.
    🛠️ Освойте инструменты, такие как BloodHound, Mimikatz, CrackMapExec и другие.
    🧪 Пройдите практические лабораторные работы, имитирующие реальные сценарии атак.
    🧠 Получите знания, которые помогут вам стать востребованным специалистом в области информационной безопасности.

    После старта курса запись открыта еще 10 дней Подробнее о курсе ...

Статья Проходим любой тест успешно на 100%

Добрый день, айтишники. Где-то год назад примерно, я учился в автошколе, где каждый день решали тесты на сайте пдд. И чисто ради интереса, немного покопавшись, я написал скрипт, который выдает правильный ответ. Подробнее Сдаем экзамен ПДД на сайте без ошибок. Сейчас поговорим о недавно возникшей подобной ситуации. Один человек попросил меня посмотреть, есть ли такая недоработка на сайте . Получив данные для входа, я начал внимательно изучать, как и куда ответы загружаются. В качестве теста, я взял предмет "МСС. Метрология 3 семестр", который я точно не знал. Начинаем тест и видим

1.png

Вроде все ок, обычный тест, согласны? Смотрим лог любимого расширения для хрома - Web Sniffer, и видим

2.png

Устанавливаем фильтр, чтобы лог отображал только POST запросы, которые отправлялись на master-test.net

3.png

Всего лишь один запрос, отлично. Смотрим параметры, которые передавались в запросе и адрес сайта, куда направлялся запрос

4.png

Запрос принимает, скрипт находящийся по этому адресу - . Видим что передавался всего лишь один параметр id со значением 104943. Эти цифры что-то напоминают, правда? Вернемся на тест и посмотрим на адресную строку

5.png
Посмотрите на конец адреса сайта, разве не одни и те же цифры? Значит id - это номер теста. Скорее всего, так сайт получает все данные для теста. Идем на любой REST API TEST и отправляем POST запрос. Я буду пользоваться самым удобным, . В качестве адреса указываем , выбираем метод POST, и заполняем поле для параметров.

6.png

id - служит как идентификатор теста, 104943 - номер теста. Отправляем запрос, и видим

7.png

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

8.png

Теперь легче читается, правда? Это JSON объект со всеми вопросами и ответами на них. Теперь нам нужно написать скрипт, который будет отправлять POST запрос на адрес с нужными параметрами, а также парсить JSON из полученного ответа. Если будем разбирать каждый шаг, то из статьи получится целая книга, поэтому моменты написания скрипта, я не буду показывать. В результате, у меня получился примерно такой скрипт

JavaScript:
var testNum = location.pathname.replace('/ru/quiz/testing/id/quiz/testing/id/', '');
var url = "https://master-test.net/ru/site/json/load-quiz.proxy"
var quizNum = document.getElementsByClassName('x-tree-node-el x-tree-node-leaf x-unselectable x-tree-selected')[0].children[3].href;
var quizTitle = document.getElementsByClassName('x-tree-node-el x-tree-node-leaf x-unselectable x-tree-selected')[0].children[3].children[0].getAttribute('qtip');
quizNum = quizNum.replace('https://master-test.net/ru/quiz/testing/id/quiz/testing/id/'+testNum+'#quiz_item_', '');
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
        var json = JSON.parse(xhr.responseText);
        for ($i=0; $i < json.data.items.length; $i++)
        {
            if (quizTitle==json.data.items[$i].data.title)
        alert(json.data.items[$i].data.correct_answer);
    }
    }
};
var data = 'id=' + testNum ;
xhr.send(data);

Заходим на тест, открываем консоль и вставляем скрипт, и конечно же жмем Enter

9.png

Отлично, как мы видим, скрипт работает. Попробуем ответить на все вопросы, каждый раз запуская скрипт. Итог

finish.png

Скрипт помог нам решить тест со 100% правильными ответами. Мы конечно же могли бы, чтобы в вопросе подсвечивался правильный ответ, но мы ведь любим когда все просто, правда? Скрипт работает абсолютно на любом тесте с данного сайта. С вами был GoodSmile, на этом мы с вами прощаемся, до скорых встреч!

P.S. ВСЯ ИНФОРМАЦИЯ ПРЕДОСТАВЛЕНА ИСКЛЮЧИТЕЛЬНО В ОЗНАКОМИТЕЛЬНЫХ И ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЯХ
 
Ребята, оказалось что там еще и экзамены есть. Но получить их ответы будет немного сложнее, чем ответы на тесте, так как вопросы и ответы загружаются по разным адрес, т.е отдельно. Вот код для экзамена
JavaScript:
function showAnswer(num)
{
    var testNum = location.pathname.replace('/ru/student/exam/testing/id/', '');
var url = "https://master-test.net/ru/student/exam/get-my-answers.proxy"
var quizNum = document.getElementsByClassName('x-tree-node-el x-tree-node-leaf x-unselectable x-tree-selected')[0].children[3].href;
var quizTitle = document.getElementsByClassName('x-tree-node-el x-tree-node-leaf x-unselectable x-tree-selected')[0].children[3].children[0].getAttribute('qtip');
quizNum = quizNum.replace('https://master-test.net/ru/quiz/testing/id/quiz/testing/id/'+testNum+'#quiz_item_', '');
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.setRequestHeader('user_id', 'master_json');
xhr.setRequestHeader('masterUT', 'guest');
xhr.setRequestHeader('project', 'master');
xhr.setRequestHeader('master_req_type', 'master_json');
xhr.setRequestHeader('masterUID', 'empty');
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
        var json = JSON.parse(xhr.responseText);
        alert(json.data[num]);
    }
};
var data = 'id=' + testNum ;
xhr.send(data);
}
showAnswer(1);

Последняя строчка, showAnswer(1);, показывает ответ конкретного вопроса. Т.е, 1 - это номер вопроса. Если номер вопроса 2, соответственно вместо 1 пишем 2, получится showAnswer(2);
Вроде все.
 
  • Нравится
Реакции: keynik
прости, людей, играющих в хакеров на публику - не берут в грей.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!

Курс AD