Practical Website Hacking: Обзор + Write Up

Discussion in 'Песочница' started by leksadin, 22 Jan 2016.

  1. leksadin

    leksadin Level 8

    Joined:
    19 Jan 2016
    Messages:
    128
    Likes Received:
    60
    Reputations:
    12
    Здравствуйте. Хочу представить вашему вниманию очередную площадку для тренеровок в области web-хакинга.

    Practical Website Hacking

    Ссылка на мероприятие: http://ctf.infosecinstitute.com/ctf2/

    Представлено всё в формате CTF, есть 13 уровней, на каждом уровне дано задание. Оформлено всё довольно приятно, слева вверху выпадающий список уровней (можно сразу приступить к любому). В центре экрана - задание. В левом нижнем углу есть название типа уязвимости, которой нужно пользоваться, и её номер в OWASP-TOP10. Внизу есть кнопка с подсказками.

    Задания разные: XSS, LFI, CSRF, инъекции, работа с php, обход фильтров, blacklist и прочее. В общем, хорошо подойдёт тем, кто представляет, что такое уязвимости, но не имеет достаточно практики.

    Write Up

    Далее пойдут спойлеры, распишу, как я проходил данную площадку. Кто хочет порешать самостоятельно, не читайте;)

    У нас есть форма для составления списка сайтов. Нужно с помощью XSS вывести сообщение "Ex1". Ну что ж, начнём. Сначала введём корректные данные. Составляется список с названием и адресом. В одну из этих форм нужно подсунуть скрипт
    HTML:
    <script>alert('Ex1')</script>
    Вставляем его в обе формы и отправляем, но увы, формат не подходит. Значит, есть проверка. открываем html-код сайта (правая кнопка мыши > исследовать элемент). Видим, что в названии сайта стоят разрешённые символы и максимальный размер, а в адресе сайта - тип url и тоже максимальный размер.
    Есть несколько вариантов решения. Браузеры позволяют р
    едактировать html "на лету" (на стороне клиента), чем мы и воспользуемся. Например, можно просто в атрибут pattern дописать символы <>, maxsize увеличить. или просто удалить эти атрибуты. И изменить тип url на text. Но мне больше нравится такой вариант: в основную форму можно добавить атрибут novalidate="". Он отключает внутренние проверки на корректность данных.
    HTML:
    <form class="ex1" action="" novalidate="">
    Отправляем, ура. Скрипт висит на стене, но не обработан. Значит, html проверку преодолели, но есть ещё проверка. Изучаем html-код, видим ex1.js. В нём находим функцию замены спец.символов.
    Code:
    var siteName = $(".ex1 input[type='text']").val().trim().replace(/</g, "&lt;").replace(/>/g, "&gt;");
    var siteURL = $(".ex1 input[type='url']").val().trim().replace(/</g, "&lt;").replace(/>/g, "&gt;");
    Chrome позволяет "на лету" редактировать и javascript, но у меня стоит лиса. Поэтому, как мне посоветовали здесь же, я скопировал весь скрипт и всунул его в консоль, изменив "&gt;" и "&lt;" на ">" "<" соответственно. В итоге нажимаем кнопку, и наш скрипт срабатывает. После чего нас перебрасывает на след. уровень.

    Кстати, xss срабатывает и в поле для названия, и для адреса.

    P.S. JS обработка происходила на стороне клиента (в браузере), поэтому мы руками меняли скрипт. Мне этот уровень не нравится. В жизни же вероятнее встретить обработку на сервере, поэтому наш трюк не сработает. Но тогда можно перехватыть запрос и подменять в нём данные с помощью Burp, например.

    P.P.S. Если кто знает какой-нибудь плагин для редактирования JS на лету - поделитесь знанием, пожалуйста ;)

    Здесь у нас есть самодельный калькулятор. Нужно узнать версию php, информацию о сервере и блаблабла. Это можно сделать функцией phpinfo(). Приступим. Подставляем нормальные числа, потом пробуем буквы. Вроде бы работает правильно. Смотрим html, обращаем внимание на блок с арифметическими действиями. Помимо текста в них есть реальный оператор. Скорее всего, он передаётся в функцию на сервер (как говорит подсказка, там выполняется eval). В неё мы и будем внедряться. Переписываем операцию сложения.
    Code:
    <option value="+1;phpinfo();1+">+</option>
    Нажимаем - всё сработало. Отправляемся на третий уровень.

    Форма для регистрации. Вбиваем, логинимся - видем строчку role: normal. По заданию мы должны зарегистрироваться, при этом с правами admin. Мы знаем, что данные о пользователе хранятся в файле, и используется некоторый разделитель. Это может быть , | || # и т.д. При этом порядок данных тоже может быть любой. Ну, будем перебирать в формате userXXX | admin
    Сразу замечаем, что стоит ограничитель длины в полях username и password. Удаляем атрибут maxlength (или увеличиваем). Вбиваем поля, отправляем....и ошибка. Оказывается, проверка на длину стоит ещё и у них на сервере. Значит, остались только поля last name и email. Тыкаем, тыкаем, до, после, запятую, палку, слеш. Не срабатывает. Тогда открываю подсказку. И чёрт, подсказка говорит, что всё лежит в разных строчках. Ну, и опять несколько вариантов. Первый - удалить поле ввода и встроить новое (в которое можно вставлять несколько строчек).
    HTML:
    <textarea id="lname" class="form-control" value="" required="" type="text" name="lname"></textarea>
    Другой вариант, написать встрочку и перехватить Burp'ом, поставить ентер уже в нём.
    В общем регистрируемся, заходим и ... видим слово admin. Но ничего не случается...
    тогда вспоминаем что вид был role:normal, поэтому делаем ещё одну попытку, уже добавляя role:admin.
    Попадаем в новый уровень.

    P.S. пытался поставить просто в одну строчку символ переноса (%0A) - не сработало.

    Чтож. У нас подключается GET-параметром текстовый файл. Нужно "загрузить файл PHP, расположенный в корне infosecinstitute.com. Файл не должен существовать, но вы должны загрузить его без ошибок, и он должен иметь расширение .php"
    потыкав по формам, видим параметр file=file1.txt Пытаемся воткнуть php - выдаёт ошибку. ну, ладно. Сначала в корень надо попасть. ну, делаем запрос http://ctf.infosecinstitute.com/ctf2/exercises/ex4.php?file=http://infosecinstitute.com/file.txt
    Выдаёт ошибку, что, мы указываем на url. Атата. хм... в таких фильтрах часто делают ошибку в регистрах. Делаем запрос и всё гуд:
    http://ctf.infosecinstitute.com/ctf2/exercises/ex4.php?file=htTp://infosecinstitute.com/file.txt
    на .php стоит фильтрация, на .txt её нет. Тогда file.txt.php даёт нам победу.

    Страница для авторизированных пользователей. Нам нужно с помощью "магии" залогиниться. Первая мысль - найти в куках параметр авторизации. Увы, мимо... Ладно. Видим, что Login выглядит как кнопка, но не нажимается. Открывает html. Это действительно кнопка с атрибутом disable. указывает на ссылку login.html. Пытаемся пройти по адресу - вновь провал. Тогда возвращаемся на наш пятый уровень, просто заменяя в Headers предшествующую ссылку на Referer: http://ctf.infosecinstitute.com/ctf2/exercises/login.html и всё сработало.

    P.S. Для Firefox удобный плагин Modify Headers. Просто там пишешь, что такой-то заголовок постоянно изменять, добавлять, удалять.

    Ну, здесь всё просто. Есть форма для комментариев, есть парочка тегов. Нам нужно сделать перессылку на другую страничку. Тег изображения может содержать адрес сайта, поэтому им и воспользуемся
    HTML:
    <img src="https://site.com/bank.php?transferTo=555">
    P.S. Есть некоторые тонкости, что не считает правильным http, или например, закрытый тег img, или пробел после ссылки (так и не осознал эту дурость. На ощупь тыкал)

    Вновь XSS. Дана страничка для входа. На этот раз надо засунуть на страницу
    HTML:
    <h1>YOUR NAME HERE</h1>
    На этом уровне немного битая вёрстка, но это роли не играет. пробуем ввести что-нибудь - срабатывает действие.
    Смотрим html-код. Видим строчку
    HTML:
    <input type="hidden" value="/ctf2/exercises/ex7.php " name="action">
    .
    Сюда передаётся значение адресной строки. Попробуем в адресную строку прописать такие адреса:
    Code:
    http://ctf.infosecinstitute.com/ctf2/exercises/ex7.php/">
    http://ctf.infosecinstitute.com/ctf2/exercises/ex7.php/'>
    Двойная кавычка не прошла, а вот одинарная выпадает за тег <input>. Осталось просто после '> использовать XSS
    Code:
    ctf.infosecinstitute.com/ctf2/exercises/ex7.php/'><h1>YOUR NAME HERE</h1>

    Есть форма для загрузки картинки и форма показа картинок. Нужно с помощью загруженного файла запустить JS-скрипт с окном alert().
    Создаём файл 8.html
    HTML:
    <script>alert('File inclusion');</script>
    Вот его-то мы и будем загружать на сервер.
    При попытке залить его вылезает ошибка, расширение плохое. Переименовываем в 8.jpg.html - проходит.

    Так, осталось этот файл запустить. Так, у нас есть форма с картинками. Смотрим код - видим строку с ссылкой на картинку
    HTML:
    <img class="img-responsive center-block img-rounded" alt="Chess" title="Chess" src="../ex8_assets/img/chess3.png">
    Заходим по этому адресу, и у нас открывается картинка. Значит, сюда залился и наш файл. Открываем
    Code:
    http://ctf.infosecinstitute.com/ctf2/ex8_assets/img/8.jgp.html
    и нас перессылают на следующий уровень.

    Мы авторизованы под одним человеком, надо зайти под другого. Никаких активных форм нет.

    Идём копаться в куки. Видем в них параметр user=Sk9ITitET0U%3D
    %3D это символ "=" . Sk9ITitET0U= похоже на код base64. Идём на сайт base64.ru и расшифровываем. получаем JOHN+DOE. Значит, зашифровываем MARY+JANE и подставляем в куки. Можно сделать с помощью Burpsuite, или с помощью Modify Headers прям в браузере.

    Есть игра, задание - получить 9999 очков и пройти на максимальном уровне сложности. Ну, ради интереса я сыграли пару раз. Потом полез в код страницы, и наткнулся на js-код игры.

    HTML:
          finishGame: function(action) {
            if (action === "win") {
              if (this.data.totalShownColors === 9) {
                setTarget({
                  extreme: true
                });
              }
              ++this.data.stats.wins;
              this.addAlert("Congrats. You won");
            } else if (action === "lose") {
              ++this.data.stats.loses;
              this.addAlert("Oops. You did not make it...");
            }
            this.data.stats.pts += this.data.points;
            localStorage[this.data.username] = JSON.stringify(this.data.stats);
            return this.updateStats();
          },
    Немного его подправил, чтоб всегда отмечался, как режим суперсложно. Ну и не добавлял баллов, а сразу присваивал 9999.
    HTML:
     finishGame: function(action) {
            if (action === "win") {
                setTarget({
                  extreme: true
                    };
              this.data.stats.wins=9999;
    P.S. Как и в первой задаче, здесь можно было "на лету" править файл в Chrome с помощью Developer Tools, я же в FF просто удалил этот код из страницы сайта, и вставил заново в консоли Firebug.

    К сожалению, мы забанены. Нужно это исправить. Хм... ну, лезем в куки, видим там параметр welcome=no и меняем его на yes. Подставляем новые куки в Modify Headers и готово.

    Нужно подобрать пароль к пользователю admin. В условии нам сказано нагуглить пароль по фразе filetype:lst password
    На первой же ссылке висит список паролей (их там 3545). Можно скопировать и вставить в текстовый документ, можно так:
    Code:
    wget http://www.openwall.com/passwords/wordlists/password-2011.lst
    Так, словарь есть, давайте брутить. Да, не забудьте подправить файлик, стереть комментарии.
    Использую гидру:
    Code:
    hydra -l "" -P passwords/password-2011.lst http-post-form://ctf.infosecinstitute.com -m '/ctf2/exercises/ex12.php:username=admin&password=^PASS^&logIn=Login:Incorrect username or password combination' -F
    а вот для любителей медузы:

    Code:
    medusa -u "admin" -P passwords/password-2011.lst -h ctf.infosecinstitute.com -m FORM:"ctf2/exercises/ex12.php" -M web-form -m FORM-DATA:"post?username=&password=&logIn=Login" -m DENY-SIGNAL:"Incorrect username or password combination" -F -t10
    
    Пароль подобрался - princess. Заходим и попадаем на следующий уровень. Ух, последний...

    P.S. ещё видео есть в интернете, где парень пишет свой брут на curl.

    И последний уровень, нам нужно сделать редирект на другой сайт.
    Смотрим пакет при обновлении страницы
    Code:
    http://ctf.infosecinstitute.com/ctf2/exercises/ex13.php?redirect=
    Пробуем подставить сайт Яндекса http://www.yandex.ru/ Фильтрует. Заглавные тоже фильтрует. WWW и HTTP фильтруются. Тогда делаем так:
    Code:
    http://ctf.infosecinstitute.com/ctf2/exercises/ex13.php?redirect=//yandex.ru
    и ложимся спать с чистой душой))

    P.S. Сейчас освоюсь с форумом, научусь картинки добавлять и подошью скринов
     
    #1 leksadin, 22 Jan 2016
    Last edited: 30 Jan 2016
  2. leksadin

    leksadin Level 8

    Joined:
    19 Jan 2016
    Messages:
    128
    Likes Received:
    60
    Reputations:
    12
    Дописал) Если будут вопросы - пишите) И да, если кто объяснит мне, тугодуму, как цеплять картинки - буду благодарен)
     
  3. Kevin Shindel

    Kevin Shindel Elder - Старейшина

    Joined:
    24 May 2015
    Messages:
    1,011
    Likes Received:
    1,192
    Reputations:
    62
    через piccy.info -> Картинка 500 px-> Для форумов.
     
    leksadin likes this.
  4. leksadin

    leksadin Level 8

    Joined:
    19 Jan 2016
    Messages:
    128
    Likes Received:
    60
    Reputations:
    12
    Спасибо, понял) На днях подцеплю скрины к статье - и всё =)
     
    Ruslan1993it likes this.