Главная / Блог / Linux для CTF: команды, права и поиск флагов

15 мин.00

Linux для CTF: команды, права и поиск флагов

Linux для CTF: команды, права и поиск флагов

Первый таск на TryHackMe я решал четыре часа. Не потому что задание было уровня Hard — оно для начинающих. Я не знал разницу между find / -name flag.txt и find . -name flag.txt, не понимал, что означают буквы rwx в выводе ls -la, и вручную открывал каждый файл вместо одного grep -r "flag" /home. Год спустя такие же задачи — три минуты. Разница не в хакерском таланте, а в десятке базовых команд Linux для CTF и понимании файловой системы.

Ориентация на машине: первые bash команды для начинающих

Подключились по SSH к CTF-машине. Чёрный терминал, мигающий курсор. Первое дело — понять три вещи: где вы, кто вы в системе и что за машина. От ответов зависит весь план действий. Подробнее — в нашем статье о linux для пентестера.

whoami выведет имя текущего пользователя. Если в ответ root — таск, возможно, уже наполовину решён (но такое бывает редко на начальном уровне). Чаще увидите что-то вроде ctfuser или www-data. Запомните это имя — оно определяет ваши права.

id покажет больше деталей: числовой UID, GID и список групп. UID равен 0 — вы root, даже если имя пользователя другое. Группы тоже важны: членство в sudo, docker или disk может стать вектором для повышения привилегий. Типичная ошибка новичка — пропустить вывод id и не заметить, что пользователь состоит в интересной группе. Я сам так терял время на двух машинах подряд, пока не вбил себе привычку.

Дальше — pwd (print working directory). Покажет полный путь к текущему каталогу. Ещё одна частая ошибка — не проверить, где находишься, и искать файлы не там. Путь /home/ctfuser и путь /var/www/html — разные вселенные с точки зрения находок. Разница между абсолютным путём (начинается с /, например /home/user/file.txt) и относительным (./file.txt или просто file.txt) поначалу сбивает с толку: абсолютный — полный адрес от корня файловой системы, относительный — от того каталога, где вы сейчас стоите.

ls -la — содержимое текущего каталога с подробностями. Флаг -l включает длинный формат (права, владелец, размер, дата), а -a показывает скрытые файлы — те, чьё имя начинается с точки. В CTF флаги часто прячут именно в скрытых файлах: .secret, .flag.txt, .hidden_credentials. Без -a вы их просто не увидите. В learntocloud/linux-ctfs (GitHub-репозиторий с 18 прогрессивными CTF-челленджами) самый первый таск — «The Hidden File» — построен именно на этом: найти и прочитать скрытый файл в каталоге ctf_challenges.

uname -a расскажет о системе: версия ядра, архитектура, имя хоста. В терминологии MITRE ATT&CK сбор информации о системе соответствует технике System Information Discovery (T1082, Discovery). Версия ядра определяет, какие эксплойты применимы — но это продвинутая тема, о которой поговорим ближе к концу.

Ещё несколько команд для первых тридцати секунд: cat /etc/os-release покажет дистрибутив и версию ОС, hostname — имя машины (иногда в нём зашита подсказка к таску), а env выведет переменные окружения. Переменные окружения — недооценённое место для находок: иногда пароль или токен лежит прямо в переменной PASSWORD или SECRET. Сам не раз видел это в тасках начального уровня. Привычка собирать информацию о системе до попыток что-то ломать — фундамент работы с терминалом Linux в CTF.

Права доступа Linux: chmod и чтение разрешений

Система прав доступа в Linux — механизм, который определяет, какие файлы вы можете читать, какие запускать и какие изменять. В CTF понимание прав буквально отделяет «нашёл флаг за пять минут» от «три часа смотрю на Permission denied и не понимаю почему».

Символьная и числовая нотация chmod

Вывод ls -la показывает строку прав вроде -rwxr-xr--. Первый символ — тип: - для обычного файла, d для каталога, l для символической ссылки. Оставшиеся девять символов делятся на три тройки: права владельца (owner), группы (group) и всех остальных (others).

Каждая тройка содержит три позиции: r (чтение), w (запись), x (исполнение). Прочерк - означает отсутствие права. Строка -rwxr-xr-- читается так: владелец может читать, писать и исполнять; группа — читать и исполнять; остальные — только читать.

