80

Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Embed Size (px)

Citation preview

Page 1: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack
Page 2: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

EDITORIAL: EDITOTRANS S.LC.I.F: B43675701PERE MARTELL N° 20, 2o - 1a

43001 TARRAGONA (ESPAÑA)

Director EditorialI. SENTÍSE-mail [email protected]ítulo de la publicaciónLos Cuadernos de HACK X CRACK.Nombre Comercial de la publicaciónPC PASO A PASOWeb: www.hackxcrack.comDirección: PERE MARTELL N° 20, 2o - 1a .

43001 TARRAGONA (ESPAÑA)

¿Quieres insertar publicidad en PC PASO APASO? Tenemos la mejor relación precio-difusióndel mercado editoriaS en España. Contacta connosotros!!!

Director de MarketingSr. Miguel MelladoTfno. directo: 652 495 607Tfno. oficina: 877 023 356E-mail: [email protected]

Director de la PublicaciónJ. Sentís

E-mail [email protected]

Diseño gráfico:J. M. Velasco

E-mail contacto:[email protected]

RedactoresAZIMUT, ROTEADO, FASTIC, MORDEA, FAUSTO,ENTROPIC, MEIDOR, HASHIMUIRA, BACKBONE,ZORTEMIUS, AK22, DORKAN, KMORK, MAILA,TITINA, SIMPSIM

Contacto [email protected]

ColaboradoresMas de 130 personas: de España, de Brasil, deArgentina, de Francia, de Alemania, de Japón yalgún Estadounidense.

E-mail [email protected]

ImprimeI.G. PRINTONE S.A. Tel 91 808 50 15

DISTRIBUCIÓN:SGEL, Avda. Valdeparra 29 (Pol. Ind.)28018 ALCOBENDAS (MADRID)Tel 91 657 69 00 FAX 91 657 69 28WEB: www.sgel.es

TELÉFONO DE ATENCIÓN AL CLIENTE: 977 22 45 80Petición de Números atrasados y Suscripciones (Srta. Genoveva)

HORARIO DE ATENCIÓN: DE 9:30 A 13:30(LUNES A VIERNES)

© Copyright Editotrans S.L.NUMERO 14 -- PRINTED IN SPAINPERIOCIDAD MENSUALDeposito legal: B.26805-2002Código EAN: 8414090202756

Page 3: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack
Page 4: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

DICIEMBRE ooo ooo ooo

DICIEMBRE un nuevo año está a punto de nacer ydebemos seguir el ritual de comprar compulsivamentehasta liquidar el último céntimo de nuestra cuenta corrientey fulminar el saldo de nuestra tarjeta de crédito (para quienla tenga, claro).

Por primera vez, esta editorial no tratará sobre la revista,hay algo más importante, tu bolsillo. Como esta no es unarevista que se vende al mejor postor vamos a darte unconsejo que seguro ninguna otra publicación del sectorinformático se atreverá a dar :)

Estas navidades NO TE COMPRES UN ORDENADOR!!!Si quieres, date un caprichito, compra un poco de memoria,un monitor TFT de 18 pulgadas mínimo o haz un poco de"modding"... PERO NO ACTUALICES TU PLACAMADRE NI TU PROCESADOR.

No, no somos esquizofrénicos ni caemos encontradicciones. Cuando decimos que te des un caprichoy te compres un TFT de 18" es porque ese monitor tedurará 10 años, y si te gusta el "modding" pégale un vistazoal anuncio de la contraportada (si a nosotros nos hasorprendido estoy seguro que no os dejará indiferentes).No, no me pagan para publicitar a nadie (seguro que yaestás pensando mal)... el mensaje que intento darte esQUE DISFRUTES de la informática, que no te dejesinfluir por esa enfermedad de "el procesador más rápido","la tarjeta más espeluznante" y "la placa madre máscapacitada", no, invierte en lo que te haga disfrutar...

¿Eres de los que disfruta teniendo el procesador máspotente pero mantiene un triste y viejo monitor CRT de17 pulgadas? Pues entonces escucha mi advertencia: Elaño 2004 traerá MUCHAS novedades dentro del campoinformático, cambios de tecnología que dejarán atrás elbus AGP, el bus PCI y la tecnología de 32 bits... no tiresel dinero actualizando tu equipo estas navidades!!!

INDICE DE ANUNCIANTES

4 EDITORIAL

5 CURSO DE PHP

17 SERIE RAW (7): DNS

31 CONCURSO DE SUSE LINUX 8.2

32 SERVIDOR DE HXC. MODO DE EMPLEO

33 CURSO VISUAL BASIC: UN CLIENTE, UNA NECESIDAD(II).

39BAJATE NUESTROS LOGOS Y MELODÍAS

40 PROGRAMACIÓN BAJO LINUX: LENGUAJE C(III)

54GANADOR DEL CONCURSO DE SUSE LINUX

55 CURSO XML:DOM(II)

65 COLABORA CON NOSOTROS

65 SUSCRIPCIONES

66 HIJACKING

80 NÚMEROS ATRASADOS

INDICE DE ANUNCIANTESAMEN 3

BIOMAG 84

DOMITECA 15

HOSTAUA 9

TRAXDATA 83

Y FELICES FIESTAS!!!

EDITORIAL

Page 5: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

PHP es, con diferencia, la forma de programar páginas Web más extendida en Internet.

Vamos a iniciar un nuevo curso que te permitirá empezar a utilizar este lenguaje y

aportará a tus páginas una nueva dimensión.

Empezamos con un poco de historia, seguimos con la instalación de los elementos necesarios

y nos vamos directamente a jugar con las variables. Que disfrutes!!!

Bienvenidos a un nuevo curso, a lo largo delos próximos meses aprenderemos a programarel lenguaje PHP. Son varias las razones quenos han impulsado a iniciar este curso ya quepara comprender como funciona una web conalgo de complejidad hay que saber como estáprogramada internamente. Existen otroslenguajes de programación web pero PHP esel más extendido y conocido por todos, ademáses gratis. Este primer capitulo es muy básico,está orientado para lectores que empiezan porprimera vez a programar y es necesario querompan el hielo. En próximos capítulos veremoscomo programar socket, telnet remotos, ...

1. Un poco de culturilla no vienemal

Si piensas que PHP es nuevo estás equivocado,el nacimiento de PHP comenzó a gestarse en1995 gracias a un producto llamada PHP/FIcreado por Rasmus Lerdorf. Realmente esteproducto era un conjunto de scripts en Perl(es otro lenguaje de programación) para queRasmus pueda controlar los accesos a sutrabajo. Posteriormente lo hizo más potenterescribiendo todo el código en C y con nuevasfunciones como acceso a base de datos.Contento con su trabajo tubo una gran idea"eligió liberar el código fuente de PHP/FI paraque cualquiera pudiera utilizarlo".

En 1997 PHP ya estaba siendo utilizado por el 1%(50.000 dominios) de los dominios en Internet, aúnel control de PHP/FI estaba en el creador.

A finales de 1997 dos programadores llamadosAndi Gutmans y Zeev Zuraski rescribieron porcompleto PHP/FI y lo llamaron PHP 3.0. Estaversión de PHP es bastante similar a lo que yaconocemos, hay pocas di ferencias.En 1998 PHP ya estaba siendo utilizado por el10% de los dominios y se liberó oficialmenteen Junio de 1998, después de haber dedicado9 meses a pruebas.

En invierno de 1998 ambos programadorescrearon un nuevo motor PHP mucho más rápidoy mejorando los accesos a las bases de datosademás de ser bastante más estable ya que laanterior versión no estaba suficientementepreparada para aplicaciones complejas. Al nuevomotor lo llamaron Zend (comprimido de Zeevy Andi). La nueva versión fue bautizada comoPHP 4.0 y el código se liberó en el año 2000.Actualmente se estima que PHP 4.0 esté siendoutilizada en el 20% de los dominios en Internet.

Para terminar, decir que ya se está trabajandoen la nueva versión PHP 5.0, ¿qué nos deparará?,si la versión PHP 4.0 ya es alucinante, ¿cómoserá PHP 5.0?, habrá que esperar un tiempopara saberlo.

2. ¿Qué se puede hacer con PHP?

Con PHP se pueden crear complejos programas,sé utiliza mucho para el tratamiento deformularios, procesamiento de la información,mantener sesiones de usuarios (cookies ysesiones), en este curso aprendemos a utilizar

PC PASO A PASO N° 14 Página 5

Page 6: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

PHP de distintas formas, como script de servidorweb y como script de aplicación, si no hasentendido nada de lo comentado, no tepreocupes ya se verá más adelante y conejemplos. Para resumir podemos comentar quelos scripts PHP son utilizados para:

• Scripts en la parte de servidor: es loque estamos acostumbrados a ver en Internet,páginas que se ejecutan en el servidor web.Para ello se necesita un servidor web (Apachepor ejemplo) y tener configurado el servidorweb para que interprete las páginas PHP.• Scripts en línea de comandos: esto noes tan conocido entre los programadores dePHP, se puede programar complejos scriptsPHP y ejecutarlos sin necesidad de servidorweb. ¿Qué utilidad puede tener programar unscript en línea de comandos?, por ejemplopuedes crear un programa que borre la papelerade reciclaje cada 24 horas, ya lo veremos másadelante.• Aplicaciones gráficas: Se puedeprogramar aplicaciones gráficas al estilo deVisual Basic (con ventanas, botones,...) peropara ello es necesario es necesario utilizar PHP-GTK.

En este curso trataremos de aprender adesarrollar bajo los dos primeros puntos, eldesarrollo de aplicaciones básicas no loaprenderemos, como mucho haremos algúnejemplo, pero sin dar mucha importancia, yaque existen otros lenguajes mejor preparadospara estos menesteres como Visual Basic.

PHP puede ser utilizado en la mayor parte desistemas operativos y servidores web: Linux,muchas variantes Unix (incluido HP-UX, Solarisy OpenBSD), Microsoft Windows, Mac OS X,RISC OS y probablemente alguno más. Soportala mayoría de servidores web de hoy en día,incluyendo Apache, Microsoft InternetInformation Server, Personal Web Server,Netscape y ¡Planet, Oreilly Website Pro server,Caudium, Xitami, OmniHTTPd y muchos otros.

Pero no solo eso, además PHP puede trabajarcon la mayoría de las bases de datos como:Adabas D, Ingres, Oracle (OCI7 y OCI8), dBase,InterBase, Ovrimos, Empress, FrontBase,PostgreSQL, FilePro (solo lectura), mSQL, Solid,Hyperwave, Direct MS-SQL, Sybase, IBM DB2,MySQL, Velocis, Informix, ODBC y Unix dbm.

Y lo más importante para este curso, tambiéntiene soporte para comunicarse con otrosservicios usando protocolos tales como LDAP,IMAP, SNMP, NNTP, POP3, HTTP, COM (enWindows) y muchos otros. También se puedencrear raw sockets.

3. Pero qué es realmente PHP

PHP es un lenguaje interpretado de alto nivelembebido en páginas HTML y ejecutado en elservidor, ¿qué quiere decir todo esto?, muysencillo, es un lenguaje que no necesita sercompilado. Si estás siguiendo el curso de VisualBasic estarás viendo que para ejecutar elprograma primero tienes que compilarlo y luegoejecutarlo. Un lenguaje interpretado no necesitala compilación, es decir, puedes crear unprograma y ejecutarlo directamente.Lógicamente esto tiene sus ventajas yproblemas. Las ventajas es que puede serconsiderado más rápido a la hora de programary de depurar posibles errores, como problemapodemos comentar que un lenguaje interpretadoes más lento ya que el código necesita serinterpretado y luego ser ejecutado. Otradesventaja es que el código puede ser visiblepor cualquier persona con permisos para ello.En la actualidad la velocidad no es problema,ya que cada vez los ordenadores son másrápidos y se puede considerar un obstáculopara programar lenguajes interpretados siemprey cuando la velocidad extrema no sea crucial.

PHP es un lenguaje embebido en HTML, estoquiere decir que puedes programar tus páginasHTML e introducir código PHP, este código PHP

Página 6 PC PASO A PASO N° 14

Page 7: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

no se mostrará al navegante ya que esejecutado en el servidor. Lo mejor es un ejemplopara comprender todo lo comentado.

Si queremos crear una página web que muestre10 veces la frase "Esto es un ejemploHackxcrack" podemos hacerlo mediante HTMLsin problemas pero también podemos hacerlocon PHP y de manera más sencilla, ya quegracias al PHP podemos pasar por URL elnúmero de veces que aparezca la frase.El código PHP de este sencillo ejemplo sería:

Analizando el código se puede ver código HTMLy código PHP, lo que hace este código PHP esun bucle de 10 repeticiones (todo esto ya loexplicaremos más adelante). Es importantesaber que el código PHP es ejecutado en elservidor y que este código no es mostrado enel cliente, si el navegante decidiera ver el códigode la página mostrada en su navegadorsimplemente vería 10 veces la frase en perfectoHTML pero nada de PHP.

4. Instalar PHP

¿Recuerdas que en el número 10 de hackxcrackse explicaba como instalar el PHP en Apache?,busca en tu estantería la revista n°10 yencontrarás un artículo llamado "Apache ParteIV Trio de Ases Apache-PHP-Mysql", terecomendamos que leas y sigas los pasoscomentados del n°10, ya que lo necesitaráspara comenzar con las prácticas de PHP.

En caso de que no tengas la revista tienes dosopciones, pedir que te envíen el número 10 (eslo que te recomiendo) o utilizar uno de lospaquetes existentes en Internet que te instalanel Apache, el PHP y el MySQL. Además te lo

dejan todo 100% operativo, ¿dónde puedesencontrar uno de estos paquetes?, hay muchos.Puedes bajarte el Appserv, es muy sencillo deinstalar (simplemente hay que ejecutar unprograma y esperar a que se instale todo).Puedes encontrarlo en:

http://www.appservnetwork.com

Descarga de APPSERV:1.- Abre tu navegador y dirígete a

http://www.appservnetwork.com2.- Una vez visualices la página pulsa sobre el enlace quehay debajo de "DOWNLOAD APPSERV 2.3.0"

PC PASO A PASO N° 14 Página 7

Page 8: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

3.- Llegarás a una página donde tienes a tu disposiciónvarios servidores desde donde descargar el archivo,simplemente pulsa sobre uno de ellos, bajo la columnadownload. Nosotros lo descargamos desde el primero deellos, puedes verlo en la imagen.

4.- Cuando pulses se abrirá otra ventana y empezará ladescarga. Si la descarga no empieza de forma automáticapulsa sobre el enlace que aparece al principio de la página,tal y como puedes ver en la captura.

5.- Una vez empiece la descarga del archivo, el navegadorte preguntará dónde quieres guardarlo, pues eso, guárdalodonde quieras, por defecto en el disco C:

Si, seguro que ves del todo innecesaria esta explicación,pero la experiencia manda y recibimos muchos mailspreguntando cosas tan simples como esta :)

Página 8

Instalando el APPSERV (tampoco deberíamosexplicarlo...pero bueno...):

1.- Ejecuta el archivo "appserv-win32-2.3.0.exe",que debería estar en el disco duro C: si seguistelas instrucciones de descarga.

2.- Aparecerá la típica ventanita de instalación,pulsa sobre el botón NEXT

3.- Ahora aparecerá otra ventani tapreguntándote dónde quieres instalar elprograma. Fíjate que por defecto lo instalaráen "C:\AppServ", pues muy bien, le decimosque si pulsando sobre el botón NEXT.

4.- Ahora se abrirá otra ventanita preguntandoel tipo de instalación que deseamos, pues nosconformamos con la "typical" pulsando el botónNEXT:)

5.- Ahora se abrirá otra ventanita que paracualquier lector habitual de PC PASO A PASOno tiene ninguna dificultad, pero si nuncainstalaste APACHE tal y como te enseñamos enlos números anteriores, quizás no sepas quéhacer. La ventana es la siguiente:

SERVER NAME... ¿qué es eso?Bueno, bueno, bueno... si te haces esa preguntaeres de los que no nos ha leído nunca ;p Vale,muy rapidito... en principio, estás instalando unServidor Web en tu ordenador para que cualquierpersona de Internet pueda acceder a él y ver

PC PASO A PASO N° 14

Page 9: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack
Page 10: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

una página Web creada por t i ; pero en estecaso NO QUEREMOS que eso suceda, soloquieres practicar los ejercicios de PHP¿VERDAD? Pues entonces pondremos unapalabra muy rara llamada "localhost" (tal ycomo puedes ver en la imagen. Haciendo esto,SOLO TU y NADIE MAS QUE TU podrá accederal servidor, puesto que "localhost" significa quetu Servidor Apache será accesible en la IP127.0.0.1, una IP LOCAL a la que solo tu equipotiene acceso (para más información repasa losnúmeros anteriores).

ADMINISTRATOR'S E-MAIL... ¿qué pongo?Puedes poner un mail verdadero o un mailfalso (por ejemplo [email protected]),no importa, para más "info" repasa los númerosanteriores o pregunta en el foro de PC PASOA PASO (www.hackxcrack.com).

HTTP PORT DEFAULT... ¿?Esto ya se ha explicado mil veces, déjalo en el80 y así nos quitamos complicaciones. A partirde ahora cuando quieras acceder a tu servidorweb deberás abrir el navegador (Internet

Explorer, Netscape ) e ir a la direcciónwww.localhost.com o http://127.0.0.1 (esexactamente lo mismo)

6.- Pulsamos next :p y nos aparecerá otraventanita.

Fíjate MUY BIEN en que la instalación deAPACHE ya ha "finalizado", ahora estamos

instalando MySQL y que se nos está pidiendoun USER ÑAME (nombre de usuario) y unPASSWORD, pues venga, nosotros pondremosde nombre de usuario D0MINUS1 y de passwordDEM0NI01.

No cometas "el error del novato" (y te aseguroque todos lo hemos hecho muchas, muchas,muchas veces) de no apuntar el nombre deusuario y el password en un papelito. APÚNTATEEL NOMBRE DE USUARIO Y EL PASSWORD yrecuerda que está en MAYÚSCULAS, lonecesitarás cuando tengas que acceder a labase de datos (MySQL).

El CHARSET lo dejamos por defecto como"latinl" y pulsamos NEXT.

7.- LISTO!!!... a esperar que se instale y salgauna ventanita donde pulsaremos el botón CLOSE.

Fíjate que están marcados "Start Apache" y"Start MySQL"... pero dijimos que tambiénestábamos instalando el PHP ¿verdad? Bueno,pues gracias al APPSERV, el PHP se integra deforma totalmente automática en el ServidorApache :) (como ya hemos dicho, si quieressaber más repasa los números anteriores).

En este momento tendrás el Servidor APACHEinstalado y ejecutándose, para comprobarlo tansolo tienes que abrir tu explorador y poner

Página 10 PC PASO A PASO N° 14

Page 11: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

http://localhost (o http://127.0.0.1 -esexactamente lo mismo-) y pulsar enter :p,podrás ver la siguiente pantallita:

Ya tienes el APACHE configurado para poderejecutar código en PHP e incluso utilizar labase de datos MySQL Fíjate que debes tenerun nuevo ¡cono junto al reloj del sistema, esuna especie de semáforo, pues ese es eladministrador de MySQL, dejémoslo ahí por elmomento.

