lunes, 17 de diciembre de 2007

Series Compilación

Orestes Leal [orestesleal13022@cha.jovenclub.cu]

Tabla de Contenidos

1. Prefacio a la guía para principiantes.

1.1. Introducción a esta guía.

2. Obteniendo Apache2

2.1. Descomprimiendo el tarball.

3. Compilando las Fuentes de Apache2

3.1. Finalizando la instalación.

4. Inicializando y probando nuestro servidor.

4.1. Probando con un cliente TELNET

A. Buscar más.

A.1. Autoría del presente documento.
_________________________________________________________

Capítulo 1. Prefacio a la guía para principiantes.

Bienvenido a la guía para principiantes sobre la compilación de Apache2 sobre sistemas operativos tipo Unix, siéntase cómodo de continuar si el tiempo se lo permite, con la lectura de la introducción de este documento.
_________________________________________________________

1.1. Introducción a esta guía.

Les puedo asegurar que más simple que esta guía no la hay, es por eso que complicaciones en conceptos han sido evadidas para disminuir la complejidad de comprensión del tema, un efecto colateral necesario ya que el objetivo de esta serie es tener un servidor web corriendo en nuestro sistema Unix preferido lo más pronto posible (si el CPU lo permite! ). Si lo que busca es información que trate el tema con más profundidad entonces vaya directamente a la etiqueta "Buscar más".
_________________________________________________________

Capítulo 2. Obteniendo Apache2

Puede obtener apache desde el sitio oficial:

http://httpd.apache.org

Seguidamente localice la sección de descargas y bájese a su disco duro el fichero de extensión .bz2 que indica que es el código fuente para sistemas Unix.

Para este documento se ha utilizado la versión 2.2.4, que no es la más reciente pero nos será igualmente útil para ilustrarles el proceso.
_________________________________________________________

2.1. Descomprimiendo el tarball.

tar xjvf httpd-2.2.4.tar.bz2

Cambie httpd-version.tar.bz2 por la versión que haya descargado.

cd httpd-2.2.4
_________________________________________________________

Capítulo 3. Compilando las Fuentes de Apache2

Configurando las fuentes:

Solo voy a mencionar que configurar el árbol de las fuentes es útil para que el script pueda detectar si el entorno sobre el que se va a compilar Apache2 cumple todos los requerimientos para poder compilarse sin problemas.

En la raíz del directorio de las fuentes, ejecutamos el siguiente comando:

./configure --prefix=/opt/httpd --enable-mods-shared=all
--enable-cgi --enable-cgid --enable-static-htpasswd
--enable-status --enable--info --enable-so --enable-rewrite
--enable-mime-magic

Y ahora para comenzar el proceso de compilación escribimos: "make" (sin comillas).
_________________________________________________________

3.1. Finalizando la instalación.

En el momento en que el proceso de compilación ha culminado procedemos a ejecutar el proceso de instalación con el comando "make install"
_________________________________________________________

Capítulo 4. Inicializando y probando nuestro servidor.

Iniciando el servidor apache2:

Para iniciar el servidor y basado en nuestra configuración podemos inicializarlo de la siguiente manera:

/opt/httpd/bin/apachectl start

Con esto ya debería estar funcionado el servidor en el puerto http por defecto, el 80.
_________________________________________________________

4.1. Probando con un cliente TELNET

Me voy a ahorrar explicaciones sobre tal y más cual navegador y lo vamos a probar con un cliente telnet que todos deberíamos tener en nuestro sistema.

Para esto ejecutamos el siguiente comando en la línea de ejecución de nuestro shell preferido:

"telnet 127.0.0.1 80"

Con lo que si todo ha ido bien debemos ver un mensaje muy parecido si no igual a este:

Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
_________________________________________________________

Appendix A. Buscar más.

Aunque se ha demostrado la instalación típica mas sencilla posible las variantes pueden ser mucho más complicadas, por lo que se recomienda la lectura de la documentación de Apache2 y de libros especializados sobre el tema como el famoso libro "The Apache2 Bible".
_________________________________________________________

Este documento est´ amparado bajo la licencia pública GNU v2 con todo lo que esto implica.

Continuar leyendo

Cracker

Alien [blackhat4all@gmail.com]

Esta palabra, aunque pienso que es bastante conocida por todos, no ha tenido un espacio lo suficientemente amplio en BlackHat, y las pocas veces que se hace referencia al grupo de personas que enmarca, es cuando se habla de los Hacker, términos que dicho sea de paso son totalmente opuestos.

La palabra Cracker proviene del Ingles Crack y se le asocian varios significados, la mayoría relacionados con la informática, en cuyo caso se liga con la persona que se dedica a crackear, o sea, construir programas que sirvan para burlar la seguridad de algo: Números de serie, Keygen entre otros.

La palabra está formada, como muchas del idioma a que pertenece, por una contracción de los vocablos Criminal y Hacker y su inserción en el mundo estuvo dada para marcar una diferencia entre los tipos de Hackers.

Este artículo lo he escrito luego de entrar a varios foros de discusión y ver a muchos mofándose de ser Cracker para luego de preguntarles que significa dar una explicación completamente distinta: la de Hacker.

A pesar de que se trata por medio de varios métodos hacer una definitiva y marcada diferencia, aún quedan ciertas lagunas debido a la similitud de las palabras y el origen tan ligado que tuvieron ambos conceptos.

