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

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

Разбираемся с LUKS и утилитой cryptsetup для создания шифрованного раздела диска, включая создания такого тома, а также изменяем исходный код с сохранением парольной фразы (и ключа).
Перехвата ключа и пароля от зашифрованного 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 и вы хотите модифицировать текущую версию утилиты, воспользуйтесь этой информацией:

Создание backdoor’a на основе PAM модуля
Способов закрепиться на взломанной машине масса. От банальных и легко обнаруживаемых до сложных модулей ядра с reverse shell. Но есть среди них очень простой в реализации и достаточно скрытный метод — это модификация модулей системы аутентификации PAM, которая есть во всех современные UNIX-системах.

В этом примере я буду собирать 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%.