Skip to content

Latest commit

 

History

History
267 lines (204 loc) · 24 KB

File metadata and controls

267 lines (204 loc) · 24 KB

Салют 👋,
Данная лабораторная работа посвящена изучению *nix машин и как они работают, позволяет приобрести навыки для работы с терминалом/ консолью и приобрести знания по работе ОС. В лабораторной работе описываются материалы по командам, скриптам и подключаемым приложениям.

Для сдачи данной работы также будет требоваться ответить на дополнительные вопросы по описанным темам.


Структура репозитория лабораторной работы

lab02
├── exmpl_hello.py
├── pygamesteel.py
├── pygamesteel_fixed.py
└── README.md

Материалы

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

Терминал
Устройство ввода/вывода — интерфейс между пользователем и системой.
Оболочкаshell (bash, zsh)
Интерпретатор команд, обеспечивающий интерфейс для взаимодействия пользователя с функциями ОС.
envexportechoresetlogoutexit
КонсольCLI commands
Интерфейс командной строки с командами для работы с файлами и каталогами.
lscdtouchmkdirrmcpmvlncatdfduwcuniqgrep
ФСFilesystem Hierarchy
Иерархия каталогов и файлов с правами доступа пользователей.
/bin/sbin/dev/etc/lib/home/root/usr/var/tmp/proc/mnt/boot/sys
ENVEnvironment Variables
Переменные, задающие контекст работы пользователя и процессов.
SHELLUSERHOMEPATHPWDLANG

Права доступа

Неправильно назначенные права — одна из частых причин эскалации привилегий (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 отчет и отправить ссылку личным сообщением

Смотри также


Troubleshooting

Если столкнулись с проблемами — смотрите Troubleshooting.

Links