¿flashear routers MitraStar GPT-2541GNAC, Askey-RTF8115VW?

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
455
¿Alguien sabrá como se podrán flashear dichos routers?, he estado experimentando con mods y en caso de cagarlas necesito poder cargar el firmware de stock, ya que obviamente no estaría disponible la interfaz web al estar trabajando sobre micro_httpd.

Vi que al interior tienen lo que parece ser un puerto jtag y otro serial, pero sobre ssh y serie según entiendo se llega a cms y no a una consola útil. Y nunca he usado jtag.
 

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
455
Mientras investigo como sobreescribir el firmware de una forma sencilla y emular mips 32 v1, dejaré el avance de lo que estaba haciendo, por si alguien con mas conocimiento que yo quiere probar.

Basado en éste post, para el firmware CL_g7.7_100VNP0b43.bin -> 17/03/2023. Pero supongo que funciona con cualquier firmware de vomistar gpon.

Nota: Linux es requerido
Nota 2: Lo siguiente es teórico (para saciar la curiosidad)
Nota 3: No pretende ser un tutorial, mas bien un registro de avance, por lo que los detalles los pasaré de largo.

Advertencia: No intenten recompilar sin testing. Cuando el equipo quede como un pisapapeles no se podrá cargar el firmware de stock vía panel web avanzado. Es posible que el equipo siquiera encienda.

Alerta de chino mandarín


1. Desempaquetar (una vez descargado)
Código:
// binwalk CL_g7.7_100VNP0b43.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
131072        0x20000         Squashfs filesystem, little endian, version 4.0, compression:xz, size: 20497354 bytes, 1280 inodes, blocksize: 131072 bytes, created: 2023-03-17 10:00:00
20631564      0x13AD00C       LZMA compressed data, properties: 0x6D, dictionary size: 4194304 bytes, uncompressed size: 4588512 bytes

El archivo consta de 3 partes. (Expresado en bytes)

Código:
Header 128kb
// 0 -> 131072
Firmware
// 131072 -> 20497354
Kernel Linux 3.4.11 comprimido con LZMA
// 20631564 -> 4588512

1.1 Header

Extracción
Bash:
dd if=CL_g7.7_100VNP0b43.bin of=header-128kb bs=1 count=131072

Contenido

Código:
6MSTC_a005ver. 2.06838GPT-2541GNAC1220245050032172933122050048032377937921524025100VNP0b6CL_g7.7_100VNP0b43%��a��:�=�B�=�2

El resto es espacio vacío. Me pregunto si contendrá algún tipo de hash para validar el firmware. (Nunca he visto que un fw mod pueda ser cargado así como así).

1.2 Firmware

Extracción

Bash:
// skip=131072 es para no sacar el header junto al firmware
dd if=CL_g7.7_100VNP0b43.bin of=fw.sfs skip=131072 bs=1 count=20497354
mkdir fw && cp fw.sfs fw/fw.sfs && cd fw
// Ingresar como root
sudo su
// Descomprime el firmware
unsquashfs fw.sfs
// avandona root
exit
// Cambia el usuario dueño a la carpeta
sudo chown -R $(whoami).$(whoami) squashfs-root
// mueve la carpeta al directorio padre
mv squashfs-root ../squashfs-root && cd ..
// elimina el directorio temporal fw, usado para realizar la extracción
rm -rf fw

Contenido

Bash:
ll squashfs-root

drwxrwxrwx 18 user user    4096 mar 17  2023 ./
drwxrwxr-x  4 user user    4096 dic  3 20:35 ../
drwxrwxr-x  2 user user    4096 mar 17  2023 app/
drwxr-xr-x  2 user user    4096 mar 17  2023 bin/
drwxrwxr-x  2 user user    4096 mar 17  2023 cfg_upgrade/
drwxrwxr-x  2 user user    4096 mar 17  2023 data/
lrwxrwxrwx  1 user user      16 mar 17  2023 debug -> sys/kernel/debug/
drwxrwxr-x  4 user user    4096 mar 17  2023 dev/
drwxrwxr-x 13 user user    4096 mar 17  2023 etc/
-rw-rw-r--  1 user user       0 mar 17  2023 .init_enable_core
drwxrwxr-x  8 user user    4096 mar 17  2023 lib/
lrwxrwxrwx  1 user user      11 mar 17  2023 linuxrc -> bin/busybox*
drwxrwxr-x  2 user user    4096 mar 17  2023 mnt/
drwxrwxr-x  5 user user    4096 mar 17  2023 opt/
drwxrwxr-x  2 user user    4096 mar 17  2023 proc/
drwxrwxr-x  2 user user    4096 mar 17  2023 sbin/
drwxrwxr-x  3 user user    4096 mar 17  2023 sys/
lrwxrwxrwx  1 user user       8 mar 17  2023 tmp -> /var/tmp/
drwxrwxr-x  5 user user    4096 mar 17  2023 usr/
drwxrwxr-x  2 user user    4096 mar 17  2023 usrcfg/
drwxrwxr-x  3 user user    4096 mar 17  2023 var/
-rw-rw-r--  1 user user 1524025 mar 17  2023 vmlinux.lz
drwxrwxr-x  6 user user   12288 mar 17  2023 webs/

En webs/ está el front del panel administrativo.
En etc/ está gran parte de la configuración del equipo
El backend del panel administrativo está compilado en bin/httpd

