Уязвимость SUID/SGID - Обучение

Qulan

Red Team
06.12.2020
171
515
BIT
484
Приветствую

Занимаясь изучением дисциплины “Повышение прав" наткнулся на очень интересную технику которой хотел бы поделиться и разобрать более детально.
  • Дисциплина “Повышение прав”
  • Уязвимость “SUID/SGID Executable”
  • Реализация “Подмена переменной PATH”
root.png

Допустим нам дана машина где мы находим suid файл /usr/local/bin/suid-env
Код:
ls -l /usr/local/bin/suid-env
-rwsr-sr-x 1 root staff 6883 May 14  2017 /usr/local/bin/suid-env
Видим что он действительно suid и владелец root

Для нас это означает, что программа может быть запущена нами и все что она сделает будет от супер-пользователя. Хорошо, а что собственно она делает? Давайте разбираться

1. Запустим ее и посмотрим что из этого получится
Код:
/usr/local/bin/suid-env
1614781722000.png


Ок, она просто запускает apache2

2. Попробуем прояснить по какой логике она это делает
Код:
strings /usr/local/bin/suid-env
1614781803000.png


Из интересного для нас:
Код:
setresuid
service apache2 start

setresuid

Функция setresuid устанавливает идентификатор реального пользователя. То есть uid=0 (он же рут)

service apache2 start

Этой командой запускается веб сервер apache2. Что тут важно, так это то, что программа suid-env обращается к команде service не используя полный путь. Что это значит?

Давайте рассуждать!

Каким образом получается так, что если вы вводите какую-то команду, например cat <file> и она работает ? Все дело в переменной окружения $PATH

Поглядим echo $PATH

1614781915800.png


Как видим указан путь /usr/bin а в нем то и лежит наша утилита cat
Получается, что если мы даем оболочке команду, она сразу обращается к переменной окружения и имея путь обращается у нужной нам утилите.

И так, вернемся к нашим баранам. Получается такая логика:

Мы запускаем /usr/local/bin/suid-env, она знает что нужно обратится к service и чтоб это сдалеть, она обратится к переменной $PATH чтобы получить полный путь.

Как же повысить права имея эти данные?
  1. Мы подменяем файл service так как /usr/local/bin/suid-env все равно что запускать, главне чтоб название совпало.
  2. Так как быдет происходит обращение к $PATH, нам нужно сделать подмену пути к service (если не сделаем обратимся к реальному файлу)
Подмена файла service

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

1614781993500.png

Код:
setuid(0) - устанавливаем права root
system("/bin/bash -p") - вызываем оболочку bash
Скомпилируем данный исходник:
Код:
gcc -o service /home/user/tools/suid/service.c
1614782038400.png

Хорошо, мы создали свой service который будет возвращать оболочку, теперь нужно решить вопрос с подменой значений переменной $PATH
Код:
PATH=/директория нашего файла :$PATH
Этой командой мы добавляем нужную директорию с нашим файлом в переменную.

Теперь сново запустим /usr/local/bin/suid-env

1614782076400.png


Мы есть Root!!!
Как и писал ранее, главное достичь понимания того, что выделаете и почему вы делаете именно так. Тогда полученные знания на вечно закрепятся у вас в голове.
Спасибо за внимание
 
Последнее редактирование модератором:

nks1ck

Green Team
02.11.2020
223
109
BIT
0
Только вхожу в эту тему, с таким подробным объяснением все встает на свои места и все становится понятно. Спасибо)
 

yamakasy

Green Team
30.10.2020
158
113
BIT
0
Похоже сайт codeby пополнился очень активным и интересно пишущим мембером, это не может не радовать. Благодарю за статью
 
  • Нравится
Реакции: Adrian Grum

Germanik

One Level
18.10.2020
1
2
BIT
0
Доброго здравия и бодрого расположения духа. Толково. Респект. Успехов во всем.
 

Tihiy omut

New member
05.03.2021
1
0
BIT
0
Приветствую

Занимаясь изучением дисциплины “Повышение прав" наткнулся на очень интересную технику которой хотел бы поделиться и разобрать более детально.
  • Дисциплина “Повышение прав”
  • Уязвимость “SUID/SGID Executable”
  • Реализация “Подмена переменной PATH”
Допустим нам дана машина где мы находим suid файл /usr/local/bin/suid-env
Код:
ls -l /usr/local/bin/suid-env
-rwsr-sr-x 1 root staff 6883 May 14  2017 /usr/local/bin/suid-env
Видим что он действительно suid и владелец root

Для нас это означает, что программа может быть запущена нами и все что она сделает будет от супер-пользователя. Хорошо, а что собственно она делает? Давайте разбираться

1. Запустим ее и посмотрим что из этого получится
Код:
/usr/local/bin/suid-env
Посмотреть вложение 47520

Ок, она просто запускает apache2

2. Попробуем прояснить по какой логике она это делает
Код:
strings /usr/local/bin/suid-env
Посмотреть вложение 47521

Из интересного для нас:
Код:
setresuid
service apache2 start

setresuid

Функция setresuid устанавливает идентификатор реального пользователя. То есть uid=0 (он же рут)

service apache2 start

Этой командой запускается веб сервер apache2. Что тут важно, так это то, что программа suid-env обращается к команде service не используя полный путь. Что это значит?

Давайте рассуждать!

Каким образом получается так, что если вы вводите какую-то команду, например cat <file> и она работает ? Все дело в переменной окружения $PATH

Поглядим echo $PATH

Посмотреть вложение 47522

Как видим указан путь /usr/bin а в нем то и лежит наша утилита cat
Получается, что если мы даем оболочке команду, она сразу обращается к переменной окружения и имея путь обращается у нужной нам утилите.

И так, вернемся к нашим баранам. Получается такая логика:

Мы запускаем /usr/local/bin/suid-env, она знает что нужно обратится к service и чтоб это сдалеть, она обратится к переменной $PATH чтобы получить полный путь.

Как же повысить права имея эти данные?
  1. Мы подменяем файл service так как /usr/local/bin/suid-env все равно что запускать, главне чтоб название совпало.
  2. Так как быдет происходит обращение к $PATH, нам нужно сделать подмену пути к service (если не сделаем обратимся к реальному файлу)
Подмена файла service

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

Посмотреть вложение 47523
Код:
setuid(0) - устанавливаем права root
system("/bin/bash -p") - вызываем оболочку bash
Скомпилируем данный исходник:
Код:
gcc -o service /home/user/tools/suid/service.c
Посмотреть вложение 47524
Хорошо, мы создали свой service который будет возвращать оболочку, теперь нужно решить вопрос с подменой значений переменной $PATH
Код:
PATH=/директория нашего файла :$PATH
Этой командой мы добавляем нужную директорию с нашим файлом в переменную.

Теперь сново запустим /usr/local/bin/suid-env

Посмотреть вложение 47525

Мы есть Root!!!
спасибо за инфу)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!