mIRC32 - Curso de Scripting: Uso de los Sockets en mIRC
 

SOCKETS EN mIRC

By CHEvARA 1.998

e-mail: chevara@hotmail.com

Su Web es: http://come.to/chevara

Autor del script: El Orador

**************************

El mIRC nos da la opción de poder trabajar con los sockets, y aunque la verdad es ke no es una caracteristica maravillosamente implementada (me refiero a que en muchos aspectos la opciones se quedan muy cortas), si nos permite hacer cosillas muy utiles para nuestros scripts, tales como escaneadores de puertos o bien la detección de accesos a los nuestros.

1º-Identificadores relacionados:

Lo primero que voy a hacer es nombrar unos cuantos identificadores referidos a los sockets ke nos seran imprescindibles para poder hacer casi cualquier cosa.

$sock(nombre,numero):

Nos devolvera información sobre el socket de nombre "nombre", por ejemplo si se detecta una conexión al puerto 50, que nosotros hemos definifo como CONA ( a traves del comando socklisten y de la opcion on 1:socklisten { comandos } que se explicara despues) y queremos averiguar la ip de la maquina que nos esta conectando lo podriamos hacer a traves del identificador $sock(CONA,1).ip que devolveria la ip de la maquina "cliente".

$sockname:

delvuelve en nombre de una conexión para que pueda ser identificada, por ejemplo, en el ejemplo anterior, podriamos haber usado $sock($sockname,1).ip en lugar de $sock(CONA,1).ip

$sockerr:

Este util identificador devolvera el valor " > 1 " si se produce un error en la conexión

$portfree(N):

Devolvera $true si el puerto N esta libre o $false si esta siendo usado ya.

De momento no voy a poner ninguno mas, aunque si luego veo que son necesarios se nombraran.

2º-Detectando conexiones:

Ahora es un buen momento para aprender como abrir, cerrar estos sockets y como crear los eventos necesarios para detectar cuando tienen exito.

/socklisten nombre puerto

Pondra al mIRC a escuchar en un determinado puerto ( puerto ) e identificara las conexiones que alguna maquina haga al nombrado puerto con el nombre ( nombre ).

En caso de que no asignemos un puerto, el mIRC seleccionara uno al azar hasta el valor contenido en las opciones del DCC ( que es 5000 por defecto ), pero esto no quiere decir que no podamos poner a "escuchar" al mIRC por encima de ese puerto si asi lo deseamos ( evidentemente poniendo el puerto en el comando socklisten, porque sino se elegira uno entre el rango 1 - 5000 que por defecto trae el mIRC).

El evento referido a este comando es:

on 1:socklisten:nombre:comandos

Antes de decir mas, voy a poner dos comandos que nos seran de utilidad dentro de este evento, se trata de:

/sockaccept nombre , y

/sockrename nombre nuevo nombre

El primero, en caso de que se produzca una conexion al puerto especificado en el evento, aceptara la conexión, la pondra el nombre que nosotros deseemos y la mantendra hasta que sea cerrada a traves del comando /sockclose nombre ( o bien, sea cerrada por la maquina "cliente" ).

Al hacer esto, el mIRC mantendra la conexión con el nombre que especifiquemos, pero a la vez seguira escuchando por si se producen otras conexiones.

Sobre el segundo comando, no creo que haya mucho que contar...

Pero como creo que la mejor forma de aprender es a traves de ejemplos, creo que en este punto ya somos capaces de crear un script, que nos avisara cuando alquien conecte a un puerto nuestro.

Ejemplo, CREACCION DE DETECTOR DE CONEXIONES

Lo primero que hay que hacer es poner al mIRC a escuchar en el puerto que nos interesa, en este caso el puerto que vamos a utilizar es el "12345", debido a que es un puerto muy escaneado en estos tiempos (recordemos que es el puerto por el que actua el troyano NETBUS). Para conseguir esto, hariamos lo siguiente:

/socklisten NETBUS 12345 <---Pondra al mIRC a escuchar en 12345 y

llamara a ese socket NETBUS

Ahora lo que queremos es que el mirc nos avise cuando se producca una conexión a ese puerto, asi que crearemos el evento correspondiente:

on 1:socklisten:NETBUS:{ <---Comienzo del Evento

sockaccept NETBUS1 <---Aceptamos la conexion y la llamamos NETBUS1

beep <---El mIRC emitira un pitido cuando esta

situación se produzca

echo -s ¡¡CONEXION DETECTADA POR: $sock($sockname,1).ip <--Escribira en

la ventana de estatus que se esta

produciendo una conexion y nos

dara la ip de la maquina cliente.

sockclose NETBUS1 <---Cerrara el puerto cortando la conexión con

nuestro querido "cliente"

} <---Fin del evento ¡¡No olvides poner el } !!

Ahora ya dispondriamos de un detector de conexiones, evidentemente es muy mejorable, pues si por ejemplo alguien con mala idea le diera por utilizar un "portfucker" contra nuestro puerto 12345 pues... asi que una buena idea seria el crear dentro del evento una pequeña protección de flood, pero esto no es un tema que pertenezca a este curso, si no sabes como hacerlo buscame por el IRC o manadame un mail e interare explicarte como hacer una de estas protecciones.

2º-Haciendo conexiones:

Evidentemente, no solo podemos usar los sockets para detectar cuando alguien conecta a nuestra máquina, sino que, ademas, podemos utilizar esta caracteristica del mIRC para poder establecer conexiones nosotros mismos, pudiendo incluso conectar a servidores ftp, telnet o http (solo texto evidentemente) a traves de ellos.

El comando que nos va a permitir establecer ( o por lo menos intentar establecer ) una conexión con otro "servidor", es el comando:

/sockopen nombre ip puerto

Donde nombre es el nombre que nosotros queremos asignar a ese socket, ip es la dirección ip de el host al que queremos conectar y puerto es el puerto al que queremos conectarnos en el host.

Por ejemplo el comando siguiente:

/sockopen PRUEBA 195.223.221.23 23

Abrira una conexión hacia el puerto 23 de la máquina (imaginaria en este caso) 195.223.221.23.

Pero evidentemente, de nada nos servira conectarnos a un host si no nos enteramos de que lo hemos hecho, asi que para poder enterarnos tendremos que hacer uso de un evento, en este caso el evento correspondiente al comando anterior es:

on 1:sockopen:nombre:comandos

Con este evento, podremos ejecutar unos comandos determinados, cuando se verifique una conexión.

Para poder verificar que la conexión se ha llevado a cabo con éxito, utilizaremos el identificador $sockerr , que recordemos devolvia el valor " > 1 " si la conexión resultaba infructuosa.

Pero al igual que antes veremos mejor todo esto a traves de un ejemplo:

Ejemplo, Creando un escaneador del troyano NETBUS:

Lo primero que debemos hacer es crear el evento que nos avisara cuando la conexión tenga éxito.

Haremos lo siguiente:

On 1:sockopen:EJEMPLO: { < --Aquí comienza el evento.

If ( $sockerr > 1 ) {

Echo –s $sock($sockname,1).ip no tiene el troyano

} < --Esta línea y las dos anteriore

, verificaran que si la conexión

no se lleva a cabo (por tanto la

victima no tendra el troyano ),

se imprima en la ventana de

status que la ip no tiene el

troyano.

Else {

Echo –s $sock($sokname,1).ip tiene el troyano

Sockclose EJEMPLO

}

} < --Esto segunda parte, nos dira

en la ventana de status que la

ip tiene el troyano y cerrara

el puerto.

Este evento responderia despues de ejecutarse el comando:

/sockopen EJEMPLO ip_que_deseemos 12345

Donde 12345 es el puerto del troyano netbus.

Pero fuera ya del ejemplo anterior, ademas disponemos de otro evento, on 1:sockclose:nombre:comandos , que responderia cuando un puerto abierto por nosotros fuera cerrado por el host al que estamos conectando y no por nosotros.

¿Y entonces porque no uso esto en vez de $sockerr?, muy simple, cuando se produce $sockerr > 1 , quiere decir que no se ha podido ni siquiera conectar, pues el host tenia el puerto especificado cerrado, mientras que con este evento, lo que se detecta es que despues de que se haya producido la conexión con éxito, el puerto sea cerrado por el host (¡¡¡OJO!!!, sea cerrado por el HOST, NO por nosotros, osea, este evento no responde al comando /sockclose nombre )

3º-Leer y enviar datos:

Ademas de todo lo anterior, con mIRC también podemos leer y enviar datos a traves de los sockets, como ya dije al principio, la verdad es que esto no esta maravillosamente conseguido, y habra muchas cosas que no podremos hacer, pero sin embargo si haremos algunas cosillas.

Lo primero que voy a hacer como siempre es decir los comandos y sus respectivos eventos.

/sockwrite [-tn] nombre texto_o_variable

-t se refiere a que aunque el texto comienze por &, este seta tomado como texto y no como una variable binaria.

-n inseta una "vuelta de carro" x´P osea nueva linea.

El evento correspondiente a este comando es:

on 1:sockread:nombre:comandos

Poco que explicar sobre esto...

Y si este comando nos sirve para enviar, pues debe de haber otro evento que nos sirva para recibir ¿no? Pues si, se trata de:

 

on 1:sockread:nombre:comandos

Y para terminar, vamos a darle un uso a esto, se trata de crear un evento, de tal forma que cuando alguien habra nuestro puerto 23 (telnet) se le envie un mensaje a su terminal telnet y se cierre el puerto.

on 1:socklisten:TELNET: {

sockaccept TELNET2

.timerTELNEA 1 3 sockwrite -n TELNET2 Hola $sock(TELNET2,1).ip

.timerTELNED 1 5 sockwrite -n TELNET2 -=-=-=-=-=-=-=-=

.timerTEL 1 7 sockclose TELNET2

echo -s 0,7 $sock(TELNET2,1).ip 0,12Esta conectando por telnet, se le desconectara en 7 segundos despues de reirnos de el ;) | beep

}

}

Evidentemente, para que esto funcione tenemos que poner al mIRC a escuchar con:

/socklisten TELNET 23

No explico nada mas... solo decirte que esto escribira en el terminal telnet del cliente Hola ip y 5 segundos despues cerrara la conexión.

Te animo a que lo mejores añadiendo tus propias caracteristicas y opciones.

Bueno, esto ha sido todo amigos, podeis enviarme dudas a chevara@hotmail.com
 

 Volver a la página principal