• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Статья Что хранят в себе скрытые файлы и папки на веб-сервере? Часть I

Доброго времени суток! Сегодня я хочу рассказать, что содержат в себе скрытые папки и файлы на веб-сервере.



Скрытые файлы и директории, которые оставляют на веб сервере, могут иметь важную, конфиденциальную информацию. Веб-сервер может содержать много скрытой информации:

  • исходные коды версии системных папок и файлов (.git, .gitignore, .svn)
  • файлы конфигурации (.npmrc, package.json, .htaccess)
  • пользовательские файлы конфигурации (.json, .yml, .xml)
  • и многое другое


Эти данные можно поделить на 3 группы:
  1. Файлы конфигурации для IDE (Интегрированная среда разработки)
  2. Исходный код системы контроля версий
  3. Проекты и/или файлы конфигурации и настройки для конкретной технологии


Давайте взглянем на все это более детально, что бы узнать какую информацию можно от них ожидать


Исходный код системы контроля версий

Git

Git «является для управления версиями разрабатываемых файлов»

Недавно созданный Git-репозиторий содержит несколько папок и файлов по умолчанию, в которых хранится вся информация. Вот пример папки .git с уже сделанным комитом:

asdasdasd.jpg



Все данные хранятся в .git. Эти данные можно поделить на 3 вида: комиты, каталоги файлов либо «Tree», и блобы «Blob»

1. Комит — хранит информацию с текущими хэшами каталогов файлов


2. Tree — содержит информацию о структуре папок и файлов - и каждая отдельная папка или файл имеет свой собственный хэш объекта, хранящийся в объекте каталогов файлов. Это может быть другой каталог(папка на один уровень ниже в структуре папок) или файл.


3. Blob - это объект Git типа, в котором сохраняется содержимое файлов.



Если все же .git папка встретиться на веб сервере, есть легкий путь для получения содержания любого файла — просто скачав и прочив Git объекты. Если повезет, можно скопировать репозиторий используя команду git clone, либо использовать wget с -r опцией. Но иногда все не так просто…


Давайте рассмотрим ситуацию, когда ни один из этих вариантов не выполняется успешно


Что бы убедиться о наличии .git папки на веб сервере, нужно проверить получения HTTP 403 ответа (если 404 — запрашиваемая папка не найдена).

1131.png



Отражение файлов и папок используя локальную Git репозиторий

Что бы сделать это, стоит создать свою простенькую .git репозиторий с внутренней структурой и скачать Git объекты с веб сервера

Прежде всего, создания репозитория:

$ git init


Эта команда инициализирует пустую Git репозиторий с всеми необходимыми файлами и папками.


Получение и прочтение информации об объектах


Для получения информации о Git репозитории, сперва нужно выяснить стартовую точку. Git сохраняет всю информацию в лог файле, и этот файл доступен в .git/logs/head

asdasd.png



Если .git/logs/head не работает, но .git возвращает 403, то нужно попробовать .git/logs/HEAD


Проанализируем внимательнее на строку из файла:

0000000000000000000000000000000000000000 07603070376d63d911f608120eb4b5489b507592 test@gmail.com <test@gmail.com> 1452195279 +0000 commit (initial);


Первые 2 строки являются хэшами объектов, и именно это нам нужно. Так как это самый первый комит, первый хэш имеет только нули (так как предыдущего нет), второй в свою очередь имеет информацию о предыдущем.

Первым делом нужно создать действующий путь к объекту. Путь содержит общий путь ко всем объектам в хранилище, то есть к .git/objects, за которым следуют две части, построенные из хэша - имя каталога (первые два символа хэша) и имя файла (остальная часть хэша, начиная с третьего символа). Таким образом, чтобы получить объект, идентифицированный по хэшу 07603070376d63d911f608120eb4b5489b507592, нужно открыть следующий URL:

localhost/testapp/.git/objects/07/603070376d63d911f608120eb4b5489b507692


И скачивается файл:

asd54454554.png




Скачанный файл можно увидеть в своей «простой» Git папке:

vasha_prostaya_git_papka/.git/objects/07/603070376d63d911f608120eb4b5489b507692



Команда git cat-gile -t поможет узнать тип объекта:

$ git cat-file -t <хэш>



Что бы отобразить содержание файла, нужно прописать следующую команду:

$ git cat-file -p <хэш>



Теперь можно проверить тип, и прочитать содержание файла, который был сохранен ранее:

asdas144.png




При прочтении содержания, можно найти информацию о нынешнем хэше из каталога объектов:

aasdaaa.png




Как вы можете заметить, только index.php остался в папке, также я уже узнал хэш объекта и его тип, который является blob. И это то что нам нужно, для просмотра содержания файла, используя все тот же метод, который до этого я использовал для чтения содержимого комита и объектов каталога (но прежде всего, нужно скачать объект с веб-сервера, как было описано выше):

asdaasqs.png



Так же стоит запомнить, что данное содержание index.php показано такое же, какое оно было при создании комита описанным объектом 07603070376d63d911f608120eb4b5489b507692. Если вы взглянете в файл логов, вы сможете заметить второй комит (идентифицирован хэшем объекта 4db7a14eee2cd3ff529278b75e1653e677fe1d02) и это последний комит, он содержит последние изменения и из-за этого нынешний index.php будет отличаться от предыдущего index.php:

PHP:
<?php
echo "Hello World!";

$i = 100;
echo "Value of i is $i";


Так как ручной перебор объектов мучительный и нудный, в сетях можно найти автоматизированные скрипты, вот например - тык




.gitignore файл

Есть так же одна вещь, которую стоит описать, если вы нашли .git папку оставленную на веб-сервере, а именно - .gitgnore. Цель таких файлов проста — это место где можно положить имена всех папок и файлов который не стоит комитеть в репозиторий. По этому это самый легкий путь найти файлы, которые по каким-то причинам не должны быть закомиченны:

asdasdasd45455454.png





Subversion (SVN)

Subversion (или SVN) это система контроли системы создана Apache Software Foundation и эта система остается очень популярной и широко используемой.

Пример структуры SVN папок и файлов:

asdasssaqq.png




На мой взгляд, wc.db является самым важным файлом базы данных SQLite, pristine/ так же имеет ценную информацию. В wc.db можно найти хэши используемые в pristine/, поэтому стоит начать именно отсюда


Что бы получить информацию из Subversion, прежде всего, нужно убедиться, что нам доступен wc.db. А именно: открыть следующую ссылку в веб-браузере:




Если выскочило уведомление о загрузке — обозначает, что есть шанс, что остальные .svn файлы будут находиться здесь. Сперва, нужно прочитать содержание wc.db что бы получить информацию о хэшах файлов.

Что бы прочитать wc.db файл, можно воспользоваться SQLite утилитой:

Код:
$ sqlite3 wc.db
SQLite version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for usage hints.

sqlite> .databases
seq  name             file                                                     
---  ---------------  ----------------------------------------------------------
0    main             /Users/test/wc.db   

sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE REPOSITORY (   id INTEGER PRIMARY KEY AUTOINCREMENT,   root  TEXT UNIQUE NOT NULL,   uuid  TEXT NOT NULL   );
INSERT INTO "REPOSITORY" VALUES(1,'svn+ssh://192.168.1.4/var/svn-repos/project_wombat','88dcec91-39c3-4b86-8627-702dd82cfa09');
(...)
INSERT INTO "NODES" VALUES(1,'trunk',0,'',1,'trunk',1,'normal',NULL,NULL,'dir',X'2829','infinity',NULL,NULL,1,1456055578790922,'bl4de',NULL,NULL,NULL,NULL);
INSERT INTO "NODES" VALUES(1,'',0,NULL,1,'',1,'normal',NULL,NULL,'dir',X'2829','infinity',NULL,NULL,1,1456055578790922,'bl4de',NULL,NULL,NULL,NULL);
INSERT INTO "NODES" VALUES(1,'trunk/test.txt',0,'trunk',1,'trunk/test.txt',2,'normal',NULL,NULL,'file',X'2829',NULL,'$sha1$945a60e68acc693fcb74abadb588aac1a9135f62',NULL,2,1456056344886288,'bl4de',38,1456056261000000,NULL,NULL);
INSERT INTO "NODES" VALUES(1,'trunk/test2.txt',0,'trunk',1,'trunk/test2.txt',3,'normal',NULL,NULL,'file',NULL,NULL,'$sha1$6f3fb98418f14f293f7ad55e2cc468ba692b23ce',NULL,3,1456056740296578,'bl4de',27,1456056696000000,NULL,NULL);
(...)


Заметили операции INSERT в таблицу NODES? Каждая из этих операций содержит имя файла и SHA1 хэш, который отвечает записке в pristine/:

Код:
$ ls -lA pristine/94/
total 8
-rw-r--r--@ 1 sor staff  38 Feb 31 12:05 945a60e68acc693fcb74abadb588aac1a9135f62.svn-base


Что бы отобразить значения из NODES в имя файла, нужно выполнить несколько команд:

  • удалить префикс $sha1$
  • добавить постфикс .svn-base
  • использовать первые два знака как имя папки внутри директории pristine/ (в этом случае это 94)
  • создать полный путь, который в этом примере будет:





При открытии ссылки, нужно будет скачать файл или отобразить содержание прямо в файле:

asdasdmain.png



Так же, запись в таблице REPOSITORIES указывает на настоящий путь в репозиторий, который является:

svn+ssh://192.168.1.4/var/svn-repos/project_wombat


В данной ссылке содержится много информации. Оставляя папку .svn на веб-сервере может быть огромной ошибкой. Это может даже обозначать полную компрометацию исходного кода веб-приложения.



Продолжение темы ждет вас во второй части.
 

Архонт

Green Team
03.12.2019
20
7
BIT
13
Добавлю полезную команду по гиту.
Bash:
git log --diff-filter=D --summary
эта команда поможет найти, в какой момент из проекта были удалены какие-то файлы.
если там были какие-то креды, например в .env файле, можно их легко найти. если самих файлов нет в комитах, можно найти нужные строчки сравнив два комита командой diff, до удаления и после удаления
так решается один из тасков в codeby games
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!