domingo, 11 de abril de 2021

Router Sercomm FG824CD IV

Como podéis ver sigo pegándome con el router. La verdad es que he estado a punto de tirar la toalla. Casi lo había hecho. Pero al encontrar más posibles soluciones, he querido ver qué podía hacer.

No me quiero olvidar del disclaimer:

  • Recuerda que es altamente probable que el router no sea de tu propiedad sino de tu operadora.
  • Cualquier cosa que hagas y de lo que le pueda suceder a tu router es de tu responsabilidad.
  • Acuérdate de hacer copias de seguridad, tanto del modo usuario (como te muestra la pantalla originalmente) como del admin (ya os conté en anteriores entregas cómo se encuentra).
  • Podrías quedarte sin conexión y tocarte resetear el router a estado de fábrica o tener que tirar de tus copias de seguridad.

Aunque me estuve pegando con otros flancos lo primero que voy a mostrar es algo que se sabía (más o menos): con el router reseteado, sin conectar el cable de la fibra, usuario admin... Acceder al menú del teléfono (submenú configuración básica)... En el momento en el que se conecte el cable de la fibra (con el trasto encendido) y refrescando, se pueden ver los datos de configuración del ATA integrado. Eso sí, el usuario y contraseña están codificados en base64 y totalmente cifrados. 


Sercomm FG824CD datos telefónicos
Sercomm FG824CD datos telefónicos

Uno de los problemas está en que si se quiere analizar cómo se cargan el usuario y la contraseña hay que hacerlo en el mismo momento en el que se conecta el latiguillo de la fibra. Y eso no será fácil porque en un instante determinado te fuerza el cierre de la sesión y ya se habrá perdido el acceso al usuario administrador. 

He vuelto a intentar ver si podía descifrar el usuario y contraseña que ponen por defecto ya que aparece codificado en base64. Pero ya he visto que a su vez están cifrados. 

Al final me decidí a mirar estos así porque estuve luchando con la configuración del TR-069, que creo que es la que más impedimentos pone (si no es la única). 

Nota: Estoy reescribiendo todo esto antes de continuar con la publicación. Han sido muchos bandazos, con idas y venidas. Pero he conseguido llegar a un punto en el cual a pesar de no haber acabado sí ha sido un gran avance que creo que merece la pena mover todo el texto para dejarlo más ordenado. 

La idea de todo esto es atacar contra la configuración TR-069. Una de las muchas aproximaciones con las que he intentado atacar este problema es configurando un servicio tr069 en una de las raspberries que tengo paradas. En este gitlab hay un script en python que permite configurarlo rápidamente. Está pensado para un ZTE pero alguna cosilla he llegado a verla funcionar en este. Por lo que he entendido lo que hace es volver a poner el usuario admin en el sistema. Además de recuperar la configuración del sistema. Como es capaz de devolver la estructura necesaria para añadir o modificar un usuario, si después lo modificamos para gestionar la configuración y poder acceder por ejemplo por ssh bienvenido sea. 

Una vez descargado sólo tendríamos que ejecutar estos dos comandos:

openssl req -x509 -nodes -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365

python3 acs-server.py --username admin --password pass --ssl

Yo ya había creado el certificado hace unas semanas. Por lo que...

acs-server.py por Jorge Senín
acs-server.py por Jorge Senín

En Youtube hay un vídeo donde se muestra cómo funcionaría en un router ZTE F680.

Vamos por partes.

Conexiones WAN

Tendremos que hacer dos configuraciones. 

Una contra la tarjeta de red (de fibra óptica) original. Es la que está relacionada con la siguiente captura por lo que tuve que activarla pero con el cable de fibra desconectado: 


Sercomm FG824CD: Configuración tarjeta WAN
Sercomm FG824CD: Configuración tarjeta WAN

Aunque podría haber deshabilitado el DHCP y poner una dirección pública válida (copiando alguna que ya me hubieran puesto anteriormente) hay que pensar que a día de hoy lo normal es que no se tenga derecho a una dirección estática. De ponerla a mano lo recomendable es tenerla así el menor tiempo posible para regresar a la dinámica una vez se hayan hecho todas las configuraciones deseadas. 

Por lo que he podido averiguar y probar: "DHCP option 60" con valor "dslforum.org" y marcando la casilla "DHCP opción de solicitud 43" es la forma en la que informan al router cómo o de dónde cargar la configuración ACS automáticamente. 

En mi caso lo que he hecho ha sido poner un servidor DNS interno que he configurado en el punto de acceso Mikrotik. En este servidor he configurado una entrada para que redirija acs.masmovil.com y acs.yoigo.com a la dirección IP de la raspberry. Mientras que no evites que acceda a estas direcciones no te recomiendo que conectes la fibra o se te actualizará la configuración automáticamente.

Por lo otro lado también he creado dos tarjetas adicionales. Una de tipo "enrutamiento" (como la que tenemos aquí) con el nombre LAN y otra de tipo host con el nombre LANHost. Esta última al final no ha hecho falta. 


Sercomm FG824CD - Añadir una conexión más con direccionamiento estático
Sercomm FG824CD - Añadir una conexión más con direccionamiento estático


Habrá que ponerle un nombre fácil de entender e identificar, una dirección IP con distinto netid al tuyo (por lo que si usas una 192.168.1.0/24 ponte una 192.168.2.0/24) y la puerta de enlace adecuada a ese netid. Ejemplos: 192.168.2.177 y gateway 192.168.2.1. No te olvides de poner el mismo DNS que en la anterior:

Sercomm FG824CD Estado conexiones creadas
Sercomm FG824CD Estado conexiones creadas

Configuración TR-069

La siguiente captura que procede de la sección TR-069 la saqué justo después de resetear el router. De todas formas, para el punto donde nos encontramos nos sirve perfectamente:.


Sercomm FG824CD: Configuración TR-069
Sercomm FG824CD: Configuración TR-069

En la captura podemos ver que hay un botón para activar o desactivar TR069. Pero está deshabilitado. Y aunque se manipule el html para habilitarlo el cambio no se guarda. Por lo que siempre estará activo. Lo que significa que tenemos que conseguir engañar al sistema de otra forma. 

La conexión WAN: Esta es importante. Aquí he puesto la nueva conexión.

La versión SSL sólo deja seleccionar auto, SSL 3.0, TLS 1.0 y TLS.1.2. La primera prueba en la que he visto que había una reacción ha sido sin tirar de https. Lo mejor es dejarlo en auto.

ACS URL: he puesto la dirección IP con el puerto de la raspberry donde tengo lanzado el script. Los ejemplos de ese script tiran de ssl pero la primera prueba exitosa ha sido con http y ha funcionado (aparentemente). ¡Ojo! Aunque parezca que funciona, desconozco por qué al rato vuelve a la URL original.

Obtener URL por DHCP: Esta opción es otra de la que da problemas. Es un botón deshabilitado que por mucho que se habilite a nivel de html no se guardan sus cambios. Esta es la razón por la que hay que tirar de un servidor DNS interno que evite que busque (de momento) las URLs que fuerzan "gracias" a esta opción.

Credenciales: poco puedo contar. Los nombres de usuario suelen ser conocidos. Las contraseñas... No lo sé.

Intervalo de informe: no sé muy bien si es el tiempo en el que tarda en volver a llamar al servidor TR069 pero lo cambiaría a muy bajo, a lo mejor unos pocos minutos, por si se consigue que contacte con uno nuestro podemos detectarlo rápidamente.

Enrutamiento

Uno de los problemas que me he encontrado ha sido que no había forma de conseguir que LAN accediese nuestro propio servidor TR-069 (vamos, la rasp). Sabía que tenía que buscar su dirección IP pero al mandar el paquete ARP no había respuesta. Lo he intentado con rutas estáticas pero nada. Y ya desesperado, simplemente por probar, he configurado ¿el enrutamiento de políticas? Serán las políticas de enrutamiento (¿no?): 

Sercomm FG823CD: Enrutamiento de políticas
Sercomm FG823CD: Enrutamiento de políticas

A la vez he comprobado (por vigésima vez mínimo) que desde mi ordenador llegaba a la IP de la tarjeta WAN con nombre LAN (me acabo de dar cuenta de que es un poco antagónico, pero para el caso me sirve). Desde mi ordenador todo bien. Pero curiosamente desde la raspberry, que es la que tiene que tiene que poder responder a esas peticiones no funcionaba. Para mí no tiene sentido porque tendría que tirar directamente contra su gateway por defecto. No obstante he añadido la misma puerta de enlace para el rango de LAN:

#route add -net $IP_WAN_LAN netmask 255.255.255.0 gw $GATEWAY_PRINCIPAL

Y con esto ya tengo respuesta.

Algunas de estas cosas las he podido evaluar y buscar gracias a las secciones de port mirroring o captura de paquetes en la sección de estado y soporte.

Resumen1:

Para el primer resumen este es el estado del router:

  • Wifi deshabilitado.
  • Dirección IP interna reconfigurada.
  • Servidor DHCP deshabilitado.
  • WAN: 
    • Con DHCP pero el DNS reconfigurado hacia uno nuestro.
    • Nueva conexión llamada LAN (ojo que puede liar): direccionamiento estático con IP privada; Mismo DNS que la conexión principal.
  • El servidor ACS interno activado.
  • Configuración de políticas de enrutamiento.
  • Configuración de gateways si hace falta.
Continuación:

Te preguntarás cuándo conectar el cable de fibra. Lo puedes hacer en el mismo instante en el que cambies el DNS de la conexión HSI. No se te configurará entre otras cosas el teléfono. Pero al menos tendrás acceso a internet.

Una vez conseguido que haya una primera respuesta y he ordenado el artículo hasta aquí... He tenido problemas con la raspberry y me ha costado un tiempo volver a tener conectividad. Pero una vez reestablecida la configuración de red esta, vuelto a lanzar el servicio ACS y reiniciado el router estoy obteniendo resultados. 

Sercomm FG824CD: TR-069 y acceso al servidor ACS
Sercomm FG824CD: TR-069 y acceso al servidor ACS

En mi caso parece que se está cambiando el usuario y la contraseña principales. Pero sí devuelve resultados internos. Lo único que no se están guardando y el buffer de la consola no me los registra. No sé si es por el cliente ssh o por la librería del servidor http en python. Razón por la cual he activado el port mirroring (con el tcpdump en otro screen de la rasp) y la captura de paquetes en el propio router. 

Ah! Que no me olvide: he tenido que corregir un pequeño problemilla en el código; una excepción de esas que con sólo validar que si una variable es nula se le asigna cadena vacía y listo.

Al recoger una de esas capturas sólo he tenido que seleccionar uno de los paquetes con texto (ya que no me estoy conectando con https) y hacer un follow TCP stream

Sercomm FG824CD: Resultados de su configuración por TR-069 / ACS
Sercomm FG824CD: Resultados de su configuración por TR-069 / ACS

Sólo quedaría pasar ese XML a un fichero o editor que permita analizarlo con más facilidad. Por ejemplo, Notepad++.

Es un xml muy largo, por lo que ver y entender todo va a ser casi imposible para lo que nos ocupa en este post pero alguna cosa sí que puede ser interesante. Además hay que recordar que todavía no hemos sido capaces de hacer una actualización de la configuración a través del script. Por cierto, he tenido que buscar alguna entrada y he llegado a esta página donde tienen la explicación muchos de los datos (por no decir todos) que contiene este xml que curiosamente es para TR-098, y que no a aparece en el de TR-069..

...
<ParameterValueStruct>
    <Name>InternetGatewayDevice.ManagementServer.ConnectionRequestURL</Name>
    <Value xsi:type="xsd:string">http://_IP_LAN_:13854/_cadena_larga_"aleatoria"_/index.html</Value>
</ParameterValueStruct>
<ParameterValueStruct>
    <Name>InternetGatewayDevice.ManagementServer.ConnectionRequestUsername</Name>
    <Value xsi:type="xsd:string">cwmpCR</Value>
</ParameterValueStruct>
...
<ParameterValueStruct>
    <Name>InternetGatewayDevice.Services.VoiceServiceNumberOfEntries</Name>
    <Value xsi:type="xsd:unsignedInt">1</Value>
</ParameterValueStruct>
...
<ParameterValueStruct>
    <Name>InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.Name</Name>
    <Value xsi:type="xsd:string"></Value>
</ParameterValueStruct>
...
<ParameterValueStruct>
  <Name>InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.Line.1.SIP.AuthUserName</Name>
    <Value xsi:type="xsd:string"></Value>
</ParameterValueStruct>
<ParameterValueStruct>
    <Name>InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.Line.1.SIP.AuthPassword</Name>
    <Value xsi:type="xsd:string"></Value>
</ParameterValueStruct>
...
<ParameterValueStruct>
    <Name>InternetGatewayDevice.X_SC_Management.AccessControl.TR069Mode</Name>
    <Value xsi:type="xsd:string">wan (nota: ¿cambiar a 'ALL' o 'LAN'?)</Value>
</ParameterValueStruct>
...
<ParameterValueStruct>
    <Name>InternetGatewayDevice.X_SC_Management.AccessControl.SSHStatus</Name>
    <Value xsi:type="xsd:string">Disabled (cambiar a 'Enabled')</Value>
</ParameterValueStruct>
<ParameterValueStruct>
    <Name>InternetGatewayDevice.X_SC_Management.AccessControl.SSHMode</Name>
    <Value xsi:type="xsd:string">none(¿cambiar a 'lan'?)</Value>
</ParameterValueStruct>
<ParameterValueStruct>
    <Name>InternetGatewayDevice.X_SC_Management.AccessControl.SSHTrustNetworkMode</Name>
    <Value xsi:type="xsd:string">none(¿cambiar a 'lan'?)</Value>
</ParameterValueStruct>
...
<ParameterValueStruct>
    <Name>InternetGatewayDevice.X_SC_Management.Server.SSHServer.Enable</Name>
    <Value xsi:type="xsd:boolean">1(¿ya está activo? Pero según qué nmap se lance, puede aparecer como filtrado o no aparecer)</Value>
</ParameterValueStruct>
<ParameterValueStruct>
    <Name>InternetGatewayDevice.X_SC_Management.Server.SSHServer.AccessPort</Name>
    <Value xsi:type="xsd:unsignedInt">22</Value>
</ParameterValueStruct>
...
<ParameterValueStruct>
    <Name>InternetGatewayDevice.X_MASMOVIL_COM.Users.User.1.Username</Name>
    <Value xsi:type="xsd:string">admin</Value>
</ParameterValueStruct>
<ParameterValueStruct>
    <Name>InternetGatewayDevice.X_MASMOVIL_COM.Users.User.1.Password</Name>
    <Value xsi:type="xsd:string"></Value>
</ParameterValueStruct>
<ParameterValueStruct>
    <Name>InternetGatewayDevice.X_MASMOVIL_COM.Users.User.1.Group</Name>
    <Value xsi:type="xsd:string">admin</Value>
</ParameterValueStruct>
...
<ParameterValueStruct>
   <Name>InternetGatewayDevice.X_MASMOVIL_COM.Users.User.1.Permission</Name>
   <Value xsi:type="xsd:string">web,cli(,ftp,smb)</Value>
</ParameterValueStruct>
...
<ParameterValueStruct>
    <Name>InternetGatewayDevice.X_SC_MiscCfg.GPON.DebugMode</Name>
    <Value xsi:type="xsd:string">Disabled</Value>
</ParameterValueStruct>

Con alguno de estos datos podría probar a cambiar el script para adecuarlo a la estructura que entiende el router porque está claro que los usuarios no se crean de igual forma en Sercomm que en el ZTE. Además podemos ver cómo añadirles más capacidades de acceso (con ese "cli" que tiene el administrador por ejemplo). Y activar el servicio SSH sólo válido para "lan" (porque si ponen "wan" en otros servicios seguro que "lan" sirve también). 

He estado haciendo pruebas modificando el script. 
  • He querido añadir usuarios para los cuales he acabado modificando una copia de este para crear los objetos que contendrían los datos de estos usuarios. Como adelanto para otra posible entrada, se usa un tag que se llama "AddObject". Pero después no me funcionan.
  • He hecho modificaciones para poder incluir datos de tipo boolean.
  • Ahora mismo desconozco por qué al intentar cambiar el valor de "DebugMode" no me permite ponerle "Enabled" a pesar de que es un tipo string. Esta cadena es la que aparece en uno de los tags de la interfaz web cuando se quiere que muestre la opción de activar los servicios de SSH.
  • Al activar los servicios de SSH parece que sí se debían de estar activando pero después no se encuentran estos servicios con nmap.
  • Las contraseñas que no se hayan actualizado por nuestra parte a través de este script no se muestran. Las que nosotros hayamos metido, sí.
  • Y lo más soprendenete es que a pesar de que después devuelve que se han realizado los cambios al reiniciar el router... Al menos los importantes como los del SSH y modificación de los usuarios vuelven a su estado anterior. Lo único que he visto (si es quen o se me ha escapado ningún otro) es que los objetos relacionados con los nuevos usuarios sí que están, pero con sus valores por defecto que no sirven para nada.