В числовой нотации каждое право имеет вес: r = 4, w = 2, x = 1. Тройка rwx = 4+2+1 = 7, тройка r-x = 4+0+1 = 5, тройка r-- = 4+0+0 = 4. chmod 754 file установит те же права, что описаны выше. chmod 777 file открывает файл для всех — чтение, запись, исполнение для любого пользователя. В CTF-задачах файл с правами 777 — почти наверняка подсказка, что с ним нужно что-то сделать. В learntocloud/linux-ctfs таск «The Permissive File» построен на поиске файла с чрезмерно открытыми правами в каталоге /opt.

Не менее важен владелец файла. Вывод ls -la показывает два имени после строки прав: первое — владелец, второе — группа. Если файл принадлежит root и вы не root — доступны только права из третьей тройки (others). Если там ---, вы не можете ни читать, ни писать, ни исполнять этот файл. Вот тут начинающие и застревают: видят flag.txt, пытаются cat flag.txt, получают «Permission denied» — и не понимают, почему. А ответ всегда в ls -la: смотрите на третью тройку прав.

Согласно данным Delinea, модель прав Linux унаследована от UNIX: «every single file and folder stored on the hard drive has a set of permissions associated with it». В CTF это означает, что каждый файл на машине — потенциальная находка, если хватает прав его прочитать. chown меняет владельца файла, но выполнить её может только root — поэтому для обычного пользователя путь к чужим файлам лежит через повышение привилегий.

SUID-бит — первый вектор повышения привилегий

Помимо стандартных rwx, в Linux есть специальный бит — SUID (Set User ID). Если он установлен на исполняемом файле, программа запускается не от имени того, кто её вызвал, а от имени владельца файла. Владелец root — и любой пользователь выполняет этот бинарник с правами root. Звучит как дыра? Так и есть.

В выводе ls -la SUID-бит отображается как s на месте x в тройке владельца: -rwsr-xr-x. В числовой нотации SUID добавляет 4 перед основной тройкой: chmod 4755 file.

В терминологии MITRE ATT&CK эксплуатация SUID — техника Setuid and Setgid (T1548.001, Privilege Escalation). Атакующий ищет бинарники с установленным SUID-битом, среди которых могут быть программы, позволяющие выполнить произвольные команды от имени root. Согласно Payatu, «exploiting SUID executables» входит в список основных техник повышения привилегий в Linux. Согласно Splunk Threat Research Team, злоумышленники используют chmod u+s или setcap для установки SUID-бита на вредоносные бинарники.

Как искать такие бинарники — покажу в следующем разделе. Главное: SUID-бит на нестандартном бинарнике в CTF — почти гарантированный вектор для получения root.

Поиск файлов и флагов: find и grep в CTF

Искать флаг вручную, перебирая каталоги через cd и ls — путь в никуда. На CTF-машине тысячи файлов, а флаг спрятан в одном. Две команды — find и grep — заменяют часы ручного перебора десятью секундами. В терминах MITRE ATT&CK использование find и ls для обнаружения файлов соответствует технике File and Directory Discovery (T1083, Discovery).

find — фильтры по имени, правам и типу

find — универсальный инструмент поиска файлов Linux по метаданным: имени, правам, размеру, дате изменения. Базовый синтаксис: find [где искать] [критерии]. Набор команд, который покрывает большинство CTF-сценариев:

# Поиск файла по имени от корня файловой системы
find / -name "flag.txt" 2>/dev/null

# Скрытые файлы в домашних каталогах
find /home -name ".*" -type f 2>/dev/null

# SUID-бинарники (T1548.001, Privilege Escalation)
find / -perm -4000 -type f 2>/dev/null

# Файлы, доступные для записи всем пользователям
find / -writable -type f 2>/dev/null

# Файлы, изменённые за последние 10 минут
find / -mmin -10 -type f 2>/dev/null

Разберу ключевые моменты. 2>/dev/null в конце перенаправляет ошибки (сообщения «Permission denied» для каталогов, куда нет доступа) в никуда. Без неё терминал завалит мусором, среди которого реальный результат просто потеряется. Когда я начинал, именно отсутствие 2>/dev/null создавало ощущение, что команда сломана — хотя результат был, но утонул в потоке ошибок.

