Pineapple Nano своими руками Часть 2. Прошивка устройства

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Сборка своего "хакерского чемоданчика", или как я портировал ПО от Pineapple Nano в доработанный роутер MR3020, все подробности в статье. Вперед!

Описание преимуществ данного хакерского устройства, и обзор моей аппаратной платформы можно прочитать в первой статье. Краткий обзор того,что имеем: 

  • роутер TP-Link MR3020 v.1.0 с увеличенными Flash и RAM;

  • USB-hub; 

  • беспроводной адаптер Tp-Link TL-WN722N; 

  • флеш-карта;

  • аккумуляторная сборка.

Загрузчик

Заводской загрузчик в роутере MR3020 не распознает Flash-память более 4 Mb, поэтому мне понадобился альтернативный u-boot. Как и писал в прошлой статье, загрузчик я использовал от pepe2k. Я просто скачал загрузчик для MR3020 с репозитория, и залил в чистую Flash объемом 16 Mb. ART (Atheros Radio Test) раздел я прошью чуть позже. Прошивал дешевым программатором на чипе CH341, а программу использовал Colibri.

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

Параметры для подключения к терминалу роутера следующие: скорость 115200 бод/с, 8n1. Запускаем!

***************************************
*     U-Boot 1.1.4-7a540a78-clean     *
*          Build: 2018-02-23          *
***************************************
   BOARD: TP-Link TL-MR3020 v1
     SOC: AR9330 rev. 1 
     CPU: MIPS 24Kc
     RAM: 64 MB DDR2 16-bit CL3-4-4-10
   FLASH: 16 MB Winbond W25Q128
     MAC: 00:03:7F:09:0B:AD (fixed)
  CLOCKS: CPU/RAM/AHB/SPI/REF
          400/400/200/25/25 MHz

Лог консоли говорит что я молодец наверное, и все делаю правильно, Flash и RAM определились в нужном нам объеме:

RAM: 64 MB DDR2 16-bit CL3-4-4-10
FLASH: 16 MB Winbond W25Q128

Отличительной особенностью данного загрузчика является возможность прошивки образов U-Boot, Firmware и ART прямо из веб-браузера без необходимости доступа к последовательной консоли и запуска TFTP-сервера.

Поэтому для прошивки достаточно подключить Ethernet-кабель к роутеру, подключить UART-USB адаптер к терминалу с нужными параметрами и при запуске нажать любую клавишу, когда увидим данное сообщение в терминале:

Hit any key to stop booting: 4 

После чего задаем настройки адреса веб-сервера на роутере, и запускаем его:

setenv ipaddr 192.168.0.100
saveenv
httpd

Далее просто переходим по прописанному адресу на одну из данных страниц, в зависимости от того, что хотим прошить: 

  • 192.168.0.100 - прошивка основого образа;

  • 192.168.0.100/art.html - прошивка ART-раздела;

  • 192.168.0.100/uboot.html - прошивка загрузчика.

Для начала прошьем немаловажную часть - ART-раздел. В конце  Flash-памяти у данного роутера находится маленький раздел - ART (Atheros Radio Test) - это раздел с калибровочными данными вай-фай части чипсета, и он чрезвычайно важен, так как без него он работать откажется совсем, а с чужими калибровками будет работать неизвестно как. 

Предварительно, с еще заводского роутера, мной был сделан дамп ART-раздела:

cat /dev/mtd4 > /tmp/backup_art.bin

Далее просто переходим по адресу прошивки ART-раздела и выбираем нужный бинарный файл на пк:

Сборка прошивки

Попытки залить оригинальную прошивку в устройство не привели ни к чему хорошему, как минимум потому, что у Pineapple и MR3020 по-разному используются GPIO. 

Все описание выводов GPIO находится в DTS-файлах (Device Tree). Так, например, в версии Nano для перезагрузки устройства используется 12 пин, и его активное состояние LOW:

keys {
		compatible = "gpio-keys";
		reset {
			label = "reset";
			linux,code = <KEY_RESTART>;
			gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
			debounce-interval = <60>;
		};
	};

А в том же TP-Link TL-MR3020 по умолчанию кнопка для сброса вообще не работает, потому что она используется как WPS. Но описана она на 11 GPIO, и активна в состоянии HIGH:

keys {
		compatible = "gpio-keys";
		reset {
			label = "reset";
			linux,code = <KEY_RESTART>;
			gpios = <&gpio 11 GPIO_ACTIVE_HIGH>;
			debounce-interval = <60>;
		};

Для сборки прошивки устройства я воспользовался проектом Universal Wifi pineapple hardware cloner.

В описании проекта есть хорошая инструкция, но я её продублирую и разберу. 

Для начала нам нужно загрузить сам репозиторий, делается это простыми командами:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git php python-lzma mtd-utils gzip bzip2 tar arj lhasa p7zip p7zip-full cabextract cramfsprogs cramfsswap squashfs-tools
git clone https://github.com/xchwarze/wifi-pineapple-cloner

Далее нам понадобится тулкит для того, чтобы разобрать прошивку. В репозитории предлагается использовать firmware-mod-kit (но можно использовать тот же  binwalk):

git clone https://github.com/rampageX/firmware-mod-kit fmk-tool

Далее начинается самое интересное - разбор прошивки с вычленением из нее всей файловой системы:

wget https://www.wifipineapple.com/downloads/nano/latest -O nanofw.bin
fmk-tool/extract-firmware.sh nanofw.bin
sudo chown -R $USER fmk
mv fmk/rootfs rootfs-nano
rm -rf fmk

Для того, чтобы узнать, какие пакеты установлены в Pineapple Nano мы натравим скрипт из проекта, который парсит файл rootfs-nano/usr/lib/opkg/status, и выводит список пакетов: сперва не Essential, потом Essential. Кроме тех, у которых есть значение-пометка "Auto-Installed", и кроме тех, кто попадает в этот список: 'pineap', 'aircrack-ng-hak5', 'cc-client', 'libwifi', 'resetssids', 'http_sniffer', 'log_daemon':

php opkg_statusdb_parser.php rootfs-nano/usr/lib/opkg/status

Результат вывода данного скрипта мы сохраняем куда-нибудь недалеко, он нам еще понадобится:

======== Packages ========
Total: 102
at autossh base-files block-mount ca-certificates chat dnsmasq e2fsprogs ethtool firewall hostapd-utils ip6tables iperf3 iwinfo kmod-ath kmod-ath9k kmod-ath9k-htc kmod-crypto-manager kmod-fs-ext4 kmod-fs-nfs kmod-fs-vfat kmod-gpio-button-hotplug kmod-ipt-offload kmod-leds-gpio kmod-ledtrig-default-on kmod-ledtrig-netdev kmod-ledtrig-timer kmod-mt76x2u kmod-nf-nathelper kmod-rt2800-usb kmod-rtl8187 kmod-rtl8192cu kmod-scsi-generic kmod-usb-acm kmod-usb-net-asix kmod-usb-net-asix-ax88179 kmod-usb-net-qmi-wwan kmod-usb-net-rndis kmod-usb-net-sierrawireless kmod-usb-net-smsc95xx kmod-usb-ohci kmod-usb-storage-extras kmod-usb-uhci kmod-usb2 libbz2-1.0 libcurl4 libelf1 libffi libgmp10 libiconv-full2 libintl libltdl7 libnet-1.2.x libnl200 libreadline8 libustream-mbedtls20150806 libxml2 logd macchanger mt7601u-firmware mtd nano ncat netcat nginx odhcp6c odhcpd-ipv6only openssh-client openssh-server openssh-sftp-server openssl-util php7-cgi php7-fpm php7-mod-hash php7-mod-json php7-mod-mbstring php7-mod-openssl php7-mod-session php7-mod-sockets php7-mod-sqlite3 ppp ppp-mod-pppoe procps-ng-pkill procps-ng-ps python-logging python-openssl python-sqlite3 rtl-sdr ssmtp tcpdump uboot-envtools uci uclibcxx uclient-fetch urandom-seed urngd usb-modeswitch usbreset usbutils wget wireless-tools wpad
======== Essentials Packages ========
Total: 4
busybox libatomic1 libstdcpp6 opkg

Далее поочередно запустим скрипты copier.sh и nano-fixer.sh. Данные скрипты копируют и фиксят нужные файлы, чтобы в дальнейшем подсунуть их билдеру при сборке прошивки.

chmod +x copier.sh
./copier.sh nano.filelist rootfs-nano
chmod +x nano-fixer.sh
./nano-fixer.sh

Далее мне пришлось отступить от инструкции по немаловажной причине - автор проекта предлагает использовать для сборки ImageBuilder, который, в свою очередь, собирает прошивки под уже известные платформы. А наша платформа измененная. Так как при изменении файла DTS в ImageBuilder он все равно собирает прошивку “по-памяти”, не учитывая необходимых изменений.

Поэтому я решил взять в руки серьезный инструмент в виде Buildroot, и начал воевать.

Из репозитория pineapple-cloner’а  мы знаем версию OpenWRT (я сам проверял, разбирая прошивку - версия OpenWRT - 19.07.2), ее и будем использовать. Для этого скачаем репозиторий, выберем версию, обновим репозиторий, и установим все дерево пакетов (на всякий случай):

git clone https://github.com/openwrt/openwrt.git
cd openwrt/
git checkout v19.07.2
git pull
./scripts/feeds update -a
./scripts/feeds install -a

Учитывая, что память в роутере мы увеличили, нам придется так же пропатчить ядро на предмет емкости флеш-памяти, размещения в ней системы, без чего устройство откажется стартовать. Все изменения производим в DTS-файле, который лежит по вот этому пути: openwrt/target/linux/ath79/dts/ar9331_tplink_tl-mr3020-v1.dts. 

Раздел с загрузчиком оставил неизменным -  он находится в начале флешки, размер партиции firmware - увеличиваем, а в конец флешки кладем ART-раздел:

&spi {
        num-chipselects = <1>;
        status = "okay";
        /* Spansion W25Q128 SPI flash */
        flash@0 {
                compatible = "jedec,spi-nor";
                spi-max-frequency = <104000000>;
                reg = <0>;
                partitions {
                        compatible = "fixed-partitions";
                        #address-cells = <1>;
                        #size-cells = <1>;
                        uboot:  partition@0 {
                                label = "u-boot";
                                reg = <0x000000 0x020000>;
                                read-only;
                        };
                        partition@20000 {
                                compatible = "tplink,firmware";
                                label = "firmware";
                                reg = <0x020000 0xfd0000>;
                        };
                        art: partition@ff0000 {
                                label = "art";
                                reg = <0xff0000 0x010000>;
                                read-only;
 };
                };
        };
};

Для того, чтобы кнопка на 11 GPIO у нас стала работать как reset, а не WPS, перед сборкой нужно внести следующие изменения в файл openwrt/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-mr3020.c, более подробно описано здесь:

keys {
                compatible = "gpio-keys";
                button0 {
                        label = "reset";
                        linux,code = <KEY_RESTART>;
                        gpios = <&gpio 11 GPIO_ACTIVE_HIGH>;
                        debounce-interval = <60>;
                };

Так, с настройками ядра мы разобрались, осталось включить в сборку необходимые нам пакеты (заодно исключить ненужные). Выполняем

make menuconfig

и, спокойно но уверенно, используя поиск конфигуратора, начинаем один за одним добавлять пакеты, которые мы спарсили скриптом из оригинальной прошивки. Дело не быстрое, но нужное - главное не забыть удалить два данных пакета: wpad-basic и dropbear.

Запускаем сборку, и идем пить чай. Так как время сборки приблизительно составляет около часа (в зависимости от мощности ПК, конечно же):

make -j 5 V=s

После успешной сборки прошивки просто выгружаем ее и прошиваем ей роутер:

Запускаем роутер,подключаем к нему кабель Ethernet выставляем на ПК адрес 172.16.42.42, и в браузере стучимся по следующему адресу: 172.16.42.1:1471.
Ура! Роутер заработал, приглашает к первому запуску. Вводим необходимые параметры, и сразу смотрим точки вокруг себя:

Заключение

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

Источник: https://habr.com/ru/post/652943/


Интересные статьи

Интересные статьи

Первая часть моего повествования заканчивалась поступлением в Военную орденов Ленина, Октябрьской Революции и Суворова академию им. Ф. Э. Дзержинского (сокращённое название ВА им. Ф. Э. Дзержинского, ...
Перевод: Александр Росущан, Валентина Оборина, Полина Яровая Так как же высшая техника выживания сочетается с одобрением сексуальных удовольствий? Я думаю, что ключ к разрешению э...
Прошло полгода с выпуска пробной статьи про создание MMORPG в телеграме. Изменился мир, изменились и планы по игре.Почему больше не в TelegramПосле выпуска первой статьи,...
На недавно прошедшем Microsoft Build 2020 многократно упоминалась Azure RTOS как специализированная ОС жесткого реального времени для микроконтроллеров. В данном материале мы последо...
Привет, Хабр! Продолжаем публиковать рецензии на научные статьи от членов сообщества Open Data Science из канала #article_essense. Хотите получать их раньше всех — вступайте в сообщество! Ст...