SCRIPTING
Introducción a los
Sockets
En muchos aspectos la opciones de los sockets en mIRC
se quedan muy cortas, pero son muy utiles. Los sockets (o zócalos
de conexión) son los puertos lógicos a traves de los cuales
los programas de nuestro ordenador se comucican con el resto
de máquinas de una red a la que está conectada (caso por
ejemplo de Internet), su manejo desde mIRC nos permite
tener un cierto control sobre estas conexiones, abrirlas,
cerrarlas, "escuchar" posibles accesos por cualqiera
de ellas... etc. No podemos decir que sea una característica
ni muy bien implementada ni muy potente en mIRC, pero
si que nos permitirá hacer scripts muy interesantes con la
posibilidad de crear escaneadores de puertos, detectoresde
accesos a nuestra máquina... etc; a medida que se expliquen
en este documento podrimos ir viendo algunos ejemplos de todo
esto.
Para explicar el uso de los sockets partiremos de la base de
que ya se conoce perfectamente el manejo de otras areas
programables del mIRC, en especial los alias, popups
y el uso de variables, identificadores, eventos y remotes
en general. Si no es así será necesario que estudie
previamente los apartados correspondientes a esos temas en
esta misma web.
Es necesario indicar, por último, que los sockets es un
recurso que se agota, cada vez que hayas terminado de usar un
socket debes cerrarlo para poder usar otro, es decir, no se
puede estar trabajando con más de un zócalo de conexión a
la vez.
Identificadores de los sockets
Los siquientes identificadores son los básicos que se han de
saber para poder trabajar con los sockets. Hay más que se
pueden ver en la ayuda del programa, pero ni son tan
importantes ni tienen una explicación tan extensa.
$sock(nombre,numero)
[.propiedad]
Retorna información
referente a una conexión con sockets que hemos creado usando
los comandos correspondientes. Si en "numero" no se
especifica nada y se deja con el valor "N", mIRC
asumira que es 1.
Este identificador tiene las siguientes propiedades:
.name |
el nombre de
la conexión que utilizamos, para
identificarla. |
.sent |
el numero de
bytes enviados despues que la conexión
se haya terminado. |
.rcvd |
el numero de
bytes recibidos despues que la conexión
se haya terminado. |
.sq/.rq |
el numero de
bytes de la cola para mandar y recibir buffers
respectivamente. |
.ls/.lr |
el numero de
segundos desde el ultimo envio y recibo de
información de la conexión. |
.mark |
el área máxima
de almacenamiento del usuario, 512 bytes. |
.type |
el tipo de
conexion socket, TCP o UDP |
.saddr |
la direccion y
el puerto de origen del ultimo paquete UDP. |
.sport |
exactamente lo
mismo que la propiedad anterior (.saddr). |
|
$sockname
Es el nombre que le hemoss dado a una conexion para
identificarla. Este identificador puede ser usado en los
eventos para saber con que conexion se trabaja.
$sockerr
Sirve para comprobar si se ha realizado la conexión
correctamente sin fallos. Si resulta haber algun fallo en ella
este identificador devolverá un valor mayor que 1. Si todo
esta normal no devolvera ningun valor.
$portfree(Puerto)
Sirve para comprobar si un puerto esta siendo utilizado o no.
Devolverá $true si el puerto esta libre o $false
si está siendo usado ya.
Detectando conexiones con los sockets
En este apartado explicaremos como poner a la escucha un
puerto determinado para detectar conexiones entrantes, pero
primero vamos a ver los comandos y los eventos que vamos a
utilizar:
/socklisten <nombre> [puerto]
Nos permite asignar un nombre a un pueto determinado a fin de
identificar la conexión y poderlo usar más adelante.
on 1:socklisten:nombre:comandos
Este evento se activa cuando cualquier usuario intenta
conectar por el puerto que estamos "escuchando". Si
queremos aceptar esta conexión usaremos el comando /sockaccept,
si no la conexión será cerrada.
/sockaccept <nombre>
Este comando acepta la conexión actual que hemos detectado
con el evento anterior, y le asigna un nombre para
identificarla.
/sockrename <nombre>
<nuevo_nombre>
Permite renombrar una conexion existente.
/sockclose <nombre>
Cierra la conexion especificada, si no se indica ninguna se
cierran todas.
Vamos a poner un ejemplo y a analizarlo para entender mejor
todo esto. crearemos una pequeña rutina para detectar si un
usuario intenta conectar por el puerto 12345 (Netßus).
Incluir
en aliases o popups:
/socklisten Netbus 12345 «
ponemos a eschuchar el puerto 12345, con el nombre
Netbus
Incluir
en Events, en remotes:
on 1:socklisten:NETBUS:{ «
se activará cuando intentan conectar con la conexion
Netbus
/sockaccept
Netbus69 « acepta la
conexion y le pone el nombre de Netbus69
beep «
mIRC producira un pequeño pitido de aviso
echo -a detectado una
conexion por parte de $sock($sockname,1).ip
« nos informa de la IP del
usuario
/sockclose Netbus69 «
cerrará la conexión con el usuario que ha intentado
conectar
}
A partir de aquí se puede crear un script para
resolver el nick del usuario haciendo un who con la
IP.
|
Abriendo y cerrando conexiones
Los sockets nos permiten abrir conexiones, por ejemplo para
detectar los puertos abiertos de otro usuario. Vamos a ver los
comandos y eventos que hemos de saber antes de hacer nada:
/sockopen <nombre>
<direccion> <puerto>
Inicia una conexion con el puerto y la direccion IP que
especificada.
on 1:sockopen:nombre:comandos
Este evento se activa cuando la conexión ha sido establecida
mediante el comando /sockaccept.
on 1:sockclose:nombre:comandos
Este evento se activa cuando la conexion ha sido cerrada por
el otro usuario.
Vamos a poner un ejemplo y a analizarlo para entenderlo mejor.
Este ejemplo sirve para detectar si un usuario tiene abierto
el puerto 12345 (Netßus).
Aliases
o popups:
/sockopen Netbus
195.77.120.10 12345 «
abrimos una conexion por el puerto 12345 con
195.77.120.10
Events,
en remote:
on 1:sockopen:Netbus:{ «
la conexion ha sido aceptada
if
( $sockerr > 1 ) { « el
usuario no tiene el puerto 12345 abierto
echo
-a PortScan » $sock($sockname,1).ip no esta infectado
por el Netßus }
else
{ « si el $sockerr
no es >1 es que esta infectado por el Netßus
echo
-a Portscan » $sock($sockname,1).ip esta infectado
por el Netßus }
/sockclose
Netbus «
cierra la conexion Netbus
}
|
Bueno, con este
ejemplo ya teneis un scan de Netßus de lo más sencillo, ya
que aun se puede mejorar mucho.
Leer y escribir información
/sockwrite [-tn] <nombre>
<texto>
Envia información a una conexion ya establecida lo más
repatido posible. Los parametros son:
-t |
aunque el texto
comienze por &, este sea tomado como texto y no
como una variable binaria |
-n |
inserta una nueva
linia de texto en la conexion |
on 1:sockread:nombre:comandos
Este evento es llamado cuando el otro usuario recibe la
informacion
Observe este ejemplo, cuando un usuario intente entrar por el
puerto 12345 le aparecera un mensaje:
En
popups o alias:
/socklisten TONTIN 12345
En events, remotes:
on 1:socklisten:TONTIN:{
« Cuando intente la conexion...
/sockaccept
TONTAZO « Acepta
la conexion
/sockwrite -n $sockname Uix,
mu listo no eres $sock($sockname,1).ip
« Le manda un mensaje
/.timer69 1 2 /sockclose
$sockname « En 2
segundos se le termina la conexion
echo -a Detectada una
conexion de $sock($sockname,1).ip por el puerto 12345
}
|
<---Atrás
|
 |
 |
 |
|