Устанавливаем Kali Linux на Raspberry Pi

Мы попытаемся создать автономное устройство “бэкдор”, которое, когда его обнаруживают, не позволяет просто понять, что вы делали с его помощью. Поэтому мы используем полное шифрование диска LUKS вместе с функцией LUKS Nuke. Если у вас есть Raspberry Pi 3 Model B+, или любая другая модель, пробуйте смело использовать инструкции ниже, чтобы настроить свою собственную безопасную систему.

Обзор процесса установки

Прежде чем мы погрузимся в процесс, давайте быстро взглянем на наши цели по настройке нашей Raspberry Pi 3 B+ (далее ” RPi”):

  • Создать обычную установочную копию Kali Linux RPi
  • Подготовить систему к зашифрованной загрузке с удаленной разблокировкой диска
  • Создать initramfs, настроенный с помощью ключей Dropbear и SSH, чтобы разрешить разблокировку
  • Резервное копирование существующих данных
  • Настройка зашифрованных разделов
  • Восстановление наших данных
  • Настройка LUKS Nuke
  • Удаленный хакинг! 🙂

Может показаться, что много всего, но на самом деле все довольно просто и после завершения у нас будет RPi, который будет загружаться, получит IP по DHCP, и Dropbear позволит нам подключиться через SSH, чтобы обеспечить ключ LUKS. Это позволяет нам запускать RPi и по-прежнему сохранять наши данные в безопасности. Затем, когда мы закончим с ним, мы можем подключиться к нему удаленно, войти и уничтожить наши данные с помощью LUKS NUKE.

Готовим базу

Для начала нам нужно записать образ RPi на SD-карту. Мы не будем вдаваться в это сейчас, вы можете найти информацию об этом свободно в Интернете.

После этого мы вставляем SD-карту в RPi и позволяем ей загрузиться. При первой загрузке изменится размер SD-карты и произойдет перезагрузка, после чего он будет готов к использованию. Затем мы подключаемся по SSH, обновляем Kali и устанавливаем несколько пакетов, которые нам понадобятся.

root@kali:~# apt update
root@kali:~# apt dist-upgrade
root@kali:~# apt install cryptsetup lvm2 busybox dropbear

Делаем магию

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

Во-первых, нам нужно добавить строку к /boot/config.txt:

root@kali:~# echo initramfs initramfs.gz followkernel >> /boot/config.txt

Затем мы хотим узнать, где находится корневая файловая система:

root@kali:~# cat /etc/fstab

# proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1

Мы узнали, что корень здесь /dev/mmcblk0p2. Используйте далее в примерах свой путь к разделу.

Отредактируем файл /boot/cmdline.txt . По-умолчанию его содержимое таково:

root@kali:~# cat /boot/cmdline.txtdwc_otg.fiq_fix_enable=2 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rootflags=noload net.ifnames=0

Нам необходимо после значения root=/dev/mmcblk0p2 добавить параметр cryptdevice:

cryptdevice=/dev/mmcblk0p2:crypt

После изменений файл должен выглядеть так:

root@kali:~# cat /boot/cmdline.txt

dwc_otg.fiq_fix_enable=2 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mapper/crypt cryptdevice=/dev/mmcblk0p2:crypt rootfstype=ext4 rootwait rootflags=noload net.ifnames=0

Еще нам нужно отредактировать /etc/fstab и заменить устройство, которое монтируется в корень на /dev/mapper/crypt (старое закомменитровать):

root@kali:~# cat /etc/fstab

# proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mapper/crypt / ext4 defaults,noatime 0 1
#/dev/mmcblk0p2 / ext4 defaults,noatime 0 1

Дальше создадим файл /etc/crypttab и добавим следующую строку в него:

root@kali:~# crypt /dev/mmcblk0p2 none luks

Убедитесь, что между значениями находится символы табуляции, а не просто пробелы. Сейчас мы начнем создавать initramsfs, нам нужно сделать хитрый маленький хак, чтобы заставить cryptsetup быть включенным. Для этого мы создадим поддельную файловую систему LUKS. С помощью dd создадим пустой файл, форматируем его как LUKS, монтируем и помещаем на него файловую систему.

root@kali:~# dd if=/dev/zero of=/tmp/fakeroot.img bs=1M count=20
root@kali:~# cryptsetup luksFormat /tmp/fakeroot.img
root@kali:~# cryptsetup luksOpen /tmp/fakeroot.img crypt
root@kali:~# mkfs.ext4 /dev/mapper/crypt

Не беспокойтесь слишком о настройке надежного пароля для этого лже-root, поскольку он используется только здесь.

Настройка SSH и Initramfs

Мы почти на финишной прямой. Эта часть действительно классная, так как обычно, когда запускается система под управлением LUKS, процесс загрузки приостанавливается, чтобы вы могли разблокировать жесткий диск с помощью ключа LUKS. Но если вы используете удаленную систему, это не особенно удобно.

Чтобы обойти это, мы собираемся настроить Dropbear для запуска, разрешить аутентификацию с помощью SSH, а затем подключить нас, чтобы предоставить свой пароль LUKS – и все это удаленно!

Мы начинаем с создания файла /etc/dropbear-initramfs/authorized_keys в котором будет это:

command="export PATH='/sbin:/bin/:/usr/sbin:/usr/bin'; /scripts/local-top/cryptroot && kill -9 `ps | grep -m 1 'cryptroot' | cut -d ' ' -f 3` && exit"

Важно отметить, что это должно быть все в одну строку. Если вы правильно все настроили, она должна выглядеть примерно так:

root@kali:~# cat /etc/dropbear-initramfs/authorized_keys

