Desbloquear un B2368 a través de una vulnerabilidad en el menú "Actualización en línea"

capgadsx

Miembro Activo
Se incorporó
16 Julio 2020
Mensajes
10
ACTUALIZACIÓN

En base a los comentarios y a algunas ideas, decidí levantar una API en AWS que realiza los pasos necesarios para engañar al router e instalar una actualización.

El código fuente de la API se encuentra en https://github.com/capgadsx/B2368Update y esta bajo la licencia GPL-3.0, lo que implica que no me hago responsable por ningún tipo de daño que esta herramienta pueda generar.

Para utilizarla solo deben reemplazar la URL de la sección Actualización en línea por la siguiente https://yq69gem3og.execute-api.us-east-1.amazonaws.com/api/cpe_and_common/v2/Check.action como se ve en la captura.


editar.png


Después solo deben presionar Verificar ahora y el router debería comenzar el proceso de actualización.

Una vez finalizado, recuerden que deben actualizar el firmware del MODEM siguiente los pasos en el post de @alambredeescoba

POST ORIGINAL

Introducción.

Primero que nada, un poco de historia, soy estudiante y contrate el servicio del Entel con el B2368 gracias a este foro y a la idea de poder desbloquearlo al obtenerlo. Sin embargo, y a como muchos les paso, este ya venia bloqueado cuando lo recibí. Cuento corto, después de dos semanas logre desbloquear el router e instalar el nuevo firmware que permite cambiar las bandas LTE, esto fue como hace tres meses y cómo funcionaba deje de revisar este foro.

Hoy al volver a leer las casi 30 páginas de comentarios del hilo anterior me di cuenta de que probablemente alguien más ya descubrió el método y esta cobrando por hacerlo, lo que me molestó, especialmente por que se atreven a cagarse a la gente con hasta 40k. Así que vengo a cagarles el negocio.

Para este método necesitaremos un par de cosas algo complejas de entender si no se tiene algún grado de conocimiento básico sobre servidores web, DNS y programación Python. Pero bue, peor es nada y quizás alguien tome esto y se le ocurra algo más simple.

Necesitamos:
  • El interprete de Python3 junto con la librería Flask
  • El archivo B2368_V100R001C00SPC085T.bin
  • Un dominio que apunte a una dirección local de la red.
  • Saber utilizar la herramienta “Inspeccionar elemento” de Chrome.
Método

Revisando el archivo del firmware con algunas herramientas de ingeniería inversa especificas para firmwares solo logre descubrir que el backend del router esta bastante bien protegido a este tipo de ataques, pero el frontend es otra historia.

Resulta que el mandril que diseño el frontend del router no realiza validaciones a la hora de enviar el formulario de la sección “Actualización en línea” por lo que podemos iniciar el proceso de actualización desde esta sección utilizando un servidor web propio. Para esto, podemos hacer click derecho en el ‘text box’ de la URL del servidor, activar la herramienta ‘Inspeccionar elemento’ (Efectivamente, Inspeccionar elemento, así de mal hecha es está wea) y quitar el atributo ‘disabled’ o simplemente cambiando el texto del atributo ‘value’ por un dominio que nosotros controlemos.

Lo que coloquemos en el campo DEBE SER UN DOMINIO, ya que, si bien el frontend no realiza ninguna validación, si lo hace el backend (a través de expresiones regulares) por lo que no podemos utilizar directamente una dirección IP local.

En mi caso utilicé el servicio gratuito y de pana https://www.duckdns.org/ el cual nos permite configurar un subdominio a cualquier dirección, como, por ejemplo:

dns.PNG


En mi red, 192.168.1.50 corresponde a una raspberry.

Con esto, yo ingrese ‘http://fwup.duckdns.org/cpe_and_common/v2/Check.action?latest=true’ en el atributo ‘value’ del ‘text-box’, por lo que ahora, debemos engañar tanto al frontend como al backend que somos un servidor de actualizaciones genuino.

Sin animo de entrar en detalle sobre el proceso de actualización, podemos resumirlo a través de tres peticiones HTTP al servidor de actualizaciones.
  • POST /cpe_and_common/v2/Check.action
El router consulta si existe alguna actualización disponible y espera un resultado JSON con el campo {‘status’: 0} (status=1 significa que no hay actualización)
  • GET /FW/full/filelist.xml
El router solicita la lista de archivos disponibles para la actualización y espera una respuesta XML con información sobre los archivos necesarios para realizar la actualización.
  • GET /FW/full/B2368_V100R001C00SPC085T.bin
El router descarga el archivo de actualización indicado en ‘filelist.xml’, para luego intentar instalarlo.

Para lograr engañar al router, utilizaremos un servidor web simple escrito en Python con la librería Flask, el cual esta adjunto como ‘fwupapi.py’ y escuchara en la dirección a la que apunta el registro DNS en el puerto 80.

Debemos dejar el archivo B2368_V100R001C00SPC085T.bin en la misma carpeta del script y ejecutar el script para iniciar el servidor.

Luego presionamos el botón ‘Verificar ahora’ en el frontend y si todo está correcto debería preguntar si desea o no instalar la actualización.

Una vez terminado el proceso deberían poder acceder al menú ‘Actualizacion local’ e instalar el otro archivo ‘B2368-Modem_V100R001C00SPC085T.bin’ del thread anterior.

Con esto el router ya debería estar desbloqueado. No tengo fotos del proceso, ya que actualmente el único router que tengo se encuentra desbloqueado.

Si bien el método es complejo, demuestra que es posible realizar la actualización incluso si ya se encontraba bloqueada la opción ‘Actualización local’.

Saludos.
 

Archivo adjunto

  • fwupapi.py.txt
    2,9 KB · Visitas: 1.394
Última modificación:

laira90

Miembro Activo
Se incorporó
3 Junio 2020
Mensajes
15
Para quienes les cuesta mucho seguir la guía o simplemente no entienden nada, cree este servicio en AWS para que puedan utilizar, necesito que alguien lo pruebe y me indique si le funciona.


Usen esa URL al momento de cambiar el texto con la herramienta inspeccionar elemento
Tremendo aporte estimado! Te la jugaste, ya tenia mi modem desbloqueado pero con tu ayuda más personas tendrán la posibilidad de acceso a internet y esperemos que con esto dejen de inflar los precios de estos equipos.
 
Upvote 0

MELERIX

Fanático
Se incorporó
30 Diciembre 2013
Mensajes
1.486
Para quienes les cuesta mucho seguir la guía o simplemente no entienden nada, cree este servicio en AWS para que puedan utilizar, necesito que alguien lo pruebe y me indique si le funciona.


Usen esa URL al momento de cambiar el texto con la herramienta inspeccionar elemento

ok, funciona perfecto, pero tengo una duda, con eso basta y sobra ? o luego igual hay que instalar el otro firmware del modem tambien ya desde el menú del router ?
 
Upvote 0

Da3s

Da3sGamingLaptops (Ex Zhotta)
Se incorporó
27 Septiembre 2015
Mensajes
173
Hola, Logré instalar la actualización sin internet de modo local, intentaré explicar lo que hice de la mejor manera;

- Primero descargé la última versión de Python en desde su sitio (https://www.python.org/downloads/)

- Despúes instalé flask a través de cmd con esta serie de comandos:

cd C:/router/
(en realidad puede ser cualquier directorio a elección)

Luego utilizé el comando python

py -m venv env

Se crea una carpeta de nombre env dentro de ese directorio, luego:

env\scripts\activate (importante ocupar "\" en vez de "/")

Después instalamos flask:

pip install flask

Ahora ejecutar el .py que mandó OP con el comando:

flask run -h 192.168.1.60 -p 80

(192.168.1.60 es el número que me asignó el router, puede ser cualquiera)

Luego en inspeccionar elemento ocupé http://192.168.1.60/cpe_and_common/v2/Check.action?latest=true y me dio la opción de actualizar. Ojo que el .py y el archivo del firmware debe estar en la misma carpeta.

Adjunto va el .py que utilizé para el servidor, lo único que hice comparado con OP fue cambiar la línea 11

return jsonify({'name': 'B2368', 'version': 'B2368_V100R001C00SPC085T', 'url': 'http://192.168.1.60/FW', 'status': '0'})

Substituyendo 'url' por mi ip local.

Ojalá le ayude a alguien y cualquier duda feliz de ayudar.
No logro hacer la parte del flask. Hay que descargar algo mas? Me sale el siguiente mensaje
Si alguien me puede guiar. Tengo en la carpeta fw, app.py y fwupapi.py
7dfc58f2dc2f4ba209e709577847c903.jpg


Enviado desde mi BLA-L29 mediante Tapatalk
 
Upvote 0

Richard.rm

Miembro Activo
Se incorporó
31 Marzo 2020
Mensajes
23
No logro hacer la parte del flask. Hay que descargar algo mas? Me sale el siguiente mensaje
Si alguien me puede guiar. Tengo en la carpeta fw, app.py y fwupapi.py
7dfc58f2dc2f4ba209e709577847c903.jpg


Enviado desde mi BLA-L29 mediante Tapatalk
Yo lo instalé escribiendo el comando pip install -U Flask
 
Upvote 0

FelipeAAA

Miembro Activo
Se incorporó
17 Julio 2020
Mensajes
3
Yo lo instalé escribiendo el comando pip install -U Flask

Al tratar de realizar el paso de ejecutar el comando py, me arroja el siguiente error " coult not locate a flask application. you did not provide the flask_app environment variable a "wsgi.py or app.py module was not found is the current directory, quien puede saber cual es el problema
 
Upvote 0

Richard.rm

Miembro Activo
Se incorporó
31 Marzo 2020
Mensajes
23
Al tratar de realizar el paso de ejecutar el comando py, me arroja el siguiente error " coult not locate a flask application. you did not provide the flask_app environment variable a "wsgi.py or app.py module was not found is the current directory, quien puede saber cual es el problema
Según eso no tienes instalado flask, trata de reinstalarlo. Lo otro que hice en el script cambié la línea donde dice app.run() lo cambie por app.run(host='192.168.1.41',port=80) , le cambie la extensión al archivo eliminando el .txt y lo ejecuté con doble clic y listo. Si necesitas ayuda puedes hablarme
 
Upvote 0

Richard.rm

Miembro Activo
Se incorporó
31 Marzo 2020
Mensajes
23
Buena probaré con ese comando

Edit: me sale lo mismo

Enviado desde mi BLA-L29 mediante Tapatalk
Cuando instalaste python seleccionaste la opción agregar a PATH? Si no busca como agregarlo y si si lo agregaste mi ayuda hasta ahí llega 😕
 
Upvote 0

Da3s

Da3sGamingLaptops (Ex Zhotta)
Se incorporó
27 Septiembre 2015
Mensajes
173
Cuando instalaste python seleccionaste la opción agregar a PATH? Si no busca como agregarlo y si si lo agregaste mi ayuda hasta ahí llega
Si lo agregue jaja. Busque en google y vi que había que habilitar eso. Mañana lo haré con la página directo, solo que acá donde estoy ahora no conecta a la net. Ojalá hay si funque ya que sólo es cambiar la página donde busca

Enviado desde mi BLA-L29 mediante Tapatalk
 
Upvote 0

Richard.rm

Miembro Activo
Se incorporó
31 Marzo 2020
Mensajes
23
Si lo agregue jaja. Busque en google y vi que había que habilitar eso. Mañana lo haré con la página directo, solo que acá donde estoy ahora no conecta a la net. Ojalá hay si funque ya que sólo es cambiar la página donde busca

Enviado desde mi BLA-L29 mediante Tapatalk
Claro, si tu antena se conecta a Internet es mas fácil ese método. Yo lo hice del otro modo porque no tenia forma de conectarme sin el chip y tampoco habían hecho el servidor en ese momento
 
Upvote 0

hcfernandez88

Miembro Activo
Se incorporó
20 Mayo 2020
Mensajes
2
Hola, Logré instalar la actualización sin internet de modo local, intentaré explicar lo que hice de la mejor manera;

- Primero descargé la última versión de Python en desde su sitio (https://www.python.org/downloads/)

- Despúes instalé flask a través de cmd con esta serie de comandos:

cd C:/router/
(en realidad puede ser cualquier directorio a elección)

Luego utilizé el comando python

py -m venv env

Se crea una carpeta de nombre env dentro de ese directorio, luego:

env\scripts\activate (importante ocupar "\" en vez de "/")

Después instalamos flask:

pip install flask

Ahora ejecutar el .py que mandó OP con el comando:

flask run -h 192.168.1.60 -p 80

(192.168.1.60 es el número que me asignó el router, puede ser cualquiera)

Luego en inspeccionar elemento ocupé http://192.168.1.60/cpe_and_common/v2/Check.action?latest=true y me dio la opción de actualizar. Ojo que el .py y el archivo del firmware debe estar en la misma carpeta.

Adjunto va el .py que utilizé para el servidor, lo único que hice comparado con OP fue cambiar la línea 11

return jsonify({'name': 'B2368', 'version': 'B2368_V100R001C00SPC085T', 'url': 'http://192.168.1.60/FW', 'status': '0'})

Substituyendo 'url' por mi ip local.

Ojalá le ayude a alguien y cualquier duda feliz de ayudar.
Amigo seguí paso a paso, pero al momento de dar el comando " flask run -h 192.168.1.60 -p 80 " me da el siguiente mensaje:
"flask" no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.

me podrias orientar un poco mas? , agradezco tu ayuda.

Saludos.
 
Upvote 0

Mastercrack

Miembro Activo
Se incorporó
27 Septiembre 2019
Mensajes
15
Deben cambiar la extensión del archivo , lo están ejecutando como app.py.txt solo deben cambiar la extensión a app.py y listo ... Saludos
 
Upvote 0

FelipeAAA

Miembro Activo
Se incorporó
17 Julio 2020
Mensajes
3
Deben cambiar la extensión del archivo , lo están ejecutando como app.py.txt solo deben cambiar la extensión a app.py y listo ... Saludos
realice el cambio en la extensión y ahora me arroja el error " winerror 10049 la direccion solicitada no es válida en este contecto" que debo hacer pliss
 
Upvote 0

Mastercrack

Miembro Activo
Se incorporó
27 Septiembre 2019
Mensajes
15
realice el cambio en la extensión y ahora me arroja el error " winerror 10049 la direccion solicitada no es válida en este contecto" que debo hacer pliss

Háblame por interno y vemos , eso es un problema de configuración
 
Upvote 0

hipertenzo

Miembro Regular
Se incorporó
21 Julio 2020
Mensajes
61
aaahh muchas gracias! funco!
 

Archivo adjunto

  • Anotación 2020-07-20 234051.jpg
    Anotación 2020-07-20 234051.jpg
    40,7 KB · Visitas: 293
Upvote 0

TomaHawk45

Miembro Activo
Se incorporó
17 Julio 2020
Mensajes
4
No logro hacer la parte del flask. Hay que descargar algo mas? Me sale el siguiente mensaje
Si alguien me puede guiar. Tengo en la carpeta fw, app.py y fwupapi.py
7dfc58f2dc2f4ba209e709577847c903.jpg


Enviado desde mi BLA-L29 mediante Tapatalk

No te está detectando el flask. Prueba siguiendo las instrucciones de este vídeo


Si lo estás haciendo correctamente debería de detectarte el .py y funcionar al typear el comando flask run -h 192.168.1.60 -80.

Otra posible razón es que el router te asignó otra ip, en cual caso debes de irte a cmd, ipconfig y corregirla al momento de correr flask y también debes cambiarlo en el .py con el block de notas. Saludos.
 
Upvote 0

TomaHawk45

Miembro Activo
Se incorporó
17 Julio 2020
Mensajes
4
Amigo seguí paso a paso, pero al momento de dar el comando " flask run -h 192.168.1.60 -p 80 " me da el siguiente mensaje:
"flask" no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.

me podrias orientar un poco mas? , agradezco tu ayuda.

Saludos.

Hola, ejecutaste el env de flask poner el comando /env/scripts/activate en cmd?

Si tienes problemas al instalarlo puedes revisar el video que mandé en la respuesta anterior. Ojalá te sirva, Saludos.
 
Upvote 0
Subir