Ya está, ya estamos preparados!!! Y si estáspensando que toda esta explicación sobre lainstalación sobraba, tienes razón... pero claro,después a ver quien es el valiente que respondelos mails que nos llegan :)

En números anteriores de PC PASO A PASO aprendimos a instalary configurar el servidor APACHE, también vimos la instalación dePHP y MySQL y configuramos APACHE para poder operar con ellos.

Para cuando leas estas páginas intentaremos tener en la WEB losartículos en que tratamos este tema para que puedas descargarlosgratuitamente. De todas maneras, PC PASO A PASO es una especiede curso continuo donde todo lo que aprendes en un número anteriortarde o temprano es utilizado en números posteriores. Es muyrecomendable que no te pierdas ningún número!!! ;)

PC PASO A PASO N° 14

5. El primer programa

Ya está todo instalado, ¿verdad?, ahora vamosa crear un programa para que nos muestre enuna página web el famoso mensaje de "Holamundo".

Para programar puedes utilizar el bloc de notas,simplemente crea un fichero con extensión PHPy llámalo ejemplol, es decir, crea un ficherollamado ejemplol.php

Recuerda que este fichero tienes que colocarloen el directorio raíz del servidor web, si hasinstalado el Appserv la ruta es: c:\appserv\www\

Pon el siguiente código:

Para p r o b a r l o p o n la u r lhttp://127.0.0.1/ejemplol.php y verás elresultado. Mira el código y observarás que elcódigo PHP no se encuentra por ningún lado :)(Si pones http://localhost/ejemplol.php nodudes que también funcionará).

NOTA: ¿no sabes cómo ver el código de unapágina Web? Hay que ver... Bueno, vale... Sitienes el Internet Explorer 6, tan solo tienesque ir a una página cualquiera (por ejemplowww.google.com) y una vez visualizada ir almenú "Ver" y pulsar sobre la opción "CódigoFuente"... listo!!!

Este ejemplo es demasiado sencillo, pero muyútil para explicar los tags de PHP, el código PHPsiempre tiene que ir entre <? ... ?>, todo loque aparezca entre estos símbolos será

Página 11

Page 12: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

interpretado como PHP y ejecutado. En elejemplo anterior hemos mostrado el mensajeutilizando el comando ECHO de PHP.

Las sentencias en PHP finalizan con un puntoy coma, no olvides esto pues es un error comúnno finalizar una línea de código con el puntoy coma.

Es interesante conocer la configuración de PHP,phpinfo() nos proporciona información de granvalor como: el sistema operativo, servidor web,path donde se encuentra el fichero deconfiguración, librerías instaladas, ...

Otro ejemplo, veamos como está configuradoPHP, para ello creamos un nuevo programaaún más Simple: (igual que antes, escribe el códigoen el block de notas y guárdalo con elnombrequequieras.phpen el directorio c:\appserv\www\, después llámalo desdee l n a v e g a d o r e s c r i b i e n d ohttp://127.0.0.1/elnombrequequieras.php)

6. Empezamos de verdad con PHP y a todavelocidad

6.1 Variables.

En PHP las variables se representan como un signo de dólarseguido por el nombre de la variable. El nombre de la variablees sensible a minúsculas y mayúsculas. Un nombre devariable válido tiene que empezar por una letra o el signode raya, ejemplos:

Los enteros se puede especificar utilizando cualquiera delas siguientes sintaxis:

Importante: Las variables comienzan con el signo del dólar.Ejemplo de variables:

En PHP las variables se asignan por valor, ¿qué quiere deciresto?, pues si miramos el ejemplo anterior vemos que lavariable $c ha tomado el valor de la variable $a y que elvalor de la variable $a no ha cambiado, es decir siguevaliendo 100.

En PHP también se puede asignar variables por referenciay para ello hay que utilizar el signo &, pongamos un ejemplopara comprender a que se refiere por referencia:

PC PASO A PASO N°14Página 12

Page 13: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Según el ejemplo, la variable $varl toma elvalor "hacxcrack" y la variable $var2 es creadapor referencia apuntando a la variable $varl(fijaros que se ha colocado el signo &). Cualquiercambio que se haga en $var2 afectará a lavariable $varl, según este ejemplo la variable$var2 cambia de valor pero también lo hace lavariable $varl. El resultado es que tanto lavariable $varl y $var2 toman el valor "La mejorrevista hackxcrack".

Variables de variables

Tal vez lo que vamos a explicar no tengas queutilizarlo pero es conveniente saber que PHPacepta tener nombre de variables variables.No es juego de palabras, lo que quiere decires que son nombre de variables que se puedenusar dinámicamente.

Una variable normal se asigna de la siguientemanera:

Una variable variable tomará el valor de lavariable $a y lo convertirá en otra variables,para ello se utiliza dos signos $.

Con estos ejemplos hemos creado dos variables,una variable $a y otra variable llamada $hola.

Capturando variables externas

PHP puede capturar las variables enviadas porun formulario HTML para su posterior manejo,

PC PASO A PASO N°14

como ya sabéis un formulario HTML puede enviar los datosde dos maneras (POST y GET), PHP dispone de diferentesformas para capturar los datos.Para capturar una variable POST:

Pongamos un ejemplo sencillo, hagamos el típico programade "contactar", en donde el navegante desea enviar unmensaje al webmaster y para ello rellena un formulario. Losdatos serán enviados por email a [email protected].

Página 13

Page 14: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Las diferencias entre constantes y variables :• Las constantes no son precedidas porun símbolo de dolar ($)

• Las constantes solo pueden serdefinidas usando la función() define , nuncapor simple asignación

• Las constantes pueden ser definidas yaccedidas sin tener en cuenta las reglas dealcance del ámbito.

• Las constantes no pueden serredefinidas o eliminadas después deestablecerse; y

• Las constantes solo puede albergarvalores escalares

Conversión de variables

En PHP podemos convertir variables de un tipoen otro, para ello se antepone el tipo de datoque se quiere obtener, por ejemplo:

Funciones de variables

Gettype(), Esta función devuelve el tipo dedato, es utilizado para conocer el tipo de datode una variable. Ejemplo:

Settype(), Establece el tipo de dato que va aguardar una variable. Esta función no es

PC PASO A PASO N°14Página 14

E s t epeq u e ñ opero eficazprogramamuestra unformulariosolicitando 3d a t o s( n o m b r e ,ema i I ymensaje),los datoss o n

enviados a la misma página y se ejecuta el código PHP enel servidor, PHP recupera los datos enviados mediante$HTTP_POST_VARS y utiliza la variable $datos pare componerun mensaje, posteriormente el mensaje es enviado a ladirección [email protected]. En próximos capítuloshablaremos de la función mail(), aunque de esta forma tansencillo has aprendido a enviar emails utilizando el lenguajePHP.

ConstantesSe definen como constantes los valores definidos y que suvalor no va a ser modificado a lo largo de la ejecución de lapágina PHP. Por ejemplo, el número PI es una constante ypara definirlo en PHP como constante habría que hacer losiguiente:

Observa como en este caso no es necesario utilizar el símbolo$ delante del nombre de la constante, ya que no se tratarealmente de una variable si no de una constante.

Page 15: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

necesaria utilizarla cada vez que deseemoscrear una variable, aunque no estaría malutilizarla para evitar posibles errores ya quecuando los códigos son grandes uno ya nosabe que tipos de variables está manejando.Ejemplo:

Isset() , se utiliza para determinar si unavariable ha sido iniciada con un valor, si hasido asignada devuelve true.

Unset(), es utilizada para destruir variables y por lo tantopara liberar recursos. No olvides utilizar esta variable paraliberar memoria, es una función muy recomendada y espoco util izada (tal vez por desconocimiento).

7. Operadores

Primero vamos a nombrar los 4 principales operadores yluego haremos un ejemplo que muestre todos los operadores.

7.1 Operadores aritméticos

Con en la gran mayoría de lenguajes de programación, enPHP existen cinco operadores aritméticos:

Page 16: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

7.2 Operadores de comparación

Como su nombre indica son operadores que nos permiten

comparar dos variables.

7.3 Operadores lógicos

Son utilizados para combinar varias condiciones.

Ejemplo utilizando operadores:

Vamos a crear un sencillo programa que genere 10 cuentasde correo de un dominio y que les envíe un correo de saludo,además los usuarios de los mails serán números, es decir,[email protected], [email protected],... La verdad es que es unejemplo un poco tonto, pero seguro que muchos de vosotrosestaréis viendo otras aplicaciones, ¿verdad?

El código sería:

Página 16 PC PASO A PASO N°14

En el ejemplo podemos ver la instrucción for,lo veremos más adelante pero lo importantees fijarnos en el interior de los paréntesis dela instrucción for, muestra:

Asignación: $contador=lOperador de comparación: $contador< = 10Operador de incremento: $contador+ +

En el próximo número ...

Ya hemos roto el hielo, en el próximo númeroavanzaremos mucho más rápido. Mientraspodéis practicar con vuestros primerosprogramas en PHP, hacer pruebas y máspruebas, que muy pronto comenzaremos aprogramar sockets.

David C.M

Page 17: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Página 17PC PASO A PASO Nº 14

1. Introducción

Un mes más, nos enfrentamos a los protocolosmás importantes de la red, pero en este casose trata de un protocolo muy especial. Y afirmoesto principalmente por dos motivos. En primerlugar, porque es un protocolo que utilizamosconstantemente (cada vez que visitamos unapágina web, cada vez que escribimos un e-mail, cada vez que conectamos con un FTP,cada vez que hacemos Telnet a una máquina,etc, etc). Y en segundo lugar porque, porprimera vez en la ya veterana serie RAW, nose trata de un protocolo basado en TCP, si noen el aún desconocido UDP!

En realidad el protocolo DNS puede funcionartanto con TCP/IP como con UDP/IP, pero enla práctica el UDP es el que se utiliza, salvopara ciertas circunstancias especiales que yaveremos más adelante.

En vista de la novedad que esto supone,me veo obligado a comenzar el artículoexplicando brevemente en que consiste elprotocolo UDP, para luego pasar a losdetalles del sistema y el protocolo DNS, ypor último terminaré explicando lodevastadores que pueden llegar a ser losataques contra el sistema DNS. ¡Allá vamos!

2. El protocolo UDP/IP vsTCP/IP

No es plan ahora de explicar detalladamenteen qué consisten estos dos protocolos, ya queesto sería tema no para otro artículo, si no

para una serie completa, así que nosconformaremos con pillar sólo un poco la idea.Como ya sabemos, todos los datos en TCP/IPcirculan a través de una conexión entre uncliente y un servidor. Los datos podrán circularsiempre que se mantenga activa esa conexión,y si ésta se cierra habrá que establecer unanueva conexión si se desea continuar lacomunicación. Esto significa que el protocoloTCP/IP es un protocolo orientado a conexión.

Pero si lo pensamos detenidamente, nosdaremos cuenta de que en realidad no seestablece nunca ninguna conexión física entreel cliente y el servidor. En Internet no hay unassimpáticas telefonistas recibiendo todas laspeticiones de conexiones en espera de enchufarel cable que une el cliente con el servidor, sino que en realidad todo está conectado contodo. Por tanto, las conexiones que se establecenson virtuales.

Fig 1 . - Esquema del protocolo TCP/IP,orientado a conexión

En cambio, en el protocolo UDP/IP, no esnecesario establecer una conexión virtual parapermitir la comunicación, ya que se trata de unprotocolo no orientado a conexión. En este

Todo llega, y en esta ocasión le ha tocado el turno al PROTOCOLO DNS.

Por primera vez en la Serie RAW vamos a ver un protocola basado en UDP :]

El sistema DNS es el alma de Internet, aprende con nosotros su funcionamiento!!!

Page 18: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

caso, el cliente envía los datos directamentea la IP del servidor, sin ninguna seguridad desi éste escuchará su petición, o incluso de siéste existe. A costa de esta escasa Habilidad,el sistema es más rápido y sencillo que en elcaso de un protocolo orientado a conexión.

Fig 2.- Esquema del protocolo UDP/IP,no orientado a conexión

En el caso que nos ocupa, que es el delprotocolo DNS, que suele utilizar el protocoloUDP para el transporte de los datos (igual queFTP, HTTP, y todos los que hemos visto hastaahora utilizaban TCP para el transporte de losdatos), podemos tener cierta certeza de queel servidor ha escuchado nuestra petición, yaque éste responderá con otro bloque de datosen el que nos dará la respuesta a nuestrasolicitud.

El que ya no sabrá si esa respuesta nos hallegado o no es el propio servidor, ya quenosotros no le enviaremos ninguna confirmaciónde que la hemos recibido, pero eso ya esproblema nuestro, y en caso de que no nosllegase la respuesta probablementereintentaríamos la solicitud.

3. EL SISTEMA DNS

Entramos ya de lleno en el asunto, yempezaremos con una breve introducción(aunque espero que la mayoría sepáis ya enqué consiste el DNS), para luego pasar a detallarla arquitectura y el funcionamiento del protocolo.