Diferencias:
Un hacker, aunque se tome a mal debido a las entradas ilegales a los sistemas, es una persona que sigue y se rige por determinadas reglas o normas, tiene ciertos códigos de conducta que siguen al pie de la letra durante toda su “carrera”. Un Hacker entra en un sistema no para hacer alarde de eso, ni con objetivos destructivos, sino para aprender, ya que ve en cada nueva tecnología un nuevo reto.

A diferencia de esto, los Cracker entran a los sistemas para alardear, son la especie de piratas que no respetan leyes ni códigos de conducta, se guían solamente por su instinto de destruir.

Un Hacker entra en un sistema desprotegido y luego de asegurar su estancia, lo más probable es que notifique a la víctima de su vulnerabilidad para que el defecto sea corregido. Si es un Cracker, lo más posible es que haga la misma notificación, pero a toda su lista de contactos, dando como resultado un ataque masivo a una máquina o software desprotegido.

¿De donde salen?
Por desgracia vivimos en un mundo en que los fabricantes de software tratan de vender sus productos en precios elevados que muchos no pueden llegar a pagar. De aquí que los que tienen amplios conocimientos sobre programación, vean como método más eficaz pasar horas, días y quizás hasta semanas “metiéndole mano” al software en busca de vulnerabilidades que den por resultado beneficios personales.

Y hasta aquí el problema es minúsculo, ya que los únicos que saldrían afectados son las grandes compañías a las que no pienso que les moleste perder algunos millones de dólares por este motivo. La cosa se empieza a complicar cuando una de estas personas decide que, como dice la canción “no basta”, y comienza a hacer sus “jueguitos” con las computadoras vecinas, las que casi siempre suelen ser de una amistad que poco le sabe a la computación.

Tool
Para lograr sus objetivos, los Crackers utilizan varios software, pueden ir desde simples aplicaciones hasta otros más profesionales, diseñados o no para este fin, pero de seguro existen dos que son imprescindibles:
• Ensamblador
• Desensamblador
El ensamblador es el software que nos permite transformar un archivo de texto con determinadas instrucciones en su interior a lenguaje máquina (ceros y unos), ya que es la forma en que realmente nuestro ordenar “entenderá” lo que queremos decirle.

El segundo sirve para obtener, de un archivo compilado, una especie de código fuente que nos dirá, con algunas impresiciones su forma de trabajo.
Como es lógico, una vez compilado el ejecutable, por muy buen desensamblador que se tenga jamás se podrá obtener información valiosa del código original como:

Nombre de variables. Estas son creadas en tiempo de diseño, y una vez que se decide crear la aplicación final, el compilador jamás entenderá cosas como “Temporal”, “Nombre_Usuario”, “Elemento_1”, por lo que esos nombre quedan sustituidos por otros a fin de ser entendidos luego por cualquier sistema.

Comentarios: Los comentarios son notas que el programador añade al código fuente en aras de entender más tarde cuál es el funcionamiento de una parte determinada, o que valor guarda una variable. Fuera de esto, es texto basura, así que el compilador ni se toma el trabajo de procesarlo, por lo que más tarde no será recordado.

Otra cosa que caracteriza a los Crackers, es su afán de lucro. Contrario a los Hackers, que tienen una ideología distinta con respecto a compartir información, los Crackers comparten, pero esperan algo a cambio. Se pueden definir más bien como mercenarios al servicio del mejor postor.

Continuar leyendo

Estudio, mente y paciencia

Alien [blackhat4all@gmail.com]

Mucho se ha hablado sobre los Hacker en varias ediciones de BlackHat, pero hasta el momento, que yo recuerde, jamás se han dado a conocer cómo Hackear un servidor o una máquina teniendo acceso directo a ella. En este artículo abordaré sobre cómo es posible buscar y encontrar defectos de seguridad en los programas que nos permitan poder realizar con ellos tareas para las que no fueron concebidos, o simplemente tratar de burlar la seguridad de los mismos.

Muchos podrán leerse este artículo sin lograr entender la mitad de las cosas que se dicen, otros querrán probar de inmediato todas las variantes, pero algo les aseguro y es que no se mostrarán los pasos en concreto para realizar estas tareas, ya que cuando alguien se decide a acometer un Hacking, debe basarse primeramente en algunas variantes que haya escuchado o que haya visto funcionar, en caso que aún estén vigentes esas técnicas, tendrá el éxito casi asegurado, pero si por casualidad los textos que ha leído están algo “pasados de moda”, entonces tendrá que recurrir a su imaginación e ingenio, ya Hackear no se aprende de ningún manual.

Antes que se aventuren a continuar, les diré que esta labor puede ser tarea de semanas, meses, años e incluso no llegar jamás a controlar un programa. Hackear depende de muchas cosas, pero sobre todo, de la inventiva y capacidad del que lo intenta. Se debe conocer sobre programación, o al menos tener una noción de qué es cada cosa, puesto que es muy difícil poder entrar en un sistema sin saber o tener una idea de cuales son los pasos que realiza un programa en cada momento.

En otras ocasiones hemos hablado en BlackHat sobre las cosas que se deben saber y tener para enfrascarse en una tarea de este tipo, así que no pienso repetir nuevamente los programas o elementos fundamentales que se deben dominar. Me limitaré a hablarles no sobre un invento mío, sino sobre una teoría ya probada y que establece 4 pasos para buscar debilidades en un sistema operativo.

Conocimiento de la estructura de control del sistema

Para encontrar agujeros de seguridad (bug) e identificar debilidades de diseño en sistemas operativos es primeramente imprescindible entender la estructura de control del sistema.
No basta con saber el nombre del sistema operativo, o el idioma en que está, se debe conocer más.
Todos los sistemas operativos actuales tratan de competir por ver quien ofrece más seguridad a sus clientes, pero si algo tienen en común, es que la seguridad se brinda mediante un nombre de usuario y contraseña, los cuales deben ser suministrados en algún momento por quienes usan la computadora, y esos datos deben ser guardados en alguna parte y con algún tipo de encriptación para darle más protección.

Es necesario conocer cuales son los objetos que el sistema protege con más empeño, pues es en esas locaciones donde sabe que tiene la mayor vulnerabilidad. Igualmente se debe saber cual o cuales son las aplicaciones que se encargan de proteger estos archivos, ya que si se logra desactivarlas, se pudiera buscar la forma de entrar al archivo y obtener su contenido.

Una vez que se logra conocer estas cosas, se puede crear un gráfico que permita ver la jerarquía que existe en la máquina e identificar luego los puntos vulnerables. Para esto puede servir tanto bibliografía que exista en Internet como manuales de usuarios y texto que en ocasiones anteriores han ayudado a burlar la seguridad del sistema y que por la importancia que tuvieron en su momento no han perdido actualidad y sirven aún hoy a modo de guía.

Inventario de desperfectos

Esto no es más que hacer un recorrido histórico por el sistema. Sus inicios, desarrollo, faces por las que ha pasado, puntos que más ataques han recibido y demás. Se debe tener bien presente todas las revisiones que se han hecho del sistema, así como estar actualizados en cuanto a los parches, ya que esto nos evita un doble trabajo tratando de entrar por una vía que ya ha sido revisada por terceros.

A menudo sucede que cuando se programan grande tareas, a mitad del trabajo se decide crear o cambiar de tipo una variable, ya sea para facilitar las cosas o por necesidad o simplemente por un cambio de planes. Esto perfectamente puede traer como consecuencia que en el código escrito antes de ese punto, y por consiguiente la variable afectada u otras que realizan operaciones vinculadas a esta se vean afectadas, trayendo consigo un error.

Esto no es difícil que ocurra, de hecho en BlackHat #28, en la sección de noticias, hablábamos de cómo los programadores de Microsoft Exel habían cometido un error que traía consigo una respuesta errónea.

Confirmar hipótesis

Todo lo anteriormente dicho puede ser llevado a cabo sin tener que estar necesariamente de frente a un ordenador. Pero desde este punto, ya será imprescindible tenerlo como almohada.

Esta es la fase casi final, en la que, después de haber hecho una especie de resumen, comenzamos a explota todos las debilidades que pudimos haber encontrado. Esta es la fase donde nuestros dones de programador deben ganar el papel protagónico, puesto que trataremos de entrar a zonas a las que no se ha penetrado, por lo que difícilmente exista un software capaz de realizar esta tarea por nosotros.

Generalizar.

La última fase es tratar de llevar las debilidades que hemos encontrado a su mayor exponente. Se supone que en este paso ya se han encontrado bugs, al menos uno y es la hora de hacerse preguntas:
¿Funcionará solo en este sistema?
¿Qué pasa si…?
¿Y si no …?

Esta es la fase donde se extrapola todo lo que hemos descubierto a otros sistemas, lo que nos abre las puertas para penetrar en otros programas que estén basados en el mismo tipo de seguridad.

Espero que este artículo les sea útil y logren no penetrar en un sistema operativo, sino aprender a darle seguridad a sus programas, evitando así convertirse en víctima de Crackers.

Continuar leyendo

Escalada de privilegios

BitXor [bitxor_nx@yahoo.com]

Luego de haber terminado el código que presento en esta misma edición sobre cómo hacer que un programa corra con privilegios de SYSTEM pensé ¿por qué no aprovechar la oportunidad para introducir el tema de la escalada de privilegios desde la óptica del usuario no programador? ¿Qué tan útil podría resultar conocer este tema?, para responder esta pregunta permíteme hacerte otra ¿Cuántas veces te haz sentado en una PC con tantas restricciones que apenas te dejan usar el mouse? Pues esta es la santa solución a tus problemas.

Durante las próximas semanas tratare de ir publicando varios artículos sobre distintas técnicas de escalada de privilegios. Al primero de estos artículos le corresponde la escalada de privilegios con el comando AT.

[Escalando con AT]

Antes de comenzar permítanme aclararles algunos detalles sobre lo que estaremos haciendo en los próximos minutos. Como ya habrás tenido oportunidad de conocer, Windows como cualquier sistema operativo divide a sus usuarios en grupos, cada uno de los cuales tiene permisos individuales. De tal forma para ser administrador se debe pertenecer al grupo Administradores, o para ser usuario avanzado se debe pertenecer al grupo Usuarios Avanzados. Para ver todos los grupos disponibles en tu sistema abre una consola y a continuacion teclea

net localgroup

Bien, ahora solo necesitas saber que en Windows existe una cuenta un tanto "especial" y su especialidad la justifican varias individualidades que no poseen ninguna de las otra cuenta. Primeramente la cuenta SYSTEM no pertenece a ninguno de los grupos de usuarios de tu equipo, además, como su nombre indica, está reservada solo para uso exclusivo de Windows.

Lo que seguidamente intentaremos hacer será explotar un bug presente en WindowsXP que nos dará pleno acceso a la cuenta SYSTEM. Debes saber que todo lo que aquí expongo debe realizarse desde una cuenta con privilegios administrativos, quizás funcione con cuentas con menos privilegios, pero eso te encargas de probarlo tú.

Para los que aun no conocen: ¿qué es el AT y para qué sirve? AT es una aplicación que debe ser llamada desde la línea de comandos del sistema y nos proporciona un medio para programar la ejecución de comandos o aplicaciones en una PC.
Para ver la ayuda interna del programa solo abre una consola y teclea

AT /help

una vez en la pantalla de ayuda podremos detallar todos los parámetros relacionados, no te preocupes si no entiendes mucho, de todos los parámetros el único que necesitaremos es "/interactive", este nos permitirá que la aplicación cuya ejecución fue programada interactúe con el escritorio del usuario actual. Veamos un ejemplo de la sintaxis de este comando.

at 16:11 /interactive notepad.exe

Tecleando esta línea en el sistema le estaré diciendo que cree una nueva tarea cuya ejecución será a las 4:11pm y consistirá en ejecutar el bloc de notas. Aquí hay un detalle importante que debes tener en cuenta, el tiempo que le especificas debe estar en hora militar, de modo que si quieres que se ejecute a las cuatro de la tarde deberás decirle AT 16:00 ... de lo contrario el programa entenderá que debe hacer la tarea a las cuatro de la mañana.

Pues bien, con los nuevos conocimientos adquiridos realizaremos un pequeño experimento. Abre el símbolo del sistema y chequea la hora que tengas en el reloj al lado de la tray bar justo en la esquina inferior derecha. Ahora le indicaremos al comando AT que realice una tarea un minuto adelantada a la hora actual, de modo que si son las 3:20pm teclearemos en la consola

at 15:21 /interactive notepad.exe

la respuesta debe ser la siguiente:

Se ha agregado un nuevo trabajo con identificador = n

Listo, ya sabemos utilizar el comando AT, aunque aun no tenemos ni idea de como nos puede servir para realizar una escalada de privilegios. Si esperas un minuto o menos podrás ver como se ejecuta el bloc de notas por si solo luego de haber sido llamado por AT. Hasta este punto todo resulta de lo más normal y por tanto aburrido, pero es ahora cuando la situación comienza a tornarse interesante.

Solo por curiosidad presiona CTRL+ALT+DEL para abrir el administrador de tareas y en la lista de procesos busca el Notepad que se acaba de ejecutar. ¿Qué tiene de curioso ese proceso? pues nada más y nada menos que se está ejecutando bajo el usuario SYSTEM, mmm.... Cosa realmente extraña esta, considerando que todo lo que abre un usuario se ejecuta bajo su nombre y privilegios. Pues resulta ser que las solicitudes de ejecución del programa AT son respondidas por uno de los procesos SVCHOST.EXE y esta última aplicación se carga 5 veces en sistema, dos como Servicio de Red, una como Servicio Local y otras dos como SYSTEM (si tienes una sexta corriendo con tu nombre de usuario es un virus), pues todo parece indicar que uno de los SVCHOST cargados como SYSTEM es el encargado de responder las tareas de AT, y teniendo en cuenta que el proceso padre tiene privilegios SYSTEM resulta que todos sus procesos descendientes también. Punto menos para el equipo Microsoft, punto más para nosotros.

Muy bien, ahora que podemos ejecutar cualquier cosa como SYSTEM vamos a correr un programa más interesante que el inofensivo bloc de notas, ¿qué les parece una consola del sistema con altos privilegios?
Manos a la obra, el mismo procedimiento, chequea el reloj (3:42pm en mi caso) ahora escribimos en el símbolo del sistema

at 15:43 /interactive cmd.exe

Esperamos unos segundos y nos aparecerá una nueva consola, verificamos en el administrador de tareas y veremos que el proceso también está corriendo como SYSTEM. Perfecto ya casi somos dioses. Ahora haremos todo como debe ser, arreglemos Windows. Comenzaremos por cerrar el proceso explorer.exe que actualmente está corriendo con nuestro usuario. Para esto escribe en la consola system:

taskkill /im explorer.exe /f

No olvides el parametro /f para hacer un cierre forzado, de lo contrario te preguntará si quieres apagar el PC. Muy bien, se nos desaparecieron los iconos del escritorio y la barra de tareas. Ahora vamos a volver a ejecutar el explorer, esta vez con privilegio de dios. Solo escribe en la consola system:

explorer.exe

mmm.... que cosa más extraña, toda mi configuración ha cambiado, mi fondo de escritorio, mis iconos en el portapapeles, abro el botón inicio y ... !que sorpresa! hasta mi nombre ha cambiado, ya no me llamo BitXor ahora me llamo SYSTEM.

Como ya tendrás oportunidad de notar, SYSTEM es un cuenta especial. Esta no está diseñada para que la use un usuario, solo existe para ser usada por el sistema. ¿Qué puedo hacer ahora? Pues según Microsoft la cuenta SYSTEM tiene virtualmente privilegios ilimitados, así que si quieres hacer algún cambio súper crítico en el registro o acceder a los System Volumen Information este es el momento.

Continuar leyendo

Regedit a Fondo (Parte III)

Alien [blackhat4all@gmail.com]

Según los conocimientos que hemos obtenido con los dos artículos anteriores, creo que ya es hora de sacarle un poco de provecho al registro.

Ante todo, lo primero que debemos tener presente es que el registro puede ser modificable no solo por Windows o los programas que se instalan, sino por programas creados por nosotros mismos e incluso de forma manual, ya sea con un .reg o editando el registro desde adentro.

No pienso explicar como hacerlo con un programa creado por nosotros porque la sintaxis depende del lenguaje y lo que para algunos puede ser openkey, para otros pudiera llamarse keyopen, y escribir sobre eso sería dirigirme solo a una minoría.

Sin embargo, editar el registro de forma manual es algo tan sencillo como cambiarle el nombre a una carpeta. Digamos por ejemplo que estamos en HKEY_CURRENT_USER\Console y queremos que cuando se abra la consola de Windows (MS-DOS), nos aparezca por defecto a pantalla completa, basta para esto tomar el valor FullScreen con el clic derecho y seleccionar la opción modificar, luego donde dice 0 colocaremos un 1. De esa forma se le dice al registro que en la sesión que está controlada por el usuario actual, cada vez que se abra una ventana de MS-DOS lo haga a pantalla completa.

Antes de proseguir pienso que es necesario aclarar, por si alguien no ha leído las dos ediciones pasadas, que cualquier modificación que se haga en el registro debe ser hecha con plena conciencia, es decir, no estar probando a modificar valores al azar, ya que esto puede traer graves consecuencias al equipo.

Otra forma de modificar el registro puede ser con los .reg.
Los .reg son para el registro, como los .bat para el Windows, archivos completamente editables que ejecutan órdenes dadas por el creador, con ellos se puede insertar una o varias claves al registro. Estos son creados para automatizar cierta tarea.

Digamos como ejemplo que tenemos en nuestro ordenador cierta configuración y por determinadas razones estamos acostumbrados a trabajar así. Si llegamos a otra máquina y queremos tener el mismo desenvolvimiento, lo más lógico es que, mientras estemos trabajando, queramos poner todo lo más parecido a nuestro entorno de trabajo habitual. Una opción pudiera ser empezar a cambiar la configuración del equipo paso a paso, pero más rápido y fácil, es crear un .reg que tenga implementado una serie de opciones que se puedan desarrollar en un corto espacio de tiempo y nos ayuden en nuestro objetivo.

Para esto debemos crear un archivo de texto con extensión .reg y escribir dentro del mismo:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Console]
"FullScreen"=dword:00000001

Con esto le estamos diciendo que en la clave de nivel superior HKEY_CURRENT_USER y dentro de esta en la subclave Console, queremos crear o modificar el valor FullScreen para que contenga un dword: 00000001. En caso que la clave exista y tenga ese valor ya aplicado, no notaremos diferencia alguna, pero si tiene un 0, podremos apreciar como al hacer doble click sobre este archivo, el valor se cambia a 1.

Esta es la forma más sencilla de automatizar una tarea llevada a cabo en el registro.
Casi sin darnos cuenta hemos caído en lo que es exportar e importar claves. Lo que hemos hecho en este caso es importarlas, es decir, hemos introducido un dato al registro. Pero en el caso que lo que queramos sea exportar, es decir, crear un archivo de registro de forma automática, debemos pararnos sobre la subclave que deseamos exportar y luego de esto ir al menú inicio y seleccionar la opción exportar, de ahí en adelante no creo que lleve mucha explicación.

Hasta aquí hemos visto como crear/modificar valores del registro y luego de haber practicado un poco con estas cositas, pasemos a la parte importante.

A muchas personas les resulta interesante saber que programas o archivos tiene una PC, algunos por curiosidad, otros simplemente para alardear que saben sobre nuestros sistemas, pero a veces se ignora que la mayor base de datos que almacena información sobre nuestros ordenadores es el registro. Es cierto que no podemos saber si existe una foto de nombre Mia.jpg o un archivo de texto que rebase los 2 Mb, pero quizás podamos tener información de más importancia como pudiera ser conocer el nombre de usuario actual o sus datos de conexión, la versión de Windows, el service pack que utiliza, los programas que tiene instalados, algunos que haya desinstalado, en fin, un sin número de cosas que, en dependencia del uso que se les quiera dar, resultan más importantes que otras cosas. Para todas estas opciones y más, basta con exportar el registro completo y en menos de 20 segundos tendremos en una memoria toda la información de la computadora, la cual podemos analizar más tarde detenidamente.

Pero no es solo en misión espía que el registro nos es útil, sino también para optimizar nuestro ordenador.
Desde siempre Windows ha escondido cosas en el registro, ya sea por temor a darle todas las herramientas al usuario, o por olvido de los programadores ;)

El caso es que desde el registro se puede modificar (para bien) los valores de las claves. Ejemplo de esto se pudieran poner miles, basta con tomar cualquier documento que contenga más de 30 trucos de Windows y entre uno de ellos aparecerá alguno que tenga que ver con el registro.

Continuar leyendo

lunes, 10 de diciembre de 2007

Spam

Alien [blackhat4all@gmail.com]

Complemento Directo

No pienso que resulte una palabra ajena a la mayoría de los que están leyendo esto, ya que todos, de alguna manera, nos hemos visto victimas de un Spam. Aún así, para los no conocedores del tema, les puedo decir que un Spam es, según Wikipedia, mensajes no solicitados, habitualmente de tipo publicitario, enviados en cantidades masivas que perjudican de una u otra manera al receptor.

Y como bien dice esa invaluable enciclopedia, siempre que se recibe un correo anunciando, promocionando o simplemente compartiendo una información que no se ha solicitado, estamos siendo víctimas de un Spam. Y para los que aún no han entendido bien, quiero aclarar que la diferencia entre este término y el recibir por correo una edición digital como pudiera ser BlackHat, radica en que para recibir BlackHat (por citar un ejemplo), usted debe haber escrito con anterioridad a determinado correo solicitando ser parte de algo, o aceptando recibir algo cada un tiempo determinado, y en el caso del Spam, simplemente “alguien” roba su dirección de correo de la red, y lo hace partícipe de algo sin contar con su previo consentimiento.

Según los párrafos anteriores, Spam es información que nos llega por correo, pero por suerte o desgracia esto no se limita solo al correo.

No es menos cierto que últimamente el correo electrónico se ha convertido en el medio por excelencia para el envío de Spam, dado su fácil acceso para los países principalmente del primer mundo, dado el gran público que puede abarcar, dado a la facilidad con que se puede extraer de la red en menos de un día miles de direcciones de correo, es casi imposible vivir sin el miedo que nos llegue un Spam.

El correo Spam como tal es penado en países como España, no solo por estar dándole publicidad a cierto producto sin las autorizaciones requeridas por dicho país, sino porque se viola en cierto sentido la privacidad de los usuarios de computadoras al extraer sin su consentimiento las direcciones que estos hayan puesto en determinado lugar.

Pero aquí en nuestro país, dado a todas las dificultades que se nos presentan para adquirir una cuenta de correo, y por lo general el poco ancho de banda con el que contamos sumado con el casi siempre restringido tiempo de acceso al mes a la red, un Spam es algo similar a un ladrón que nos roba bit a bit nuestro tiempo en la red.

Y es en estos casos donde el Spam molesta más. Pero no es el único caso.
Según Wikipedia existe el Spam por correo, por mensajería instantánea (jabber), grupos de noticias, foros, blog, teléfonos, fax, en fin, por todo medio a través del cual se pueda difundir información. A mi entender
Deberían haber incluido la radio y la televisión, en los que ya existe desde hace tiempo aunque con otro nombre: Spot, Comercial, propaganda, …

Complemento Indirecto

Un mensaje de correo de tipo Spam es enviado generalmente por alguien que necesita, desea, quiere darse publicidad (justificada o no).

No se haría justicia si catalogaramos a los Spammer con cierta edad, género o raza, ya que este molesto email puede ser enviado tanto por un grupo de novatos que descubrío el agua tíbia, como por una empresa de prestigio que necesita aumentar la cantidad de visitas a su página o hacer público un servicio o producto. En este caso, casi nunca el Spam sale del servidor bajo el que está hospedado el sitio, sino que se contrata a un Spammer que es quien realiza la “operación”.

Un Spam puede ser enviado a n=1, n=2, n=3 … n=n+1(personas) y continuaría siendo Spam, ya que como habíamos dicho anteriormente, un Spam no se mide solo por la cantidad de personas que abarca, sino por la trivialidad de la información que contiene, dando pie esto a que sea interpretado individualmente por cada miembro que lo recibe.

Un correo anunciando la venta de antiestreptinomicida (pastilla solo para los enfermos de estreptinomicodo) puede ser útil para los que sufren de esta inventada enfermedad, mientras que un paciente que sufre de un cuadro de gripe puede ser los más absurdo que haya recibido, sin embargo, si ninguno solicitó con anterioridad recibir dicha información, el mensaje continúa siendo un Spam.

Complemento circunstancial

Básicamente, un Spammer que se especialice en realizar su “trabajo” basándose en el correo electrónico, extrae toda, o al menos la mayor cantidad de direcciones de correo de la red. Para esto utiliza libros de visita, foros de discusión o cualquier otra web en la que sepa que se alojan varias direcciones de correo, sin tener en cuenta que estas puedan ser válidas o no.

Cuando se tiene cierta práctica, encontrar estos sitios es solo cuestión de segundos, ya que por desgracia aún muchas personas exponen sus direcciones de correo en páginas no seguras que, aunque no divulgan de forma directa esta información, si dan acceso a que cualquiera pueda entrar y apropiarse de las direcciones de correo, haciendo luego con ellas lo que mejor le parezca.

Un Spam no tiene hora, fecha o lugar. Es solo un correo más que nos llega desde una dirección (en la mayoría de las ocaciones falsa) y que nos trata de inducir a efectuar una operación, en la que haya que navegar luego por la red o no, en ninguno de los casos será para ofrecernos algo (como se dice en buen cubano) “de corazón”.

Ventajas.

El Spam ofrece ventajas en primera instancia a quien lo envía, ya que le da la oportunidad de promocionar su producto, o hacerse visible en la red, incluso, un Spam correctamente enviado puede ayudar a subir el pagerank de una página en la red.

En segunda instancia, el mismo receptor puede salir beneficiado del Spam si se da el caso que le interesa aquella cosa que se trata de promocionar, e incluso, puede ser que no interesándole, exista alguien que desee recibir Spam continuamente, considerando que así estará informado de más cosas. (Para gustos…)

For i=0 to Spam

Por suerte Wikipedia en español tiene información de lujo para este tema, haciéndose allí un recorrido desde el primer Spam hasta buenos métodos que nos ayudan a hacer nuestro correo menos vulnerable al envío de Spam, pero hablar de eso en este artículo sería algo muy fácil (Ctrl+C & Ctrl+V). En lugar de eso, trataré de explicar paso a paso como enviar un Spam a un grupo de usuarios, demostrando así la poca seguridad que se tiene y lo vulnerable que nos volvemos al publicar en la red nuestras direcciones reales.

Lo primero es seleccionar en la red una página en la que sepamos existen al menos más de 100 direcciones de correo, para no citar ejemplos imaginémonos que BlackHat cuenta con un servidor en el cual hemos puesto una página para ilustrar este ejemplo y la dirección de este servidor es: http://BlackHat.cu/Spam.

Al entrar en esta página, lo primero y único que veremos será algo similar a un libro de visitas que tiene un formato similar a este:

Nombre: xxx xxx xxx
Email: xxx@xxxxxx.xx
Comentario: bla, bla, bla.

Nota: Estas mismas líneas se repetirán unas 100 veces.

Una opción sería ir haciendo clic sobre cada una de las direcciones de correo y luego de copiarlas, pegarlas en un bloc de notas. Pero esto es funcional solo para recopilar cuando más 10-20 direcciones, luego de esto ya quizás estemos más que cansados y decidamos la opción más inteligente.

Guardando la página en nuestro disco duro en formato de texto, un programa que creemos nos permitirá recorrer dicho archivo y tomar de el solo las líneas cuyos primeros 6 caracteres sean: “Email:”. Luego de haber salvado esta selección, un editor de textos sencillos nos permitirá reemplazar la frase “Email:” por “” (vacio). De esta forma ya tenemos una lista de 100 correos.

Vale decir que este mismo método es el que utilizan muchos Spammer, y aunque esto no siempre es 100% efectivo dado a que muchos usuarios pudieron haber escrito mal sus direcciones de correo, o simplemente no tener ninguna colocada en este campo, si garantiza que al menos el 90% de las direcciones recopiladas van a ser válidas.

Ojo

Aunque el envío de Spam en nuestro país no es fuertemente penado por la ley, si es algo por lo que no pienso que a persona racional le gustaría ser llamado. El hecho de que alguien pueda ser un Spammer no lo hace estar más cerca de ser un Hacker o siquiera pertenecer a una comunidad “underground”. Un Spammer, alguien cuya única misión es infestar los correos de las personas con contenido BASURA, no es para nada un ídolo a seguir, ni lleva consigo por eso una medalla al valor o la dignidad, todo lo contrario. Más que ser penado por la ley, el Spammer es penado por sus colegas, ya que el envío de Spam no es ni hacking, ni Carding, ni Preacking, es simplemente MOLESTO.

Continuar leyendo

Malas estructuras de datos

Lester Pastrana [lester@uh.cu]

Introducción:

El objetivo de este material no es enseñar cómo programar una estructura de dato ya que existen muchas bibliotecas que nos brindan interfaces de estas, probablemente mucho más eficientes y con menos errores de las que lograríamos nosotros. Lo que persigue este material es ayudar a entenderlas y decidir cuales usar en cada momento.

Problema:

Uno de los estados más importantes en la solución de un problema consiste en determinar dónde se van a guardar los datos. Es común que en los inicios se tomen decisiones incorrectas. Un problema clásico y sencillo orientado por los profesores, es realizar un programa para la gestión de libros en una biblioteca. Por lo general, este se restringe a que durante la ejecución del programa los datos se deben almacenar en un Vector o un LinkedList.

Las principales acciones a realizar en el software consisten en agregar un nuevo libro, eliminarlo y buscarlo para prestarlo. Otros requerimientos son implementar la estructura de dato y desarrollar el software en C++.

La experiencia ha demostrado que la gran mayoría decide utilizar LinkedList para la resolución de su problema, pero… ¿Por qué no un simple Vector? Muchos piensan que un LinkedList utiliza menos memoria, además la inserción y la eliminación parecen ser más eficientes. En esto existe un error.

Resolución:

Definamos algunas notaciones para facilitar la explicación.
O (1): Indica que la operación se realiza en un tiempo constante. Es decir el número de datos no influye en el tiempo que consume la operación.
O (n): Indica que la operación se realiza en un tiempo lineal. Es decir el número de datos influye linealmente en el tiempo que consume la operación.
O (log n): Indica que la operación se realiza en un tiempo logarítmico. Es decir el tiempo de la operación es aproximadamente igual al logaritmo del número de datos.

Ordenes del Vector y LinkedList
Inserción: O (1)
Eliminación: O (n)
Búsqueda: O (n)
Memoria: O (n)

Como se aprecia ambas estructuras se comportan igual según indican los órdenes. Por desgracia esto nos da una descripción bastante pobre del real comportamiento de cada estructura. Veamos cada uno de los puntos en detalles.

Definición:

Vector: Consiste en un array dinámico que crece (por lo general se duplica su tamaño) cuando el número de elementos supera su capacidad.

LinkedList: Lista de nodos unidas por referencias (apuntadores).

La memoria

Sin perder generalidad supongamos que el tamaño de cada elemento almacenado es de 4 bytes, que es el tamaño de un puntero, si el elemento tiene un tamaño inferior se deja al lector que demuestre la superioridad inmediata del Vector sobre el LinkedList en este aspecto.

Denotemos por M (v) como el tamaño de memoria del Vector y M (l) como el tamaño de memoria del LinkedList.

M (v) = 4 * length, donde length indica el número máximo de elementos que se pueden almacenar en el Vector y M (l) = 8 * count, cada casilla esta compuesta por el elemento y una referencia al próximo y count es el número de casillas existentes.

Cuando el Vector se llena entonces length = count y en el instante en que este crece length = 2 * count, luego sustituyendo se tiene que M (v) = 8 * count en este momento el Vector estaría a la mitad de su capacidad y la memoria ocupada por este es idéntica a la utilizada por el LinkedList, a medida que se llena el Vector –a diferencia del LinkedList– la memoria ocupada por este no aumenta.

Este análisis sumado a que el LinkedList requiere constantemente creación dinámica de memoria y con esto llamadas al kernel de Windows, fragmentación de la memoria, espacio extra para la actualización de la estructura del Memory Manager del Sistema Operativo y grandes dolores de cabezas con posibles punteros perdidos, nos hace pensar que no es muy factible.

Por otra parte el Vector al poseer todos los datos de forma consecutiva no presenta los problemas anteriores. Aclaremos que el Vector sólo aumenta su tamaño cuando el número de datos excede el doble de la cantidad que había la última vez que creció. Esto cada vez es menos frecuente, además la copia de los datos al nuevo espacio reservado es extremadamente rápida.

La inserción

Ambas estructuras tienen un comportamiento similar, el Vector lo inserta al final y el LinkedList por lo regular al inicio. A excepción por la llamada de reservación de memoria por el LinkedList no hay mayores problemas. Como se vio anteriormente la duplicación del Vector no es un problema que nos quite el sueño.

La eliminación

En este caso, en ambas estructuras se necesita iterar por todos los elementos hasta encontrar el deseado y luego eliminarlo. En el caso del Vector es necesario cubrir el hueco copiando el último elemento o corriendo todos los elementos a partir de la posición k + 1 para la posición k donde k en el índice del elemento eliminado.

En el LinkedList se elimina el nodo y el apuntador del nodo anterior se iguala al nodo siguiente del eliminado o NULL si este no existe.

En dependencia de la técnica escogida en el vector será uno igual o más eficiente que el otro. Pero no es algo que determine.

Antes de tocar el último punto analicemos el problema en cuestión. Una biblioteca recibe muchos libros los primeros días, pero posteriormente no es un evento frecuente. La eliminación de libros sucede cuando uno está prestado, es robado, se perdió. A excepción de los préstamos los demás eventos tampoco resultan frecuentes. Sin embargo la búsqueda se realiza de forma constante, por lo que esta acción debe ser la más eficiente.

La búsqueda

En el Vector se iteran por todos los elementos hasta hallar el deseado y en el LinkedList nos desplazamos por cada nodo con la misma intensión. Lo gracioso es que debido a las operaciones de bajo nivel que implican estas acciones, el Vector presenta un mejor comportamiento a pesar de tener órdenes iguales.

Se aclarar que aún así estas búsquedas presentan tiempos muy pobres y pudieran ocurrírsenos algunos cambios los cuales definitivamente dejarían a una de estas estructuras completamente rezagadas. Piénselo un momento ante de ver la respuesta.

La magia de la ordenación y el INVENTO:

Ordenar un LinkedList es una tarea ardua y no nos beneficia en nuestro objetivo. Sin embargo ordenar el Vector resulta relativamente fácil y con un orden eficiente O (n log n), valiéndonos de un algoritmo de búsqueda binaria reduciríamos el tiempo de búsqueda que antes era O (n) hasta O (log n). El problema es que los órdenes de la inserción y eliminación manteniendo el Vector ordenado subirían a O (n) y aunque estas acciones no son frecuentes si lo son los préstamos que conllevan a una eliminación tras una inserción. Esto tiene solución, nuevamente los invito a pensarla antes de leer la respuesta.

La solución es no eliminar del Vector un libro al ser prestado sino poner una marca booleana indicando que no está disponible. De esta forma siempre que se busque se encontrará como que la biblioteca tiene este libro, pero no está disponible en estos momentos. En caso de existir varios libros iguales con una mínima modificación a la marca se soluciona el problema y se puede dejar como ejercitación.

Conclusiones

El LinkedList por lo general es una estructura que se utiliza como sustento de otras como grafos, árboles, hash enlazado, estructuras de mapas, etc.
Los Vectores por lo general se utilizan para almacenar elementos que requieren una iteración frecuente, almacenaje temporal, etc.

Cuando se utiliza una estructura de datos no basta con conocer sus órdenes es necesario tener un conocimiento profundo de su comportamiento en cada situación y del problema en cuestión que esta va a resolver.

Existen otras estructuras para resolver este problema que nos brindan tiempos mucho más factibles. Estas pueden ser árboles binarios, B-Tree y Tablas de Hash.

Continuar leyendo