sábado, 3 de julio de 2021

Cómo configurar FreePBX para Masmovil

Después de conseguir el acceso al router Sercomm FG824CD y obtener los datos de acceso al servidor SIP no quedaba otra que configurar mi FreePBX para tirar de este servidor. Así podría quitar (o no) el ATA LinkSys SPA3102.

A pesar de que ya lo he hecho para otros servicios, incluyendo el ATA, el conseguir hacer el "register" me costó mucho tiempo. Accediendo a la consola de asterisk tenía activado el debug:

# asterisk -r
sip set debug [on | trunkName ]


Según el instante lo puse tanto probando con on como con el nombre del trunk entrante (inbound trunk) .
Uno de los manuales principales que me ha guiado ha sido el de ADSLZone. No obstante, como ya decía, no acaba de funcionar del todo.

*** Register ***

Con respecto al register existen distintos formatos:

register => user[:secret[:authuser]]@host[:port][/extension]
register => fromuser@fromdomain:secret@host
register => fromuser@fromdomain:secret:authuser@host:port/extension


Lo siguiente es tener claro cuáles de los todos los valores que fuimos obteniendo se corresponden con esos valores. Porque, y aquí está donde me hice el lío (y la verdad, posiblemente me lo siga haciendo. Pero sabré por dónde van los tiros).
  • DigestUserName: e34[teléfono]@evisemad.yoigo.com.
  • fromuser@fromdomain: +34[teléfono]@ims.masmovil.com. Como podéis ver, esto es el DigestUserName.
  • fromuser: +34[teléfono].
  • fromdomain: ims.masmovil.com.
Este es el ejemplo genérico que ponen en el manual:

"DigestUserName":"AuthPassword":"DigestUserName"@[proxy]/[TEL]

Por lo que quedaría algo así:

+34[teléfono]@ims.masmovil.com:[p@$$W0rd]:e34[teléfono]@evimsemad.yoigo.com:5060/+34[teléfono]~3600

Si supierais la de combinaciones que hice pensando que el resultado que me devolvía era un error... Aunque catalogué cada formato no lo hice con los mensajes. Eran los mismos:

[2021-05-30 11:27:39] NOTICE[445]: chan_sip.c:15828 sip_reregister: -- Re-registration for +34[teléfono]@evimsemad.yoigo.com

[2021-05-30 11:27:39] NOTICE[30765]: app_queue.c:9096 reload_queue_rules: queuerules.conf has not changed since it was last loaded. Not taking any action.

[2021-05-30 11:27:39] NOTICE[445]: chan_sip.c:24840 handle_response_register: Outbound Registration: Expiry for evimsemad.yoigo.com is 2390 sec (Scheduling reregistration in 2375 s)


Estas líneas no significaban que el register estuviese mal. Y yo emperrado en que sí.

Lo dicho: tirad del formato que os pongo y os hará que el register funcione.

*** Outbound trunk ***

Esta configuración es la que está relacionada con las llamadas salientes. Aquí la muestra de un error que cometí:
  1. fromuser=e34[teléfono]@ims.masmovil.com
  2. fromuser=+34[teléfono]
Con la primera opción intenté hacer una llamada que no funcionó. El debug me devolvió el siguiente mensaje de error:

[2021-05-30 11:41:35] WARNING[445][C-0000001c]: chan_sip.c:24304 handle_response_invite: Received response: "Forbidden" from '<sip:e34[teléfono]%40ims.masmovil.com@ims.masmovil.com>;tag=XXXXXXXXX'

Por lo que hice alguna prueba más cambiando ese parámetro en concreto. Así es como en mi caso tengo la siguiente configuración. ¿Qué se podría hacer mejor? Seguro que sí. Pero de momento cumple su función:

type=peer
timeout=3600
sendrpid=yes
secret=[password]
registertimeout=3600
qualify=no
port=5060
outboundproxyport=5060
outboundproxy=evimsemad.yoigo.com
nat=force_rport,comedia
insecure=port,invite
host=ims.masmovil.com
fromuser=+34[teléfono]
fromdomain=ims.masmovil.com
dtmfmode=rfc2833
disallow=all
directmedia=no
defaultuser=+34[teléfono]@ims.masmovil.com
context=from-pstn
authname=+34[teléfono]@ims.masmovil.com
auth=+34[teléfono]@ims.masmovil.com
allow=alaw,gsm



*** Inbound trunk ***

En este caso empecé con los parámetros que se muestran en el manual pero después revisando el debug conseguí no tener que configurar un nuevo trunk.

Hice una prueba muy aproximada de lo que tenían en el manual:

username=+34[teléfono]
type=peer
trustrpid=yes
timeout=3600
sendrpid=yes
secret=[password]
registertimeout=3600
qualify=no
port=5060
outboundproxyport=5060
outboundproxy=evimsemad.yoigo.com
nat=force_rport,comedia
keepalive=30
insecure=port,invite
host=ims.masmovil.com
;host=evimsemad.yoigo.com
fromuser=+34[teléfono]
fromdomain=evimsemad.yoigo.com
dtmfmode=rfc2833
disallow=all
directmedia=no
context=from-pstn
allow=alaw,gsm


Y me devolvio el siguiente error:

[2021-06-04 21:22:13] NOTICE[445][C-00000028]: chan_sip.c:26605 handle_request_invite: Failed to authenticate device <sip:[unMóvil]@[IPAsterisk]>;tag=XXXXXXXXXXXXXXXX

[2021-06-04 21:22:16] WARNING[3337][C-00000027]: app_dial.c:2507 dial_exec_full: Unable to create channel of type 'SIP' (cause 20 - Subscriber absent)


La verdad no recuerdo si encontré otros mensajes diferentes. Pero acabé haciendo otros cambios:

username=+34[teléfono]
authname=+34[teléfono]@ims.masmovil.com
auth=+34[teléfono]@ims.masmovil.com
callerid=+34[teléfono]
type=peer
trustrpid=yes
timeout=3600
sendrpid=yes
secret=[password]
registertimeout=3600
qualify=no
port=5060
nat=force_rport,comedia
keepalive=30
insecure=port,invite
host=evimsemad.yoigo.com
fromuser=+34[teléfono]
fromdomain=evimsemad.yoigo.com
dtmfmode=rfc2833
disallow=all
directmedia=no
context=from-pstn
allow=alaw,gsm


Y ya estaría. Como decía con esta configuración ya no hace falta crear otro trunk adicional tal y como indican en el manual.

Como comentario adicional: he visto este mensaje con la corrección que ahora os contaré. Pero sólo con un teléfono de esos de spam, algo raro porque con mi móvil conseguí que no saliera.

Sólo hay una cosa curiosa que sucede cuando llegan unas llamadas y que tendré que buscar qué parámetro tengo que añadir o qué valor tengo que darle (si es que ya lo tengo en mi configuración). Cuando llegan las llamadas el origen llega con un formato como el siguiente:

[miMóvil];phone-context=+34

También es otra rara: he visto que el teléfono que os decía aparecía sin este formato. 

*** Otros ***

Algunas de las correcciones o búsquedas que hice, además de activar el debug para ver en directo qué mostraba la consola de asterisk al entrar la llamada hice una comparáción desde Wireshark de un tcpdump desde la centralita a la hora de hacer el register con otro .pcap generado por el propio router.

También quisiera comentar que he tenido configurado uno de los teléfonos IP conectados al servicio de VoIP de la operadora y a mi asterisk a la vez. Evidentemente el sistema se liaba: empezaba con la centralita y a los dos segundos saltaba el teléfono y la centralita no acababa de mostrar que se había producido esa llamada. 

sábado, 8 de mayo de 2021