1.3 Kernel

Extracción

Bash:
dd if=CL_g7.7_100VNP0b43.bin of=kernel.lzma skip=20631564 count=4588512
xz -d kernel.lzma

Contenido

Bash:
binwalk kernel

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
3485796       0x353064        Linux kernel version 3.4.11
3503656       0x357628        gzip compressed data, maximum compression, from Unix, last modified: 1970-01-01 00:00:00 (null date)
3558479       0x364C4F        Copyright string: "Copyright 1995-2005 Mark Adler "
3558816       0x364DA0        CRC32 polynomial table, big endian
3562912       0x365DA0        CRC32 polynomial table, little endian
3567023       0x366DAF        Copyright string: "Copyright 1995-2005 Jean-loup Gailly "
3581684       0x36A6F4        CRC32 polynomial table, big endian
3901576       0x3B8888        xz compressed data
3995032       0x3CF598        Neighborly text, "NeighborSolicits6InDatagrams"
3995052       0x3CF5AC        Neighborly text, "NeighborAdvertisementsorts"
3998783       0x3D043F        Neighborly text, "neighbor %.2x%.2x.%pM lostdrType %d is not supported"
4196304       0x4007D0        CRC32 polynomial table, little endian

Con ésta pequeña introducción ya puedo dejar un registro de lo que estaba haciendo...

Había un bug localizado en el panel de diagnóstico que permitía meter un comando directo a la consola, que parcharon.

Código:
// Login al panel avanzado (usuario Support) 
https://192.168.1.1:8000/main.html

1733271853575.png
En esa pantalla se podia ingresar un comando, por ejemplo (con trace route)

Bash:
0\\\;echo$IFS"test!"

Se hicieron 2 parches a nivel de side. En el front cargaron validaciones

JavaScript:
function btnApply(type) {
    //var loc = 'disagnostic-general.cgi?';
    /* Desactivar ésto
    if (document.forms[0].diagAddr.value == '') {
        alert('Address should not be empty!');
        return;
    }
    if (!isValidHostName(document.forms[0].diagAddr.value)) {
        alert('Address is invalid!');
        return;
    }
    */

    buttonControl(1);
    //loc += 'diagAddr=' + document.forms[0].diagAddr.value;
    //loc += '&diagTestType=' + type;
    //loc += '&sessionKey=' + sessionKey;
    //var code = 'location.assign("' + loc + '")';
    //eval(code);
    document.port_pingTest.diagAddr.value = document.forms[0].diagAddr.value;
    document.port_pingTest.diagTestType.value = type;
    document.port_pingTest.sessionKey.value = sessionKey;
    document.port_pingTest.submit();
}

Don dicha desactivación ya se puede cargar otra cosa que no sea una url o una ip. Para hacer permanente el cambio se puede modificar el archivo webs/diagnostic.html a partir de la línea 242.

A nivel de backend, lo siguiente es mas complejo, requiere instalar ghidra (usando snap por ej), (otros decompiladores eran de pago y no pude desensamblar para MIPS 32 V1)(con objdump para mips 32 tampoco pude).

Bash:
sudo snap install ghidra

Según lo que pude leer, éstos equipos usan micro_httpd como servidor web debido al poco uso que tienen sus paneles administrativos (porque acme advierte sobre lo mal que funciona el software bajo alta demanda).

Ahora que ya lo hemos instalado, creamos un nuevo proyecto e importamos bin/httpd.

1733272497924.png


Damos doble clic en httpd y se abrirá una ventana nueva. Nos preguntará si queremos realizar un análisis, le decimos que si y dejamos la configuración del análisis tal cual viene. Esperamos... (en la parte derecha inferior de la pantalla aparece el status del análisis). El CPU irá a todo vapor, es normal. Luego nos preguntará si queremos ir a la función main (es indiferente).

En la ventana izquierda llamada Symbol Tree, tenemos que buscar la función "cgiSetDiagnostic".

1733272635993.png


En la pestaña de la derecha tendremos el resultado del análisis para la función.

C:
void cgiSetDiagnostic(char *param_1,int param_2)

{
  char *pcVar1;
  int iVar2;
  char acStack_90 [128];
  
  memset(acStack_90,0,0x80);
  iVar2 = param_2;
  log_log(7,"cgiSetDiagnostic",0x7ac,"dstAddr=%s type=%d",param_1,param_2);
  if (param_1 != (char *)0x0) {
    if (*param_1 == '\0') {
      DAT_004c4560 = 0;
    }
    else {
      pcVar1 = strpbrk(param_1,"\"<>%\\^[]`+$=\'#&\t(){}|/;-_~!@*?,");
      if (pcVar1 == (char *)0x0) {
        if (param_2 == 2) {
          pcVar1 = "traceroute -o %s >%s&";
        }
        else if (param_2 == 3) {
          pcVar1 = "nslookup -h %s >%s&";
        }
        else {
          if (param_2 != 1) {
            log_log(7,"cgiSetDiagnostic",0x7c3,"not start to diag (type=%d)",param_2,iVar2);
            return;
          }
          pcVar1 = "ping %s  >%s&";
        }
        snprintf(acStack_90,0x80,pcVar1,param_1,"/var/diagResult");
        prctl_runCommandInShellBlocking(acStack_90);
        DAT_004c4560 = 1;
      }
    }
  }
  return;
}