Por supuesto, antes de nada os digo cualesson los RFCs que definen el protocolo, que sonel RFC 1034, y el RFC 1035 (ftp://ftp.rfc-

editor.org/in-notes/rfcl034.txt y ftp://ftp.rfc-editor.org/in-notes/rfcl035.txt)

Como ya sabemos, cualquier máquina conectadade forma directa a Internet tiene una direcciónúnica que la identifica.

Estas direcciones consisten en un número de32 bits, que se suele representar mediante 4dígitos separados por puntos. Cada uno deestos dígitos está en base 256, es decir, estáncomprendidos entre 0 y 255.

Por supuesto, estoy hablando de lasdirecciones IP. Con 32 bits se puedendireccionar más de 4 mil millones de máquinas.

Quizá esto nos pueda parecer mucho, pero enrealidad esta cifra se está convirtiendo en unproblema, ya que se está quedando insuficientepara el crecimiento exponencial de la red, porlo que éste es uno de los motivos por el quese está implantando el sistema IPv6 quesustituirá al actual protocolo IPv4 (y tambiéna otros tantos relacionados directamente), yque utilizará direcciones de 128 bits, lo cualpermitirá direccionar nada menos que variossixtillones de máquinas, lo cual es de esperarque sea suficiente mientras la raza humanasiga confinada en el planeta Tierra.

Todo esto os lo cuento para que penséis en elterrible problema que sería para cualquierpersona tener que acordarse de todos esosnúmeros, o bien tener que consultarlos cadavez que se quisiera acceder a una máquina,como si de una guía telefónica se tratase (dehecho, este sistema de "guía telefónica" fue elutilizado en los comienzos de la red Arpanet,ahora convertida en Internet, en la cual existíaun único fichero HOSTS.TXT que conteníatodas las direcciones de todas las máquinas dela red). A los seres humanos, en general, nose nos dan muy bien los números, ya quepreferimos utilizar las palabras. De ahí surgióla necesidad de realizar un sistema de traducciónde todos esos numerajos a palabras másintuitivas y más cómodas para el uso de loshumanos. Gracias a este sistema, podemos

PC PASO A PASO Nº 14Página 18

Page 19: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

escribir en nuestro navegador www.google.comen lugar de escribir 216.239.39.99 o, lo quesería peor aún:11011000111011110010011101100011(que es la dirección IP de Google en binario).

Además, este sistema de traducción de IPs anombres nos permite también no tener quedepender de los cambios de ubicación de losservidores. Si, por ejemplo, la IP de Googlecambiase, nosotros no tendríamos ni quesaberlo, ya que su nombre seguiría siendo elmismo independientemente de la IP, y seríaproblema del sistema DNS el apañárselas paraque la nueva IP estuviese asociada awww.google.com.

3.1. Arquitectura del sistema DNS

Esto que en principio puede parecerrelativamente sencillo, no lo es tanto, teniendoen cuenta que se trata de traducir miles demillones de direcciones que pueden estarapareciendo, desapareciendo, o cambiandoconstantemente.

Y el resultado de estas traducciones tiene queestar accesible para todos y cada uno de loscientos de millones de usuarios de la red. Portanto, este sistema requiere ante todo unaarquitectura inteligente que permita llevar acabo esta labor sin dar lugar a congestioneso cualquier otro tipo de problemas.

Empecemos imaginando el caso más sencillo:un único servidor DNS en Internet quemantuviese el registro de la base de datos detraducciones de direcciones IP a nombres.Cada vez que visitamos una página web, cadavez que escribimos un email, cada vez queconectamos con el IRC, cada vez que entramosen un FTP y, en resumen, cada vez quehacemos prácticamente cualquier cosa enInternet, necesitamos realizar una traducciónde nombres a IPs. Esto ocurre igual para cadauno de los millones de usuarios de Internet.Esto supondría que cada usuario lanzaría variaspeticiones de traducción por minuto, lo cual,multiplicado por el número de usuarios de la

red, supondría miles de millones de conexionespor minuto. Por supuesto, esto es totalmenteimposible de mantener para cualquier servidor.Y ni que decir tiene del problema que surgiríasi éste servidor se cayese, se estropease, otuviese cualquier otro problema...

Podemos pensar en una primera solución quesuavizaría bastante las cosas, y es que lasmáquinas de cada cliente fuesen almacenandoen su propia memoria las traducciones yasolicitadas previamente, para no tener quesolicitar una traducción cada vez que se quisieserealizar una conexión con la misma máquina.Así surge el concepto de cache de direcciones,que es un sistema que en efecto se utiliza,aunque de forma bastante más compleja, yaque se realiza a muchos niveles, y no sólo enla máquina del cliente. Pero analicemos la nuevasituación. Supongamos que, en el mejor de loscasos, el 80% de las conexiones fuesen conmáquinas cuya IP ya se tradujo anteriormente,por lo que no habría que volver a solicitar latraducción. En ese caso, aún ese 20% deconexiones seguirían generando un tráfico demiles de millones de conexiones, imposible desoportar por ningún servidor.

Por tanto, la única solución consiste endescentralizar el sistema de traducción. Quizáse os había ocurrido desde el principio como lasolución más obvia, pero... ¿os habéis paradoa pensar en los inconvenientes de ladescentralización?

Esto implicaría algún mecanismo para mantenerla coherencia de la base de datos detraducciones, ya que ésta ya no se encontraríaubicada en un único lugar, si no repartida a lolargo y ancho del planeta Tierra. De algunaforma, se tiene que conseguir mantener lacoherencia en una base de datos en la queaparecen, desaparecen, y se modifican datosconstantemente (cada día se conectan nuevasmáquinas a la red, y otras tantas cambian dedirección).La solución empleada consiste en una estructurajerárquica tal y como se muestra en el siguientegráfico:

PC PASO A PASO Nº 14 Página 19

Page 20: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Fig 3.- Ejemplo de jerarquía del sistemaDNS.

Como vemos, en primer lugar existe un dominioraíz (root, también representado por un simplepunto " .") . En este dominio raíz existenactualmente 14 servidores que contienen todosellos una base de datos con las direcciones IPde los servidores del nivel inmediatamenteinferior, es decir, de los servidores de losdominios .com, .net, .org, .es, etc, etc. Enestas máquinas no hay más información queesa, por lo que los servidores raíz no tienenni idea de lo que puede haber por debajo decada uno de esos dominios. Por ejemplo, éstapodría ser una tabla ficticia de la base de datosde un servidor raíz:

Esas direcciones IP corresponden a servidoresDNS de cada uno de esos dominios. Estosdominios que están por debajo del raíz sedenominan TLD (Top Level Domain), y existenmás de 200 actualmente. Podéis ver una listade los TLDs correspondientes a cada país enh t t p : / / w w w . i s o . c h / i s o / e n / p r o d s -services/iso3166ma/02iso-3166-code-lists/list-enl.html. Aparte de estos, están los TLDsgenéricos, como .com, .edu, .gov, etc. Para

el cómo gestione su nivel y, si quisiera, podríaañadir o eliminar nuevos subniveles en cualquiermomento, sin tener que informar al nivel raíz,ni a ningún otro nivel superior a él.

Pero entonces, cuando nosotros configuramosnuestra conexión a Internet, y tenemos queespecificar las direcciones de los servidoresDNS, ¿estamos introduciendo las IPs de losservidores raíz? Este sería un razonamiento

También podría tratarse de una tabla mixta, en

la cual, por ejemplo, la entrada jpl.nasa.govcorrespondiese a otro servidor de dominio, yel resto de entradas de la tabla fuesen yamáquinas concretas.

Por tanto, el concepto fundamental que hayque comprender es que cada nivel de lajerarquía delega por completo en los nivelesinferiores, por lo que es problema de nasa.gov

En el dominio nasa.gov, por ejemplo, podríamosencontrarnos con que los servidores son ya unahoja, es decir, un extremo final dentro de lajerarquía en árbol del sistema DNS. Por tanto,aquí las tablas ya no se referirían a otrosservidores DNS de subdominios inferiores, sino ya a máquinas concretas. Por ejemplo:

cada TLD, habrá varios servidores quemantendrán una misma copia de otras tablas,que serán las tablas con las direcciones de losservidores DNS de los niveles inferiores. Porejemplo, para un servidor .gov habría unaentrada correspondiente al servidor de DNS deldominio nasa.gov, y otra para el servidor deDNS del dominio whitehouse.gov:

PC PASO A PASO Nº14Página 20

Page 21: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

lógico por lo que hemos visto hasta ahora,pero en realidad sería una solución muy pocoefectiva, debido principalmente a dos problemas.

En primer lugar, los cientos de millones deusuarios de Internet tendrían que acceder aalguno de los 14 servidores raíz cada vez quequisieran solicitar una traducción. Teniendo encuenta el sistema de cache, esto sólo ocurriríapocas veces, ya que existen relativamentepocos dominios de primer nivel, o TLDs (.com,.es, .gov, etc), y en cuanto se accediese a unasola dirección de un determinado dominio, yaquedaría almacenada en nuestra cache ladirección de su servidor de dominio.

Pero según fuésemos bajando en la jerarquíairían ocurriendo cada vez más y más solicitudespor cada usuario, y también menoscoincidencias de cache.

Por tanto, al final, se tendría una red saturadade peticiones redundantes, en las cualesmillones de usuarios pedirían una y otra vezlas mismas direcciones (pensad, por ejemplo,cuántos usuarios diferentes habrán solicitadoalguna vez la traducción de www.google.com,www.hotmail.com, o cualquier otra direcciónpopular).

Pero, aparte de la saturación de la red, estaríael problema de la saturación del propio cliente,ya que éste tendría que realizar varias peticionescada vez que tuviese que realizar unatraducción.

Por ejemplo, si tuviese que traducir el nombreantwrp.gsfc.nasa.gov tendría que realizar enprimer lugar una conexión con el servidor raíz,en segundo lugar una conexión con el servidor.gov, en tercer lugar, con nasa.gov, y por últimocon gsfc.nasa.gov, el cual le daría la IPcorrespondiente a ese nombre. Desde luego,este sistema sería muy poco óptimo.

Fig 4.- Ventana de configuración deservidores DNS al instalar una conexióna Internet con un ISP.

Esas IPs no corresponden a servidores raíz, sino a servidores del propio ISP.

La solución a todo esto consiste en utilizarservidores de DNS comunes a todos los usuariosde un mismo ISP (proveedor de Internet, comoTelefónica, Ya, Madritel, Ono, etc). Por tanto,cuando un usuario de un ISP quiera realizaruna traducción, la solicitará siempre al servidorDNS de su ISP. Éste será el que realice todaslas tareas anteriormente descritas. Pero, ¿cualserá la gran ventaja? Que al ser este servidorcomún para miles de usuarios a los cuales habráatendido previamente sus peticiones, dispondráel servidor de una cache bastante completaque reducirá enormemente el número deaccesos a otros servidores DNS. Todas laspáginas populares (como Google, Hotmail, etc),así como las direcciones de los servidores DNSde los TLDs (como los .com, .net, .org...) seencuentran sin duda en la cache de losservidores DNS de todos los ISPs, y sutraducción normalmente no tiene que sersolicitada a los servidores de dominiocorrespondientes.

Página 21PC PASO A PASO Nº 14

Page 22: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Fig 5.- Interacción típica entre un usuarioy el servidor DNS de su ISP

Por supuesto, todo esto representaría unasituación ideal, pero en la práctica los contenidosde cache muchas veces no reflejan la realidad,al haberse efectuado cambios, por lo que losservidores DNS han de encargarse de actualizarsus contenidos de cache con los servidoresque garantizan que sus contenidos estánactualizados, que son los llamados servidoresauthor i ta t ive de cada subdominio.

Estos servidores authoritative, que son los queguardan las tablas de traducción reales pararada dominio (y no copias de cache), se dividenen dos tipos: maestro, y esclavos. Para cadadominio habrá un único servidor authoritativemaestro, y uno o varios esclavos. Cada entradade las tablas de traducción tiene asociado unparámetro TTL (Time To Live) que indicadurante cuánto tiempo se garantiza que esainformación es correcta. Cuando se supere eltiempo de TTL de una entrada, los servidoresesclavos conectarán con el maestro paracomprobar si los datos que contienen soncorrectos o han sido modificados. Por tanto,basta con que se realicen todos los cambiosen el servidor authoritative maestro paraque estos se propaguen automáticamenteal resto de servidores authoritative deldominio.

3.2. ¿Qué ocurre cuando realizamosuna petición de traducción?

Teniendo en cuenta esta estructura jerárquica,vamos a ver el proceso completo desde quesolicitamos, por ejemplo, una página web,hasta que conocemos su dirección IP para quenuestro navegador pueda realizar la conexión.Veamos que pasaría si, por ejemplo, pusiéramosen nuestro navegador la URL:http: / /neworder.box.sk/smsread.php?newsid=6586

3.2.1. Nuestro navegador analiza la URL

No todo lo que hay en esa URL es susceptiblede ser preguntado al servidor DNS.

Para empezar, el prefijo HTTP:// es sólo unainformación para que el navegador sepa conqué protocolo debe acceder a esos contenidos.En s e g u n d o l u g a r , e l s u f i j o/smsread.php?newsid=6586 es sólo un nombrede directorio, que el navegador debe conocerpara solicitarlo al servidor web, una vez quetenga la IP del mismo, tal y como vimos en elartículo sobre HTTP del último número de larevista.Por tanto, la consulta que tendrá que realizarfinalmente el navegador al servidor DNS seráesta: neworder.box.sk.

3.2.2. Nuestro navegador solicita latraducción al servidor DNS de nuestro ISP

Aquí terminaría la parte visible del proceso paranosotros, ya que los siguientes pasos seríanasunto de otras máquinas que se pelearíanpara conseguir una respuesta, mientras nosotrosnos rascamos la barriga tranquilamente.Por tanto, todos los esfuerzos de nuestronavegador consisten en solicitar al servidor DNSde nuestro ISP la traducción del nombre queindicamos en el anterior paso.Esto es lo que se llama una traducciónrecursiva, ya que nosotros solicitamos latraducción de un nombre, y ésta nos es devueltaen una sola respuesta, sin que tengamos queseguir nosotros uno a uno todos los pasos pararealizar la traducción.

PC PASO A PASO N° 14Página 22

Page 23: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Fig 6.- Nuestra máquina envía undatagrama UDP al servidor DNS denuestro ISP solicitando la traducción delnombre.

3.2.3. El servidor DNS de nuestro ISPbusca en su cache

Ahora la pelota ya está en el tejado del servidorDNS de nuestro ISP, pero como éste es muylisto, antes de armar más jaleo y pasar la pelotaa otro, lo primero que hace es buscar en sucache a ver si algún otro cliente (o quizá túmismo en el pasado) ha solicitado antes esatraducción, por lo que podría darnos unarespuesta inmediata.Si no encuentra ese nombre en su cache, notendrá más remedio que pasar la pelota.

7.- El servidor nos responde directamentecon la traducción, ya que tenía el datoen cache.

Suponiendo que no hubiera encontrado latraducción en su cache, tendría que hacer unaserie de consultas bajando por la jerarquía enárbol hasta llegar a la traducción del nombredeseado. Al tener que realizarlo paso a paso,se trata de una traducción iterativa, al contrariode la traducción recursiva que solicitábamos

nosotros como clientes del ISP.Lo más lógico sería que el servidor de nuestroISP empezase por buscar en su cache si tienela dirección del servidor DNS del dominio .box.sk.En caso de que no fuese así, buscaría la direccióndel servidor DNS del dominio .sk, que es ya unTLD.Suponiendo que no tuviese en cache ningunode estos datos, continuamos viendo el proceso.

3.2.4. El servidor DNS de nuestro ISPconsulta a un servidor del dominio raíz

Nuestro servidor tendrá que empezar porconectarse con uno de los 14 servidores raízpara solicitar las direcciones de los servidoresDNS del TLD (dominio de primer nivel) .sk. Notiene problemas para hacer esto, ya que todoslos servidores DNS, aunque tengan su cachetotalmente vacía, conocen siempre lasdirecciones de los servidores raíz. Esresponsabilidad de los administradores de losservidores DNS el mantener al día las direccionesde los servidores raíz.

Fig 8.- El servidor de nuestro ISP consultacon el servidor raíz, y éste le da la listade servidores del TLD .sk

El servidor raíz le devolvería una lista con lasdirecciones de todos los servidores DNS delTLD .sk. De esa lista, nuestro servidor escogeríauno cualquiera, y continuaría el proceso.El algoritmo de nuestro servidor para escogeruna de las direcciones podría ser tan simplecomo escoger siempre el primero de la listaque le devuelva el servidor raíz. Esto podríasuponer un serio problema, ya que la carga delprimer servidor sería enorme, mientras que losdemás servidores prácticamente no se usarían.Para evitar esto, el servidor raíz no nos dará lalista siempre en el mismo orden, si no que la

PC PASO A PASO N° 14 Página 23

Page 24: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

dará en un orden aleatorio, por lo que elprimero de la lista será siempre uno diferente.Normalmente, estas direcciones que nos hadevuelto el servidor raíz quedarán almacenadasen la cache de nuestro servidor.

3.2.5. El servidor DNS de nuestro ISPconsulta al servidor DNS del TLD .sk

Una vez escogido un servidor DNS del TLD,consulta con éste el siguiente paso en lajerarquía, es decir, la dirección de los servidoresDNS del dominio .box.sk.De nuevo, nuestro servidor escogerá uno dela lista para la siguiente consulta, y almacenarála lista devuelta en su cache.

Fig 9.- Nuestro ISP consulta con elservidor del TLD .sk, el cual le da la listade servidores del dominio .box.sk.

3.2.6. El servidor DNS de nuestro ISPconsulta al servidor DNS de .box.sk

Por último, sólo falta consultar al servidor quedefinitivamente debería conocer la IP de lamáquina a la que queremos acceder:neworder.box.sk. En esta ocasión, el servidorDNS del dominio .box.sk normalmente nosdevolverá una sola IP, aunque si se trata depáginas con mucha carga, podría estar repartidaésta en varias máquinas con copias exactas(mirrors) de la página, por lo que nosdevolverían una lista de IPs, de la cual escogeríauna nuestro servidor.

Página 24 PC PASO A PASO Nº 14

Fig 10.- Nuestro ISP consulta con elservidor de .box.sk, y éste finalmente leda la IP de neworder.box.sk

3.2.7. El servidor DNS de nuestro ISP nosdevuelve la traducción

Una vez que ya ha completado todas lasconsultas iterativas, nuestro servidor DNS nosenviará un mensaje UDP conteniendo larespuesta a nuestra consulta. :-D

Fig 11.- El servidor de nuestro ISP nosresponde con un datagrama UDP.

3.3. Tipos de recursos en DNS

Según leíais todo lo anteriormente explicado,probablemente os habrá surgido una duda, yes: ¿cómo sabemos si la respuesta que nos daun servidor es la IP de otro servidor o bien laIP de una máquina? Eso quizá sea posible

Page 25: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

saberlo según el contexto, pero los datos queestán almacenados en las tablas de losservidores DNS carecen de ningún contexto,por lo que tiene que estar también almacenadocon cada entrada de la tabla un dato queindique a qué se está refiriendo.

El tipo de cada entrada de estas tablas es unode los parámetros de lo que se define comoRR (Resource Record), y es un dato que hade ser enviado en cada respuesta junto con latraducción.

Pero no sólo existen dos tipos de RRs quedefinan si se trata de una IP de una máquinao de un servidor DNS, si no muchos otros.

La l is ta comple ta la tené is enhttp:/ /www.iana.org/assignrnents/dns-parameters , pero tranquilos, que os voy aresumir aquí los más importantes. :-)

NS (Ñame Server) - La dirección se refierea la IP de un servidor DNS. (ej: .box.sk)

A (Address) - La dirección se refiere a la IPde una máquina, (ej : neworder.box.sk)

PTR (Pointer) - Se trata de una entradainversa, es decir, en lugar de ser la IPcorrespondiente a un nombre, es el nombrecorrespondiente a una IP.

MX (Mail Exchange) - Ladirección se refiere al servidor decorreo de un dominio concreto,vimos algo sobre esto en el artículosobre SMTP, en el número 8 de larevista.

Según el tipo de RR, la cabeceraserá diferente. Se pueden ver lascabeceras para todos los tipos enel RFC 1035.

Por tanto, en nuestro ejemploanterior, el usuario consultaba alservidor DNS de su ISP una direcciónde tipo A, mientras que el servidor

DNS de su ISP realizaba una serie de consultasde tipo NS a varios servidores, hasta que alfinal al último le hacía una consulta de unadirección tipo A.

3.4. Detalles del protocolo RAW

Para ver en "crudo" el protocolo DNS vamos autilizar ingeniería inversa para analizar una"sesión" DNS. Pongo sesión entre comillasporque debemos recordar que DNS funcionamediante UDP, por lo que no existe una conexiónestablecida, si no que cada mensaje esindependiente. Yo he usado para el ejemplo elsniffer Ethereal, que es un sniffer gráfico paraLinux. Simplemente he puesto en captura elsniffer y he escrito en la consola de Linux:

host www.hackxcrack.com

Este comando sirve típicamente para resolverun nombre. Suponiendo que la direcciónsolicitada no se encuentre en el archivo/etc/hosts ni en ningún tipo de cache, estecomando lanzará una solicitud de traducción aun servidor DNS, el que esté configurado pordefecto en el sistema.

3.4.1. Consulta

Vamos a ver la captura de pantalla de Ethereal:

Fig 12.- Captura de pantalla de Ethereal, mostrandola consulta realizada al servidor DNS.

Página 25PC PASO A PASO Nº 14

Page 26: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

En la ventana de arriba tenemos la lista depaquetes recibidos. Los dos primeros no tienenningún interés, ya que es simplemente unaconsulta de ARP a la dirección broadcast parabuscar la dirección MAC de mi router. Si nohabéis entendido ni una palabra, quizá es queharía falta algún artículo sobre el protocoloMAC. ;-)

Los que nos interesan ahora son los dospaquetes siguientes. Si hemos visto capturasde sesiones TCP sabremos que suele haberuna serie de paquetes adicionales que nocontienen datos, que son los que se utilizanpara establecer y para cerrar la conexión. Eneste caso vemos que la cosa es mucho mássencilla, ya que sólo hay 2 paquetes: unaconsulta, y su consiguiente respuesta.

Esto, por supuesto, es debido a que se tratadel protocolo UDP, que no es orientado aconexión.

En la ventana de en medio vemos los detallesdel paquete UDP que hemos enviado nosotroscomo consulta.

Como vemos, no sólo se envía el nombre quequeremos traducir, si no también una cabeceracon una serie de datos necesarios para laconsulta.

El primer dato de la cabecera es elidentificador de transacción (transactionID) que consiste en 2 bytes que identifican unpar consulta-respuesta, es decir, la respuestaa esta consulta tendrá que tener el mismoidentificador de transacción, para que el clientesepa que esa respuesta es precisamente laque está esperando a esa pregunta.

Vemos que se envían también dos bytes conuna serie de flags, es decir, una serie de bitsque, según estén a 0 o a 1 tendrán unsignificado u otro.

El primer flag indica que el paquete enviadose trata de una consulta, y no de unarespuesta. Para ello, hay que poner ese flaga 0.

El segundo flag se codifica mediante 4 bits. Eneste caso, 0000, se trata de una consultaestándar, que son las que utilizaremosnormalmente.

Después, tenemos un flag a 0 que indica queel mensaje no está truncado, lo cual es lohabitual.

Después, vemos un flag con valor 1 que indicaque la solicitud que hacemos queremos quesea recursiva. Si estuviese a 0, la solicitudsería iterativa, y en ese caso nuestra máquinatendría que realizar uno a uno todos los pasospara resolver el nombre, tal y como vimos quehacía el servidor DNS de nuestro ISP. Como,por supuesto, queremos delegar esta arduatarea en nuestro ISP, que para eso está,activaremos este flag.

Finalmente, el último flag indica que exigimosque la respuesta contenga información paragarantizar su autenticidad.

Después de los flags hay 4 campos más queindican cuál será el contenido de los datossiguientes. En este caso, se tratará únicamentede una consulta.

Después de la cabecera, está el nombre de laconsulta: www.hackxcrack.com, y por últimose codifica el tipo de consulta que, en estecaso, es tipo A.

3.4.2. Respuesta

Con respecto a la respuesta del servidor, hayque explicar unas cuantas cosas más.

Fig 13.- Cabecera de la respuesta.

PC PASO A PASO Nº 14Página 26

Page 27: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Página 27PC PASO A PASO Nº 14

En primer lugar, podemos comprobar que, en

efecto, el identificador de transacción es

el mismo que el de la consulta anterior (11aa,

en hexadecimal).

A continuación, tenemos los dos bytes de flags,

cuyo significado en este caso es diferente. Al

ser 1 el primer bit, lo cual quiere decir que se

trata de una respuesta, y no de una consulta,

el significado del resto de bits se interpretará

de forma diferente.

Después de los 4 bits del identificador del tipo

de consulta vemos que hay un bit a 0 que

indica que el servidor DNS no es

authoritative, lo cual es lógico, ya que se

trata del servidor DNS de nuestro ISP, y éste

normalmente no será authoritative para los

dominios que consultemos. El próximo flag

nuevo que vemos es el llamado Recursion

Available que, como vemos, está a 1 ya que,

por supuesto, el servidor DNS de nuestro ISP

tiene que aceptar solicitudes recursivas,

que son las que le harán siempre sus clientes.

El siguiente flag, Answer authenticated,

indica que no se ha utilizado autenticación,

lo cual es un asunto que no veremos por falta

de espacio. Por último, un código de error

codificado con 0000 nos indica que todo ha

ido correctamente y no hay ningún error.

Los próximos 4 campos nos indican que aparte

de esta cabecera habrá un RR de respuesta,