Router Sercomm FG824CD VI - Acceso SSH y más

 Antes de empezar con esta sexta entrega en la que se destripa el Sercomm FG824CD:

  • Recuerda: cualquier cosa que hagas podría dejar inservible (o no) el dispositivo donde lo apliques. Todo lo que suceda será tu responsabilidad.
  • A no ser que el contrato diga lo contrario piensa que el propietario del router es tu operadora. Por lo que ojo que si no tienes cuidado te podrían acabar cobrando incluso el router. Y solo es un ejemplo. O quedarte sin conexión y cobrarte un router un nuevo o... 
  • Si no se tiene cuidado se podría estar abriendo el acceso el router al mundo. Mucho ojo cómo se deja y las credenciales que se gestionan en el mismo.
  • El resumen es que las manipulaciones que vayas a hacer se tienen que hacer con sumo cuidado y no eliminar ningún fichero ni directorio. 
Siguiente: ¿Os acordáis del proxy que utilicé en la entrega V? Este proxy TR-069 está modificado tal cual lo dejé en la anterior ocasión. El código que hay que añadir está precisamente en ese post. Hay una excepción. Si nos fijamos el paquete trae un fichero llamado injectiondata.xml. En la anterior ocasión ya lo tenía modificado pero no me funcionó. Y hoy revisando algunos resultados me he encontrado con un mensaje de error relacionado con esta inyección. 

<ParameterName>InternetGatewayDevice.X_SC_Management.ShellEnable</ParameterName>
<FaultCode>9800</FaultCode>
<FaultString>Same Parameter Multiple Times</FaultString>

Lo que me ha forzado a revisar el fichero que permite hacer la inyección. Y en efecto así era. Por lo tanto le he cambiado el ParamName:

</ParameterValueStruct>
<ParameterValueStruct>
    <Name>InternetGatewayDevice.X_SC_Management.ShellEnable</Name>
    <Value xsi:type="xsd:boolean">1</Value>
</ParameterValueStruct>
<ParameterValueStruct>
    <Name>InternetGatewayDevice.X_SC_Management.AccessControl.SSHStatus</Name>
    <Value xsi:type="xsd:string">Enabled</Value>
</ParameterValueStruct>
<ParameterValueStruct>
    <Name>InternetGatewayDevice.X_SC_Management.AccessControl.SSHMode</Name>
    <Value xsi:type="xsd:string">LAN</Value>
</ParameterValueStruct>
<ParameterValueStruct>
    <Name>InternetGatewayDevice.X_MASMOVIL_COM.Users.User.2.Permission</Name>
    <Value xsi:type="xsd:string">web,cli,ftp,smb</Value>
</ParameterValueStruct>
<ParameterValueStruct>
    <Name>InternetGatewayDevice.X_MASMOVIL_COM.Users.User.2.Group</Name>
    <Value xsi:type="xsd:string">admin</Value>
</ParameterValueStruct>
<ParameterValueStruct>

Aunque son casi autoexplicativos aquí estamos haciendo lo siguiente:
  • Habilitamos la shell. No he probado a ponerlo a disabled. Pero entiendo que es dar acceso a tener una shell en caso de ser necesario.
  • El SSHStatus nos permite habilitar el servicio para el ssh.
  • El SSHMode: este es importante. Al recuperar los resultados del TR069 he visto que ServerNameMode puede tener: wan, LAN, ALL y none.
  • Permisos: por defecto el admin tiene web,cli y 1234 tiene web,ftp,smb.
  • El grupo de User.2 se le asigna a admin. Que da la casualidad que es el mismo nombre que el principal admin.
No añadas ni quites ramas si quieres que funcione tal cual. En el caso que quieras inyectar más o menos parámetros tendrás que hacer cambios en el fichero app.py. Busca la cadena cwmp:ParameterValueStruct[7] y sustituye el 7 por el valor que corresponda: 2 + númeroDeRamasAInyectar.

Una vez tengas configurado este fichero sólo queda ejecutar el proxy y configurar el cliente TR069 tal y como expliqué en el anterior post. En cuanto se vea que se han aplicado por completo los cambios mirando los datos que devuelve la consola donde estamos ejecutando el proxy ya lo podemos parar. A partir de aquí podremos buscar la contraseña del administrador por si nos la han cambiado ya que nos hará falta. No obstante el usuario 1234 también sirve.

