Райтап на задачу «Старый коммит»

dikiyponos

Автор:

dikiyponos

5 ноября 2026

3

05.11.2026
Старый коммит
Категория:

Web

Задача «Старый коммит»

LastTeamLead

Автор:

LastTeamLead

Первая кровь:
xof
Сложность:
easy
Дата публикации:
07.09.2025
Решений:
295
Рейтинг:
4.7/5
Ссылка:
Решать

«Чтобы найти флаг, нужно вернуться в прошлое» — гласит задача. Перейдём по ссылке. Нас встречает хакерская матрица.

Решение задачи «Старый коммит»: иллюстрация 1

Первая мысль — посмотреть archive.org, но, к сожалению, там то же самое и даже в исходниках ничего полезного нет.

Решение задачи «Старый коммит»: иллюстрация 2

В таком случае остаётся сканировать сайт, для этого можно использовать dirb или gobuster.

Решение задачи «Старый коммит»: иллюстрация 3

Сразу же находим директорию.git. Видимо название «старый коммит» было не просто так. Надо каким-то образом извлечь этот «старый коммит». По первой ссылке в гугле находим утилиту git-dumper, которая позволяет извлечь Git-репозиторий с любого сайта. Устанавливается она с помощью простого pip install git-dumper.

Решение задачи «Старый коммит»: иллюстрация 4

Отлично, теперь переходим в директорию old-commit и смотрим историю коммитов.

Решение задачи «Старый коммит»: иллюстрация 5

Коммит с именем Flag звучит интересно, попробуем его прочитать с помощью git show <хеш коммита>.

Решение задачи «Старый коммит»: иллюстрация 6

Чему мы научились, Палмер? Использовать git-dumper? Давайте разберёмся, как бы мы могли извлечь флаг ручками.

Решение задачи «Старый коммит»: иллюстрация 7

Открываем.git/HEAD — это служебный файл, в котором находится ссылка на текущую ветку. Откроем её.

Решение задачи «Старый коммит»: иллюстрация 8

Интересный хеш. Чтобы открыть коммит поэтому хешу, необходимо перейти по.git/objects/первый_байт_хеша/остаток_хеша. Зачем вообще в Git оно так реализовано? Почему нельзя было просто оставить кучу файлов в директории objects? Дело в том, что некоторые файловые системы имеют жёсткий лимит на максимальное количество файлов в одной директории (например, в FAT32 — 65 534 файла на одну папку). Деление хеша помогает обойти этот лимит, равномерно распределяя нагрузку по подпапкам.

Решение задачи «Старый коммит»: иллюстрация 9

Смотрим, что же за файл мы такой скачали.

Решение задачи «Старый коммит»: иллюстрация 10

Для содержимого Git использует сжатие zlib. Извлечём данные с помощью zlib-flate.

Решение задачи «Старый коммит»: иллюстрация 11

Теперь у нас есть parent-коммит, точно так же его скачаем и распакуем.

Решение задачи «Старый коммит»: иллюстрация 12
Решение задачи «Старый коммит»: иллюстрация 13

Теперь мы снова узнали нужный нам коммит. Как извлечь данные? Снова скачаем commit.

Решение задачи «Старый коммит»: иллюстрация 14

Тут мы видим непонятные байты и index.html. В Git-дереве данные идут строго друг за другом. Запись о файле выглядит так:

[права_доступа][имя_файла][нулевой_байт][20_байт_хеша]

Находим нулевой байт в выводе xxd, всё, что после него — хеш коммита. Таким образом получается ровно 40 hex-символов: 9b7fc0020c351b0fc748dc44f843f272c5535bb7. Остаётся скачать этот объект и распаковать.

Решение задачи «Старый коммит»: иллюстрация 15

Вы восхитительны, что прошли тяжелый путь и решили задачу ручками.

Если вы нашли опечатку или ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter

Также по теме:

Райтап на задачу «Слепая инъекция»

/Разборы задач

Райтап на задачу «Слепая инъекция»

Пишем скрипт для слепой SQL-инъекции по ответам true/false и разбираем альтернативу с sqlmap.
Прочитать

2

Райтап на задачу «Совсем слепая инъекция»

/Разборы задач

Райтап на задачу «Совсем слепая инъекция»

Извлекаем флаг через временную SQL-инъекцию в SQLite и отсеиваем случайные задержки ответа.
Прочитать

2