Creo que de momento lo dejo aquí. Hay muchos más flecos con los que tengo que pegarme pero ya los contaré en otra entrada.  

Antes de acabar no me quiero olvidar de poner otro enlace que también dan pistas de por dónde tirar para hacer estas cosas. Me lo dejé a medias pero lo tenía pendiente de continuar. Y no quiero que se pierda. Es para un router F@ST 5657,

miércoles, 31 de marzo de 2021

SJCL: Cifrado en el Sercomm FG824CD

Como ya sabréis, me estoy pegando con el router FG824CD para intentar recuperar datos que no te dan el usuario cutre que sólo te da unas posibilidades muy limitadas y que apenas sirven para nada. Como quieras hacer cosillas, como obtener los datos de acceso al servidor VoIP, lo llevas claro. 

Una de las cosas que uno se encuentra al hacer debug en la interfaz web mientras se van cargando cada una de las secciones a las que se accede es una librería de cifrado y descifrado sjcl: "Stanford Javascript Crypto Library (SJCL)". Según la describen los que la han desarrollado está destinada para aplicaciones web que no requieran muchos recursos. Y eso es lo que puede necesitar un router. Además tienen una demo que permite hacer pruebas. Yo ya lo intenté ver cuando me puse a pegarme con esto pero no vi muy bien cómo funcionaba. Hasta que hace unos días...

Ahora mi idea es probar a hacer un cifrado con los parámetros que me parezcan lo más parecido posible a lo que veo al debuguear.

Una primera prueba que he hecho ha sido la que se puede ver en la siguiente captura:

Prueba de cifrando con SCJL
Prueba de cifrando con SCJL

En este ejemplo he hecho un cifrado sin tirar de contraseña, ya que he visto que aparentemente en el router se utiliza una clave de 32 dígitos hexadecimales. Al menos, claves de esas me he encontrado en bastantes ocasiones. Al hacer el cifrado el textarea del mensaje se borra. 

Como tengo que volver a buscar algunos datos, ya sea porque no tengo todo y porque ya hace un tiempo que no miro esta parte lo tengo un poco olvidado, voy a recopilar algunos más actualizados. Por lo que buscaré las variables sys_encryption_key y dk, las cuales acababan conteniendo el mismo valor. Queriendo recordar me suena que cuando estas tenían contenían algún valor también había alguna variable justo con los datos del scjl. Lo que también significa que tendré que volver a habilitar los puntos de ruptura en esta librería.

La primera en la frente. Poniendo el hash que me ofrecen y el resultado en el formato json con el que guardaban los datos que van a descifrar, quería probar a lanzarlo yo mismo en la demo, pero el resultado ha salido infructuoso:

SCJL intentando descifrar datos del router Sercomm FG824CD sin éxito
SCJL intentando descifrar datos del router Sercomm FG824CD sin éxito

Hay una cosa curiosa que ya la conté en su momento: ese sys_encryption_key no es estático. He visto un montón de veces que al ir al mismo sitio me mostraba distintos valores. Pero a su vez es  un parámetro que se pasa al método que se encarga de hacer el descifrado. Lo que significa que tiene que sufrir alguna transformación específica. Seguro. O al menos habrá que pensar que algo de eso tiene que ser. Si cada X tiempo cambia o es así o el sistema cifra todos los datos constantemente para poder descifrarlo después. ¿Alguna otra opción se os ocurre?

El método al que se llama contiene este código. De los cuatro parámetros que puede recibir se le mandan dos. El primero es el hash y el segundo el resultado de lo que se obtuvo al cifrar los datos y que ahora el router quiere descifrar.

´Método decrypt de la librería SJCL en el Sercomm FG824CD
´Método decrypt de la librería SJCL en el Sercomm FG824CD

Mientras he estado viendo poco a poco los pasos que hace, y la verdad, algunos resultados intermedios no podría decir qué son porque convierten cadenas a "binario" (eso dicen: acaban siendo arrays numéricos) me he encontrado con una función en la que dentro se muestra precisamente el mensaje del alert que suelta la demo:

SJCL en FG824CD: CCM tag doesn't match
SJCL en FG824CD: CCM tag doesn't match

En este punto tendría que ver por qué en el router no me da este mensaje pero sí que salta en la demo. Iba a dejarlo aquí, pero he querido hacer la siguiente prueba: buscar esa línea en la demo, ver qué me encontraba y a una mala manipular los datos para forzar a que no saltase esa excepción.


Debug de SJCL en la página demo
Debug de SJCL en la página demo

Me ha llamado la atención que son distintas versiones ya que como se puede apreciar las líneas no coinciden. Y por desgracia los valores que se comparan, en efecto, son distintos. No he podido profundizar el por qué. No obstante, he probado a ver qué pasaba si forzaba la igualdad, en dos ocasiones, cambiando el valor del otro operador en cada una de ellas... Pero me ha salido unos datos muy raros. 

El resumen: si se os ocurre algo más para atacar este problema, bienvenido sea. Y como de costumbre, lo podéis dejar en los comentarios.

[Update]
Se me ha ocurrido: ¿qué pasaría si me descargase la demo y después la versión de la librería sjcl.js que carga el router para forzar que la demo llame a esta última? Me da el mismo error.
[/Update]

domingo, 7 de marzo de 2021

Maxcio EDM-1WAA-EU: Configuración inalámbrica

Como conté en el anterior post tuve problemas para instalar el Maxcio EDM-1WAA-EU porque en nigún sitio explicaban que había que quitarle el botón para poder atornillarlo en la caja de mecanismos. 

El tema es que las instrucciones tampoco indican muy bien cómo configurarlo para poder gestionarlo con la aplicación de móvil. Una de las cosas que no lo cuentan bien es cómo poner los dos modos en los que se puede enlazar el cacharro. Ya lo conté también en la entrada anterior.

El problema que he me he encontrado es que no ha sido fácil que se sincronice con la aplicación. 

Intentando poner los datos de la wifi en la que yo estaba conectado (el SSID y su clave para que se pudiera conectar) a los pocos segundos dejaba de parpadear su pilotito y ya... Pero la aplicación seguía esperando respuesta sin éxito acabando el tiempo sin resultados. 

Intentando configurarlo en modo AP, para conectar el móvil al mismo tampoco acababa de sincronizarse apagándose también el pilotito antes de tiempo. Eso sí, conseguía averiguar que su servidor DHCP me daba una dirección IP del rango 192.168.175.0/24. Sine embargo, con una prueba básica de intentar acceder a un servidor web no había resultados con éxito. 

Por lo tanto, me puse a mirar qué me indicaba el Mikrotik 4UAHR. En él podía ver cómo el interruptor se conectaba unos segundos, a unos 6 mbps, y pero sólo para Tx (entiendo que en sentido del punto de acceso). Y a los pocos segundos se desconectaba y se volvía a conectar. 

Por otro lado los logs de AP mostraban que en efecto el regulador se desconectaba:

CA:FE:CA:FE:CA:FE:CA@testWifi: disconnected, received deauth: sending station leaving (3)

Y... no he podido saber muy bien qué significaba esto. No obstante... He intentado probar con varias de las tarjetas de red que tenía configuradas. Una o dos de las de prueba les he cambiado el perfil de seguridad para poner una contraseña más fácil. Incluso sin espacios (ya que si se los pones se quejará, aunque no te impide continuar). Y ni por esas. Hasta que se me ha ocurrido hacer una pequeña locura que hay que acordarse de volver a cambiar: no ponerle contraseña. Así, ha funcionado. Se ha conectado a la primera. 

El siguiente paso ha sido volver a poner uno de los perfiles de seguridad. Como estas configuraciones dependen del móvil, el cual lo he ido conectando a la misma red, he podido comprobar que el dimmer ya no necesita que lo vuelva a configurar. Es decir: le he puesto la contraseña segura al móvil y se ha conectado, pero el regulador no ha requerido que se la vuelva a pasar. Es más, conectado a la wifi principal sigue funcionando. Y voy más allá: sin haber creado una cuenta véteTúASaberDónde y tirando de datos móviles también lo puedo manipular.

Un siguiente paso sería cacharrear con sus comunicaciones: por qué no me aparece como conectado en el punto de acceso, qué puertos tiene abiertos... 