dos RRs de autoridad, y dos RRs adicionales.

Por supuesto, vamos a ver todo esto ahora

mismo.

El campo de datos comienza con una replicación

de la consulta que realizamos nosotros

previamente.

A continuación, se encuentra el primer RR,

que es el de respuesta.

Fig 15.- RRs de autoridad.

Como vemos, el tipo de estos RRs es NS,ya que se trata de servidores DNS, yno de direcciones de máquinas. Enestos RRs de autoridad sólo se incluye losnombres de los servidores authoritative, perono sus direcciones IP. Éstas se encuentrantraducidas en los 2 RRs adicionales quecompletan la respuesta.

Fig 14.- RR de respuesta.

Como vemos, el tipo de este RR es A (HostAddress), y vemos que se encuentra tambiénel campo TTL (Time To Live) del que hablamosanteriormente, que indica durante cuántotiempo, como máximo, será valida estatraducción. La IP 217.174.193.62 es la tanansiada respuesta a nuestra consulta, es decir,la IP asociada al nombre www.hackxcrack.com.

Después del RR de respuesta, se encuentrandos RRs de autoridad, que son los queexigimos en nuestra consulta para garantizarla autenticidad de los datos.

Page 28: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Fig 16.- RRs adicionales.

Con todo lo que hemos visto hasta ahora, nosdamos cuenta de que el protocolo DNS escomplicado de manejar en su forma cruda(RAW), ya que la mayoría de los campos seencuentran codificados, así que he consideradoque, más interesante que saber manejarlo, esel saber interpretarlo a grandes rasgos.

Supongo que recordaréis que he mencionadoque en ciertas ocasiones se utilizaba TCP enlugar de UDP. Esto suele ocurrir en 2 situacionesconcretas. En primer lugar, en las transaccionesque realizan ios servidores de un dominio paramantener la coherencia en sus bases de datos(esclavos solicitando entradas caducadas almaestro), y en segundo lugar en las solicitudes

con una longitud mayor de 512 bytes,lo cual es poco habitual.

4. Algunos problemas deseguridad del sistema DNS

4.1. Ataques DoS

El 21 de Octubre del año 2002 se registróuno de los mayores ataques contra todala red Internet, que consistió precisamenteen un ataque DoS distribuido contra los13 servidores raíz del sistema DNS. Elataque duró aproximadamente una hora,y "sólo" consiguió afectar con ciertaseriedad a 7 servidores.

Debido a esto, las consecuencias del ataqueno fueron demasiado importantes, ya que sólo

un pequeño porcentaje de solicitudes quedósin respuesta durante ese breve periodo de unahora.

En principio, nos puede parecer que debiótratarse de un problema terrible, pero en realidadno lo fue tanto. En primer lugar, tal y como yahemos visto, el número de accesos directos alos servidores raíz es relativamente pequeño,ya que la mayoría de los servidores DNS ya hanrealizado gran número de consultas previas alos servidores raíz, por lo que tienen en sucache prácticamente cualquier consulta quepudiesen necesitar de los servidores raíz. Porsupuesto, estas caches tienen un tiempo devida (recordemos el parámetro TTL), pero ensólo una hora que duró el ataque el númerode nuevas consultas tuvo que ser muy reducido.Por otra parte, los expertos afirman que elsistema DNS puede funcionar sin problemassiempre y cuando funcionen 5 de los 14servidores raíz, y en este caso no se vieronafectados 6 servidores, por lo que el sistemapodía soportar la carga.

Un problema potencial de los servidores raíz esque no tienen una distribución geográficaadecuada, ya que 10 de ellos están situadosen Estados Unidos. Actualmente, está en marchaun plan para mejorar esta distribución y, porejemplo, el décimo cuarto servidor raíz fueinstalado nada menos que en España. :-D

Fig 17.- Localización geográfica de 13 delos 14 servidores raíz del sistema DNS. Eldécimo cuarto se ubica en España.

PC PASO A PASO Nº 14Página 28

Page 29: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

4.2. Envenenamiento de cache DNS

Llegamos al fin a una técnica realmenteinteresante y bastante avanzada, pero muypeligrosa por sus consecuencias, y que norecomiendo en absoluto que sea utilizada.

¿Se os ha ocurrido pensar que ocurriría sialguien consiguiese engañar al servidor DNSde vuestro ISP al hacerse pasar por un servidorauthoritative? Pues, como habréis adivinado,la cache de vuestro servidor se llenaría detraducciones falsas que él consideraría comoválidas.

Cuando vosotros o cualquier otro clientesolicitase una de estas traducciones a vuestroservidor, éste os respondería con la traducciónfalsa que almacenó en su cache. Imaginad porejemplo que la IP que solicitáis es la de vuestrobanco, o la de vuestra cuenta de correo.

El atacante podría haber creado una páginaexactamente con la misma apariencia que lapágina de LOGIN para entrar en vuestra cuentadel banco o vuestra cuenta de correo, y haberubicado esa página en su propia máquina.Bastaría con que envenenase la cache devuestro servidor DNS haciéndole creer que esebanco o ese servidor de correo se ubicaba ensu propia máquina, para que cualquier usuarioque intentase acceder a esa página accedieseen realidad a la máquina del atacante,introduciendo confiadamente sus datos deusuario y password.

Por supuesto, como pillen al atacante se lepuede caer el pelo, ya que puede causarauténticos estragos, teniendo en cuenta queun servidor DNS puede servir a miles deusuarios.

Por otra parte, otro inconveniente para elatacante es que tiene que repetir el mismoataque cada cierto tiempo, ya que los contenidosen cache, como ya sabemos, tienen un tiempode vida (TTL), y transcurrido ese tiempo elservidor envenenado volvería a solicitar lastraducciones caducadas.

Fig 18.- Esquema básico de unenvenenamiento de cache. Si la respuestadel atacante llega antes que la del servidorauthoritative, será ésta la que se tomepor válida.

Pero, ¿cómo es posible engañar a un servidorDNS? Pues la respuesta depende de quésoftware utilice el servidor. La inmensa mayoríade servidores DNS del mundo utilizan el popularsoftware BIND, por lo que nos centraremossólo en éste.

Para responder a esta pregunta tendremos queempezar por analizar el problema. Pensemosantes de nada en los mecanismos que se utilizanpara comprobar la autenticidad de una respuestaDNS. En primer lugar, al utilizarse como protocolode transporte UDP, no habrá que "colarse"dentro de ninguna conexión, lo cual es la primeraayuda para el atacante. Colarse en una sesiónTCP es bastante complicado, ya que no bastacon conocer las IPs de origen y destino, asícomo los puertos de origen y destino, si noque también es preciso conocer los númerosde secuencia TCP. Sería necesario un artículosobre el protocolo TCP para que comprendáisesto, así que quedaos simplemente con la ideade que es muy complicado colarse dentro deuna conexión TCP. En cambio, en el caso deUDP, no hay números de secuencia, por lo quebasta con saber las IPs de origen y destino,así como los puertos de origen y destino.

PC PASO A PASO N° 14 Página 29

Page 30: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

En el caso que nos ocupa, la IP de destinoserá la del servidor víctima, ya que éste seráel que realizará una consulta al servidorauthoritative, cuya respuesta dará el atacanteen lugar de éste.

La IP de origen es la del servidorauthoritative auténtico, que el atacantetendrá que spoofear, es decir, enviar suspaquetes con esa IP en lugar de con su propiaIP.

Se sale del tema del artículo explicar las técnicasde IP spoofing.

Con respecto a los puertos, el tema es bastantemás complicado, ya que si bien el puerto deorigen sabemos que es el 53 (puerto UDP deDNS) el puerto de destino será un puerto"aleatorio" que utilizó el servidor víctima parasu consulta.

En la práctica existen formas de averiguar estepuerto, debido a que BIND no utiliza siemprepuertos aleatorios para sus consultas, si noque repite el mismo número de puerto.

¿Y ya está todo con eso? Bueno, hemos habladode como spoofear una respuesta UDP genérica,pero en nuestro caso nos encontramos con elcaso concreto del protocolo DNS, y esteprotocolo añade un elemento adicional de"seguridad", que es el de los identificadoresde transacción (transaction IDs).

Una respuesta, aunque teóricamente provengadel servidor authoritative y utilice el mismopuerto UDP, no será aceptada como válida sitiene un identificador de transacción diferenteal de la consulta. Y aquí, en la predicción delidentificador de transacción, es donde el temadepende de qué software utilice el servidorvíctima.

Hasta el año 1997, cuando el CERT (ComputerEmergency Response Team) comunicó elpertinente aviso de seguridad sobre BIND, ésteutilizaba identificadores de transacciónsecuenciales, y no aleatorios, por lo que

predecir el identificador era una tarea totalmentetrivial.

En cambio, actualmente es de esperar quetodos los servidores hayan actualizado susversiones de BIND y no creo que quede en elmundo uno solo que aún utilice identificadoressecuenciales.

A pesar de que los identificadores pasaron aser aleatorios, existen gran cantidad de teoríasmatemáticas y estadísticas sobre los númerospseudo-aleatorios, que son los que enrealidad genera un ordenador, y estas teoríaspermiten calcular la probabilidad de éxito segúnel sistema de generación de números utilizado.

En primer lugar, aunque no hay que contar conello si el servidor cuenta con un administradoreficiente, BIND puede generar múltiplesconsultas para consultar un sólo dominio, porlo que recibirá varias respuestas del mismoservidor authoritative.

Esto da lugar a que el atacante no tenga queadivinar un identificador de transacción único,si no que le bastaría con adivinar uno de losmuchos identificadores que habría utilizado elservidor en sus múltiples consultas.

Analizando esto desde el punto de vistaestadístico, nos encontramos con la interesante"paradoja del cumpleaños" (birthdayparadox) que afirma que en un grupo de 23personas, la probabilidad de que dos de ellastengan la misma fecha de cumpleaños essuperior al 50%.

A mi me gusta más expresar esta idea desdeun punto de vista mucho más gráfico, queconsiste en imaginar un parking con 365 plazas,en el cual entrasen 23 coches con las lucesapagadas, y pensar en la probabilidad de quedos de ellos se estrellasen al intentar ocupar lamisma plaza.

Esta misma idea estadística se puede aplicar alcaso que nos ocupa aunque, por supuesto,manejando diferentes cifras.

Página 30 PC PASO A PASO Nº 14

Page 31: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Así, se llega a la conclusión de que con "sólo"enviar 700 respuestas spoofeadas, laprobabilidad de que alguna de ellas coincidaen el identificador de transacción es cercanaal 100%.

Fig 19.- Esquema detallado de un ataquede envenenamiento. En el paso 1, elatacante hace repetidas solicitudes deldominio que se quiere envenenar. En elpaso 2, el servidor de la víctima consultaese dominio repetidas veces con elservidor authoritative. En el paso 3, es elatacante el que responde haciéndosepasar por el servidor authoritative. Eneste caso, el atacante se ha ayudado deun DoS al servidor authoritative que leimpide enviar las respuestas legítimas,por lo que no hay conflicto entrerespuestas falsas y auténticas.

Pero claro... el servidor authoritative legitimo,y no sólo el atacante, responderá también ala víctima. Aquí nos encontramos con unconflicto en el que unas veces podrá ganar elatacante, y otras el servidor authoritative,según quién consiga dar antes su respuesta.Por eso, este tipo de ataques aumentan muchosu efectividad si se combinan con ataques DoS

a los servidores authoritative, ralentizando oincluso anulando sus respuestas.

Si tratamos con servidores bien configuradosque no hagan múltiples consultas para un sólodominio, tendremos que entrar de lleno encomplicadísimas teorías matemáticas cuyaexplicación se sale por completo de lo quepuede abarcar este artículo. A modo de ejemplo,os comento que con el sistema de generaciónde números pseudo-aleatorios de BIND 8.xse puede tener una certeza del 1 0 0 % deadivinar el identificador de transacción con tansólo 3 paquetes! :-0

En cambio, con BIND 9.x la cosa es ya muchomás complicada, ya que incluso con 5000paquetes la probabilidad de éxito es sólo del2 0 % . Esto es debido a que el sistemagenerador de números pseudo-aleatorios esmatemáticamente mucho más impredecible y,por tanto, mucho más eficiente.

Autor: PyC (LCo)

PC PASO A PASO Nº 14 Página 31

Page 32: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack
Page 33: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Como no. seguimos con nuestro particular curso de Visual Basic.

Gsta vez necesitaremos algunos conceptos básicos de acceso a Bases de Datos [SQL].

SELECT". "FROM" . "WHERE"

Os doy la bienvenida a esta segunda parte demi última entrega. Bien, donde lo dejamos...¡Ah!, Sí, habíamos acabado el control de Stock.Pero faltaba algo, creo que en el último númerodije que había un gazapo en el código de alta.Por supuesto, lo vamos a solucionar. Aquítenemos el código de alta:

No es lógico que demos de alta un nuevoproducto en el stock si este ya existe, es decir,si tenemos 30 Calipos de menta, e introducimosen la tabla de Stock 10 Calipos de menta,deberíamos tener un total de 40 Calipos dementa y no un registro con 30 y otro con 10independientes.

Os reté a que lo arreglarais sin mi ayuda, yestoy seguro de que algunos lo conseguisteis.Aquí os voy a contar una manera sencillaaunque no sea la más óptima. En este punto,deberíamos hacer una introducción al SQL. Noos voy a dar la lata con historia, pero si decirosque el SQL es un standard que nos permiterealizar consultas sobre una base de datos.

Está compuesto por varias partes:

• La primera es la cláusula "SELECT",donde indicamos los campos que queremostraernos de la tabla, siendo el carácter "*" todoslos campos.

• Posteriormente incluimos la cláusula"FROM", donde indicaremos de qué tabla sonlos campos descritos anter iormente.

• La cláusula "WHERE" nos indica unacondición, por ejemplo, "cuando el sabor seamenta".

Estas suelen ser las básicas, aunque la parteque comprende el "WHERE" se puede omitiren caso de que se quiera recoger todos losregistros de una tabla. También se puedenhacer ordenaciones o agrupaciones de losregistros que nos hemos traído con nuestroSQL.

Voy a poner varios ejemplos para entenderlomejor. Digamos que al abrir el Recordset, envez de poner el nombre de la tabla escribimos:

Estaríamos realizando exactamente el mismoefecto que si solo escribiéramos la tabla, perosi añadimos una pequeña cláusula más:

Página 33

Estaríamos recibiendo solo aquellos registros

PC PASO A PASO Nº 14

Page 34: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

que tengan en el campo Nombre el literal "Calipo". Analicemosla sentencia:

• "Select *", con esto estamos diciendo que queremostraernos todos los campos de la tabla, en este caso, "Nombre,Sabor, Cantidad, Id".

• La siguiente cláusula: "from Stock". Quiere decir queestamos interactuando con la tabla Stock, y que los datosque vamos a traernos son de esta tabla. "WhereNombre='Cal¡po"'. Esto filtra los datos que nos va a devolverla consulta. Le está diciendo al Recordset que solo traigaaquellos registros con nombre "Calipo".

Para ver como funciona, haremos una prueba temporal conel código que tenemos. Vamos al evento Form_Load() delformulario Stock y cambiamos el código al que vemos acontinuación:

Vemos que la única variación está en el "Rs.Open", quehemos cambiado el literal con el nombre de la tabla por lasentencia SQL. Ejecutamos, y si todo ha ido bien, solo

Página 34 PASO A PASO Nº 14

deberíamos ver por pantalla aquellos helados que sean"Calipo".

Espero que halláis entendido, muy por encima, el SQLPodríamos dedicar varios números a esto, pero no creo quesea necesario para este ejercicio.

Vale, pues entonces, vamos a arreglar esa pequeña erratacon una sencilla consulta SQL. Tenemos que codificar elcódigo donde estamos modificando registros de tal maneraque, desde ahora, cada vez que se intente dar de alta unhelado, y este se encuentre en la tabla, se sumen lascantidades, en lugar de dar de alta uno nuevo. Mi propuestade código es la siguiente:

Page 35: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Pasamos a comentarlo:

La comprobación de campos la dejamos talcual, pero inmediatamente después cerramosel Recordset para abrirlo posteriormente conuna SQL que busque un helado con los mismosvalores que los que tenemos en las cajas detexto.

Podemos observar que en la cláusula "WHERE"de la sentencia,combinamos texto convalores de las cajas detexto. Para hacer estotenemos que anidar oconcatenar los literalescon el operador "&" y,además, rodear losTextBox con comillassimples, siempre ycuando lo que estamosbuscando sean valoresno numéricos.

El resultado de estasentencia sería "Select* from Stock whereNombre='Calipo' andsabor='Menta'", en elc a s o en q u epusiéramos estosvalores (Calipo ym e n t a ) . E s t ab ú s q u e d a nosdevolverá verdadero ofalso en la propiedad"EOF" del Recordset.

Posteriormentecomprobamos si se haencontrado algúnregistro con estos valores, y de ser así, en vezde dar de alta, modificamos el campo cantidad,avisando con un mensaje en pantalla. Y conesto podemos dar por finalizado, de momento,el formulario Stock.

Ahora vamos al formulario. Será básicamenteigual al de stock, más otra caja de texto queañadiremos para la fecha, aunque esta, en unprincipio, vendrá dada por el sistema.Este sería un posible diseño:

Vamos a diseñar la tabla de entradas. Seráidéntica a la tabla de Stock, más un campo detipo Fecha que nos dirá que día fue incluidaesa entrada. Para que nos entendamos, lasentradas serán cajas de helados que nos traende otras fábricas y están pendientes de validaciónpara dar de alta en el stock. Por lo tanto, latabla quedará así.

Página 35PC PASO A PASO N° 14

Page 36: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Introduzcamos un registro o dos en la tablade entradas desde el administrador de MySqlque estemos usando. Esto se hace haciendodoble click sobre la tabla en el MySql ControlCentral y, con el botón derecho, insertar nuevafila. Por ejemplo, yo he vuelto a añadir unocon Calipos de menta.

El código que hay entre el formulario de Stocky este no es muy diferente. Veamos que casies un Copy - Paste del mismo, con algunasvariaciones, claro. Este sería el Form_Load

Es básicamente igual al anterior, con lapeculiaridad que ahora tenemos una nuevacolumna (Fecha), que debemos incluir en lalista. En el botón "Nuevo", haremos que secargue la fecha del sistema por defecto,permitiendo que el usuario pueda cambiarla.

Lo único que tenemos que hacerpara esto es introducir en la cajade texto "Fecha" el valor de lafunción "Date".

También tenemos unas pequeñasvariaciones en las rutinas parahabilitar y deshabilitar los camposde texto, obviamente debemostratar nuestro nuevo objeto.

PC PASO A PASO N° 14Página 36

Page 37: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

He puesto puntos suspensivospara no rescribir todo el códigootra vez. Volvamos unmomento a la lista. Pulsemossobre el botón "Personalizado"y activemos la casilla"CheckBoxes" de la primerapestaña.

Aceptamos y vemos que en la primera columnanos aparece una casilla del tipo check. Siejecutamos el programa apreciaremos mejorcomo nos aparece cada uno de los registroscon un campo de tipo check. ¿Por qué lo hemospuesto? Os preguntareis. Pues porque ahoravamos a añadir un nuevo botón, el cualllamaremos "Validar", y que nos introducirá en

