Как скрыть конфиденциальные файлы в зашифрованных контейнерах на вашей Linux-системе

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

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

Тема криптографии и шифрования невероятно обширна и сложна.

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

По существу, мы создадим контейнер (файл), который будет действовать как хранилище.

Когда он разблокирован, мы можем хранить конфиденциальные данные, собранные во время каких-либо действий.

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

Я буду использовать Kali Linux на протяжении всего урока.

Пользователи Ubuntu и Debian смогут тоже самое: использовать терминал без полномочий root для запуска  команд.

Команда sudo добавляется, когда необходимы привилегии root.

Если вы используете Ubuntu или Debian, добавьте sudo в соответствии с инструкциями.

Шаг 1 Создание ключа для разблокировки контейнера

Чтобы начать работу, мы создадим файл, главный ключ, чтобы разблокировать контейнер.

dd if=/dev/urandom of=/path/to/master.keyfile bs=4096 count=1

1+0 records in
1+0 records out
4096 bytes (4.1 kB, 4.0 KiB) copied, 0.000300577 s, 13.6 MB/s

Имя файла ключа является произвольным.

Для простоты я использую «master.keyfile» в приведенном выше примере.

Команда dd будет случайным образом (/dev/urandom) сгенерировать ключевой файл размером 4096 байт, что экспоненциально сильнее любого возможного 32-символьного пароля, о котором мы можем подумать.

Этот ключевой файл можно сохранить на флэш-накопитель USB для хранения или сохранения на удаленном сервере.

Не сообщайте никому, не отправляйте по электронной почте или не теряйте этот файл.

Без него контейнер будет невозможно разблокировать!

Шаг 2 Создание пустого контейнера

Затем мы будем использовать dd и zero, чтобы создать пустой файл.

Это позволит нам создать пустой контейнер указанного размера.

dd if=/dev/zero of=/path/to/CONTAINER bs=1 count=0 seek=1G

0+0 records in
0+0 records out
0 bytes copied, 0.000190114 s, 0.0 kB/s

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

Путь к «CONTAINER» следует указать более подходящим.

Что-то вроде «Vault» или «Encrypted» может иметь больше смысла, поэтому вы не забудете, какой файл используется для хранения конфиденциальных данных.

В качестве альтернативы, если вы пытаетесь скрыть истинное содержимое контейнера это можно реализовать называя его чем-то вроде «TaylorSwift.mp3» и помещая его в каталог, полный песен, может помочь избежать пассивной форензики.

Я создаю контейнер размером 1 гигабайт (seek = 1G).

Это означает, что нам будет разрешено хранить данные объемом до 1 гигабайта в зашифрованном файле.

Это значение может быть увеличено или уменьшено по мере необходимости.

Например, контейнер 250 мегабайт представлен как «250M».

Очень маленький контейнер 750 килобайт представлен как «750K».

Шаг 3 Шифрование контейнера

Затем мы зашифруем контейнер, используя следующую команду cryptsetup:

sudo cryptsetup -v -y -c aes-xts-plain64 -s 512 -h sha512 -i 5000 --use-random luksFormat /path/to/CONTAINER /path/to/master.keyfile

WARNING!
========
This will overwrite data on /tmp/CONTAINER irrevocably.

Are you sure? (Type uppercase yes): YES
Key slot 0 created.
Command successful.

Шифр (-c), размер ключа (-s) и хэш-функция (-h) установлены на сильные значения и не должны быть изменены.

Эта команда cryptsetup будет форматировать (luksFormat) CONTAINER и шифровать его с помощью файла «master.keyfile», чтобы заблокировать и разблокировать его.

Вам будет предложено ввести «YES» прописными буквами (caplock) для продолжения.

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

Контейнер размером 100 ГБ может занимать до пяти минут вашего времени.

Шаг 4 Разблокировка контейнера

Когда это будет сделано, нам нужно разблокировать CONTAINER для форматирования частей

sudo cryptsetup luksOpen /path/to/CONTAINER PRIVATE --key-file /path/to/master.keyfile

Эта команда cryptsetup откроет наш контейнер (luksOpen), используя файл master.keyfile (-key-file), созданный на первом шаге.

Точка сопоставления («PRIVATE») используется для отображения (и более позднего монтирования) устройств и томов.

Имя «PRIVATE» произвольно и может быть заменено на что угодно.

Шаг 5 Отформатируйте разблокированный том

Форматирование разблокированного контейнера позволит нам действительно читать и записывать данные в том.

Существует много удобных форматов, таких как FAT32 и NTFS.

Я буду использовать Ext4, широко поддерживаемый и гибкий формат Unix.

Любой компьютер Debian или Ubuntu сможет разблокировать и прочитать файлы, хранящиеся в контейнере.

Используйте следующую команду mkfs для форматирования разблокированного контейнера.

sudo mkfs.ext4 /dev/mapper/PRIVATE

mke2fs 1.44.3 (10-July-2018)
Creating filesystem with 261632 4k blocks and 65408 inodes
Filesystem UUID: 948eae1b-dd6d-4910-8a3c-3474488bdf0c
Superblock backups stored on blocks:
32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

