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

LUKS — это, по сути, стан­дарт для шиф­рования дис­ков в Linux. Под­держи­вает­ся до вось­ми сло­тов клю­чей, есть выбор хеш‑фун­кций, алго­рит­мов и режимов шиф­рования, есть адап­тивный алго­ритм выбора количес­тва ите­раций. Рас­шифро­вать дан­ные на дис­ке мож­но, толь­ко имея дос­туп к сек­ретно­му клю­чу и паролю.

Сре­ди дру­гих пре­иму­ществ LUKS:

  • сов­мести­мость через стан­дарти­зацию;
  • за­щита от атак с низ­кой энтро­пией;
  • воз­можность анну­лиро­вать сек­ретную фра­зу.

Ну и рас­простра­няет­ся она бес­плат­но.

 

Настройка диска

Все манипу­ляции мы будем про­водить на све­жем Debian 10, добавив допол­нитель­ный диск для экспе­римен­тов с шиф­ровани­ем.

Пос­ле уста­нов­ки перехо­дим под root:

su -

За­тем ути­литой fdisk смот­рим наз­вания дос­тупных дис­ков:

$ fdisk -l

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

В сво­ем при­мере я буду исполь­зовать устрой­ство /dev/sdb. Для раз­метки дис­ка исполь­зую ути­литу parted, передав имя дис­ка в качес­тве аргу­мен­та:

parted /dev/sdb

По­мечаю таб­лицу раз­делов как GPT:

(parted) mklabel gpt

И соз­даю единс­твен­ный раз­дел, занима­ющий весь диск:

(parted) mkpart primary 1 -1
(parted) quit
 

Сборка cryptsetup

Ра­боты с раз­меткой /dev/sdb закон­чены. Перехо­дим к сбор­ке 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 --version

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

Hello!

# ls -la

ито­го 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 c исполь­зовани­ем пароль­ной фра­зы. Сей­час мы испра­вим исходный код, что­бы сох­ранять не толь­ко вво­димый пароль, но и слу­чай­но сге­нери­рован­ный файл, который может быть ука­зан в качес­тве клю­ча для рас­шифров­ки раз­дела.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


8 комментариев

  1. Аватар

    ya

    14.12.2020 в 19:17

    название не совсем или совсем не соотвествует содержанию. бэкдор? да! только как его задействовать ДО создания шифрованного раздела. или как залить его в git производителя?

    • Denis Simonov

      Denis Simonov

      14.12.2020 в 19:24

      Чтобы залить в git, нужны креды автора репозитория, очевидно же. А вот если есть root доступ к машине с LUKS разделом, то есть возможность внедрить бекдор для перехвата пароля или ключа. Узкий кейс, тем не менее.

    • Аватар

      Hackcat

      14.12.2020 в 20:30

      Ну почему «до»?
      Этот код перехватит при *каждой* разблокировке контейнера, и подсадить малварь на целевую машину можно довольно незаметно. Хотя бы многочисленные скрипты для «взлома без регистрации и смс», которые запускаются от рута, могут запросто подменить cryptsetup, и при маски-шоу получить ключ в чистом виде

      • Аватар

        hummelchen

        14.12.2020 в 20:47

        Для перехвата пароля от зашифрованного раздела с корневой ФС такую закладку могу внедрить в initramfs. В большинстве случаев initrd.img и ядро лежат на boot-разделе в открытом виде, чтобы контролировать их целостность приходится серьёзно заморачиваться с secureboot.

        • Аватар

          hummelchen

          14.12.2020 в 20:48

        • Denis Simonov

          Denis Simonov

          15.12.2020 в 00:18

          Согласен полностью. Такой вариант можно было бы рассмотреть в контексте опубликованного материала. Но я не стал этого делать, продемонстрировал лишь суть атаки.

  2. Аватар

    soko1

    17.12.2020 в 11:22

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

Оставить мнение