En mi caso lo primero que he hecho ha sido lanzar un nmap contra mi router:

nmap -sS -sV -O -vvvv -T4 10.0.0.1

Obteniendo como resultado los típicos servicios del DNS, HTTP(S) y UPnP:

Sercom FG824CD - nmap: SSH, dns, http(s) y UPnP
Sercom FG824CD - nmap: SSH, dns, http(s) y UPnP

Además de conseguir elevar privilegios para el usuario 1234 la idea era tener acceso por ssh. Y así ha sido. Para iniciar sesión toca poner el usuario y la contraseña pero después recarga la consola y vuelve a pedirla. 

Sercomm FG824CD - Accediendo por ssh
Sercomm FG824CD - Accediendo por ssh

Lo que ya nos permite identificar el menú de ayuda. Entre otros la shell inicial donde nos muestra el menú de ayuda para saber cómo interactuar con el router. Aunque ya he trasteado un poco el que podría ser el más importante de todos que evidentemente es sh dándome la posibilidad de interactuar directamente con el sistema tampoco me ha parecido mal después mirar el resto de opciones con detenimiento antes de volver al sh:

Sercomm FG824CD - Menú en el ssh
Sercomm FG824CD - Menú en el ssh

Para cada uno de los menús por donde he estado yendo he ejecutado quit para regresar al menú anterior. De momento lo más interesante que me he encontrado ha sido en el menú net donde he podido ejecutar ifconfig e iptables -L. De hecho, el de iptables ha soltado tal cantidad de datos que he acabado cancelando.

Con respecto a ps me he encontrado con que algunos servicios se están ejecutando con permisos del usuario superadmin que además me lo he encontrado en algunos ficheros cuando estaba cotilleando en con la shell. Y será objeto de más análisis. De los procesos que me muestra están el servidor http mini_http y dnsmasq

El comando show devuelve un menú para recuperar más información del sistema. No obstante es como si mezclase la ayuda con la descripción:

Sercomm FG824CD - ssh - comando show
Sercomm FG824CD - ssh - comando show 

Ahora sí que sí he estado revisando el árbol de directorios:

Sercom FG824CD - ssh - ls /
Sercom FG824CD - ssh - ls /

Una vez he tenido la posibilidad de navegar por el árbol de directorios me he encontrado con que hay algunas rutas que tienen enlaces simbólicos a /tmp/ como por ejemplo la carpeta de /etc/samba o /mnt/shares (). Aunque verificándolo también tenemos a algunos en /var/ como por ejemplo /etc/resolv.conf o /etc/passwd.

Una sorpresa que me he llevado ha sido que al buscar con el comando mount qué estaba montado para hacer un dd (que también viene por defecto en el router) es que son varias memorias flash (mtdblock) las que están montadas. No obstante no me ha acabado de gustar cómo lo mostraba y se me ha ocurrido mirar el resultado con df:

Sercom FG824CD - ssh y df
Sercomm FG824CD - ssh y df

Además de hacer distintas imágenes de esos dispositivos guardándolos en el pincho USB que se encuentra en /dev/sda1 alguien podría decir que con sólo un cp -R serviría. Pero nos podríamos encontrar con que habrá ficheros que perdamos porque haya permisos que nos lo impidan aunque seamos administradores. O que al estar en uso dé un error y no podamos continuar. O que nos pasemos de listos e intentemos hacer una copia recursiva con resultados insospechados. No obstante si se quiere probar... 

Al intentar recuperar /dev/root la primera en la frente: no existe o no lo muestra como tal. He encontrado que con el comando lsblk me podía ayudar y así ha sido:

Sercomm FG824CD - Rutas de montaje con lsblk
Sercomm FG824CD - Rutas de montaje con lsblk

