Перехвата ключа и пароля от зашифрованного LUKS раздела

Что такое LUKS?
LUKS является стандартом для шифрования жесткого диска Linux. Расшифровать данные на диске можно только имея доступ к секретному ключу и паролю.
Преимущество LUKS:
- совместимость через стандартизацию;
- защита от атак с низкой энтропией;
- возможность аннулирования секретной фразы;
- распространяется бесплатно.
Ниже мы рассмотрим процесс изменения исходного кода с целью перехвата парольной фразы или ключа для расшифровки LUKS раздела.
Все манипуляции проводятся на свежем Debian 10 с добавлением дополнительного диска для экспериментов с шифрованием.
Настройка диска
После установки переходим под root:
su -
Затем утилитой fdisk смотрим название доступных дисков:
fdisk -l
(out)Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
(out)Disk model: VMware Virtual S
(out)Units: sectors of 1 * 512 = 512 bytes
(out)Sector size (logical/physical): 512 bytes / 512 bytes
(out)I/O size (minimum/optimal): 512 bytes / 512 bytes
(out)Disklabel type: dos
(out)Disk identifier: 0x09849b5eDevice Boot Start End Sectors Size Id Type
(out)/dev/sda1 * 2048 37750783 37748736 18G 83 Linux
(out)/dev/sda2 37752830 41940991 4188162 2G 5 Extended
(out)/dev/sda5 37752832 41940991 4188160 2G 82 Linux swap / SolarisDisk /dev/sdb: 4 GiB, 4294967296 bytes, 8388608 sectors
(out)
(out)Disk model: VMware Virtual S
(out)Units: sectors of 1 * 512 = 512 bytes
(out)Sector size (logical/physical): 512 bytes / 512 bytes
(out)I/O size (minimum/optimal): 512 bytes / 512 bytes
В своем примере я буду использовать устройство /dev/sdb
Для разметки диска использую утилиту parted передав имя диска в качестве аргумента:
parted /dev/sdb
Помечаю таблицу разделов как GPT:
(parted) mklabel gpt
И создаю единственный раздел, занимающий весь диск:
(parted) mkpart primary 1 -1
(parted) quit
Сборка cryptsetup
Работы с разметкой /dev/sdb закончены. Переходим к сборке cryptsetup. В недавней статье про backdoor в PAM модуле я брал исходный код PAM с помощью dpkg-dev, который умеет скачивать исходники установленной в систему версии ПО.
Если у вас уже установлен LUKS и вы хотите модифицировать текущую версию утилиты, воспользуйтесь этой информацией:

В этом примере я буду собирать 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 --version
(out)cryptsetup 2.0.6
Отлично. Теперь создадим зашифрованный раздел с помощью cryptsetup и пароля вводимого в tty:
cryptsetup luksFormat /dev/sdb1
Соглашаемся на форматирования (YES) и вводим для последующего доступа к разделу, в качестве пароля использую t3st3ncryp7
Проверяем, все ли удалось:
cryptsetup isLuks /dev/sdb1 && echo Ok!
Ok!
Все получилось. Подключаем шифрованный раздел, для его последующего монтирования:
cryptsetup luksOpen /dev/sdb1 db
Вводим парольную фразу (t3st3ncryp7) и для возможности работы с разделом (чуть позже в этом месте мы перехватим вводимый в tty пароль).
Форматируем раздел:
mke2fs -j /dev/mapper/db
И монтируем для работы, например в /mnt:
mount /dev/mapper/db /mnt && cd /mnt
echo Hello! > test.txt
cat test.txt
(out)Hello!
ls -la
(out)итого 28
(out)drwxr-xr-x 3 root root 4096 ноя 6 06:49 .
(out)drwxr-xr-x 20 root root 4096 ноя 6 05:34 ..
(out)drwx------ 2 root root 16384 ноя 6 06:48 lost+found
(out)-rw-r--r-- 1 root root 7 ноя 6 06:49 test.txt
Модифицируем код
На данном этапе мы научились монтировать шифрованный LUKS раздел c использованием парольной фразы. Сейчас мы исправим исходный код для сохранения не только вводимого пароля, но и случайно сгенерированного файла, который может быть указан в качестве ключа для расшифровки раздела.
Статья написана для журнала «Xakep.ru»
Материалы подготовленные для других изданий становятся доступны для чтения спустя два месяца после публикации. Сейчас, чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
По промокоду xakep-promo-n0a скидка 20%.
Продолжить чтение на xakep.ru ➝