Como vamos a utilizar checks para la selección de los registrossobre los que queremos actuar tenemos que hacermodificaciones en el botón aceptar, ya que ahoranecesitaremos un bucle que recorra todas las entradasvisibles en la lista y actuar contra las seleccionadas. Paraello yo voy a utilizar un bucle de tipo "FOR", ya que es elmás indicado para este tipo de operaciones. Sería absurdoaplicar esto sobre una modificación de entrada, ya que solose puede modificar un registro a la vez, pero talvez si estaríahacerlo en la eliminación, ya que podríamos borrar variasentradas de golpe.

Añadimos dos líneas de código nuevas en las rutinas dehabilitar y deshabilitar botones.

el Stock todos aquellos registros que seleccionemos en estelist.

PC PASO A PASO Nº 14 Página 37

Page 38: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Este sería el código:

Expliquémoslo:En caso de que se seleccione la opción borrar, abrimos unbucle de tipo "FOR". Anteriormente hemos declarado unavariable de tipo Integer para recorrer los objetos de la lista.

Vemos el bucle: For i = 1 To Lista.Listltems.Count - 1Le estamos diciendo que se repita desde la primera posiciónhasta la última, que sería el .Count - 1, porque el .Countsería uno después, y nos daría un error. A su vez, este bucleincrementa automáticamente la variable " i " en 1, para quepodamos referirnos cada vez a un registro de la lista diferente.

Justo después vemos una sentencia condicional que preguntasi el registro " i " (sabemos que i se va incrementando hastael total de filas en la lista) esta "checked". Si es así, nosposicionamos al principio y buscamos, con el método Find,el registro correspondiente en la base de datos.

El resto es igual, preventivamente decimos con otra sentenciacondicional que si la propiedad EOF del Recordset no esfalso, lo borre con el método Delete. Para acabar limpiamosy recargamos la lista, mostrando un mensaje de conformidad.

Página 38 PC PASO A PASO Nº 14

Ahora vamos al botón más interesante de este formulario,el "Validar". Aquí tenemos una mezcla de conceptos. Debemoscrear un bucle igual al anteriormente explicado, para recorreruna a una las filas de la lista. Una vez estemos posicionadosen una de estas filas, debemos abrir una conexión contrala tabla stock, ya que tenemos que comprobar si el heladoexiste o no, porque de ser así, debemos sumar las cantidadesy no dar de alta uno nuevo.

Este sería el código, que pasamos a comentar.

Page 39: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

En el punto en el que nos encontramos, nodebería tener ninguna dificultad entender estaslíneas. Sencillamente creamos el bucle "FOR",comprobando posteriormente si el registro dela lista está seleccionado.

Lo que le precede es sencillo. Buscamos elregistro correspondiente en la tabla de entradas,mediante el método Find, Rs.Find "Id=" &Lista.ListItems(i).Text . Inmediatamentedespués, y si la propiedad EOF del Recordsetno es verdadero, instanciamos un nuevoRecordset y lo abrimos, realizando unabúsqueda sobre la tabla de stock por los camposNombre y Sabor. En el caso en que la propiedadEOF del Recordset sea verdadero, daremos dealta un nuevo helado en la tabla stock, con lapropiedad AddNew. Si por lo contrario se haencontrado algún registro en la tabla stock quecumpla las condiciones, lo que haremos essumar las cantidades de estos.

Para acabar, limpiamos la lista de objetos yllamamos al Form_Load para su recarga.Y con esto, supongo que podemos dar porfinalizado el formulario de Entrada de productos.

Bien, para acabar este número creo que estaríabien mandaros unos "deberes" para casa. Paraser más exactos, creo que podríais intentarhacer la parte del proyecto que comprende lasVentas.

Daré una explicación del mismo:El formulario de Ventas debe mostrar porpantalla una lista con las ventas de heladosque los comerciales han ido realizando. Estasventas deben incluir los campos Nombre, Sabor,Cantidad (obvios) y Fecha de venta. Cuandoun comercial introduce una venta, este ve unformulario con los campos de entrada descritosanteriormente. Se debe poder añadir, modificary borrar ventas, pero ninguna de estas ventasserán correctas hasta que sean validadas porun responsable de administración. Para elloañadiremos un botón Validar (al igual que en

Entradas) que nos permitirá seleccionar aquellas ventas quequeramos validar.

Una vez validadas, estos registros deben ser borrados de latabla "ventas" y sus cantidades deben ser restadas del stockinicial. En el caso que algunas de las ventas realizadas nocorrespondan con ningún registro del stock, ya sea porqueen ese momento no hubiera, o porque se ha vendido unhelado que no existe, este deberá quedar marcado de algunamanera, pero nunca debe repercutir sobre la tabla de stock.Buena suerte!!!

Nota: Tienes el cógigo de este artículo en www.hackxcrack.com

PC PASO A PASO N° 14 Página 39

Page 40: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Mes a mes avanzamos en la programación en C desde LINUXEsta vez nos enfrentaremos a las estructuras, enumeraciones, uniones ycampos de bits.nos acercaremos a la programación modular y crearemos nuestro primerprograma "serio":]

1. Introducción.

En el número anterior nos enfrentamos a lospunteros. Para dar fin a la parte relativa a lostipos de datos, hoy veremos las estructuras,las enumeraciones, las uniones y los camposde bits. Así mismo veremos como a partir delos tipos vistos en C, podemos crear nuestrospropios tipos (sencillos o como se verá en elejemplo de este número, muy complejos)mediante typedef.

Así mismo en este número llevaremos elconcepto de la programación modular al propiocódigo fuente, no limitándonos ya tan sólo arepartir el código fuente entre distintos archivos,sino dividiendo éste en módulos independientesdenominados procedimientos o funciones.

2. Tipos de datos en C, tiposderivados, continuación

2.1. Estructuras

Una estructura es un agrupamiento similar aun array con la diferencia de que cada una delas "casillas" que componen el array puedenser de diferente tipo (ya sean tiposfundamentales o derivados). Su máxima utilidadradica en que en ocasiones nos conviene tenerun conjunto de información dentro de un

Obviamente estos tipos pueden ser escogidosde manera diferente. Lo importante es queestemos de acuerdo en que todas estas variables

conjunto, ya sea porque esa información estárelacionada de alguna forma, ya sea porquedeseamos mantenerla junta.

Por ejemplo, imaginemos el caso de los datosdel DNI de una persona. En un primer vistazo,se nos puede ocurrir representar los datosrelativos a un DNI de la siguiente manera:

Página 40 PC PASO A PASO N° 14

Page 41: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

tienen algo en común: Son información relativaal DNI de una persona.

¿Qué ocurriría si deseásemos representar losdatos de los DNIs de dos personas?Probablemente obtendríamos algo como esto:

Si ya nos planteamos tratar con los datosrelativos al DNI de diez o quinientas personas,vemos que hay algo "que no cuadra" o que almenos se debería hacer de otra manera.

Será entonces cuando cobre sentido lasestructuras. Veamos primero un ejemplo deestructura y luego observemos las diferenciascon los expuestos arriba:

Podemos observar que hemos "empaquetado" toda lainformación relativa a un dni en un "conjunto" llamado DNI.Posteriormente en la zona de declaración de variablescreamos cinco variables cuyo tipo es... iel conjunto quehemos creado!

Esto proporciona dos ventajas: Por un lado no tenemos quemanejar una cantidad terrible de variables y por el otro serámás difícil el "traspapelar" información entre los dnis de dospersonas distintas.

Bueno, a estas alturas seguro que estamos convencidos delas bondades de las estructuras, pero probablemente alguienpiense, y no sin razón: "¿Cómo demonios accedo ahora alas variables empaquetadas para asignarles un valor oconsultar el que tienen?".

Pues el mecanismo será el siguiente:nombre_estructura.nombre_variable

PC PASO A PASO Nº 14 Página 41

Page 42: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Por ejemplo:

Obsérvese que los datos nombre y cp han sidomodificados/consultados como si de una variablenormal se tratase (atendiendo al tipo originalde nombre y cp). Ahora bien, sólo hemostrabajado con los datos nombre y cp depersonal sin que se hayan visto alterados losmismos campos de persona2, persona3, etc....dado que son conjuntos distintos de datos.

Estructuras y punteros

Una estructura puede ser apuntada medianteun puntero. Esto provocará ciertos cambios ensu comportamiento que debemos tener muyen cuenta. Al igual que arriba, veamos estocon un ejemplo:

Mientras que hemos visto que para acceder alas distintas variables que forman parte de laestructura tenemos que usar una sintáxis delt i p o ( s e g ú n e l e j e m p l o )persona1.nombre_variable, si tenemos unpuntero esto cambiará un poco:

¿Qué ha sucedido? Pues ha sucedido que cuando unaestructura es referenciada por un puntero, para accedera sus campos debemos emplear al símbolo -> en vezde el punto que empleamos cuando simplementeestamos trabajando con una variable de tipo estructurade datos.

Es algo que deberemos tener siempre en cuenta.

Finalmente, y para que quede constancia, debemosde insistir en una cosa: Pueden formar parte de unaestructura cualquier conjunto de variables de cualquiertipo. Esto quiere decir que nos podremos encontrarestructuras tan exóticas como:

PC PASO A PASO Nº 14Página 42

Page 43: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Se obvia que los tipos que faltan por tratar también puedenformar parte de una estructura.

También veremos, en un tema aparte, que las estructurasse pueden autoreferenciar o referenciar a otras estructuras.Esto nos permitirá realizar estructuras aún más complejascomo listas dinámicamente enlazadas. Pero debido a lacomplejidad de este tema merece un artículo por separado.

Finalmente, propongo como ejercicio que se realice unsencillo programa en C en el que se preste al usuario Pepe"La divina Comedia" de Dante Alighieri y que se imprimaTODA la información relativa a dicho préstamo bajo lossiguientes supuestos: El usuario Pepe sufrió una multa el01/01/01 y además posee actualmente en préstamo "Elderecho a leer" de Richard M. Stallman.

2.2. Enumeraciones

Las variables de tipo enumeración son un tipo especial devariables que poseen la propiedad de que su conjunto devalores en un conjunto de constantes enteras especificadaspor el usuario. Para mayor comprensión, estos valores enterosse especifican mediante términos comunes.

Así por ejemplo serán enumeraciones las siguientes:

PC PASO A PASO N°14 Página 43

Aunque a primera vista esto pueda parecer engorroso, prontoveremos que el uso de las funciones nos facilitará bastanteesta tarea.

Esto será INCORRECTO dado, y aprovechamos pararecordarlo una vez más, una enumeración no es más queun conjunto de números enteros.

Una posible solución para esto será emplear un código comoel siguiente:

Un fallo o tentación común es esperar que se nos imprimael término que hemos empleado para designar uno de losnúmeros. Por ejemplo:

Aunque parezca mentira estamos tratando todo el rato conenteros (0 ,1 , 2, 3, 4, 5 y 6 para dias y 0,1 y 2 para colores),pero de manera que en vez de utilizar las cifras, usamos losdistintos elementos que hemos asignado al conjunto.

Page 44: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

2.3. Uniones

Las uniones se definirán de manera similar alas estructuras y se emplean para almacenaren un mismo espacio de memoria variables dedistintos tipos. Recordemos que el conceptode tipo visto en números anteriores era "elnúmero de casillas que reservábamos enmemoria para almacenar datos". Vimos quehabía tipos que ocupaban muchas casillas yotros menos. Pues bien, en una unión sóloreservaremos las casillas del elemento que másocupe en la unión, almacenándose el resto delos elementos dentro de las casillas del elementomás grande (dado "que caben").

Veamos esto con un ejemplo:

Obviamente en el ejemplo mostradoun_numero.entero deja de valer 5 trasasignar un_numero.real = 1555 dado queambos números utilizan las mismas zonas dememoria para almacenarse y por lo tanto sesobrescriben.

2.4. Campos de bits

El lenguaje C nos brinda la posibilidad de definirvariables cuyo tamaño en bits pueda no coincidircon un múltiplo de 8 (byte). Un ejemplo deuso será:

Como podemos observar lo que hemos hecho ha sido"trocear" un char (1 byte) en los 8 bits que lo componen,de manera que ahora tenemos acceso a cada uno de losbits de manera independiente. Si utilizamos lo visto en elapartado anterior, podemos hacer algo como:

PC PASO A PASO N°14Página 44

Page 45: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

En el ejemplo visto simulamos la resolución deun antiguo problema que existía entre diversasmáquinas. Este problema consistía en que enalgunos procesadores (por ejemplo, la familia8088) guardaban los bytes poniendo el nibble(4 bits) menos significativos en primer lugar,y los más significativos en segundo. A estamanera de hacer las cosas se le conoce comoBig Endian. Otras arquitecturas, como porejemplo la basada en MC68000, lo hacían alrevés (Little Endian). Esto en ocasionesprovocaba que el intercambiar datos fuese unatarea ardua, dado que cada byte tenía que sersometido al proceso mostrado en el ejemplo,en el cual lo único que hacemos es intercambiarel orden de los nibles adecuados. Otra aplicaciónposible de lo visto sería la construcción de unemulador entre procesadores incompatiblesentre si a este nivel.

La salida del programa arriba mostrado será:

LE: bffff93e BE: bffff9e3

Obsérvese que al último byte le hemos "dadola vuelta".

2.5. typedef: Poniendo nombre a nuestrospropios tipos de datos

Hasta el momento hemos visto como con unaserie de tipos datos derivados hemos sidocapaces de crear nuestros propios tipos dedatos: Para ello hemos empleado estructuras,enumeraciones, uniones, campos de bits

Pero queda una pequeña pega que más queun problema real es una cuestión estética.

Observemos estas líneas de código:

En el segundo main tenemos la impresión de que nuestrostipos "son más tipos" que arreglos que hemos tenido quehacer. Se comportan como el resto de los tipos fundamentales(int, float y char) y proporcionan una mayor sensación dehomogeneidad en el código.

Ahora bien, ¿cómo se consigue que podamos utilizar losnombres de los tipos de la segunda maneara? La respuestaes mediante typedef. typedef hará posible que cualquieridentificador que nosotros asignemos a un tipo derivado seaconsiderado como el nombre de un nuevo tipo. Así porejemplo para conseguir el último resultado estaríamos areescribir nuestro código de la siguiente manera:

PC PASO A PASO N°14 Página 45

Page 46: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

3. Programación modular

3.1. Funciones

En números anteriores vimos como aplicar la modularidada todo un proyecto dividiendo este en diferentes archivossegún la funcionalidad que tuviese el código residente enestos archivos. Hoy vamos a meternos dentro del código yveremos que esta filosofía puede ser aplicada también dentrodel propio código.

El mecanismo del que dispondremos para realizar esta tareaserán las funciones o procedimientos.

¿Qué será una función o procedimiento? Serán unas porcionesde código que recibirán unos datos, realizarán unadeterminada tarea con ellos y nos proporcionarán un resultado.Estas porciones de código deben de estar adecuadamenteidentificadas, de manera que se las pueda llamar desdecualquier punto del programa principal.

Pongamos por ejemplo una tarea sencilla: sumar dos números.¿Cómo podemos llamar a una función que sume dos números?Por ahora admitamos suma como un nombre válido. ¿Cuántosdatos necesita conocer esta función para poder realizar sutarea? Obviamente los dos sumandos. A los datos quenecesita una función para trabajar los llamaremos a partirde ahora parámetros. Y finalmente ¿cómo llamaremos alproducto final del trabajo que realiza esta función? Pues...suma. Claro que veremos que este dato se le denominavalor de retorno.

Ajustándonos al estándar ANSI, el aspecto de una funcióndebe de ser el siguiente:

Así nuestra función suma podría quedar en C:

El uso de typedef no se limita a esto y puede ser empleadopara cosas más triviales como:

Página 46 PC PASO A PASO N°14

Page 47: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

un mensaje de error) deben de ser llamadas procedimientosmientras que las que sí retornan algún valor han de serllamadas propiamente funciones.

El aspecto de un procedimiento suele ser el siguiente:

En general, tomando el esqueleto de una función tendremos

Podríamos observar que una función secomporta como una fábrica que recibe materiasprimas y proporciona un producto.

