Салют 👋,
Данная лабораторная работа посвящена изучению *nix машин и как они работают, позволяет приобрести навыки для работы с терминалом/ консолью и приобрести знания по работе ОС. В лабораторной работе описываются материалы по командам, скриптам и подключаемым приложениям.
Для сдачи данной работы также будет требоваться ответить на дополнительные вопросы по описанным темам.
lab02
├── exmpl_hello.py
├── pygamesteel.py
├── pygamesteel_fixed.py
└── README.mdДавайте начнем с описания как это работает, но следует подойти к этому вопросу изначально с терминов и основных элементов, таких как:
Неправильно назначенные права — одна из частых причин эскалации привилегий (privilege escalation). Если скрипт запускается от root, а конфиг доступен на запись всем (777) — злоумышленник может подменить конфиг и получить root-shell. Именно поэтому контроль прав — базовый навык для AppSec-инженера.
При монтировании образа для каждой *nix ОС задаются права доступа к файлам и путям каталогов, которые позволяют их индивидуально профилировать, а также изменять, но давайте посмотрим на общую картину, советую ознакомиться изначально с Петром Девянином и его описанием take-grant модели. Система безопасности построена на:
- chmod — изменение прав доступа
$ chmod [-R] [option] [rules] # пользователь может менять только у принадлежащих ему файлов, а root у всех файлов в системе
- umask — маска прав доступа для получения реальных прав вновь
- chown — изменение владельца
$ chown [-R] user[:group] file # доступна только для root
-R # рекурсивная смена
- chgrp — изменение группы
$ chgrp [-R] group ... file # изменение группы файла для пользователя только там, где он является ее членомУ каждого файла или каталога имеются определенные права доступа, такие как:
- r — право на чтение из файла / просмотр содержимого директории
- w — право на запись в файл / создание, удаление файлов в директории
- x — право на исполнение / доступ в директорию и сабдиректории
По умолчанию права для директории 777, а для файлов 666.
- SUID (Set User ID,
chmod u+s) — при запуске файла процесс получает права владельца файла, а не запустившего пользователя. Пример:/usr/bin/passwdимеет SUID, чтобы обычный пользователь мог менять свой пароль (запись в/etc/shadowтребует root). Риск: если SUID-бинарник содержит уязвимость — это прямой путь к privilege escalation - SGID (Set Group ID,
chmod g+s) — аналогично для группы. На директории: все новые файлы наследуют группу каталога - Sticky bit (
chmod +tили1xxx) — на директории: удалить файл может только его владелец или root, даже если права на директорию777. Пример:/tmpимеет sticky bit — все могут создавать файлы, но удалять только свои
$ chmod u+s script.sh # SUID
$ chmod g+s dir/ # SGID
$ chmod +t dir/ # Sticky bit
$ chmod 4755 script.sh # SUID через octal (4 = SUID)
$ chmod 1777 /tmp # Sticky bit через octal (1 = sticky)
$ ls -la /tmp # drwxrwxrwt — буква 't' = sticky bitА теперь давайте посмотрим, как можно поменять права. На сейчас все *nix поддерживают POSIX ACL, который позволяет указать права доступа для конкретных пользователей и групп.
$ getfacl [option] file ... # показывает список access list
$ setfacl [option] file ... # устанавливает или удаляет access list
-m # изменение или установка
-х # удаление
# Пример
$ setfacl -m u:user1:rw file # для пользователя
$ setfacl -m g:users:r file # для группы
$ setfacl -m m::rw file # для маски
А теперь давай посмотрим, что каждому выполняемому процессу присваивается уникальный номер PID Process ID, где его ID после завершения процесса высвобождается. У всех процессов в системе кроме самого первого (PID = 1 - init) есть родительские, которые запускают процесс.
$ ps [option] # список процессов в системе
-a # список всех процессов привязанных к терминалу
-x # ... не привязанных к терминалу
-e # показывает все процессы системы
-f # показывает дерево процессов
-u user # список процессов пользователя
$ pstree # дерево процессов
$ kill [-l] PID # пример как можно вывести список всех сигналов
$ killall [-signal] # определение процесса по имениПосле завершения работы родительского процесса у наследователя становится init. Также, если shell заканчивает работу, то все процессы будут завершены. Но если надо, что бы программа работала далее без оболочки, то ее необходимо запускать при помощи nohup, так как он отключает программу от терминала. А теперь, все вы знаете про daemon — а это именно то, что работает после запуска и сразу же отключается от терминала.
- 1. Выведите на терминале и проанализируйте следующие команды консоли
$ who | wc -l
$ id
$ whoami
$ hostnamectl- 2. Выведите утилитой
treeсписок вложенности дерева директорий для каталога своего пользователя. Далее используйтеls -aи укажите отличие отls -l. - 3. Используйте утилиту
fileиdfдля определения какая файловая система на разделе/dev/sda1. - 4. Выведите на терминале и проанализируйте следующие команды консоли
$ which vi
$ locate hello.py
$ sudo updatedb
$ locate hello
$ touch screen
$ find ~ -name screen
$ locate screen
$ sudo updatedb
$ locate screen- 5. Используйте конструкцию и вставьте ее в созданный файл ранее. Подключите
pygame- используем исключительно для стилизации окна.
Hint: в коде ниже есть намеренная ошибка — переменная
screenне присвоена. Найдите и исправьте баг, сохраните исправленную версию какpygamesteel_fixed.py.
import pygame
pygame.init()
# Устанавливаем размеры окна
screen_width = 800
screen_height = 600
window_size = (screen_width, screen_height)
pygame.display.set_mode(window_size) # Создаем окно
# Задаем цвет фона
bg_color = (255, 255, 255)
pygame.draw.rect(screen, bg_color, [0, 0, screen_width, screen_height], 1)
# Выводим текст на экран
font = pygame.font.SysFont(None, 75)
text = font.render("Hello appsec world*", True, (0, 255, 0))
text_rect = text.get_rect()
text_rect.center = (400, 300)
screen.blit(text, text_rect)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
pygame.display.flip() # Обновляем экран- 6. Сделайте
commitиpushв свой репозиторий с изменениями вmaster branch. На следующих лабораторных работах мы вернемся к этому файлу. - 7. Выведите на терминале и проанализируйте следующие команды консоли
$ groups
$ useradd smallman
$ userdel smallman -rf
$ useradd smallman
$ passwd smallman
$ usermod smallman -c 'Hach Hachov Hacherovich,239,45-67,499-239-45-33'
$ passwd smallman
$ id smallman
$ groupadd -g 1500 readgroup
$ usermod -aG readgroup smallman
$ chmod 666 screen - 8. Выведите группу прав для
screenи измените, чтобы файл был доступен только для чтения созданному пользователю и выведите права этого пользователя для измененного файла только используяreadgroup. - 9. Используйте
POSIX ACL. Выведите на терминале и проанализируйте следующие команды консоли
$ touch nmapres.txt
$ setfacl -m u:smallman:rw nmapres.txt
$ setfacl -m g:readgroup:r nmapres.txt
$ getfacl nmapres.txt- 10. Сохраните файл внутри локального репозитория, так как следующая работа будет подразумевать запись в нее данных о nmap.
- 11. Для закрепления выведите все списки групп пользователей на вашей ОС и права на верхнеуровневые каталоги.
- 12. Выведите все права для файлов и директорий локального репозитория которые имеют различные пользователи (без использования длинных путей)
- 13. Создайте скрипт
test_privesc.shс содержимымecho "Running as $(whoami)". Сделайте его исполняемым (chmod +x), установите SUID-бит (chmod u+s) и запустите от другого пользователя. Опишите, почему SUID опасен и как это используется для privilege escalation - 14. Создайте директорию
shared/с правами770и sticky bit (chmod 1770). Добавьте файлы от двух пользователей. Убедитесь, что каждый может удалить только свои файлы. Опишите разницу между770и1770 - 15. Найдите все SUID-файлы в системе:
find / -perm -4000 2>/dev/null. Опишите 3 найденных файла — зачем им SUID и какой риск они несут - 16. Выведите процессы которые у вас запущены в терминале и вне его.
- 17. Оформить
README.mdпо аналогии и использоватьshield, etc. - 18. Составить
gistотчет и отправить ссылку личным сообщением
- CheatSheet: Git — шпаргалка по командам Git
- Лаб. №3 — Nmap — следующий шаг: используем
nmapres.txtиз этой лабы - Подготовка окружения — если не настроена VM
Если столкнулись с проблемами — смотрите Troubleshooting.