![]() |
![]() |
Socket's
Introducción a los Sockets.-
En muchos
aspectos la opción de los sockets en mIRC se quedan muy cortas, pero son muy útiles. Los sockets (o zócalos de conexión) son los puertos lógicos a
través de los cuales los programas de nuestro ordenador se comunican 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 cualquiera 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 escaneadotes de puertos,
detectores de accesos a nuestra maquina… etc; a
medida que se expliquen podremos 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 áreas 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 estos temas.
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
siguientes identificadores son los básicos que se han de saber para poder
trabajar con los sockets.
$sock(nombre,numero)
[.propiedad]
Retorna la
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
asumirá que es 1.
Este
identificador tiene las siguientes propiedades:
.name
El nombre de la
conexión que utilizamos, para identificarla.
.sent
El número de bytes enviados después que la conexión se
haya terminado.
.rcvd
El número de bytes recibidos después que la conexión se
haya terminado.
.sq/.rq
El número de bytes de la cola
para mandar y recibir buffers respectivamente.
.ls/.lr
El número de segundos desde el último envío y recibo de
información de la conexión.
.mark
El área máxima de almacenamiento del usuario, 512 bytes.
.type
El tipo de conexión sockets, TCP
o UDP
.saddr
La dirección y el puerto de origen del último paquete UDP
.sport
Exactamente lo mismo que la propiedad anterior (.saddr)
$sockname
Es el
nombre que le hemos dado a una conexión para identificarla. Este identificador
puede ser usado en los eventos para saber con que conexión se trabaja.
$sockerr
Sirve para
comprobar si se ha realizado la conexión correctamente sin fallos. Si resulta
haber algún fallo en ella este identificador devolverá un valor mayor que 1. Si
todo es normal no devolverá ningún valor.
$portfree(puerto)
Sirve para
comprobar si un puerto está siendo usado 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 que vamos
a utilizar:
/socklisten
<nombre> [puerto]
Nos
permite asignar un nombre a un puerto determinado a fin de identificar la
conexión y poderlo usar mas adelante.
on 1:socklisten:nombre:comandos
Este
evento se activa cuando cualquier usuario intenta conectar por el puerto que
estamos “escuchando”. Si queremos aceptar está conexión usaremos el comando /sockaccept, si no la conexión se cerrará.
/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 conexión existente.
/sockclose
<nombre>
Cierra la
conexión especificada, si no se indica ninguna se cierran todas.
Vamos a
poner un ejemplo y analizarlo para entender mejor todo esto, crearemos una
pequeña rutina para detectar si un usuario intenta conectar por el puerto 12345
(Netbus).
Incluir
en Aliases o Popups:
/socklisten Netbus 12345 ‹‹
ponemos a escuchar el puerto 12345 con el nombre Netbus
Incluir
en Eventos, en Remotes:
on 1:socklisten:netbus:{ ‹‹ se
activará cuando intentan conectar con la conexión de Netbus
/sockaccept netbus69 ‹‹ acepta la conexión y le pone el
nombre de netbus69
beep
‹‹ mIRC producirá un pequeño pitido de aviso
echo –a
detectado una conexión 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 y que hemos de saber antes de hacer nada:
/sockopen
<nombre> <dirección> <puerto>
Inicia una
conexión con el puerto y la dirección ip
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 conexión ha sido cerrada por el otro usuario.
Vamos a
poner un ejemplo y analizarlo para entenderlo mejor. Este ejemplo sirve para
detectar si un usuario tiene abierto el puerto 12345 (Netbus).
Aliases
o pupups:
/sockopen netbus 195.77.120.10
12345 ‹‹ abrimos una conexión con el purto 12345
con 195.77.120.10
Eventos,
en remotes:
on 1:sockopen:netbus:{ ‹‹ la
conexión 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 NetBus }
else {
‹‹ si el $sockerr no es > 1 es que está infectado
por el NetBus
echo –a PortScan ›› $sock($sockname,1).ip esta infectado por
el NetBus }
/sockclose netbus ‹‹ cierra la
conexión netbus
}
Bueno con
este ejemplo ya tenéis un scan de NetBus
de lo más sencillo, ya que aun se puede mejorar mucho.
Leer y escribir información.-
/sockwrite
[-tn] <nombre> <texto>
Envía
información a una conexión ya establecida lo más rápido posible. Los parámetros
son:
-t: aunque el texto comience por
&, este sea tomado como texto y no como una variable binaria.
-n: inserta una nueva línea de texto
en la conexión.
on 1:sockread:nombre:comandos
Este
evento es llamado cuando el otro usuario recibe la información.
Observe
este ejemplo, cuando un usuario intente entrar por el puerto 12345 le aparecerá
un mensaje:
En popups o alias:
/socklisten TONTIN 12345
En
eventos, remotes:
on 1:socklisten:tontin:{ ‹‹ cuando intente la conexión…
/sockaccept tontazo ‹‹ acepta
la conexión
/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 terminará la
conexión
echo –a
detectada una conexión de $sock($sockname,1).ip por el puerto 12345
}