Antes de proseguir, hay que analizar la pantalla de diagnóstico en la interfáz avanzada, procedamos.

Con el dev tools abierto (F12) hacemos un traceroute a 1.1.1.1 como en la foto.

1733272905099.png


En la pestaña networks veremos lo siguiente al cabo de un rato.

1733272842088.png


Para el endpoint disagnostic-general.cgi veremos 3 parámetros que viajan vía HTTP POST. El sessionKey es recalculado en cada petición. diagTestType es el tipo de operación a realizar (1: ping; 2: traceroute; 3: nslookup). diagAddr es el input que nos interesa.

1733272980720.png


Para construir una herramienta que permita automatizar todo, se necesita de sessionKey, por lo que si miran el response de disagnostic-general.cgi, verán que sessionKey es reescrito siempre.

1733273157576.png


Ahora podemos volver a lo interesante.

C:
      pcVar1 = strpbrk(param_1,"\"<>%\\^[]`+$=\'#&\t(){}|/;-_~!@*?,");
      if (pcVar1 == (char *)0x0) {
        if (param_2 == 2) {
          pcVar1 = "traceroute -o %s >%s&";
        }
        else if (param_2 == 3) {
          pcVar1 = "nslookup -h %s >%s&";
        }
        else {
          if (param_2 != 1) {
            log_log(7,"cgiSetDiagnostic",0x7c3,"not start to diag (type=%d)",param_2,iVar2);
            return;
          }
          pcVar1 = "ping %s  >%s&";
        }
        snprintf(acStack_90,0x80,pcVar1,param_1,"/var/diagResult");
        prctl_runCommandInShellBlocking(acStack_90);
        DAT_004c4560 = 1;
      }

Código:
\"<>%\\^[]`+$=\'#&\t(){}|/;-_~!@*?,
Si se fijan en el código, todo lo de arriba es lo que no puede ir en el parámetro diagAddr, de lo contrario el if principal de mas arriba no se ejecutará (a grandes rasgos).

Los siguientes son los templates de ejecución, en el primer %s es en donde se insertaría diagAddr. En el segundo %s iría "/var/diagResult" (donde se guardaría el resultado de la ejecución).

traceroute
Código:
traceroute -o %s >%s&
nslookup
Código:
nslookup -h %s >%s&
ping
Código:
ping %s  >%s&

Lo que nos lleva a

1733273589571.png


pingTestResult.html siempre nos va a devolver el contenido de /var/diagResult.

Si pudieramos convertir el código en

C:
      pcVar1 = strpbrk(param_1,"\"<>%\\^[]`+$=\'#&\t(){}|/;-_~!@*?,");
      // siempre en True
      if (1) { // se ejecuta siempre
        if (param_2 == 2) { // Punto de ingreso
          pcVar1 = "traceroute -o %s >%s&";
        }
        else if (param_2 == 3) {
          pcVar1 = "nslookup -h %s >%s&";
        }
        else {
          if (param_2 != 1) {
            log_log(7,"cgiSetDiagnostic",0x7c3,"not start to diag (type=%d)",param_2,iVar2);
            return;
          }
          pcVar1 = "ping %s  >%s&";
        }
        snprintf(acStack_90,0x80,pcVar1,param_1,"/var/diagResult");
        prctl_runCommandInShellBlocking(acStack_90);
        DAT_004c4560 = 1;
      }

Por lo que nuestro traceroute se convertiría en

Código:
traceroute -o 0\\\;echo$IFS"test!" >/var/diagResult&

Tendríamos una forma de ejecución remota de comandos en el router. Para que eso suceda hay que trabajar en ghidra.

1733273867087.png


La instrucción bne debe ser reemplazada por un j a la dirección 00419508, de forma que siempre se ingrese a "// Punto de ingreso" (mirar el código de mas arriba).

Código:
j 00419508

El bloque que deberíamos conseguir ejecutar es el siguiente:

1733274109010.png


Hasta aquí por ahora.

Para leer mas sobre la arquitectura mips acá, y acá.
 
Upvote 0

cliobrando

Capo
Se incorporó
6 Mayo 2021
Mensajes
220
Ah, que si tienes la posibilidad de rempaquetar el firmware y que el equipo siga funcionando, en vez de restaurar un explotit, sería mas practico meter tus propios binarios, crear usuarios, etc.
En mi experiencia personal, haria este trabajo de restaurar el exploit de una app en especifico solo si estuviese seguro que al actualizar el firmware ese archivo no se toca, o si es que lo que estoy modificando esta en una particion que normalmente no se actualiza con updates de firmware.
 
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
455
Ah, que si tienes la posibilidad de rempaquetar el firmware y que el equipo siga funcionando, en vez de restaurar un explotit, sería mas practico meter tus propios binarios, crear usuarios, etc.
En mi experiencia personal, haria este trabajo de restaurar el exploit de una app en especifico solo si estuviese seguro que al actualizar el firmware ese archivo no se toca, o si es que lo que estoy modificando esta en una particion que normalmente no se actualiza con updates de firmware.
Lo pensé, pero dado que aun estoy aprendiendo y explorando, cuando nisiquiera puedo reempaquetar, no tiene mucho caso pensarmelo. Me interesa mas en avanzar el reverse, luego de testearlo y automatizar el reempaquetado, iría por un reverse al proceso de actualización remota del firmware. Una vez con el monopolio, ya veré que hacer. Después de todo, el mitrastar es un pc de 900mhz con 128mb de ram y 128mb de nand (por lo que ví). Por donde se mire, tenerlos acumulando polvo es un desperdicio. Peor aún cuando son equipos que te dejan "gratis".