Ahora bien; no siempre una función secomportará de esta manera. De hecho existeuna clasificación atendiendo a lo que recibe ya lo que devuelve. Esta clasificación consideraque las funciones que no retornan ningúnresultado (por ejemplo, imprimir un menú o

Aquí debemos de llamar la atención sobre varias cosas:

La primera es el tratamiento de las variables locales. Estavariable sólo existe durante la ejecución de la función.Esto quiere decir que una vez que termina la función éstas

desaparecen. Este tipo de variables tampoco sonvisibles desde fuera de la función. Dicho de otramanera: Son herramientas que sólo lostrabajadores de la fábrica pueden manejar. Estasherramientas no se pueden utilizar desde fueray ellas no pueden realizar ninguna actividadfuera de los muros de la fábrica.

La segunda es qué ocurre cuando nuestra funciónes un procedimiento; es decir, cuando no retornanada. En ese caso se pone como tipo del valor

de retorno void lo cual significa precisamente "nada"1 .Además dentro del procedimiento se prescinde también dela instrucción return dado que ahora carece de sentido suUSO. (1) Esto no es del todo cierto, ya que como veremos un puntero *void significaliteralmente que es un puntero que puede apuntarlo a todo.

Cuando no se reciben parámetros, se suele poner tambiénun void entre los paréntesis u omitirlo:

Página 47PC PASO A PASO N° 14

Page 48: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Una función podrá retorna cualquier tipo devalor, salvo un array u otra función.

Como se explicó anteriormente, las variableslocales a una función permanecen sólo durantela ejecución de esta. Esto sucede porque dichasvariables se almacenan en la pila del usuariode programa. También se las denominavariables automáticas. Sin embargo podemoshacer que una variable local sea almacenadacomo una global y no en la pila, existiendo alo largo de toda la ejecución del programa.

A este tipo de variables se les denominaestáticas, y se caracterizan porque llevan lapalabra static delante de la declaración de lavariable.

3.1.1. Parámetros por valor y parámetrospor referencia

Tal como hemos utilizado los parámetros hastaahora sucede algo como lo siguiente:

Lo que sucede en la línea (1) es que losparámetros reciben una copia de las variablesque se le pasan. Es decir, que para uso de lafunción hacemos algo como a=numA, b=numB.A esta manera de hacer las cosas se le llamapasar parámetros por valor.

Otro comportamiento de los parámetros pasadospor valor es que aunque cambiemos el valorde los mismos dentro de una función, estecambio no se verá reflejado fuera de la función.Veamos esto con un ejemplo.

Página 48 PC PASO A PASO N°14

Page 49: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

La intención que tenemos a la hora de construirla función (procedimiento) intercambia es quenos intercambie los dos valores que se nospasen como parámetros. Sin embargo esto nosucede. Vemos por qué.

Al realizar la llamada (1), sucede lo siguiente:

Bueno, vemos que el lugar donde hemos hecho

los cambios se desvanece nada más terminar

la función, luego las variables globales no se

ven afectadas.

La conclusión que podemos sacar de esto es

que utilizaremos el paso de parámetros por

valor, cuando queramos pasar una copia de

los datos a la función sin que éstos se vean

modificados por la misma.

Sin embargo, en ejemplos como el arriba

expuesto, o cuando una función necesite

retornar más de un valor, nos conviene pasar

determinados parámetros por referencia.

PC PASO A PASO N° 14 Página 49

Si ejecutamos ahora este programa veremosque sí se han intercambiado los valores de lasvariables globales a y b. ¿Qué ha sucedido?

De entrada podemos observar que se hanrealizado algunos cambios en el código. Elprincipal es que en los parámetros hemossustituido la declaración "normal" por declaraciónde... ¡punteros!

Esto quiere decir que esta función ahora NOrecibirá una copia de los datos que deseemossino la dirección de la variable que contieneel dato original. Esto querrá decir que todoslos cambios que hagamos en una direcciónglobal desde un puntero permanecerán tras laejecución de la función.

Veámoslo gráficamente:

Veamos ahora una nueva versión del ejemplo

arriba mostrado:

Page 50: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Página 50 PC PASO A PASO N°14

asignatura de Ingeniería Informática, por loque no profundizaremos demasiado en elconcepto. Digamos por ahora que un T.A.D.nos sirve para definir tanto un tipo de datoscomo todos los mecanismos que nos permitiránacceder a los datos almacenados en él.

En concreto vamos a construir una matriz en

a que podamos meter cualquier tipo de dato yesta pueda ser de cualquier tamaño (que nodimensión).

3.2. Poniendo en práctica lo aprendido

Tras varios artículos de teoría más o menosdensa pero que no podía ser obviada, va siendohora de que empecemos a realizar algúnprograma medianamente serio.

Para comenzar vamos a realizar laimplementación de un Tipo Abstracto deDatos (T.A.D.) correspondiente a una matrizbidimensional. El tratamiento de T.A.D.s es tanprofundo que incluso cubre el temario de alguna

Page 51: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Debido a que he procurado comentar el código extensamente,prescindiré de mayores explicaciones en este artículo. Siempreque se tengan dudas disponéis del foro o de mi direcciónde correo: [email protected]

Este será el archivo de cabecera. En el ponemos lasestructuras, variables, constates, macros, etc.. que esténrelacionadas con la matriz. Así mismo ponemos los prototipos(declaraciones) de las funciones que serán usadas. Laimplementación de estas funciones irán en un archivo aparte(matriz.c).

Obsérvese que un archivo de cabecera comienza y terminasiempre por

Esto se utiliza para el caso de que accidentalmente carguemosun archivo de cabecera más de una vez (cosa muy probabledado que nunca sabemos que archivos de cabecera carganlos archivos de cabecera que cargamos nosotros). De estamanera en el caso de que se cargase dos veces el mismoarchivo de cabecera, la segunda vez lo ignoraría.

El archivo matriz.c contendrá:

PCPASO A PASO N°14 Página 51

Page 52: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Página 52 PC PASO A PASO N° 14

Page 53: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

PC PASO A PASO N° 14 Página 53

Page 54: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Debido a la extensión de este artículo, dejaremos para elsiguiente el cómo crear un Makefile para este proyecto. Porahora podremos compilar estos archivos de la siguientemanera:

Bibliografíaman printf; man scanf, Varios.

UNiX Programación Avanzada, Fco. Manuel Márquez, Editado porRa-Ma, ISBN: 84-7897-239-0.

Slackware Linux Unleashed, Bao Ha y Tina Nguyen, Editado porPearson Education, ISBN: 0-672-31768-0.

Advanced Linux Programming, Mark Mitchel, Jeffrey Oldham, yAlex Samuel, Editado por New Riders, ISBN: 0-7357-1043-0.

Página 54 PC PASO A PASO N°14

Page 55: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Solo aquellos que han seguido el curso de XÍT1L hasta aquí podrán seguir avanzando.

Si, lo sabemos. XML, es complejo hasta que uno le dedica las horas necesarias... después

la recompensa llega por si sola ]

En el pasado número veíamos la teoría del DOM.

Recordemos que el DOM es una manera de ver el archivoxml, para que nos sea fácil navegar por el documento,editarlo, copiarlo etc.

Como conceptos básicos teníamos:

• DOM = modelo de objetos del documento xml. Todoel documento XML, todo lo que contiene el documento xml.

• Interfaz = conjunto de métodos y propiedades,agrupados según un criterio. Agrupados según una manerade ver las cosas.

• Objeto = todos los componentes (elementos,notaciones, atributos, texto...) del xml se consideran objetos.Cada uno de los objetos pertenece a una interfaz determinada.

• Nodo = todo elemento, texto... del xml se consideraun nodo. Todo objeto del xml es un nodo.

• Interfaz de nodos = un conjunto de métodos(funciones) y propiedades para los objetos (elementos,comentarios, atributos, entidades., del documento XML)DOM.

Como podéis ver, es algo abstracto y difícil de imaginar, hastaque no tenéis un ejemplo delante. No os preocupéis muchosi de entrada no lo entendéis bien. Lo importante es quecomprendáis bien los ejemplos, y cuando tengáis claro los

ejemplos, seguramente entenderéis todos estos conceptosabstractos que os he enumerado.

Vimos la interfaz DOMDocument y sus principales propiedadesy métodos como podrían ser load , save y mencionamoslos métodos create. En este número continuaremosexplicando la interfaz XMLDOMNode, en la que veremos ,entre otras cosas estos métodos create, que si bienpertenecían a DOMDocument se comprenden mejor desdela interfaz XMLDOMNode.

Antes de comenzar, unas palabras de aliento, con una nuevaexperiencia XML :

He estado trabajando con un gestor de contenidos Web,que se llama teamsite de la casa interwoven. Sirve paramantener una website de manera cómoda con una serie deplantillas que ellos llaman templates. Estas plantillas sonútiles por ejemplo para gestionar las descripciones de losproductos. Supongamos una multinacional que antes ydespués de la descripción del producto quiere poner untexto aclaratorio. Este texto es común a algunos productos.Pues con teamsite se seleccionan las plantillas y se les indicaen que productos va a salir la descripción.

La estructura de las plantillas está en... XML, que se validacontra un DTD. Se recorre el DOM XML con PERL y VisualBasic.

INTERFAZ DOMNode

Podemos considerar esta interfaz como el centro del DOM:el nodo en persona.

PC PASO A PASO N°14 Página 55

Page 56: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

El nodo es la unidad fundamental del DOM. Hay varios tiposde objetos nodo: algunos pueden tener nodos hijos, mientrasque otros son nodos finales (se les denomina leaf nodes= nodos hoja), esto es, nodos que no tienen ni puedentener nodos hijos.

La interfaz DOMNode define un conjunto de métodos yatributos genéricos, pero no todos ellos son aplicables atodos los tipos de nodos. Por ejemplo: existe un atributoque se llama childnodes que devuelve un nodelist quecontiene los hijos de un nodo determinado. Tú preguntaspor los nodos hijo (childnodes) de un nodo determinado yte devuelve una lista con todos los nodos (nodelist) hijo deese nodo determinado.

Sin embargo, el nodo de tipo TEXT no puede tener nodoshijo, con lo que no se puede aplicarle el atributo childnodes.

Tabla de tipos de nodos

TABLA DE ATRIBUTOS DE LA INTERFAZ DOMNODE

Vamos a ver una tabla mas, la de atributos genéricos parala interfaz DOMNODE.Los valores de los atributos nodename y nodevaluedependen del tipo de nodo a que nos estemos refiriendo.Por ejemplo el valor de un nodo elemento es siempre nuilmientras que el valor para un nodo atributo es el texto delatributo.

Si preguntamos por el valor de un elemento con la propiedadnodevalue no conseguiremos el texto que contiene elelemento, sin embargo, el elemento seguramente quecontiene nodos hijos de t ipo NODE_TEXT oNODE_CDATA_SECTION y es el nodevalue de estos nodos(de los nodos texto o cdata) el que nos devolverá el texto.

PC PASO A PASO N°14Página 56

Page 57: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

MÉTODOS DE LA INTERFAZ DOMNODE

Vamos a analizar en profundidad los métodosgenéricos de esta interfaz.

MÉTODO APPENDCHILD

Sintaxis: nodo.appendchild nuevo_nodo

Este método añade el nodo nuevo_nodo(donde nuevo_nodo es el nodo que añade)al final de la lista de nodos hijos de nodo.

Esto es, si añadimos un nuevo nodo<PRODUCTO> a <ORDEN_DE_COMPRA> , locolocaría justo debajo de :

Recordemos que todo es un nodo, así si ledecimos que añada un nodo PRODUCTO aORDEN_DE_COMPRA y no le decimos nadamas, lo añadirá como un nodo vacío (repasadlos elementos vacíos en el n°10 de la revista),c o m o u n e l e m e n t o s i ncontenido(<PRODUCTO/> es decir que el nuevoxml, quedará de la siguiente manera:

Para que no nos quede como un elemento vacíotendremos que ponerle contenido al nuevonodo, y una manera fácil de hacer es escribiendola propiedad text:

Nuevonodo.text = "TEXTO DEL NUEVONODO". Y ahora si, cuando hagamos elappendchild, el nuevo xml nos quedará:

Decíamos que el método appendchild, añadíaun nuevo nodo, si el nodo fuera un nododocumentFragment, el contenido entero delfragmento de documento se añadiría al nodopadre que estuviéramos manipulando, o quetuviéramos seleccionado.

PC PASO A PASO N°14 Página 57

Page 58: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Abrid el Visual Basic y seleccionad el proyecto que empezamosel número anterior.Colocad un botón en el formulario, id a las propiedades y

poner:

• name = cmdCrearNodoBasico

• caption = C&rear un nodo: Básico

y os podéis preguntar como es posible que explorer de porbueno un archivo xml no válido. ¿Qué hemos hecho mal?

Página 58 PC PASO A PASO Nº 14

segundo nodo ORDEN_DE_COMPRA:

Os podéis preguntar: ¿Y porque justamente ahí?. Puesjustamente ahí, porque es ahí donde le hemos dicho que loañadiera.

Veamos de nuevo el código:

Y unas líneas más abajo pone:

Es decir que estamos pegando el nuevo nodo al nodoPadre,y ¿Cuál es el nodoPadre? Pues en este caso el nodo raiz,o sea el nodo PEDIDOS.Si nos hubiéramos situado en otro nodo, si le hubiéramosdicho que el nodoPadre era otro, lo hubiera pegado en elnodo que le hubiéramos dicho. ¿Y como le decimos que elnodo al que vamos a pegar el nuevo nodo es por ejemploPRODUCTOS? Seguid leyendo y lo averiguareis.

Fijaros en el texto que le añadido a nodoElemento:"Suerte que ahora mismo no validamos contra un DTD".Este nuevo elemento PEPE no cumple con las reglas delDTD pedidos.dtd, por tanto ha convertido el archivopedidos.xml en un archivo no válido.

No obstante, si abrís el archivo en Internet Explorer veréisen vuestras pantallas lo siguiente:

Page 59: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Pues lo que hemos hecho mal es confiar enMicrosoft ya que a pesar de que el xml seválida contra el DTD, y el DTD nos dice queno es un xml válido, lo muestra en pantallacomo si fuera un xml válido. De lo quededucimos que la validación de archivos xmlcontra DTDsen el explorer de Microsoft no está bienresuelta.

Y ya que ha salido el tema,si me permitís me gustaríadaros mi opinión sobre eldebate Microsoft-Si ,Microsoft-No.Pienso por un lado que laseguridad de microsoft ensistemas operativos esfrancamente mala, que sussistemas operativos dejanbastante que desear, quesus productos salenbastante tiempo antes delo que debieran al mercado, que el hecho de irsacando un service packtras otro de sus productosaunque ya nos hemosacostumbrado, si lomiramos fríamente y loanalizamos un poco es algovergonzoso tanto para lagente de Microsoft comopara nosotros.Pero por otro lado piensoque debemos agradecerleque haya hecho el PC tan popular, que hayaconvertido al ordenador algo tan común en loshogares como la nevera o la lavadora. Y al sertan popular y generar tantos beneficios hayaforzado al abaratamiento de las piezas y a larápida evolución de velocidades, capacidadesde disco, y haya favorecido la aparición denuevos lenguajes, técnicas y arquitecturas.

Nos vamos a asegurar de que no es un xmlválido.Hay una herramienta francamente buena para

construir archivos xml y DTDs, se llama XMLSPY, y p o d é i s b a j á r o s l a dehttp: / /www.altova.com/download.html.

Con esta herramienta, podéis construir xml,saber si están bien formados y si no sonstandalone validarlos contra un dtd.

Veamos pues con una imagen el resultado dela validación del xml con xml spy:

Fijaros en el mensaje de error que hay al ladode la X :

"This file is not valid: Unexpected child element"PEPE".

Me gustaría que quedara algo muy claro deesta primera aproximación:

1- Referenciar siempre al nodopadre dondevamos a insertar un hijo, es decir tenemos queapuntar al lugar donde vamos a insertar elnuevo nodo. Si queremos situar el nuevo nodo

PC PASO A PASO N°14 Página 59

Page 60: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

en un lugar determinado deberemos decirle alprograma el nodo donde vamos a insertarlo

2- Crear el tipo de nodo que vamos ainsertar y asignarle texto, atributos... lo quehaga falta

3- Enganchar el nodo . Y loengancharemos exactamente en el lugar quele hayamos indicado en el punto 1

Vamos a ver un ejemplo de cómo insertar unnodo en un lugar determinado deldocumento, en el lugar que nosotros queramos.

Colocad un botón en el formulario, id a laspropiedades y poner:

• name • cmdNodoDeterminado

• caption = Cr&ear nodo en un lugardeterminado

PC PASO A PASO Nº 14Página 60

Page 61: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Analicemos un poco:Hemos cogido a ORDEN_DE_COMPRA y lehemos añadido un hijo con el métodoappendchild. Los hijos siempre se añaden alfinal, por lo tanto solo podemos colocar elnuevo nodo después del nodo<PRODUCTO>LIBRO</PRODUCTO> sicogemos como nodo padre el primerORDEN_DE_COMPRA o después del nodo<PRODUCTO>SUPERSNAZZ - FLAMIN'GROOVIES</PRODUCTO> si cogemos comonodo padre el segundo y último nodoORDEN_DE_COMPRA.

¿cómo hacemos para insertar un nuevo nodoproducto antes de <PRODUCTO>SUPERSNAZZ -FLAMIN1 GROOVIES</PRODUCTO> O entre<PRODUCTO>DISCO DE VINILO</PRODUCTO> y<PRODUCTO>SUPERSNAZZ - FLAMIN1

GROOVIES</PRODUCTO>?

Pues con el siguiente método : insertBefore

MÉTODO INSERTBEFORE

Sintaxis: insertBefore ( node nuevoHijo,node nodoReferencia)

Este método añade un nodo hijo a un nodopadre, en una posición especifica de la lista denodos hijos. Por ejemplo , si cogemos elsegundo nodo ORDEN_DE_COMPRA como nodopadre, su lista de nodos hijos PRODUCTO será:

< PRODUCTO DISCO DE VINILO</PRODUCTO> y<PRODUCTO>SUPERSNAZZ - FLAMIN1

GROOVIES</PRODUCTO> y podremos insertarel nodo donde queramos, antes o después<PRODUCTO>DISCO DE VINILO</PRODUCTO>;o Antes o después de <PRODUCTO>SUPERSNAZZ

- FLAMIN' GROOVIES</PRODUCTO>

Vamos a realizar un ejemplo con el visual basic:

Vamos a insertar un nodo entre

<PRODUCTO>DISCO DE VINILO</PRODUCTO>

y

<PRODUCTO>SUPERSNAZZ - FLAMIN1

GROOVIES</PRODUCTO>

y después insertar un nodo justo antes de

<PRODUCTO>LIBRO</PRODUCTO>

Colocad un botón en el formulario, id a laspropiedades y poner:

• name = cmdCrearExacto

• caption = Crear &nodo en unaposición exacta

PC PASO A PASO N°14 Página 61

Set nodoBase = listadenodos.Item(0), elresultado sería:

Page 62: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Página 62PC PASO A PASO Nº 14

Page 63: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

MÉTODOS REPLACECHILD, REMOVECHILD YCLONENODE

Sintaxis: replaceChild ( node nuevoHijo, nodenodoAReemplazar)

Si en lugar de añadir un nodo, lo que queremos hacer esreemplazarlo, este es el método que debemos utilizar. Estemétodo reemplaza nodoAReemplazar por nuevoHijo ydevuelve una referencia al nodo reemplazadoSintaxis-2 removechild (node nodoBorrar)

Tal como su nombre indica remove (borrar) child (hijo),este método se utiliza para borrar el nodo que se pasa comoparámetro (nodoBorrar)

Sintaxis-3 cloneNode (boolean profundidad)

En caso de que haya algún nodo en particular que queráisclonar de un sitio del DOM a otro, podéis clonarlo. El métodocloneNode devuelve una referencia al nodo duplicado(clonado). El parámetro profundidad (deep) puede tomarlos valores true o false. Pondremos true cuando queramosque nos copie el nodo y todos sus nodos hijos.Por ejemplo si clonáramos el primer nodoORDEN_DE_COMPRA y le pasásemos un true, nos copiaríaenterito el fragmento xml:

y tendremos que hacer un appendchild o un insertbeforepara pegarlo al documento.

Vemos estos tres métodos con un ejemplo:

Colocad un botón en el formulario, id a las propiedades yponer:

• name = cmdOtrasAccionesNodos

• caption = &Otras acciones sobre los nodos

Codificad el evento click del botón:

y si le pasáramos un false solo nos duplicaría el nodo, sinsus nodos hijos , esto es:

Hay que tener en cuenta que el nodo clonado, no estáenganchado a ninguna parte del documento xml, esta suelto,

PC PASO A PASO N°14 Página 63

Page 64: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

¡El mes que viene continuamos!

¡Saludos compañeros!

PC PASO A PASO N°14Página 64

Page 65: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

PC PASO A PASO N°14 Página 65

Page 66: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Este artículo posiblemente sorprenda a muchos y desespere a otros tantos, si, la vida

es dura ]

Si has seguido todos los números de PC PASO A PASO podrás seguir este artículo, si no, ya

sabes, a estudiar y a preguntar en el foro de Hack x Crack :]

Hola a tod@s, soy VIc_Thor, los que pasen por los foros deHackXcrack ya me conocen, aquellos que aun no lo hicisteisya tenéis una tarea obligada, visitad:

http://www.hackxcrack.com/phpBB2/index.php por allí ando

prácticamente todos los días y a parte de encontrarme a mi,hallaréis uno de los foros de mayor calidad y con mayorcantidad de información de lo que nunca os hubieraisimaginado, totalmente en Español y con la gente másestupenda que he visto en todas mis andaduras en esto dela seguridad informática, acércate a los foros de HackXCrack,su valor se resume en una frase: Es un lugar donde preguntardudas es obtener SIEMPRE una respuesta.

Actualmente se está desarrollando un Taller de TCP/IP, esuna actividad única que no encontrarás en ningún otro sitio,desinteresada y con el único objetivo de escalar más allá dellugar donde otros se quedaron, no es necesario que tengasconocimientos previos, nuestra misión es empezar desdemenos 1.

Este artículo está "robado" del Taller de TCP/IP, por sutemática, contenido e interés, hemos pensado que el mejorlugar para explicar cómo llevar a cabo esta técnica, es unmedio impreso como es esta Revista, que al igual que losforos de HackXcrack, es "otro animal único en su especie",sencilla, amena, profunda y que persigue una sola meta: ELCONOCIMIENTO.

Puedes seguir el Taller de TCP/IP en los foros de HackXcrackdesde aquí:http://www.hackxcrack.com/phpBB2/viewtopic.php?t=10306