Флаг -type f ограничивает поиск обычными файлами (не каталогами, не ссылками). -perm -4000 ищет файлы с установленным SUID-битом — именно с этой команды начинается проверка на privesc в большинстве CTF-тасков. Результат обычно содержит стандартные системные бинарники (/usr/bin/passwd, /usr/bin/su) — они нормальные, SUID им нужен для работы. Искать нужно нестандартные бинарники в необычных путях: /tmp, /opt, /usr/local/bin.

Менее очевидный, но полезный фильтр — поиск по размеру. find / -size 0 -type f 2>/dev/null найдёт пустые файлы (иногда флаг прячут не в содержимом, а в имени файла), а find / -name "*.bak" 2>/dev/null обнаружит резервные копии — те часто содержат конфиги с паролями.

grep — поиск по содержимому файлов

Если find ищет файлы по внешним характеристикам, то grep ищет по содержимому. Именно grep позволяет найти флаг, спрятанный внутри конфигурационного файла, лога или скрипта.

Базовый вызов: grep -r "flag" /home 2>/dev/null рекурсивно ищет строку «flag» во всех файлах внутри /home. Флаг -r (recursive) заставляет grep заходить в подкаталоги. Без -r обработается только указанный файл или ничего не произойдёт, если указан каталог — ловушка, в которую попадают все.

Регулярные выражения делают поиск точнее. Формат флага в CTF обычно известен заранее: flag{...}, CTF{...}, picoCTF{...}. Команда grep -rE "flag\{[a-zA-Z0-9_]+\}" / 2>/dev/null найдёт строки, соответствующие шаблону, и отсечёт ложные срабатывания вроде слова «flag» в комментарии.

Несколько практических сценариев.

Поиск паролей в конфигурационных файлах: grep -ri "password" /etc/ 2>/dev/null. Флаг -i делает поиск нечувствительным к регистру — ловит и «Password», и «PASSWORD», и «password». В терминологии MITRE ATT&CK это Credentials In Files (T1552.001, Credential Access) — одна из самых распространённых техник получения учётных данных.

Поиск по логам: grep "SUCCESS" /var/log/auth.log. Тысячи строк с «FAILED» и одна с «SUCCESS» — вот она, зацепка. В learntocloud/linux-ctfs таск «The Odd Log Entry» построен на этом: «Thousands of failed logins hide a single successful one in a log under /var/log».

Поиск строк в бинарных файлах: тут удобнее утилита strings, которая извлекает читаемые текстовые строки из бинарника. Комбинация strings /usr/local/bin/suspicious | grep -i flag — стандартный приём для категории reverse engineering. Использование Unix Shell (T1059.004, Execution) для выполнения этих команд — базовая тактика, которую MITRE документирует как одну из наиболее часто применяемых.

Первые шаги в эскалации привилегий

Нашли машину, собрали информацию, прочитали доступные файлы — но флаг лежит в /root/flag.txt, а вы ctfuser. Нужно повышать привилегии. Privilege escalation — переход от ограниченного пользователя к root. Зачем root? Он может читать любой файл, менять конфигурацию системы, ставить бэкдоры. В CTF root = финальный флаг. В реальных атаках — полный контроль над сервером.

Для CTF-тасков начального уровня два основных вектора: sudo и SUID. Kernel-эксплойты (вроде DirtyCow, который, согласно Payatu, затрагивал ядра Linux <= 3.19 и позволял получить запись в read-only память через race condition) — продвинутая тема, к которой стоит переходить после освоения базовых методов.

sudo -l и GTFOBins: что можно запустить от root

sudo -l показывает, какие программы текущий пользователь может запускать с правами суперпользователя. Техника Sudo and Sudo Caching (T1548.003, Privilege Escalation) по MITRE ATT&CK.

$ sudo -l
User ctfuser may run the following commands on target:
    (root) NOPASSWD: /usr/bin/find
    (root) NOPASSWD: /usr/bin/vim

Такой вывод означает: ctfuser может запускать find и vim от имени root без пароля. Звучит безобидно — пока не узнаете, что обе программы позволяют выполнить произвольные команды.

GTFOBins (gtfobins.github.io) — база стандартных Unix-бинарников, через которые можно обойти ограничения безопасности. Если sudo -l показывает /usr/bin/find, GTFOBins подскажет: sudo find . -exec /bin/sh \; -quit — и вы получаете shell с правами root. Для vim аналогично: sudo vim -c ':!/bin/sh'. В предоставленных данных GTFOBins документированы бинарники bash, cat, base64, chmod, chown — каждый из них может стать вектором, если разрешён через sudo.

