- What is SUID and how to set SUID in Linux/Unix?
- What is SUID and how to set it in Linux?
- Learn SUID with examples:
- Example1: passwd command
- Example2: ping command
- Example3: crontab and at command
- How can I setup SUID for a file?
- Some FAQ’s related to SUID:
- A) Where is SUID used?
- B) I am seeing ‘S’ I.e. Capital ‘s’ in the file permissions, what is that?
- SUID with execute permissions:
- SUID without execute permissions:
- C) How can I find all the SUID set files in Linux/Unix.
- D) Can I set SUID for folders?
- E) What is SUID numerical value?
- Surendra Anne
- Latest posts by Surendra Anne (see all)
- Я есть root. Повышение привилегий в ОС Linux через SUID/SGID
- Что такое SUID?
- Пример с curl
- Пример с systemctl
- А что с битом смены группы владения SGID (Set Group ID)?
- Харденинг
- Напоследок
What is SUID and how to set SUID in Linux/Unix?
There are some other special permission apart from the normal file permissions read, write and execute which we set with chmod and chown commands. They are SUID, SGID, Sticky Bit, ACL’s, SUDO, SELinux for granular file/folder management by Linux administrator. Today we will see
1) What is SUID? 2) How to set SUID? 3) Where to use SUID?
What is SUID and how to set it in Linux?
SUID (Set owner User ID up on execution) is a special type of file permissions given to a file. Normally in Linux/Unix when a program runs, it inherit’s access permissions from the logged in user. SUID is defined as giving temporary permissions to a user to run a program/file with the permissions of the file owner rather that the user who runs it. In simple words users will get file owner’s permissions as well as owner UID and GID when executing a file/program/command.
The above sentence is a tricky one and should be explained in-depth with examples.
Learn SUID with examples:
Example1: passwd command
When we try to change our password we will use passwd command, which is owned by root. This passwd command file will try to edit some system config files such as /etc/passwd, /etc/shadow etc when we try to change our password. Some of these files cannot be opened or viewed by normal user only root user will have permissions. So if we try to remove SUID and give full permissions to this passwd command file it cannot open other files such as /etc/shadow file to update the changes and we will get permission denied error or some other error when tried to execute passwd command. So passwd command is set with SUID to give root user permissions to normal user so that it can update /etc/shadow and other files.
Example2: ping command
Similarly if we take ping command, when we have to execute this command internally it should open socket files and open ports in order to send IP packets and receive IP packets to remote server. Normal users don’t have permissions to open socket files and open ports. So SUID bit is set on this file/command so that whoever executes this will get owner (Root user’s) permissions to them when executing this command. So when this command start executing it will inherit root user permissions to this normal user and opens require socket files and ports.
Example3: crontab and at command
When scheduling the jobs by using crontab or at command it is obvious to edit some of the crontab related configuration files located in /etc which are not writable for normal users. So crontab/at commands are set with SUID in-order to write some data.
How can I setup SUID for a file?
SUID can be set in two ways
1) Symbolic way (s, Stands for Set) 2) Numerical/octal way (4)
Use chmod command to set SUID on file: file1.txt
Symbolic way:
Here owner permission execute bit is set to SUID with +s
Numerical way:
chmod 4750 file1.txt
Here in 4750, four indicates SUID bit set, seven for full permissions for owner, five for read and execute permissions for group, and no permissions for others.
How can I check if a file is set with SUID bit or not?
Use ls –l to check if the x in owner permissions field is replaced by s or S
For example: Listing file1.txt before and after SUID set
Before setting SUID bit:
ls -l total 8 -rwxr--r-- 1 xyz xyzgroup 148 Dec 22 03:46 file1.txt
After setting SUID bit:
ls -l total 8 -rwsr--r-- 1 xyz xyzgroup 148 Dec 22 03:46 file1.txt
Some FAQ’s related to SUID:
A) Where is SUID used?
1) Where root login is required to execute some commands/programs/scripts.
2) Where you don’t want to give credentials of a particular user, but want to run some programs as the owner.
3) Where you don’t want to use SUDO command, but want to give execute permission for a file/script etc.
B) I am seeing ‘S’ I.e. Capital ‘s’ in the file permissions, what is that?
After setting SUID to a file/folder if you see ‘S’ in the file permission area that indicates that the file/folder does not have executable permissions for that user on that particular file/folder.
For example see below example
chmod u+s file1.txt ls -l -rwSrwxr-x 1 surendra surendra 0 Dec 27 11:24 file1.txt
If you want to convert this S to s then add executable permissions to this file as show below
chmod u+x file1.txt ls -l -rwsrwxr-x 1 surendra surendra 0 Dec 5 11:24 file1.txt
you should see a smaller ‘s’ in the executable permission position now.
SUID with execute permissions:
SUID without execute permissions:
C) How can I find all the SUID set files in Linux/Unix.
The above find command will check all the files which are set with SUID bit (4000).
D) Can I set SUID for folders?
Yes, you can if it’s required (you should remember one thing that Linux treats everything as a file)
E) What is SUID numerical value?
Please comment your thoughts about SUID usage in your company.
Surendra Anne
Mr Surendra Anne is from Vijayawada, Andhra Pradesh, India. He is a Linux/Open source supporter who believes in Hard work, A down to earth person, Likes to share knowledge with others, Loves dogs, Likes photography. He works as Devops Engineer with Taggle systems, an IOT automatic water metering company, Sydney . You can contact him at surendra (@) linuxnix dot com.
Latest posts by Surendra Anne (see all)
- Docker: How to copy files to/from docker container — June 30, 2020
- Anisble: ERROR! unexpected parameter type in action: Fix — June 29, 2020
- FREE: JOIN OUR DEVOPS TELEGRAM GROUPS — August 2, 2019
- Review: Whizlabs Practice Tests for AWS Certified Solutions Architect Professional (CSAP) — August 27, 2018
- How to use ohai/chef-shell to get node attributes — July 19, 2018
Я есть root. Повышение привилегий в ОС Linux через SUID/SGID
В прошлом посте я провел «обзорную экскурсию» по методам повышения привилегий в ОС Linux. Сегодня разбираю вектор повышения привилегий через небезопасные разрешения SUID/SGID. Поэтому больше консоли и меньше слов.
Что такое SUID?
Бит смены владельца или SUID (Set User ID) — это разрешение файловой системы Linux, которое позволяет запустить исполняемый файл от имени его владельца. Он нужен, потому что многие действия в Linux (например, открытие «сырого» сетевого сокета) требуют прав суперпользователя. Хорошо знакомая всем команда ping использует сетевые сокеты и поэтому должна быть запущена от root’а. Каким образом можно позволить обычному пользователю применять команду ping? Можно выдать пользователю sudo на необходимые команды. Но представьте, что на условной Linux-машине имеется 100 пользователей и насчитывается около 20 привилегированных команд. А как потом управлять разрешениями sudo на все это «богатство»? Не самое элегантное решение, не правда ли? С другой стороны, бит смены владельца значительно упрощает процесс. Бит смены владельца сообщит системе, что все 100 пользователей системы запускают команду ping от имени root.
Итак, мы с вами поняли, что представляет собой SUID, но также это понимают и хакеры. В большинстве случаев повышение привилегий через исполняемый файл с SUID возможно, если:
- исполняемый файл позволяет взаимодействовать с файловой системой;
- исполняемый файл так или иначе имеет возможность выхода в командную строку.
Пример с curl
Разберемся по порядку. Допустим, я обнаружил, что исполняемому файлу curl выставлен бит смены владельца, мы можем это понять по букве s в разрешениях файла.
Выставление SUID для curl
Выставленный SUID позволяет скачивать файл от имени root’а. Поскольку файл скачивает root, то он же является и владельцем файла.
Загрузка файла через curl с SUID
Хорошо, что с этим делать дальше? Попытаюсь заменить какой-нибудь чувствительный файл: /etc/passwd подходит как нельзя лучше. Сначала скопирую существующий файл на хост атакующего.
Скачиваю файл командой scp
В полученном файле поменяю ID пользователя и группы для пользователя bob с 1000 на 0 (что соответствует root).
Исходные ID пользователя bob
Отредактированный файл скачаю на атакуемый хост с помощью команды curl.
Успешное повышение привилегий
Пример с systemctl
Думаю, стало понятнее, однако давайте разберем другой пример: я подобрал пароль пользователя bob и получил доступ по SSH. Осматриваюсь и изучаю окружение — в этом случае командой find.
find / -user root -perm -u=s -type f 2>/dev/null
Почувствуй разницу: слева вывод linpeas, справа, по сути, тот же вывод, но команда find введена вручную
Нахожу в выводе команды find бинарник /usr/bin/systemctl. Раз у меня есть доступ к systemctl, да еще и в контексте root (ведь я нашел этот бинарник, выполняя поиск файлов, владельцем которых является root и для которых выставлен suid), я могу запустить вредоносный сервис. Особого кун-фу тут не требуется, достаточно создать текстовый файл с описанием сервиса.
[Service] Type=oneshot ExecStart=/bin/sh -c "id > /tmp/output" [Install] WantedBy=multi-user.target
Демонстрация работы сервиса
Мне ничего не мешает изменить сервис, например, написать в него бэк-коннект. Остается только поднять хендлер (обработчик) на хосте атакующего и перезапустить сервис.
Успешное повышение привилегий. Наверху хендлер, внизу запуск сервиса
Я привел примеры, в которых бит смены владельца выставлен у пользователя root, но этот вектор также можно использовать для компрометации менее привилегированных пользователей системы. Как видите, бит смены владельца — это довольно чувствительная к безопасности «вещь», и он может оказаться узким местом харденинга Linux-системы.
Главное в этом векторе, как и везде в offensive, — понимать, как все устроено. Я рекомендую повторить пару примеров, чтобы не только понять, но и осознать полученную информацию. Для практики можно самому поднять стенд и поэкспериментировать, а можно совместить приятное с полезным и поискать write up’ы hackthebox устаревших машин, где для повышения привилегий использован вектор с SUID. Порешать их, прокачать свой аккаунт, рассказать о нем на собеседовании. Со временем вы поймете, что write up’ы лишают вас ощущения победы, и когда почувствуете в себе силы, сможете применять накопленный багаж знаний.
Больше конкретных примеров повышения привилегий через SUID можно найти тут, включая разобранный нами.
А что с битом смены группы владения SGID (Set Group ID)?
В целом суть та же, но некоторые трюки будут сложнее, например /etc/passwd таким образом перезаписать не удастся, так как группе root нельзя редактировать файл. Да и сервис перезапустить не получится.
Разрешения файла /etc/passwd не позволяют группе root изменение
Попытка перезапуска сервиса
Остается вариант с интерактивным шеллом, например через vim. Для этого используйте команду:
vim -c ':py import os; os.execl("/bin/sh", "sh", "-pc", "reset; exec sh -p")
Группа root позволяет читать содержимое директории /root, но при этом нельзя даже прочитать содержимое файла id_rsa. Бит смены группы владения SGID дает несравнимо меньшие возможности для повышения привилегий.
Содержимое директории /root
Харденинг
Для безопасного харденинга рекомендую исключить наличие бита смены владельца/группы для указанных в перечне исполняемых файлов. При этом нужно учитывать, что за удалением бита смены владельца/группы могут последовать некорректное поведение сервиса и траблшутинг. И уж точно не стоит удалять бит смены владельца у всех исполняемых файлов.
Напоследок
В статье я использовал примеры из лучшего, на мой взгляд, сборника по повышению привилегий gtfobins.