En ese hilo de nuestros foros encontrarás también unapequeña explicación de cómo configurar el esnifer queutilizaremos en este artículo, si lo deseas puedes bajar esemismo documento en:

http://www.iespana.es/vmthor/ForoCanal/Taller/Tcpip/Commview/Doc/CommView.zip

No me enrollo más, que lo que hoy nos ocupa es un asuntolargo de explicar y corto de implementar...

IP-Hijacking

Venga... sentaos bien, poneos cómodos y tranquilidad quehay para rato....

Ya conocemos que al "colocar" un esnifer en una red podemosescuchar el tráfico que "ronda" por la misma, al colocarnuestro esnifer favorito en un segmento de red y desde elpunto de vista de un usuario con "malas" intencionespodemos capturar muchas cosas, contraseñas, nombres deusuarios, páginas web, etc.

Esto es un "ataque pasivo", la máquina donde corre elesnifer es un receptor del tráfico, que descubre lo quecircula por la red aunque no vaya dirigida a él.

El IP-Hijacking al contrario que un sniffing depaquetes, es un ataque activo, con el IP-Hijacking loque hacemos es robar una conexión ya establecidapor otro usuario y máquina contra un servidor.

En una conexión activa, este tipo de ataques se suelenutilizar contra maquinas que utilizan métodos de autenticaciónde password de un solo uso (syskey, NTLM, etc..) y en losque los ataques de toda la vida no surgen ningún efectoporque las contraseñas están cifradas. Ya sabes que aunquese pueda romper ese cifrado no es inmediato, imagino queconocerás lo que cuesta craquear un hash de Windows porejemplo.

Página 66 PC PASO A PASO N° 14

Page 67: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Los ataques activos se basan en el sniffing de un flujode paquetes para encontrar una serie de datos quenos van a servir para "suplantar" a una de las maquinasque forma parte de la sesión que estamos escuchando,como este tipo de ataques se basan en sniffing, no nosservirán para nada si el flujo que estamos escuchando estaencriptado de cualquier forma, es aquí donde el Hijackingtoma un especial protagonismo.

Para poder llevar a cabo con éxito esta técnicadebemos ser capaces y aprender a:

• Utilizar un esnifer de forma adecuada

• Comprender la problemática de Ip-spoofing (falsearo suplantar una IP que no somos)

• Conocer como se negocia y se establece una sesión"normal" TCP

• Enviar paquetes manipulados que secuestren unaconexión que otro estableció legalmente

Un escenario habitual podría ser éste:

I o ) Colocamos nuestro esnifer favorito en la máquinaque ejecutará el ataque, ni tan siquiera ha de ser así, existenesnifers a los que nos podemos conectar remotamente, comosi se tratase de un troyano, pero eso puede quedar paraotro artículo

2o) Un servidor, puede ser una BBDD un Controlador deDominio, un Servidor Web, etc., en este ejemplo y parasimplificar el asunto, se trata de un Servidor Telnet conAutenticación NTLM al que sólo puede acceder undeterminado número de usuarios, con determinadas IP's ya determinadas horas, en ese servidor la IP del atacanteNO ESTA AUTORIZADA a iniciar la sesión y además elusuario de la máquina atacante NO SABE EL LOGINNI PASSWORD para entrar en el servidor.

3o) Un cliente, autorizado por el Servidor Telnet, tanto elusuario como la IP del cliente son parte de los equiposde confianza del servidor.

Aclaraciones:

En este escenario observarás que las tres máquinas puedenestar en la misma Red, eso es una ventaja, pero no tiene

PC PASO A PASO N°14

por qué ser así, lo que si es importante es que podamoscomprometer el segmento de red del cliente o del servidor,puesto que si no, no podríamos hacer el sniffing del tráfico.

Al tener "esnifado" el tráfico teóricamente podríamos "robarle"la sesión al administrador remoto del Servidor Telnet UNAVEZ HAYA ESTABLECIDO la conexión, de tal manera que enadelante, el Servidor "pensará" que nosotros somos el clienteautorizado

¿Qué le pasaría al verdadero cliente?

R: Pues además de darle un cuchufrucu porque le birlaronla sesión por la cara, su máquina podría mostrar errores deconexión (cosa que tampoco es para alarmarse, puede serun simple error de conexión, algo que es bastante frecuentey que si no es muy repetitiva, no produce muchas alarmas)

¿Podría el Cliente reconectarse?

R: SI, pero a nosotros eso nos dará igual, para el servidorserá otra nueva sesión, autorizada y establecida, de tal formaque el verdadero cliente seguirá "haciendo sus cosas" ynosotros "las nuestras"

¿Y si el server nos desconecta a nosotros o perdemosla conexión por otros motivos?

R: Pues que tendremos que volver a robarla, la sesiónperdida no se podrá reutilizar porque el server la dará porfinalizada.

Deberías de tener MUY CLARO como se negocia y estableceuna sesión "normal" TCP, lo del saludo de tres vías, lasseñales (Flags), puerto origen, puerto destino, Ip origen, Ipdestino y lo más importante:

• Los números de secuencia y asentimiento

Para "los no iniciados" haré una pequeña, pequeñísimarevisión de todo ello, muy simplificada y con determinadasabreviaturas que usaré para que sea más cómoda su lectura:

Una conexión TCP esta definida únicamente por cuatroparámetros:

• La dirección IP del emisor (el que inicia la conexión)

• La dirección IP del receptor (el que recibe la conexión)

• El puerto TCP del emisor

• El puerto TCP del receptor.

El mecanismo que utiliza TCP/IP para saber si debe ono debe aceptar un paquete esta basado en comprobar una

Página 67

Page 68: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

serie de valores en cada paquete, si estos valores son losesperados por el receptor, el paquete es valido, en casocontrario se rechazan.

• Todos los paquetes llevan dos números que losidentifican:

• El mas importante en el número de secuencia o(N°SEQ), este número de 32bits indica, el numero de bytesenviados, cuando se crea una conexión, el primer numerode secuencia que se envía se genera de forma aleatoria, esdecir el numero de secuencia del primer paquete en unaconexión no es 0, este número de secuencia va aumentandoal menos en una unidad con cada paquete que se envía,aunque lo normal es que aumente el número de bytesenviados en los paquetes de datos y que aumente uno enlos paquetes de control (flags)

• El otro número ligado al numero de secuencia, es elnúmero de asentimiento o (N°ACK), tanto el cliente comoel servidor almacenan en este campo el valor del numero desecuencia siguiente que esperan recibir.

Por cada nueva sesión se generan nuevos y diferentesnúmeros de secuencia, para evitar que dos sesionessimultáneas tengan la misma serie de identificadores.

Aparte de los números SEQ/ACK (secuencia y asentimiento)la cabecera de un paquete TCP contiene otros campos,que por el momento no nos preocuparemos deellos.

¿Cómo se establece una conexión? (Ejemplo de....)

Apertura de una conexión SIN INTERCAMBIO DEDATOS, es decir, sólo la negociación del saludo de tres vías.

Al principio, la conexión por parte del cliente estacerrada (CLOSED) y en el lado del servidor esta enestado de escucha (LISTEN) en espera de nuevasconexiones.

N° SEQCLI N° secuencia generado por el cliente

N°_SEQ_SRV Na secuencia generado por el servidor

N°_ACK_CL1 N° Asentimiento generado por el cliente

N°_ACK_SRV N° Asentimiento generado por el servidor

1o) El cliente manda el primer paquete y le dice al servidorque sincronice números de secuencia con el Flag SYN:

Primer paquete que envía el cliente:

N_SEQ_CLI = aleatorio

N° ACK_CLI = normalmente es cero

FLAG = SYN

Estado de la conex ión: SYN-SENT

2o) Cuando el servidor recibe este primer paquete fija suprimer número de ACK igual al número de secuencia querecibió del cliente que le acaba de llegar y establece el flagSYN-ACK y genera su propio número de secuencia que ledevolverá al cliente

Primer paquete que enviará el servidor

N°_SEQ_SRV = aleatorio

N°_ACK_SRV = N_SEQ_CLI + 1

FLAG = SYN+ACK (comienza lasincronización de números desecuencia)

Estado de la conexión: SYN-RECEIVED

3o ) Cuando el cliente recibe este paquete empieza areconocer la serie de números de secuencia del servidor:

Paquete que envía el cliente y próximos números de SEQ

y ACK que espera recibir el servidor

N°_SEQ_CLI = N°_ACK_SRV + 1

N°_ACK_SRV= N°_SEQ_SRV + 1

Estado de la conexión:ESTABLISHED

Cuando el servidor reciba este paquete sabrá que se haestablecido una nueva conexión y ambos, cliente y servidor,tendrán los datos suficientes para empezar a intercambiarpaquetes de forma fiable.

Ejemplo:

Io) El cliente desea comunicarse con el Servidor, para ello:

Página 68 PC PASO A PASO N°14

Page 69: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

A envía un flag SYN

Número de secuencia (aleatorio) = 2092

Asentimiento =0

2o) El servidor recibe ese paquete y envía:

Flag SYN+ACK

Número de secuencia (aleatorio) 0143

Asentimiento = 2093 (2092, que recibió del cliente

+ 1)

3o) El cliente lo recibe y le envía:

Un flag ACK

Número de secuencia = 2093 (que es el asentimiento delservidor)

Asentimiento = 0144 (0143, que es el n° de secuencia delservidor + 1)

¿Qué pasa cuando cliente y servidor se intercambiandatos?

R: Pues que los números de secuencia y asentimiento seincrementan como antes, excepto que no será de uno enuno, sino que se incrementarán en tantas unidadescomo bytes transmitidos.

Además, cuando un host desea enviar datos a otro, el campo flagse establece como PSH+ACK

¿Cómo se cierra una conexión?

Una conexión se puede cerrar de dos formas:

a) Enviando un paquete con el flag FIN activo

b) Enviando un paquete con el flag RST activo

Si es el Flag FIN el que se activa, el receptor del paquetese queda en un estado de espera CLOSE-WAIT y empiezaa cerrar la conexión

Si es el Flag RST el que esta activado, el receptor delpaquete cierra la conexión directamente y pasa a un estadoCLOSED liberando todos los recursos asociados a estaconexión

Pero no queda aquí todo....

Todo paquete IP lleva un número de identificaciónúnico que lo distingue de otros, además ese número deidentificación puede ser usado tanto por el servidor comopor el cliente para "seguir" la pista en caso de que seproduzca un fenómeno especial en las comunicaciones, lafragmentación.

Si por cualquier motivo, el paquete se ha de fraccionar, parapoder reensamblarlo en el destino será preciso reconstruirlotomando en cuenta el ID de cada paquete y así poderagrupar "esos trocitos" en el destino.

El ID es fácil de calcular, puesto que se incrementa enuna unidad por cada paquete que envía un host aotro, es decir que si se envió como ID 6896, el siguienteserá 6897 y así sucesivamente por cada paqueteindependientemente del número de bytes trasmitidos....

El Ataque IP-Hijacking en nuestro ejemplo

El ataque IP-hijacking consiste en hacer creer al ServidorTelnet que esta manteniendo una conexión con un clienteautorizado y que los paquetes que esta enviando estamaquina no son validos

Por el contrario, los paquetes que vamos a enviar nosotros(el atacante) SÍ son validos, de esta manera nos apoderamosde una conexión

¿Qué le ocurre al Servidor?

R: Le parece todo normal

¿Qué le ocurrirá al Cliente Autorizado?

R: Pensará que el servidor le ha cerrado la conexión porcualquier razón

¿Qué tenemos que modificar y/o enviar al Servidor?

PC PASO A PASO N°14 Página 69

Page 70: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

R: Para poder secuestrar la conexión establecida entre elcliente autorizado y el servidor telnet, tenemos que sercapaces de hacer creer al servidor Telnet que los paquetesdel cliente autorizado ya no son válidos.

¿Cómo puede pensar el servidor Telnet que lospaquetes del cliente autorizado ya no son válidos?

R: Lo que vamos a hacer es que los números SEQ/ACK(secuencia/asentimiento) que envía el cliente sean erróneosy entonces el servidor los descartará.

Si... pero.... ¿Cómo?

R: Enviaremos datos adicionales a los paquetes que envíael cliente destinados al Servidor spoofeando la IP del Cliente

¿Y con esto qué se consigue? ¿Explica mejor eso depaquetes adicionales?

R: Cuando el Servidor Telnet reciba esos paquetes queaparentemente los envió el Cliente, actualizara sus númerosACK, y aceptara estos datos modificados, con los nuevosnúmeros SEQ/ACk que nosotros hemos forzado

Sigo sin entenderlo, veo las intenciones pero nocomprendo en qué afectará eso al cliente

R: A partir de este momento, todos los paquetes que envíeel cliente serán rechazados, ya que esta utilizando los SEQ/ACKantiguos, sólo nosotros estaremos en poder de los nuevos....

Aja, estupendo... ¿y luego qué?

R: Una vez que hemos logrado esto, ya esta hecho, yatenemos el control de la conexión, lo único que tenemos quehacer ahora es calcular los números SEQ/ACK de cadapaquete que enviemos para que corresponda con lo queespera el servidor.

La última respuesta es "engañosa" porque eso de que "loúnico que tenemos que hacer es calcular...." puede ser unaauténtica pesadilla, hay que conocer "al dedillo" los protocolosutilizados, en este caso TCP, IP y Telnet, pero imagina lo quesería suplantar una sesión HTTP o SMB, ufff un horror, perose puede, no lo dudes.

Siendo "malvados" también podríamos cerrar todas lasconexiones que nos de la gana, en lugar de enviar paquetes

que "continúen" la conexión, enviamos paquetes FIN o RSTcon los números de secuencia válidos y chas... que luegoel Cliente lo vuelve a intentar... pues otra vez... y chas denuevo.... y así hasta que uno de los dos se canse, seguramenteel Cliente se pondrá de los nervios.

Ahora nuestro ejemplo detallado

La práctica que vamos a realizar es la siguiente, vamos asecuestrar una sesión Telnet establecida por un clienteautorizado y le pediremos al servidor que nos transfiera unarchivo a nosotros, si se realiza con éxito pasará todo esto:

El servidor hará lo que le pedimos y nos transferirá el archivo(suponemos que el archivo que nos interesa recibir es unollamado sc.exe que está en el directorio "por defecto"

El cliente autorizado perderá la conexión que él estableciólegalmente

Nosotros recibiremos el archivo del servidor

Para ello debemos preparar el escenario:

En nuestro equipo atacante (172.28.0.25) montamosun esnifer y un servidor TFTP

El equipo "de confianza" (172.28.0.50) inicia una sesióntelnet contra un servidor

El Servidor Telnet (172.28.0.9) que SOLO acepta la conexionesdel equipo de confianza

Resulta que nos encontramos escuchando esa sesión telnetestablecida entre los equipos cliente y servidor (172.28.0.50y 172.28.0.25) desde nuestro equipo atacante (172.280.0.25),pero no podemos iniciar sesión telnet contra el server puestoque ni tenemos password ni login, y aun en el caso deque lo averigüemos el Servidor Telnet rechazaría lasesión porque no somos una IP válida para él.

Entonces, vamos a secuestrar la conexión que inició elequipo de confianza, nos haremos pasar por él y lepediremos al server que nos transmita un archivo anuestro equipo!!!!!

Lo primero es activar servidor TFTPD32 en nuestro equipo, yasabes utilizaremos el tftd32.exe que nos enseñó la Revista en susprimeros números, si no dispones de él puedes bajarlo de:

Página 70 PC PASO A PASO N°14

Page 71: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

http://www.hackxcrack.com/DELTA/tftpd32e.zip

Lo único que tienes que hacer es modificar "Base Directory"para que apunte al directorio donde quieras recibir el ficheroque transferirá el server (Botón Browse).

todos, peropara no aburrir.....

De todo ello nos vamos a fijar en unas cuantas cosas:Identificación, Longitud total del Paquete IP, N° desecuencia, número de Ack, Bandera-señal flag y Bytesenviados

Una tablita mejor:

Luego ponemos en marcha nuestro esnifer y filtraremos eltráfico telnet (puerto 23 de TCP) para escuchar "laconversación" entre el servidor y el cliente autorizado.

Pongamos que nos encontramos algo parecido a esto....

Hombre esto es poco significativo... se tratan de una seriede paquetes "pasantes" es decir, que nuestro esnifer captay no van dirigidos a el propio equipo donde está corriendo(fíjate que el símbolo es < = >, entran y salen de las ip's172.28.0.50 y 172.280.9 pero ninguna va dirigida exactamentea nosotros

Tampoco sabemos exactamente de qué se trata, solo podemosobservar que los puertos a los que el cliente (Toshiba) seconecta con el servidor (Compaq) es el 23.

También vemos el puerto que usa el cliente, el 1088, puertodinámico y que parece ser que están haciendo "algo"

Vamos a "escudriñar los tres últimos, podríamos hacerlo de

Columna Identificación:

El Toshiba incrementa en una unidad el campo Id. Por cadapaquete que envía

El Compaq también lo hace, sólo que como no tenemosmás que una entrada no podemos compararlo, pero en casode que Compaq iniciase una nueva transmisión el valor ID.IPde la misma sería 34086 para el ejemplo de la tabla anterior....

Longitud Total,

Esto vale para cualquier dirección que tome el paquete ypara todos los paquetes

Suma de 20 bytes de encabezado IP+ 20 bytes de encabezadoTCP+ n° bytes de datosPor qué sumas 20 deencabezados.... ¿siempre son 20?

R: Pues en condiciones normales, SI. El paquete IP serán20 bytes y TCP también a menos que se utilicen opciones,que no es el caso... por tanto para calcular la longitud totaldel paquete a enviar habrá que sumar 40 al número debytes enviados

N° Seq. Y ACK

El número de secuencia del último paquete se incrementaen tantos bytes como bytes de datos enviados desde elpropio toshiba

Página 71PC PASO A PASO N° 14

Page 72: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

217092585 - 217092584 + 1

También podemos calcular el N° SEQ como el N° ACK delpaquete anterior recibido de Compaq... es lo mismo

El número ACK del último paquete se incrementa en tantosbytes como bytes recibidos

622309278 = 62230961 + 17

Cuando es el Compaq el que envía pasa lo siguiente:

El número de secuencia es el mismo número de ACK queenvió Compaq (622309261)

El número de ACK es el número de secuencia que envíotoshiba en el paquete anterior + 1

217092585 = 217092584 + 1

Buahhhh!!! Menuda rallada, qué comedura de coco....

Vale, pensemos en el próximo paquete que se deberíaenviar....

Si Toshiba le envía un nuevo paquete a Compaq, porejemplo un ACK con 0 bytes de datos

Id IP = Id Ip +1 , es decir 40676 puesto que el último fueel 40675

Longitud total = 20 + 20 +0, es decir 40

N° SEQ = 217092585 + 0, es decir 217092585

N° ACK = 622309278 + 0, es decir 622309278

El flag sería un ACK

El número de bytes enviado cero

Y qué le debería responder Compaq.... pues lo mismo,respondería otro ACK como flag, intercambiando los númerosde secuencia por los valores del ACK y viceversa, de talforma que el la próxima transmisión que haga toshiba utilizaráel na ACK como número de SEQ y el número de SEQ comonúmero de ACK

Bien, entonces enviemos el paquete correcto queejecute el tftp....

Toshiba envía a Compaq:

Id IP 40676 (se supone que no se envió ningún nuevopaquete ACK)

Longitud total = 20 +20 + 31 = 71

N° SEQ = 217092585 + 0

N° ACK = 622309278 + 0

Flag PSH+ACK

N° Bytes: 31

Los 31 bytes son: tftp -i 172.28.0.50 put sc.exe

Tftp es un cliente que los Windows 2000 y XP llevan"incorporados de serie ", la sintaxis anterior significa losiguiente:

Tftp (cliente para el servidor tftpd32 que tenemos a laescucha)

-i el archivo que deseamos transmitir es un archivo binario

172.28.0.50 es la dirección IP del equipo que recibirá elarchivo (la del atacante que a su vez tiene a la escucha elservidor de TFTP)

put, le indica al comando tftp que lo que se desea haceres una transeferencia de archivos desde el equipo haciala IP indicada, si deseáramos "subir" un archivo desdenuestra máquina al servidor telnet, tendríamos que usarget en lugar de put

sc.exe, es la ruta y nombre de archivo a descargar.,suponemos que la ruta es el "directorio actual" sino fueseel caso, habría que indicarla, por ejemplo:c: \BBDD \clientes \sc. exe

Si cuentas los caracteres incluidos los espacios, los puntos,las letras y números suman 30....

¿Por qué son 31 los bytes a transmitir entonces?

R: Porque faltaría el "enter" es decir, el carácter 0D enhexadecimal que equivale al retorno de carro....

¿No decías que el ACK que envía Toshiba se debensumar los bytes recibidos? Entonces, ¿No sería622309278 + 31?

Página 72 PC PASO A PASO N°14

Page 73: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

R: NO. Recuerda que son RECIBIDOS, y en el último paqueterecibido de Compaq, se recibieron CERO bytes!!!

¿Y por qué no se incrementa en uno o en 31 el númerode secuencia?

R: Porque sólo es así cuando RECIBIMOS un PSH+ACK y eneste caso lo estamos ENVIANDO

Luego será Compaq quien recalcule los números de secuenciay ACK correctos y nos los devolverá en el siguiente ACK

En resumen, que cuando utilicemos esta técnica, lo único

toshiba responderá otros ACK pero no serán válidos puestoque estarán "anticuados", comenzará un "baile" de ACK'sque envía uno y ACK's que envía el otro, como no se ponende acuerdo en el número de secuencia y en el número deasentimientos ACK, la sesión terminará por quedarse colgaday le aparecerá un mensajito a Toshiba como que se haperdido la conexión con el host... pero nosotros habremosRECIBIDO EL FICHERO EN NUESTRO SERVIDOR TFTP

Mira esta pantalla de lo que ocurrió al enviar el paquete...

quetenemosque haceres:modificar laIdentificación delID de IP a ID deIP + 1

El tamañoto ta l delpaquete (40+ los bytesq u eenviemos),

cambiar el flag aPSH+ACK (valor18 hexadecimal)

Recalcular elchecksum IP

Recalcular elchecksumTCP

Añadir losbytes dedatos al finaldel paquete

Si todo fuebien, en elmomento queenviemos ese paquete de datos:

Toshiba no sabrá que le han secuestrado la conexión,simplemente "se colgará" la sesión telnet que el estableció"legalmente". Compaq recibirá "la orden tftp" y procederáa ejecutarla, con lo que nos transferirá el archivo deseado

Compaq enviará paquetes ACK a toshiba después de procesarel paquete que le enviamos desde el equipo atacante y

Contrasta la información del paquete enviado con la denuestro ejemplo....

ID

Total Length

Sequence:

40676

71

217092585

PC PASO A PASO N°14 Página 73

Page 74: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Acknowledgement

Flags

622309278

PSH+ACK

Datos (sombreado) tftp -i 172.28.0.25 put sc.exe (y uncarácter OD de retorno de línea <CR>)

A ver... lo del círculo rojo... ¿Por Qué aparecen 85 bytescomo tamaño del paquete en las líneas inferioresdel generador? ¿No habíamos quedado queeran 71?

R: Porque los otros 14 bytes corresponden al direccionamientoMAC, 6 para la MAC destino, 6 para la MAC origen y 2 bytespara el protocolo siguiente, en este caso IP.

¿Y qué pintan las MAC's aquí?

R: Pues sencillo, para que pueda existir direccionamientológico (direccionamiento por IP) es obligatorio que existadireccionamiento físico (direccionamiento por MAC) si nohay MAC origen, MAC destino y tipo de protocolo a usar NOHAY COMUNICACIÓN.

¿Siempre son 14 bytes el direccionamiento MAC?

R: Para redes basadas en Ethernet SI. Siempre son 14 y enese orden, además como la transmisión es TCP/IP el campotipo siempre será 08 00, lo que cambiará en cada caso seránlas direcciones MAC

Si analizamos los primeros 14 bytes de la captura que tomóel esnifer, verás que son estos valores:

00 10 60 5C 6B 13 00 00 39 Cl 6A C2 08 00

Dónde:

00 10 60 5C 6B 13 corresponde a la dirección MAC deldestino (El servidor Telnet)

00 00 39 Cl 6A C2 corresponde a la dirección MAC delorigen (el cliente autorizado)

08 00 Corresponde al protocolo a utilizar.... 08 00 es IP

Entonces... además de falsear la IP, predecir losnúmeros de secuencia y asentimiento, averiguar lospuertos de conexión, etc.. ¿Debo falsear también ladirección MAC?

R: SI. Efectivamente, para que el ataque tenga éxito, ademásde todo lo anterior será preciso suplantar la dirección MACdel equipo

Recordatorio:

Todos los ordenadores guardan en memoria una tabla querelaciona las direcciones IP con las direcciones MAC de losotros ordenadores a los que se conectan, esa tabla puedesverla si ejecutas el comando arp -a desde la shell del sistema.

En el caso de que un equipo no conozca la dirección MACde otro con el que quiere comunicarse, lo que hará es enviaruna petición broadcast (una consulta a todos los equiposde la LAN) algo así como si un host pregunta a todos iii elque tenga la dirección Ip xxx...xxx.xxx.xxx.xxx que me digacual es su MAC, por favor!!!

Si la IP xxx.xxx.xxx.xxxx existe en la red, le entregará sudirección MAC al ordenador que la pidió y éste últimoactualizará su tabla de direcciones MAC en su memoria para

posteriores usos y así no tener que andar preguntando lomismo cada vez..., si no existiese ese equipo en la LAN nose podrían comunicar y el paquete de datos no saldría delhost emisor....

Por tanto tenemos que los primeros 14 bytes en unatransmisión Ethernet son:

Donde el campo tipo puede ser uno de los siguientesvalores

Página 74 PC PASO A PASO N°14

Page 75: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

¿Cómo se construye un paquete TCP/IP al enviarsepor una red Ethernet?

R:

• Primero se añaden 14 bytes que corresponden ala cabecera MAC como acabamos de ver

• Segundo se añaden 20 bytes para la IP

• Tercero de suman otros 20 bytes para TCP

• Y por último se pegan los datos a enviar

Bueno, no siempre es así exactamente, pero para el casoque nos ocupa puede servir.

Hay que reseñar que esos últimos bytes (los datos aenviar) pueden pertenecer a su vez a otros protocolos,en nuestro caso pertenece al protocolo TELNET, pero podríaser una petición Web (HTTP), una sesión NetBIOS, un FTP,etc..

A esto se le llama ENCAPSULACIÓN, cuando se forma elpaquete se van añadiendo las cabeceras de los protocolosque intervienen en la comunicación junto con sus datos, alfinal, tendremos un único paquete con tantos bytes comobytes de datos a enviar + las cabeceras de los protocolosque los transportan.

Como entenderás hay muchas variantes, puede ser UDP enlugar de MAC+IP+TCP, puede ser ARP, etc.. todo llegará,por el momento prestaremos atención a las cabeceras ycampos que necesitamos modificar para que nuestro IP-Hijacking tenga éxito.

¿Qué campos tenemos que modificar de la cabeceraIP?

R:

• Total Length (Longitud total del paquete) que seráigual a 20 de IP + 20 de TCP + n° bytes enviados

• ID. IP, Identificador de paquete, que será el valorque exista + 1

• Source IP, la dirección IP del emisor, como se tratade suplantar la IP de un equipo diferente, obviamente nodebe ser la nuestra sino la del equipo a falsificar... IP-Spoofing

• Destination IP, la dirección Ip del receptor, vamosla del servidor Telnet de nuestro caso

• Checksum, mmm esto parece ser complicado...veamos el checksum es un valor que asegura que la cabeceraIP no ha cambiado por errores de transmisión u otrosmotivos, precisamente este es uno de los escollos a salvar.Sin embargo el campo de verificación checksum no es unmecanismo de seguridad ante este tipo de ataques,simplemente es un medio que utiliza IP para asegurarse deque lo que se envió es precisamente lo que se recibe en eldestino y que no sufrió alteraciones. Es una suma decomprobación.... no te preocupes, cuando llegue el momento,nuestro esnifer será capaz de generar un checksum correctopara que no haya problemas

¿Tendremos que alterar algunos valores de lacabecera TCP?

R: SI, los que nos interesan son:

• Source port, Puerto origen por el que el host emisorse comunica con el receptor, en nuestro caso, como se tratade una sesión iniciada por un cliente Telnet, será un puertodinámico (entre 1024 y 5000 para Windows)

• Destination port, puerto destino por el que el otroextremo escucha, en nuestro ejemplo corresponde al puerto23 de TCP (TELNET)

• Sequence: Es el número de secuencia, que secalculará tal y como vimos anteriormente.

• Acknowledge: Será el número de asentimiento, idemdel anterior.

• Checksum, lo mismo que en IP pero aplicado a TCP,habrá que recalcularlo....

• FLAGS, será un único byte que le dice a TCP si loque se envía es un SYN, ACK, PSH, FIN, RST, etc.. losvalores para los flags que necesitamos son:

PC PASO A PASO N° 14 Página 75

Page 76: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Puede haber más pero con estos nos sobran para lo quebuscamos....

Te podré la misma pantalla que antes pero toda completapara que veas que existe el encabezado MAC.

¿Se podrá hacer?

R: SI. Pero sería un ataque "a ciegas", además de predecirlos números de secuencia y ACK correspondiente, tendremosque "imaginar" que es lo que ocurre, eso es el llamado

Blind Spoof, técnica complicadadonde lasimposible.

haya, pero no

En el centro pegué la captura de pantalla del servidorTFTPD32, observa como se recibieron sin problemas losdatos de la ip 172.28.0.9 a la cual NUNCA, NUNCA, NUNCAnos conectamos.

A todos los efectos quien hizo "algo irregular" fue el equipo172.28.0.50

El equipo atacante sólo aparece como "receptor" en elsegmento de datos, en las conexiones establecidas con elservidor SOLO APARECERÁ la IP del equipo de confianza.

Poco se puede hacer contra esto, aunque se "cifre" lassesiones Telnet o cualquier otro tráfico, siempre puedeaparecer un "desalmado" que secuestre la sesión prediciendolos números de secuencia y asentimiento que un servidorespera recibir de sus clientes, en el ejemplo es sencillo puestoque el atacante está en el mismo segmento de red quecualquiera de las otras dos máquinas, si no fuese así....

Dentro de poco a programarsockets en C, si somos aplicadospodremos crearnos nuestrospropios programas para haceresto mismo, no creas que esdifícil, ni mucho menos, lo másdifícil es saber cómo hacerlo yeso lo acabas de aprender.Esperaremos con impaciencia loscursos de el_chaman paraempezar a enviar paquetesmediante generadores propios...

Una buena práctica sería unprograma que "rastree" el últimoACK recibido y envíe un RST ala dirección origen... unalamerada ya lo sé... pero bien

montado dejas a cualquier máquina sin posibilidades deconectarse a nada, cada vez que inicia una conexión....nuestro "virus" envía un RST y la cierra.... para volverseloco....

Llegó el momento...

Veamos cómo se puede generar ese paquete "tan ansiado",damos por supuesto que ya tenemos preparado y corriendoen nuestra máquina el programa TFTPD32 que se ocuparáde recibir el archivo que nos interesa robar del servidor....

Io) Iniciamos el esnifer CommView

2o) Configuramos los filtros necesarios para escuchar nadamas que "las conversaciones" en las que interviene el puerto23 de TELNET, con esto nos evitamos capturar otro tipode tráfico innecesario para el ejemplo

3o) Esperamos pacientemente a que la víctima y servidor

Página 76 PC PASO A PASO N°14

Page 77: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

establezcan una sesión Telnet, o a lomejor, ya está establecida y estáncharlando "amigablemente",pongamos que esto último...

4o) Sabemos que la IP del Servidor telnetes la 172.28.0.9 y la del cliente la172.28.0.50, así que lo que tenemos quehacer es localizar el ULTIMO paquetede datos con flag ACK que servidory cliente se intercambiaron, no será muydifícil porque será el último quecapturemos, lo que debemos esasegurarnos que sea un ACK y no unFIN o un RST, puesto que en estos casossignificaría que cliente y servidor pusieronfin a su "charla" y nos quedaremos"compuestos y sin novio"

Aparecerá esta pantalla( ver imagen 1):En tamaño del paqueteseleccionamos 85 bytes (ya lo vimosantes, que son:• 14 para la cabecera MAC

20 para IP20 Para TCP

• 31 de Datos a inyectarLo que tenemos que modificar son laszonas redondeadas en rojo (IP) azul (TCP)y verde (Datos)

¿Por qué sabes que son esos bytesy no otros?

R: CommView es "inteligente" cuandomarcamos un campo de la zona izquierda,por ejemplo total Length, el nos resaltarálos valores hexadecimales a quecorresponde dicho campo, así que lo

único que hay que hacer es ir pinchando en los campos amodificar e ir sustituyendo los valores que existen por losnuevos...¿No se modifican las IP, ni las MAC?R: NO. Las que están son correctas, observa que se trata

PC PASO A PASO N° 14 Página 77

5o) Atención.... nuestro esnifer captaalgo.... veamos....

Fijamos el resalte en el último paquete y nos aseguramosque se corresponda con un Flag ACKSobre ese paquete pulsamos el botón derecho del ratón yseleccionamos Enviar paquete-seleccionado

Page 78: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

un paquete que envía el Cliente alServidor, tanto el puerto destino comoorigen son correctos.

Resumiendo, lo único que tengo quemodificar son: Total Length, ID.IP,Flags TCP y los datos al final delpaquete (ver imagen 2)Pues vamos a ello:

Total Length había 0028 (40decimal) tendremos que poner0047 (85 decimal)

Id.IP tenía el valor A14D (41293decimal) pondremos A14E (41294en decimal)

Flags TCP tenía 10 (ACK)pondremos 18 (PSH+ACK), porquevamos a enviar datos.

de un paque te quesupuestamente enviará el equipode confianza al servidor Telnet,como es un paquete que nuestroesnifer capturó, los valorescorrectos ya están puestos, no esnecesario modificarlos.

¿Y los números de secuenciay asentimiento?

R: Tampoco es precisomodificarlos, el último paqueteque envió el Cliente de Confianzaal Servidor Telnet es un ACK, esdecir, un asentimiento de los datosrecibidos, por tanto los númerosde secuencia y asentimiento queespera el Servidor sonprecisamente los que acaba de enviarle. Recuerda que unFlag ACK no incorpora datos, al no haber bytes a transmitidos,los números de secuencia y asentimiento no varían.

¿Y los puertos?

R: Tampoco, por el mismo motivo que antes, se trata de

Imagen 2

Observa que al haber aumentado el tamaño a 85 bytes,apareció al final del paquete de datos una nueva entradaque pone Telnet, CommView interpreta que al enviarse elpaquete hacia el puerto 23 será unasesión telnet, listoverdad?

Página 78 PC PASO A PASO N°14

Page 79: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

hexadecimales

Al final debemos escribir un OD enla zona hexadecimal, que secorresponde con un "enter" un<CR> (ver imagen 3)

Sin embargo no podemos enviar elpaquete todavía... falta algo....

¿Recuerdas qué será?

R: Seguro que sí lo has hecho, losvalores de los campos CHECKSUMtanto de TCP como de IP, si observaslo que te dice CommView, pone queson "incorrect"

Es lógico que lo sean, acabamos demodificar bastantes valores del paquetey por tanto los checksum deben volvera recalcularse, ufff complemento auno.... bueno de eso se ocupará elpropio Commview, veamos como.

En un círculo rojo te remarqué un botón"especial", el símbolo del sumatorio enmuchas hojas de cálculo, si pinchas enél, Commview calculará los checksumcorrectos para el paquete y estará listopara enviar...(ver imagen 4)

Fíjate que tras pulsar en el signo desumatorio, los campos checksum tomaronel valor "correct", AHORA SI PUEDESDARLE A ENVIAR

Una vez inyectado este paquete, el equipode confianza perderá la conexión con elServidor Telnet y éste último ejecutará laordenque le enviamos, un tftp, en nuestroequipo recibiremos sin problemas el archivoy FIN DE LA PARTIDA.

Los datos los podemos escribir en hexadecimal o en ASCII,lo más sencillo será pulsar en la zona de más a la izquierdade la parte hexadecimal y escribir directamente lo quequeremos enviar, es decir, tftp -i eso será mucho mássencillo que convertir cada letra en sus respectivos valores

Como verás "hacerlo a mano" es laborioso,no imposible, pero demasiado entretenido cuando una sesión estámuy activa... mientras enviamos el paquete, lo modificamos,recalculamos checksum, etc, es probable que nuestro paquetequede "anticuado" debido a nuevas peticiones del Cliente deconfianza., vamos que hay que darse mucha prisa si lo deseamoshacer manualmente, pero a grandes males, grandes remedios...

PC PASO A PASO N° 14 Página 79

Page 80: Num14 PC Paso a Paso (Los Cuadernos de Hackxcrack

Para LiNUX existe una utilidad llamada Hijacking.c, es un programita en C que hace todo esto sólito, secuestra la sesión yejecuta los mandatos que le metamos desde la línea de consola, si además lo combinamos con un esnifer que nosinforme de los números de secuencia y asentimiento junto con los estados de las señales Flag TCP, secuestrarla sesión será un juego de niños... te recomiendo para ese objetivo el cóctel Hijacking.c + snort = Robo y secuestrogarantizado

Para Windows no conozco herramientas que automaticen todo esto... ya sabes, Vic_Thor, un motivo más para ircambiándote a LiNUX

Espero que os haya gustado la práctica, algunos de vosotros estaréis pensado que si esto sólo se puede hacer en LAN... puesno... también es posible trasladar el escenario a Internet, pero en esa red la guerra es constante, existen o puedenexistir muchas barreras que lo dificulten, desde nuestro propio router, hasta los routers de nuestro proveedor, pasando porNAT, IDS, firewalls, etc.. pero se puede, sí señor, claro que se puede, sino... ¿Cómo piensas que el ínclito Kevin Mitnick asaltóel Xterminal del Sr. Shimomura?

Pues más o menos como te lo he contado, también hay que advertir que en esa época no existían tantos mecanismos desegundad como los hay hoy en día, pero el spoofing e Hijacking siguen siendo vigentes, por no decir cuando es un equipo dela LAN el que se conecta a un equipo de Internet remotamente... en esos casos Hijacking es una técnica devastadora.

Página 80PC PASO A PASO N° 14