Sólo hay una ruta que no me está dando y es la de tmpfs. Revisando una vez más /etc/fstab parece que le indica que se monte en /dev/shm en vez de /tmp. Aunque después sí que se ve en es última ruta. Y es que según indican en fstab precisamente esa carpeta se borrará cuando se reinicie el router.

De momento he hecho el dd para cada una de las memorias flash que he identificado exceptuando el de tmpfs que da la casualidad que es el que más espacio tiene:

Sercomm FG824CD - Volcado dd de sus memorias
Sercomm FG824CD - Volcado dd de sus memorias

Sabiendo que la carpeta donde se montan los pinchos USB es un enlace simbólico que se dirige a /tmp:

Sercomm FG824CD - Comparación /mnt/shares con /tmp/shares
Sercomm FG824CD - Comparación /mnt/shares con /tmp/shares

se me ha ocurrido probar a desmontar el pincho y montarlo en la carpeta /mnt/nfs que ya existía pero no tenía ningún dispositivo montado. Esto me ha evitado tener que crear una nueva dentro del sistema de ficheros del propio router manteniendo la regla de no añadir ni eliminar cosas del aparato:

Sercomm FG824 - ssh: Montar y desmontar pincho usb en otra carpeta
Sercomm FG824 - ssh: Montar y desmontar pincho usb en otra carpeta

A pesar de que en la captura esté usando el comando mount hay que usar la siguiente instrucción dado que en caso contrario daría problemas a la hora de que se copien los ficheros y las carpetas:

# ntfs-3g -o rw,uid=0,gid=0,umask=000,iocharset=utf8,use_ino,direct_io,big_writes /dev/sda1 /tmp/shares/sda/A
# cp -aR /tmp /mnt/nfs/routerFS/carpetaTmp

Con esto ya tendría la copia de casi todo el contenido del router a excepción del proc y alguno que otro más. De momento estas son las cosas que he ido viendo ya sea desde la propia consola o analizando los ficheros que copiado. 

VoIP

La configuración del VoIP se encuentra en la ruta /var/voice/voip.conf. Además de los datos de autenticación, servidores, tiempos de espera, etc tiene una sección o ámbito donde muestra qué dispositivo se está conectando. Otro dato curioso es que indica con qué tarjeta tiene que conectarse al servicio. En mi caso muestra nas0 que se correspondería con la tarjeta HSI que nos muestra la interfaz web. Por lo que si hubiera escogido la LAN que creé (recuerdo: realmente debería de ser algo así como WANaux o similar: pero no confundir con la que se pone en la inyección del TR069) debería de salir nas1.

Hay un fichero llamado voip_ver en /etc/ pero la verdad sólo muestra eso, una versión y ya. 

Cliente DNS

Una de las cosas que más me ha llamado la atención es que el fichero enlace simbólico /etc/resolv.conf sólo tiene una entrada

nameserver 127.0.0.1

En este caso quería modificarlo para poner un servidor DNS de verdad. Recuerdo: mucho ojo con lo que se toca. No obstante es un fichero de sólo lectura por lo que no ha sido posible. 

Aún así en /var/resolv.conf, la ruta original de ese enlace símbolico,  he probado a machacar sus datos 

echo nameserver ipDNSInterno > /var/resolv.conf

Sin muchos resultados.

Samba

Como hemos visto el problema con SMB es que sólo monta los dispositivos USB en una carpeta que además hace prácticamente de chroot: /mnt/shares/sda/A/. No obstante en /etc/samba.conf/ tenemos el fichero de configuración smb.conf que a su vez nos llevaría a otro en /var/samba/smb.conf si no llegase a ser porque no existe. Además es muy curioso encontrarse con que este primer fichero pone el nombre de la competencia; Vodafone:

Sercomm FG824CD - Configuración samba / SMB
Sercomm FG824CD - Configuración samba / SMB

En mi caso he creado el fichero que tendría que estar en /var/samba/. Pero no existe. Después de haber intentado crear uno con la siguiente configuración:

[raiz]
comment = Raiz
path = /
browsable = yes
guest ok = no
read only = yes

Y de ejecutar el servicio

#smbd
#nmbd

No he obtenido resultados. Por lo que he decidido hacer pruebas creando varios logs como el siguiente 

# ps -A > /mnt/nfs/salidaPS.txt

Y desde la interfaz web activar el servicio de compartir por Samba. Así quería verificar qué qué procesos se añadían. Pero no he visto ninguno nuevo. Eso sí, me ha machacado mi /var/samba/smb.conf con una configuración muy similar a la que se encuentra en /etc/samba.conf/. Lo único que también tengo que añadir una línea más a la sección [global]:

min protocol = SMB2
protocol = SMB3

Porque en caso contrario Windows no permite acceder al servicio. Y si yo fuera vosotros haría una copia de seguridad del fichero de configuración por cada cambio porque está claro que se borrará cada vez que se manipule desde la interfaz web. Más ayuda sobre la configuración del protocolo mínimo de samba en este enlace. Lo único que me sigo encontrando con que estas opciones no acaban de surtir efecto. Será cuestión de seguir haciendo pruebas. 

SSH

El fichero de configuración está por defecto en /etc/ssh/sshd_config. Por lo que he podido ver no tiene mucho misterio: acceso permitido para root o contraseñas vacías, las HostKeys guardadas en /data/2/

Poco más puedo contar al respecto.

FTP

Por lo que he podido ver el dispositivo trae vsftpd. He intentado localizar los ficheros de configuración sin éxito. Al menos hasta que no lo he habilitado con la interfaz web. Y una vez más, se han creado ficheros que antes no existían. Entre otras rutas interesantes se han creado las carpetas y ficheros en /tmp/ftps y /tmp/ftp

Mirando el contenido de los ficheros del ftps todos están vacíos. Con respecto al de ftp si queremos recuperar más información también nos tocará habilitar el usuario desde la web para poder ver más fichero y datos. 

Del fichero vsftpd.conf  podemos recuperar cosas interesantes como por ejemplo:
  • secure_chroot_dir=/tmp/ftp/ftp_empty
  • anonymous_enable=NO (a pesar de que InternetGatewayDevice.Services.StorageService.1.FTPServer.AnonymousUser.Enable está a true)
  • syslog_enable=NO
Además en el fichero /tmp/ftp/vsftpd_user/1234 se muestra 

local_root=/var/ftp/1234

Que si se visita tendremos la siguiente ruta:

/var/ftp/1234/A/

Ese /A/ es precisamente lo que nos muestra al acceder con un cliente FTP.

Además he encontrado el fichero /usr/www-ap/data/settings_ftp.json el cual está vacío. 

Servidor DNS

Me sorprende que al hacerle un nmap al router me devuelva que tiene un servidor DNS pero en la interfaz gráfica no "haya" una forma clara de gestionarlo. 

Por lo que estoy viendo en /tmp/dnsmasq.servers.d/ hay una serie de ficheros .conf que muestran un DNS interno que ya puse hace un tiempo desde la interfaz web pero que me parecía que no estaba funcionando. 

Como hay ficheros que no se pueden modificar por sus permisos (y algunos no son de lo común como la S del stickybit) no he sido capaz de avanzar en este ámbito sin toquetear más allá de lo que quería. 

Ficheros de configuración

Mientras he estado navegando por el árbol de directorios me he encontrado con varios ficheros que parecen que pueden estar relacionados con las configuraciones que posiblemente se carguen al seleccionar las opciones de "restaurar de fábrica" o "cargar configuración almacenada en el router". 
  • /etc/default.xml
  • /usr/www-ap/settings_page/configurationBackup.cfg el cual es un enlace a /tmp/configuration.cfg y que en esa ruta no existe.
  • /tmp/config/config: Hay partes de su contenido que están en claro junto a otras que parecen cifradas: es un fichero xml. En él se pueden ver cosas como admin, encrypted (¿a false a pesar de que parece que sí que lo está?), direcciones IP...