A parte, en el reverse están las lukas.
 
Upvote 0

cliobrando

Capo
Se incorporó
6 Mayo 2021
Mensajes
220
Es entretenido como desafio, pero siento que cada vez tengo menos tiempo para estas cosas, especialmente si una tarea puede tomar horas.
 
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
455
Un poco de info sobre la consola que se ejecuta por ssh.
Acá hay un listado que da algo de info sobre los binarios que se encuentran en squashfs-root/bin
Éstos propiamente
Código:
acs_cli            dry             mcp                      psictl              tr69c
acsd               eapd            mcpctl                   pwd                 transceiver
addr2name          ebtables        mcpd                     pwr                 true
ash                echo            mkdir                    pwrctl              ubiattach
base64             ethctl          mknod                    qcomm_cli           ubicrc32
bash               ethswctl        mm.exe                   qharvestd.sh        ubidetach
bcm_boot_launcher  false           mount                    qsl_cli             ubiformat
bdmf_shell         fc              mstc_watchdogd           radvd               ubimkvol
bpm                fcctl           mtd_debug                rastatus6           ubinfo
bpmctl             flashcp         mtdinfo                  rawSocketTest       ubirename
brctl              flash_erase     name2addr                ripd                ubirmvol
bs                 flash_otp_dump  nanddump                 rm                  ubirsvol
bsa_peer_brcm      flash_otp_info  nandtest                 rpecat              ubiupdatevol
bsd                ftl_format      nandwrite                rpecat_cli          udhcpd
busybox            gponctl         nas                      scp                 umount
cat                gpond           nas4not                  sed                 upnp
chmod              gponif          ndisc6                   send_cms_msg        urlfilterd
consoled           grep            nvram                    sftp                vlanctl
cp                 gunzip          nvramUpdate              sftp-server         voiceApp
cpuload            hotplug         omcid                    sh                  wget
csmd               hspotap         omcipmd                  sleep               wl
csmd_cli           httpd           omcipmdrvctl             smd                 wlancmd
curl               hz_service      opahdmcli                snmpd               wlctl
date               icf.cfg         opahdmscript             sntp                wlevt
ddnsd              icf.exe         opahGenID                ssh                 wlmngr
df                 iothub_agent    opahwatchdog             sshd                wl_server
dhcp6c             ip              openssl                  ssk                 wl_server_socket
dhcp6s             ip6tables       pidof                    sskwatchdog         wps_monitor
dhcpc              iptables        ping                     stty                wput
dhcpd              ivrsys.bin      ping6                    sync                xtables-multi
dmesg              kill            pppd                     tc                  zebra
dnsproxy           ledmonitor      priority_expirationtime  tefapp              zycfgfilter
dnsreputation      lld2d           priority_rule            tr143DownloadDiag
dnsspoof           ln              prov_dev_client_sample   tr143EchoCfgServer
doc_loadbios       ls              ps                       tr143UploadDiag

Respecto a la emulación, para quien se aventure:

Código:
CPU: Broadcom BCM68380
Flash: 128MB
RAM: 256MB
IC Flash: Macronix MX30LF1G18AC-TI 
Kernel: 3.4.11-rt19

Visual interna del equipo acá.
Datasheet de la flash acá.

Según la data leída de los binarios
Código:
// readelf -a [BINARIO]
Arquitectura: MIPS 32 V1
Endianess: Big Endian
Chipset: R3000

Info del R3000 acá.

Para "intentar" emular.

Bash:
qemu-mips -L squashfs-root/ squashfs-root/bin/cp -h

Tambien se pueden esperar vulnerabilidades en las librerías si se tiene en cuenta de que el kernel 3.4.11 es de por ahí por el año 2012. Para conocer que librerías compartidas usa un binario sería por ejemplo:

Bash:
readelf -d squashfs-root/bin/sshd

