НоCSSтальгиR

Discussion in 'Задания/Квесты/CTF/Конкурсы' started by crlf, 10 Jul 2020.

  1. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    617
    Likes Received:
    1,244
    Reputations:
    394
    Наверняка многие заметили, что в публикуемых тасках, преобладает сервер-сайд. И это не совсем честно по отношению к любителям другой стороны. Тем более, что античат является одним из первооткрывателей атак типа Cross Site Scripting и HTML Injection. А некоторые участники форума, заслуженно, получают респекты от ведущих мировых экспертов по безопасности в сфере клиент-сайда (!)

    Но правда в том, что CSS-ки уже давно не активные/пассивные, толерантный запад навязал нам свои Reflected и Stored, а эксплуатация стала довольно-таки нетривиальной. Поэтому, предлагаю показать здесь свои знания и умения в программировании на HTML, в нестандартных условиях, и немного понастальгировать :)




    Правила просты:

    • Для того чтобы проявить знание, нужно сконструировать XSS пейлод для текущих версий Chromium/Firefox, выводящий в алерте document.domain, и отправить мне в ЛС. Вектор может быть как с пользовательским взаимодействием (onmouseover, onclick и т.п.), так и без него. Пример:

    Code:
    http://css.ctf.antichat.com/?q=<script>alert(document.domain);</script>
    
    [​IMG]


    • Умение, проявить проще, нужно сделать оригинальный дефейс и выложить его в этой теме. Пример:

    Code:
    http://css.ctf.antichat.com/?q=<h1>HACKED+BY+VASYA+PUPKIN</h1>
    
    [​IMG]


    • Скриншоты желательны, но не обязателены :)


    Знающие: НЕТ / РЕШЕНИЕ!
    Умеющие: @ex0dus, @alexzir



    -


    Хостинг для таска предоставлен модной и молодёжной площадкой - ctf.antichat.com
     

    Attached Files:

    • mp3.zip
      File size:
      3.3 MB
      Views:
      301
    #1 crlf, 10 Jul 2020
    Last edited: 4 Mar 2021
  2. ex0dus

    ex0dus Reservists Of Antichat

    Joined:
    23 Feb 2010
    Messages:
    44
    Likes Received:
    109
    Reputations:
    9
  3. BigBear

    BigBear Escrow Service
    Staff Member Гарант - Escrow Service

    Joined:
    4 Dec 2008
    Messages:
    1,786
    Likes Received:
    862
    Reputations:
    857
    _________________________
  4. alexzir

    alexzir Well-Known Member

    Joined:
    29 Oct 2019
    Messages:
    366
    Likes Received:
    1,376
    Reputations:
    20
    CyberTro1n likes this.
  5. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    617
    Likes Received:
    1,244
    Reputations:
    394
    Окай, что-то негусто у нас с умеющими, а тем более со знающими, будем хинтить :)

    • С самого старта задания присутствует бекап исходников - http://css.ctf.antichat.com/index.php~
    • В случае с XSS, атакующий контролирует первые байты документа (?)
    • console.log(), в сорцах HTML, криво намекает, что пейлоды отлаживать следует именно так
    • С этого момента, в CSP добавлен более широкий скоуп, что даёт большее количство вариантов эксплуатации в обоих случаях. Пример для "дефейса":
    Code:
    # Открывать в десктопном FireFox, хром какашка :(
    
    http://css.ctf.antichat.com/?i=%3Cimg/class=%27i%27/src=%27https://cdn.pixabay.com/photo/2015/10/08/16/14/click-978023_640.png%27/%3E%3Cstyle%3Ebody{cursor:pointer;color:yellow;transform:perspective(300px)%20rotateX(20deg);%20position:absolute;%20top:-200;%20bottom:200px;left:50px;right:50px;}marquee{width:100%;height:100%}.o{animation:blinker%203s%20linear%20infinite;}@keyframes%20blinker{50%%20{opacity:%200;}}.i{position:absolute;width:10%;top:10%;right:0%}.a{width:100%;height:100%;opacity:0;position:absolute;z-index:99}%3C/style%3E%3Caudio%20class=%22a%22%20controls%3E%3Csource%20src=%22https://antichat.com/attachments/10457/%22/type=%22audio/mpeg%22%3E%3C/audio%3E%3C/marquee%3E%3Cmarquee%20class=o%20direction=up%3E
    
     
    fandor9 and BigBear like this.
  6. BigBear

    BigBear Escrow Service
    Staff Member Гарант - Escrow Service

    Joined:
    4 Dec 2008
    Messages:
    1,786
    Likes Received:
    862
    Reputations:
    857
    @crlf даешь прохождение. Тема висит мертвым грузом)
     
    _________________________
  7. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    617
    Likes Received:
    1,244
    Reputations:
    394
    Да все отдыхали же просто :) Щас с отпусков и дач повозвращаются, зарешают, таск то на раз плюнуть :(
     
    dooble likes this.
  8. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    617
    Likes Received:
    1,244
    Reputations:
    394
  9. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    617
    Likes Received:
    1,244
    Reputations:
    394
    Доброго времени суток, уважаемые форумчане!

    @iBigBear был прав, стоило опубликовать решение давно. Тянул, забыл, прошу понять и простить :(

    Неожидано, но, к сожалению, решение вызвало трудности и нет ни одного решившего (по секрету: трудности возникли и у ребят парой уровней выше). Дефейсы так же протекали вяло, что уж тут говорить. Видимо не формат, мыж тут все тру, оставим это скрип-киддисам из лихих 90х :) Лично от себя хочу выразить жирный респектос @ex0dus и @alexzir, за то что поучавствовали в движухе ;-)

    Задание состояло из двух задач, которые участники должны были решить поочерёдно. Забайпасить фильтр опасных тегов/атрибутов и обойти ограничение CSP, соответственно. Были даны подсказки, после которых, дело должно было ускориться, но что-то пошло не так. Давайте вместе пройдёмся по решению и разберём некоторые подсказки.

    Итак, у нас в наличии ретро-страница портала "Античат", с возможностью внедрения произвольного контента, вида:

    http://css.ctf.antichat.com/?i=<marquee><h1>Привет! Ломай меня полностью!</h1></marquee>

    [​IMG]


    Доверчивый и неискушенный участник, скорее всего, первым делом, начнёт вставлять тег <script>:

    http://css.ctf.antichat.com/?i=<script>alert()</script>

    Но вместо требуемого алерта, получит такой ответ:

    [​IMG]


    <sc_с00lhax0r_ript>alert()</sc_с00lhax0r_ript> - это определённо не то, что нужно. Попробовав сотню другую нагрузок, можно убедиться, что фильтр непробиваемый и влоб его прошибить не получится. Тем более, что позднее последовала серия подсказок. Из которых, в том числе, можно было получить исходный код скрипта и убедиться, что простые методы здесь не работают. Хотя решение по кейсу, как раз таки входит в число таковых и ему сто лет в обед. Название задания и возраст странички для дефейса, честно об этом намекали. Поэтому, чтоб никого не обижать, отнесём его к числу "хитрых" байпасов и продолжим дальше.

    Следущая подсказка гласит:

    - В случае с XSS, атакующий контролирует первые байты документа (?)

    А значить это может то, что сначала идёт заголовок, а дальше тело ответа и первые его символы под контролем атакующего. Позднее был дан готовый ответ. Оставалось либо загуглить, либо вчитаться внимательно:

    Что же там вообще написано и как это применить, можно попробовать почитать в одном из вариантов описания, к примеру на русском - https://ru.wikipedia.org/wiki/Маркер_последовательности_байтов

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

    [​IMG]

    Проще говоря, даже намеренно упрощая, не погружаясь во всякие endian-ы, так как сам пока полностью не въезжаю во все эти стандарты, следует понимать, что если в заголовке явно задана кодировка, типа как у нас и ещё на миллионе других сайтов:

    То это, в ничего ещё не значит, если в начале документа/потока идёт маркер последовательности байтов aka BOM.

    Воспользовавшись подсказкой выше, посмотрим ещё раз как это выглядит:
    [​IMG]


    А вот в какую абракадабру при этом браузер превращает ответ:

    [​IMG]


    Можно даже попробовать перевести это чудо, возможно там есть ещё одна подсказка:

    [​IMG]

    Хммм, подсказки нет... но всё равно забавно, особенно про суп из баранины, часто повторяется. Интересно какой набор из исходника даёт такую последовательность? Оставлю это для исследования тебе, читатель :D

    Особенно внимательные, скорее всего уже заметили, что в маркере, которы приведён в пример, есть один лишний нулевой символ. И поэтому хочу сразу оговориться, чтобы не вводить в заблуждение. К последовательности BOM он не имеет никакого отношения. А всего лишь является очередной завуалированной подсказкой, которая даёт понять, что нужно использовать начало диапазона символов UTF. К примеру <script>, набор из U+003C U+0073 U+0063 U+0072 U+0069 U+0070 U+0074 U+003E или в URL кодировке %00%3C%00s%00c%00r%00i%00p%00t%00%00%3E.

    Поэтому пробуем:

    [​IMG]


    Бинго! Теги остались без изменений, браузер спокойно обработал эту "кашу из кодировок", а злой XSS фильтр нет. А теперь рука-лицо, если всё это вдруг показалось чем-то сложным, то в очень известной методичке PayloadsAllTheThings, был готовый вариант, стоило просто перебрать:

    [​IMG]


    Теперь же мы подошли ко второй части головоломки и заветного алерта мы всё ещё не видим, так как следущая подсказка гласит:

    - console.log(), в сорцах HTML, криво намекает, что пейлоды отлаживать следует именно так

    И действительно, видим, что CSP блокирует выполнение нашего пейлода:

    [​IMG]


    Поэтому, если не в курсе, то самое время почитать, что это такое https://en.wikipedia.org/wiki/Content_Security_Policy, ведь оно используется практически повсеместно, а гигантами IT уже давно. Вкратце, это такая злая штука которая блокирует возможность выполнение левых скриптов на странице, стилей, подгрузки картинок, которые могут быть внедрены в том числе и через отражённую XSS. Но, к счастью, в большинстве случаев это обходится, а некоторые компании даже платят исследователям за методы байпасса их конфигурации CSP для некоторых эндпоинтов и доменов (https://portswigger.net/research/bypassing-csp-with-policy-injection).

    После небольшого экскурса, давайте взглянем на тот, который нужно побороть нам:

    Очень хорошо, что для особо ленивых, гулаг сделал хороший чекер для этого дела https://csp-evaluator.withgoogle.com/. И мы имеем следущее:

    [​IMG]

    object-src был оставлен в надежде, что кто-то запалит или найдет зиродей :) Поэтому сосредоточимся на script-src. Описание директив, даёт лишь поверхностные варианты атаки, их гораздо больше и в текущем кейсе стоит понимать, что nonce нам точно не обойти, так как он генерится по спекам, т.е. всегда разный. Но есть возможность и очень большая вероятность, подключить что-то из разрешённого скоупа ( antichat.com *.antichat.com ) через атрибут src. Именно для этого и было сделано послабление:

    - С этого момента, в CSP добавлен более широкий скоуп, что даёт большее количество вариантов эксплуатации в обоих случаях.

    Так как первоначальный вариант был сильно ограничен и мне тогда показалось, что кто-то мог застрять на нём. Вайлдкард в свою очередь, мог позволить найти что-то на сабах античата, тот же ангуляр или какой-то скрипт, где нас ждёт eval с распростёртыми объятиями :)

    Но ближе к делу. Так как в конечном варианте решений уже может быть множество, расссмотрим первоначальный, который история для наблюдательного ресёрчера. Поэтому вернёмся в начало повествования, где говорится, что мы имеем произвольный вывод на страницу. А если он не один? Нет? А если найду? :D Чтоб не напрягать чёткого пацыка, т.е. меня (нет), идём ещё раз по линку и крутим страницу до конца:

    http://css.ctf.antichat.com/?i=<marquee><h1>Привет! Ломай меня полностью!</h1></marquee>

    [​IMG]

    [​IMG]


    Да и в том же исходнике, видно, что вывода два:
    PHP:
    <?php
    ...
    print 
    header("Content-Security-Policy: default-src 'self' ".$host." *.".$host."; frame-src 'self' ".$host." *.".$host."; script-src 'nonce-".$nonce."' 'self' ".$host." *.".$host." 'unsafe-eval'; img-src 'self' ".$scheme."s:; font-src 'self' ".$host." *.".$host."; style-src 'self' ".$host." *.".$host." 'unsafe-inline' 'unsafe-eval'; connect-src 'self' ".$host." *.".$host." 'unsafe-inline'; form-action 'self' ".$host." *.".$host."; base-uri 'self' ".$host." *.".$host."; report-uri ".$host."/").$filtered;
    ?>
    ...
    </body></html>
    <?=$filtered?>

    Но что это даёт? Спросит уже порядком подуставший читатель. Поэтому, спешу обрадовать, осталось совсем немного. Вернувшись ранее в начало нашего повествования, не будем далеко уходить и вспомним, что мы всё ещё контролируем первые байты тела ответа. И должны непременно этим воспользоваться, реюзнуть так сказать. Путём внедрения JavaScript кода и его посдедующим подключением через <script src>:


    [​IMG]
    . . .

    [​IMG]

    Как видно, из-за наличия двойного отражения в теле, используя бектики (или строковые литералы, спасибо ECMAScript 6), можем получить выражение вида alert(document.domain)-`__HTML_CONTENT__alert(document.domain)-`-alert(document.domain)-`__HTML_CONTENT__alert(document.domain)-`, тем самым завернув мешающий нам контент в строки.

    Ну и далее, дело техники, комбайним это дело с полученными ранее разработками и крафтим урл вида:

    http://css.ctf.antichat.com/?i=%fe%...00%3E%00%3C%00/%00s%00c%00r%00i%00p%00t%00%3E

    [​IMG]


    Вуаля, XSS :)