domingo, 10 de enero de 2021

Router Sercomm FG824CD II

[upgrade 23/04/2021]

Hace ya casi cuatro meses que empecé esta investigación, al menos a documentarla. Hace aproximadamente dos semanas y pico el avance que he hecho ha sido, a mi modo de ver, brutal. Las entradas sobre el Sercomm FG824CD IV y V muestran el avance necesario para al menos recuperar algunos datos interesantes, como por ejemplo la contraseña que se le da al usuario "admin". 


Eso no significa que las anteriores entregas no sirvan. Simplemente se muestran las distintas vías por donde se ha intentado resolver el problema y los resultados obtenidos. Eso sí: todas las entradas pueden tirar de algo de conocimiento mostrado en las anteriores independientemente del éxito que se hubiera obtenido.


Recuerda: dado que se entiende que el router es propiedad de la operadora (a no ser que el contrato diga lo contrario) no se le puede hacer cualquier cosa. Instalar un firmware de por ahí, borrar directorios o ficheros... Hagas lo que hagas siempre es bajo tu responsabilidad. 

[/upgrade 23/04/2021]

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 

2 comentarios:

  1. Hola, sigo muy de cerca los dos artículos del Sercomm fg824cd que publicas. Tengo el mismo router y he hecho prácticamente idénticas pruebas a tí. Para reset con botón trasero pulsar unos 30 segundos, soltar y volver a pulsar seguido, en menos de 10 segundos se apagan leds y se reestablece. Posteriomente admin/admin y puedes ver todos los datos antes de la telecarga, no es mucho pero al menos, puedes saber lo que hay y no hay que estar inyectando "usermode=admin" en consola todo el rato. Creo que debe haber algún usuario más avanzado pues hay apartados como activación de servicios ssh y telnet que siguen ocultos como admin e incluso aunque dice admitir y aplicar cambios, no es así. Si quieres contactar y seguir invenstigando....

    ResponderEliminar
    Respuestas
    1. Muchas gracias por el mensaje.

      El problema está en que yo ya intenté resetearlo con el botón de diversas formas (tal y como contaba en alguno de los dos posts) no lo hacía. Tampoco es viable estar reseteando el aparato muchas veces para tener que reconfigurarlo con sus direcciones IP, Wifi, etc... No sé. Tal y como estábamos poniendo los dos, entrando como "admin/admin" no he visto grandes cambios con respecto a inyectarlo, a parte de mostrar el usuario y una contraseña cifrada y codificada en base64.

      En algo tienes razón: hay mínimo otro usuario más, dado que "1234" tiene el "value" a "2". Toca seguir buscando. Son muchas fuentes y cosas con l

      Hay que pegarse más. A ver qué se nos ocurre.

      Eliminar