Dynamic section at offset 0x160 contains 51 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libcms_cli.so]
 0x00000001 (NEEDED)                     Shared library: [libcms_dal.so]
 0x00000001 (NEEDED)                     Shared library: [libcms_msg.so]
 0x00000001 (NEEDED)                     Shared library: [libcms_core.so]
 0x00000001 (NEEDED)                     Shared library: [libcms_qdm.so]
 0x00000001 (NEEDED)                     Shared library: [libnanoxml.so]
 0x00000001 (NEEDED)                     Shared library: [libdl.so.0]
 0x00000001 (NEEDED)                     Shared library: [libgponctl.so]
 0x00000001 (NEEDED)                     Shared library: [libgponif.so]
 0x00000001 (NEEDED)                     Shared library: [libomci.so]
 0x00000001 (NEEDED)                     Shared library: [libomcipm_drv.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so.0]
 0x00000001 (NEEDED)                     Shared library: [libvlanctl.so]
 0x00000001 (NEEDED)                     Shared library: [libpwrctl.so]
 0x00000001 (NEEDED)                     Shared library: [libethswctl.so]
 0x00000001 (NEEDED)                     Shared library: [libqsteer_comm_ext.so]
 0x00000001 (NEEDED)                     Shared library: [libsha2_hash.so]
 0x00000001 (NEEDED)                     Shared library: [librdpactl.so]
 0x00000001 (NEEDED)                     Shared library: [libcms_util.so]
 0x00000001 (NEEDED)                     Shared library: [libcms_boardctl.so]
 0x00000001 (NEEDED)                     Shared library: [libcrypt.so.0]
 0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
 0x00000001 (NEEDED)                     Shared library: [libwlmngr.so]
 0x00000001 (NEEDED)                     Shared library: [libnvram.so]
 0x00000001 (NEEDED)                     Shared library: [libwlctl.so]
 0x00000001 (NEEDED)                     Shared library: [libwlcsm.so]
 0x00000001 (NEEDED)                     Shared library: [libqcsapi_client.so.1]
 0x00000001 (NEEDED)                     Shared library: [librmt_qcsmngr.so]
 0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
 0x00000001 (NEEDED)                     Shared library: [libc.so.0]
 0x0000000c (INIT)                       0x405970
 0x0000000d (FINI)                       0x439310
 0x00000004 (HASH)                       0x400320
 0x00000005 (STRTAB)                     0x403784
 0x00000006 (SYMTAB)                     0x401424
 0x0000000a (STRSZ)                      7519 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x70000016 (MIPS_RLD_MAP)               0x452d40
 0x00000015 (DEBUG)                      0x0
 0x00000003 (PLTGOT)                     0x452d50
 0x70000001 (MIPS_RLD_VERSION)           1
 0x70000005 (MIPS_FLAGS)                 NOTPOT
 0x70000006 (MIPS_BASE_ADDRESS)          0x400000
 0x7000000a (MIPS_LOCAL_GOTNO)           405
 0x70000011 (MIPS_SYMTABNO)              566
 0x70000012 (MIPS_UNREFEXTNO)            38
 0x70000013 (MIPS_GOTSYM)                0x199
 0x6ffffffe (VERNEED)                    0x405950
 0x6fffffff (VERNEEDNUM)                 1
 0x6ffffff0 (VERSYM)                     0x4054e4
 0x00000000 (NULL)                       0x0

Luego bastaría con revisar si en la librería hay información de versión (que lo dudo) (tambien se puede determinar por el nombre creo) con:

Bash:
// con V en mayúscula
readelf -V [ARCHIVO]

Respecto del reverse que pienso realizar

A parte de la modificación anteriormente dicha, creo que sería mas fácil cargar todo directamente en algún modo, por ej con trace route.
C:
if (param_2 == 2) { // Punto de ingreso
    // Pasar de esto
    pcVar1 = "traceroute -o %s >%s&";
   // a esto
    pcVar1 = "              %s >%s&";
}

Y manejar todo desde el front enviándo el comando completo con diagTestType siempre en 2.
 
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
455
Para el Askey-RTF8115VW. Creo que son puertos seriales. Van con 3.3V. No se si arriesgarme a soldar pines para los cables jumber dupont hembra porque tengo que devolver el equipo al domicilio respectivo. (La foto es referencial, pero el edit es mío).

Para quien se aventure con un conversor USB-TTL, tendrá que averiguar TX y RX por si mismo. Y si el aventurero/a quisiera proveer feedback, edito la foto con la info nueva.

Me da curiosidad saber que será el cuadrado plomo que está encima del chasis blindado. Tiene una textura parecida a la piedra de afilar de la cocina. Supongo que será un dicipador, pero nunca había visto uno asi.

 
Upvote 0

cliobrando

Capo
Se incorporó
6 Mayo 2021
Mensajes
220
Para el Askey-RTF8115VW. Creo que son puertos seriales. Van con 3.3V. No se si arriesgarme a soldar pines para los cables jumber dupont hembra porque tengo que devolver el equipo al domicilio respectivo. (La foto es referencial, pero el edit es mío).

Para quien se aventure con un conversor USB-TTL, tendrá que averiguar TX y RX por si mismo. Y si el aventurero/a quisiera proveer feedback, edito la foto con la info nueva.

Me da curiosidad saber que será el cuadrado plomo que está encima del chasis blindado. Tiene una textura parecida a la piedra de afilar de la cocina. Supongo que será un dicipador, pero nunca había visto uno asi.
1733519793495.png

Ese es el serial, hace poco me conecte para revisar los datos y poner un equipo externo
Código:
BGA IC
Xtal:1
DDR3 init.
DRAMC init done.
Calculate size.
DRAM size=256MB
Set new TRFC.
ddr-1066




7512DRAMC V1.1.2 (0)


Set SPI Flash Clock to 25 Mhz
############################################################
[Family: RTF81XX, Model: RTF8115VW, Version: 12]
############################################################
[ASP] Q: main.c:3628, asp_hw_model_name = RTF8115VW, asp_hw_version = 1




EN751221 at Thu Oct 6 20:43:51 CST 2022 version 1.1 free bootbase


Memory size 256MB


Set SPI Flash Clock to 25 Mhz
spi_nand_probe: mfr_id=0xef, dev_id=0xaa
Dected SPI NAND Flash : _SPI_NAND_DEVICE_ID_W25N01G, Flash Size=0x8000000
bmt pool size: 81
BMT & BBT Init Success