Hasta ahora no he podido averiguar si hay alguna forma de descifrar el contenido ni cómo lo genera. 

HTTP(S)

Este es uno de los aspectos más importantes del sistema ya que es el que permite administrar servicios y configuraciones que de otra forma y sin más conocimiento no podríamos modificar. La ruta /user/www-ap/ es donde está localziada toda esta chicha. 

Uno de los datos que he podido comprobar es que los ficheros .json que he abierto están vacíos a excepción de la cadena "[]" (sin las comillas). Recuerdo que esos ficheros son los que después se utilizan para rellenar algunos datos de la interfaz web cuando navegamos por ella. 

Sercom FG824CD - Direcotrio www - Carpeta de la administración web
Sercomm FG824CD - Direcotrio www - Carpeta de la administración web

En la carpeta activation_page parece que hay una serie de pagínas .html que están destinadas a la primera configuración. Lo único que realmente cuando nos lo entregan no nos lo ofrece. Si visitamos una de esas página se puede apreciar que están destinadas a incluirse en una página superior por eso de los estilos:

Sercomm FG824CD - Contenido de activation_page
Sercomm FG824CD - Contenido de activation_page

Estas páginas no están en orden. Y tampoco voy a ponerme a hacer pruebas. Recuerdo que es el router que me da la conexión y eso iría m ás allá de configurar el aparato que hay que devolver a la operadora.

Si quisiéramos ver el contenido de los ficheros .log y .csv que están en raíz no podríamos porque una vez más nos avisa de que no existen: son otros enlaces simbólicos que también dirigen al fichero esperado en /tmp/.

También he tenido la curiosidad de qué me encontraba en los ficheros de configuraciones que no se muestran en la interfaz web. Por ejemplo en settings_iptv.php o settings_adsl_settings.php o settings_umts.php... También me he llevado la sorpresa de que algunos (y sólo algunos pocos) ficheros .json en efecto sí que tienen contenido. 

Buscando ficheros interesantes he visto que fromCompRestore.php hace referencia a la ruta "../upload/settings_configuration_restore.zip". El problema está que los únicos ficheros que me aparecen al buscar ficheros .zip es que sólo me aparecen los que tengo en el pincho USB y no tienen nada que ver con las copias que hice del router.

Tengo que seguir estudiando la aplicación web. Pero antes de acabar me quedaría comentar que el fichero /usr/www-app/upload.cgi se usa al menos para subir los ficheros de respaldo. Por lo que me quedaría por dedicarle un buen tiempo para ver si soy capaz de estudiar este fichero y a la vez ver cómo ejecuta la recarga de la copia de seguridad. Del mismo modo estudiaré el contrapuesto, download.cgi. Aunque a ojos vista me parece que tiene menos datos. 

domingo, 18 de abril de 2021

Router Sercomm FG824CD V

Tengo noticias sobre los avances que he hecho destripando el router Sercomm FG823CD. No es todo lo que me gustaría pero para ir tirando parece que de momento para darle un descanso a esto puede servir.

Como de costumbre: cuidado dónde y cómo tocas. Si se rompe algo... Es tu responsabilidad.

También decir que he en tantas pruebas que he haciendo me he encontrado con que en algún momento hice cierto cambio que me permitía ver los datos de la VoIP como proxy, dominio, etc... Pero evidentemente el usuario y la contraseña no. Lo que ya os enseñé hace unas semanas que duraba apenas unos segundos antes de bloquearme el usuario... Pero sin ese problema. Además de algún dato más en el TR069. Aunque eso sí, sin que la línea telefónica funcionase.

Lo primero de todo es mantener una configuración como la que mostré en el anterior post.:

  • Crear la interfaz que yo llamé LAN.
  • El enrutamiento de políticas. 
  • Montar una máquina aparte. En mi caso, como dije en esa entrada, una raspberry conectada a uno de los puertos del router.
  • Configurar el servicio TR069:
    • La URL irá a http://IP_RASP:10301