¡Ah! No se me olvide: viendo videos al buscar ayuda para su desmontaje me he encontrado con que hay otra marca comercial cuyos tratos yo diría que son exactamente los mismos y se llama Ener-J. Por si también os sirve de ayuda.

Espero si habéis llegado aquí porque teníais problemas haberos podido ayudar.

sábado, 6 de marzo de 2021

Maxcio EDM-1WAA-EU - Instalación física y despiece

Antes de empezar, disclarimer: Cualquier cosa de las que se muestran aquí son posibles soluciones pero podría no funcionarte a ti. No me responsabilizo de lo que le pueda suceder a tu dispositivo o a tu persona dado que estos aparatos funcionan con 220V: si no bajas los diferenciales y demás interruptores generales podrías llegar a electrocutarte o sin ser tan extremos darte un buen calambrazo.

Recientemente me han regalado un regulador de luz Maxcio EDM-1WAA-EU. El tema está en que lo que en teoría debería de ser posible de desmontar en 4 segundos... lo intenté durante horas sin éxito. 

Maxcio EDM-1WAA-EU
Maxcio EDM-1WAA-EU

Así, en teoría, al poner el destornillador en la pestaña que tiene en la parte inferior, se podrá desmontar o despiezar para:
  1. Dejar los agujeros de los tornillos al descubierto para poderlo anclar en la caja de mecanismos.
  2. Trastear o cacharrear, si se desea, con los chips que trae como si de un Arduino se tratara. Recuerda: este es un aparato que va conectado a los 220V; Mucho ojo con lo que haces que si lo haces con el aparato conectado directamente te podría dar un arreón de cuidado. 
Maxcio EDM-1WAA-EU - Pestaña para abrir el regulador
Maxcio EDM-1WAA-EU - Pestaña para abrir el regulador