[[[Press any key to enter boot command mode]]]
 
Upvote 0

arrobazoCL

Miembro Activo
Se incorporó
31 Diciembre 2023
Mensajes
20
debajo del blindaje esta el cpu EcoNet EN751221 (uart superior) y el otro disipador mas pequeño maneja el wifi 5g cpu Quantenna (uart inferiror) imagino podrias tener shell si editas las variables `bootargs` (sin guardar obviamente). tengo ese gpon guardado por ahi pero es el que me instalo movistar obviamente nunca lo use xD me recuerdo que hice dump del nand spi 128mb y la spi que esta debajo del pcb que es para el cpu quantenna
 
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
455
Me pude conectar al puerto de serie finalmente. @cliobrando gracias por confirmar el puerto, me ahorré soldar extra.
Aunque sin el conversor usb ttl tuve que usar un ESP32, propiamente un ESP-WROOM-32. Así que mientras compro y llega el aparatito dejo documentado el proceso.

Askey-RTF8115VW - Puerto de serie.

Respecto al ESP32

La que tengo es la siguiente (esp-wroom-32):


Pinout

Para quienes desconozcan del tema y se quieran aventurar, porque a parte de usarlo cono conversor ttl, tiene muchos otros usos.

Conexión PC <-> ESP32 <-> Router

Ésto es importante de explicar, porque es mas o menos confuso si uno no tiene mucha idea con estos aparatitos.
Hay 2 conexiones seriales en el ESP32, una que usa de cara al pc, y otra de cara a algún circuito o aparato (en este caso el router).

Si es la primera vez que se aventuran con dicha placa, dejo unos links para leer.

(Hay que bajar la última versión del IDE de arduino)
Installing the ESP32 Board in Arduino IDE (Windows, Mac OS X, Linux)
Programar ESP32 con Arduino IDE

Abajo el código para conectarse. Si se fijan en la foto del pinout de la placa, el GPIO 16 y 17 tambien funciona para RX y TX respectivamente. Y la conexión al router se realiza cruzada.

Código:
ESP32 | Router
GND     GND
TX2     RX
RX2     TX

Si conectan los pines al revés, el router no va a encender y la luz azul del esp32 se va a prender a toda potencia. Cuando la conexión esté correcta la luz azul será tenue y el router prenderá normalmente. La luz roja quedará encendida desde le momento en que el cable usb se conecta al esp, en cambio, la azul solo encenderá cuando se presione el botón de encendido del router.

C:
#include <Arduino.h>
#define UART_RX_PIN 16 // GPIO16 (RX2)
#define UART_TX_PIN 17 // GPIO17 (TR2)
#define BAUD_RATE_EXTERNAL 115200 // Velocidad a la que se comunica la placa con el router (dejenla así para el Askey-RTF8115VW)
#define PC_BAUD_RATE 115200 // Velocidad a la que se comunica el placa con el computador (putty <-> placa)
void setup() {
  // Serial connects to the computer
  Serial.begin(PC_BAUD_RATE);
  // Serial2 is the hardware UART port that connects to external circuitry
  Serial2.begin(BAUD_RATE_EXTERNAL, SERIAL_8N1,
                UART_RX_PIN,
                UART_TX_PIN);
}
void loop() {
  // Copy byte incoming via PC serial
  while (Serial.available() > 0) {
    Serial2.write(Serial.read());
  }
  // Copy bytes incoming via UART serial
  while (Serial2.available() > 0) {
    Serial.write(Serial2.read());
  }
}
Fuente

Para leer mas sobre la comunicación serial acá y para el 8N1 acá.

Acá la configuración para conectarse con putty.


La idea es guardar el log con toda la conexión para un posterior análisis.

Ahora así a conectarse:
  • ESP32 desconectado del usb
  • Router apagado (puede estar enchufado)
Pasos:

1. Realizar la conexión entre el esp32 y el router
2. Conectar el esp32 al cable usb
3. Conectarse con Putty al esp32
4. Presionar el botón EN

En la consola va a salir el mensaje de boot (creo), servirá para confirmar que todo esté correctamente conectado entre el esp y el pc.

5. Encender el router y dejarlo bootear hasta que inicie la wifi. La data empezará a llegar desde el momento en que se presiona el botón de encendido del equipo. Si el programa lo cargaron tal cual, y los pines fueron conectados correctamente no debería haber problema.

 

Archivo adjunto

  • 1733665191108.jpeg
    1733665191108.jpeg
    29,7 KB · Visitas: 23
  • 1733664874967.png
    1733664874967.png
    8,3 KB · Visitas: 18
  • 1733664855837.png
    1733664855837.png
    28,4 KB · Visitas: 20
  • 1733664848453.png
    1733664848453.png
    28,4 KB · Visitas: 19
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
455
Tal cual, entras con root con la misma clave del reverso con la que se ingresa al panel avanzado.

Adjunto el log para el Askey-RTF8115VW en la conexión serial. (Ideal verlo en una fuente de 14 en adelante, mejora mucho la fatiga visual).

Para los que estamos acostumbrados a ll, porque no viene configurado en el router
Bash:
alias ll="ls -laA"
 

