Instalacja OpenWRT na Xiaomi AIoT Router AC2350


Szukając niedrogiego routera który obsłużył by OpenWRT wpadłem na Xiaomi AIoT Router AC2350. Oryginalnie zainstalowane jest na nim oprogramowanie producenta ale na szczęście da się wgrać OpenWRT 🙂

Bardzo pomocny jest poradnik znajdujący się na oficjalnej stronie OpenWRT ale przy wgraniu oprogramowania wykorzystałem ten poradnik wraz z plikami z githuba.

Po pierwsze musimy pobrać wymagane pliki:

  • oprogramowanie routera w chińskiej wersji 1.8 (która umożliwia dostęp po SSH) – Link
  • oprogramowanie OpenWRT – pobrane z eko.one.pl – Link
  • skrypty flash_fw.sh, crash.sh oraz art.sh pobrane z githuba

Poniżej jest zawartość tych skryptów które ja użyłem:

Skrypt flash_fw.sh – zmodyfikowana nazwa pliku z openwrt aby od razu wgrać pobrany przeze mnie obraz zawierający luci:

#!/bin/sh

. /bin/boardupgrade.sh

board_prepare_upgrade
mtd erase rootfs_data
mtd write /tmp/luci-21.02-snapshot-r16521-b1c3539868-ath79-generic-xiaomi_aiot-ac2350-squashfs-sysupgrade.bin firmware
sleep 3
reboot

Skrypt crash.sh:

#!/usr/bin/env sh

set -e

CRASH=/tmp/crash_unlock.bin
CRASHDATA=/tmp/crash.data

dd if=/dev/zero ibs=65536 count=1 2> /dev/null | tr "\000" "\377" > "${CRASH}"
PRINTF=$(which printf)
${PRINTF} "\xa5\x5a\0\0" > "${CRASHDATA}"
dd conv=notrunc if="${CRASHDATA}" of="${CRASH}" bs=1 count=4 > /dev/null 2>&1

echo "'crash_unlock' hack generated."
echo
echo "Write 'crash_unlock' dump using the following command:"
printf "\tmtd write %s crash\n" ${CRASH}
printf "\treboot\n"
echo
echo "After applying 'crash_unlock' hack, don't forget to run the command:"
printf "\tmtd erase crash\n"

Skrypt art.sh:

#!/usr/bin/env sh

set -e

BACKUP=/root/art.backup
PWRTEMP=/tmp/art.txpwr.temp
PWRPATCH=/tmp/art.txpwr.patch
OUTPUT=/tmp/art.mod.bin
MD5ORIG="16e0a5bf7f859455381a8ff4da86e170"
MD5PATCH="9f2027ebf7e67b1ca3c827e5f9ce2c52"

# Create backup of mtd5 (art)
if [ -f "${BACKUP}" ]; then
    echo "${BACKUP} exists. Please rename file and try again."
    exit
fi
dd if="/dev/$(grep art /proc/mtd | cut -d":" -f1)" of="${BACKUP}" > /dev/null 2>&1

dd if="${BACKUP}" of="${PWRTEMP}" bs=1 count=104 skip=$((0x10CE)) > /dev/null 2>&1
MD5=$(md5sum "${PWRTEMP}" | cut -d" " -f1)
if [ "${MD5}" = "${MD5PATCH}" ]; then
    echo "Art already patched."
    exit
fi

if [ "${MD5}" != "${MD5ORIG}" ]; then
    echo "Unknown content of art partition was detected. Patching is canceled. Contact the developer."
    exit
fi

cp "${BACKUP}" "${OUTPUT}"

PRINTF=$(which printf)
${PRINTF} "\x30\x30\x30\x30\x30\x30\x30\x30\x2E\x2E\x2E\x2C\x2E\x2E\x2E\x2C\x2E\x2E\x2E\x2C\x2E\x2E\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A" > "${PWRPATCH}"
dd conv=notrunc if="${PWRPATCH}" of="${OUTPUT}" bs=1 count=104 seek=$((0x10CE)) > /dev/null 2>&1

echo "Patching done."
echo "You must first unlock art partition using 'crash_unlock' hack!"
echo
echo "Write the modified dump using the following command:"
printf "\tmtd write %s art\n" ${OUTPUT}
echo
echo "After applying 'crash_unlock' hack, don't forget to run the command:"
printf "\tmtd erase crash\n"