Como decía: en teoría apoyando el destornillador justo dentro de lo que he marcado, en la misma esquia que se genera en ese hueco (lo más cerca posible del vértice verde, pero por dentro... Se debería de poder abrir este dimmer con mucha facilidad en apenas unos segundos. Pero me fue imposible. Se abría parcialmente sólo por dos lados contiguos. Tanto es así que lo apoyé donde no era ya por desesperación y acabé deformando parte de la carcasa (por eso os estoy dejando la foto con la deformación, para que se sepa dónde no poner el destornillador). De hecho, cuidado, porque por ahí está el chip y lo podrías estropear. Yo toqué un poco... Así, mi hermano me encontró una solución:

Once installed and setup the dimmer switch works perfectly. However, the first hurdle is taking off the face plate. After struggling to take it off I realised the dimmer button must be removed followed by the small washer on the metal button. After removing these, the face plate comes off easily. The instructions do not display this anywhere.

Es decir, que quitando el botón se debería de poder desmontar. No voy a negar que casi me lo esperaba porque el regulador que voy a quitar se hace así. De hecho, es mucho más sencillo porque el antiguo al ofrecer resistencia se quita el botón fácilmente pero este puede girar y girar sin fin. Así, al hacer un poco de fuerza con el botón hacia afuera, conseguí quitarlo:

Maxcio EDM-1WAA-EU - Quitar botón, tuerca y arandela

Como se puede ver, el botón se puede retirar. Una vez lo has quitado, se puede ver que hay una tuerca y debajo una arandela (que en esta foto aún no la he quitado). También hay que fijarse en que la espiga tiene una muesca (que he marcado en amarillo) que coincide con lo que he indicado en la parte inferior del botón.

Por lo que por fin he podido atornillarlo a la caja de mecanismos:

Maxcio EDM-1WAA-EU - Atornillado a la caja de mecanismos
Maxcio EDM-1WAA-EU - Atornillado a la caja de mecanismos

La verdad es que encajó casi por milímetros. Y los tornillos: tuve que aprovechar los originales porque los que venían con este regulador no entraban. También se puede ver que marqué un poco el chip al intentar abrirlo. ¡Ah! Y tuve que volver a poner uno de los cables de nuevo porque era rígido y se partió.

Por lo que ya estaría instalado y "funcionando". Sólo quedaría que configurarlo. Pero eso lo dejaré para más adelante.

Maxcio EDM-1WAA-EU - Instalado y encendido
Maxcio EDM-1WAA-EU - Instalado y encendido

Por lo que una vez subí los interruptores del cuadro de luces con todos los cables bien puestos en su interior... Ya estaba funcionando. Al menos pulsando para encender las luces... Girando a izquierda y derecha para regular las luces... Y volviendo a pulsar para apagar... Vamos: tal y como funciona un regulador básico, común, normal y corriente.

Como pistas y spoilers para intentar configurarlo:
  • Modo rápido o flash: Estado inicial, "apagado". Es decir, tal y como se muestra la foto. Pulsar entre 3 y 5 segundos. En alguna ocasión he tenido que hacerlo hasta 10. En este modo, con la aplicación, te piden qué red wifi quieres que se conecte (en teoría la misma donde estás) y poner la clave para que el regulador pueda conectarse a dicha wifi. Aquí deberías de tener las luces encendidas y el pilotito parpadeando rápido.
  • Modo AP: Con el pilotito parpadeando rápido vuelves a apretar unos segundos el pulsador. Debería de parpadear lento. 
Se quedará en el modo seleccionado muy pocos minutos. Mi problema está en que no consigo configurarlo hasta el final. Por eso lo dejo para otro día. 

Espero que si te encuentras con algún problema de los aquí descritos te haya sido de ayuda. Ya sabes: para cualquier cuestión, pregunta y a ver si te puedo ayudar. 

domingo, 17 de enero de 2021

Router Sercomm FG824CD III

Como ya os conté en las entregas del Sercomm FG824CD I y II, existe la posibilidad de poner uno de los puertos de su switch en modo port mirroring. Esa opción se encuentra dentro del menú principal estado y soporte, menú izquierdo diagnóstico, opción port mirroring:

Sercomm FG824CD - Port mirroring
Sercomm FG824CD - Port mirroring

Con el fin de que se muestre, tocará modificar los datos internos tal y como expliqué las anteriores entradas. El parámetro que necesitaremos poner en el textbox es saber en qué puerto ethernet vamos a conectar la máquina que se pondrá a escuchar los datos. Ten en cuenta los otros posibles equipos que tengas en la red que pudieran hacer ruido al escuchar. En mi caso, sólo tiene dos cables: uno para toda la red y el destinado a una raspberry que tengo parada que es la que se ha usado con tcpdump. Una vez se ha puesto el puerto, por ejemplo, LAN3, solo queda darle al botón inicio:

Sercomm FG824CD - Port mirroring iniciado
Sercomm FG824CD - Port mirroring iniciado


Sale un pop-up de los suyos en el que te indica que no se te olvide pararlo. Como se puede ver, lo único que se muestra es el botón "parar".

Para resumir:
  • Forzar modo administrador: ya sea modificando el usuario, reseteando el router a fábrica...
  • Port mirroring: identificar el número de puerto donde se podrá el puerto destino para el mirroring.
  • Equipo con el sniffer configurado.
Yo accedí por ssh a la máquina y ejecuté tcpdump con algo parecido a esto:

# tcpdump -vvv -i eth0 -s0 -w salidaPortMirroring.pcap 'not port 22 and not host ipInterna_01 and not host ipInterna_02 and not host ipInterna_03'

El resumen:
  • -vvv: Ser muy verbose
  • -i eth0: Tirar la interfaz eth0. Aunque siendo una rasp se podría decir que sólo tiene una, también tenía un pincho USB para la wifi.
  • -s0: Esto evita que trunque datos. tcpdump por defecto no recoge el tamaño de datos completos. Este parámetro evita que lo haga.
  • -w salidaPortMirroring.pcap: Escribir lo capturado en un el fichero para un posterior análisis.
  • Filtros:
    • not port 22: Descarta los paquetes relacionados con este puerto: ssh. Importante si estás accediendo por este protocolo para quitarse ruido.
    • not host X: Descarta los paquetes de esas direcciones IP. Te quitas algo de ruido también.
Aquí tocó lo más delicado: aun estando el router encendido (obvio, si se ha puesto el port mirroring) desconectar el cable de fibra. A los pocos segundos (por ejemplo, el tiempo que se tarda en mirar los leds del frontal) volver a conectarlo. Y dejarlo un tiempecillo. No recuerdo cuánto lo dejé analizando, pero sí sé que lo suficiente. Aunque a lo mejor en un minuto ya se tenía, tcpdump lo tuve analizando un rato más. Unos minutos a lo mejor.

Ya ya tocó ponerse a analizar un poco el .pcap con wireshark. Como ya lo tenía configurado para fiiltar por el protocolo sip:

Sercomm FG824CD: Wireshark muestra REGISTER MasMovil con SIP
Sercomm FG824CD: Wireshark muestra REGISTER MasMovil con SIP

Se puede ver cómo se registró el ATA del router con MasMovil. Esto significa que algunos de los datos importantes se pueden obtener. Poco más pude analizar y ahora es el momento de ponerme a ello.

Sercomm FG824CD: REGISTER del cliente SIP
Sercomm FG824CD: REGISTER del cliente SIP

Antes de continuar: ya sé que hay datos que estoy ocultando por un lado y por otro, el mismo lo estoy dejando. Este es el mensaje del cliente sip del router que le ha mandado al servidor. No voy a negar que hay cosas que me está costando pillar. Sí sé que tenemos algunas cosillas interesantes:
  • Username: e349--------@ims.masmovil.com
  • IP: 212.230.247.89
  • Nonce: un valor aleatorio utilizado como salt para el hash de la contraseña.
  • Realm: el dominio contra el que se va a autenticar. Si bien normalmente el dominio se suele ser el que vemos en la línea que indica sip:telefono@dominio.com.
  • Diguest Authentication Response: aunque lo explico más abajo, en el enlace de Pepelux él lo hará muchísimo mejor sin duda alguna. Es la fuente principal...
  • User-Agent: Qué cliente se está usando para utilizar el servicio. A veces el servidor puede forzar a que sólo puedan autenticarse unos clientes determinados. 
Soy consciente de que hay más datos. Además, la verdad, me hago un lío porque como también está el outbound proxy, el domain (en teoría es el realm), al authname que a veces se confunde con el username (de hecho, lo que aquí ponen como username en algunos sitios lo configuran en username y vicebersa). El tema está en que como más o menos ya tenía documentación al respecto (y de hecho, en los enlaces que añadí en las anteriores entradas ya se veía qué patrón seguían), mi idea es recuperar la contraseña o al menos una cadena que con la que pueda trabajar para pasarla al sistema que yo desee. 

Como decía más arriba, en uno de los enlaces de abajo he incluido la explicación que hizo Pepelux sobre qué datos de los que nos han entregado tenemos para recuperar la contraseña. El campo digest authentication response es un MD5 en el que se concatenan otros dos MD5 y una cadena más (el nonce). De los dos MD5 internos, uno de ellos, entre otros valores conocidos, contiene la contraseña. Aunque en otro de los enlaces que os he puesto abajo (Cracking SIP II) indican que con las herramientas del paquete sipcrack pueden facilitarte el trabajo, la verdad es que a mí no me localiza logins en el .pcap cuando realmente sí que ven desde wireshark. Esta herramienta tiene una complementaria, sipdump, pero no he sido capaz de que me funcione. No obstante, he conseguido encontrar qué formato tendría su salida. Por lo tanto, al ejecutar:

# sipdump -p salida.pcap salidaSip.txt

Obtendríamos unas líneas para cada register con la siguiente estructura:

IPServidor"IPCliente"e349--------@ims.masmovil.com"[REALM_QUE_NO_PUBLICO]"REGISTER"sip:ims.masmovil.com"[NONCE_QUE_NO_PUBLICO]""""MD5"[HASH_DEL_RESPONSE]

Con esta estructura al ejecutar sipcrack se reconocen los datos:

Buscando la contraseña de la cuenta VoIP en el Sercomm FG824CD
Buscando la contraseña de la cuenta VoIP en el Sercomm FG824CD

Esto es sólo un ejemplo. Era prácticamente evidente que la contraseña no iba a estar en el listado. No obstante, tengo que averiguar si esta herramienta permite forzar también máscaras y demás para no sólo tirar de diccionario sino también modificar sus caracteres. 

La verdad, es que con las pruebas que estoy haciendo, tengo dudas de que esté poniendo correctamente los datos. Hay algunos datos que tal y como me aparecen no guardan la misma estructura que los distintos ejemplos que se encuentran.

Veré si soy capaz de seguir dándole a este tema. Que seguro que es trivial.

TR-069

Aprovechando que en la captura está la carga del arranque se me ha ocurrido que podría encontrar algún dato relacionado con tr-069. Pero esa información se transmite cifrada. 

- - - -

Seguiré trabajando en esta parte. Sobre todo, en montar correctamente la estructura del fichero para buscar la contraseña del register, porque como decía, me parece que los datos que se obtienen de la captura son bastante raros con respecto a los distintos ejemplos que se encuentran. 


- - - -
Otras fuentes:
Buscando una de las direcciones IP recuperadas (212.230.247.89) he encontrado esta entrada en un foro sobre la configuración de teléfonos VoIP que también puede ser interesante (la página 3 que es a la que he llegado): https://www.adslzone.net/foro/fibra-optica.94/manual-gigaset-c530-ip-voip-masmovil.428450/page-3

Cracking de SIP: Pepelux (@pepeluxx), del que ya os he hablado muchas veces, explica problemas de seguridad al publicar todos los logs que se producen en Asterisk incluyendo los datos necesarios para obtener la contraseña.

Cracking de SIP II: explican muy bien los mensajes que se mandan al registrarse un cliente sip y cómo intentar obtener la contraseña.
 
VoIP.org: md5Secret; Es la posibilidad de configurar un campo más con este nombre que permite poner el hash entero de la terna usuario:realm:contraseña para que esta última no sea visible en claro.

HashCat: También vienen las estructuras de cómo se espera que se pasen los hashes que se quieren romper. Entre otros, SIP digest authenticationTambién indica el modo en el que habría que ejecutarlo: 11400.

Ejemplo de salida de sipdump.txt: https://github.com/piyushcse29/john-the-ripper/blob/master/src/unused/sipdump.txt

En este enlace hay dos ficheros que empiezan por sip que tienen la estructura de cómo es el formato necesario para que las herramientas puedan hacer la fuerza bruta: https://github.com/piyushcse29/john-the-ripper/blob/master/src/unused/

domingo, 10 de enero de 2021

Router Sercomm FG824CD II

Tal como comentaba en un anterior post sobre el router Sercomm FG824CD, se pueden ir recuperando datos de qué hace y qué información contiene tirando del hilo. 

Recuerdo de una forma resumida el disclaimer: ojo con lo que hagas con tu router; Cualquier cosa que le suceda es responsabilidad tuya. 

Reseteo del router

En teoría si se presiona el botón de reset del router durante unos segundos, debería de volver al estado de fábrica. Pero tiene su "aquel". Parece ser que si alguno de los cables de red o de teléfono están conectados no acaba de funcionar. En mi caso me volví loco y perdí (o invertí) mucho tiempo para devolverlo al estado de fábrica y no lo conseguí. Incluso hice lo que comentaba en el anterior post: el reseteo 30/30/30. Es el que, con el router encendido, se presiona 30 segundos ese botoncito, sin soltar se apaga siguiendo la presión durante otros 30 segundos, y se vuelve a encender sin soltarlo durante otros 30 segundos. También conocido como hard reset en el mundo WRT. Al final, tuve que ir a la interfaz web, menú configuración y submenú configuración

Volviendo al TR-069:

El otro día hablé del TR-069 de pasada. Por lo que he podido averiguar, y me gustaría estudiarlo un poco más, es algo así como un protocolo que permite enviar una configuración predeterminada a los aparatos que incluyen un user-agent (usar aquí la palabra "cliiente" es ambigua) de este protocolo. De esta forma se fuerza a que en el momento en el que se hace un reseteo  por parte del cliente (persona que paga por un servicio) al aparato se le carga la misma configuración predeterminada. Por eso, si se resetea el router sin el cable de conexión a la operadora (sea ADSL o fibra) tiene una configuración con acceso del usuario administrador y al poner el cable ese usuario ya no es accesible. 

La configuración que se muestra como norma general oculta los datos de autenticación a ese servicio no mostrándolos. Pero con el reseteo sí que se obtienen algunos de esos datos. También es cierto que algunos están cifrados y se representan en base64:

Sercomm FG824CD: Configuración TR-069
Sercomm FG824CD: Configuración TR-069

Descifrado de fichero de configuración

Otra de las cosas que me ha traído de cabeza ha sido buscar la forma de descifrar el fichero de configuración. Recordemos que también lo conté la anterior vez. Y es una idea que de momento voy a abandonar. No obstante, veamos qué tenemos.

  • Sabemos que los hashes que utiliza son de tipo SHA256. 
  • Sabemos que para cifrar algunos datos se utiliza SCJL. De hecho, cada vez que se inicia sesión o se pasa por un menú principal se llama a scjl.js.
  • El router verifica de cierta forma que no se haya manipulado el fichero de configuración. Unas primeras pruebas parecía que usaba alguno de los datos de las cabeceras pero después de mucho probar a hacer cambios en esa cabecera generé uno completamente nuevo y al ir haciendo esos cambios mínimos su carga no generaba ninguna alerta. Por lo que se deduce que esa cabecera no contiene ningún valor que sirva para descifrar el fichero.

Alguna de las cosas que he podido encontrar es que este tipo de cifrado utiliza json para cargar los parámetros y los datos que se quieren cifrar y descifrar. 

Encontré un sitio que ayudaba a cifrar y descifrar datos con SCJL.

No recuerdo de dónde saqué lo siguiente, pero es un ejemplo de la estructura que tiene:


{
"iv":"888881********************==", // iv Base64 encoded
"v":1, // version"iter":1000, // iteration count
"ks":128, // key size in bits"ts":64, // authentication strength
"mode":"ccm", // mode
"adata":"xxx", // authenticated data
"cipher":"aes", // cipher
"salt":"lx000000000000****************=", // key derivation salt
"ct":"6a6A7a7A8a8B8b8B" // ciphet text
}

Otro ejemplo que se podría probar en base a un código como este:


//Encrypt
var encryptedMessage = sjcl.encrypt("myPassword","myMessage",{mode:"ccm",iter:1000,ks:128,ts:64,v:1,cipher:"aes",adata:"",salt:"myGeneratedSalt"});
var parsedMessage = JSON.parse(encryptedMessage);
delete parsedMessage.mode;
delete parsedMessage.iter;
delete parsedMessage.ks;
delete parsedMessage.ts;
delete parsedMessage.v;
delete parsedMessage.cipher;
delete parsedMessage.salt;
delete parsedMessage.adata;
encryptedMessageWithoutParameters = JSON.stringify(parsedMessage);

//Decrypt
var parsedMessage = JSON.parse(encryptedMessageWithoutParameters);
jQuery.extend(parsedMessage,{mode:"ccm",iter:1000,ks:128,ts:64,v:1,cipher:"aes",adata:"",salt:"myGeneratedSalt"});
messageWithParameters = JSON.stringify(parsedMessage);
var decryptedMessage = sjcl.decrypt("myPassword",messageWithParameters);

//Result > "myMessage"

Con un problema añadido: hay datos que no tenemos, al menos accesibles fácilmente.

También se utiliza un otro tipo de ¿cifrado? que se llama HMAC SHA256. De hecho, me ha parecido verlo cuando se inicia la sesión a la hora de autenticar el usuario y contraseña. Pensé que algo de esto lo podrían estar utilizando pero como he ido diciendo, me ha superado. 

Más datos relacionados con los cifrados. Os conté que había una variable en javascript llamada sys_encryption_key. Su contenido va cambiando. Pero lo curioso es que en algún momento encontrando otra variable llamada salt contenía el mismo valor. 

También me pareció muy curioso que con dos ficheros extraídos con la misma contraseña de cifrado y mismo comentario, me encontré con que sus hashes no coincidían. Y a pesar de que en el Notepad++ podían parecer iguales después utilizando HxD para comparar los dos era evidente que no lo eran.

Otras ideas que pueden parecer buenas son no poner contraseña, algo que la interfaz te impedirá. Realmente te impide poner contraseñas no seguras. Pero como el control es por javascript, te lo puedes saltar. Por lo tanto, pensar que dejar vacía la cadena de la contraseña hará que no se cifre el fichero funcionará... No es así. Se sigue cifrando. Y no: forzar a que esa variable esté a null tampoco funciona. Sí me dio la sensación de que al menos que la primera línea del texto cifrado tenía una estructura distinta. Pero eso no significa nada. 

Como podéis ver, buscar cómo descifrar el fichero tiene muchos frentes. Y muchas ideas para abordarlos pero ninguna ha dado sus frutos.

Puerto serie

Se sabe que la placa del router, desde dentro de la carcasa, tiene un puerto serie.

Sercomm FG824CD: puerto serie interno
Sercomm FG824CD: puerto serie interno

Para poderlo utilizar haría falta un adaptador USB a TTL con chip FTDI FT232RL como este de Amazon. En teoría, la configuración de un cliente como Putty o MobaXTerm para que se pueda interactuar con el router sería la siguiente:
  • Paridad (parity): None
  • Flow control: None
  • Stop: 1
  • Data: 8 bits
  • Velocidad: Probé con 9600. 

Al menos eso me pareció entender en su momento. No obstante, tal y como comentaban en alguna de las muchas fuentes que puse, no acaba de funcionar pegando los cables ni siquiera con cinta aislante. De hecho, cuando leí que lo habían hecho sujetando los cables con los dedos me dije: "probemos con cinta aislante que será más estable". A parte de la dificultad de dejar los cables bien colocados con el tiempo que se invertía en conseguir que todos estuviesen alineados, nada. No hubo forma. También hice la prueba sin cruzar los cables Tx y Rx ya que podía ser que estuviesen mal etiquetados en alguno de los dos puntos. En alguno de los wikis de OpenWRT para los routers Sercomm venían a decir que había que enviar un carácter para que se iniciara la consola. No hubo suerte. Lo que sí me pareció entender cuando puse un polímetro muy, muy básico en alguno de esos pines es que sí que circulaba corriente. O al menos, que esos pines de puerto serie no estaban para hacer bonito. 

Así, este punto tiene varios frentes para probar (y no son excluyentes):

  1. Soldar pines como debe de ser. Así se controla mejor que los cables se conectan correctamente y estar seguros de que se están haciendo bien las pruebas.
  2. A lo mejor con un módulo Arduino ESP8266 o ESP32...

Burp

El otro día proponía tirar de Burp Proxy por si ayudaba en algo. Por un lado, para evitar los problemas en los que el sistema decide eliminar la modificación en memoria que lo haga automáticamente está muy bien. Pero hay que deshabilitarlo al iniciar sesión, porque si no, el usuario que se estará pidiendo es el de admin.

En proxy --> options:

Modificando requests y responses del Sercomm FG824CD

He hecho la captura tal y como la tenía. Como decía, la request que sustituye "1234" a "admin" hay que deshabilitarla al iniciar sesión. También me ha ayudado a averiguar que algunos de los parámetros permitían ver todas las opciones del menú estado y soporte.

De los que están hablitados en la captura, sys_dropDownBasExp puede recibir "basic" o "expert". 

Así, tenemos acceso a un menú con herramientas de diagnóstico.

Sercomm FG824CD: Estado y soporte - Ampliado
Sercomm FG824CD: Estado y soporte - Ampliado

La verdad es que no he podido utilizar muchas de estas. He ido a las que me interesaban:
  • Diagnóstico VoIP: Aunque tiene dos botones, no reaccionan. Como si no hubiese permisos.
  • Captura de paquetes: Funciona. Al menos los dos minutos que lo usé muy bien. Para cacharrear y ver qué se puede sacar...
  • Port mirroring: otro que no he probado pero quiero ver cómo funciona. 
  • Registro de depuración: genera unos ficheros .tar pero después de descomprimirlos están vacíos.
Y para finalizar la entrega de hoy, el registro de eventos da información interesante. El problema para que se muestren los datos en las secciones "ocultas" del teléfono, era, evidentemente, los permisos:

Sercomm FG824CD - Estado y soporte , Registro de eventos
Sercomm FG824CD - Estado y soporte , Registro de eventos


 El tipo de permiso, 0x08, es el que hace falta para poder ver esos datos. Me pregunto dónde estará la interfaz que permita crear usuarios y darles permisos. Si es que realmente existe.

- - - - 

Creo que de momento lo voy a dejar aquí. Cacharrearé un poco más con el port mirroring y la captura de paquetes. Algún datillo ya he podido sacar. 

- - - - 

Algunas fuentes de interés, hayan podido ayudar (o no):

VoIP MasMovil: Es cierto que con esto estoy indicando qué operadora tengo aunque lo he estado ocultando en las capturas. Y también que hay algún dato que me chirría un poco, pero bueno. Si os funciona con vuestro router... https://bandaancha.eu/foros/tutorial-configurar-telefono-otro-1739761

Gestión del router desde la consola del navegador. Por ejemplo: habilitar ssh para el usuario normal (1234); https://github.com/ezruneko/masvoz-sagemcom-fast-5355-hacks#acceso-ssh

SCJL demo (ya enlazado arriba): https://bitwiseshiftleft.github.io/sjcl/demo/

Recursos relacionados con HMAC: https://blog.pentesteracademy.com/cracking-hmac-sha1-key-with-hashcat-d440ac7919db , https://www.attackdefense.com/challengedetailsnoauth?cid=53https://laseguridad.online/questions/27128/usando-hashcat-para-romper-hmac-sha256

Recursos en python de Sercomm: https://frickel.cloud/firmware/openwrt/-/tree/master/scriptshttps://frickel.cloud/firmware/openwrt/-/blob/master/scripts/sercomm-crypto.pyhttps://frickel.cloud/firmware/openwrt/-/blob/master/scripts/sercomm-partition-tag.py ,  https://frickel.cloud/firmware/openwrt/-/blob/master/scripts/sercomm-payload.py 

viernes, 8 de enero de 2021

Router Sercomm FG824CD I

Disclaimer: 

  1. Mucho ojo con lo que se hace, que te podrías quedar sin conexión, o incluso, sin router. Ten en cuenta que si tu operadora no te ha cobrado por él, te lo podrían pedir de vuelta, por ejemplo, al rescindir el contrato con ellos. 
  2. En lo que quería hacer, no he tenido éxito. Aunque alguna cosilla interesante sí que he podido avanzar.
  3. He hecho tantos intentos y pruebas que espero que este post no sea muy caótico. Evidentemente es muy difícil poder poner todo en el orden en el que he hecho esta investigación, que como indicaba, no ha dado todos los frutos que cabria esperar. No obstante, si alguien quiere darle una vuelta, bienvenido sea. 

---

Hace un tiempo que cambié de proveedor de internet y me pasé a fibra óptica. Después de que me tiraran el cable de una manera impecable (entre que yo estaba pendiente, le eché un cable, y el que lo hizo me dio la sensación de que sabía) me puso el router y me lo dejó bien instalado. A partir de ahí, ya me tocaba a mí hacer las configuraciones a mi gusto.

Lo primero de todo me tocó mirar qué router era. En mi caso, un Sercomm FG824CD. 

En la pegatina que hay debajo indican que el usuario para hacer los cambios es 1234 con contraseña 1234. La única manera de gestionarlo, en principio, es con un navegador. Este es un usuario normal, sin muchos poderes. 

Mi consejo es que para evitar que investigando se cierre la sesión quitar la restricción:

Sercomm FG824CD: quitando tiempo de cierre de sesión
Sercomm FG824CD: quitando tiempo de cierre de sesión

La aplicación web desde donde se administra el aparato muestra los contenidos en base a una variable de javascript: usermode. Se sabe que puede tener dos valores: enduser y admin. Cambiar el valor de esta variable es una de las opciones que se encuentran en bastantes foros. Pero hay más datos y variables que son interesantes cambiar. Por lo tanto, iniciando sesión con este usuario (1234), inspeccionamos cualquier componente de la aplicación web (botón derecho del ratón sobre uno, seleccionar inspeccionar). Desde la pestaña sources abriremos el fichero mainFunctions.js y buscaremos la línea

usermode = getUserData('usermode', data);

Al encontrar esta línea, la marcaremos con un punto de ruptura. He de decir que yo tengo un montón más. Pero de momento, este nos sirve. Al volver a cargar la página nos deberíamos de encontrar con algo como esto:

Sercomm FG824CD - Cambiando valores en sus variables
Sercomm FG824CD - Cambiando valores en sus variables

Los valores de data se pueden cambiar tanto desde el propio código fuente (poniendo el puntero encima y esperando a que los muestre) o desde el panel de la derecha, permitiendo modificar todos los deseados (incluso bajando el scroll). Indicaré los que suelo cambiar, aunque la verdad, algunos puede que no tengan mucho sentido porque se vayan a sobreescribir:

  • data.username: admin
  • data.usermode: admin
  • data.dropDownBasExp: aunque le ponía "1", realmente en algún punto busca si tiene basic o expert. Tampoco he llegado a ver qué cambios se realizan al modificar este valor. Pero puede ser importante.
  • data.devRunMode: route o bridge. Este no lo modifico, pero puede ser interesante que permita ponerlo en modo bridge. Si alguien quiere probar...
  • data.debug_fw_flag: "1"
  • csrf_token: No lo modifico, pero es un dato importante para posibles ataques. Al menos la variable lo es. 
  • isSecureContext: true o false. La verdad, apenas he cacharreado con este valor, pero buscando ahora qué otras variables he toqueteado, me suena que sí lo hice en alguna ocasión sin muchos resultados. También puede ser importante.
  • sys_*: Las mismas variables que se ven en la captura que les asignará los valores de data están aquí. No voy a negar que en algún punto las suelo mirar por si acaso y fuerzo el valor. 
  • usermode: Sí, es cierto, en algún sitio si veo que no tiene lo que quiero le asigno el valor desde aquí.
Un pequeño problema que tiene asignarlo es que cada vez que se confirma el nuevo valor se recarga todo ese panel de nuevo. 

Todos estos cambios permiten que la interfaz gráfica te muestre unas pocas cosas más. Pero la validación del usuario a todas luces se puede afirmar que la hace el servidor. No obstante, también se puede llegar a pensar que cambiando el usuario en la cookie de sesión también nos ayudará. No lo tengo muy claro, pero al menos, tener este cambio no hace daño:

Sercomm FG824CD: Cambiando cookie
Sercomm FG824CD: Cambiando cookie

También es importante: de vez en cuando, y de una forma que no he llegado a averiguar cómo y por qué, al rato el usuario vuelve a ser 1234.

Con estos cambios podremos ver algún que otro menú más. Por ejemplo, si queremos ver los datos relacionados con el teléfono:

Sercomm FG824CD: Menú del teléfono
Sercomm FG824CD: Menú del teléfono

Con los cambios realizados, veremos que menú de la izquierda aparecen 4 selecciones en vez de la primera de todas que aparecería sin manipular los valores para """elevar"""(sic) privilegios. A su vez, el administrador tendrá censurados los teléfonos de la lista (tal y como se puede ver en la llamada inferior.

Si seleccionamos "configuración de llamadas" podremos ver los distintos servicios de telefonía que se pueden habilitar y deshabilitar: retención de llamadas, llamada en espera, llamadas a tres...

El menú "configuración básica del teléfono" es el que nos podría interesar para ver los datos de acceso VoIP. Pero por desgracia los datos están en blanco. He intentado por activa y por pasiva buscar los datos en unas cuantas variables pero no he sido capaz de descubrir si es que el servidor no los devuelve directamente, si es cuestión del tipo de usuario que a nivel de servidor lo devuelve o no...

Sercomm FG824CD: Configuración básica del teléfono
Sercomm FG824CD: Configuración básica del teléfono

Los "ajustes VoIP", que configuran entre otras cosas los codecs, tiempos de sesión, etc también aparecen vacíos. 

Revisando un poco lo que hice en su momento (y que parece que descarté toquetear más, pero me lo voy a replantear) en la librería jquery-1.7.1.min.js tengo algunos puntos de ruptura. Entre otros, una función que se marca como empty (en la línea 3242)  A su vez, esta llama a cleanData. Estos métodos parece que navegan por una estructura html. Por lo que veré si soy capaz de pegarme más con resultados, pero creo que lo haré en otro momento.

En la sección configuración también se muestran más o menos elementos en el menú de la izquierda según tengamos el usuario como administrador o como enduser. Aquí tenemos unas cosas para investigar.

La constraseña

Sercomm FG824CD: Gestión de contraseñas
Sercomm FG824CD: Gestión de contraseñas

Aquí se permite actualizar la contraseña del usuario que está iniciando la sesión (tal y como se podía ver en la primera captura) pero si tenemos cambiada la variable para que el navegador se crea que es un administrador, se muestra un combo con los posibles usuarios. Y de eso me he dado cuenta ahora, porque creía que sólo me mostraba uno por ser un usuario normal. O a lo mejor es así: el navegador muestra el combo con un sólo usuario pero hay más. En este caso, solo aparece uno. 

Compartir contenido

Sercomm FG824CD: Compartir contenido (por USB)
Sercomm FG824CD: Compartir contenido (por USB)

Con un pincho USB conectado, se puede compartir contenido por varias vías: Samba, DLNA (para contenido multimedia) y FTP. Este era otro punto de entrada para recuperar información. Lo normal es que al navegar por los recursos compartidos la raíz empiece justo antes del recurso. Solo lo he hecho con un pincho tanto por samba (con linux, en Windows se queja de que la versión del protocolo no es segura) y por FTP. Aparecería algo así como /A/datosEnRaizDeDispositivo. He encontrado un manual en github para otro modelo de router de la misma marca que a partir de varias manipulaciones se consigue navegar por todo el árbol de directorios. Lo intenté una cuantas veces pero nada. Es otra línea de ataque. Lo que parece que no acaba de funcionar es el poner un enlace simbólico hacia /etc/samba/smb.conf. Aunque en el manual sí ponen algo que está relacionado con esto.

Configuración (bis)

Tenemos otro submenú que también se llama configuración. Este es muy interensate y permite ver que siempre se cargan componentes que a través de los estilos los ocultan. Aquí tenemos un buen ejemplo. Esta sección es la que permite guardar un backup de la configuración o cargarlos en caso de necesidad. Además de resetear el router con los valores de fábrica. 

Sercomm FG824CD: Backup y restauracion de configuración, nivel básico
Sercomm FG824CD: Backup y restauracion de configuración, nivel básico

Tal y como se puede ver en la captura, hay varios componentes que tienen este valor. Pero no se le puede quitar a todos, como el que he marcado en rojo, porque ese es un popup que sale con alguno de los eventos de los botones y molestaría en la pantalla. Quitando los estilos necesarios conseguiríamos lo siguiente:

Sercomm FG824CD: Backup y restauracion de configuración, nivel "administrador"
Sercomm FG824CD: Backup y restauracion de configuración, nivel "administrador"

Como se puede ver, nos ofrecen, tanto para el administrador como para un usuario normal, la posibilidad de exportar la configuración guardando el fichero de configuración en diversos medios: en una ruta del PC utilizando una contraseña, en un USB conectado en el router o en la propia memoria del router. El problema está en que guardarlo en el PC no he encontrado la manera de descifrar el contenido del fichero. Alguna de las fuentes indica que encontró que la clave podía ser algo así como md5(claveSecreta + nuestraPassword). Pero mientras se analizan las trazas que se generan al recargar las páginas encontramos con que trabaja con sha256 y scjl. El fichero tiene unas cabeceras en texto claro y después el contenido completamente cifrado:

Sercomm FG824CD: Fichero de configuración
Sercomm FG824CD: Fichero de configuración

Buscando alguna pista me encontré en sha.js un salt con para la contraseña de acceso que ponía $1$SERCOMM$. ¡Ah! Está relacionado con hmac. Que me pareció leer que también tiene que ver con temas de cifrado. De paso, vemos más scripts por los que pasa al hacer login:

Sercomm FG824CD: sha256 y el salt
Sercomm FG824CD: sha256 y el salt

Para resumir esta parte: si le he invertí mucho tiempo para ver si encontraba cómo descifrarlo sin éxito. Es más: al subir el fichero cifrado, parece que a la hora de descifrarlo lo hace a nivel de servidor. ¿Seguirá el mismo patrón y no lo he visto o hará una cosa totalmente distinta? No me quiero olvidar que hay variables que pueden ayudar: dk o sys_encryption_key. Si bien es cierto que parece que no son estáticas. 

Con lo que respecta a guardarlo en el USB o en el router, el fichero no se guarda realmente en el USB. 

TR-069

A la izquierda se puede ver que también está la opción de configurar el TR-69. Tal y como estamos ahora, todo aparece como que no está configurado. No obstante, ya se verá qué se puede hacer en este caso.

Control de acceso

Esta sección también es muy interesante. Es la que permite configurar de qué forma se puede acceder al router: http, https, ¿ssh?, ¿telnet?. 

Sercomm FG824CD; Control de acceso: http, https, ssh, telnet
Sercomm FG824CD; Control de acceso: http, https, ssh, telnet

Lo normal es que aparezcan sólo http y https. Aunque algunas veces que tenía puesto (en teoria) el usermode a admin no me salía ssh, no sé cómo ahora sí que me lo ha puesto. De todas formas, tal y como he marcado en la captura, su style solía estar a display: none. Lo mismo da: tanto el de ssh como el de telnet (que este sí que está oculto) no se actualizan a nivel de servidor cuando se modifican sus valores. 

GPON

Aquí tenemos la configuración del GPON para la conexión de fibra. Entre otras cosas, la contraseña.

Sercomm FG824CD: Configuración GPON
Sercomm FG824CD: Configuración GPON

Para ver el valor real de la contraseña, entre otras cosas, se puede cambiar el type del input de password a text. Y ya la tendríamos, permtiéndonos probar otro router con GPON para sustituir el que nos entregaron en la operadora.

LAN Switch

Los valores interesantes que nos ofrece son el de cambiar el modo del dipositivo, de router a bridge y viceversa. Creo que esto nos podría ayudar a poner este aparato como sólo GPON y otro adicional como router (antes Telefónica hacía esto: dos trastos para el acceso a internet y el teléfono).

* * *

En el menú principal tenemos la sección estado y soporte. Del menú que ofrece a la izquierda uno que da información muy interesante es el de "acerca de" porque nos muestra absolutamente todos los módulos que están obligados a publicitar. Entre otros CUPS, Samba, minihttpd, DNSMasq, OpenSSL y MiniUPnP. Sabiendo las versiones que tiene instaladas se pueden buscar posibles ataques remotos a los distintos servicios.

Una cosa curiosa que no he contado antes y que lo iba a hacer en una siguiente entrega, pero mejor aquí. Se sabe que si se desconecta el cable de fibra y se resetea el router al estado de "fábrica" se tiene acceso al usuario administrador: admin/admin. En mi caso, lo de hacerlo con el clip y el botón trasero de reset no funcionaba. Eso es otra historia porque también lo hice de un montón de formas (incluyendo el 30/30/30) y ni por esas. A ver que me voy por las ramas:

El menú de la izquierda de esta sección muestra más opciones estando reseteado. O eso me pareció en ese momento. Pero no tengo la captura. :( Pero no tengo muy claro que esas secciones me fuesen a ayudar.

* * *

Sé que me estoy dejando cosas en el tintero. El lío con el puerto serie que tiene dentro, algunas pruebas para subir los ficheros de configuración... Esas cosillas. 

Si tenéis ideas para abordar todo lo que estoy explicando aquí, por favor, no dudéis en ponerlas en los comentarios. 


* * *

Líneas de ataque para seguir probando:
  1. Manual Github para datos compartidos por samba; Entre otras herramientas que podrían ayudar: curl, burp.
  2. JQuery: Entre otras herramientas que podrían ayudar: burp, para forzar a usar un jQuery local, modificar el que carga en memoria (por el método response)...
  3. Descifrar los ficheros de exportación. 
  4. TR-069: Buscar otro trasto que permita que se configure por TR-069 para sacarle los datos: otro router (entonces, ¿para qué mantener el que nos dieron?), una máquina virtual, un teléfono VoIP...
  5. Soldar los pines en los terminales del puerto serie interno para facilitar el análisis de cómo funciona y cuándo se puede utilizar si es que realmente se puede. Sobre todo la idea es conseguir un acceso que incluso permita navegar por el árbol de directorios. Aunque sólo sea en modo lectura, ya ayudaría a poder destripar más la aplicación web y ver qué más se puede hacer.
  6. Botón gordo: tirar de alguna herramienta como ZAP para lanzarle ataques a la interfaz web y ver si encuentra algo. 
- - - - -

Aunque algunas cosas las descubrí por mi cuenta, sí que hay fuentes que las indican y dan más pistas de qué se puede hacer:

https://medium.com/@ioxoi/configurando-en-modo-monopuesto-bridge-la-otn-router-sercomm-fg824cd-de-pepephone-c04024f08ce3

https://bandaancha.eu/foros/router-ont-integrada-ftth-neba-1732436

https://hacks4geeks.com/hack/acceso-completo-al-router-sercomm-vox-2-5-de-vodafone/

https://naseros.com/2020/07/14/como-extraer-clave-gpon-y-sip-del-sagemcom-fast-5655v2-de-masmovil-pepephone-y-yoigo/

https://www.reiniciapc.com/cambiar-el-router-de-fibra-por-uno-neutro/

https://www.adslzone.net/foro/vodafone.108/consigo-clave-usuario-admin-router-sercomm-fg824cd.494244/






Ejemplo de cifrado/descifrado de TP-Link. Podría ayudar:


Un eploit de un backdoor en routers Sercomm: