La infraestructura
¡Hora de probar!
Me hice con un espacio web en cierto
“hosting gratuito” que en adelante, y a efectos meramente
didácticos, llamaré “malicioso.example.com”. Y en él creé
tres ficheros
Fichero 1: El Javascript
El primero de los ficheros se llamaba
“a”. Nombre corto, pero suficiente. Al igual que el código que
contenía:
Ése era el script que quería ejecutar
aprovechando la vulnerabilidad XSS. En pocas palabras, carga la
página de cambio de contraseña y busca la línea que contiene “var
pwdUser”, que es donde aparece el valor de la contraseña. Una vez
la encuentra, la manda al servidor malicioso.example.com, al puerto
9999, donde un proceso está a la espera de recibir noticias.
Fichero 2: El formulario fantasma
Ahora necesitaba que la víctima
sufriera las consecuencias del ataque XSS. Para ello me aproveché la
vulnerabilidad CSRF, creando una página que simulara el formulario
de configuración de impresora del router, pero sin tantas
comprobaciones tontas.
Y, de camino, metiendo en el campo de
la marca y el modelo el código que disparaba el XSS.
Una vez dispuesto el formulario, un
poquito de JavaScript adicional se encargaría de enviarlo sin
necesidad de intervención del usuario.
Eso es lo que tiene el fichero 1.html:
Eso es lo que tiene el fichero 1.html:
Fichero 3: La página del engaño
Para acabar, la única página que el
usuario tiene que ver. Con la promesa de sacar algo útil del router,
se pide al usuario que inicie sesión en dicho dispositivo y a
continuación pulse un botón. Su nombre, 0.html. Y su contenido:
Y al pulsar el botón se carga, de
forma invisible, el formulario fantasma.
… Y éste aprovecha el CSRF para
activar el XSS
… … Y el XSS extrae la contraseña
y la envía al sitio malicioso
¿Funcionará?
Fichero 4: A la caza del incauto
Para saberlo, nada mejor que probarlo.
El usuario recibe la noticia de que hay un sitio web muy chulo que
tiene que visitar. Quizá un correo. Quizá buscando en Internet.
Quizá...
Siguiendo las instrucciones, la víctima abre otra
pestaña, inicia sesión en el router y vuelve a la página engañosa.
Sin que él lo sepa, en el sitio web
malicioso.example.com hay un proceso esperando que alguien se le
conecte al puerto 9999. Para estas pruebas, basta con un pequeño
shell script que extraiga el valor de la contraseña y la muestre en
pantalla.
Cuando el usuario haga clic en el
botón, algo le aparecerá en la pantalla al atacante: la contraseña
de su víctima
Y, sí, esta imagen también la retoqué para que no apareciera la contraseña de mi amigo.
Conclusiones
Moraleja: Aunque no me gano la vida con
estas cosas, debo decir que en alguna ocasión que otra me consiguen
algo de comer. Y una buena cena siempre sabe mejor cuando te la paga
otro.
Bueno, eso y que si tienes un router de
éstos, yo no terminaría de estar tranquilo del todo. Sólo
iniciaría sesión en él en un navegador sin plugins (porque los
plugins pueden acceder al contenido de las páginas y hacer
peticiones en tu nombre) y en el que no tuviera abierta ninguna otra
pestaña (por si acaso alguna hace cosas como las vistas
anteriormente). Y una vez terminada la configuración, cerraría
sesión y navegador antes de ponerme a navegar por otros sitios. Y, aún así...
Y si tienes otro router... échale un vistazo. La experiencia me dice que cada uno debería dedicarse a lo que mejor sabe hacer. Y muchos fabricantes de hardware, cuando desarrollan software... bueno... eso.