Drugim krokiem jest wgranie do routera starszego, chińskiego oprogramowania. Adres routera to 192.168.31.1.

Po odpaleniu grywamy wersję oprogramowania 1.8 i czekamy na restart.

Logujemy się do nowo wgranego systemy (całość po chińsku więc polecam zapamiętać kroki wstępnej konfiguracji routera z wersji międzynarodowej).

Po zalogowaniu się kopiujemy ciąg znaków oznaczony jako STOK:

I używamy go do wygenerowania certyfikatów co umożliwi połączenie przez ssh (pogrubiony ciąg znaków powinien pochodzić z twojej sesji):

http://192.168.31.1/cgi-bin/luci/;stok=9f8decc273de03ee31e3392bdbf77539/api/misystem/set_config_iotdev?bssid=any&user_id=any&ssid=-h%0Anvram%20set%20ssh_en%3D1%0Anvram%20commit%0Ased%20-i%20%27s%2Fchannel%3D.%2A%2Fchannel%3D%5C%5C%22debug%5C%5C%22%2Fg%27%20%2Fetc%2Finit.d%2Fdropbear%0A%2Fetc%2Finit.d%2Fdropbear%20start%0A

Jeśli wszystko jest ok otrzymamy potwierdzenie „code”:0 – po ok 30 – 60 sekundach można podłączyć się przez ssh:

Po każdym restarcie routera wartość stok się zmienia i dostęp SSH zostaje wyłączony więc trzeba powtarzać powyższe 2 kroki po każdym restarcie routra aby dostać się po SSH do niego.

Aby otrzymać hasło użytkownika root do routra należy go obliczyć na podstawie numeru seryjnego routra poniższym poleceniem (lub używając generatora online):

printf "%s6d2df50a-250f-4a30-a5e6-d44fb0960aa0" "28151/E0QM56502" | md5sum - | head -c8 && echo

Podmieniając pogrubiony numer seryjny na swój własny.

Kiedy już mam hasło roota możemy podłączyć się przez SSH:

Kolejnym krokiem jest stworzenie backupu istniejącego systemu (w celu ewenrualnego ożywienia) poleceniem:

dd if=/dev/mtd0 of=/tmp/ALL.backup

I pobraniem go na nasz komputer poprzez SCP:

scp root@192.168.31.1:/tmp/ALL.backup ./

Teraz możemy przejść do modyfikowania systemu na routerze.

Po pierwsze kopiujemy poprzez SCP plik crash.sh na router:

scp crash.sh root@192.168.31.1:/tmp/

I uruchamiamy poniższe polecenia na routerze:

cd tmp
chmod +x crash.sh
./crash.sh
mtd write /tmp/crash_unlock.bin crash
reboot

Po restarcie routera należy pamiętać aby włączyć ponownie dostęp po ssh i przejść do skryptu art.sh który kopiujemy poleceniem:

scp art.sh root@192.168.31.1:/tmp/

Następnie na routerze wydajemy te polecenia:

cd tmp
chmod +x art.sh
./art.sh
mtd write /tmp/art.mod.bin art
mtd erase crash
reboot

Teraz po restarcie włączamy dostęp po SSH po raz ostatni i wgrywamy plik z oprogramowaniem openwrt oraz skrypt flash_fw.sh:

scp flash_fw.sh root@192.168.31.1:/tmp/
scp luci-21.02-snapshot-r16521-b1c3539868-ath79-generic-xiaomi_aiot-ac2350-squashfs-sysupgrade.bin root@192.168.31.1:/tmp/

Po wgraniu plików logujemy się na router po SSH i uruchamiamy polecenie:

/bin/ash /tmp/flash_fw.sh &

Po wydaniu tego polecenia połączenie ssh zostanie przerwane – to normalne.

Czekamy ok 2 minuty aż dioda na routerze zmieni się na niebieską i uruchamiamy w przeglądarce adres 192.168.1.1:

Działa 🙂

Teraz mamy już router z naszym ulubionym OpenWRT z interfejsem luci.

Linkografia:

https://github.com/eisaev/r2350

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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.