В EN-4 (Qseap) разобран практический сценарий, где sudo -l показывает разрешение на /usr/bin/zip от имени другого пользователя — через GTFOBins получается shell. Этот паттерн — sudo -l → GTFOBins → shell — повторяется в большинстве CTF-тасков на эскалацию привилегий.

Типичная ошибка: увидеть «Sorry, user X may not run sudo on this host» и сдаться. Это не тупик — это значит, что вектор sudo не работает и нужно переключиться на SUID-бинарники, cron-задачи или файлы с сохранёнными паролями.

Про cron-задачи отдельно. cat /etc/crontab и просмотр каталогов /etc/cron.d/, /etc/cron.daily/ покажут, какие скрипты запускаются по расписанию. Согласно Splunk Threat Research Team, атакующие добавляют вредоносные скрипты в cron-каталоги: например, echo "/tmp/evil.sh" >> /etc/cron.daily/logrotate. В CTF-контексте: если cron запускает скрипт с правами root и вы можете его редактировать — это прямой путь к повышению привилегий.

/etc/passwd и /etc/shadow — что в них искать

/etc/passwd содержит список всех пользователей системы. Согласно Delinea, формат каждой строки: username:x:UID:GID:comment:home:shell. Значение x во втором поле означает, что пароль хранится в /etc/shadow. Чтение /etc/passwd доступно любому пользователю — и это не баг, а часть дизайна.

В терминах MITRE ATT&CK чтение этих файлов — техника /etc/passwd and /etc/shadow (T1003.008, Credential Access).

На что обращать внимание в /etc/passwd:

  • Пользователи с UID 0 (кроме root) — пользователи с правами суперпользователя, их наличие подозрительно
  • Пользователи с оболочкой /bin/bash или /bin/sh — в них можно войти через su
  • Пользователи с нестандартными именами — часто подсказка к таску
  • Если во втором поле хеш вместо x — пароль хранится прямо здесь, и это встречается в старых или намеренно мисконфигурированных системах на CTF-площадках

В RU-1 (writeup с Habr) описан случай: через SQL-инъекцию с привилегией FILE (привилегия MySQL для чтения файлов ОС) атакующий прочитал /etc/passwd и нашёл пользователя для дальнейшего перемещения по системе. Использовался sqlmap с ключом --file-read="/etc/passwd" (sqlmap — open source инструмент для автоматического обнаружения и эксплуатации SQL-инъекций).

/etc/shadow содержит хеши паролей и доступен только root. Получили к нему доступ — хеши можно попытаться взломать через john или hashcat. Но чтение shadow — продвинутая тема; для первых тасков важнее извлекать информацию из passwd.

Workflow: решаем CTF-таск от подключения до флага

Теория без практики — мёртвый груз. Ниже — алгоритм решения типичного CTF-таска на Linux-машине, который собирает вместе все описанные команды. Покрывает примерно 80% простых заданий категорий «Linux» и «PrivEsc».

# 1. Разведка: кто я, где я, что за система
whoami && id
uname -a && cat /etc/os-release
env | grep -iE "pass|secret|token|flag"

# 2. Поиск флагов и интересных файлов
find / -name "*flag*" -type f 2>/dev/null
find /home -name ".*" -type f 2>/dev/null
grep -ri "password\|secret\|flag" /home /tmp /opt 2>/dev/null

# 3. Проверка векторов privesc
sudo -l 2>/dev/null
find / -perm -4000 -type f 2>/dev/null
cat /etc/crontab 2>/dev/null

Пошагово.

Первое — сбор информации. whoami, id, uname -a. Запишите имя пользователя, UID, версию ядра. Проверьте env на предмет переменных с паролями. Посмотрите cat /etc/passwd — какие пользователи есть в системе, у кого /bin/bash.

