Эксплуатация уязвимости f-строки в Python

Экс­плу­атации уяз­вимости f-стро­ки Python

В этой небольшой статье, в рамках прохождения уязвимой виртуальной машины Format с площадки Hack The Box, я покажу, как повысить привилегии путем эксплуатации уязвимости f-стро­ки в Python.

Еще по теме: Ата­ка на API веб‑при­ложе­ния Django

Эксплуатация уязвимости f-строки в Python

Для начала получим информацию о сис­теме. Я буду исполь­зовать для это­го скрип­ты PEASS.

Заг­рузим на хост скрипт для Linux, дадим пра­во на выпол­нение и запус­тим ска­ниро­вание. В выводе будет мно­го информа­ции, смот­рим самое инте­рес­ное.

Нас­трой­ки sudoers дос­тупны толь­ко при вво­де пароля.

Нас­трой­ки sudoers

Ви­дим нес­коль­ко фай­лов, в том чис­ле исполня­емых, которые добав­лены в сис­тему поль­зовате­лем.

До­бав­ленные поль­зовате­лем фай­лы
До­бав­ленные поль­зовате­лем фай­лы

Боль­ше ничего инте­рес­ного.

Так как мы зна­ем пароль поль­зовате­ля, все‑таки про­верим нас­трой­ки sudoers.

Нас­трой­ки sudoers
Нас­трой­ки sudoers

Ока­зыва­ется, мы можем запус­тить при­ложе­ние /usr/bin/license от име­ни поль­зовате­ля root.

Про­верим тип фай­ла с помощью ути­литы file.

Про­вер­ка типа фай­ла
Про­вер­ка типа фай­ла

Это скрипт на Python. Смот­рим его исходный код в любом удоб­ном редак­торе. Это при­ложе­ние может быть запуще­но толь­ко при­виле­гиро­ван­ным поль­зовате­лем (стро­ки 22–26). Затем при­ложе­ние чита­ет сек­рет из фай­ла /root/license/secret, а из сек­рета фор­миру­ется ключ шиф­рования (стро­ки 37–43).

Ис­ходный код при­ложе­ния license
Ис­ходный код при­ложе­ния license

За­тем при­ложе­ние получа­ет дан­ные из базы Redis и откры­вает файл с клю­чами лицен­зии /root/license/keys (стро­ки 48–61).

Сле­дом из базы Redis чита­ются парамет­ры username, first-name и last-name, которые вмес­те с содер­жимым лицен­зии выводят­ся поль­зовате­лю (стро­ки 62–78).

Ис­ходный код при­ложе­ния license
Ис­ходный код при­ложе­ния license

При выводе исполь­зует­ся f-стро­ка (стро­ки 65 и 69). Так как через базу Redis мы можем кон­тро­лиро­вать вход­ные дан­ные, поп­робу­ем в качес­тве одно­го из парамет­ров записать такую стро­ку:

Она дол­жна будет вывес­ти сек­рет!

За­пись в базу Redis
За­пись в базу Redis

Те­перь запус­каем при­ложе­ние, ука­зывая соз­данный ключ ralf, и ищем в выводе сек­рет.

Экс­плу­ата­ция уяз­вимос­ти
Экс­плу­ата­ция уяз­вимос­ти

По­лучен­ный сек­рет про­буем при­менить в качес­тве пароля рута. Пароль под­ходит, забира­ем флаг.

Уяз­вимость f-стро­ки Python

Ма­шина зах­вачена!

Защита от уязвимости f-строки в Python

Уязвимость f-строки в Python может возникнуть, если вставка переменных в строку не происходит безопасно. Это может привести к проблемам с безопасностью, таким как инъекции.

Чтобы обезопасить использование f-строк и избежать уязвимостей, следует следовать следующим правилам:

1. Не вставляйте данные, которые могут быть введены пользователем напрямую в f-строку. Это может привести к SQL-инъекциям и другим атакам. Не делайте так:

2. Используйте функции форматирования, которые обеспечивают экранирование значений, такие как `html.escape` для HTML-строк или параметризированные запросы для баз данных. Пример с экранированием HTML:

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

4. Используйте f-строки только с данными, которые вы контролируете и которые можно считать надежными.

Эти простые правила помогут избежать уязвимостей при использовании f-строк в Python.

ПОЛЕЗНЫЕ ССЫЛКИ:

Дима (Kozhuh)

Эксперт в кибербезопасности. Работал в ведущих компаниях занимающихся аналитикой компьютерных угроз. Анонсы новых статей в Телеграме.

Добавить комментарий