Мы попытаемся создать автономное устройство “бэкдор”, которое, когда его обнаруживают, не позволяет просто понять, что вы делали с его помощью. Поэтому мы используем полное шифрование диска 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.txt
dwc_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.
Помните, что ваши действия не должны наносить кому-то вред с помощью этих технологий. Вся информация исключительно в познавательных целях.