Второе — поиск флагов. Начинайте с find / -name "*flag*" 2>/dev/null. Если формат флага известен (например, CTF{...}), добавьте grep -rE "CTF\{" / 2>/dev/null. Проверьте домашние каталоги всех пользователей: ls -la /home/*/. Не забудьте скрытые файлы и каталоги: .ssh (ключи SSH для переключения на других пользователей), .bash_history (история команд — в learntocloud/linux-ctfs таск «History Mystery» именно про это), .config (конфигурационные файлы приложений).

Третье — эскалация привилегий. sudo -l. Каждую разрешённую программу — на GTFOBins. SUID-бинарники через find / -perm -4000 -type f 2>/dev/null, нестандартные тоже на GTFOBins. Cron-задачи.

Четвёртое — если прямого пути нет, ищите учётные данные. Конфигурационные файлы веб-приложений (/var/www/html/, файлы .env, wp-config.php, config.php), резервные копии (find / -name "*.bak" -o -name "*.old" 2>/dev/null), SSH-ключи (ls -la /home/*/.ssh/). Не стесняйтесь выполнять cat на каждом найденном файле — в CTF нет лишних файлов, каждый может содержать подсказку.

Пятое — если нашли пароль или ключ, попробуйте переключиться на другого пользователя: su - username (спросит пароль) или ssh -i найденный_ключ user@localhost. Иногда таск требует горизонтального перемещения через несколько пользователей прежде чем добраться до root. В EN-4 (Qseap) описан именно такой сценарий: цепочка из пяти пользователей (dalia → silvio → jordan → ken → sean), каждый следующий получается через отдельный вектор.

Этот алгоритм — стартовая точка, не догма. Со временем появится чутьё, какие шаги пропустить и на чём сосредоточиться. Но для первых пятнадцати-двадцати тасков эта последовательность работает как чеклист: не забудете проверить SUID, не пропустите скрытый файл, не потратите час на ручной перебор каталогов.

Год назад я начинал с тех же вопросов: что вводить в терминал, как читать вывод ls -la, зачем нужен 2>/dev/null. Самое ценное открытие за это время — для решения 90% CTF-заданий начального уровня не нужно знать двадцать инструментов. Хватит десяти команд из этой статьи и привычки выполнять их в правильном порядке. Но читать мало — нужно набить руку. Прогоните каждую команду на живой машине. Заметьте, как find / -perm -4000 выдаёт разный набор бинарников на Ubuntu и Debian. Как grep -r без 2>/dev/null зависает на псевдофайловой системе /proc. Как sudo -l возвращает совершенно разные результаты в зависимости от конфигурации sudoers.

Что до сих пор удивляет — русскоязычных материалов по основам Linux именно для CTF почти не существует. Есть writeups конкретных тасков, есть академические работы про защиту серверов в Attack-Defence, но структурированного гайда «вот команды, вот как они работают вместе, вот чеклист» — нет. Проблема не в сложности: TryHackMe и OverTheWire предлагают задачи для тех, кто впервые открыл терминал. Проблема в разрыве между «хочу попробовать CTF» и «знаю какую команду ввести». Начинающие видят «Permission denied», не понимают почему, и бросают — хотя ответ в одной команде ls -la, которая покажет, что у others стоит ---.

Количество решённых машин в итоге важнее количества прочитанных статей. Если хочется пройти базу системно, от «что такое терминал» до первых задач — на IB Basics (codeby.school) берут с любого старта без требований к предварительному уровню.

🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».

Поделиться

0 комментариев

Пожалуйста, войдите, чтобы оставить комментарий.

Загрузка комментариев...

Читайте также

John the Ripper и Hashcat для начинающих: гайд

15 мин.

5

John the Ripper и Hashcat для начинающих: гайд

Пошаговый workflow крекинга хэшей: от hashid до флага за 5 минут. Таблица режимов Hashcat, утилиты *2john, 6 ошибок новичков и разбор реального CTF-таска.

1 ОКТЯБРЬ, 2026

OSINT для начинающих: username, email и домены

14 мин.

6

OSINT для начинающих: username, email и домены

Пошаговый OSINT-гайд: Sherlock, theHarvester, WHOIS, Google Dorks. Практический CTF-воркфлоу от никнейма до флага за 40 минут с конкретными командами.

1 ОКТЯБРЬ, 2026

Nmap для начинающих: гайд по CTF-разведке

13 мин.

13

Nmap для начинающих: гайд по CTF-разведке

Двухфазный подход к nmap в CTF: быстрый скан 65535 портов за минуту + глубокий анализ версий. NSE-скрипты, 6 ошибок новичков и шпаргалка команд.

30 СЕНТЯБРЬ, 2026