Следующая новость
Предыдущая новость

Бэкдор для LUKS. Как перехватить ключ и пароль от зашифрованного раздела в Linux

14.12.2020 23:12

Содержание статьи

  • Настройка диска
  • Сборка cryptsetup
  • Модифицируем код
  • Итог

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

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

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

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

1 год

7690 р.

1 месяц

720 р.

Я уже участник «Xakep.ru»

Источник

Последние новости