НоCSSтальгиR

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

  1. crlf

    crlf Green member

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

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


    css.ctf.antichat.xyz


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

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

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


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

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


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


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



    -


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

    Attached Files:

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

      ex0dus Reservists Of Antichat

      Joined:
      23 Feb 2010
      Messages:
      44
      Likes Received:
      111
      Reputations:
      9
      http://css.ctf.antichat.xyz/index.php?i=<a href="https://antichat.xyz/" target="_blank" onclick=""><img src="https://i.ibb.co/H4FmFhP/123123123123.png"></a>

      upload_2020-7-10_21-53-51.png
       
      #2 ex0dus, 10 Jul 2020
      Last edited: 10 Jul 2020
      1. BigBear

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

        Joined:
        4 Dec 2008
        Messages:
        1,801
        Likes Received:
        920
        Reputations:
        862
        круто) Только забыл <!-- чтобы тело спрятать

        http://css.ctf.antichat.xyz/index.p...//i.ibb.co/H4FmFhP/123123123123.png"></a><!--
         
        _________________________
        1. alexzir

          alexzir Elder - Старейшина

          Joined:
          29 Oct 2019
          Messages:
          982
          Likes Received:
          2,377
          Reputations:
          25
          http://css.ctf.antichat.xyz/?i=<mar...uee onstart=alert(document.domain) </marquee>
          Тело прятать не стал, без него эффект не тот :)
           
          CyberTro1n likes this.
          1. crlf

            crlf Green member

            Joined:
            18 Mar 2016
            Messages:
            684
            Likes Received:
            1,515
            Reputations:
            460
            http://css.ctf.antichat.xyz/?i=<style>.hacked{position:absolute;width:1000px;height:1000px;margin-left:300px;}</style><img/class="hacked"/src=https://i.imgur.com/jKz7mmc.png>
            [​IMG]

            ^^
             
            joelblack likes this.
            1. crlf

              crlf Green member

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

              • С самого старта задания присутствует бекап исходников - http://css.ctf.antichat.xyz/index.php~
              • В случае с XSS, атакующий контролирует первые байты документа (?)
              • console.log(), в сорцах HTML, криво намекает, что пейлоды отлаживать следует именно так
              • С этого момента, в CSP добавлен более широкий скоуп, что даёт большее количство вариантов эксплуатации в обоих случаях. Пример для "дефейса":
              Code:
              # Открывать в десктопном FireFox, хром какашка :(
              
              http://css.ctf.antichat.xyz/?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.xyz/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.
              1. BigBear

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

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

                  crlf Green member

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

                    crlf Green member

                    Joined:
                    18 Mar 2016
                    Messages:
                    684
                    Likes Received:
                    1,515
                    Reputations:
                    460
                    https://www.w3.org/International/questions/qa-byte-order-mark

                    Code:
                    http://css.ctf.antichat.xyz/?i=%fe%ff%00
                    
                     
                    1. crlf

                      crlf Green member

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

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

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

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

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

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

                      [​IMG]


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

                      http://css.ctf.antichat.xyz/?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.xyz *.antichat.xyz ) через атрибут src. Именно для этого и было сделано послабление:

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

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

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

                      http://css.ctf.antichat.xyz/?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.xyz/?i=%fe%...00%3E%00%3C%00/%00s%00c%00r%00i%00p%00t%00%3E

                      [​IMG]


                      Вуаля, XSS :)