
На первом easy-боксе HackTheBox я потратил два с половиной часа — не на эксплуатацию уязвимости, а на то, чтобы найти файл flag.txt. Эксплойт нашёлся за минуту. А дальше — слепое тыканье по каталогам, потому что не знал ни find, ни структуру каталогов, ни как прочитать вывод ls -la. На каждом буткемпе, который веду для новичков, картина та же: люди приходят изучать хакинг, а застревают на уровне «как перейти в другой каталог». Ни один YouTube-ролик про взлом не покажет этот момент — а именно он отделяет того, кто решит первый таск, от того, кто бросит через час. Эта статья — чеклист, который закрывает разрыв между «установил Kali» и «нашёл первый флаг».
В CTF-задании после получения шелла на целевой машине первое действие — осмотреться. Не знаешь, где что лежит — осмотр превращается в хаотичный перебор каталогов. Linux — не Windows с дисками C:\ и D:\. Здесь всё начинается с единственного корня /, и у каждого каталога своя роль. Подробнее — в нашем статье о linux для пентестера.
Заучивать все двадцать каталогов верхнего уровня не нужно. Для CTF критичны шесть-семь, где обычно прячут флаги и полезную информацию. Вот карта, которую стоит запомнить:
| Каталог | Что внутри | Почему важен для CTF |
|---|---|---|
/home |
Домашние директории пользователей | Флаги user.txt, SSH-ключи в .ssh/, конфиги, .bash_history |
/root |
Домашняя директория суперпользователя | Финальный флаг root.txt после повышения привилегий |
/etc |
Конфигурационные файлы системы | Пароли (/etc/shadow), список пользователей (/etc/passwd), конфиги сервисов |
/tmp |
Временные файлы, доступные всем на запись | Куда загружать свои инструменты, скрипты от cron-задач |
/var |
Логи, данные веб-серверов, почта | /var/www/html — файлы сайта, /var/log — логи с подсказками |
/opt |
Стороннее ПО | Кастомные приложения с уязвимостями, нестандартные скрипты |
/dev/shm |
Tmpfs в оперативной памяти | Альтернатива /tmp для загрузки инструментов — быстрее и иногда менее контролируется |
Мнемоника: Home — Root — Etc — Tmp — Var — Opt. Не самое элегантное сокращение, но после пяти-шести боксов пальцы сами набирают cd /home && ls -la.
Осмотр файловой системы — техника File and Directory Discovery (T1083, Discovery) в терминологии MITRE ATT&CK. Буквально первое, что делает атакующий после получения доступа к системе. В CTF — аналогично: получил шелл, осмотрелся, наметил цели.
Абсолютный путь начинается с / и описывает полный адрес от корня: /home/user/flag.txt. Относительный отсчитывается от текущего каталога: ./flag.txt, ../admin/notes.txt. Две точки .. — переход на уровень выше, одна точка . — текущий каталог.
Классическая ошибка: выполнить cat flag.txt, находясь не в той директории, и решить, что файла не существует. Команда pwd (print working directory) показывает, где вы сейчас. Если pwd возвращает /home/user, а нужный файл лежит в /home/admin/flag.txt — потребуется абсолютный путь или cd ../admin/.
Ещё один подводный камень — скрытые файлы. В Linux файл, чьё имя начинается с точки (.secret, .bash_history, .ssh), не показывается обычным ls. Только ls -a или ls -la выведет его. На буткемпах из десяти новичков минимум шестеро пропускают скрытые файлы в первом задании. Голый ls без флагов — ловушка, в которую попадают все.
Перед тем как переходить к практике:
Набор команд, без которого не решается ни одно CTF-задание на Linux:
cd /path — перейти в каталог. cd ~ — домашняя директория, cd - — предыдущий каталог (удобная штука, про которую мало кто знает на старте)ls -la — вывести все файлы включая скрытые, с правами, владельцем и размером. Это ваш дефолтный ls — привыкайте набирать именно такcat filename — вывести содержимое файла. Для больших файлов — less filename (навигация стрелками, выход — q)pwd — показать текущий каталог (когда потерялись в дереве директорий)id — под каким пользователем работаете, в каких группах состоите. Если id показывает uid=0(root) — привилегии уже максимальные, дальше можно не подниматьwhoami — имя текущего пользователя (короче id, но без информации о группах)uname -a — версия ядра, архитектура системы. Это System Information Discovery (T1082, Discovery) — помогает определить, какие эксплойты ядра применимы для повышения привилегийПервые три команды после получения шелла — id, pwd, uname -a. Они отвечают на три вопроса: кто я, где я, что за система. Без ответов на них дальнейшие действия — стрельба вслепую.
Две команды, которые закрывают 80% задач по поиску флагов в CTF. Если из всей статьи запомните только их — этого хватит для первых десяти боксов.
find ищет файлы по имени, типу, правам, владельцу и времени модификации:
find / -name "flag.txt" 2>/dev/null — искать файл flag.txt начиная от корня. Суффикс 2>/dev/null подавляет ошибки «Permission denied» (их будет десятки)find / -name "*.txt" -user root 2>/dev/null — все txt-файлы, принадлежащие rootfind /home -name ".*" -type f 2>/dev/null — скрытые файлы в домашних каталогахfind / -writable -type d 2>/dev/null — директории с правом записи (куда можно загрузить инструменты)grep ищет текст внутри файлов:
grep -r "flag{" /home/ 2>/dev/null — рекурсивно искать строку flag{ по всем файлам каталога /homegrep -ri "password" /etc/ 2>/dev/null — искать слово «password» без учёта регистра в конфигахgrep -l "CTF" /var/www/ 2>/dev/null — вывести только имена файлов, содержащих «CTF», без самого содержимогоСвязка find + grep — основной инструмент для техники Credentials In Files (T1552.001, Credential Access). Атакующие ищут пароли, SSH-ключи и API-токены, забытые в конфигурационных файлах. В CTF это работает буквально: grep -ri "password" /var/www/ нередко выдаёт учётные данные базы данных прямо из конфига веб-приложения. Вот так просто — grep и готово.
Самая частая ошибка: забыть 2>/dev/null. Без этого суффикса терминал заваливается строками «Permission denied», и полезные результаты теряются в потоке мусора. На буткемпах показываю это в первые пять минут — и всё равно половина группы забывает через полчаса. Ничего страшного, через пару боксов станет рефлексом.
Выполните ls -la в любом каталоге — увидите столбец с непонятными символами слева. Разбираем:
-rwxr-xr-x 1 root root 68208 Jul 15 10:00 /usr/bin/passwd
drwxr-x--- 2 admin admin 4096 Jul 15 10:00 secret/
-rw------- 1 root shadow 891 Jul 15 10:00 /etc/shadow
-rwsr-xr-x 1 root root 12345 Jul 15 10:00 /usr/local/bin/backup
Первый символ: - — обычный файл, d — директория, l — символическая ссылка. Дальше — три тройки по три символа:
Каждая позиция: r (read, чтение, вес 4), w (write, запись, вес 2), x (execute, выполнение, вес 1). Дефис - — право отсутствует.
Разберём строку -rw------- для /etc/shadow: владелец (root) может читать и писать (rw-), группа и все остальные — ничего (---). Поэтому для чтения хешей паролей нужны привилегии root — это защита, описанная как техника /etc/passwd and /etc/shadow (T1003.008, Credential Access).
Числовая нотация chmod складывает веса: rwx = 4+2+1 = 7, r-x = 4+0+1 = 5, r-- = 4+0+0 = 4, --- = 0. Отсюда: chmod 755 script.sh даёт rwxr-xr-x, а chmod 600 secret.txt даёт rw-------.
Типичная ошибка новичков — ставить chmod 777 на всё подряд, «чтобы заработало». Это даёт полный доступ всем пользователям системы, что в реальной инфраструктуре — Security Misconfiguration (OWASP A05:2021). В CTF chmod 777 на файл с паролями означает, что любой пользователь может его прочитать — иногда это и есть вектор атаки, заложенный создателем задания.
SUID (Set User ID) — специальный бит, при котором программа выполняется не с правами запустившего пользователя, а с правами владельца файла. Если бинарник принадлежит root и имеет SUID-бит — любой пользователь, запустив его, временно получает root-привилегии. Звучит как дыра? Иногда так и есть.
В выводе ls -la SUID обозначается буквой s вместо x в позиции владельца. В примере выше /usr/local/bin/backup имеет -rwsr-xr-x — s вместо x у владельца, SUID активен.
Некоторые SUID-бинарники — нормальное поведение системы: /usr/bin/passwd нуждается в root-правах, чтобы записать новый хеш в /etc/shadow. Но если SUID-бит установлен на интерпретаторе (python3, perl, bash) или утилите вроде find, vim, nmap старых версий — это прямой путь к root-шеллу. Техника Setuid and Setgid (T1548.001, Privilege Escalation).
Поиск SUID-бинарников: find / -perm -4000 -type f 2>/dev/null. Каждый нестандартный результат (не /usr/bin/passwd, не /usr/bin/sudo, не /usr/bin/mount) проверяйте на GTFOBins (gtfobins.github.io) — проект каталогизирует эксплуатационные пути для десятков Unix-утилит. Например, find с SUID-битом может дать root-шелл командой: find . -exec /bin/sh -p \; -quit. Нюанс: на Debian/Ubuntu /bin/sh — это dash, который может не поддерживать флаг -p для сохранения effective UID. В таких случаях используйте find . -exec /bin/bash -p \; -quit (bash с -p не сбрасывает привилегии). Проверяйте актуальную команду на GTFOBins.
SUID на интерпретаторах (Python, Perl, Ruby) — один из самых надёжных векторов privilege escalation на практике. Эти инструменты дают слишком широкий контроль над системными вызовами, чтобы безопасно работать от имени root. Увидели SUID на Python — считайте, что root у вас в кармане.
[Применимо: CTF jeopardy и easy/medium боксы HackTheBox/TryHackMe. На hardened-продакшне нестандартные SUID-бинарники встречаются реже, а MAC-политики (SELinux, AppArmor) могут блокировать эксплуатацию даже при наличии бита.]
Чеклист ниже — последовательность действий после получения шелла на целевой Linux-машине. Каждый шаг — звено в цепочке: discovery (осмотр) через credential access (поиск учётных данных) к privilege escalation (повышение привилегий). Работает для jeopardy-CTF и easy/medium боксов.
Первые команды после получения шелла — без них непонятно, с чем работать:
id # кто я? uid, gid, группы
uname -a # ядро, архитектура
cat /etc/os-release # дистрибутив и версия
which find grep chmod # проверяем наличие ключевых утилит
sudo -l # что можно запускать через sudo?
cat /etc/passwd # список всех пользователей
Команда sudo -l — тут внимательно. Если в выводе есть строка (ALL) NOPASSWD: /usr/bin/vim — это мгновенный root: внутри vim выполняете :!/bin/bash и получаете шелл суперпользователя. Техника Sudo and Sudo Caching (T1548.003, Privilege Escalation). Если sudo -l просит пароль — не застревайте, переходите к следующим шагам и вернётесь, когда найдёте учётные данные.
Файл /etc/passwd не требует привилегий root и содержит список всех пользователей системы. Ищите пользователей с shell /bin/bash или /bin/sh — именно у них стоит проверять домашние каталоги на наличие флагов.
Порядок — от самого вероятного к менее очевидному:
# Прямой поиск флагов
find / \( -name "flag*" -o -name "user.txt" -o -name "root.txt" \) 2>/dev/null
# Поиск по формату флага (подставьте формат вашего CTF)
grep -r "flag{" / 2>/dev/null
grep -r "CTF{" / 2>/dev/null
# Скрытые файлы в домашних каталогах
find /home -name ".*" -type f 2>/dev/null
# SSH-ключи (приватные ключи = доступ к другим аккаунтам)
find / -name "id_rsa" -o -name "id_ed25519" 2>/dev/null
# Пароли в конфигах
grep -ri "password\|passwd\|credentials\|secret" /etc/ /var/ /opt/ 2>/dev/null
# Недавно изменённые файлы (за последние 30 минут)
find / -mmin -30 -type f -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null
# Файлы, принадлежащие текущему пользователю (вне домашней директории)
find / -user $(whoami) -not -path "/home/*" -not -path "/proc/*" 2>/dev/null
Нашли SSH-ключ (id_rsa)? Можно использовать для входа под другим пользователем: chmod 600 id_rsa && ssh -i id_rsa user@localhost. Не забудьте chmod 600 — SSH откажется работать с ключом, доступным на чтение другим пользователям. Без этого получите ошибку и будете гадать, что не так (проверено на себе).
Три команды для поиска векторов повышения привилегий:
find / -perm -4000 -type f 2>/dev/null — SUID-бинарникиfind / -perm -2000 -type f 2>/dev/null — SGID-бинарники (менее распространённый вектор, но проверить стоит)getcap -r / 2>/dev/null — Linux capabilities (реже встречается на easy-боксах, но cap_setuid+ep на Python или другом интерпретаторе даёт аналогичный результат — root-шелл, хотя механизм иной: capabilities — гранулярные права ядра, а не подмена UID. Команда эксплуатации отличается от SUID — проверяйте секцию «Capabilities» на GTFOBins для конкретного бинарника)Каждый нестандартный результат — проверяете на GTFOBins. Нестандартный — всё, что не /usr/bin/passwd, /usr/bin/sudo, /usr/bin/mount, /usr/bin/su. Если в списке оказался /usr/bin/python3, /usr/bin/vim, /usr/bin/find, /usr/bin/bash — это вектор к root. Бинго.
Техника Shell History (T1552.003, Credential Access) — предыдущие пользователи могли наследить:
cat ~/.bash_history — история команд текущего пользователяcat /home/*/.bash_history 2>/dev/null — история всех пользователей (если есть доступ на чтение)env или printenv — переменные окружения: иногда пароли хранятся в DB_PASSWORD, SECRET_KEY, API_TOKENcat /etc/shadow — хеши паролей (требует root или группу shadow)В .bash_history регулярно встречаются пароли, набранные по ошибке в командной строке: mysql -u root -p password123, sshpass -p 'MyS3cret' ssh admin@192.168.1.10. Это не гипотетическая ситуация — создатели CTF-заданий специально оставляют такие артефакты, потому что в реальной жизни люди делают это постоянно. Я сам находил пароли в .bash_history на реальных проектах — не раз и не два.
Описанный чеклист покрывает easy-боксы и большинство medium-заданий в jeopardy-CTF. Но есть ситуации, когда его не хватит.
Контейнерные среды (Docker/LXC). Файловая система может быть минималистичной — нет привычных /home, /opt, утилита find может отсутствовать. Тогда ls -laR / для рекурсивного обхода или which find grep для проверки доступных инструментов.
Hardened-системы с MAC-политиками. На medium/hard боксах с настроенным SELinux или AppArmor SUID-бинарники могут быть ограничены в действиях даже при наличии бита. Команда find / -perm -4000 вернёт результаты, которые невозможно эксплуатировать из-за MAC-политик. Проверьте getenforce (SELinux) или aa-status (AppArmor), чтобы понять, с какой защитой имеете дело.
Ограниченные шеллы. Получили rbash или lshell — часть команд будет заблокирована. Проверьте echo $SHELL и попробуйте выйти из ограничения: python3 -c 'import pty; pty.spawn("/bin/bash")' или /bin/bash -i. Ограниченный шелл — это неприятно, но обычно обходится за пару минут.
Динамические задания с cron. Иногда флаг генерируется скриптом по расписанию и не хранится в файле постоянно. Команды cat /etc/crontab и ls -la /etc/cron.* покажут запланированные задачи. Утилита pspy (загружается на машину отдельно) показывает процессы в реальном времени без root-привилегий — незаменима для обнаружения задач, запускаемых от root.
Автоматизация для средних и сложных боксов. LinPEAS — скрипт автоматической разведки, проверяющий десятки векторов привилегий одной командой. На easy-боксах он избыточен, но на medium и hard экономит час работы. Навык ручного поиска нужен для понимания того, что именно LinPEAS находит и почему помечает результат красным цветом. Без этого понимания вы будете смотреть на вывод LinPEAS как на китайскую грамоту.
Каждая команда из чеклиста — звено в цепочке от initial access (получили шелл через уязвимость) через discovery и credential access (нашли систему, пользователей, пароли) к privilege escalation (повысили права до root). В реальном пентесте на внутренней инфраструктуре шаги те же, но добавляется необходимость уклоняться от SIEM и EDR. В CTF детекции обычно нет — и это делает соревнования идеальной площадкой для отработки фундамента без отвлечения на evasion.
За три года буткемпов я вижу один и тот же паттерн: люди приходят за хакингом, но вязнут в терминале. Это нормальный старт — стыдиться тут нечего. Проблема начинается, когда вместо того чтобы провести вечер с ls -la, find, cat /etc/passwd, новички уходят смотреть очередной ролик «как взломать сервер за 10 минут». Ролик не даёт мышечную память, а мышечная память — единственное, что невозможно компенсировать гуглом в реальном времени. Криптографический алгоритм можно подсмотреть. SQL-инъекцию — скопировать из cheatsheet. Но если не понимаешь, что означает s в -rwsr-xr-x, не поймёшь, почему LinPEAS подсветил бинарник красным, и пропустишь готовый вектор к root. Навигация по Linux и чтение прав доступа — рабочий навык, который отличает человека, решающего таски, от человека, читающего чужие writeup. Если хочется пройти этот путь системно, а не тыкаться в одиночку по YouTube — на IB Basics берут с любого старта и без требований «вы должны знать Linux на уровне X».
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...