Archivo adjunto

  • RTF8115VW-v12.txt
    163,6 KB · Visitas: 13
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
455
Encontré una forma de hacer un dump del firmware desde el bootloader del RTF8115VW que es bastante arcaica.

Una vez encendido el equipo, llegados a éste punto ingresamos al bcm (boot command mode) presionando una tecla como enter:
Código:
Set SPI Flash Clock to 25 Mhz
spi_nand_probe: mfr_id=0xc2, dev_id=0x12
Dected SPI NAND Flash : _SPI_NAND_DEVICE_ID_MXIC35LF1G, Flash Size=0x8000000
bmt pool size: 82
BMT & BBT Init Success

[[[Press any key to enter boot command mode]]]

Dentro del bcm lo siguiente
Código:
bldr>

Para el menu de ayuda enviamos un ?
Código:
?                                   Print out help messages.               
help                                Print out help messages.               
asp_boot                            asp boot                               
asp_show                            asp show util                          
asp_gpio                            asp gpio util                          
asp_update                          asp update util                        
asp_flash                           asp flash util                         
printenv                            print bootenv                          
setenv                              set bootenv                            
saveenv                             save bootenv                           
go                                  Booting the linux kernel.              
decomp                              Decompress kernel image to ram.        
memrl <addr>                        Reddr> <len>                   Dump memory content.                   
jump <addr>                         Jump to addr.                          
flash <dst> <src> <len> <oob>       Write to flash from src to dst(oob: write nand oob if 1).
imginfo                             Show images info.                      
bdstore <flash dst> <bin src>       tch[1|0]                       Enable or disable backdoor function    
ddrcalswitch[1|0]                   Enable or disable ddr calibration funciton
drambistswitch[0|1|2]               disable or enable, and quick or normal test
xmhy reg.                 
miiw <phyaddr> <reg> <value>        Write ethernet phy reg.                
cpufreq <freq num> / <m> <n>        Set CPU Freq <156~450>(freq has to be multiple of 6)
ipaddr <ip addr>                    Change modem's IP.                     
httpd                               Start Web Server                       
ddrdrv <..>                         Change DDR driving length              
mtd

Es posible usar el comando "asp_flash read" de la siguiente forma:
Código:
asp_flash read 0x0
addr = 0 (0x00000000), size = 128
addr = 0 (0x00000000), size = 128, ret = 0
-------------------------------------
00000000 00000000 00000000 00000000    ................
00000000 00000000 00000000 00000000    ................
00000000 00000000 00000000 00000000    ................
00000000 00000000 00000000 00000000    ................
00000000 00000000 00000000 00000000    ................
00000000 00000000 00000000 00000000    ................
00000000 00000000 00000000 00000000    ................
00000000 00000000 00000000 00000000    ................
-------------------------------------

Para el ejemplo deje todo en 0, pero vienen datos. Cada fila tiene 16 bytes y el bloque es de 8 filas. 128 leídos en total. Las primeras 4 representan a la 5ta columna en hexadecimal (similar a un editor hexadecimal). Lógicamente, de la columna 5 no se puede obtener nada, pero de las primeras columnas si que es posible. Por lo que el proceso es automatizable tan solo leyendo los bytes desde el hexadecimal programáticamente.

El tamaño de la memoria como bien muestra el log es de 0x8000000 o 134217728 bytes (128 MB).
Cuando asp_flash read lee en overflow, por ejemplo leyendo por encima del tamaño (0x8000080 (134217728 + 128)), según mis pruebas, vuelve a leer desde el inicio (a menos que el tamaño esté mal), como sea, es demostrable leyendo 2 veces desde 0x0 y 0x8000000 hasta hacer el largo original para después realizar una coomparación (automatizadamente).

En el log igual viene el mapeo de la memoria, el que se puede obtener con el comando mtd:
Código:
0x00000000-0x00040000 : "bootloader"
0x00040000-0x00080000 : "romfile"
0x00080000-0x001d2d2f : "kernel"
0x001d2d2f-0x01a22d2f : "rootfs"
0x00080000-0x02d80000 : "tclinux"
0x02d80000-0x02ed2d2b : "kernel_slave"
0x02ed2d2b-0x04752d2b : "rootfs_slave"
0x02d80000-0x05a80000 : "tclinux_slave"
0x05a80000-0x05ac0000 : "bootenv0"
0x05ac0000-0x05b00000 : "bootenv1"
0x05b00000-0x05e00000 : "defcfg"
0x05e00000-0x06100000 : "bakcfg"
0x06100000-0x06400000 : "config"
0x06400000-0x06600000 : "status"
0x06600000-0x07f80000 : "unused"
0x07f80000-0x08000000 : "reservearea"

Tambien hay un comando llamado flash, pero de momento no tengo idea de como usarlo.
Código:
flash <dst> <src> <len> <oob>       Write to flash from src to dst(oob: write nand oob if 1)

El comando printenv muestra la información (que pudiéramos llamar) básica del equipo. Coincide perfectamente con la pegatina trasera después de hacer el reset.
Código:
bldr> printenv
...
wifiSSID=[NOMBRE WIFI 2.4G]
wifiWPAKey=[CLAVE WIFI 2.4G]
wifi5gSSID=[NOMBRE WIFI 5G]
wifi5gWPAKey=[CLAVE WIFI 5G]
routerPassword=[CLAVE USUARIO SUPPORT]
...

