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,