суббота, 6 декабря 2014 г.

Git objects decoding

Недавно на 9447 CTF было 2 таска на разбор Git репозиториев.

1 таск заключался в доступе к сайту, где не были поставлены правильные права на .git директорию. Смотреть содержимое поддиректорий мы не могли, но скачивать файлы - почему бы и нет.
2 таск заключался в доступе к .git репозиторию (уже с просмотром файлов), где объекты были сжаты.

Ход решения простой, начинаем с файла .git/HEAD, где содержится указатель на refs/heads/master. После чего, мы скачиваем данный файл, там содержится хеш верхнего коммита (Документация). Каждый коммит содержится в директории  .git/objects.
Первый байт имени представляет из себя директорию в objects, остальная часть - файл.
Пример: da76fcea0fe881245c8af5c6afc51446740a38ba расположен в objects/da/76fcea0fe881245c8af5c6afc51446740a38ba.

Скачиваем файл и распаковываем его командой:
python -c "import zlib,sys;print repr(zlib.decompress(sys.stdin.read()))" < NAME
В результате получаем содержимое коммита с текстом и ссылками на другие коммиты. В данном таске не надо было писать скрипт автоматизации т.к. коммита было всего 2.

Второй таск решался выкачиванием всего репозитория (wget) и распаковкой. Тут был небольшой трюк с тем, что файлы .pack нужно было из репозитория удалить, а затем с помощью команды git unpack-objects  распаковать. Подробнее тут: stackoverflow.com