Uno de los enlaces que daban ideas intentaban destripar un F@st 5657. Y a su vez ponían el enlace al github de su autor con un script en python. Y ese script crea un proxy TR-069. En mi caso he usado de base app.py. No obstante no ha acabado de funcionar. Así sin más da error. Además, me ha permitido identificar qué puerto permite no utilizar https y tirar en texto claro.

Aquí hay otro script del que he tirado. El último ejemplo que ponen (después del edit). A partir de este último he ido añadiendo trozos del primero y poco a poco he conseguido que dejase de darme error. En general si se añade este método debería de dejar de dar error:

@app.route('/',defaults={'path':SITE_NAME}, methods=["GET","POST"])
def testVal3(path):
    LOG.info("[testVal3] path: "+str(path))
    result = hello(path)
    LOG.info("[testVal3] result: "+str(result))
    return result

Donde SITE_NAME tiene como valor "http://acs.masmovil.com:10301/". Yo he llamado a este script proxy01.py.

Como estoy configurando todo en la raspberry voy a tirar de la herramienta screen.
  • screen1: tcpdump
  • screen2: proxy
Screen1

Con el fin de identificar el tráfico que va a viajar entre el la rasp y el servidor ACS se va a dejar corriendo un tcpdump.

Sabiendo que el dominio acs.masmovil.com tiene una dirección IP que está en el rango 212 este es el rango que he analizado y además he descartado el puerto 22 porque no quiero mi conexión por ssh me haga mucho ruido.

tcpdump -s0 -vvvv -i eth0 -w salidaPortMirroring_20210418_1615.pcap "not port 22 and (net 212)"

Screen2

En este punto he ejecutado el proxy TR069. Tampoco tiene mucho misterio:

python3 proxy01.py

Captura de datos

Con ambos en ejecución sólo me ha quedado esperar a que el router volviese a conectarse a la rasp y he esperado un instante. Como he hecho varias pruebas al ver que en el screen2 el proxy mostraba un mensaje http con código 204 y se quedaba ahí es donde cancelé la ejecución. De todas formas si vemos que tarda en reaccionar o el tiempo de actualización del cliente TR069 es muy largo se puede cambiar por ejemplo restándole un segundo y así hará la petición a nuestro proxy que a su vez se comunicará con el operador.

El primer dato que he buscado y encontrado ha sido la contraseña del administrador. Se puede buscar haciendo un grep al fichero report.txt:

cat report.txt | grep -i user.1.pass

Cuando estaba mirando dentro de este fichero (el de la primera ejecución) además de encontrar la contraseña del admin me aparecía el usuario de la cuenta VoIP. Pero no su contraseña. Por lo que no me ha quedado más remedio que cargar alguno de los ficheros de configuración anterior. Y es uno de esos donde me aparecen los datos de la cuenta VoIP. Volviendo a repetir el proceso de carga he intentado usar la contraseña del administrador de la primera carga pero no es la misma. Por lo tanto, se puede afirmar que esta contraseña la cambian al menos cada vez que se resetea el router y lo configuran. 

Para recuperar las credenciales del la cuenta VoIP se puede buscar en el paquete .pcap de la captura del tcpdump (que es lo primero que hice) o ahora sí repetir la búsqueda en el report.txt:

cat report.txt | grep -i sip.auth

Y devolverá las tags xml donde están los datos del usuario y contraseña para la cuenta VoIP.

Gracias a esos datos he podido conectar alguno de los teléfonos IP que ya os he enseñado. La centralita toda da algún que otro problemilla. Pero en el estado actual en el que he dejado el router sigue sin funcionar su ATA algo que ya me encargaré de cacharrear para ver si me mantiene la contraseña del administrador.

Otra tarea que tengo pendiente es que no era consciente de que tenia que pedir la desactivación de GNAT por lo que en cuanto deje de toquetear mucho llamaré para deshabilitarlo y así volver a la carga.

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.