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
}
|
este mini-documento ha
sido creado por [SaRRiO] 12/4/99
e-mail de
contacto para comentarios: intuder@mixmail.com
|