Otra cosa que me llamó la atención, dentro del log aparecen los 2 firmwares, el que venía y el nuevo que se instaló con la actualización
Código:
[BRD] I: 0, 0.000, asp_img_version_0 = g13.12_RTF_TEF001_V8.21
[BRD] I: 0, 0.000, asp_img_version_1 = g14.9_RTF_TEF001_V9.9

Por último, para quienes no quieran usar putty. Se puede usar picocom o screen (aunque a veces no funciona bien y la curva es mas alta).

Bash:
picocom --logfile rtf1585vw-uart.log --omap delbs -b 115200 /dev/ttyUSB0
--omap delbs hace que la tecla de borrado del teclado (retroceso o backspace) reemplace los caracteres por espacios vacíos, para mas info.
Código:
picocom --help

Esto ya equiere práctica y algún tutorial.
Bash:
screen /dev/ttyUSB0 115200,crtscts
 
Última modificación:
Upvote 0

cliobrando

Capo
Se incorporó
6 Mayo 2021
Mensajes
220
Lo de los 2 firmwares es para hacer rollback, si haces ssh al router puedes volver al firmware anterior con los comandos que da la consola.
 
Upvote 0

arrobazoCL

Miembro Activo
Se incorporó
31 Diciembre 2023
Mensajes
20
deje un Brick en mi modem xD
actualice via Bootloader http-server no obtuve ningun error en el log xD

Screenshot 2024-12-10 at 15-47-18 TC Rescue Page — Navegación privada de Mozilla Firefox.png


*Mod tclinux.bin

Código:
bldr> httpd
PBUF_POOL_BUFSIZE = 256
tcp_bind()
Local Port = 0
tcp_bind: bind to port 80
bldr> START TO RECEIVE the FILE
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.....................................................................
START TO CLOSE the FILE
Received file:
rcvdata_size = 27016664
start = 0x800202EA
Real crc code: 978B73C9
Check data success, prepare to upload
...
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
...........................................................
Firmware is uploaded successfully!


dump original tclinux-slave.bin upload xD tampoco se recupero el modem :p


Código:
bldr> httpd
PBUF_POOL_BUFSIZE = 256
tcp_bind()
Local Port = 0
tcp_bind: bind to port 80
bldr> START TO RECEIVE the FILE
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.........................................................................................................
START TO CLOSE the FILE
Received file:
rcvdata_size = 26814282
start = 0x800202E8
Real crc code: AC334B78
Check data success, prepare to upload
...
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
..............................................................................
Firmware is uploaded successfully!

una vez booteo "ASP_BOOT" con la imagen tclinux backup original que respalde me qedo un lindo brick nuevamente xDDDDD aca log


Código:
asp_boot
[ASP] Q: main.c:4837, asp_img_commit = 1
[ASP] Q: main.c:4907, asp_img_active = 1
[ASP] Q: boot_kernel():819, boot_img = 1
Decompress to 80020000 free_mem_ptr=80600000 free_mem_ptr_end=80780000
trx_header_len: 100 kernel_size: 160000
from slave
Uncompressing [LZMA] ...  done.
Undefined Exception happen.CP0_STATUS=10000003
CP0_CAUSE=40000008
CP0_EPC=81fc0e50
CP0_BADVADDR=0

Undefined Exception happen.CP0_STATUS=10000003
CP0_CAUSE=40000008
CP0_EPC=81fc0e50
CP0_BADVADDR=98

 lo=4350305f hi=43415553
 cp0_epc=453d2578 cp0_badvaddr=a000000
 cp0_status=4350305f cp0_cause=4550433d
pad0

 0x206c6f3d 0x25782068 0x693d2578 0xa000000
 0x20637030 0x5f657063
regs

 3d257820 6370305f 62616476 61646472
 3d25780a 0 20637030 5f737461
 7475733d 25782063 70305f63 61757365
 3d25780a 0 70616430 a000000
 20307825 78000000 a726567 730a0000
 20257800 556e6465 66696e65 64204578
 63657074 696f6e20 68617070 656e2e00
 4350305f 53544154 55533d25 780a0000


intentare mas tarde volver hacer repack nuevamente. Verifique el crc checksum y todo esta ok xD creo que algo me esta pasando por alto, a sacar la SPI-NAND para escribir el bakcup y recuperar el modem
photo_2024-12-10_16-00-17.jpg
 
Última modificación:
Upvote 0

cliobrando

Capo
Se incorporó
6 Mayo 2021
Mensajes
220
Me imagino que el updater no esta esperando un dump como entrada, sino una imagen de firmware, o un dump sin bootloader. O algo con magia.
 
Upvote 0

arrobazoCL

Miembro Activo
Se incorporó
31 Diciembre 2023
Mensajes
20
Me imagino que el updater no esta esperando un dump como entrada, sino una imagen de firmware, o un dump sin bootloader. O algo con magia.
verifica checksum, si vez la imagen tclinux (header+kernel+squashfs) en la particion mtd4 y 7(slave)
el header 0x100 muestra la informacion direccion y tamaño del kernel. squashfs, crc32 checksum y otras cosillas como version fw model bla bla
la funcion para actualizar el fw via httpd solo verifica que el crc sea correcto y no suba un fw corrupto me imagino xD

Ya recupere el modem xD
 
Upvote 0
Subir