Шаг 6 Смонтируйте разблокированный том в локальный каталог

Сначала создайте каталог, используя команду mkdir.

Когда том разблокирован и смонтирован, файлы в контейнере будут доступны в этом каталоге.

Я назвал каталог «PRIVATE», но его можно переименовать как угодно.

mkdir ~/Private

Затем используйте приведенную ниже команду для монтирования разблокированного тома в новый каталог ~ / Private.

sudo mount /dev/mapper/PRIVATE ~/Private

Использование mount очень похоже на подключение USB в ваш ноутбук.

Пользователи Kali могут получить доступ к содержимому, перейдя в /root/Private с помощью диспетчера файлов.

Пользователи Ubuntu и Debian могут перейти к /home/<username>/Private, чтобы получить доступ к содержимому.

Шаг 7 Установите разрешения файлов

Эта команда особенно важна для пользователей Ubuntu и Debian.

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

В противном случае только пользователь root смогут изменять содержимое в контейнере.

sudo chown -R "$USER":"$USER" ~/Private

Команда chown будет рекурсивно (-R) изменять разрешения для разблокированного контейнера и его содержимого для текущего разрешения пользователей ($ USER).

Шаг 8 Заблокируйте контейнер

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

sudo umount /root/Private && sudo cryptsetup luksClose PRIVATE

Шаг 9. Разблокируйте контейнер, когда вам необходимо.

В будущем, когда вам нужно разблокировать контейнер снова, используйте следующую команду, чтобы разблокировать контейнер (luksOpen).

sudo cryptsetup luksOpen /path/to/CONTAINER PRIVATE --key-file /path/to/master.keyfile

Затем установите том в локальный каталог с помощью команды mount.

sudo mount /dev/mapper/PRIVATE ~/Private

Автоматизация создания безопасного контейнера (необязательно)

В этой статье я создал интерактивный скрипт Bash для автоматизации создания защищенных контейнеров.

Он попросит пользователя выбрать имя контейнера, имя файла ключа, точку монтирования и указать размер контейнера.

Остальная часть процесса полностью автоматизирована и занимает менее 60 секунд.

#!/bin/bash

G="\033[1;32m";
N="\033[0;39m";
function notification ()
{
echo -e "$G" "\n[+] $1" "$N"
};
function nameVol ()
{
read -p "Name of encrypted container (e.g., "Vault", "grocerylist.txt"): " vol_name;
if [[ ! -n "$vol_name" ]]; then
vol_name='EncryptedContainer';
fi
};
function nameKey ()
{
read -p "Name of Key file (e.g., "master.keyfile", "image.jpg"): " key_file;
if [[ ! -n "$key_file" ]]; then
key_file='master.keyfile';
fi
};
function nameMount ()
{
read -p "Where to mount the container when it's unlocked (e.g., "luksPrivate"): " mount_dir;
if [[ ! -n "$mount_dir" ]]; then
mount_dir='luksPrivate';
fi
};
function nameSize ()
{
read -p "Choose volume size (e.g., 10G, 200M): " vol_size;
if [[ ! -n "$vol_size" ]]; then
vol_size='1G';
fi
};
function ddZero ()
{
dd if=/dev/zero of="$vol_name" bs=1 count=0 seek="$vol_size" && notification "Empty volume created."
};
function ddRandom ()
{
dd if=/dev/urandom of="$key_file" bs=4096 count=1 && notification "Key file successfully created."
};
function encryptCon ()
{
sudo cryptsetup -v -y -c aes-xts-plain64 -s 512 -h sha512 -i 5000 --use-random luksFormat "$vol_name" "$key_file" && notification "Encrypted container created."
};
function encryptOpen ()
{
sudo cryptsetup luksOpen "$vol_name" "$mount_dir" --key-file "$key_file" && notification "Volume unlocked."
};
function mkfsFormat ()
{
sudo mkfs.ext4 /dev/mapper/"$mount_dir" && notification "Volume formatted."
};
function mountDir ()
{
if [[ ! -d $HOME/"$mount_dir"/ ]]; then
mkdir -p $HOME/"$mount_dir"/;
fi;
sudo mount /dev/mapper/"$mount_dir" "$HOME"/"$mount_dir"/ && notification "Volume mounted."
};
function volPerm ()
{
sudo chown -R "$USER":"$USER" "$HOME"/"$mount_dir" && notification "Volume permissions set. Don't lose the Key file!"
};
nameVol;
nameKey;
nameMount;
nameSize;
ddZero;
ddRandom;
encryptCon;
encryptOpen;
mkfsFormat;
mountDir;
volPerm

Просто сохраните приведенный выше скрипт в файле с именем «createContainer.sh», разрешите сценарию выполнение(chmod) и запустите его, используя следующие команды.

chmod +x createContainer.sh
./createContainer.sh 

Ниже приведен GIF скрипта в действии.

 

cryptoparty

Cryptography is typically bypassed, not penetrated.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

5e7fa976b0640d40