command="export PATH='/sbin:/bin/:/usr/sbin:/usr/bin'; /scripts/local-top/cryptroot && kill -9 `ps | grep -m 1 'cryptroot' | cut -d ' ' -f 3` && exit" ssh-rsa AAAAB3NzaC... user@system

Далее внесем небольшие изменения в файл /usr/share/initramfs-tools/scripts/init-premount/dropbear. Это изменение связано с тем, что нам нужно замедлить Dropbear, чтобы гарантировать, что сеть настроена до того, как Dropbear начнет работать. Вот как выглядит исходный файл:

# On NFS mounts, wait until the network is configured. On local mounts,
# configure the network in the background (in run_dropbear()) so someone
# with console access can enter the passphrase immediately. (With the
# default ip=dhcp, configure_networking hangs for 5mins or so when the
# network is unavailable, for instance.)
[ "$BOOT" != nfs ] || configure_networking
run_dropbear &
echo $! >/run/dropbear.pid

Мы заменим его на это:

[ "$BOOT" != nfs ] || configure_networking
sleep 5
run_dropbear &
echo $! >/run/dropbear.pid

После этих изменений мы готовы запустить initramfs!

root@kali:~# mkinitramfs -o /boot/initramfs.gz

Прежде, чем продожить, уведимся, что наши измемнения внесены в initramfs:

root@kali:~# lsinitramfs /boot/initramfs.gz | grep cryptsetup
root@kali:~# lsinitramfs /boot/initramfs.gz | grep authorized

После проверки мы убедились, что все изменения записаны и выключим RPi.

root@kali:~# sync && sync
root@kali:~# init 0

Резервное копирование и восстановление

Извлеките SD-карту из вашего RPi и вернемся в систему, на которой мы изначально записывали образ на SD-карту. Давайте подготовим окружающую среду:

root@kali:~# ls -al /mnt/{chroot,backup,encrypted}

Пожалуйста, убедитесь, что здесь ничего нет, прежде чем двигаться дальше, иначе у вас будет плохой день.

root@kali:~# rm -rf /mnt/{chroot,backup,encrypted}
root@kali:~# mkdir -p /mnt/{chroot,backup,encrypted}

Теперь вставьте SD-карту и проверьте идентификатор устройства. В моем случае это устройство /dev/sdc2, но ваше может отличаться, поэтому учтите этот момент. Монтируем устройство и делаем резервную копию файлов:

root@kali:~# mount /dev/sdc2 /mnt/chroot/
root@kali:~# rsync -avh /mnt/chroot/* /mnt/backup/
root@kali:~# umount /mnt/chroot

Как только это сделано, мы удалим существующий 2-й раздел на SD-карте и создадим пустой, который мы настроили для шифрования LUKS.

root@kali:~# echo -e "d\n2\nw" | fdisk /dev/sdc
root@kali:~# echo -e "n\np\n2\n\n\nw" | fdisk /dev/sdc

With the partitions updated, we reload them by running partprobe and then configure LUKS on the new partition:

root@kali:~# cryptsetup -v -y --cipher aes-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sdc2
root@kali:~# cryptsetup -v luksOpen /dev/sdc2 crypt
root@kali:~# mkfs.ext4 /dev/mapper/crypt

После этого мы восстанавливаем резервную копию корневой файловой системы на зашифрованный раздел.

root@kali:~# mount /dev/mapper/crypt /mnt/encrypted/
root@kali:~# rsync -avh /mnt/backup/* /mnt/encrypted/
root@kali:~# sync
root@kali:~# umount /mnt/encrypted/
root@kali:~# cryptsetup luksClose /dev/mapper/crypt

Тестирование

Теперь вставим SD-карту обратно в RPi и включим ее. Если вы смотрите на процесс загрузки, вы должны увидеть запуск Dropbear. В этот момент Вы можете подключиться по SSH и разблокировать диск.

root@kali:~# ssh -o "UserKnownHostsFile /dev/null" root@10.1.1.10
The authenticity of host '10.1.1.10 (10.1.1.10)' can't be established.
ECDSA key fingerprint is SHA256:L+QVP+OmncGDleuEoj77OlRGuCji2gp0c1gMYjUupU0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.1.1.10' (ECDSA) to the list of known hosts.
Please unlock disk /dev/mmcblk0p2 (crypt):
cryptsetup (crypt): set up successfully
Connection to 10.1.1.10 closed.

Универсальность этих маленьких устройств в сочетании с мощью Kali никогда не перестает удивлять нас. Теперь у нас есть классный девайс с удаленным управлением, с которым мы можем работать с относительной уверенностью, потому что даже если его обнаружат, проникнуть в него будет не так-то просто.

Но мы еще не закончили! Давайте добавим в некоторые функции LUKS NUKE:

root@kali:~# cryptsetup luksDump /dev/mmcblk0p2
root@kali:~# cryptsetup luksAddNuke /dev/mmcblk0p2

Теперь, когда мы заходим по SSH, у нас есть один пароль, который мы вводим, чтобы разблокировать SD-карту и продолжить процесс загрузки, а другой уничтожает заголовок LUKS, делая данные недоступными. Если вы окажетесь в ситуации, когда не можете получить доступ к устройству, этот вариант может быть не очень полезным. Поэтому если хотите быть действительно предусмотрительным, вы можете превратить устройство в беспроводную точку доступа, что позволит вам удаленно входить и разблокировать/сбросить систему через беспроводное соединение. Это очень полезно, если у вас не будет постоянного прямого доступа к сети, к которой будет подключен RPi.

Помните, что ваши действия не должны наносить кому-то вред с помощью этих технологий. Вся информация исключительно в познавательных целях.


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Unlix.ru © Все права защищены 2015 - 2024

Копирование материалов с сайта Unlix.ru без указания полной ссылки на источник ЗАПРЕЩЕНО!